Что такое ssh эквивалентные методы read_until и read_very_eager в telnet? - PullRequest
2 голосов
/ 29 марта 2012

Я напишу класс коммуникатора SSH на Python. У меня есть класс коммуникатора Telnet, и я должен использовать функции, как в Telnet. Коммуникатор Telnet имеет функции read_until и read_very_eager.

read_until : Read until a given string is encountered or until timeout.
read_very_eager : Read everything that's possible without blocking in I/O (eager).

Я не смог найти эти функции для SSH-коммуникатора. Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 апреля 2012

Привет, я даже искал решение той же проблемы.

Я думаю, что это может помочь вам ....

одно наблюдение, скажи мне, если найдешь решение. Я не получу вывод, если уберу 6-ю строку.

Я фактически печатал 6-ю строку, чтобы узнать статус, позже я обнаружил, что для выполнения этого кода должна быть вызвана recv_exit_status ()

import paramiko,sys
trans = paramiko.Transport((host, 22))
trans.connect(username = user, password = passwd)
session = trans.open_channel("session")         
session.exec_command('grep -rE print .')  
session.recv_exit_status() 
while session.recv_ready():
    temp = session.recv(1024)
    print temp

1. Чтение до > поиск данных, которые вы ищете, и разрыв цикла

2. Read_very_eager > используйте вышеупомянутый код.

1 голос
/ 06 апреля 2012

Вы не указали это в вопросе, но я предполагаю, что вы используете Paramiko согласно тегу.

  • read_until: чтение до тех пор, пока не встретится данная строка или до истечения времени ожидания.

    Это похоже на очень специализированную функцию для конкретной задачи высокого уровня. Я думаю, что вам нужно будет реализовать это. Вы можете установить время ожидания, используя paramiko.Channel.settimeout , а затем читать в цикле, пока не получите желаемую строку или исключение времени ожидания.

  • read_very_eager: читать все, что возможно, не блокируя ввод-вывод (с нетерпением).

    Paramiko не предоставляет этого напрямую, но предоставляет примитивы для неблокирующего ввода-вывода, и вы можете легко поместить это в цикл, чтобы перетаскивать все, что доступно на канале. Вы пробовали что-то подобное?

    channel.setblocking(True)
    resultlist = []
    while True:
        try:
            chunk = channel.recv(1024)
        except socket.timeout:
            break
        resultlist.append(chunk)
    return ''.join(resultlist)
    
...