如何使用python脚本控制TP LINK路由器

时间:2013-03-13 13:22:46

标签: python ssh router reboot

我想知道是否有一个工具允许我连接到路由器并将其关闭,然后从python脚本重新启动它。

我知道如果我用python脚本编写:import os然后执行os.system("ssh -l root 192.168.2.1"),我可以通过python连接到我的路由器。但是,我不知道如何应用路由器的密码,并登录它,以便重新启动它。

所以在完成它之后,我在这里编写了一些代码,以便使用python脚本通过SSH会话连接到我的路由器:

    import os, urllib, urllib2, re

    def InterfaceControl():
       #os.system("echo training")
       os.system("ssh -l root 192.168.2.1")
       os.system("echo yes")
       os.system("echo My_ROUTER_PASSWORD")
       os.system("shutdown -r")



     def main():
         InterfaceControl()


     if __name__=="__main__":
         main()

问题是我仍然无法使用此代码连接到我的路由器,此外,IDLE(我用来编写和运行python脚本的编辑器)崩溃。任何人都可以帮我改进这段代码吗?

3 个答案:

答案 0 :(得分:1)

我认为您可以查看路由器管理页面并查看它发送的帖子参数。在脚本中你可以模仿它。

我认为大多数路由器使用基于https的基本身份验证。

编辑:发现了这个。

wget -qO- --user=admin --password=admin-password http://192.168.1.2/userRpm/SysRebootRpm.htm?Reboot=Reboot

src:http://blog.taragana.com/old-code-how-to-reboot-tp-link-router-11849

我的wget手册告诉我-q是安静的。不知道0-是什么。你也可以用curl做类似的事情。 注意:某些tp-link设备需要发送referer标头。以curl为例,-H 'Referer: http://192.168.0.1'

我可以使用以下代码在python中执行相同的操作。

from urllib.request import urlopen, Request
import base64
req = Request('http://192.168.0.1/userRpm/SysRebootRpm.htm?Reboot=Reboot')
req.add_header('Authorization', ('Basic %s' % base64.b64encode('uname:pass'.encode('ascii')).decode('ascii')))
req.add_header('Referer', 'http://192.168.0.1')
urlopen(req)

答案 1 :(得分:1)

这取决于您的tplink设备型号和固件,因为auth算法因型号而异。 我写了那个python脚本,对我的tp链接W740N工作正常。该代码说明了如何使用请求包

在此设备上进行身份验证
#!/usr/bin/python3
# imports
from requests import get
from base64 import b64encode
from urllib.parse import quote


# constants
tplink = '192.168.0.1'
user = 'admin'
password = 'admin'
url_template = 'http://{}/userRpm/SysRebootRpm.htm?Reboot=Reboot'


if __name__ == '__main__':
    auth_bytes = bytes(user+':'+password, 'utf-8')
    auth_b64_bytes = b64encode(auth_bytes)
    auth_b64_str = str(auth_b64_bytes, 'utf-8')

    auth_str = quote('Basic {}'.format(auth_b64_str))

    auth = {
    'Referer': 'http://'+tplink+'/', 
    'Authorization': auth_str,
    }

    reboot_url = url_template.format(tplink)

    r = get(reboot_url, headers=auth)

答案 2 :(得分:0)

我认为对于新的固件版本,您需要: referer和user-agent工作。