read_all()“从cisco设备读取数据。 有时它会读取数据,有时它不会读取并给出空字符串。 我尝试了下面的两个命令,但它仍然没有完全读取数据。
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............'
答案 0 :(得分:2)
我也面临同样的问题。这会有所帮助:
tn = telnetlib.Telnet('64.0.0.1')
tn.write('ls \r\n')
data = ''
while data.find('#') == -1:
data = tn.read_very_eager()
print data
此代码段在执行命令后读取信息。 并显示直到显示“#”提示。
答案 1 :(得分:1)
简短回答:
在time.sleep(1)
命令之间使用write
答案很长:
在Cisco IOS控制台上输入命令时,它会一直阻塞,直到命令完成。在命令运行时输入控制台的任何输入都通过管道传输到运行命令,就像STDIN在bash shell上运行一样。但是在bash中,如果命令没有显式读取输入,则在程序退出时bash将获取未使用的输入并将其解释为shell命令。因此,如果您想一个接一个地运行两个命令,第一个命令不从STDIN读取,您可以在第一个命令运行时输入第二个命令,即您不必等待第一个命令在您之前完成输入另一个命令。这种缓冲机制使得telnet脚本编写变得简单,我们已经逐渐期待成熟的shell。显然Cisco IOS缺少此功能,因此您必须确保不要过早输入命令。我可以通过两种方式来考虑它:
答案 2 :(得分:0)
使用:
tn.read_very_eager()
而不是tn.read_all()
- read_all
等待连接关闭
答案 3 :(得分:0)
@yogi的答案几乎是正确的。 但有一些细节需要解释
data = ''
finish = '' #m1
while data.find(finish) == -1:
data += tn.read_very_eager() # m2
print data
m1
:命令完成后,您的telnet服务器会返回什么
m2
:应该有+=
,因为某些命令结果有多行