如何在Python中后台运行反向SSH连接并解决相关报错
解决Python中后台运行反向SSH连接的问题
报错原因说明
- 第一个报错
Pseudo-terminal will not be allocated because stdin is not a terminal.:SSH默认会尝试分配伪终端用于交互,无终端环境下直接后台运行会触发该错误,同时SSH默认需要交互验证(如密码输入、主机公钥确认)也会导致连接建立失败。 - 第二个报错
bash: -c: line 0: syntax error near unexpected token '&':&是Shell的后台运行语法,当subprocess.Popen指定shell=False时,参数会直接传给目标程序(即ssh),不会经过Shell解析,&被当作SSH的无效参数导致报错。
正确实现方案
前置要求
提前配置机器A到机器B的SSH免密登录,避免程序运行时卡住等待密码输入。
方案1:使用os.system实现
给SSH添加专用后台运行参数替代Shell的&:
import os # 参数说明: # -f: SSH验证完成后自动放到后台运行 # -N: 不执行远程命令,仅用于端口转发 # -T: 不分配伪终端 # -o StrictHostKeyChecking=no: 自动信任主机公钥,跳过首次连接确认 result = os.system("ssh -fNT -o StrictHostKeyChecking=no -R 2210:localhost:22 me@80.54.0.107") print("...started ssh connection", result)
方案2:使用subprocess实现
不需要加&,subprocess.Popen本身就会以子进程形式后台运行程序:
import subprocess cmd = ["ssh", "-fNT", "-o", "StrictHostKeyChecking=no", "-R", "2210:localhost:22", "me@80.54.0.107"] result = subprocess.Popen(cmd, shell=False) print("ssh子进程PID:", result.pid)
可选配置
如果需要机器B以外的设备也能通过B的2210端口访问机器A,需要在机器B的/etc/ssh/sshd_config中添加配置GatewayPorts yes,重启sshd服务后生效。
内容的提问来源于stack exchange,提问作者alphanumeric
相关产品推荐
相关产品推荐

