pppctlはpppdパッケージに附属しているppp-onやppp-offなどと同様、 pppdデーモンを制御するためのbashシェルスクリプトです。 このスクリプトは、 主に他のプログラムから呼び出したり、 別のユーザインタフェース(例えばGUIのメニューなど)から呼び出して使う場合に 便利なように設計されています。 pppctlには具体的には次のような特長があります。
接続条件を設定するためのファイルがpppctl本体とは別になっているので、 複数の接続条件に対応できます。例えば、
接続条件の設定ファイルはシェルスクリプトとして記述し、 登録しておきます。 pppctlではこれらを接続設定ファイルと呼んでいます。
PPP接続中によく実行するコマンドを登録しておき、 pppctl実行時に指定することで、そのコマンドを実行することができます。 ですから、
といった場合にも便利です。 これらのコマンドもまたシェルスクリプトとして記述し、 登録しておきます。 pppctlではこれらのファイルをプラグインと呼んでいます。 プラグインファイルの中身はただのシェルスクリプトですから、 ユーザが簡単に改良や追加をすることができます。
pppctlの最新バージョンは http://www.on.rim.or.jp/~kaw/pppctl/ から入手可能です。
このパッケージはフリーソフトウェアです。複製・改変・再配布の いずれも自由に行えます。
但し、改変したものを配布する場合は、原作者が川俣吉広である ことを明記して下さい。
このパッケージの運用は全て使用者の責任において行って下さい。 このパッケージを使用して、もし不具合や何らかの損失が生じた場合、 作者はそれらについては責任を負いかねます。
pppctlはbashのスクリプトで書かれていますので、
GNU bashとpppdパッケージがインストールされている
一般的なPC-UNIX等の環境であれば動作すると思われます(確認はしていません)。
作者が開発に使用している環境は以下のとおりです。
従って、pppctlを使用するには、
が *必須条件* です。
このパッケージは以下のようなファイル構成になっています。
pppctl-0.9.4/ README.txt このファイル(プレーンテキスト) README.html このファイル(HTML) bin/ 実行ファイル格納用 pppctl pppctl本体 pponeshot pppctlの使用例1 mailflush.sh pppctlの使用例2 simplegui.sh pppctlの使用例3 etc-ppp/ pppdシステムファイル ip-up /etc/ppp/ip-up ip-down /etc/ppp/ip-down init 初期設定ファイル links/ 接続設定ファイルの格納ディレクトリ pap.sample PAP認証用の接続設定 login.sample ログイン認証手順用の接続設定 direct.sample シリアルライン直結用の接続設定 plugins/ プラグインの格納ディレクトリ up PPP接続 down PPP切断 ping pingを実行 sm senqmail -q を実行 (メールの送信) fm fetchmailを実行 (メールの受信) xm smとfmを連続実行 rc5 rc5desクライアントのバッファ更新
pppctlは一般ユーザによる使用が前提になっています。 したがって各種設定ファイルはユーザ毎に用意する必要があります。 具体的なインストール手順を以下に示します。
パッケージをホームディレクトリで展開する。
以下のようにコマンドを実行します。
cd; gzip -dc pppctl-0.9.4.tar.gz | tar xvf -
パッケージがpppctl-0.9.4というディレクトリ以下に展開されますが、 これを .pppctl という名前に変えます。
mv pppctl-0.9.4 .pppctl
~/.pppctl/bin/pppctlが実行できるように設定する。
このままでは pppctl は実行できませんので、 これを実行できるようにします。 それにはいくつか方法がありますが、次のような方法が考えられます。
個人的には自分専用のコマンドを格納するディレクトリを作り、 ここにPATHを通す方法を取したうえで、 pppctlのシンボリックリンクを張ることをお勧めします。 上の 2 と 3 を組み合わせた方法です。
pppctl中のbashの実行パスを確認する。
pppctlの第一行目には
#!/bin/bash
と書いてありますが、 これがbashが実際にある場所と合っているかどうかチェックします。 合っていない場合はこの行をbashが実際にある場所に書き換えます。
~/.pppctl/etc-ppp/ip-up と ~/.pppctl/etc-ppp/ip-down を /etc/ppp にコピーする。
ip-up と ip-down はpppd自身がそれぞれ接続時と切断時に実行するシェルスクリプトです。 pppctlが動作するためには 専用の ip-up と ip-down が必要です。 これは ~/.pppctl/etc-ppp/ ディレクトリに格納されていますので、 これを /etc/ppp ディレクトリにコピーします。
注意: この作業はroot権限で行って下さい。
初期設定ファイルを編集する。
初期設定ファイル ~/.pppctl/init はpppctlの実行時に必ず参照されます。 このファイルにはデフォルトの設定値を定義します。
# init -- global user initiialization
#
# serial devices
#
sl_dev=ttyS0 シリアルポート
sl_speed=115200 シリアルラインの通信速度
sl_modeminit=ATE1Q0 モデムの初期化コマンド
sl_dialprefix=ATDT モデムのダイアルコマンド
# Uncomment if debug pppd
#
# pp_extra_opts='debug kdebug 1' pppdデバッグ用オプション
# Uncomment if change default link file
#
# lk_id=rim デフォルトの接続設定ファイル
# default message output
# in case of -v nor -q option given
verbose=yes デフォルトの状態表示 (yes / no)
上の例ではデフォルトの接続設定ファイルを指定する変数 lk_id がコメントアウトされていますが、 lk_id を設定しないと接続名として default が使用され、 接続時に ~/.pppctl/links/default というファイルを参照します。
initに限らず、pppctlでは全ての設定ファイルはシェルスクリプトとして解釈されます。 したがって記述する内容はbashのスクリプトの文法に従わなくてはなりません。 例えば変数に値を設定する場合は、= の前後に空白を入れるとエラーになります。
○sl_modeminit=ATE1Q0
×sl_modeminit= ATE1Q0
×sl_modeminit =ATE1Q0
×sl_modeminit = ATE1Q0
接続設定ファイルを編集する。
接続設定ファイルはpppdに渡すパラメータを設定するファイルです。 このパッケージには設定例として、
pap.sample モデムを使用したPAP認証用 login.sample モデムを使用したログイン認証手順用 direct.sample シリアルライン直結のログイン認証用
の3つが入っています。 このうち自分の行いたい設定に近いファイルを default という名前でコピーし、 編集を行うと便利です。 pap.sampleを使った例を以下に示します。
#: default - sample script for PAP authentication
#: with modem dialing
# phone number モデムにダイアルさせる電話番号
sl_modemdial=${sl_dialprefix}012-345-6789
# IP addresses リモートとローカルに割り振るIPアドレス。
pp_localip=0.0.0.0 特に必要がなければ 0.0.0.0 にします。
pp_remoteip=0.0.0.0
# PAP authentication entries PAP認証のエントリ
# (in /etc/ppp/pap-secrets) /etc/ppp/pap-secretsで定義されている
pp_host=ISP-HOST エントリを指定します。
pp_user=ISP-LOGNAME
# chat command chatコマンドとチャットスクリプト
pp_chat="/usr/sbin/chat ABORT 'NO CARRIER' ABORT BUSY '' $sl_modeminit OK $sl_modemdial CONNECT"
以上で設定は終りです。 接続ができるかどうかの確認をしてみましょう。 テスト用のプラグインファイル ~/.pppctl/plugins/ping 中のホスト名の指定を 何か適当なものに変更し、コマンドラインから、
pppctl ping
と入力してみます。 PPP接続が行われ、指定したホストにpingコマンドを実行した後 自動的にPPP接続が切断されれば設定はOKです。
接続が確立されていない状態で、接続を中断したい場合は Ctrl-C を入力します。 すると、pppctlとそこから起動されたpppdの両方が停止します。
その他、メールを送信するsm、受信するfmなどがありますが、自分の環境に 合うように適宜内容を編集して下さい。
pppctlは、
pppctl -hと -h オプションをつけて実行すると、使用法の簡単な説明を表示して終了します。
Usage for pppctl 0.9.4:
pppctl [options | plug-ins]...
options are:
-d, --disable : disable connecting
-e, --enable : enable connecting
-h, --help : print this help
-i=linkID, --id=linkID : specify link ID
-l, --link : print descriptions of each link
-p, --plugin : print descriptions of each plug-in
-q, --quiet : quiet messages
-r, --reset : reset all connections
-s, --status : show current status
-t=minutes, --timeout=minutes : forced disconnect after minutes
-v, --verbose : verbose messages
オプションの意味は次の通りです。
-d, --disable : 接続を一時的に禁止する
(-iオプションとの組み合わせ可)
-e, --enable : 禁止されていた接続を有効にする
(-iオプションとの組み合わせ可)
-h, --help : このヘルプメッセージを出力する
-i=linkID, --id=linkID : 接続設定ファイルを指定する
-i=foo とすれば、接続時に
~/.pppctl/links/foo が参照される
-l, --link : 接続設定ファイルの一覧を表示する
-p, --plugin : プラグインファイルの一覧を表示する
-q, --quiet : 動作メッセージをなるべく表示しない
エラーメッセージのみ表示されます。
-r, --reset : 接続を初期状態に戻すため、以下の
動作を行う。
・全ての接続を切断する。
・/var/tmp 以下の作業ファイルを
全て削除する。
・禁止された接続があった場合、
禁止を解除する。
-s, --status : 現在の状態を表示する
(-iオプションとの組み合わせ可)
-t=minutes, --timeout=minutes : PPP接続後、指定した時間(分)が経過
したら、強制的に切断する。
-v, --verbose : 動作メッセージを表示する
ここで、(-iオプションとの組み合わせ可) と書いてあるものは、 -i=isp1 というように-iオプションで指定した接続設定のみに対してその動作が 有効になることを言っています。例えば、
pppctl -i=isp1 -dなどとすると、isp1 という設定については接続が行われなくなりますが、その他の 接続設定には影響を与えません。
例1) 一般的なコマンドラインからの入力
pppctlはシェルのコマンドラインから直接起動することができます。 実行例をいくつか示します。
PPP接続する(ppp-onスクリプトと同じ)。
すでに接続されている場合は何もしない。
PPP接続を切断する(ppp-offスクリプトと同じ)。
最初から接続されていない場合は何もしない。
PPP接続されてない状態では、まず接続を行い、 接続に成功したらプラグインsmとfmを順に実行してメールの送信と受信を行う。 プラグインの実行が終ったら、PPPを切断する。 すでにPPPが接続されている状態で実行すると、プラグインの実行のみを行い、 回線の接続/切断は行わない。
前の例と同じ、プラグインxmは内部でsmとfmを呼び出している。
接続設定ファイル ~/.pppctl/links/isp2 を参照して
接続を行い、その後プラグイン up と fm を
実行する。fm 実行後も回線は接続されたままになる。
プラグイン up が他のプラグインと併用されると、
プラグインの実行終了後も回線は接続されたままになる。
(逆に回線接続状態でdownプラグインが他のプラグインと併用されると
この例とは逆の動作をする。
つまり、down以外のプラグインを実行し、その後切断する)
PPP接続されてないなら、接続を行い、
接続に成功したらプラグイン rc5 を実行して
rc5desクライアントのバッファを更新し、
その後切断する。
-qオプションが指定されているので何かエラーが発生しない限りはメッセージの出力は
行わない。
注意
pppctlは動作の際に現在の動作状態を格納したファイルを /var/tmpディレクトリに作成します。 pppdオリジナルのppp-on や ppp-offコマンドを使用したり、 iij-pppやPPxPなどの他のPPP実装系と混用すると (例えばppp-onで接続したものをpppctlで切断するなど) うまく動作しない場合があります。ご注意下さい。
例2) シェルスクリプトの部品として使う
pppctlは上の例で上げたようにコマンドラインから直接実行することも可能ですが、 冒頭に述べたように他のプログラムから起動した場合も便利に使えるように設計されています。 次のシェルスクリプトはその簡単な例です。
#!/bin/sh
if pppctl -q up
$*
pppctl -q down
fi
このスクリプトを例えば pponeshot という名前で作成し、実行属性を付加したあと、
pponeshot finger foo@bar.or.jpなどと実行するとPPP接続成功後、finger コマンドを実行し、終了後PPPを切断します。
この使用例からわかるように、pppctlは実行結果による返す戻り値が異なるので それにより呼び出し側の動作を変えることができます。 現バージョンでの戻り値の意味は以下の通りです
例3) crontabに入れて使う
pppctlはcronによる自動運転にも使用可能です。 crontab設定例です。
30 0 * * * $HOME/bin/pppctl -q xm
30 6 * * * $HOME/bin/pppctl -q xm rc5
30 12 * * * $HOME/bin/pppctl -q xm
30 15 * * * $HOME/bin/pppctl -q xm
30 18 * * * $HOME/bin/pppctl -q xm
30 21 * * * $HOME/bin/pppctl -q xm
この例では、毎日0, 6, 12, 15, 18, 21時30分にメールの送受信を 行っています。そして6時30分の接続ではrc5クライアントのバッファの 更新も行っています。cronから起動されたプログラムはバックグラウンドで走行し、 標準出力や標準エラー出力に何か出力された場合はその内容を起動したユーザに メールで送るような仕組みになっています。 上の例では -q オプションをつけて起動することで、 pppctlがエラーを発生したとき以外は、ユーザにメールが送られないようにしています。
注) cronの実装系によっては、先の設定は次のように書くこともできるようです。
30 0,12,15,18,21 * * * $HOME/bin/pppctl -q xm
30 6 * * * $HOME/bin/pppctl -q xm rc5
例4) ウィンドウマネージャに組み込んで使う
pppctlのもう一つの使用例として、Xのウィンドウマネージャのメニューに 組み込んで簡単に起動できるようにする例を示します。 以下のものは、ウィンドウマネージャfvwmの設定ファイル .fvwmrc 中の メニュー記述例です。
PopUp "PPP-menu"
Title "PPP connection"
Nop ""
Exec "Connect" exec ~/bin/pppctl -q up &
Exec "Disconnect" exec ~/bin/pppctl -q down &
Nop ""
Exec "PPP monitor" exec kterm -T "PPP monitor" -e /usr/sbin/pppstats -i 10 &
Nop ""
Exec "Exchange mails" exec kterm -iconic -T "Exchanging news and mails..." -e /bin/sh -c "~/bin/pppctl xm ; sleep 15" &
EndPopup
この例では、"Connect", "Disconnect" の項目では cron の設定のときと同じように、 pppctlのメッセージを抑制してバックグラウンドで実行しています。 この場合、画面には何も表示されません。 「接続の経過を表示したい」というのであれば、"Exchange mails"の項目のように、 ターミナルエミュレータ(この例ではkterm)の中で実行するようにします。 また、この例ではktermは最初-iconicオプションでアイコン化された状態になるようにしてあり、 pppctlの終了15秒後にkterm自体も終了するように設定してあります。
例5) サンプルスクリプト
ディレクトリ.pppctl/binにはpppctlスクリプト本体のほかにpppctlを利用した 次のようなシェルスクリプトのサンプルがあります。pponeshot ... 例2で説明したものです。 mailflush.sh ... senqmailのキューディレクトリにメールが溜っていたら メールの交換をするスクリプトです。 cronから起動するとよいかも知れません。 simplegui.sh ... xmessageを使用したシンプルなGUIインターフェースの 例です。
以上で説明したように、pppctlは動作時に初期化ファイル.pppctl/init、 接続設定ファイル.pppctl/links/*、 プラグインファイル.pppctl/plugins/* を参照します。 これらのファイルはすべてシェルスクリプト(の断片)であり、 pppctl内部で "." コマンドを用いて、pppctlと同じ環境で実行されます。 したがって前に述べたようにこれらのファイルの記述方法は シェルスクリプトの文法に従い、また、 pppctlで使用されている変数はすべてこれらの設定ファイルからアクセスできます。 これらの変数はすべて通常のシェル変数であり、 環境変数としては使用していません。 以下にpppctlで使用されている変数について解説します。
変数一覧
以下の変数はpppctlメインスクリプト内部で、設定/参照される変数群です。
変数verbose
とpppd_path
が初期化ファイル
.pppctl/initで設定できる以外は、ユーザの設定ファイル
(.pppctl/init, 接続設定ファイル, プラグインファイル)
では参照するのみにとどめておいたほうが安全です。
pid_myself
pid_pppd
piddir
/var/run
です。plugin
plugins
pppd_path
chat_path
prog
pppctl
です。statdir
statfile
userdir
$HOME/.pppctl
です。verbose
yes
の場合は詳しいメッセージ表示を
行い、それ以外はエラー時以外メッセージを出力しません。
この変数はコマンドラインの-v
オプションで
yes
に、-q
オプションでno
に
設定されます。
コマンドラインオプションで設定しなかった場合のデフォルト値は、
初期設定ファイル.pppctl/initで設定しておくことができます。version
以下の変数は接続(link)状態に関する変数群です。
変数lk_id
, lk_timeout
が初期化ファイル
.pppctl/initで設定できる以外は、
ユーザの設定ファイルでは参照するのみにとどめておいたほうが安全です。
lk_disconnect
yes
の場合、切断を行います。
それ以外の値では切断を行わず、そのまま終了します。lk_elapse
lk_id
default
ですが、
.pppctl/initで上書きできます。lk_perm
-e
オプションが指定されたとき値enabled
、
-d
オプションが指定されたとき値disabled
を取ります。lk_stat
disconnected : 接続動作は許可されていますが、接続していません。 disabled : 接続動作が禁止されています。 connecting : 接続動作中です。 connected : 接続は完了しています。
lk_timeout
以下の変数は接続に関係するシリアルラインとネットワークプロトコルに
関係した値を保持します。
sl_*
はシリアルラインに関する設定、
pp_*
はPPPあるいはIPプロトコル関係の設定値を保持します。
これらの値は初期化ファイルに設定することで、
pppctl動作時のデフォルト値になります。
また、接続設定ファイル中で値を代入すると、
そのデフォルト値に上書きされ、指定した接続でのみの設定になります。
これらの値は最終的にはpppdに引数として渡されます。
sl_dev
sl_modemdial
sl_modeminit
sl_speed
pp_auth
pp_chat
pp_extra_opts
pp_host
pp_ippair
$pp_localip:$pp_remoteip
のアドレスのペアが自動的に
設定されます。ユーザが指定する必要はありません。pp_localip
0.0.0.0
を
指定します。pp_login
pp_passwd
pp_remoteip
0.0.0.0
を
指定します。pp_user
pp_host
エントリにこのアカウントが記述されている
必要があります。以下はPPP接続確立後の状態が格納された変数群です。
接続の設定に使用するpp_*
やsl_*
の
変数群と同じ意味のものがありますが、
st_*
に格納されている情報は接続後にpppdが出力した
値です。
プラグイン内で値を参照する場合はpp_*
やsl_*
よりも
こちらの値を使用したほうが確実です。
また、これらの変数はプラグイン内では読み出し専用で使用して下さい。
st_dev
st_id
st_iface
st_localip
st_remoteip
st_speed
定義済み関数
pppctlではメッセージ出力用に以下の3つの関数が 定義されています。 これらの関数を使用してメッセージの出力を制御できます。
echov
verbose
の値がyes
に限り、
出力を行います。echonv
echov
と同じですが、改行を行いません。echoe
verbose
の値には影響されません。-l, -pオプション用コメント
接続設定ファイル、プラグインファイルはシェルスクリプトの
一部分として実行されるので、文字#以降はコメントとして解釈されるのですが、
接続設定ファイルなら-l
オプション、
プラグインファイルなら-p
オプションを指定して実行した場合、
コメントのうち文字#:で始まるものが表示されるようになっています。
以上でpppctlに関する説明を終ります。このスクリプトは、ppp-onや
ppp-offを私が接続しているプロバイダRIMNETで使うのに便利なように改良して
いったpprimというものが原型になっています。
このスクリプトは私がRIMNETに接続するための専用スクリプトでしたので、
メイルの送受信等、今のpppctlにある機能を一部分サポートしていて
それなりに便利に使えたのですが、接続条件が変わったり、
あるいは接続時に実行するコマンド等を変更したい場合のスクリプトの書き換えが大変でした。
というわけで、そういった運用の管理を容易にするためにあらたに作り直したのが
このpppctlです。
とはいえ、まだまだ改良すべき点が沢山あると思いますし、
多くのプロバイダに対応した接続設定ファイルや、
便利なプラグインなども望まれるところです。
これらを作成された方はお気軽に
作者までお知らせ下さい。
このパッケージはiij-pppやPPxPなどの立派なPPP実装系とは比べるべくもありませんが、
ごく一般的なpppd+シェルスクリプトというシンプルな構成でもここまでできる
という参考例になれば幸いです。
最後に、pppdを開発した Drew Perkins 氏らはもちろんのこと、
この pppctl で使用しているフリーなソフトウェアを作成された
全ての人々に感謝します。
また、αテストからつき合ってくれた小林明さん、ありがとうございました。