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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:48:35