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

使用Python subprocess.run通过SSH执行远程Bash命令返回码127问题

问题原因
  • 你出现报错的核心原因是subprocess.run使用列表形式传参时,默认不会启动本地shell做参数解析,你给远程命令额外包裹的单引号会被作为参数的一部分原样传给ssh,最终远程主机的bash会把'ls && exit'(含外层单引号)当成一个完整的命令名去查找,自然找不到对应命令,返回127(bash中127是「命令不存在」的标准返回码)。
  • os.system能正常运行是因为它会默认启动本地shell解析整条命令字符串,shell会自动剥掉外层的单引号再把参数传给ssh,所以远程能正常执行。
解决方法

方法1(推荐,无注入风险)

直接去掉远程命令外层的多余单引号即可,列表参数的每个元素会原样传递给对应程序,不需要额外加引号转义:

import subprocess
# 实际使用时可把username@ipaddress替换为你的变量拼接逻辑
bashCommand = ['ssh', 'username@ipaddress', 'ls && exit']
# 如果需要捕获命令的 stdout/stderr,可以加 capture_output 和 text 参数
output = subprocess.run(bashCommand, capture_output=True, text=True)
# 获取返回码
print(output.returncode)
# 可按需查看输出和错误信息
print(output.stdout)
print(output.stderr)

这种方式不会启动本地shell,避免了命令注入风险,适合命令参数可控或有用户输入的场景。

方法2(不推荐,存在注入风险)

如果你要直接用和os.system一致的字符串形式传参,可以添加shell=True参数,但如果命令中有用户可控的输入,会存在命令注入漏洞:

import subprocess
bashCommand = "ssh username@ipaddress 'ls && exit'"
output = subprocess.run(bashCommand, shell=True, capture_output=True, text=True)
print(output.returncode)
效果验证

调整参数后,output.returncode就是远程执行命令的返回码,ssh会默认把远程命令的退出码作为自身的退出码返回,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Kurt Rojas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:07