import os import subprocess import threading import time import urllib.request import tarfile import zipfile import http.server import socketserver import signal # 下载并解压工具函数 def download_and_extract(url, extract_to, is_zip=False): filename = url.split("/")[-1] if not os.path.exists(extract_to): os.makedirs(extract_to) filepath = os.path.join(extract_to, filename) if not os.path.exists(filepath): print(f"Downloading {filename} ...") urllib.request.urlretrieve(url, filepath) if is_zip: with zipfile.ZipFile(filepath, "r") as zip_ref: zip_ref.extractall(extract_to) else: with tarfile.open(filepath, "r:*") as tar: tar.extractall(path=extract_to) # 下载并解压 fluxbox def setup_fluxbox(): url = "https://github.com/void-linux/void-packages/files/12496441/fluxbox-1.3.7-x86_64.tar.gz" extract_to = "./fluxbox" download_and_extract(url, extract_to) return os.path.join(extract_to, "fluxbox-1.3.7-x86_64", "bin", "fluxbox") # 下载并解压 TigerVNC def setup_tigervnc(): url = "https://github.com/TigerVNC/tigervnc/releases/download/v1.13.1/tigervnc-1.13.1.x86_64.tar.gz" extract_to = "./tigervnc" download_and_extract(url, extract_to) return os.path.join(extract_to, "tigervnc-1.13.1.x86_64", "vncserver") # 下载并解压 noVNC def setup_novnc(): url = "https://github.com/novnc/noVNC/archive/refs/heads/master.zip" extract_to = "./novnc" download_and_extract(url, extract_to, is_zip=True) return os.path.join(extract_to, "noVNC-master") # 启动 Xvfb def start_xvfb(): return subprocess.Popen(["Xvfb", ":1", "-screen", "0", "1024x768x16"], env={**os.environ, "DISPLAY": ":1"}) # 启动 fluxbox def start_fluxbox(fluxbox_path): return subprocess.Popen([fluxbox_path], env={**os.environ, "DISPLAY": ":1"}) # 启动 VNC server def start_vncserver(vncserver_path): return subprocess.Popen([vncserver_path, ":1", "-geometry", "1024x768", "-SecurityTypes", "None"], env={**os.environ, "DISPLAY": ":1"}) # 启动 noVNC def start_novnc(novnc_path): websockify = os.path.join(novnc_path, "utils", "websockify", "run") return subprocess.Popen(["python", websockify, "7860", "localhost:5901", "--web", novnc_path], env=os.environ) # 启动 ssh_client.py def start_ssh_client(): if os.path.exists("ssh_client.py"): return subprocess.Popen(["python", "ssh_client.py"]) return None # 创建简单的重定向页面到 noVNC def create_redirect_html(): with open("index.html", "w") as f: f.write(""" Fluxbox+TigerVNC Space

重定向到 VNC 界面...

如果没有自动跳转,请点击这里

""") def setup_and_run(): print("正在设置和启动桌面环境...") fluxbox_path = setup_fluxbox() vncserver_path = setup_tigervnc() novnc_path = setup_novnc() # 创建重定向页面 create_redirect_html() # 启动 Xvfb xvfb_proc = start_xvfb() print("Xvfb 已启动") time.sleep(2) # 启动 fluxbox fluxbox_proc = start_fluxbox(fluxbox_path) print("Fluxbox 已启动") time.sleep(2) # 启动 VNC server vnc_proc = start_vncserver(vncserver_path) print("TigerVNC 已启动") time.sleep(2) # 启动 noVNC novnc_proc = start_novnc(novnc_path) print("noVNC 已启动在端口 7860,请访问 http://:7860/vnc.html") # 启动 ssh_client.py ssh_client_proc = start_ssh_client() if ssh_client_proc: print("ssh_client.py 已启动") # 等待所有进程完成(实际上它们会一直运行) try: while True: time.sleep(600) # 每10分钟检查一次 # 检查各个进程是否还在运行,如果不在则重启 if xvfb_proc.poll() is not None: print("Xvfb 已终止,正在重启...") xvfb_proc = start_xvfb() if fluxbox_proc.poll() is not None: print("Fluxbox 已终止,正在重启...") fluxbox_proc = start_fluxbox(fluxbox_path) if vnc_proc.poll() is not None: print("TigerVNC 已终止,正在重启...") vnc_proc = start_vncserver(vncserver_path) if novnc_proc.poll() is not None: print("noVNC 已终止,正在重启...") novnc_proc = start_novnc(novnc_path) if ssh_client_proc and ssh_client_proc.poll() is not None: print("ssh_client.py 已终止,正在重启...") ssh_client_proc = start_ssh_client() except KeyboardInterrupt: print("正在关闭所有进程...") # 清理进程 for proc in [xvfb_proc, fluxbox_proc, vnc_proc, novnc_proc]: if proc: proc.terminate() if ssh_client_proc: ssh_client_proc.terminate() if __name__ == "__main__": print("启动桌面环境:Fluxbox + TigerVNC + noVNC") setup_and_run()