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
相关产品推荐
相关产品推荐

