
Wie verwende ich PowerShell, um den Router neu zu starten?
Mein Computer ist über ein Netzwerkkabel mit dem Router verbunden, der Router fungiert als Modem, die Verbindung zum ISP erfolgt über PPPoE, mein Computer befindet sich hinter NAT.
Das Modell meines Routers: Huawei HS8545M, LAN-Adresse: 192.168.1.1, Webseiten-Administrator-Login: CMCCAdmin, Webseiten-Administrator-Passwort: aDm8H%MdA.
Um den Router neu zu starten muss ich folgendes machen (insgesamt 7 Klicks, der Browser merkt sich Login und Passwort):
Viel zu viele Schritte.
Ich habe versucht, diese Methode zu verwenden:
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Navigate "https://192.168.1.1"
Aber nach kurzer Zeit geht die Verbindung verloren, .Document
ist leer, und beim Versuch, sie zu aktualisieren, tritt dieser Fehler auf:
OperationStopped: The RPC server is unavailable. (0x800706BA)
Ich verwende Windows 10 20H2 und habe Remotedesktop, Remoteunterstützung, Remoteregistrierung, Windows-Remoteverwaltung und viele andere Dinge deaktiviert. Ich habe Remote-Sachen deaktiviert, weil sie eine Sicherheitsbedrohung darstellen und ich denke, sie sind hierfür relevant. RPC
Der Dienst läuft übrigens.
Kann mir jemand helfen?
Quellcode der ersten Seite:Seite1.html
Quellcode der zweiten Seite:Seite2.html
Dies sollte eigentlich ganz einfach sein: Melden Sie sich bei 192.168.1.1 an, erstellen Sie ein Cookie und verwenden Sie das Cookie, um auf 192.168.1.1/index.asp zu gelangen. Senden Sie den Restart_button, und fertig. Ich kenne mich allerdings mit Befehlen, die mit Netzwerken zu tun haben, nicht so gut aus …
Ich suche derzeit nach dem Python-Weg. Ich verwende Python 3.9.1 amd64, habe es vor langer Zeit in PATH eingefügt, habe Selenium und Twill über Pip installiert und GeckoDriver.exe heruntergeladen und in den Python-Installationsordner extrahiert;
Ich weiß, dass Selenium, Twill, Urllib, Urllib2, Cookielib und Webbot alle dazu in der Lage sind. Ich versuche derzeit herauszufinden, wie ich es am besten mache.
Ich habe es geschafft, mich in Python über Twill beim Router anzumelden, weiß jedoch nicht, was ich als Nächstes tun soll:
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")
Die Taste:
<input type="button" name="Restart_button" id="Restart_button" class="submit" style="width:98px" onclick="Reboot()" value="重启">
Es befindet sich unter:
html.body.#container.#center.#content.table.tbody.tr.td.#frameContent.html.body.div.#Restart_button
Außerdem inputfields
ist die erste Seite (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
Ich habe den Quellcode der Reset-Seite:
<!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>
Es befindet sich unter der Adresse:
http://192.168.1.1/html/ssmp/devmanage/cmccdevicereset.asp
Außerdem weiß ich nicht wirklich, ob Submit('btnSubmit')
ich angemeldet bin oder nicht, ich bin mir nicht ganz sicher …
Und obwohl dies funktioniert, wird Firefox sehr langsam initialisiert.
Ich habe endlich herausgefunden, wie es mit Telnet geht:
telnet 192.168.1.1
root
adminHW
reset
Wie kann ich daraus ein Skript machen, das automatisch Befehle eingibt?
Antwort1
Der SSH-Weg
Wenn Ihr Router SSH-Zugriff unterstützt (Sie müssen ihn wahrscheinlich in den Router-Einstellungen aktivieren), können Sie versuchen, einen Befehl über SSH einzugeben, um ihn neu zu starten.
Es könnte so etwas wie ssh USERNAME@ROUTER_ADDRESS reboot
oder sein ssh USERNAME@ROUTER_ADDRESS "sudo reboot"
.
- Zuerst müssen Sie den SSH-Zugriff aktivieren. Stellen Sie sicher, dass dies funktioniert, indem Sie etwas wie Folgendes eingeben
ssh USERNAME@ROUTER_ADDRESS
(wenn dies der Fall ist, werden Sie nach einem Passwort gefragt. Nach Eingabe des richtigen Passworts gelangen Sie in die Eingabeaufforderung des Routers). - Stellen Sie dann fest, welchen Befehl Sie in die Eingabeaufforderung des Routers eingeben müssen, um ihn neu zu starten. Es könnte einfach sein
reboot
. Sie müssen aber möglicherweise auch den genauen Pfad angeben, wie/sbin/reboot
,/usr/sbin/reboot
oder usw. Und/oder Sie müssen möglicherweise auch die Berechtigungen erhöhen, wiesudo COMMAND
odersu -c 'COMMAND' root
. - Wenn die beiden vorherigen Schritte abgeschlossen sind, können Sie die Anmeldung bei SSH (
ssh USERNAME@ROUTER_ADDRESS
) und die Ausgabe eines Neustartbefehls (z. B.sudo reboot
) in einem einzigen Befehl (wiessh USERNAME@ROUTER_ADDRESS "sudo reboot"
) kombinieren. Sie werden zwar immer noch jedes Mal nach einem Passwort gefragt, aber das kann vermieden werden (bitte pingen Sie mich in den Kommentaren an, wenn Sie diesen Schritt erreicht haben und die Eingabe von Passwörtern vermeiden möchten).
Der HTTP-Weg
Öffnen Sie den Netzwerkmonitor in Ihrem Browser (in Firefox ist das beispielsweise Shift+ Ctrl+ E) und versuchen Sie herauszufinden, welche genaue Web-Anfrage gestellt wird, wenn Sie den Neustart bestätigen (in Firefox können Sie beispielsweise die gesamten Daten der Anfrage sehen).
Antwort2
Laut Benutzer Ligeti hier für ein ähnliches Modell:https://jalalsela.com/accessing-hg8245q-shell/
- SSH/Telnet zum Gerät
- Anmelden als
root
- Sie können die verfügbaren Befehle auflisten mit
/?
Von hier aus können Sie versuchen, einen Befehl zu finden, beispielsweise reboot
zum Neustarten oder shell
um Zugriff auf weitere Bash-Befehle zu gewähren, vielleicht shutdown -r
oder help
/ ?
von dort aus. Wenn Sie keine Berechtigung für etwas haben, enthält er Schritte, um sich selbst zum Superadministrator zu machen, aber ich denke nicht, dass das notwendig wäre.
Antwort3
Endlich habe ich es geschafft und fand es sehr einfach.
Ich habe Python 3.9.1, Internet Explorer, Selenium und IEDriverServer.exe (32-Bit) verwendet.
Der Code:
import selenium
from selenium import webdriver
ie = webdriver.Ie()
ie.get('http://192.168.1.1')
ie.find_element_by_id('txt_Username').send_keys("CMCCAdmin")
ie.find_element_by_id('txt_Password').send_keys("aDm8H%MdA")
ie.find_element_by_id('btnSubmit').click()
ie.get('http://192.168.1.1/html/ssmp/devmanage/cmccdevicereset.asp')
ie.find_element_by_id('Restart_button').click()
ie.switch_to.alert.accept()
Ich habe es unter gespeichert RebootModem.py
. Es funktioniert gut, aber das Fenster wird nach dem Neustart des Routers nicht automatisch geschlossen. Außerdem bleibt die Codeausführung bei hängen ie.switch_to.alert.accept()
und lässt sich nicht beenden, sodass ich das IE-Fenster manuell schließen muss ...
Ich habe den Code in der Konsole ausprobiert und festgestellt, dass die Konsole keine Befehle annimmt, bis der Router den Neustart abgeschlossen hat ...
Ich versuche derzeit, eine Möglichkeit hierfür mit Webbot, Urllib(2), Cookielib und Twill zu finden, da ich nicht glaube, dass es sehr effizient ist, sich dabei auf einen Browser zu verlassen.
Ich habe dafür gesorgt, dass das IE-Fenster und das Skript automatisch geschlossen werden, indem:
start-process -filepath python -argumentlist $PSScriptRoot\RebootModem.py
start-sleep -seconds 15
get-process -name iexplore | stop-process
get-process -name IEDriverServer| stop-process
Speichern Sie unter RebootModem.ps1
, im selben Verzeichnis wie RebootModem.py
, und führen Sie es aus RebootModem.ps1
, um die Ausführung zu starten. RebootModem.py
Das IE-Fenster und Python.exe (der Name wird in IEDriverServer.exe geändert) werden nach 15 Sekunden automatisch geschlossen ...
Um den Code zu verallgemeinern, ersetzen Sie einfach die Element-IDs durch die Element-IDs der Webseite Ihres Routers. Sie erhalten sie mit Ctrl+ Shift+ Iund ersetzen Sie die Adressen durch die Adressen, die Sie gefunden haben (obwohl Sie 192.168.1.1 wahrscheinlich nicht ändern müssen). Ich habe die Adresse der Seite, die zum Neustart des Modems verwendet wurde, über „View Frame Source“ erhalten.
PS: der vollständige Code, den ich zum Zurücksetzen aller Netzwerkeinstellungen verwendet habe:
devcon disable *dev_8168*
devcon enable *dev_8168*
start-sleep -seconds 3
netsh winsock reset
netsh winhttp reset proxy
netsh http flush log buffer
net start dot3svc
netsh lan reconnect
net stop dot3svc
start-sleep -seconds 3
netsh int ip reset
netsh int ipv4 reset
netsh int ipv6 reset
netsh int httpstunnel reset
netsh int portproxy reset
netsh int tcp reset
start-sleep -seconds 3
ipconfig /release
ipconfig /all
ipconfig /flushdns
ipconfig /registerdns
ipconfig /renew
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
RunDll32.exe InetCpl.cpl,ResetIEtoDefaults
Start-Sleep -Seconds 1
[System.Windows.Forms.SendKeys]::SendWait("{Tab}")
[System.Windows.Forms.SendKeys]::SendWait(" ")
[System.Windows.Forms.SendKeys]::SendWait("R")
Start-Sleep -Seconds 2
[System.Windows.Forms.SendKeys]::SendWait("C")
start-process -filepath python -argumentlist $PSScriptRoot\RebootModem.py
start-sleep -seconds 15
get-process -name iexplore | stop-process
get-process -name IEDriverServer| stop-process
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "ProxyEnable" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "ProxyOverride" -Type String -Value "login.live.com;account.live.com;clientconfig.passport.net;wustat.windows.com;*.windowsupdate.com;*.wns.windows.com;*.hotmail.com;*.outlook.com;*.microsoft.com;*.msftncsi.com;<local>"
Antwort4
Ich habe es getan...schon wieder!
So geht's:
set router = CreateObject ("WScript.Shell")
router.run("Telnet")
WScript.Sleep 750
router.sendkeys("Open 192.168.1.1")
router.sendkeys("{Enter}")
WScript.Sleep 750
router.sendkeys("root")
router.sendkeys("{Enter}")
WScript.Sleep 750
router.sendkeys("adminHW")
router.sendkeys("{Enter}")
WScript.Sleep 750
router.sendkeys("reset")
router.sendkeys("{Enter}")
Speichern alsRebootModem.vbs
Start-Process -Filepath cscript.exe -Argumentlist $PSScriptRoot\RebootModem.vbs
Start-Sleep -Seconds 6
Get-Process -Name Telnet | Stop-Process
Speichern alsRebootModem.ps1
Ausführen RebootModem.ps1
, um das Modem über Telnet neu zu starten und Telnet.exe nach 6 Sekunden automatisch zu schließen.
Reine PowerShell-Methode:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Start-Process -Filepath Telnet.exe -Argumentlist 192.168.1.1
Start-Sleep -Seconds 1
[System.Windows.Forms.SendKeys]::SendWait("root")
[System.Windows.Forms.SendKeys]::SendWait("{Enter}")
[System.Windows.Forms.SendKeys]::SendWait("adminHW")
[System.Windows.Forms.SendKeys]::SendWait("{Enter}")
[System.Windows.Forms.SendKeys]::SendWait("reset")
[System.Windows.Forms.SendKeys]::SendWait("{Enter}")
Get-Process -Name Telnet | Stop-Process
Damit ist die Aufgabe in weniger als 3 Sekunden erledigt. Ich bin zu dem Schluss gekommen, dass dies tatsächlich die effizienteste Methode ist.