使用Python脚本SSH连接Linux服务器无报错但无命令结果求助
解决SSH执行命令无输出的问题
问题原因和解决办法
1. 首次连接需确认主机密钥
第一次连接目标服务器时,SSH会弹出确认主机密钥的提示,脚本没处理交互逻辑,直接卡住,既不输出结果也不报错。
- 解决:手动用SSH连接一次目标主机,确认并保存密钥后,再运行脚本。
2. 未等待SSH进程结束就读取输出
原脚本直接调用stdout.readlines(),但SSH进程可能还在运行,导致无法读取到完整输出。
- 解决:使用
communicate()方法,它会等待进程结束,同时读取标准输出和错误输出,还能自动处理输出缓冲问题。
3. 命令路径不正确
部分Linux系统中ifconfig不在默认PATH中(比如Ubuntu需要先安装net-tools,且命令路径为/sbin/ifconfig),导致命令找不到但未返回明确错误。
- 解决:使用命令的绝对路径,或者确保远程用户的环境变量PATH包含命令所在目录。
4. 免密登录配置异常
如果本地到远程服务器的免密登录未正确配置,SSH会后台等待输入密码,但脚本未处理交互,导致进程挂起无输出。
- 解决:检查本地
~/.ssh/id_rsa.pub是否已添加到远程服务器的~/.ssh/authorized_keys中,同时确保远程authorized_keys文件权限为600。
修改后的可用脚本
import subprocess import sys HOST = "IP ADDRESS" COMMAND = "/sbin/ifconfig" # 替换为实际命令的绝对路径 def passwordless_ssh(host): ssh = subprocess.Popen( ["ssh", host, COMMAND], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True # 直接返回字符串,无需手动转码 ) # 等待进程完成,获取标准输出和错误输出 stdout, stderr = ssh.communicate() # 根据进程返回码判断执行结果 if ssh.returncode != 0: print(f"ERROR: {stderr}", file=sys.stderr) return "error" else: return stdout.splitlines() # 按行分割结果返回 # 调用函数并打印执行结果 result = passwordless_ssh(HOST) if result != "error": for line in result: print(line)
内容的提问来源于stack exchange,提问作者Deepak rawat
相关产品推荐
相关产品推荐

