背景
我习惯按计划重启服务器。现在我想对我的 ADSL 路由器也这样做。
这是我的理由:当发生随机故障时,我通常会尝试重新启动服务器、接口和相关设备(如果可能),这是在进行任何其他故障排除(例如:更改配置等)之前的第一步。事实上,有时这可以解决问题(服务开始按预期工作)。这可能是因为当系统长时间启动时(有时,取决于软件和服务),它可能会变得无响应或出现故障。可能是软件无法释放一些内存、解锁一些资源等
现在,对于一些在非工作时间可以接受停机时间的服务,我安排了自动重启。这样,这类问题出现的频率就会降低。现在,如果在工作时间出现问题,我不需要重新启动整个服务,而是像重新启动它们后一样继续进行故障排除。
我们有什么
这是 Billion 5000 系列路由器,支持 TELNET、HTTP 和 SNMP 管理。
Telnet 方法(已更新)
可以通过 telnet 命令重新启动路由器:
C:\>telnet 192.168.1.1
Password:********
router>set reboot
如此接近,只需要一个自动 telnet、推送密码字符并发出'的脚本设置重启' 命令。[使用预计建议来自斯文]
HTTP 方法
值得一提的是,我利用了软件[1] 应用程序用于通过 HTTP 接口监控我的 ADSL 连接速度和噪声裕度(该软件本身,而不是浏览器应用程序,连接、无人值守登录并从 HTTP 接口读取值并将它们显示在图表中!)。
我想知道是否可以使用类似的方法实现 SysRestart(自动登录并单击 SysRestart 按钮的脚本!)
重启页面:
- 页面图片:
该页面的 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 我可以获得超过五百个 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 编写重启脚本
- 建议一种编写重启脚本的方法(任何其他方法!)
脚注:
答案1
如果没有适合 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 "