python日志框架与telnet read_all功能

问题描述:

我是一个Python的noob,并试图捕获使用telnel.read_all函数设备的日志。为此,我正在使用python的日志框架。 代码挂起,如果我尝试做一个: logging.info(telnet.read_all())python日志框架与telnet read_all功能

def telNetCallInitial(): 
host = "5.35.8.24" 
user = "lab" 
password = "lab" 
telnet = telnetlib.Telnet(host) 
telnet.read_until('Username: ', 3) 
telnet.write(user + '\r') 
telnet.read_until('Password: ', 3) 
telnet.write(password + '\r') 
telnet.write('enable' + '\r\n') 
telnet.write('enable_password' + '\r\n') 
logging.info(telnet.read_all()) 
logging.info("inside telnet call initial") 
return telnet 

但这并不工作和程序挂起。 对此有任何想法。 在此先感谢。

你有这个问题,因为read_all()是一个阻塞函数调用。也就是说,直到telnet连接关闭(这是一个eof或文件结尾)它才会返回。

Python执行从最内层到最外层的函数或方法调用。所以,这样的代码: logging.info(telnet.read_all()) 真的做得: RETURN_VALUE = telnet.read_all() logging.info(RETURN_VALUE) (RETURN_VALUE只是表示该解释通过每个结果呼叫外面的电话)。

对此的解决方案是使用一个电话一个不阻止,也许是这样的:

import telnet 
import logging 
import time 

def prepare_connection(host, user, password): 
    instance = telnetlib.Telnet(host) 
    instance.read_until('Username: ', 3) 
    instance.write(user + '\r') 
    instance.read_until('Password: ', 3) 
    instance.write(password + '\r') 
    instance.write('enable' + '\r\n') 
    instance.write('enable_password' + '\r\n') 
    # at this point, the connection is prepared so we can return the telnet object 
    logging.info("*** Telnet connection prepared") 
    return instance 

def log_output(telnet_instance): 
    """Given a connected telnet instance, sends all data received over it to logging.info.""" 
    running = True 
    while running == True: 
     try: 
      data = telnet_instance.read_very_eager() 
      logging.info(data) 
      time.sleep(0.1) # sleep for 100 ms so we don't try too often to read data (read_very_eager won't block, 
       # so without this CPU usage would spike) 
     except EOFError as e: 
      logging.info("*** telnet connection closed") 
      running = False 

if __name__ == '__main__': 
    con = prepare_connection(host="5.35.8.24", user="lab", password="lab") 
    log_output(con)