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

5 投票
4 回答
19159 浏览
提问于 2025-04-16 22:04

使用“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. 在命令之间等待固定的时间。通常来说,等待 1 秒对大多数命令来说是比较安全的选择。
  2. 在每个命令执行后解析输出,直到找到提示符,然后再输入下一个命令,接着再解析,依此类推。
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

这段代码会在执行一个命令后读取信息。它会一直读取,直到出现'#'这个提示符。

撰写回答