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

Python实现SSH登录设备后执行命令异常问题求助

SSH会话执行命令问题的解决思路

问题根源

你犯了两个关键错误:

  1. 代码里调用的是subprocess.stdin.write,而非你创建的SSH子进程对象p的stdin,这直接导致命令写到了本地终端的标准输入,而非SSH会话。
  2. 即使调用对了p.stdin,直接写'pwd'也不会触发SSH执行——终端需要换行符才会执行输入的命令,同时还要手动刷新缓冲区确保命令发送到SSH进程。

修复后的交互会话代码

def run_ssh():
    # 开启text=True,用字符串而非字节流处理输入输出
    p = subprocess.Popen(['ssh', '<address>'], 
                        stdout=subprocess.PIPE, 
                        stdin=subprocess.PIPE, 
                        stderr=subprocess.PIPE,
                        text=True)
    
    # 发送命令必须加换行符,模拟终端回车
    p.stdin.write('pwd\n')
    # 刷新缓冲区,确保命令被发送到SSH进程
    p.stdin.flush()
    
    # 读取命令输出和错误信息,communicate会自动处理管道关闭
    output, error = p.communicate()
    print("命令输出:")
    print(output)
    if error:
        print("错误信息:")
        print(error)

更简洁的非交互方式

如果不需要维持SSH会话,只是执行单条或多条命令,直接在SSH命令行指定要执行的命令更可靠,避免交互会话的复杂问题:

def run_ssh_command():
    # 直接在ssh参数后追加要执行的命令
    p = subprocess.Popen(['ssh', '<address>', 'pwd'], 
                        stdout=subprocess.PIPE, 
                        stderr=subprocess.PIPE,
                        text=True)
    output, error = p.communicate()
    print(output)
    if error:
        print(error)

额外注意事项

  • 若要执行多条命令,非交互方式可以用分号分隔,比如['ssh', '<address>', 'pwd; ls -l']。
  • 如果需要长期维持会话执行多个操作,建议使用专门的SSH库(如paramiko),比手动处理subprocess管道更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:24:59