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

Python SSH连接Linux机器无法执行.sh脚本问题求助

Python SSH执行Shell脚本卡住的解决方法

问题现象

通过Python的paramiko或SSHLibrary远程SSH连接Linux机器时,cd、ls等基础命令可正常执行,但运行.sh脚本时会卡住——哪怕是仅包含echo "test"的测试脚本也无法正常完成;但通过Cygwin手动SSH连接机器时,所有脚本都能正常运行。

解决方法

1. 关闭标准输入避免脚本等待交互

很多脚本会隐含等待标准输入(即使脚本里没有明显的read命令),导致Python端卡住。执行命令后直接关闭stdin即可:

client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")

stdin, stdout, stderr = client.exec_command("/test.sh -h")
stdin.close()  # 关闭标准输入,防止脚本等待输入

print(f'STDOUT: {stdout.read().decode("utf8")}')
print(f'STDERR: {stderr.read().decode("utf8")}')
client.close()

2. 分配伪终端模拟手动SSH环境

手动SSH连接时会分配终端(pty),而exec_command默认不分配,部分脚本依赖终端环境变量(如TERM)。执行命令时添加get_pty=True参数:

client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")

# 分配伪终端
stdin, stdout, stderr = client.exec_command("/test.sh -h", get_pty=True)
stdin.close()

output = stdout.read().decode("utf8")
error = stderr.read().decode("utf8")

print(f'STDOUT: {output}')
print(f'STDERR: {error}')
client.close()

注意:分配pty后,stdout和stderr可能会混合输出,需根据实际情况调整处理逻辑。

3. 显式调用bash执行脚本

部分脚本的shebang(#!/bin/bash)可能存在问题,或远程机器的默认shell不是bash,显式指定bash运行脚本:

client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")

stdin, stdout, stderr = client.exec_command("bash /test.sh -h")
stdin.close()

print(f'STDOUT: {stdout.read().decode("utf8")}')
print(f'STDERR: {stderr.read().decode("utf8")}')
client.close()

4. 检查脚本权限与环境变量

  • 确保脚本拥有执行权限:可先执行chmod +x /test.sh命令确认权限
  • 脚本中调用的命令可能在非交互式shell的PATH中不存在,建议在脚本中使用命令的绝对路径,或在执行时显式指定环境变量:
client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")

# 指定PATH并执行脚本
command = "export PATH=/usr/local/bin:$PATH && /test.sh -h"
stdin, stdout, stderr = client.exec_command(command)
stdin.close()

print(f'STDOUT: {stdout.read().decode("utf8")}')
print(f'STDERR: {stderr.read().decode("utf8")}')
client.close()

内容的提问来源于stack exchange,提问作者Alexandru DuDu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:24:44