Python实现SSH登录设备后执行命令异常问题求助
SSH会话执行命令问题的解决思路
问题根源
你犯了两个关键错误:
- 代码里调用的是
subprocess.stdin.write,而非你创建的SSH子进程对象p的stdin,这直接导致命令写到了本地终端的标准输入,而非SSH会话。 - 即使调用对了
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
相关产品推荐
相关产品推荐

