スポンサーリンク

CHAT

名称
書式
解説
オプション
チャットスクリプト
コメント
中断文字列
CLR_ABORT 文字列
SAY 文字列
レポート文字列
CLR_REPORT 文字列
エコー
回線切断
タイムアウト
EOT の送信
ブレークの生成
エスケープシーケンス
終了コード
関連項目
著作権

名称

chat − モデム接続の確立を自動化するスクリプト言語

書式

chat [ options ] script

解説

chat プログラムはコンピュータとモデムの間のメッセージ交換を制御します。 このコマンドの主な目的は、Point-to-Point Protocol デーモン (pppd) と リ モートの pppd プロセスの間の接続を確立することです。

オプション

-f <chat file>

チャットスクリプトを chat file から読み込みます。このオプション と script パラメータとは、互いに排他の関係にあります。 chat コ マ ンドを実行するユーザは、このファイルのリードアクセス権を持っ ていなければなりません。このファイルの中では、文字列の区切り と してスペースとタブを使うことができます。

-t <timeout>

文 字列の受信待ちのタイムアウトを指定します。もし、タイムリミッ トまでに指定された文字列を受信できなかった場合には、応答文字 列 の 送信をおこないません。この時、かわりの応答文字列が指定されて いれば それが送信され、指定されていなければ スクリプトの実行 が 失 敗 します。スクリプトの実行が失敗すると、chat プログラムは 0 以外のエラーコードを返して終了します。

-r <report file>

レポート文字列を出力するファイルを指定します。キーワード 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) を使用しません。デフォルトではエラーメッセージは syslog(3) へ送られます。-S を使用すると ’-v’ によるログおよびエ ラーメッセージは syslog(3) へは送られなくなります。

-T <phone number>

送 信文字列において \T 置換メタ文字を置き換える任意の文字列を渡 します。通常は電話番号です。

-U <phone number 2>

送信文字列において \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 CARRIERBUSY だったりするでしょう。モ デ ム が相手との接続に失敗した場合には、スクリプトを終了させたいと思うこと がよくあるでしょう。問題は、どの文字列を次に受信するかということを、 ス ク リプトが正確に知ることはできないということです。ある時には BUSY を受 信するかもしれませんが、次には NO CARRIER を受信するかもしれません。

これらの「中断」文字列は、ABORT シーケンスによりスクリプト中に指定す る ことができます。それは、以下の例のようにスクリプトに指定します:

ABORT BUSY ABORT ’NO CARRIER’ ’’ ATZ OK ATDT5551212 CONNECT

このシーケンスは受信待ちをおこないません。それから文字列 ATZ を送信しま す。受信待ち文字列は OK です。 OK を受信すると、電話をかけるために文 字 列 ATDT5551212 を 送 信します。受信待ち文字列は CONNECT です。文字列 CONNECT を受信すると、スクリプトの残りが実行されます。一方、モデムが 話 中 を検出すると、文字列 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 logging 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’
’’ ATZ
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 の パブリックライセンス (一般公有使用許諾) とは異なります。このプログラ ム を分割する場合には、その両方を管理するようにしてください。

スポンサーリンク