Python 3 telnetlib 路由器重启

Posted

技术标签:

【中文标题】Python 3 telnetlib 路由器重启【英文标题】:Python 3 telnetlib router reboot 【发布时间】:2021-07-18 17:41:25 【问题描述】:

我正在尝试编写一个 python 脚本来重启我的路由器。

我可以用普通的 telnet 很好地做到这一点,但是,在 python 代码中,出于某种原因,除非我将 tn.read_all() 添加到底部代码,重启操作不执行。 这是当前的工作代码:

import sys
import telnetlib
import time

HOST = "192.168.0.1"
password = "12345678"

try:
    with telnetlib.Telnet(HOST,23,timeout=10) as tn:
        print(tn.read_until(b'password:', 5))
        tn.write((password + '\r\n').encode('ascii'))
        print(tn.read_until(b'(conf)#', 5))
        tn.write(('dev reboot' + '\r\n').encode('ascii'))
        time.sleep(1)
        print(tn.read_all().decode('ascii'))
        
except EOFError:
    print("Unexpected response from router")
except ConnectionRefusedError:
    print("Connection refused by router. Telnet enabled?")
except:
    print("Error")

telnet 操作的正常输出是:

--------------------------------------------------------------------------------
Welcome To Use TP-Link COMMAND-LINE Interface Model.
--------------------------------------------------------------------------------
TP-Link(conf)#dev reboot
[ oal_sys_reboot ] 489:  now sleep for 2 secs

TP-Link(conf)#killall: pppd: no process killed

保持 read_all() 会使操作超时,并在异常中定义打印“错误”。 我想保持这个干净和简单。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

显然,延迟不够,连接正在迅速关闭。添加 read_all 使连接保持打开状态,以便在添加时执行命令。 解决办法是把延迟从1s增加到5s。


import sys
import telnetlib
import time

HOST = "192.168.0.1"
password = "12345678"
port = 23

try:
    print('Opening Telnet Connection to Router.')
    with telnetlib.Telnet(HOST,port,timeout=10) as tn:
        tn.read_until(b'password:', 10)
        print('Sending password to Router.')
        tn.write((password + '\r\n').encode('ascii'))
        time.sleep(1)
        tn.read_until(b'(conf)#', 10)
        print('Rebooting the Router!!!')
        tn.write(('dev reboot' + '\r\n').encode('ascii'))
        time.sleep(5)
        
except EOFError:
    print("Unexpected response from router")
except ConnectionRefusedError:
    print("Connection refused by router. Telnet enabled?")
except:
    print("Error")

【讨论】:

以上是关于Python 3 telnetlib 路由器重启的主要内容,如果未能解决你的问题,请参考以下文章

Python3+telnetlib实现telnet客户端

Telnet 设备自动化

Telnet客户端没有收到。 Python telnetlib作为服务器

python3+telnetlib实现简单自动测试

python中telnetlib模块的使用

Python telnetlib:令人惊讶的问题