PCZONE 版規 帳號無法發言?
 首頁 註冊 個人設定 悄悄話 搜尋文章 最新文章 今日所有文章 會員登出

返回   PCZONE 討論區 > ▲ -- 電 腦 軟 體 討 論 區 > -- FreeBSD & Linux 討 論 版
帳 號
密 碼
我確定要註冊 論壇說明 會員列表 行事曆 搜尋資料 今日新文章 標記所有討論區已讀

-- FreeBSD & Linux 討 論 版 因為本站採用 FreeBSD 作業系統,所以自己本身也多學了一些技巧,希望各位在這裡互相討論 Unix 作業系統及程式等相關問題。

發文 回覆
置頂的主題
主題工具 搜尋本主題
舊 2004-10-17, 06:51 PM   #1
dekuo
等級:0 | 上線時間:0小時 | 升級還需:5小時
會員
 
註冊日期: 2002-01-01
文章: 19
精華: 0
【教學】自動重撥 PPPoE ADSL 連線

不管是 Linux 或是 BSD 下所使用的 PPPoE 撥號程式,在遇到很多奇怪的斷線狀況似乎並不能很自動的自己重撥,所以我寫了這個 Script , 相信很多人都用的上.

引用:
星期六, 三月 19, 2005
FreeBSD 的 PPPoE ADSL 斷線自動重撥

不管是 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 wishset ifaddr 10.0.0.1/0 10.0.0.2/0hinet:set device PPPoE:rl0set authname 你的帳號@hinet.netset authkey 你的密碼set dialset loginadd default HISADDRnat enable yes
啟動 PPPoE 的方式我是建議寫在 /etc/rc.local ,加上一行:

/usr/sbin/ppp -ddial hinet

---------------------------------------------------------
以下為 Script 內容:
##############################################
#!/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 路徑有沒有變




--
我是 ㄉㄝ~ㄎㄡ~~

想要 Gmail 邀請函請寫信寄到以下帳號:
dekuo.com+gmail@gmail.com

----------------------------------
dekuo.COM
http://www.dekuo.com/
----------------------------------

此文章於 2006-12-13 05:52 PM 被 阿 土 編輯.
dekuo 目前未上線  
回覆時引用此文章
舊 2004-10-17, 08:25 PM   #2
dou0228
等級:33 | 上線時間:1257小時 | 離升級還需:35小時等級:33 | 上線時間:1257小時 | 離升級還需:35小時等級:33 | 上線時間:1257小時 | 升級還需:35小時
拉登長官
 
dou0228 的大頭照
 
註冊日期: 2002-08-26
上網方式: 2M/256K
文章: 1,137
精華: 0
實際上在 Linux 裡的 rp-pppoe 如果斷線.
他會離開 pppoed

所以如果你是用 rp-pppoed 的話.. 可以判斷 pppoed 是否在跑就可以
不過用 ping 的話, ping gateway 或 168.95.0.0/16 倒是可以

只是 ping 有些 ISP 或 IP 檔了他也不會通知你檔掉了

另外一種作法是(in Linux), 查看 /proc/net/dev 這個檔案
看看 pppX 的 Receive bytes 是否有變動

如果有變動, 代表有封包送進這個介面, 所以也可以"假設" 他是活著的


O/S: XPro SP2;Gentoo 05-r1;F-BSD 5.4/N-BSD 2.0.2
替代役第一梯次, 矯正役笨蛋
Bug !?
Red Hat 技術支援的改變引起眾怒_原文出處
echo $(echo 4jp022f@n5549i5o9or | tr 0-9a-z 0-3d-l6-9m-w4-5) | tr i .
就讓 LP 去耍, 我們好在旁邊笑
QoS 沒中文資料!?
dou0228 目前未上線  
回覆時引用此文章
舊 2004-10-17, 11:13 PM   #3
阿 土 帥哥
等級:23 | 上線時間:634小時 | 離升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時
校長兼撞鐘
 
阿 土 的大頭照
 
註冊日期: 2000-10-09
上網方式: SEEDNET 8M
文章: 11,348
精華: 0
這幾天找了不少 PPPoE in FreeBSD 的資料 (ppp / mpd)
但很少看到有人討論到斷線重連部分
dekuo 的這篇教學剛好可以拿來研究一下 , Thanks!


準備更新系統版本中!
阿 土 目前未上線  
回覆時引用此文章
舊 2004-10-18, 01:21 PM   #4
dekuo
等級:0 | 上線時間:0小時 | 升級還需:5小時
會員
 
註冊日期: 2002-01-01
文章: 19
精華: 0
引用:
最初由 阿 土 發表
這幾天找了不少 PPPoE in FreeBSD 的資料 (ppp / mpd)
但很少看到有人討論到斷線重連部分
dekuo 的這篇教學剛好可以拿來研究一下 , Thanks!
我查過 ppp 的 Man page 說明, -ddial 應該就是會一直保持連線的參數,
但是我還是發現會有斷線沒自動重撥的現象 ... 所以不管我的 script 是否多此一舉(或許有更正確的系統設定方式?) ,但是至少可以保證用了之後必定能夠自動重撥 .... 但是 ATU-R 當掉的大概就沒辦法了 ..
dekuo 目前未上線  
回覆時引用此文章
舊 2004-10-18, 02:08 PM   #5
阿 土 帥哥
等級:23 | 上線時間:634小時 | 離升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時
校長兼撞鐘
 
阿 土 的大頭照
 
註冊日期: 2000-10-09
上網方式: SEEDNET 8M
文章: 11,348
精華: 0
引用:
最初由 dekuo 發表
我查過 ppp 的 Man page 說明, -ddial 應該就是會一直保持連線的參數,
但是我還是發現會有斷線沒自動重撥的現象 ... 所以不管我的 script 是否多此一舉(或許有更正確的系統設定方式?) ,但是至少可以保證用了之後必定能夠自動重撥 .... 但是 ATU-R 當掉的大概就沒辦法了 ..
沒錯 , 這幾天測試下來 ppp 當斷線時有時並不會自動重撥
使用您這個 script 測幾天看看

我用 ppp 撥接上 ftp.nsysu.edu.tw 抓幾百 MB 的 ISO 檔
隨著抓取檔案的速度越來越快 , ppp 的 cpu usage 也持續爬升
改用 mpd 撥接後 , cpu usage 比 ppp 少了許多
不過不知為何 , 有時會發生無法撥上線的狀況 , 所以還是改回 ppp 撥接
因為以上傳為主的 SERVER , 其 ppp 的 usage 並不會太高
阿 土 目前未上線  
回覆時引用此文章
舊 2004-10-18, 04:28 PM   #6
dekuo
等級:0 | 上線時間:0小時 | 升級還需:5小時
會員
 
註冊日期: 2002-01-01
文章: 19
精華: 0
引用:
最初由 阿 土 發表
沒錯 , 這幾天測試下來 ppp 當斷線時有時並不會自動重撥
使用您這個 script 測幾天看看

我用 ppp 撥接上 ftp.nsysu.edu.tw 抓幾百 MB 的 ISO 檔
隨著抓取檔案的速度越來越快 , ppp 的 cpu usage 也持續爬升
改用 mpd 撥接後 , cpu usage 比 ppp 少了許多
不過不知為何 , 有時會發生無法撥上線的狀況 , 所以還是改回 ppp 撥接
因為以上傳為主的 SERVER , 其 ppp 的 usage 並不會太高
若是使用其它 PPP 撥號程式也可以用我吶 script ..

只要改掉這兩行就行:

$pid = get_pid("/usr/sbin/ppp -ddial $PPPoE_profile");
這行是你程式用 ps 查到的字串,可以改成你在用的 mpd

system("/usr/sbin/ppp -ddial $PPPoE_profile");
這行是您要啟動的 PPP 撥號程式指令
dekuo 目前未上線  
回覆時引用此文章
舊 2004-10-19, 12:44 AM   #7
阿 土 帥哥
等級:23 | 上線時間:634小時 | 離升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時
校長兼撞鐘
 
阿 土 的大頭照
 
註冊日期: 2000-10-09
上網方式: SEEDNET 8M
文章: 11,348
精華: 0
又斷線了 , 以 ps -aux | grep ppp 找到很多筆 ppp 的資料

引用:
root 61858 0.0 0.1 2704 1744 ?? Ss 12:32AM 0:00.10 /usr/sbin/ppp -d
root 61837 0.0 0.1 2704 1744 ?? Ss 12:31AM 0:00.11 /usr/sbin/ppp -d
root 61701 0.0 0.1 2704 1748 ?? Ss 12:27AM 0:00.17 /usr/sbin/ppp -d
root 530 0.0 0.1 2836 1836 ?? Ss 8:39AM 11:38.01 /usr/sbin/ppp -d
script 改成 "killall ppp" 直接把所有 ppp 停掉再做重撥是否會比較好?
阿 土 目前未上線  
回覆時引用此文章
舊 2004-10-19, 01:27 PM   #8
dekuo
等級:0 | 上線時間:0小時 | 升級還需:5小時
會員
 
註冊日期: 2002-01-01
文章: 19
精華: 0
引用:
最初由 阿 土 發表
又斷線了 , 以 ps -aux | grep ppp 找到很多筆 ppp 的資料



script 改成 "killall ppp" 直接把所有 ppp 停掉再做重撥是否會比較好?
因為你執行 ppp 的指令跟我不同 ...所以要改成這樣:

$pid = get_pid("/usr/sbin/ppp -d");

你會發現很多支 ppp 是因為沒砍掉又重複執行 ...
只要把餵給 get_pid 的識別字串打對,應該都找的出來
用 killall 當然很棒 ...可是在 Linux 下好像就沒這個指令了
所以我才用比較基礎的方式來比對

我找時間在改一下 Script ,然後公佈我自己用的 ppp.conf 好了 ...
這樣大家比較看的懂我的 script 怎麼用
dekuo 目前未上線  
回覆時引用此文章
舊 2004-10-19, 01:44 PM   #9
阿 土 帥哥
等級:23 | 上線時間:634小時 | 離升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時等級:23 | 上線時間:634小時 | 升級還需:38小時
校長兼撞鐘
 
阿 土 的大頭照
 
註冊日期: 2000-10-09
上網方式: SEEDNET 8M
文章: 11,348
精華: 0
引用:
最初由 dekuo 發表
因為你執行 ppp 的指令跟我不同 ...所以要改成這樣:

$pid = get_pid("/usr/sbin/ppp -d");
是我 key 錯了 , 其實也是 "ppp -ddial hiet"

不過開機後的第一個 ppp process 卻是 "/usr/sbin/ppp -quiet -ddial -nat hinet"

不過 ppp.conf 並沒有設定 nat , 也不知道怎麼會跑出來的

引用:
我的 ppp.conf

default:
set log phase tun command
enable dns

hinet:
set device PPPoE:fxp1
set mtu 1492
set mru 1454
set speed sync
enable lqr
set cd 5
set dial
set ctsrts off
set ifaddr 10.0.0.1/0 10.0.0.2/0
set login
add default HISADDR
set authname hinet-id
set authkey password
set timeout 0
set redial 3 5
set lqrperiod 5
set reconnect 5 10000
引用:
rc.conf 的設定

ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="hinet"


阿 土 目前未上線  
回覆時引用此文章
舊 2004-10-19, 03:25 PM   #10
dekuo
等級:0 | 上線時間:0小時 | 升級還需:5小時
會員
 
註冊日期: 2002-01-01
文章: 19
精華: 0
引用:
最初由 阿 土 發表
是我 key 錯了 , 其實也是 "ppp -ddial hiet"

不過開機後的第一個 ppp process 卻是 "/usr/sbin/ppp -quiet -ddial -nat hinet"

不過 ppp.conf 並沒有設定 nat , 也不知道怎麼會跑出來的
你 config 檔寫太複雜了 ...看看我的 ..
我已經改過重新 Post 了

新版自動撥號 Script

如果您有啟動 natd 也要關掉 ...用 ppp 的 NAT 就好了
dekuo 目前未上線  
回覆時引用此文章

發文 回覆



主題工具 搜尋本主題
搜尋本主題:

進階搜尋

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情圖案
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

所有時間均為台灣時間。現在的時間是 10:22 AM


 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : webmaster@pczone.com.tw

本論壇所有文章均為網友個人意見,並不代表本網站之立場