![]() |
|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
![]() ![]() |
|
主題工具 | 顯示模式 |
![]() |
#1 |
榮譽會員
![]() |
![]() 不管是 Linux 或是 BSD 下所使用的 PPPoE 撥號程式,在遇到很多奇怪的斷線狀況似乎並不能很自動的自己重撥,所以我寫了這個 Script , 相信很多人都用的上.
因為後來新版的 Perl 對 system/exec 等指令的傳回值處理方式似乎已經不同,最好的偵測方式是用 Perl Module,而不是呼叫系統指令,所以需要先裝 Net::Ping::External 用 CPAN 來安裝的話請依照以下步驟 ( CPAN 還沒設定過的請先設定): perl -MCPAN -e shell cpan shell -- CPAN exploration and modules installation (v1.7601) ReadLine support enabled cpan> install Net::Ping::External 裝好用就可以使用下面這個 script . 我使用的環境是 FreeBSD , 如果不是這個環境請自行修裡面有用到的系統指令的路徑,還有修改 $PPPoE_command 變數. 在跟 PC Zone 阿土站長 討論過以後,我稍微改了一下程式並附上我自己的 ppp.conf 不使用 killall 來砍掉 ppp 的 pid 是顧慮到這個 command 在 Linux 可能沒有,所以我採用比較傳統的方式處理. ------------------------------------------------------------- 以下是我的 /etc/ppp.conf 內容 (參考 FreeBSD Handbook): default: set log Phase tun command # you can add more detailed logging if you wish set ifaddr 10.0.0.1/0 10.0.0.2/0 hinet: set device PPPoE:rl0 set authname 你的帳號@hinet.net set authkey 你的密碼 set dial set login add default HISADDR nat enable yes 啟動 PPPoE 的方式我是建議寫在 /etc/rc.local ,加上一行: /usr/sbin/ppp -ddial hinet --------------------------------------------------------- 以下為 Script 內容: CODE: [Copy to clipboard] -------------------------------------------------------------------------------- #!/usr/local/bin/perl $|=1; #============================================= # Programming by Dekuo Kuo in 2005/02/13 # http://www.dekuo.com/ # # This script is running on FreeBSD. # When you run it on other Unix like OS, # modify below variable $PPPoE_command and # system command path used in this script $PPPoE_command = '/usr/sbin/ppp -ddial hinet'; #============================================= if (ping_basic('168.95.1.1') != 1 && ping_basic('192.72.80.36') != 1) { $pid_reference = get_pid("$PPPoE_command"); print "ADSL Link Down\n"; foreach $pid (@$pid_reference) { print "Kill pid=$pid ...\n"; system("/bin/kill $pid") if $pid != ''; } system("$PPPoE_command"); system("/bin/date >> /var/log/check_pppoe.log"); } else { print "ADSL Link Up\n"; } sub get_pid { $process_string = $_[0]; $process_string = "\'" . $process_string . "\'"; @ps_data = grep {!/grep/} `ps -ax | grep $process_string`; my @pid_list; foreach (@ps_data) { @ps_line = grep { $_ ne ''} split(/\s+/,$_); push(@pid_list,$ps_line[0]); } return \@pid_list; } sub ping_basic { use Net::Ping::External qw(ping); my $device_ipv4 = $_[0]; my $alive = ping(hostname => "$device_ipv4", timeout => 5, count => 5, size => 1024); return $alive; } 最後 ,當然不要忘了在 crontab 裡加一行 ... 大概 5 分鐘檢查一次應該夠了 crontab 範例 (當然要先建立 /root/script 這個目錄) : */5 * * * * /root/script/check_pppoe.pl 如果您用的是 FreeBSD 5.x 的版本, 請在 crontab 最上面放下面這兩行敘述: SHELL=/bin/tcsh PATH=/etc:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin 否則會讓 perl 找不到相關 module 也就是說,如果您用的是 FreeBSD 5.x 以上的版本, 您的 crontab 內容就必須是這樣: SHELL=/bin/tcsh PATH=/etc:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin */5 * * * * /root/script/check_pppoe.pl 為什麼 FreeBSD 5.x 不能夠使用 /etc/crontab 的 Shell 參數,這點我還不明白,如果有人瞭解的還請麻煩留言告知 另外, 如果有人在 Linux 環境下使用, 也請告訴我, 我想知道 Linux 下的 Command 路徑有沒有變 |
![]() |
送花文章: 3,
![]() |