什么是telnet上的ssh等效read_until和read_very_eager方法?

时间:2012-03-29 07:44:51

标签: python ssh telnet paramiko

我将在Python上编写一个SSH通信器类。我有telnet communicator类,我应该使用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 个答案:

答案 0 :(得分:1)

您没有在问题中说明,但我假设您根据标记使用Paramiko

  • read_until:读取直到遇到给定的字符串或直到超时。

    对于特定的高级任务来说,这似乎是一个非常专业的功能。我想你需要实现这个。您可以使用paramiko.Channel.settimeout设置超时,然后循环读取,直到获得所需的字符串或超时异常。

  • read_very_eager:在I / O(渴望)中不加阻塞地阅读所有可能的内容。

    Paramiko并没有直接提供这个,但它确实为非阻塞I / O提供了原语,你可以很容易地把它放在一个循环中,以便在通道上可用的所有东西中啜饮。你尝试过这样的事吗?

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

答案 1 :(得分:1)

嗨,即使我正在寻找同样问题的解决方案。

我认为它可能对你有帮助....

一个观察,告诉我你是否找到解决方案。 如果删除第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 >使用上面提到的代码。