【问题标题】:How does paramiko Channel.recv() exactly work?paramiko Channel.recv() 究竟是如何工作的?
【发布时间】:2014-06-09 17:05:26
【问题描述】:

我很难理解recv() 函数的工作原理。

http://docs.paramiko.org/en/1.13/api/channel.html#paramiko.channel.Channel.recv

我知道每次调用该函数时都会收到一个数据块,但是有人可以详细说明这些数据的结构或大小吗?假设我发送了一个命令date,我注意到:

  • 第一次读取得到:“日期”
  • 第二次读取得到:实际响应(2014 年 6 月 9 日星期一 12:04:17 CDT)
  • 第三次读取得到:提示

但这如何处理终端上随机出现的调试消息呢?

只要实际响应小于最大字节数 (nbytes),前面的模式是否成立?

如果超过nbytes会怎样?

根据要求,我添加了以下代码的 sn-p:

while reads<maxReads:
   resp = self.__chan.recv(maxBytes)
   print resp
   self.__buffer += resp
   if resp.endswith('$ ') or resp.endswith('# '):
      break
   reads += 1

【问题讨论】:

  • 它应该最多接收 nbytes。任何更大的都将占用最大字节块。任何更少,它将返回所有内容,因为它小于最大大小。下次您调用 channel.recv 时,它将从最后一口中断的地方继续。它在命令中的哪个位置停止并不重要,它只会占用指定的最大字节数。向 stderr 发出的任何提示都需要使用 recv_stderr。不确定这是否能回答您的问题。
  • 嗯其中之一 :) ... 发送命令,然后调用 recv next 让我得到命令本身而不是真正的响应
  • 我们可以看到您发送和接收的代码吗?您可能没有注意到它的编写方式很简单。

标签: python paramiko


【解决方案1】:

Channel recv() 对应一个socket.recv(),它没有任何特定的结构或大小,它只是读取从远程服务器发送的任何数据,不超过maxBytes。

你通常在一个循环中使用 recv() 直到你得到一个你正在等待的数据:

def _wait_for_data(self, options, verbose=False):
    chan = self.chan
    data = ""
    while True:
        x = chan.recv(1024)
        if len(x) == 0:
            self.log("*** Connection terminated\r")
            sys.exit(3)
        data += x
        if verbose:
            sys.stdout.write(x)
            sys.stdout.flush()
        for i in range(len(options)):
            if re.search(options[i], data):
                return i
    return -1

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2011-06-01
    相关资源
    最近更新 更多