Python 3 telnetlib 路由器重启

问题描述

我正在尝试编写一个 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() 使操作超时并打印异常中定义的“错误”。 我想保持这个干净和简单。我怎样才能做到这一点?

解决方法

显然,延迟不够,连接很快关闭。添加 read_all 使连接保持打开状态,以便在添加时执行命令。 解决方案是将延迟从1s增加到5s。

<div class="gallery">
  <a target="_blank" href="NationalMall.jpeg">
    <img src="NationalMall.jpeg" alt="NationalMall" width="600" height="400">
  </a>
  <div class="description"> National Mall in Washington DC </div>
</div>

<div class="gallery">
  <a target="_blank" href="GrandCanyon.jpeg">
    <img src="GrandCanyon.jpeg" alt="GrandCanyon" width="600" height="400">
  </a>
  <div class="description"> GrandCanyon in Arizona </div>
</div>

<div class="gallery">
  <a target="_blank" href="GettysBurg.jpeg">
    <img src="GettysBurg.jpeg" alt="Gettysburg" width="600" height="400">
  </a>
  <div class="description"> Gettysburg in Pennsylvania</div>

  <div class="gallery">
    <a target="_blank" href="NewYork.jpeg">
      <img src="NewYork.jpeg" alt="NewYork" width="600" height="400">
    </a>
    <div class="description"> NewYork City an der Ostküste </div>
  </div>

  <div class="gallery">
    <a target="_blank" href="Disneyworld.jpeg">
      <img src="Disneyworld.jpeg" alt="Disneyworld" width="600" height="400">
    </a>
    <div class="description"> Disneyworld in Orlando Florida </div>
  </div>

  <div class="gallery">
    <a target="_blank" href="LasVegas.jpeg">
      <img src="LasVegas.jpeg" alt="LasVegas" width="600" height="400">
    </a>
    <div class="description"> Las Vegas in Nevada </div>
  </div>