You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:48:02