一旦你可以用上述的方法用手動方式簽入,更好的做法是建立一些指令稿來自動為你進行這些工作.
一份 chat 指令稿可以自動化簽入以及起動 PPP 的程序,因此所有你得做的(以 root 或是 ppp 群組組員的身分)只是發出單一個指令來起動你的連線.
如果你的 ISP 並不要求使用 PAP/CHAP 的話,這些就是為你準備的!
如果 ppp 套件安裝正確,你應該會有兩個範例檔案.
在 PPP 2.1.2 中是在 /usr/sbin
而在 PPP 2.2 裡是在 /etc/ppp/scripts
.這些是
在 PPP-2.1.2
ppp-on
ppp-off
而在 PPP-2.2
ppp-off
ppp-on
ppp-on-dialer
現在,如果你正在使用 PPP 2.1.2,我強烈建議你刪除這些範例檔案. 它們有潛在的問題 - 不要告訴我它們工作得很好 - 我也用了很長一段時間(而且還在這份 HOWTO 的第一版中推薦它們)!
為了 ppp 2.1.2 使用者的權益,這裡有比較好的樣板檔案,這些是從 ppp 2.2 發行套件裡拿來的. 我建議你拷貝並使用這些指令稿而不要再用舊的 PPP-2.1.2 指令稿.
ppp-on
指令稿
這是實際啟動連線的一對指令稿中的第一個.
#!/bin/sh # # Script to initiate a PPP connection. This is the first part of the # pair of scripts. This is not a secure pair of scripts as the codes # are visible with the 'ps' command. However, it is simple. # # These are the parameters. Change as needed. TELEPHONE=555-1212 # The telephone number for the connection ACCOUNT=george # The account name for logon (as in 'George Burns') PASSWORD=gracie # The password for this account (and 'Gracie Allen') LOCAL_IP=0.0.0.0 # Local IP address if known. Dynamic = 0.0.0.0 REMOTE_IP=0.0.0.0 # Remote IP address if desired. Normally 0.0.0.0 NETMASK=255.255.255.0 # The proper netmask if needed # # Export them so that they will be available to 'ppp-on-dialer' export TELEPHONE ACCOUNT PASSWORD # # This is the location of the script which dials the phone and logs # in. Please use the absolute file name as the $PATH variable is not # used on the connect option. (To do so on a 'root' account would be # a security hole so don't ask.) # DIALER_SCRIPT=/etc/ppp/ppp-on-dialer # # Initiate the connection # # exec /usr/sbin/pppd debug /dev/ttySx 38400 \ $LOCAL_IP:$REMOTE_IP \ connect $DIALER_SCRIPT
而這是 ppp-on-dialer
指令稿:-
#!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT '' \ ogin:--ogin: $ACCOUNT \ assword: $PASSWORD
在 PPP-2.2 中,ppp-off
指令稿看起來像:-
#!/bin/sh ###################################################################### # # Determine the device to be terminated. # if [ "$1" = "" ]; then DEVICE=ppp0 else DEVICE=$1 fi ###################################################################### # # If the ppp0 pid file is present then the program is running. Stop it. if [ -r /var/run/$DEVICE.pid ]; then kill -INT `cat /var/run/$DEVICE.pid` # # If the kill did not work then there is no process running for this # pid. It may also mean that the lock file will be left. You may wish # to delete the lock file at the same time. if [ ! "$?" = "0" ]; then rm -f /var/run/$DEVICE.pid echo "ERROR: Removed stale pid file" exit 1 fi # # Success. Let pppd clean up its own junk. echo "PPP link to $DEVICE terminated." exit 0 fi # # The ppp process is not running for ppp0 echo "ERROR: PPP link is not active on $DEVICE" exit 1
因為這份新的指令稿分成兩部份,我們分別編輯它們.
ppp-on
指令稿你將得編輯這個指令稿以反映你在 ISP 的使用者名稱,你在 ISP 的密碼,你 ISP 的電話號碼.
每一行像是 TELEPHONE=
實際上設定了這個變數包含在等號右邊的資訊 (當然不包括註解部份).
因此編輯每一行使它對你的 ISP 與連線是正確的.
而且,如果你(需要)在 /etc/ppp/options
檔案裡設定了 IP 號碼,刪除這行
$LOCAL_IP:$REMOTE_IP \
還有,確定變數 DIALER_SCRIPT
指向你將要使用的撥號指令稿的全部路徑名稱.
因此,如果你移動或改變這個指令稿的名稱,確定你正確地改變 ppp-on
指令稿裡的這一行.
ppp-on-dialer
指令稿這是第二個指令稿實際建立起我們的 PPP 連結.
注意: 一份 chat 指令稿一般全都放在同一行裡.倒斜線是用來讓一行可以跨過數行的實體行(便於人們閱讀)而並不是指令稿本身組成的一部份.
然而,仔細地看看它的細節部份以便讓我們了解它實際(假設的)要做什麼是非常有用的!
一份 chat 指令稿是一系列“
期待字串”
“
送出字串”
的配對.
特別是,注意到我們總是在送出某些訊息之前先期待某些訊息出現.
如果我們在沒有先接收到任何訊息的情況下要送出某些訊息的話,我們必須使用空的期待字串(藉由 “
”
指明)而在沒有送出任何訊息的情況下要期待某些訊息作法也類似!
而且,如果字串包含好幾個字(例如 NO CARRIER),你必須把字串用引號括住,這樣 chat 會把字串當作是單一個項目.
在我們樣板裡的 chat 指令行是:
exec /usr/sbin/chat -v
起動 chat ,-v
告訴 chat 將其所有的輸出/入拷貝到系統記錄裡(通常是 /var/log/messages).
一旦你覺得 chat 指令稿的運作穩定而可靠,編輯這一行把 -v
移除以便減少你系統記錄的混雜.
TIMEOUT 3
ABORT '\nBUSY\r'
如果接收到 BUSY 字串,中止執行.
ABORT '\nNO ANSWER\r'
如果接收到 NO ANSWER 字串,中止執行.
ABORT '\nRINGING\r\n\r\nRINGING\r'
如果接收到(重複的)RINGRING 字串,中止執行.這是因為某人正打電話給你!
“ \rAT
不期待數據機傳送任何訊息並且送出 AT 字串.
OK-+++\c-OK ATH0
這一個比較複雜一點,因為它使用了某些 chat 的錯誤回復功能.
它所代表的是...期待 OK ,如果沒有收到(因為數據機並不在指令模式下)那麼送出 +++ (使數據機返回指令模式的標準 Hayes 相容數據機字串)並且期待 OK;接著送出 ATH0 (數據機掛斷字串). 這讓你的指令稿可以應付你的數據機黏在線上無法斷線的情況.
TIMEOUT 30
設定指令稿其餘部份執行的逾時時限為 30 秒.如果你曾經因為逾時而經驗過 chat 指令稿被終止的問題,把它增加為 45 秒或更久.
OK ATDT$TELEPHONE
期待 OK (數據機對 ATH0 指令的回應)並且撥接到我們想要呼叫的號碼.
CONNECT ”
期待 CONNECT 字串(當遠端數據機有回應時我們的數據機送出的)並且不送出任回覆訊息.
ogin:--ogin: $ACCOUNT
再一次,這裡面我們有一些錯誤回復設定.期待簽入提示(...ogin:),但是如果我們在逾時前沒有接收到,送出一個返回字元(return)然後再次找尋簽入提示. 當接收到提示時,送出使用者名稱(存放在使用者界面的 $ACCOUNT 環境變數裡).
assword: $PASSWORD
期待密碼提示並且送出密碼(再一次,存放在使用者界面的一個環境變數裡).
這個 chat 指令稿有合理的錯誤回復功能. Chat 還有許多重要的特色,比這裡所展示還要更多.
更詳細的資訊請參閱 chat 的線上使用手冊(man 8 chat
).
雖然這份 ppp-on-dialer
指令稿對於在你簽入後會自動啟動 pppd 的伺服器來說非常的好用,然而某些伺服器需要你明白地在伺服器上啟動 PPP.
如果你需要在伺服器上下指令以啟動 PPP,你必須要編輯 ppp-on-dialer
指令稿.
在這指令稿的尾端(在 password 這行後面)加上 期待 送出 字串對 - 這是尋找你的 shell 提示符號 (特別小心對 Bourne shell 有特殊意義的字元 - 像是 $ 與 [ 或 ] 左右方括號等).
一旦 chat 找到了 shell 提示符號,chat 必須下指令以啟動你 ISP 的 PPP 伺服器.
以我的例子而言,我的 PPP 伺服器使用標準的 Linux Bash 提示符號
[hartr@kepler hartr]$
而且需要我打
ppp
以啟動伺服器上的 PPP.
在此允許一點錯誤回復是個好主意,所以在我的例子中我用
hartr--hartr ppp
這就是說,如果我在逾時前沒收到提示符號,送出 return 並且再次等待提示符號.
一旦收到提示符號,就送出 ppp
字串.
注意: 別忘了在前一行結束前加上 \ 以便讓 chat 認為這整個指令稿是在一行裡!
不幸的是,某些伺服器會產生非常多變的提示符號! 你可能必須使用 minicom 多簽入幾次以便了解什麼可以用來做為確定的“期待”字串.
如果你的 ISP 使用 PAP/CHAP 驗認,那麼你的 chat 指令稿會簡單得多. 你的 chat 指令稿所要做的全部只是撥接電話,等待接上線,然後就讓 pppd 去處理簽入事宜!
#!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # exec /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT '' \
debug
與 file option_file
選項
就像我們已經看過的,你可以對 pppd 使用 -d
選項打開偵錯訊息記錄.
'debug
' 選項和這個是一樣的.
因為我們正在使用新的指令稿建立新的連線,先放著此選項不管. (警告: 如果你的磁碟空間不大夠,記錄 pppd 的訊息可能會大量增加你的系統記錄檔大小並使你遇到麻煩 - 不過在此你必定會連線失敗並嘗試許久).
一旦你高興地認為一切工作正常,你可以除去此選項.
如果你不是從 /etc/ppp/options
或 /etc/ppp/options.ttySx
檔案中叫出 ppp 選項,
可以在 pppd 上用 file
選項指定檔案名稱 - 例如
exec /usr/sbin/pppd debug file options.myserver /dev/ttyS0 38400 \