问题描述
我正在尝试编写一个 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>