在Python中使用tn.read_all()读取数据
使用“read_all()”这个方法来从思科设备读取数据。有时候它能成功读取数据,但有时候却读取不到,返回的是空字符串。我尝试了下面的两个命令,但数据读取还是不稳定。
data=tn.read_until("exit")
data= tn.read_all()
请给我一些建议,我对Python还很陌生。
我正在使用的代码是:
_command2='show chassis'
print 'Commands issued............'
#ISSUE COMMANDS VIA TELNET
tn.write("term len 0\r")
#tn.read_until(" ")
#tn.write(_command1+"\r")
tn.write(_command2+"\r")
tn.write("exit\r" )
print 'Read telnet data............'
#READ TELNET DATA
#data=tn.read_eager()
data=tn.read_until("exit")
#data= tn.read_all()
#print data
print 'Telnet data read successfully............'
4 个回答
1
使用:
tn.read_very_eager()
而不是 tn.read_all()
- read_all
会一直等到连接关闭才返回结果。
2
简短回答:
在每个 write
命令之间使用 time.sleep(1)
。
详细回答:
当你在 Cisco IOS 控制台输入命令时,系统会等待这个命令执行完毕才会继续处理其他输入。在命令执行期间,如果你在控制台输入其他内容,这些输入会被当作命令的一部分处理,就像在 bash shell 中的标准输入(STDIN)一样。不过在 bash 中,如果一个命令没有特别去读取输入,那么当程序结束时,bash 会把那些没有被使用的输入当作新的命令来执行。所以如果你想连续执行两个命令,而第一个命令不读取输入,你可以在第一个命令执行的时候输入第二个命令,也就是说,你不需要等第一个命令完成后再输入下一个命令。这种缓冲机制让 telnet 脚本编写变得简单,而我们也习惯了成熟的 shell 提供这样的功能。但显然,Cisco IOS 没有这个功能,所以你需要确保不要太快输入命令。我想到两种方法可以解决这个问题:
- 在命令之间等待固定的时间。通常来说,等待 1 秒对大多数命令来说是比较安全的选择。
- 在每个命令执行后解析输出,直到找到提示符,然后再输入下一个命令,接着再解析,依此类推。
4
我也遇到过同样的问题……这个方法可能会帮到你:
tn = telnetlib.Telnet('64.0.0.1')
tn.write('ls \r\n')
data = ''
while data.find('#') == -1:
data = tn.read_very_eager()
print data
这段代码会在执行一个命令后读取信息。它会一直读取,直到出现'#'这个提示符。