run_tunnels.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import subprocess
  2. import sys
  3. from pathlib import Path
  4. def run_and_print(cmd, cwd):
  5. """运行命令并打印其输出,返回是否成功"""
  6. print(f"$ {' '.join(cmd)}")
  7. result = subprocess.run(cmd, cwd=cwd, text=True, capture_output=True)
  8. if result.stdout:
  9. print(result.stdout.strip())
  10. if result.stderr:
  11. print(result.stderr.strip(), file=sys.stderr)
  12. return result.returncode == 0
  13. def main():
  14. if len(sys.argv) < 2 or sys.argv[1] not in {"start", "status", "stop"}:
  15. print("用法: python manage_tunnels.py [start|status|stop]")
  16. sys.exit(1)
  17. action = sys.argv[1]
  18. base = Path(__file__).resolve().parent
  19. python_exe = sys.executable # 使用当前 Python 解释器
  20. ssh_script = str(base / "ssh_tunnel.py")
  21. # 定义三条启动命令
  22. start_cmds = [
  23. #
  24. [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "29765", "-D", "1066"],
  25. #ali
  26. [python_exe, ssh_script, "start", "-H", "106.14.113.12", "-u", "root", "-p", "29765", "-D", "1067"],
  27. #wu
  28. [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "29765", "-D", "1068"],
  29. #home
  30. [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "10702", "-D", "1024"],
  31. #sea
  32. [python_exe, ssh_script, "start", "-H", "117.50.195.224", "-u", "root", "-p", "10802", "-D", "1069"],
  33. #wu
  34. [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "17002", "-D", "1070"],
  35. [python_exe, ssh_script, "start", "-H", "114.66.42.82", "-u", "root", "-p", "18000", "-D", "1071"],
  36. ]
  37. # 对应三个状态监控命令(包含示例中的 -D 1067)
  38. status_cmds = [
  39. # [python_exe, ssh_script, "status", "-D", "1061"],
  40. [python_exe, ssh_script, "status", "-D", "1066"],
  41. [python_exe, ssh_script, "status", "-D", "1067"],
  42. [python_exe, ssh_script, "status", "-D", "1024"], # 示例指定的状态监控
  43. ]
  44. # 停止服务命令(示例指定的停止 117.50.195.224:29765 -> -D 1066)
  45. stop_cmds = [
  46. # [python_exe, ssh_script, "stop", "-H", "103.40.13.87", "-u", "root", "-p", "40268", "-D", "1061"],
  47. [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "29765", "-D", "1066"],
  48. [python_exe, ssh_script, "stop", "-H", "106.14.113.12", "-u", "root", "-p", "29765", "-D", "1067"],
  49. [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "29765", "-D", "1068"],
  50. [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "10702", "-D", "1024"],
  51. [python_exe, ssh_script, "stop", "-H", "117.50.195.224", "-u", "root", "-p", "10802", "-D", "1069"],
  52. [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "17002", "-D", "1070"],
  53. [python_exe, ssh_script, "stop", "-H", "114.66.42.82", "-u", "root", "-p", "18000", "-D", "1071"],
  54. ]
  55. if action == "start":
  56. procs = []
  57. for cmd in start_cmds:
  58. # 并行启动,不阻塞
  59. p = subprocess.Popen(cmd, cwd=base)
  60. procs.append(p)
  61. print(f"已启动 {len(procs)} 个隧道进程,PID:{[p.pid for p in procs]}")
  62. # 如果希望脚本阻塞直到进程退出,取消下面两行注释
  63. # for p in procs:
  64. # p.wait()
  65. elif action == "status":
  66. all_ok = True
  67. for cmd in status_cmds:
  68. ok = run_and_print(cmd, base)
  69. all_ok = all_ok and ok
  70. if not all_ok:
  71. sys.exit(1)
  72. elif action == "stop":
  73. all_ok = True
  74. for cmd in stop_cmds:
  75. ok = run_and_print(cmd, base)
  76. all_ok = all_ok and ok
  77. if all_ok:
  78. print("停止命令已执行完成")
  79. else:
  80. print("部分停止命令执行失败", file=sys.stderr)
  81. sys.exit(1)
  82. if __name__ == "__main__":
  83. main()
  84. #启动命令 python .\run_tunnels.py start