如何使用PowerShell重启路由器?
我的电脑通过网线连接到路由器,路由器充当调制解调器,通过PPPoE连接到ISP,我的电脑在NAT后面。
我的路由器型号:华为HS8545M,局域网地址:192.168.1.1,网页管理员登录:CMCCAdmin,网页管理员密码:aDm8H%MdA。
我必须执行以下操作才能重新启动路由器(总共点击 7 次,浏览器记住了登录名和密码):
步骤太多了。
我尝试过使用这种方法:
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Navigate "https://192.168.1.1"
但是过了一会儿,连接丢失,.Document
为空,尝试刷新会导致此错误:
OperationStopped: The RPC server is unavailable. (0x800706BA)
我使用的是 Windows 10 20H2,并且我禁用了远程桌面、远程协助、远程注册表、Windows 远程管理和许多其他功能,我禁用了远程东西,因为它们对安全构成威胁,我认为它们与此相关;顺便说一句,RPC
服务正在运行。
谁能帮我?
第一页源代码:page1.html
第二页源代码:page2.html
这个应该很简单,登录192.168.1.1,创建一个cookie,使用cookie进入192.168.1.1/index.asp,提交Restart_button,大功告成,不过我对处理网络的命令不是很熟悉...
我目前正在寻找 Python 的方式,我使用的是 Python 3.9.1 amd64,我早就把它放在了 PATH 中,我已经通过 pip 安装了 Selenium 和 Twill。并将GeckoDriver.exe下载并解压到Python安装文件夹;
我知道 selenium、twill、urllib、urllib2、cookielib 和 webbot,都能够做到这一点,我目前正试图找出如何以最好的方式做到这一点。
我已经设法通过斜纹布登录到 Python 中的路由器,但是我不知道下一步该做什么:
from twill.commands import *
go('http://192.168.1.1')
showforms()
fv("1","txt_Username","CMCCAdmin")
fv("1","txt_Password","aDm8H%MdA")
showforms()
submit('btnSubmit')
go("http://192.168.1.1/index.asp")
按钮:
<input type="button" name="Restart_button" id="Restart_button" class="submit" style="width:98px" onclick="Reboot()" value="重启">
它位于:
html.body.#container.#center.#content.table.tbody.tr.td.#frameContent.html.body.div.#Restart_button
另外,inputfields
第一页(http://192.168.1.1):
PS C:\Windows\System32> $html.inputfields
outerHTML : <input name="txt_Username" type="text" id="txt_Username" style="float:left;padding:0;width:218px;height:38px;line-height:38px;text-indent:0.5em;border:0 solid green;background-color:transparent;" maxlength="31"/>
tagName : INPUT
name : txt_Username
type : text
id : txt_Username
style : float:left;padding:0;width:218px;height:38px;line-height:38px;text-indent:0.5em;border:0 solid green;background-color:transparent;
maxlength : 31
outerHTML : <input name="txt_Password" type="password" id="txt_Password" maxlength="127" style="float:left;padding:0;width:218px;height:38px;line-height:38px;text-indent:0.5em;border:0 solid green;background-color:transparent;"
maxlength="31"/>
tagName : INPUT
name : txt_Password
type : password
id : txt_Password
maxlength : 31
style : float:left;padding:0;width:218px;height:38px;line-height:38px;text-indent:0.5em;border:0 solid green;background-color:transparent;
outerHTML : <input type="button" id="btnSubmit" name="btnSubmit" value="确定" onclick="SubmitForm();" class="button_css"/>
tagName : INPUT
type : button
id : btnSubmit
name : btnSubmit
value : 确定
onclick : SubmitForm();
class : button_css
outerHTML : <input type="reset" name="Submit2" value="取消" onclick="canceltext();" class="button_css"/>
tagName : INPUT
type : reset
name : Submit2
value : 取消
onclick : canceltext();
class : button_css
我有重置页面的源代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache" />
<link rel="stylesheet" href='../../../../Cuscss/frame.css?2020070716413845-1425773353' type='text/css'>
<script language="JavaScript" src="../../../resource/common/util.js?2020070716413845-1425773353"></script>
<script language="JavaScript" type="text/javascript">
function LoadFrame()
{
}
function Reboot()
{
if(ConfirmEx("确定要重启设备吗?"))
{
setDisable('Restart_button', 1);
setDisable('Restore_button', 1);
setDisable('btnRestoreDftCfg', 1);
var Form = new webSubmitForm();
Form.setAction('set.cgi?x=' + 'InternetGatewayDevice.X_HW_DEBUG.SMP.DM.ResetBoard'
+ '&RequestFile=html/ssmp/devmanage/cmccdevicereset.asp');
Form.addParameter('x.X_HW_Token', getValue('onttoken'));
Form.submit();
}
}
</script>
</head>
<body class="mainbody" onLoad="LoadFrame();">
<div class="func_spread"></div>
<div class="title_with_desc">
<label id="Title_reboot_lable">设备重启</label>
</div>
<div class="title_01" style="padding-left:10px;" width="100%">
<label id="Title_reboot_tips_lable">点击如下按钮重启路由器。</label>
</div>
<div class="button_spread"></div>
<div align="right">
<input type="hidden" name="onttoken" id="hwonttoken" value="de0f5f98c4d4a77239ccb981cd5c4bf3">
<input type='button' name="Restart_button" id="Restart_button" class="submit" style="width:98px" onClick='Reboot()' value="重启">
</div>
</body>
</html>
它位于地址:
http://192.168.1.1/html/ssmp/devmanage/cmccdevicereset.asp
另外我真的不知道Submit('btnSubmit')
我是否登录,我不完全确定......
尽管这可行,但 Firefox 的初始化非常缓慢。
我终于想出了如何通过 telnet 方式进行操作:
telnet 192.168.1.1
root
adminHW
reset
如何使其成为自动输入命令的脚本?
SSH方式
如果您的路由器支持 SSH 访问(您可能需要在路由器设置中启用它),您可以尝试通过 SSH 发出命令来重新启动它。
它可能类似于
ssh USERNAME@ROUTER_ADDRESS reboot
或ssh USERNAME@ROUTER_ADDRESS "sudo reboot"
。ssh USERNAME@ROUTER_ADDRESS
(如果是这样,您将被要求输入密码,并且在输入正确的密码后,进入路由器的命令提示符)。reboot
. But you may also need to specify exact path like/sbin/reboot
,/usr/sbin/reboot
or etc. And/or you may also need to elevate the privileges likesudo COMMAND
orsu -c 'COMMAND' root
.ssh USERNAME@ROUTER_ADDRESS
) and issuing a reboot command (e.g.sudo reboot
) into a single command (likessh USERNAME@ROUTER_ADDRESS "sudo reboot"
). You will still be asked for password every time, but it can be avoided (please ping me in comments if you reached this step and want to avoid typing passwords).The HTTP way
Open Network Monitor in your browser (e.g. in Firefox that's Shift+Ctrl+E) and try to determine which exactly web request is issued when you confirm restart (e.g. in Firefox you can see the whole data of the request).
According to user Ligeti here, for a similar model: https://jalalsela.com/accessing-hg8245q-shell/
root
/?
From here you can try and find a command like
reboot
to restart, orshell
to give access to more bash commands, maybeshutdown -r
orhelp
/?
from there. If it says you don't have permission for something, he includes steps to super-admin yourself, but I don't think it would be necessary.Finally I have done it, and I found it to be very easy.
I used Python 3.9.1, Internet Explorer , Selenium and IEDriverServer.exe (32-bit).
The code:
I saved it as
RebootModem.py
, it works well, just it doesn't close the Window automatically after the router rebooted, and the code execution just hangs atie.switch_to.alert.accept()
and won't quit, requiring me to manually close the IE window...I tried the code in console, and I have found that the console won't accept commands until the router has finished rebooting...
I am currently trying to find the webbot, urllib(2), cookielib and twill way to do this, I don't think relying on a browser is very efficient.
I have made it automatically close the IE window and script by:
Save as
RebootModem.ps1
, at the same directory asRebootModem.py
, runRebootModem.ps1
to start execution ofRebootModem.py
and it will automatically close the IE window and Python.exe (its name is changed to IEDriverServer.exe) after 15 seconds...To generalize the code, just replace the elementids with the elementids of your router's webpage, you can get them by Ctrl+Shift+I, and replace the addresses with the addresses you found (though you probably don't need to change 192.168.1.1), I got the address of the page used to reboot modem by "View Frame Source".
P.S. the full code I used to reset all network settings:
I have done it...again!
The PowerShell + VBScript + Telnet way to do this:
Save as
RebootModem.vbs
Save as
RebootModem.ps1
Run
RebootModem.ps1
to restart the modem via Telnet and automatically close Telnet.exe after 6 seconds.纯PowerShell方法:
它可以在不到 3 秒的时间内完成工作。我已经确定这确实是最有效的方法。