Как использовать paramiko для общения с удаленным приложением? - PullRequest
3 голосов
/ 09 декабря 2011

Я пытаюсь использовать 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() на клиенте, но, очевидно, это не то, что я искал.

Мне нужно иметь возможность отправлять и получать сообщения, используя stdin и stdout , опционально с некоторой поддержкой тайм-аута.

1 Ответ

2 голосов
/ 10 декабря 2011

Я считаю, что проблема в том, что когда вы запускаете sys.stdout.write, он записывает в буфер STDOUT, но буфер не очищается до тех пор, пока это не будет сделано вручную или закрыто (стандартный вывод - это File Object , который вы можете подтвердите себя 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
...