PowerShell 및/또는 Python을 사용하여 라우터를 어떻게 다시 시작하나요?

PowerShell 및/또는 Python을 사용하여 라우터를 어떻게 다시 시작하나요?

PowerShell을 사용하여 라우터를 어떻게 다시 시작하나요?

내 컴퓨터는 네트워크 케이블을 사용하여 라우터에 연결되어 있고, 라우터는 모뎀 역할을 하며, PPPoE를 통해 ISP에 연결되고, 내 컴퓨터는 NAT 뒤에 있습니다.

내 라우터 모델: Huawei HS8545M, LAN 주소: 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에 로그인하고 쿠키를 만든 다음 쿠키를 사용하여 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 192.168.1.1
root
adminHW
reset

명령을 자동으로 입력하는 스크립트로 만들려면 어떻게 해야 합니까?

답변1

SSH 방식

라우터가 SSH 액세스를 지원하는 경우(라우터 설정에서 이를 활성화해야 할 수도 있음) SSH를 통해 명령을 실행하여 다시 시작할 수 있습니다.

ssh USERNAME@ROUTER_ADDRESS reboot또는 와 같은 것일 수 있습니다 ssh USERNAME@ROUTER_ADDRESS "sudo reboot".

  1. 먼저 SSH 액세스를 활성화해야 합니다. 다음과 같이 smth를 입력하여 작동하는지 확인하십시오 ssh USERNAME@ROUTER_ADDRESS(만약 그렇다면 비밀번호를 묻는 메시지가 표시되며 올바른 비밀번호를 입력한 후 라우터의 명령 프롬프트로 이동합니다).
  2. 그런 다음 라우터를 다시 시작하기 위해 라우터의 명령 프롬프트에 입력해야 하는 명령을 결정합니다. 그것은 단지 reboot. 그러나 또는 등과 같은 정확한 경로를 지정해야 할 수도 있습니다 /sbin/reboot. 및/또는 또는 /usr/sbin/reboot같은 권한을 높여야 할 수도 있습니다 .sudo COMMANDsu -c 'COMMAND' root
  3. 이전 두 단계를 통과하면 SSH에 로그인( ssh USERNAME@ROUTER_ADDRESS)하고 재부팅 명령(예: sudo reboot)을 실행하는 것을 단일 명령(예: ssh USERNAME@ROUTER_ADDRESS "sudo reboot")으로 결합할 수 있습니다. 매번 비밀번호를 묻는 메시지가 표시되지만 피할 수 있습니다(이 단계에 도달하여 비밀번호를 입력하지 않으려면 댓글로 핑을 보내주세요).

HTTP 방식

브라우저(예: Firefox에서는 Shift++ )에서 네트워크 모니터를 열고 다시 시작을 확인할 때 정확히 어떤 웹 요청이 발행되었는지 확인하십시오(예: Firefox에서는 요청의 전체 데이터를 볼 수 있습니다) Ctrl.E

답변2

유사한 모델의 경우 Ligeti 사용자에 따르면 다음과 같습니다.https://jalalsela.com/accessing-hg8245q-shell/

  • 장치에 대한 SSH/Telnet
  • 다음으로 로그인root
  • 다음을 사용하여 사용 가능한 명령을 나열할 수 있습니다./?

여기에서 재시작과 같은 명령을 찾 reboot거나 shell더 많은 bash 명령에 대한 액세스 권한을 부여하거나 shutdown -r또는 거기에서 help/를 시도할 수 있습니다. ?어떤 것에 대한 권한이 없다고 말하면 그는 스스로 최고 관리 단계를 포함하지만 제 생각엔 그럴 필요는 없을 것 같습니다.

답변3

마침내 나는 그것을 해냈고 그것이 매우 쉽다는 것을 알았습니다.

저는 Python 3.9.1, Internet Explorer, Selenium 및 IEDriverServer.exe(32비트)를 사용했습니다.

코드:

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

로 저장했는데 RebootModem.py잘 작동합니다. 라우터가 재부팅된 후 창이 자동으로 닫히지 않고 코드 실행이 중단되고 ie.switch_to.alert.accept()종료되지 않아 수동으로 IE 창을 닫아야 합니다...

콘솔에서 코드를 시도한 결과, 라우터 재부팅이 완료될 때까지 콘솔이 명령을 수락하지 않는 것으로 나타났습니다...

나는 현재 이 작업을 수행하기 위한 webbot, urllib(2), cookielib 및 twill 방법을 찾으려고 노력하고 있습니다. 브라우저에 의존하는 것은 매우 효율적이라고 생각하지 않습니다.


다음을 수행하여 IE 창과 스크립트를 자동으로 닫도록 했습니다.

    start-process -filepath python -argumentlist $PSScriptRoot\RebootModem.py
    start-sleep -seconds 15
    get-process -name iexplore | stop-process
    get-process -name IEDriverServer| stop-process

RebootModem.ps1와 같은 디렉터리에 로 저장 RebootModem.py하고 RebootModem.ps1실행을 시작하면 RebootModem.py15초 후에 IE 창과 Python.exe(이름이 IEDriverServer.exe로 변경됨)가 자동으로 닫힙니다.


코드를 일반화하려면 요소 ID를 라우터 웹페이지의 요소 ID로 바꾸세요. ++ Ctrl로 가져올 수 있으며 주소를 찾은 주소로 바꾸세요(아마도 192.168.1.1을 변경할 필요는 없지만). "View Frame Source"를 통해 모뎀 재부팅에 사용되는 페이지 주소를 얻었습니다.ShiftI


추신: 모든 네트워크 설정을 재설정하는 데 사용한 전체 코드:

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>"

답변4

해냈어...또!

이를 수행하는 PowerShell + VBScript + Telnet 방법은 다음과 같습니다.

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}")

다른 이름으로 저장RebootModem.vbs

Start-Process -Filepath cscript.exe -Argumentlist $PSScriptRoot\RebootModem.vbs
Start-Sleep -Seconds 6
Get-Process -Name Telnet | Stop-Process

다른 이름으로 저장RebootModem.ps1

RebootModem.ps1Telnet을 통해 모뎀을 다시 시작하고 6초 후에 Telnet.exe를 자동으로 닫으려면 실행하세요 .


순수 PowerShell 방법:

    [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

3초 이내에 작업이 완료됩니다. 나는 이것이 실제로 이 작업을 수행하는 가장 효율적인 방법이라고 판단했습니다.

관련 정보