Como usar o PowerShell para reiniciar o roteador?
Meu computador está conectado ao roteador usando um cabo de rede, o roteador funciona como um modem, ele se conecta ao ISP através de PPPoE, meu computador está atrás do NAT.
O modelo do meu roteador: Huawei HS8545M, endereço LAN: 192.168.1.1, login do administrador da página da Web: CMCAdmin, senha do administrador da página da Web: aDm8H%MdA.
Eu tenho que fazer o seguinte para reiniciar o roteador (7 cliques no total, o navegador lembra o login e a senha):
Passos demais.
Eu tentei usar este método:
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Navigate "https://192.168.1.1"
Mas depois de um tempo a conexão é perdida, .Document
fica vazia, tentar atualizar resulta neste erro:
OperationStopped: The RPC server is unavailable. (0x800706BA)
Estou usando o Windows 10 20H2 e desabilitei a Área de Trabalho Remota, Assistência Remota, Registro Remoto, Gerenciamento Remoto do Windows e muitas outras coisas, desabilitei coisas remotas porque representam ameaças à segurança, acho que são relevantes para isso; A propósito, o RPC
serviço está em execução.
Alguém pode me ajudar?
Código fonte da primeira página: page1.html
Código fonte da segunda página: page2.html
Isso deve ser simples de fazer, faça login em 192.168.1.1, crie um cookie e use o cookie para entrar em 192.168.1.1/index.asp, envie Restart_button, job done, porém não estou muito familiarizado com comandos que lidam com redes ...
Atualmente estou procurando o caminho do Python, estou usando o Python 3.9.1 amd64, coloquei no PATH há muito tempo, instalei o Selenium e o Twill via pip. e baixei e extraí o GeckoDriver.exe para a pasta de instalação do Python;
Conheço selênio, sarja, urllib, urllib2, cookielib e webbot, todos são capazes de fazer isso, atualmente estou tentando descobrir como fazê-lo da melhor maneira.
Consegui fazer login no roteador em Python via sarja, porém não sei o que fazer a seguir:
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")
O botão:
<input type="button" name="Restart_button" id="Restart_button" class="submit" style="width:98px" onclick="Reboot()" value="重启">
Está localizado em:
html.body.#container.#center.#content.table.tbody.tr.td.#frameContent.html.body.div.#Restart_button
Além disso, o inputfields
da primeira página ( 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
Eu tenho o código-fonte da página de redefinição:
<!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>
Está localizado no endereço:
http://192.168.1.1/html/ssmp/devmanage/cmccdevicereset.asp
Também não sei se Submit('btnSubmit')
me loguei ou não, não tenho certeza...
E embora isso funcione, o Firefox inicializa muito lentamente.
Eu finalmente descobri como fazer isso da maneira telnet:
telnet 192.168.1.1
root
adminHW
reset
Como posso torná-lo um script que insere comandos automaticamente?
A maneira SSH
Se o seu roteador suporta acesso SSH (você provavelmente precisa habilitá-lo nas configurações do roteador), você pode tentar emitir um comando via SSH para reiniciá-lo.
Pode ser algo como
ssh USERNAME@ROUTER_ADDRESS reboot
oussh USERNAME@ROUTER_ADDRESS "sudo reboot"
.ssh USERNAME@ROUTER_ADDRESS
(se funcionar, será solicitada a senha e, após digitar a senha correta, entre no prompt de comando do roteador).reboot
. Mas você também pode precisar especificar o caminho exato como/sbin/reboot
,/usr/sbin/reboot
ou etc. E/ou também pode precisar elevar os privilégios comosudo COMMAND
ousu -c 'COMMAND' root
.ssh USERNAME@ROUTER_ADDRESS
) e a emissão de um comando de reinicialização (por exemplosudo reboot
) em um único comando (comossh USERNAME@ROUTER_ADDRESS "sudo reboot"
). Você ainda será solicitado a digitar a senha todas as vezes, mas isso pode ser evitado (por favor, me envie um ping nos comentários se você chegou a esta etapa e deseja evitar digitar senhas).A maneira HTTP
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.Método puro do PowerShell:
Ele faz o trabalho em menos de 3 segundos. Eu determinei que esta é realmente a maneira mais eficiente de fazer isso.