linux下的python里面如何用相关的网络模块来重启tp-link路由器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的python里面如何用相关的网络模块来重启tp-link路由器?相关的知识,希望对你有一定的参考价值。

我用python写脚本用,里面涉及到要换ip,于是要重启路由器。怎样用python里面的相关网络模块(例如urllib,urllib2等)来控制路由器?
我现在的障碍是我无法用python登录我的tplink路由器,所以也就无法利用post的方法来重启。

你说的总体是可行的,路由器都会提供一个web 的访问控制界面,python urllib2 可以利用POST 的方式登录,加一个header 就可以了,下面是登录一个BBS 的代码的header:

req=urllib.request.Request(url)
req.add_header('User-agent','Mozilla/5.0')
req.add_header('Content-Type','application/x-www-form-urlencoded')
params=urllib.parse.urlencode('id':username,
'login.x':24,
'login.y':8,
'login':'登陆',
'pw':password,
'titletype':'forum'
)
params=params.encode('gb2312')
print('Send request!   waiting respose.....')
res=urllib2.urlopen(req,params)

下面是我ppp登录路由器的方式:

#!/usr/bin/python
#
# License: GNU GPL v2


# Script for comtrend hg536+ ( firmware A101-302JAZ-C03_R21.A2pB021g.d15h )
# This scripts connect to router and reset ip in 45s. In this example use default values for jazztel .

import getpass
import sys
import telnetlib
import time

HOST = "192.168.1.1"
LOGIN = "admin"
PASS = "admin"
PROMPT = " -> "
WAITTIME = 40 # Number of second
CONNECTIONNAME = "0.8.35 2" # to see your connections, manually connect to router (telnet 192.168.1.1) and use "wan show" .You should choose you PPPoE connection Use a combination of VCC + Con Id. For example ""0.8.35 2""

tnt = telnetlib.Telnet(HOST)

tnt.read_until("Login: ")
tnt.write(LOGIN + "\\n")

tnt.read_until("Password: ")
tnt.write(PASS + "\\n")

tnt.read_until(PROMPT)
tnt.write("ppp config " + CONNECTIONNAME + " down\\n")

time.sleep(3)
tnt.write("\\n")
tnt.write("ppp config " + CONNECTIONNAME + " up\\n")

time.sleep(WAITTIME)

tnt.read_until(PROMPT)
tnt.write("ppp config " + CONNECTIONNAME + " up\\n")

tnt.write("\\n")

tnt.read_until(PROMPT)
tnt.write("13\\n") # press option to exit

tnt.close()


下面重启路由器:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import telnetlib
import re
import time
import sys
import os

HOST = "192.168.2.1"
password = "password"

class bcolors:
HEADER = '\\033[95m'
OKBLUE = '\\033[94m'
OKGREEN = '\\033[92m'
WARNING = '\\033[93m'
FAIL = '\\033[91m'
ENDC = '\\033[0m'

def disable(self):
self.HEADER = ''
self.OKBLUE = ''
self.OKGREEN = ''
self.WARNING = ''
self.FAIL = ''
self.ENDC = ''

def drukuj(wiadomosc):
sys.stdout.write("\\r")
sys.stdout.write("                                                    ")
sys.stdout.flush()
sys.stdout.write("\\r")
sys.stdout.write(wiadomosc)
sys.stdout.flush()
#sys.stdout.write("\\r")


def status(komenda):
odb = ""
try:
tn = telnetlib.Telnet(host=HOST,timeout=23)
except IOError:
print "Nie nawiązano połączenia :(\\n"
else:
tn.read_until("Password: ")
tn.write(password + "\\n")
if komenda=="wan adsl reset\\n":
tn.write(komenda)
tn.write("exit\\n")
#print "Połączenie zostało z resetowane"
drukuj(bcolors.FAIL + "Połączenie zostało z resetowane" + bcolors.ENDC)
if komenda=="ip route status\\n":
tn.write(komenda)
tn.write("exit\\n")
odb = tn.read_all()
if komenda=="wan adsl status\\n":
tn.write("wan adsl status\\n")
tn.write("exit\\n")
odb = tn.read_all()
if re.search('current modem status: down', odb):
#print "Status: down"
drukuj(bcolors.HEADER + "Status: down" + bcolors.ENDC)
if re.search('current modem status: wait for initialization', odb):
#print "Status: wait for initialization"
drukuj(bcolors.WARNING + "Status: wait for initialization" + bcolors.ENDC)
if re.search('current modem status: initializing', odb):
#print "Status: initializing"
drukuj(bcolors.WARNING + "Status: initializing" + bcolors.ENDC)
if re.search('current modem status: up', odb):
#print "Status: up"
drukuj(bcolors.OKBLUE + "Status: up" + bcolors.ENDC)
return odb

def clear():
if os.name == "posix":
# Unix/Linux/MacOS/BSD/etc
os.system('clear')
elif os.name in ("nt", "dos", "ce"):
# DOS/Windows
os.system('CLS')

if __name__=="__main__":
clear()
status("wan adsl reset\\n")
time.sleep(5)
a = True
while a:
odb = status("ip route status\\n")
if re.search('\\d *poe0 *\\d', odb):
#print "Modem działa"
drukuj(bcolors.OKGREEN + "-=Modem działa=-\\n" + bcolors.ENDC)
time.sleep(2)
#clear()
a = False
else:
time.sleep(3)
status("wan adsl status\\n")
time.sleep(3)

 下面通过telnet 来重启路由器

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import telnetlib

    HOST = "192.168.1.1"
    USER = "root"
    PASS = "admin"

    router = telnetlib.Telnet(HOST)

    router.read_until(": ", 2)  # wait for timeout or "BusyBox on localhost login: "
    router.write(USER + "\\n")
    router.read_until(": ", 2)  # wait for timeout or "Password: "
    router.write(PASS + "\\n")
    router.read_until("# ", 2)  # wait for timeout or "# "
    router.write("reboot\\n")

    router.close()

    print "Done!"

这是四段独立的代码!

追问

我的路由器是普通的家庭版,不支持telnet的。

追答

网页192.168.1.1总能登录上去,通过第一段代码登录网页总可以上的去的

参考技术A

哈哈,你说的这个我也做过,给你段我写的代码

# -*- coding: utf-8 -*-
# 重启路由器脚本
#
import urllib2, base64


# 192.168.1.1
# admin:admin (BASE64编码)
if __name__ == '__main__':
    # 请求地址
    url = 'http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=重启路由器'
    # 验证的用户名和密码
    login_user = 'admin'
    login_pw = 'admin'
    
    auth = 'Basic ' + base64.b64encode('admin:admin')
    print auth
    heads =  'Referer' : 'http://192.168.1.1/userRpm/SysRebootRpm.htm',
             'Authorization' : auth
    
    
    # 请求重启路由器
    request = urllib2.Request(url, None, heads)
    response = urllib2.urlopen(request)
    print response.read()

本回答被提问者采纳

如何用python轻松破解wif梦幻西游无双开服公告i密码

参考技术A 环境准备
python2.7
凑合的linux
差不多的无线网卡
pywifi模块
弱口令字典
清除系统中的任何wifi连接记录(非常重要!!!)

首先,梦幻西游无双开服公告这个模块在win下有点鸡肋,作者在调用WLANAPI时没有做好WLAN_SECURITY_ATTRIBUTES的封装,所以推荐在linux下跑,我测试所使用的是Kali
2.0 自带python 2.7.6 ,可直接通过 pip install pywifi 安装。

导入模块

这里用的模块就这三个 pywifi的_wifiutil_linux.py脚本的 _send_cmd_to_wpas方法中的if reply != b'OKn':判断需要修改,不然会有很多的提示信息。

frompywifi import*

importtime

importsys 字典准备

效率很重要,毕竟这东西跑起来可真慢,下面是天朝用的比较多的wifi弱口令TOP10

以上是关于linux下的python里面如何用相关的网络模块来重启tp-link路由器?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntulinux下 如何用python 模拟按键

如何用Nginx部署Django

如何用Python交互执行shell脚本

如何用 Python 计算网络的 Eb(k)?

如何用linux命令进入一个目录 并且执行该目录下的一个文件

Linux下,Python项目包含多个模块以及图片包,跪问如何用pyinstaller将其打包在一起?