如何使用paramiko与远程应用程序进行交互?

3

我正在尝试使用paramiko与命令行应用程序进行交互,但我做错了某些事情。

# that's the echo.py, the script I am connecting to via SSH
import sys, time
while 1:
    x = sys.stdin.readline()
    sys.stdout.write("got-" + x) # x already contains newline



# client.py
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('127.0.0.1', username='user', password='pass')

(stdin, stdout, stderr) = ssh.exec_command(r"python C:\test\echo.py")

stdin.write("xxx\n")
print "got back [%s]" % stdout.read()  # <<< here the code got stuck, getting nothing back

注意:对我有效的唯一情况是使echo.py退出并在客户端上执行stdout.readlines(),但显然这不是我要找的内容。
我需要能够使用标准输入和输出发送和接收消息,可以选择支持某种超时。

1
你的问题只是在 tdaout.read() 中缺少了 "s" 吗?还是这只是你问题描述中的一个笔误? - mac
1个回答

2

我认为问题在于当您运行sys.stdout.write时,它会将内容写入STDOUT缓冲区,但是该缓冲区只有在手动刷新或关闭时才会被清空(stdout是一个文件对象,您可以使用type(sys.stdout)确认)。由于您的循环无限制,因此缓冲区没有被清空。

将echo.py中的循环更改为以下内容即可解决问题:

while 1:
    x = sys.stdin.readline()
    sys.stdout.write("got-" + x) # x already contains newline
    sys.stdout.flush() # flush the buffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接