如何使用parami从远程命令执行中获得完整的输出

2024-09-28 18:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试学习使用pythonparamiko代码在远程系统上执行命令。 我正在接收长度为12519个字符的部分输出。 如何获得长度为12550或更大的完整结果?在

这是代码,这是一个代码取自不同的网站在互联网上

def _run_poll(self, session, timeout, input_data):
    '''
    Poll until the command completes.

    @param session     The session.
    @param timeout     The timeout in seconds.
    @param input_data  The input data.
    @returns the output
    '''
    interval = 0.1
    maxseconds = timeout
    maxcount = maxseconds / interval

    # Poll until completion or timeout
    # Note that we cannot directly use the stdout file descriptor
    # because it stalls at 64K bytes (65536).
    input_idx = 0
    timeout_flag = False
    self.info('polling (%d, %d)' % (maxseconds, maxcount))
    start = datetime.datetime.now()
    start_secs = time.mktime(start.timetuple())
    output = ''
    session.setblocking(0)
    while True:
        if session.recv_ready():
            data = session.recv(self.bufsize)
            output += data
            self.info('read %d bytes, total %d' % (len(data), len(output)))
            print('[{}]'.format(output))
            #this prints partial output of 12519 characters

            if session.send_ready():
                # We received a potential prompt.
                # In the future this could be made to work more like
                # pexpect with pattern matching.
                if input_idx < len(input_data):
                    data = input_data[input_idx] + '\n'
                    input_idx += 1
                    self.info('sending input data %d' % (len(data)))
                    session.send(data)

        self.info('session.exit_status_ready() = %s' % (str(session.exit_status_ready())))
        if session.exit_status_ready():
            print('here') #this line is also printed
            break

        # Timeout check
        now = datetime.datetime.now()
        now_secs = time.mktime(now.timetuple())
        et_secs = now_secs - start_secs
        self.info('timeout check %d %d' % (et_secs, maxseconds))
        if et_secs > maxseconds:
            self.info('polling finished - timeout')
            timeout_flag = True
            break
        time.sleep(0.200)

    self.info('polling loop ended')
    if session.recv_ready():
        data = session.recv(self.bufsize)
        output += data
        self.info('read %d bytes, total %d' % (len(data), len(output)))

    self.info('polling finished - %d output bytes' % (len(output)))
    if timeout_flag:
        self.info('appending timeout message')
        output += '\nERROR: timeout after %d seconds\n' % (timeout)
        session.close()

    return output

Tags: theselfinfoinputoutputdatalenif