如何在终端窗口中打印/显示telnet会话的输出(Python)

时间:2014-09-22 07:41:44

标签: python python-2.7 terminal

有人可以帮助了解终端窗口中的打印效果如何? 这是一个测试脚本

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 :  

2 个答案:

答案 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()