Kree | 【教學】讓 ADSL 數據機自動重開機的方法 (需 Linux) 前言: ---------------------------------------------------------- 相信不少人都有這種困擾: 有時候 ADSL 數據機,燈號都正常,但網路卻連不出去 非得把數據機電源關掉在重開,才能恢復正常 如果人在家裡,問題還好解決,去把數據機重開機就好 但如果出門在外,家裡網路斷線,導致 server 連不進去 (網路硬碟等應用) 那可就真的是 @!#$@#$%!......... 除了使用定時斷電器等方法 ,是否有更好的全自動化解決方案呢? 這就是本篇要探討的主題:「自動化偵測網路狀態,若斷線則重新啟動數據機」 ↑照三餐斷線,煩不勝煩 硬體環境: ----------------------------------------------------------- ADSL 數據機:ALCATEL SPEED TOUCH 340 (俗稱小白龜) 路由器主機 (NAT):Linux 電腦 具體構想: --------------------------------------------------------------------------------- 小白龜支援 telnet 登入 登入後,即可以下指令 restart 來重開機 不過問題是,小白龜只接受 192.168.1.1 這個 IP 作登入 對外網卡介面,是無法直接登入小白龜的 因此需要虛擬一個網路介面 虛擬一個網路介面 eth0:0 IP : 192.168.1.2 mask : 255.255.255.0 network : 192.168.1.0 新增路由規則 要到 192.168.1.1,必須經過 192.168.1.2 (虛擬介面),裝置為 eth0 語法:route add -host 192.168.1.1 gw 192.168.1.2 dev eth0 路由規則重開機會消失,可以寫入 rc.local 如此一來,在那台 Linux 路由器主機,便可以 telnet 進 192.168.1.1 (小白龜) telnet 192.168.1.1 使用者帳號:免 預設密碼:12345 若無法進入,可參考「破解小白龜密碼教學」: http://www.pczone.com.tw/vbb3/showthread.php?t=90323 輸入 help ,會列出可用指令 ------------------------------------------ restart 重開機 uptime 列出總開機時間 @close 離開 以上實現了:用指令操作小白龜,坐在電腦前,就可以令它重開機,不必人走過去按電源開關 但是這樣還是不夠的.... 接著要程式會自動去偵測網路狀態,若斷線了,就令小白龜重開機 達到「全自動化,完全不需人工操作」的目標 如果一來,才能真正做到 24小時保持不斷線 或者出門在外,也不用擔心家裏 server 網路斷線 自動化方案: ------------------------------------------------------------- 全自動方面,由兩支 selll script 來達成,或是要整合成一支也行 原始碼一: (check-net.sh) 語法: #!/bin/sh # 檢查網路是否斷線,若斷線呼叫「ADSL 數據機自動重開機腳本」 # 建議寫入 cron 排程,每分鐘固定執行 # 用 ping ISP DNS 的方式,來確認網路是否斷線 # 因為ISP的DNS主機,有時也會掛掉,為避免誤判,所以確認兩家 # 搜尋含 0% 的字串,用 awk 取第6個字串 # 註:不能直接用有 0% 的一整行字串來判斷,因為 100% lost 中,也含有 0% checkNet_01=`ping -c 1 61.64.127.1 | grep 0% | awk '{print $6}'` checkNet_02=`ping -c 1 168.95.1.1 | grep 0% | awk '{print $6}'` # echo 訊息為 debug 用,正式版可刪除 echo $checkNet_01 echo $checkNet_02 # 檢查變數是否「非」0%,若條件成立,代表網路不正常 # 若網路不正常,則呼叫「ADSL 數據機自動重開機腳本」 # 為避免誤判,只有在兩家 ISP DNS 都 ping 不到的情況下,條件才成立 # echo 訊息為 debug 用,正式版可刪除 if [ ! "$checkNet_01" == "0%" ] ;then if [ ! "$checkNet_02" == "0%" ] ;then /usr/local/bin/expect.sh fi else echo "network is good" fi 它會去 ping ISP 的 DNS,如果 ping 不到,就呼叫另一支 script 去處理一下小白龜 寫入 cron 排程,即可讓它每分鐘固定執行 vi /etc/crontab --------------------------------------------------------- */1 * * * * root /usr/local/bin/check-net.sh /etc/rc.d/init.d/crond restart chkconfg crond on 原始碼二:(expact.sh) 語法: #!/bin/sh # ========================================================= # 對話型指令自動化輸入範本 v.01 最後修改日期:2006/06/26 # # 必要條件: # 執行此範本需要 expect 套件,請先檢查系統是否有安裝 expect 套件。 # 檢查是否有安裝:rpm -qa | grep expect # 安裝:yum install expect (tck 是它的相依套件,需一併安裝) # # 說明: # 對話型指令是指如:telnet、ftp、ssh ...等 # 必須使用者介入操作的指令 # 使用此範本,可達到自動化,無須人工操作之目的 # ========================================================= # ================================= # 變數定義 # ================================= # timeout 有兩種意義 # 1.最長等待連接時間,若超過則放棄 # 2.每次出現問答字串時,暫停回應的時間 # 此數值勿設太長,太長的話執行週期要等很久 # 若主機在遠端,回應時間較長,則此數值亦不宜設太短 # 單位:秒 TIMEOUT=1 # 主機名稱或IP HOSTNAME='192.168.1.1' # 使用者名稱與密碼 NAME='' PASSWD='12345' # ================================ # 對話型指令自動輸入流程腳本 # ================================ # expect -c " " 框住範圍內,為流程腳本,中間不可以插入 #註解,否則會發生錯誤 # expect [偵測螢幕上會出現的字串] # send [出現這個字串時,要如何回應] # 偵測字串必須為該行完整字串,不可以只取其中一個單字,否則抓不到 # 在回應中,雙引號 " 必須寫成 \",反斜線 \ 寫成 \\,\r 代表 <enter> # 以下為範例腳本,模擬 ALCATEL SPEED TOUCH 340 的 telnet 過程 # 不保證字串一定正確,請使用者自行確認修改後再使用 expect -c " set timeout $TIMEOUT spawn telnet $HOSTNAME expect { timeout exit \"password:\" } send \"$PASSWD\r\" expect \">\" send \"restart\r\" expect \">\" send \"@close\r\" " echo telent 是一種問答式的程式 無法直接用管線餵資料的方式,讓它接收資料 但 Linux 提供了一種「巨集」的解決方法 expect 指令,可以建立一個流程腳本 它能在螢幕出現了某個字串時,回應使用者安排的對話 先將可能的對話都想好,然後寫一個流程腳本 如此一來,即使是 telnet 這類問答式的程式,仍然可以自動化 ------------------------------------------------------------------------------------------- 測試過可行 分享給有需要的網友 |
回覆 |
會員 | 回覆: 【教學】讓 ADSL 數據機自動重開機的方法 (需 Linux) SpeedTouch 340 是不是可以在管理頁面上做 restart 的動作(記得好像可以)? 如果可以的話,用 wget 去呼叫那個 restart 的網頁好像就可以了... 像 AR4031B 似乎可以用 http://192.168.1.1/resetrouter.html 去重置! 這個好處是... Windows 上也有 wget 可以做類似的動作,不過最通用的方法大概是用 perl / python 吧! |
回覆 |
主題工具 | |
|
類似的主題 | ||||
主題 | 主題作者 | 討論版 | 回覆 | 最後發表 |
【教學】讓 foobar 的 freedb 可顯示中文 | 琥珀 | -- 多 媒 體 討 論 版 | 1 | 2005-03-05 05:37 PM |
【教學】讓 Webalizer 幫你分析 Multi-Domain 訪客資料 | ADJ | -- FreeBSD & Linux 討 論 版 | 0 | 2002-10-13 11:17 PM |
【問題】GIGA ADSL 想換 中華電信 ADSL 該如何換呢 ? | BL1978 | ---- ADSL 軟 硬 體 技 術 | 4 | 2002-05-07 09:01 AM |
【公告】最新版規 - 推薦某家 ADSL 速度或抱怨某家 ADSL 速度 , 請附上證據 | 阿 土 | ---- ADSL 抱 怨 與 鼓 勵 | 15 | 2002-04-27 09:58 AM |
giga ADSL 無法瀏覽 // hinet adsl 與撥接 均可 | davy | ---- ADSL 軟 硬 體 技 術 | 1 | 2001-08-30 04:00 PM |
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。