在python中使用tn.read_all()读取数据

时间:2011-07-22 12:08:06

标签: python

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............'

4 个答案:

答案 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缺少此功能,因此您必须确保不要过早输入命令。我可以通过两种方式来考虑它:

  1. 在命令之间等待一段固定的时间。对于大多数命令,通常1秒是安全的赌注。
  2. 在每个命令之后解析输出,直到找到提示,然后输入下一个命令,然后再次解析,依此类推。

答案 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:应该有+=,因为某些命令结果有多行