【问题标题】:How to control a TPLINK router with a python script如何使用 python 脚本控制 TP LINK 路由器
【发布时间】:2013-03-01 11:06:16
【问题描述】:

我想知道是否有一个工具可以让我连接到路由器并关闭它,然后从 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 脚本的编辑器)崩溃了。谁能帮我改进这段代码?

【问题讨论】:

  • 现在关闭 -r 怎么样?
  • 它不起作用,实际上一旦我使用import和os.system,我就无法登录路由器界面,因为我没有提供密码。而且我不知道如何从python脚本告诉shell密码是“这个密码”。一旦这个问题解决了,我就可以关闭 -r
  • @user52800,真的没有必要为了微小的编辑而修改旧帖子。每次您这样做时,必须有 3-5 人查看您的编辑,这会使主页变得混乱。我看到你在街机上是 33k,所以你已经知道了。
  • 我在github.com/epsi95/TPLink-Python987654321@写了一个详细的Python API文档

标签: python ssh router reboot


【解决方案1】:

这取决于您的 tplink 设备型号和固件,因为身份验证算法因型号而异。

我编写了这个 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】:

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

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

    编辑:找到这个。

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

    源代码: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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我找到了一些选项,具体取决于特定设备(我在任何地方都找不到任何 API 文档,所以我猜所有这些都来自个人为自己的需求进行逆向工程):

        • menahishayan/TP-Link-Archer-C50-API 是最清晰的结构,显示了 cgi 命令和已实现命令的有效负载。从the main definitions in init.py作为模型开始,我在使用Web界面时使用Wireshark捕捉API交互,我能够非常快速地实现我需要的命令。
        • epsi95/TPLink-Python 易于使用并显示命令流程。我用它来仔细检查我发送的标题(我错过了需要的引荐来源)。它不适用于我的路由器 (Archer C2),返回 HTTP 状态 500。
        • tplink-wr-api 似乎是另一个候选人,但我没有得到任何关于我的路由器的额外信息。

        在一个 Python requests.session 会话中完成所有命令很重要,并确保在每次交互结束时在关闭会话之前实现路由器的“注销”功能。如果您不这样做(至少在 C2 上),您将无法在不等待超时或重置路由器的情况下运行更多命令或登录 Web 界面。相反,从 cgi 命令返回 HTTP 状态 403,您将在 Web 界面上收到一条消息,表明一次只有一个管理员可以登录。

        【讨论】:

          猜你喜欢
          • 2021-08-12
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 2018-03-07
          • 1970-01-01
          • 1970-01-01
          • 2011-09-25
          • 1970-01-01
          相关资源
          最近更新 更多