2013-06-01 4 views
1

Я пытаюсь выполнить команду, которая обнюхивает последовательный порт и печатает на stdout. Команда запускается непрерывно, она не выходит или не останавливается. Когда я использую консоль SSH-шпильки, я могу видеть, что данные постоянно обновляются на консоли.Парамико, пропуская некоторые данные на канале recv

Я могу отправить команду и начать трассировку. Когда я пытаюсь читать выходные данные с использованием канала Paramiko, используя функцию recv. Я наблюдаю, что он не захватывает все данные, выведенные сниффером.

Выполняю операцию recv после проверки состояния recv_ready.

Ниже приведен код. Как я могу избежать пропусков данных?

ssh= paramiko.SSHClient() 
ssh.load_system_host_keys() 
ssh.connect('host.example.com') 
channel = ssh.get_transport().open_session() 
channel.get_pty() 

channel.exec_command("sniff /dev/stty2") 

while(True): 
    if(channel.recv_ready): # Doesnt get triggered often 
     print channel.recv(2048) # Reads only a part of the data 

ответ

0

Не могли бы вы получить первые 2048 байт?

Channel.recv() принимает количество байтов, которое вы хотите прочитать как параметр. Если вы хотите прочитать больше байтов, вам нужно увеличить это число. Например, channel.recv(4000) будет печатать первые 4000 байт.

+0

Нет, ответ случайный. Несколько раз он пропускает первую часть ответа, иногда последнюю часть. – Gops

+0

Возможно, было бы полезно, если бы вы разместили то, что видите, тогда @Gops – Ben

2

У меня такая же проблема здесь, и я нашел решение,
может быть, не великий, но это работает для меня
вот кусок кода, надеюсь, что это поможет :)

while True: 
    if channel.recv_ready(): 
     break 
    time.sleep(2) 
channel.send('exit\n') 

stdout_data = [] 
try: 
    part = channel.recv(4096) 
    while part: 
     stdout_data.append(part) 
     part = channel.recv(nbytes) 
except: 
    raise 

print 'exit status: ', channel.recv_exit_status() 
print ''.join(stdout_data) 
+0

Это отлично работает для меня :) –

Смежные вопросы