有人可以帮助了解终端窗口中的打印效果如何? 这是一个测试脚本
test_script.py
import telnetlib
HOST = "10.1.1.151"
tn = telnetlib.Telnet(HOST)
tn.open(HOST)
test_var = ["test"]
print test_var
tn_read = tn.read_very_eager()
print tn_read
从终端运行脚本时的输出:
$ python test_script.py
['test']
tn_read
应该是"用户名:"但它不会在终端窗口中打印出来。
如果我从解释器运行它,我会得到预期的结果:
>>> tn.read_very_eager()
'\n\rUser Name : '
从终端调用脚本时,为什么或需要做什么来获得以下输出?
$ python test_script.py
['test']
User Name :
答案 0 :(得分:6)
简短的回答是使用read_until()
超时。 e.g。
timeout = 3 # seconds
tn_read = tn.read_until('User Name :', timeout)
print repr(tn_read)
接下来的答案很长。
read_very_eager()
是非阻止的,它会返回已有的任何熟食数据,但如果没有任何数据则不会。如果你打电话给非阻止"阅读"建立连接后,方法太快,可能没有数据要读取,read_very_eager()
将返回空字符串 - ''
。
所以你的问题可能与时间有关;读取是非阻塞的,不能返回尚未接收,处理和缓冲的数据。当您通过终端进行交互时,您需要时间输入命令,因此您不会注意到时间问题,但是当从脚本运行时,人为延迟被移除,并且时序问题变得明显。在调用read方法之前尝试睡眠:
import telnetlib
import time
HOST = "10.1.1.151"
tn = telnetlib.Telnet(HOST)
test_var = ["test"]
print test_var
time.sleep(5)
tn_read = tn.read_very_eager()
print repr(tn_read)
将上述内容作为脚本运行,可能查看您的预期输出....然后,您可能不会。相反,你可能仍然会看到:
['test']
''
可能还有其他因素,特别是服务器可能正在使用Telnet IAC序列进行响应。如果在您调用telnetlib
(实际上是任何读取函数)之前已到达,read_very_eager()
将使用此序列。在这种情况下,read_very_eager()
也会返回一个空字符串。
如果您想查看通过连接交换的内容,可以拨打set_debuglevel(1)
:
导入telnetlib
tn = telnetlib.Telnet('library.cedarville.edu') # any old server will do
tn.set_debuglevel(1)
tn_read = tn.read_all()
print repr(tn_read)
典型输出是:
Telnet(library.cedarville.edu,23): recv '\xff\xfd\x03'
Telnet(library.cedarville.edu,23): IAC DO 3
Telnet(library.cedarville.edu,23): recv '\xff\xfb\x03\xff\xfb\x01\xff\xfd\x18\xff\xfd#\xff\xfd$\xff\xfd\x1f'
Telnet(library.cedarville.edu,23): IAC WILL 3
Telnet(library.cedarville.edu,23): IAC WILL 1
Telnet(library.cedarville.edu,23): IAC DO 24
Telnet(library.cedarville.edu,23): IAC DO 35
Telnet(library.cedarville.edu,23): IAC DO 36
Telnet(library.cedarville.edu,23): IAC DO 31
Telnet(library.cedarville.edu,23): recv '\r\n'
Telnet(library.cedarville.edu,23): recv 'login: '
其他"阅读"函数,您应该使用read_until()
。如果您不想无限期阻止,请向其传递超时,如上所示。
答案 1 :(得分:1)
网络设备终端上的telnet会话示例:
HOST = "1.1.1.1"
PORT = 30001
TIMEOUT = 3
PASSWD = "cisco"
COMMANDS = ["term len 0","show version","show ip route","show run","!!!end!!!"]
import telnetlib
tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
#tn.set_debuglevel(1)
tn.write("\r\n\r\n")
for cmd in COMMANDS:
tn.write(cmd+"\r\n")
print tn.read_until("!!!end!!!\r\n",3)
tn.close()