Snmp

sysRestart Billion ADSL 路由器(SNMP v2 或 HTTP)

  • February 20, 2016

背景

我習慣於按計劃重新啟動我的伺服器。現在我想要我的 ADSL 路由器也一樣。

這是我的原因:當發生隨機故障時,我習慣於在進行任何其他故障排除(例如:更改配置等)之前嘗試重新啟動伺服器、介面和相關設備(如果可能)作為第一步。事實上,有時這可以解決問題(服務開始按預期工作)。這可能是因為當系統長時間執行時(有時,取決於軟體和服務),它可能會變得無響應或出現故障。可能是軟體無法釋放一些記憶體、解鎖一些資源等

現在對於一些在非工作時間可以接受計劃停機時間的服務,我安排了自動重啟。這樣,此類問題的出現​​頻率就會降低。現在,如果在工作時間出現問題,我不需要重新啟動整個服務,而是會像重新啟動它們之後一樣恢復故障排除。

我們有什麼

這是一款億萬5000系列路由器,支持TELNET、HTTP和SNMP進行管理。

Telnet 方法(更新)

這可以通過 telnet 命令重新啟動路由器:

C:\>telnet 192.168.1.1
   Password:********
   router>set reboot

這麼近,只需要一個自動遠端登錄、推送密碼字元並發出“ set reboot ”命令的腳本。[ SvenW建議的使用expect的方法]

HTTP方法

值得一提的是,我使用一個軟體[ 1 ] 應用程序通過 HTTP 介面監視我的 ADSL 連接速度和雜訊容限(軟體本身,而不是瀏覽器應用程序,連接、登錄並從 HTTP 介面讀取值並顯示它們在圖表中!)。

我想知道是否可以用類似的方法實現 SysRestart(自動登錄並點擊 SysRestart 按鈕的腳本!)

重啟頁面:

  • 頁面圖片: 帶有重啟按鈕的 HTML 頁面
  • 頁面的源 HTML:
<html><head>
<meta http-equiv=Content-Script-Type content=text/javascript>
<meta http-equiv=Content-Style-Type content=text/css>
<meta http-equiv=Content-Type content="text/html; charset=
iso-8859-1">
<link rel="stylesheet" href="../css/style.css" type="text/css">
<script language="JavaScript"> 
function doRefresh()
{
   alert("Reboot Complete");   parent.navigation.location.href = "/navigation-status.html";
   window.location.href = "../status/status_deviceinfo.htm";
}

function doLoad()
{

    }

</script>
</head><body onload="doLoad()">
<FORM METHOD="POST" ACTION="/Forms/tools_system_1" name="System_Restore">
<table width="760" border="0" align=center cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
 <tr>
     <td height="5" class="light-orange" colspan="5"> </td></tr><tr>
   <td width="150" height="30" class="title-main">
   <font color="#FFFFFF">System Restart</font>    </td><td width="10" class="black"> </td><td width="150"></td><td width="10"> </td><td width="440"></td></tr><tr>
   <td class="light-orange"> </td><td class="light-orange"></td><td class="tabdata"><div align=right>
   <font color="#000000">System Restart with</font>    </div></td><td class="tabdata"><div align=center>:</div></td><td class="tabdata">
       <INPUT TYPE="RADIO" NAME="restoreFlag" VALUE="0" CHECKED>       <font color="#000000">Current Settings</font>       </td></tr><tr>
   <td class="light-orange"> </td><td class="light-orange"></td><td class="tabdata"> </td><td class="tabdata"> </td><td class="tabdata">
       <INPUT TYPE="RADIO" NAME="restoreFlag" VALUE="1">       <font color="#000000">Factory Default Settings</font>       </td></tr><tr>
   <td class="light-orange"> </td><td class="light-orange"></td><td width="150"> </td><td width="10"> </td><td width="440"> </td></tr></table><table width="760" border="0" align=center cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
 <tr>
   <td width="160" class="black" height="42" > </td><td width="160" class="orange"> </td><td width="440" class="orange">
       <INPUT TYPE="SUBMIT" NAME="Restart" VALUE="RESTART">    </td></tr></table></div></form>
</body></html>

SNMP 方法

該路由器還支持 SNMP v2 讀寫社區。我認為有可能以這種方式執行它。

事實上,通過一些搜尋,我發現[ 2 ] 有些人使用 SNMP 重新啟動他們的設備(但我找不到我的路由器通過 OID 來執行重置)

例如,擁有這些設備之一的人似乎可以使用這些 OID 重新啟動它們:

'.1.3.6.1.4.1.207.8.4.4.3.2.0',    # Allied Telesyn restart
'.1.3.6.1.4.1.11.2.14.11.1.4.1.0', # Hewlett-Packard hpicfReset
'.1.3.6.1.4.1.9.5.1.1.9.0',        # Cisco CatOS sysReset
'.1.3.6.1.4.1.9.2.9.9.0',          # Cisco IOS tsMsgSend
'.1.3.6.1.4.1.529.9.8.0.0'         # Ascend sysReset

SNMP 步行

使用 SNMP walk 我可以獲得超過 500 個 OID 的列表,例如:

.1.3.6.1.4.1.16972.5.1.1.0
.1.3.6.1.4.1.16972.4.10.0
...etc (568 more)...

但是我目前不知道如何從中選擇一個(特別害怕在它們上測試 snmp-write!)。

更多資訊

其他一些(步行)OID 和可能有幫助的值:

.1.3.6.1.4.1.16972.1.3.0; Trendchip TC3162 T14F7_3.0
.1.3.6.1.4.1.16972.5.1.1.0; www.huawei.com
.1.3.6.1.4.1.16972.1.6.0; Ras Ver:2.10.4.0(UE0.C2C)3.6.0.0   DMT Ver:3.6.0.0

你怎麼能幫忙?

  • 建議一種通過 SNMP 編寫重啟腳本的方法(需要先找到 OID!?)
  • 建議一種通過 HTTP 編寫重啟腳本的方法
  • 建議一種通過 telnet 編寫重啟腳本的方法
  • 建議一種重新啟動腳本的方法(任何其他方式!)

腳註:

如果沒有適合 SNMP 的 MIB 文件,您最好的選擇是找到一些執行重啟的 telnet 命令,並可能在該expect工具的幫助下使用它,或者使用類似curl使用 Web 界面的東西。

使用 curl 可能需要多次呼叫它以首先登錄並保存會話 cookie,然後進行實際重啟。

不過,我確實想知道-您嘗試通過定期重啟來修復的設備是否存在實際問題?如果沒有,我看不出這樣做的理由。

編輯:

期望腳本的基本範例。scriptname hostname password使用或更改變數分配來呼叫它以包含實際的主機名和密碼:

#!/usr/bin/expect 

set timeout 15
set hostname [lindex $argv 0] 
set password [lindex $argv 1] 

spawn telnet $hostname 

expect "Password:" 
send "$password " 
expect "router>" 
send "set reboot "

引用自:https://serverfault.com/questions/460413