chatのヘルプ・マニュアル
日本語 英語
chat --help
man chat
CHAT(8) CHAT(8)
名称
chat - モデム接続の確立を自動化するスクリプト言語
書式
chat [ options ] script
解説
chat プログラムはコンピュータとモデムの間のメッセージ交換を制御します。
このコマンドの主な目的は、Point-to-Point Protocol デーモン (pppd) と リ
モートの pppd プロセスの間の接続を確立することです。
オプション
-f
チ ャットスクリプトを chat file から読み込みます。このオプション
と script パラメータとは、互いに排他の関係にあります。 chat コマ
ンドを実行するユーザは、このファイルのリードアクセス権を持ってい
なければなりません。このファイルの中では、文字列の区切りとしてス
ペースとタブを使うことができます。
-t
文字列の受信待ちのタイムアウトを指定します。もし、タイムリミット
までに指定された文字列を受信できなかった場合には、応答文字列の送
信をおこないません。この時、かわりの応答文字列が指定されていれば
それが送信され、指定されていなければ スクリプトの実行が失敗し ま
す。スクリプトの実行が失敗すると、chat プログラムは 0 以外のエラ
ーコードを返して終了します。
-r
レポート文字列を出力するファイルを指定します。キーワード REPORT
を用いると、結果の文字列がこのファイルに出力されます。このオプシ
ョンを指定せずに REPORT キーワードを使用すると、レポート文字列は
stderr に出力されます。
-e エコーオプションを有効にして開始します。 chat スクリプトの特定の
場所において ECHO キーワードにてエコーの有効および無効を切り替え
ることができます。エコーが有効にされると、モデムからの出力は全て
stderr へエコーされます。
-v chat スクリプトを冗長モードで実行します。これを指定すると 、chat
プログラムは、チャットスクリプトの実行状態、モデムから受信した全
てのテキスト、モデムに送った全てのテキストのログをとります。デフ
ォルトでは syslogd(8) を介して取得します。ログの方法は -S および
-s のフラグで変更できます。冗長トレースのログとりは local2 フ ァ
シ リ ティのレベル info でおこなわれ、エラーについてはレベル err
が使われます。
-V chat スクリプトを標準エラー出力冗長モードにて実行するように要 求
します。 chat プログラムは、モデムから受信する全てのテキストおよ
びモデムへ送信する全てのテキストを標準エラー出力デバイスへログし
ます。 chat もしくは pppd プログラムを動作させている場所では、こ
のデバイスは通常ローカルのコンソールです。
-s 標準エラー出力を使用します。’-v’ による全ログメッセージおよび 全
エラーメッセージを標準エラー出力へ送られます。
-S syslog(3) を使用しません。デフォルトではエラーメッセージは sys-
log(3) へ送られます。-S を使用すると ’-v’ によるログおよびエラー
メッセージは syslog(3) へは送られなくなります。
-T
送信文字列において \T 置換メタ文字を置き換える任意の文字列を渡し
ます。通常は電話番号です。
-U
送信文字列において \U 置換メタ文字を置き換える第 2 文字列を渡 し
ま す。通常は電話番号です。 2 つの番号を要する ISDN ターミナルア
ダプタでタイアルする場合に有用です。
script -f オプションのファイルでスクリプトが指定されていなければ、 chat
プログラムに対するパラメータ文字列がスクリプトとして読み込まれま
す。
チャットスクリプト
chat スクリプトには通信の手順を定義します。
スクリプトは一つまたはそれ以上の「受信待ち-送信」文字列の組からなり、そ
れぞれは空白で区切られています。オプションとして「副受信待ち-副送信」文
字列の組を追加することもでき、その場合には以下の例のようにダッシュで 区
切ります:
ogin:-BREAK-ogin: ppp ssword: hello2u2
こ れにより、chat プログラムは文字列 "ogin:" の受信待ちをおこないます。
もしもタイムアウトする前にログインプロンプトを受信できなければ、リモ ー
トホストにブレーク信号を送信し、それから文字列 "ogin:" を受信待ちします
。もしも最初の "ogin:" が受信できていれば、ブレーク信号は送信されません
。
一 旦ログインプロンプトを受信すると、chat プログラムは文字列 ppp を送信
して、プロンプト "ssword:" の受信を待ちます。 パスワードプロンプトを 受
信すると、chat プログラムはパスワード hello2u2 を送信します。
応 答文字列に続いて、通常はキャリッジリターン文字が送られます。「受信待
ち」文字列中では、\r 文字シーケンスで明示的に指定しないかぎり、キャリッ
ジリターンは文字列に含まれません。
目 的の文字列を識別するのに必要な部分だけを受信待ち文字列に指定するよう
にするべきです。なぜなら、受信待ち文字列は通常ディスクファイルに記録 さ
れ るため、動的に変化する情報を含むことができないからです。一般には、時
刻を表す文字列やネットワーク ID 文字列その他の変化するデータの塊を受 信
待ちさせることはできません。
通 信の初期段階では、文字が化けて受信される場合があります。この場合にも
正しく認識ができるように、文字列 "login:" ではなく "ogin:" を待つように
します。仮に最初の "l" という文字が化けて受信されたとしますと、リモート
システムが "login:" を送信したとしても、その文字列は認識されないこと に
な り ま す 。 こ のため、スクリプトでは "login:" ではなく "ogin:" を、
"password:" ではなく "ssword:" を待つようにします。
非常に単純なスクリプトは、以下のようになるでしょう:
ogin: ppp ssword: hello2u2
言いかえると、....ogin: を受信待ちして ppp を送信し、...ssword: を受 信
待ちして hello2u2 を送信するということになります。
現 実問題としては、単純なスクリプトが使われることはほとんどないでしょう
。少なくとも、最初の受信待ち文字列が受信できなかった場合に、副受信待 ち
文 字列を実行するようにするべきでしょう。たとえば、以下のスクリプトを考
えてみます:
ogin:--ogin: ppp ssword: hello2u2
これは以前に使った単純なものよりも良いスクリプトでしょう。以前のもの と
同 様に login: プロンプトを待ちますが、もし受信できなかった場合にはリタ
ーンを一つ送ってから再び login: が送られてくるのを待ちます。最初のロ グ
イ ンプロンプトがラインノイズによって化けたとしても、空行が送られること
で、通常はもう一度ログインプロンプトが送信されます。
コメント
コメントを chat スクリプト中に埋め込むことが可能です。コメントは # ( ハ
ッ シュ) 文字をカラム 1 から開始する行です。このようなコメント行は chat
プログラムは単に無視します。「受信待ち」文字列の最初の文字が ‘#’ 文字の
場合、「受信待ち」文字列をクォートする必要があります。文字 # (ハッシュ)
から始まるプロンプトを待ちたい場合には、以下のように書かねばならない で
しょう:
# Now wait for the prompt and send logout string
´# ’ logout
中断文字列
多 くのモデムはダイヤルの結果を文字列としてレポートします。これらの文字
列は CONNECTED だったり、NO CARRIER や BUSY だったりするでしょう。モ デ
ム が相手との接続に失敗した場合には、スクリプトを終了させたいと思うこと
がよくあるでしょう。問題は、どの文字列を次に受信するかということを、 ス
ク リプトが正確に知ることはできないということです。ある時には BUSY を受
信するかもしれませんが、次には NO CARRIER を受信するかもしれません。
これらの「中断」文字列は、ABORT シーケンスによりスクリプト中に指定す る
ことができます。それは、以下の例のようにスクリプトに指定します:
ABORT BUSY ABORT ’NO CARRIER’ ’’ ATZ OK ATDT5551212 CONNECT
このシーケンスは受信待ちをおこないません。それから文字列 ATZ を送信しま
す。受信待ち文字列は OK です。 OK を受信すると、電話をかけるために文 字
列 ATDT5551212 を送信します。受信待ち文字列は CONNECT です。文字列 CON-
NECT を受信すると、スクリプトの残りが実行されます。一方、モデムが話中を
検 出すると、文字列 BUSY が送られて中断文字列への一致が起こります。この
一致が起きたことにより、スクリプトは失敗します。もしも文字列 NO CARRIER
を 受信すると、それは同じ理由で中断されます。どちらの文字列が受信されて
も、chat スクリプトは終了します。
CLR_ABORT 文字列
このシーケンスは以前に設定した ABORT 文字列をクリアします。 ABORT 文 字
列 は規定サイズ(コンパイル時に決定)の配列に保持されます; CLR_ABORT はク
リアされたエントリの領域を再要求し、新たな文字列をそこに格納できるよ う
にします。
SAY 文字列
SAY ディレクティブにて、 script が標準エラー出力を介してユーザ端末ヘ文
字列を送ることができます。 chat が pppd から起動される場合、 pppd は デ
ー モ ン と し て実行され(制御端末から切り離され)、標準エラー出力は通常
/etc/ppp/connect-errors へとリダイレクトされます。
SAY 文字列は、シングルクォートもしくはダブルクォートにて括る必要があ り
ま す。出力中にキャリッジリターンおよびラインフィードが必要な場合、明示
的に文字列中に含める必要があります。
SAY 文字列を使用して script の進捗状況メッセージを表示することで、’ECHO
OFF’ しつつもユーザになにが起っているのか示すことが可能です。例を示しま
す:
ABORT BUSY
ECHO OFF
SAY "Dialling your ISP...\n"
´’ ATDT5551212
TIMEOUT 120
SAY "Waiting up to 2 minutes for connection ... "
CONNECT ’’
SAY "Connected, now logging in ...\n"
ogin: account
ssword: pass
$ SAY "Logged in OK ...\n" etc ...
このシーケンスは SAY 文字列のみユーザに示し、script の詳細は隠します 。
例えば、上記 script を実行した場合、ユーザが見るのは以下です:
Dialling your ISP...
Waiting up to 2 minutes for connection ... Connected, now log-
ging in ...
Logged in OK ...
レポート文字列
レポート 文字列は ABORT 文字列に似ています。違うのは、その文字列自身 と
キ ャリッジリターン等の次の制御文字までの全ての文字がレポートファイルに
書かれるということです。
レポート文字列はモデムのコネクト文字列の転送レートと chat ユーザへの リ
タ ーン値を切りわけるために使えます。レポート文字列ロジックの分析は、受
信待ち文字列の検索などの他の文字列処理と同時におこなわれます。レポー ト
文 字列と中断文字列に同じ文字列を使用することも可能ですが、おそらくあま
り使い道がないでしょう。
レポート文字列はプログラムの終了コードに影響を及ぼしません。
これらの「レポート」文字列は、REPORT シーケンスによりスクリプト中に指定
することができます。それは、以下の例のようにスクリプトに指定します:
REPORT CONNECT ABORT BUSY ’’ ATDT5551212 CONNECT ’’ ogin:
account
このシーケンスは受信待ちをおこなわず、文字列 ATDT5551212 を送信して電話
を かけます。受信待ち文字列は CONNECT です。文字列 CONNECT を受信すると
、スクリプトの残りが実行されます。さらに、文字列 "CONNECT" と、それに続
く接続レートなどの任意の文字がレポートファイルに記録されます。
CLR_REPORT 文字列
こ のシーケンスを使用して、以前に設定した REPORT 文字列をクリアできます
。 REPORT 文字列は規定サイズ(コンパイル時に決定)の配列に保持され ま す;
CLR_REPORT はクリアされたエントリの領域を再要求し、新たな文字列をそこに
格納できるようにします。
エコー
エコーオプションはモデムからの出力を stderr へエコーするか否かを制御 し
ます。このオプションを -e オプションにて設定することができますし、 ECHO
キーワードにて制御することもできます。「受信待ち-送信」文字列の組 ECHO
ON はエコーを有効にし、 ECHO OFF は無効にします。このキーワードを使用し
てどの会話を見せるかを選択可能です。例えば以下の script では:
ABORT ’BUSY’
ABORT ’NO CARRIER’
’’ ATZ
OK\r\n ATD1234567
\r\n \c
ECHO ON
CONNECT \c
ogin: account
モデム設定結果およびダイヤル結果は見せませんが、 CONNECT ( も し く は
BUSY) メッセージ後は全てをエコーします。
回線切断
HANGUP オプションはモデムの回線切断をエラーと扱うか否かを制御します。こ
のオプションは、システムにダイヤル後に回線切断しコールバックする script
中で有効です。 HANGUP オプションは ON もしくは OFF にできます。
HANGUP を OFF に設定しモデムを回線切断 (つまりコールバックシステムへの
最初のログイン)すると、chat は script の実行を続けます (つまり呼び出 し
と 二 度 目 の ロ グインプロンプトを待ちます)。呼び出しにて接続後すぐに
、HANGUP ON ディレクティブを使用して通常の回線切断シグナルの動作を戻 す
必要があります。 (簡単な) script 例を示します:
ABORT ’BUSY’
OK\r\n ATD1234567
\r\n \c
CONNECT \c
´Callback login:’ call_back_ID
HANGUP OFF
ABORT "Bad Login"
´Callback Password:’ Call_back_password
TIMEOUT 120
CONNECT \c
HANGUP ON
ABORT "NO CARRIER"
ogin:--BREAK--ogin: real_account
etc ...
タイムアウト
タ イムアウトの初期値は 45 秒です。これは -t パラメータにより変更するこ
とができます。
次に受信待ちする文字列のタイムアウト値を変更するには、以下のようにし ま
す:
ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5
assword: hello2u2
これは login: プロンプトを受信待ちする際のタイムアウトを 10 秒に変更 し
ます。さらに password プロンプトを受信待ちする際にはタイムアウトを 5 秒
に変更します。
一旦タイムアウト値が変更されると、次に変更されるまではそのままになり ま
す。
EOT の送信
チ ャットプログラムは特殊な応答文字列 EOT により、リモート側へ EOT 文字
を送信します。通常、これはファイル終了を表す文字です。 EOT に続けてリタ
ーン文字が送られることはありません。 ^D シーケンスを使って EOT を送信文
字列に埋め込むことができます。
ブレークの生成
特殊な応答文字列 BREAK により、ブレーク信号が送られます。ブレークは送信
側 では特殊な信号として扱われます。受信側では通常、転送レートの変更要求
として処理されます。これにより、正常に login プロンプトを受信できるまで
ブ レーク信号を送ることで、リモート側がサポートしている転送レートを順次
切り替えさせることができます。 \K シーケンスを使ってブレーク信号を送 信
文字列に埋め込むことができます。
エスケープシーケンス
受 信待ち文字列と応答文字列には、エスケープシーケンスを指定することがで
きます。応答文字列では、全てのエスケープシーケンスが使えます。受信待 ち
文 字列では、ほとんどのエスケープシーケンスが使えます。受信待ち文字列で
は使えないエスケープシーケンスについては、説明文中にそのことが書かれ て
います。
’’ 空文字列を受信待ちしたり、送信したりします。もし、空文字列を送信
しようとすると、それはリターン文字を送ることになります。このシー
ケンスはアポストロフィ文字またはクォート文字のペアのどちらでもか
まいません。
\b バックスペース文字を表します。
\c 応答文字列の末尾の改行を抑制します。これは末尾に改行文字のつかな
い文字列を送る唯一の方法です。これは送信文字列の最後に置かれなけ
ればいけません。たとえば、文字列 hello\c は単に h, e, l, l, o と
いう文字だけを送ります。 (受信待ち文字列では使えません)
\d 1 秒のディレイです。プログラムは 1 秒のディレイのために sleep(1)
を使います。 (受信待ち文字列では使えません)
\K ブレーク信号を挿入します。 (受信待ち文字列では使えません)
\n 改行文字を送信します。
\N 空 (null) 文字を送信します。\0 でも同じシーケンスを表すことが で
きます。 (受信待ち文字列では使えません)
\p 1 秒以下のポーズです。ディレイ時間は 1/10 秒です。 (受信待ち文字
列では使えません)
\q syslogd(8) への文字列出力を抑止します。かわりに文字列 ?????? が
ログに出力されます。 (受信待ち文字列では使えません)
\r キャリッジリターン文字を送信または受信待ちします。
\s 文字列中のスペース文字を表します。これはスペースを含む文字列をク
ォートしたくない場合に使います。シーケンス ’HI TIM’ と HI\sTIM
は等価です。
\t タブ文字を送信または受信待ちします。
\\ バックスラッシュ文字を送信または受信待ちします。
\ddd 8 進数 (ddd) を一つの ASCII 文字に変換し、その文字を送信します。
(受信待ち文字列では使えない文字がいくつかあります)
^C C で表現される制御文字に置きかえられます。例えば、文字 DC1 (17)
は ^Q で表されます。 (受信待ち文字列では使えない文字がいくつかあ
ります)
終了コード
chat プログラムは以下の終了コードを返します。
0 プログラムは正常終了しました。これは、スクリプトがエラーを起こさ
ずに実行されて、正常に終了したことを示します。
1 一つまたはそれ以上のパラメータが不正であるか、受信待ち文字列が内
部バッファよりも大きすぎます。これはプログラムが正しく実行されな
かったことを示します。
2 プログラムの実行中にエラーが発生しました。これは、何らかの理由で
リードまたはライトの操作が失敗したか、chat が SIGINT のような シ
グナルを受信したためでしょう。
3 「-副送信」文字列のない受信待ち文字列があり、タイムアウトイベン
トが発生しました。これは、スクリプトが正しくプログラムされていな
いか、予期しないイベントが発生して受信待ち文字列を見つけられなか
ったためでしょう。
4 ABORT 条件としてマークされた 1 番目の文字列を検出しました。
5 ABORT 条件としてマークされた 2 番目の文字列を検出しました。
6 ABORT 条件としてマークされた 3 番目の文字列を検出しました。
7 ABORT 条件としてマークされた 4 番目の文字列を検出しました。
... その他の終了コードも、ABORT 条件としてマークされた文字列を検出し
たことを示します。
終 了コードを使うと、どのイベントによりスクリプトが終了したのかを判断す
ることができます。つまり、"NO DIAL TONE" を受信したのか "BUSY" を受信し
た のかを識別することができるということです。最初のイベント (BUSY) なら
ばリトライする価値がありますが、二つ目のイベント (NO DIAL TONE) だと 、
おそらくリトライしてもそれがうまくいく可能性は低いでしょう。
関連項目
UUCP のドキュメントからも、chat スクリプトに関する追加情報が得られるで
しょう。 chat スクリプトは uucico プログラムで使われるスクリプトによ っ
て提示されたアイデアを基にしています。
uucico(1), uucp(1), syslog(3), syslogd(8).
著作権
chat プログラムは、パブリックドメインのソフトウェアです。これは GNU の
パブリックライセンス (一般公有使用許諾) とは異なります。このプログラ ム
を分割する場合には、その両方を管理するようにしてください。
Chat Version 1.17 27 Sep 1997 CHAT(8)