Wie verwende ich PowerShell und/oder Python, um den Router neu zu starten?

Wie verwende ich PowerShell und/oder Python, um den Router neu zu starten?

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):

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

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, .Documentist 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. RPCDer 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")

Bildbeschreibung hier eingeben

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 inputfieldsist 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 rebootoder sein ssh USERNAME@ROUTER_ADDRESS "sudo reboot".

  1. 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).
  2. 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/rebootoder usw. Und/oder Sie müssen möglicherweise auch die Berechtigungen erhöhen, wie sudo COMMANDoder su -c 'COMMAND' root.
  3. 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 (wie ssh 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 alsroot
  • Sie können die verfügbaren Befehle auflisten mit/?

Von hier aus können Sie versuchen, einen Befehl zu finden, beispielsweise rebootzum Neustarten oder shellum Zugriff auf weitere Bash-Befehle zu gewähren, vielleicht shutdown -roder 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.pyDas 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.

verwandte Informationen