Python telnet 库问题,无法读取未设置陷阱级别的输出

Python telnet library issue, can't read the output without trap level set

不知道问题是出在 python、telnet 库还是路由器,但我似乎无法按应有的方式获取脚本 运行。

这是一个简单的脚本,它会显示来自路由器的路由 table 的输出,但是如果您不为 trap/debug 设置命令,它不会 display/print 任何东西。

我是编程新手,刚开始学习python,请告诉我哪里出错了,还是仅仅是路由器的限制?

脚本相当简单:

import getpass
import telnetlib
import time

user= "root" 
password = "admin"

print("Router Script")

HOST = "192.168.100.1" #the gateway of the router

tn = telnetlib.Telnet(HOST)

tn.set_debuglevel(7) #the master of puppets 

tn.read_until(b"Login:")
time.sleep(1)
tn.write(user.encode('ascii') + b"\n")

tn.read_until(b"Password:")
tn.write(password.encode('ascii') + b"\n")

tn.read_until(b"WAP>")
tn.write(b"display ip route\n" )

print(tn.read_all().decode('ascii'))

This is what the output looks like

编辑: 我 运行 它直接在我的路由器上使用 powershell 即 "py.exe C:\script.py" 如果我需要提到的话,脚本也是用 python 3.0 编写的,库也是为了那个。

这是按要求输出的文本,全是乱七八糟的,没有任何顺序...

Router Script
Telnet(192.168.100.1,23): recv b'\xff\xfb\x01\xff\xfb\x03\xff\xfb\x18\r\nWelcome Visiting Huawei Home Gateway\r\nC'
Telnet(192.168.100.1,23): IAC WILL 1
Telnet(192.168.100.1,23): IAC WILL 3
Telnet(192.168.100.1,23): IAC WILL 24
Telnet(192.168.100.1,23): recv b'opyright by Huawei Technologies Co., Ltd.\r\n\r\nLogin'
Telnet(192.168.100.1,23): recv b':'
Telnet(192.168.100.1,23): send b'root\n'
Telnet(192.168.100.1,23): recv b'\xff\xfc\x01\xff\xfc\x03'
Telnet(192.168.100.1,23): IAC WONT 1
Telnet(192.168.100.1,23): IAC WONT 3
Telnet(192.168.100.1,23): recv b'root\x07\r\nPassword:'
Telnet(192.168.100.1,23): send b'admin\n'
Telnet(192.168.100.1,23): recv b'\x07'
Telnet(192.168.100.1,23): recv b'\r\nPassword is default value, please modify it!\r\nWA'
Telnet(192.168.100.1,23): recv b'P>'
Telnet(192.168.100.1,23): send b'display ip route\n'
Telnet(192.168.100.1,23): recv b'display ip route\x07'
Telnet(192.168.100.1,23): recv b'\r\n\r\nFlags:[B]lackhole\r\n\r\n-------------------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'---\r\nDest/MaskLen            Interface           G'
Telnet(192.168.100.1,23): recv b'ateway             SourceIP            Flags      '
Telnet(192.168.100.1,23): recv b' Metric      Origin              \r\n---------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'-------------\r\n0.0.0.0/0               Internet   '
Telnet(192.168.100.1,23): recv b'         --                  --                  -'
Telnet(192.168.100.1,23): recv b'-          10          StaticRoute         \r\nxx.xx.'
Telnet(192.168.100.1,23): recv b'xx.xx/14             VOIP                --         '
Telnet(192.168.100.1,23): recv b'         xx.xx.xx.xx         --          0        '
Telnet(192.168.100.1,23): recv b'   System              \r\nxx.xx.xx.xx/32          I'
Telnet(192.168.100.1,23): recv b'nternet            --                  xx.xx.xx.'
Telnet(192.168.100.1,23): recv b'xx      --          0           System           '
Telnet(192.168.100.1,23): recv b'   \r\n192.168.100.0/24        LocalNetwork        -'
Telnet(192.168.100.1,23): recv b'-                  192.168.100.1       --         '
Telnet(192.168.100.1,23): recv b' 0           System              \r\n---------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'--------------------------------------------------'
Telnet(192.168.100.1,23): recv b'-------------\r\nTotal: 4\r\n\r\nsuccess!\r\nWAP>'

问题是您正在调用 read_all:

Read all data until EOF as bytes; block until connection closed.

但是路由器还没有关闭连接。它只是向您发送一堆字节,结尾为:

success!
WAP>

此时,路由器正在等待另一个命令。

除非你让它退出,或者你自己关闭连接,否则你永远不会到达 EOF。

这意味着您的代码正等待 read_all 完成,这永远不会发生。据推测,您的代码会一直挂在那里,直到您按下 Ctrl-C。


您可能想要做的是阅读直到再次出现提示:

print(tn.read_until(b"WAP>").decode('ascii'))

然后可能 close() 连接,或者 write(b'exit\r\n') 或者让路由器为您关闭连接的东西。