【教學】讓 ADSL 數據機自動重開機的方法 (需 Linux)

顯示結果從第 1 筆 到 2 筆,共計 2 筆
  1. #1
    Kree linux_xp 的大頭照
    註冊日期
    2002-01-19
    討論區文章
    2,655

    【教學】讓 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/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
    上面這個是簡單的 script
    它會去 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
    這支 script 是「自動化」的關鍵所在

    telent 是一種問答式的程式
    無法直接用管線餵資料的方式,讓它接收資料

    但 Linux 提供了一種「巨集」的解決方法


    expect 指令,可以建立一個流程腳本
    它能在螢幕出現了某個字串時,回應使用者安排的對話

    先將可能的對話都想好,然後寫一個流程腳本
    如此一來,即使是 telnet 這類問答式的程式,仍然可以自動化


    -------------------------------------------------------------------------------------------

    測試過可行

    分享給有需要的網友



  2. #2
    會員
    註冊日期
    2002-01-22
    所在地區
    ADSL 8M/640K
    討論區文章
    46

    回覆: 【教學】讓 ADSL 數據機自動重開機的方法 (需 Linux)

    SpeedTouch 340 是不是可以在管理頁面上做 restart 的動作(記得好像可以)?

    如果可以的話,用 wget 去呼叫那個 restart 的網頁好像就可以了... 像 AR4031B 似乎可以用 http://192.168.1.1/resetrouter.html 去重置!
    這個好處是... Windows 上也有 wget 可以做類似的動作,不過最通用的方法大概是用 perl / python 吧!

類似的主題

  1. 【教學】自動重撥 PPPoE ADSL 連線 (For Linux & FreeBSD)
    作者:dekuo 所在討論版:-- FreeBSD & Linux 討 論 版
    回覆: 17
    最後發表: 2009-01-20, 10:09 PM
  2. 【轉貼】避免小烏龜(中華給的數據機)熱當機的方法
    作者:asasban 所在討論版:---- ADSL 軟 硬 體 技 術
    回覆: 6
    最後發表: 2004-08-09, 11:47 PM
  3. 【教學】可讓電腦自動開機的方法[可作成"電腦錄影機"]
    作者:microhard 所在討論版:-- 多 媒 體 討 論 版
    回覆: 1
    最後發表: 2003-02-09, 09:08 AM
  4. 【調查】使用win2000會自動重開機的....
    作者:pincloud 所在討論版:-- Windows 討 論 版
    回覆: 2
    最後發表: 2002-03-07, 01:37 AM
  5. 來喔..有NT會自動重開機的問題要問喔....
    作者:地獄貓 所在討論版:-- Windows 討 論 版
    回覆: 2
    最後發表: 2001-09-14, 11:42 PM

 

此網頁沒有從搜尋引擎而來的訪客

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •