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)