Python 3+通过SSH远程执行命令时bash脚本未运行问题排查
问题分析与解决
你的代码存在本地shell解析命令分隔符的关键问题,导致./script.sh根本没在远程机器上执行,而是在本地执行了——这就是你只能看到cmd1输出的原因。
具体问题点
当你使用shell=True时,本地系统的shell会先解析整个命令字符串:
ssh user@ip cmd1; ./script.sh
本地shell会把分号;当成本地命令的分隔符,先执行ssh user@ip cmd1(远程运行cmd1),然后立刻在本地执行./script.sh,完全没把这条脚本命令传给远程机器。
修复方案
方案1:给远程命令加引号,避免本地shell拆分
把远程命令用双引号包裹,让本地shell把整个命令串作为单个参数传给ssh:
cmds = "cmd1; ./script.sh" output, errors = subprocess.Popen(f'ssh user@{ip} "{cmds}"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
方案2:禁用本地shell,改用参数列表(更安全推荐)
直接通过参数列表传递命令,跳过本地shell解析,彻底避免这类问题:
cmds = "cmd1; ./script.sh" output, errors = subprocess.Popen(['ssh', f'user@{ip}', cmds], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
额外排查点
如果修复后脚本还是没执行,检查以下内容:
- 远程机器上
./script.sh是否有执行权限(可通过chmod +x ./script.sh添加) - 脚本是否在ssh登录后的默认工作目录下,否则改用绝对路径(比如
/home/user/script.sh) - 打印
errors变量,查看是否有远程执行的错误信息(比如找不到脚本、权限不足等)
内容的提问来源于stack exchange,提问作者user2175783
相关产品推荐
相关产品推荐

