EN JA
CHAT(8)
CHAT(8) FreeBSD System Manager's Manual CHAT(8)

名称

chatモデムの自動対話のスクリプト

書式

chat [ -eSsVv][ -f chat-file][ -r report-file][ -T phone-number][ -t timeout][ -U phone-number2][ script]

解説

chat プログラムは、コンピュータとモデムの間の対話のやり取りを規定します。その主な目的は、Point-to-Point プロトコルデーモン (Protocol Daemon) (pppd) とリモートの pppd プロセスの間の接続を確立することです。

オプション

-e
エコーオプションをオンにして開始します。エコーは、ECHO キーワードを使用することによってチャットスクリプトの特定の時点でオンまたはオフに切り替えることもできます。エコーが有効にされるとき、モデムからのすべての出力は、 stderr にエコーされます。
-f chat-file
チャットファイルからチャットスクリプトを読み込みます。このオプションの使用は、チャットスクリプトのパラメータとお互いに排他的です。ユーザは、ファイルに読み込みアクセス権がなければなりません。複数の回線がファイルで許可されます。空白または水平タブ文字は、文字列を分離するために使用されるべきです。
-r report-file
報告文字列の出力のためのファイルを設定します。キーワード REPORT を使用するなら、結果の文字列は、このファイルに書き込まれます。このオプションが使用されず、それでも REPORT キーワードを使用するなら、 stderr ファイルが、報告文字列のために使用されます。
-S
syslog(3) を使用しません。デフォルトで、エラーメッセージは、 syslog(3) に送られます。 -S の使用は、 -v からのログメッセージと syslog(3) に送られるエラーメッセージの両方を抑制します。
-s
stderr を使用します。 -v からのすべてのログメッセージとすべてのエラーメッセージは、 stderr に送られます。
-T phone-number
送信文字列で \T 置換メタ文字で置き換えられる、任意の文字列、通常、電話番号、を渡します。
-t timeout
受信されると予期される文字列のためのタイムアウトを設定します。文字列が時間の制限内に受信されないなら、応答文字列は、送信されません。送信される代替の応答、または、スクリプトは、代替の応答文字列がないなら、失敗します。失敗したスクリプトによって、 chat プログラムは、0 以外のエラーコードで終了します。
-U phone-number2
送信文字列で \U 置換メタ文字で置き換えられる、2 番目の文字列、通常、電話番号、を渡します。これは、2 つの番号を要求する ISDN 端末アダプタをダイヤルするとき、役に立ちます。
-V
chat スクリプトは、 stderr の冗長なモードで実行されることを要求します。次に、 chat プログラムは、モデムから受信されたすべてのテキストとモデムに送信された出力文字列を stderr デバイスにログ記録します。このデバイスは、通常、chat または pppd プログラムを実行する場所でローカルなコンソールです。
-v
chat スクリプトが冗長なモードで実行されることを要求します。次に、 chat プログラムは、モデムから受信されたすべてのテキストとモデムに送信された出力文字列と同様に、chat スクリプトの実行状態をログ記録します。デフォルトは、 syslog(3) を通してログ記録することです。ログ記録の方法を、 -S-s フラグで変更することができます。ログ記録は、冗長なトレースに対して、レベル info で、いくつかのエラーに対して、レベル errlocal2 機能で行われます。

チャットスクリプト

chat スクリプトは、通信を規定します。スクリプトは、次の例のようなダッシュによって区切られ、オプションの "subexpect-subsend" (副予期する-副送信) 文字列ペアと共に空白によって区切られた、 1 以上の文字列の "expect-send" (予期する-送信) ペアから成ります:

ogin:-BREAK-ogin: ppp ssword: hello2u2

この行は、 chat プログラムが文字列 "ogin:"を予期するべきであることを示します。割り当てられた時間間隔内にログインのプロンプトの受信に失敗するなら、リモートにブレークシーケンスを送信し、次に、文字列 "ogin:"を予期します。最初の "ogin:"が受信されるなら、ブレークシーケンスは、生成されません。

いったん、ログインプロンプトを受信するなら、 chat プログラムは、文字列 ppp を送信し、次に、プロンプト "ssword:"を予期します。パスワードのためのプロンプトを受信するとき、パスワード hello2u2 を送信します。

通常、キャリッジリターンが、応答の文字列に続いて、送信されます。 \r 文字シーケンスを使用することによって特に要求されないなら、"expect"文字列は、予期されません。

expect (期待する) シーケンスは、文字列を識別するために必要なものだけを含んでいるべきです。通常、ディスクファイルに格納されるので、可変の情報を含んでいるべきではありません。 expect (期待する) 文字列として、時間文字列、ネットワーク識別文字列または、他の可変の部分のデータを検索することは一般的に受け付けられません。

最初のシーケンスの間に壊れるかもしれない文字の修正を助けるために、 "login:"ではなく、文字列 "ogin:"を検索します。先導する "l"文字が誤って受信される可能性があり、たとえそれがシステムによって送信されたとしても、文字列が決して見つからないかもしれません。こういう訳で、スクリプトは、"login:"ではなく "ogin:"を、"password:"ではなく "ssword:"を検索します。

非常に単純なスクリプトは、次のようになるかもしれません:

ogin: ppp ssword: hello2u2

言いかえると、....ogin: を予期する、ppp に送信する、...ssword: を予期する、 hello2u2 を送信する。

実際の問題としては、単純なスクリプトは、めったにありません。少なくとも、含めるべきです、万一オリジナルの文字列が受信されないなら、 sub-expect (副-予期する) シーケンスを含むべきです。例えば、次のスクリプトを考慮します:

ogin:--ogin: ppp ssword: hello2u2

これは、以前に使用される単純なものよりよいスクリプトになります。しかしながら、何も受信されなかったなら、これは、同じ login: プロンプト検索し、単一のリターンシーケンスが、送信され、次に、再び login: 検索します。万一回線の雑音が、最初のログインプロンプトを不明瞭にするなら、通常、空の行を送信することは、再びログインプロンプトを生成します。

コメント

chat スクリプトにコメントを埋め込むことができます。コメントは、カラム 1 で # (ハッシュ) 文字で始まる行です。そのようなコメント行は、chat プログラムによって単に無視されます。 '#' 文字が expect (予期する) シーケンスの最初の文字として予期されているなら、 expect (予期する) 文字を引用するべきです。 # (ハッシュ) 文字で始まるプロンプトを待ちたいなら、利用者は、次のように書かなければなりません:

# 今、プロンプトを待って、ログアウト文字列を送信します 
'# ' logout

アボート文字列

多くのモデムは、文字列として呼び出しの状態を報告します。これらの文字列は、 CONNECTED または NO CARRIER または BUSY を指定できます。万一モデムがリモートの接続に失敗したなら、スクリプトを終了することはしばしば望ましいことです。問題は、スクリプトが、受信するモデムの文字列を正確に知らないということです。 1 つの試みとして、 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 指示によって、スクリプトは、標準エラーを通して端末のユーザに文字列を送信することができます。 chat が pppd によって実行されていて、pppd が (その制御端末からデタッチされている) デーモンとして実行されているなら、標準エラーは、通常、ファイル /etc/ppp/connect-errors にリダイレクトされます。

SAY 文字列は、シングルクォートまたはダブルクォートで囲まれなければなりません。キャリッジリターンとラインフィードが出力される文字列に必要であるなら、明示的にそれらを文字列に追加しなければなりません。

'ECHO OFF' の状態にしたいが、それでもなお、何が起こっているかユーザに知らせるところで、スクリプトのセクション中の進捗メッセージを与えるために SAY 文字列を使用することができるかもしれません。使用例は、次の通りです:

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 文字列をユーザに提示し、スクリプトのすべての詳細は、隠されたままとなります。例えば、上記のスクリプトが動作するなら、ユーザは、次を見ます:

Dialling your ISP... 
Waiting up to 2 minutes for connection ... Connected, now logging in ... 
Logged in OK ...

REPORT 文字列

EPORT 文字列は、 ABORT 文字列に似ています。違いは、キャリッジリターンのような次の制御文字までの文字列とすべての文字がレポートファイルに書き込まれることです。

レポート文字列は、モデムの接続文字列の伝送速度を分離し、 chat ユーザに値を返すために使用されます。レポート文字列論理の分析は、予期する文字列を検索するような別の文字列処理と同時に起こります。レポートとアボートシーケンスのために同じ文字列を使用することは、たぶんあまり使い道がありませんが、可能です。

レポート文字列は、プログラムの終了コードを変更しません。

これらの "レポート"文字列は、 REPORT シーケンスを使用して、スクリプトで指定されます。それは、次の使用例でのようにスクリプトに書かれます:

REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account

このシーケンスは、何も予期しません。次に、電話をダイヤルするために文字列 ATDT5551212 を送信します。予期される文字列は、 CONNECT です。文字列 CONNECT が受信されるなら、スクリプトの残りが実行されます。さらに、プログラムは、文字列 "CONNECT"とそれに続く接続速度のようなあらゆる文字を expect ファイルに書き込みます。

CLR_REPORT 文字列

このシーケンスによって、以前に設定した REPORT 文字列をクリアすることができます。 REPORT 文字列は、(コンパイル時の) 前もって定義したサイズの配列で保持されます。新しい文字列がその空間を使用することができるように、 CLR_REPORT は、クリアされたエントリのための空間を再利用します。

エコー

エコーオプションは、モデムからの出力が stderr にエコーされるかどうかを制御します。このオプションは、 -e オプションで設定されますが、 ECHO キーワードによっても制御することができます。 "expect-send" (予期する-送信) ペア ECHO ON は、エコーを有効にし、 ECHO OFF は、それを無効にします。このキーワードで、利用者は、どの会話の部分を目に見えるようにするべきかを選択することができます。例えば、次のスクリプトで:

ABORT   'BUSY' 
ABORT   'NO CARRIER' 
''      ATZ 
OK\r\n  ATD1234567 
\r\n    \c 
ECHO    ON 
CONNECT \c 
ogin:   account

モデムの設定に起因するすべての出力とダイヤリングは、目に見えませんが、 CONNECT または BUSY メッセージで始まる、すべては、エコーされます。

HANGUP

HANGUP オプションは、モデムのハングアップがエラーと見なされるべきかどうかを制御します。このオプションは、ハングアップし、利用者のシステムを元に呼び出すシステムをダイヤルするためのスクリプトに役に立ちます。 HANGUP オプションは、 ON または OFF を指定できます。

HANGUPOFF に設定され、モデムが (例えば、コールバックシステムにログインする最初のステージの後に) ハングアップするとき、 chat は、スクリプト (例えば、着信呼び出しと 2 番目のステージのログインプロンプトを待って) を実行し続けます。着信呼び出しが接続されるとすぐに、通常のハングアップしたシグナルの振る舞いを再インストールするために HANGUP ON 指示を使用するべきです。ここに、(単純な) 使用例のスクリプトを示します:

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 秒に変更します。次に、タイムアウトは、パスワードプロンプトを検索するとき、5 秒に変更されます。

タイムアウトが、いったん変更されると、再び変更されるまで、有効なままです。

EOT を送信する

特別な応答文字列の EOT は、chat プログラムがリモートに EOT 文字を送信するべきであることを示します。これは、通常、End-of-file (ファイルの終り) 文字シーケンスです。リターン文字は、 EOT に続いて送信されません。

EOT シーケンスは、シーケンス ^D を使用して、送信文字列に埋め込まれます。

BREAK を生成する

特別な応答文字列の BREAK によって送信する条件を中断します。ブレークは、送信側の特別なシグナルです。受信側での通常の処理は、転送速度を変更することです。それは、有効なログインプロンプトを受信することができるまで、リモートで利用可能な転送速度を周期的に繰り返すために使用されます。

ブレークシーケンスは、 \K シーケンスを使用して、送信文字列に埋め込まれます。

エスケープシーケンス

予期する文字列と応答文字列は、エスケープシーケンスを含んでいます。すべてのシーケンスが応答文字列で有効です。多くは、予期する文字列で有効です。予期するシーケンスで有効でないものは、そのように示されます。
''
空文字列を予期するか、または送信します。空文字列が送信されるなら、さらにリターン文字を送信します。このシーケンスは、アポストロフィまたは引用文字のペアのいずれかです。
\b
バックスペース文字を表わします。
\c
応答文字列の終りで改行を抑制します。これは、後続するリターン文字なしの文字列を送信する、ただ一つの方法です。それは、送信文字列の終りでなければなりません。例えば、シーケンス hello\c は、単に文字 h, e, l, l, o を送信します ( 予期する文字列で有効ではありません)。
\d
1 秒遅延します。プログラムは、最大 1 秒遅延する sleep(1) を使用します ( 予期する文字列で有効ではありません)。
\K
BREAK を挿入します ( 予期する文字列で有効ではありません)。
\n
改行 (newline または linefeed) 文字を送信します。
\N
空文字を送信します。同じシーケンスは、\0 によって表現されます ( 予期する文字列で有効ではありません)。
\p
1 秒の何分の 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
1 つ以上のパラメータが、無効であるか、または予期する文字列が内部バッファには大きすぎました。これは、適切に実行されなかったプログラムであることを示します。
2
プログラムの実行の間にエラーが生じました。これは、なんらかの理由のために失敗した、または chat が SIGINT のようなシグナルを受信した読み込みまたは書き込み操作のためです。
3
"-subsend" (-副送信) 文字列なしの 予期する 文字列があるとき、タイムアウトイベントが生じました。これは、条件のために正しくスクリプトがプログラムされなかったか、またはいくつかの予期しないイベントが生じ、予期された文字列が見つけられないかもしれないことを意味します。
4
ABORT 条件としてマークされた最初の文字列が存在しました。
5
ABORT 条件としてマークされた 2 番目の文字列が存在しました。
6
ABORT 条件としてマークされた 3 番目の文字列が存在しました。
7
ABORT 条件としてマークされた 4 番目の文字列が存在しました。
...
また、他の終了コードは、 ABORT 条件としてマークされた文字列です。

終了コードを使用すると、どのイベントがスクリプトを終了したかを判断することができます。文字列 "BUSY"が "NO DIAL TONE"とは対照的にモデムから受信さたかどうか判断することができます。最初のイベントが再試行されているあいだに、2 番目は、たぶん再試行の間に成功の可能性は、ほとんどありません。

関連項目

chat スクリプトに関する追加情報は、UUCP の文書にあります。 chat スクリプトは、uucico プログラムによって使用されるスクリプトによって提案されたアイデアから得られました。

syslog(3), syslogd(8)

COPYRIGHT

The chat program is in public domain. This is not the GNU public license. If it breaks then you get to keep both pieces.
 
翻訳: chat プログラムは、パブリックドメインです。これは、GNU パブリックライセンスではありません。それが破られるなら、利用者は、両方の部分を維持する状態となります。
September 10, 2012 FreeBSD