import subprocess import sys from pathlib import Path def run_and_print(cmd, cwd): """运行命令并打印其输出,返回是否成功""" print(f"$ {' '.join(cmd)}") result = subprocess.run(cmd, cwd=cwd, text=True, capture_output=True) if result.stdout: print(result.stdout.strip()) if result.stderr: print(result.stderr.strip(), file=sys.stderr) return result.returncode == 0 def main(): if len(sys.argv) < 2 or sys.argv[1] not in {"start", "status", "stop"}: print("用法: python manage_tunnels.py [start|status|stop]") sys.exit(1) action = sys.argv[1] base = Path(__file__).resolve().parent python_exe = sys.executable # 使用当前 Python 解释器 ssh_script = str(base / "ssh_tunnel.py") # 定义三条启动命令 start_cmds = [ # [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "29765", "-D", "1066"], #ali [python_exe, ssh_script, "start", "-H", "106.14.113.12", "-u", "root", "-p", "29765", "-D", "1067"], #wu [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "29765", "-D", "1068"], #home [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "10702", "-D", "1024"], #sea [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "10802", "-D", "1069"], #wu [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "17002", "-D", "1070"], [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "18000", "-D", "1071"], ] # 对应三个状态监控命令(包含示例中的 -D 1067) status_cmds = [ # [python_exe, ssh_script, "status", "-D", "1061"], [python_exe, ssh_script, "status", "-D", "1066"], [python_exe, ssh_script, "status", "-D", "1067"], [python_exe, ssh_script, "status", "-D", "1024"], # 示例指定的状态监控 ] # 停止服务命令(示例指定的停止 117.50.195.224:29765 -> -D 1066) stop_cmds = [ # [python_exe, ssh_script, "stop", "-H", "103.40.13.87", "-u", "root", "-p", "40268", "-D", "1061"], [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "29765", "-D", "1066"], [python_exe, ssh_script, "stop", "-H", "106.14.113.12", "-u", "root", "-p", "29765", "-D", "1067"], [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "29765", "-D", "1068"], [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "10702", "-D", "1024"], [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "10802", "-D", "1069"], [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "17002", "-D", "1070"], [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "18000", "-D", "1071"], ] if action == "start": procs = [] for cmd in start_cmds: # 并行启动,不阻塞 p = subprocess.Popen(cmd, cwd=base) procs.append(p) print(f"已启动 {len(procs)} 个隧道进程,PID:{[p.pid for p in procs]}") # 如果希望脚本阻塞直到进程退出,取消下面两行注释 # for p in procs: # p.wait() elif action == "status": all_ok = True for cmd in status_cmds: ok = run_and_print(cmd, base) all_ok = all_ok and ok if not all_ok: sys.exit(1) elif action == "stop": all_ok = True for cmd in stop_cmds: ok = run_and_print(cmd, base) all_ok = all_ok and ok if all_ok: print("停止命令已执行完成") else: print("部分停止命令执行失败", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main() #启动命令 python .\run_tunnels.py start