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')
或者让路由器为您关闭连接的东西。
不知道问题是出在 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')
或者让路由器为您关闭连接的东西。