chat を使った接続用のスクリプトを作れば、chat がログインして PPP を起動 するまで自動的に行うので、必要な作業は(ルート、あるいは ppp グループの メンバーになって)接続のためのコマンドを一つ入力するだけになります。
接続先の ISP が PAP/CHAP 認証を必要としない時、以下のスクリプトが使え るでしょう。
ppp パッケージが正しくインストールされていれば 2 つのファイルがあらか
じめサンプルとして用意されているはずです。PPP 2.1.2 の場合、そのファイ
ルは /usr/sbin
に、PPP 2.2 の場合は /etc/ppp/sciripts
ディレクトリに入っています。それらのファイルは
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 接続を開始するための 2 本のスクリプトのうち前半のものです。
#!/bin/sh # # PPP 接続を開始するためのスクリプト。2 つのスクリプトのうちの 1 つめ。 # このコードは 'ps' コマンドで表示されてしまうのであまり安全ではないが、 # 簡単。 # # これらのパラメータは実際の値に変更すること TELEPHONE=555-1212 # 接続のための電話番号 ACCOUNT=george # ログイン・アカウント('George Burns'の例) PASSWORD=gracie # 上記アカウントのパスワード('Gracie Allen') LOCAL_IP=0.0.0.0 # ローカルの IP 番号。動的割りあての場合は 0.0.0.0 REMOTE_IP=0.0.0.0 # 接続先の IP 番号。普通 0.0.0.0。 NETMASK=255.255.255.0 # 必要ならばネットマスクの指定 # # ppp-on-dialer から使えるように変数を export export TELEPHONE ACCOUNT PASSWORD # # 電話をかけてログイン処理をするスクリプトの位置。$PATH 変数は connect # オプションでは使われないので絶対パスを指定すること(ルート権限でそうす # るとセキュリティホールになるので、この件については質問しないこと) # DIALER_SCRIPT=/etc/ppp/ppp-on-dialer # # 接続の開始 # exec /usr/sbin/pppd debug /dev/ttySx 38400 \ $LOCAL_IP:$REMOTE_IP \ connect $DIALER_SCRIPT
ppp-on-dialer スクリプトはこのようになります。
#!/bin/sh # # ppp-on スクリプトの後半部。実際の接続プロトコルを送る部分 # 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
新しいスクリプトは 2 つに分かれているので、順に修正してみましょう。
スクリプトを修正して、ISP から貰ったユーザ名とパスワードを登録します。 ISP の電話番号も忘れずに変更してください。
TELEPHONE=
以下の各行は実際にはシェル変数を '=' の右側の値に
設定しているので(もちろんコメントは含みませんが)、各行を修正して、実際
の ISP のものを設定してください。
また、IP 番号の設定が必要な場合、/etc/ppp/options
ファイルに
設定して
$LOCAL_IP:$REMOTE_IP \
同時に DIALER_SCRIPT シェル変数が実際にダイアルするためのスクリプトの
絶対パスを指定していることを確認してください。もしダイアルのためのスク
リプトを移動させたり名前を変えた場合はppp-on
スクリプトを修正
することもお忘れなく。
ppp-on
スクリプトを正しく設定し、接続先の PPP サーバがユーザ
名/パスワード形式の認証をしている場合、ppp-on-dialer
スクリプ
トを変更する必要はありません。
起動時に /etc/rc.serial でシリアルプートの設定は終えているかも知れませ んが、ppp-on スクリプトの中で明示的にシリアルポートを設定するのもいい アイデアです。そうしておけば、モデムを(シリアルポートの設定をリセット するかも知れない)他のプログラムで安心して使うこともできます。
そのためには実際に pppd を開始する行の直前に以下の一行を加えます。
/bin/setserial /dev/cuaX spd_vhi
spd_vhi オプションを設定しておけば、38,400 ボーで使おうとした時に、実 際には 115,200 ボーで接続することになります。28.8k(以上の)高速モデムの 場合、このように設定しておくのがいいでしょう。しかしながら、多くの 14,400 ボーのモデムはコンピュータとデータをやりとりするシリアル回線を このようなスピードでは処理できないようです。
モデムのマニュアルをチェックして、モデムのシリアル回線の最高速が 38,400 の場合、以下のように設定します。
/bin/setserial /dev/cuaX spd_normal
ppp-on-dialer スクリプトは、ログインすれば pppd を自動的に起動するサー バで有効ですが、ログインしてから明示的に PPP を起動しなければならない サーバもあります。
サーバの PPP を起動するのに何らかのコマンドが必要な場合、ppp-on-dialer スクリプトを修正する必要があります。
スクリプトの最後(パスワードの行より後)に、サーバの PPP を起動するため に 必要な文字列 PPP起動コマンド の対を追加してください。PPP 起動コマンドを実行する際の文字列はログインプロンプトにします(Bourne シェ ルで特別な意味を持つ文字 - 例えば $や [ ] に注意してください)
こうしておけば、chat がシェルのプロンプトを受けとれば、ISP の PPP を起 動するためのコマンドを実行します。
私の場合、PPP サーバは標準的な Bash のプロンプト
[hartr@kepler hartr]$
を送ってくるので、この文字列を受ければ
ppp
と入力して、サーバの PPP を起動します。
少々文字がバケても正しく認識できるようにしておいた方がいいので、私の場 合、以下のような<文字列 送信コマンド>の組み合わせを選びました。
hartr--hartr ppp
この例では一定の時間内にプロンプトを受けとれなかった場合、キャリッジリ ターンを送って、再度プロンプトを待ちます。
プロンプトを受けとれば、'ppp' という文字列を送ります。
注意:付け加えた行の前の行の行末に \ を付けて chat スクリプト全体が一 行とみなされるようにしておくことを忘れないように。
不幸なことに、接続のたびごとに異なるプロンプトを返してくるサーバもいく つかあります。そのような場合、minicom などを使って何度かサーバにログイ ンして、どのような文字列がプロンプトに使われ、そのうちのどの部分が一定 で PPP を起動するための文字列に利用できるかを調べておく必要があります。
これは ppp 接続を開始するためのスクリプトの後半部です。
注意:chat スクリプトは通常一行です。行末についているバックスラッシュ (\)は(人間に見やすいように)複数行に分かれている行を一行に見せるた めに使われており、スクリプトの一部ではありません。
このコマンドを詳細に検討すれば実際に何が行われているか(行われるはずか) を理解できるはずです。
chat のスクリプトは "受けとった文字列 送信する文字列"の組 み合わせを連ねたものです。すなわち、何か文字列を送信する前には何かの文 字列を受けとらなければなりません。
文字列を受けとらなくても、こちらから何かを送信するためには、空の文字列
("
"
)を受けとる文字列に指定する必要があり
ます。同様に、何か文字列を受けとってもこちらから送信しない場合は送信す
る文字列に空の文字列を指定します。また、文字列が複数の語の場合(例えば
NO CARRIER)、文字列をクオートして一つの文字列と見なされるようにしなけ
ればなりません。
今回の例での chat スクリプトは :-
exec chat -v
/var/log/messages
)に書きこみま
す。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
この chat スクリプトにはそれなりのエラー復旧機能が組みこまれていますが、
chat にはここで説明した以上にもいろいろな機能がありますので、詳細につ
いてはマニュアルを御覧ください(man 8 chat
)。
接続先の ISP が PAP/CHAP 認証を使う場合、chat スクリプトはずっと簡単に なります。その場合、chat は電話をかけてつながるまで待つだけで、その後 の login 処理は pppd にまかせます。
#!/bin/sh # # ppp-on スクリプトの後半部。 exec 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 ''
すでに見たように、pppd に -d オプションを付ければデバッグ情報が出力さ れるようになります。'debug' というオプションは -d と同じです。
新しいスクリプトで接続のテストをするのですから、今のところ debug オプ ションは付けたままにしておきましょう。(注意:pppd がやりとりする login 情報はあっというまに syslog ファイルを巨大にするので、ディスクの空き領 域が厳しい場合はトラブルを起こすかも知れません。もっとも、そうなるため には接続に失敗してしばらくの間あれこれ pppd をこねくり回す必要があるで しょうが。)
すべてがきちんと動いていることが確認できたらデバッグオプションを取りの ぞきましょう。
ppp のオプションファイルを /etc/ppp/options
や
/etc/ppp/options.ttySx
以外に置いている場合、pppd の -f オプ
ションでファイル名を指定します。
exec /usr/sbin/pppd debug -f options.myserver /dev/ttySx 38400 \