|
HOME > Linux Tips ( 目次 ) > Linux コマンド 一覧表 > c > chat - システム管理コマンドの説明 chat - システム管理コマンドの説明 - Linux コマンド集 一覧表
名称chat - モデム接続の確立を自動化するスクリプト言語 書式chat [ options ] script 解説
chat プログラムはコンピュータとモデムの間のメッセージ交換を制御します。 このコマンドの主な目的は、Point-to-Point Protocol デーモン (pppd ) と リモートの pppd プロセスの間の接続を確立することです。 オプション
チャットスクリプト
chat スクリプトには通信の手順を定義します。 スクリプトは一つまたはそれ以上の「受信待ち-送信」文字列の組からなり、
それぞれは空白で区切られています。
オプションとして「副受信待ち-副送信」文字列の組を追加することもでき、
その場合には以下の例のようにダッシュで区切ります:
これにより、chat プログラムは文字列 "ogin:" の受信待ちをおこないます。 もしもタイムアウトする前にログインプロンプトを受信できなければ、 リモートホストにブレーク信号を送信し、それから文字列 "ogin:" を受信待ちします。 もしも最初の "ogin:" が受信できていれば、ブレーク信号は送信されません。 一旦ログインプロンプトを受信すると、chat プログラムは文字列 ppp を 送信して、プロンプト "ssword:" の受信を待ちます。 パスワードプロンプトを 受信すると、chat プログラムはパスワード hello2u2 を送信します。 応答文字列に続いて、通常はキャリッジリターン文字が送られます。 「受信待ち」文字列中では、\r 文字シーケンスで明示的に指定しないかぎり、 キャリッジリターンは文字列に含まれません。 目的の文字列を識別するのに必要な部分だけを受信待ち文字列に 指定するようにするべきです。 なぜなら、受信待ち文字列は通常ディスクファイルに記録されるため、 動的に変化する情報を含むことができないからです。 一般には、時刻を表す文字列やネットワーク ID 文字列その他の 変化するデータの塊を受信待ちさせることはできません。 通信の初期段階では、文字が化けて受信される場合があります。 この場合にも正しく認識ができるように、 文字列 "login:" ではなく "ogin:" を待つようにします。 仮に最初の "l" という文字が化けて受信されたとしますと、 リモートシステムが "login:" を送信したとしても、 その文字列は認識されないことになります。 このため、スクリプトでは "login:" ではなく "ogin:" を、 "password:" ではなく "ssword:" を待つようにします。 非常に単純なスクリプトは、以下のようになるでしょう:
言いかえると、....ogin: を受信待ちして ppp を送信し、...ssword: を 受信待ちして hello2u2 を送信するということになります。 現実問題としては、単純なスクリプトが使われることはほとんどないでしょう。
少なくとも、最初の受信待ち文字列が受信できなかった場合に、
副受信待ち文字列を実行するようにするべきでしょう。
たとえば、以下のスクリプトを考えてみます:
これは以前に使った単純なものよりも良いスクリプトでしょう。 以前のものと同様に login: プロンプトを待ちますが、もし受信できなかった場合には リターンを一つ送ってから再び login: が送られてくるのを待ちます。 最初のログインプロンプトがラインノイズによって化けたとしても、 空行が送られることで、通常はもう一度ログインプロンプトが送信されます。 コメント
コメントを chat スクリプト中に埋め込むことが可能です。
コメントは #
(ハッシュ) 文字をカラム 1 から開始する行です。
このようなコメント行は chat プログラムは単に無視します。
「受信待ち」文字列の最初の文字が `#' 文字の場合、
「受信待ち」文字列をクォートする必要があります。
文字 # (ハッシュ)から始まるプロンプトを待ちたい場合には、
以下のように書かねばならないでしょう:
中断文字列多くのモデムはダイヤルの結果を文字列としてレポートします。 これらの文字列は CONNECTED だったり、NO CARRIER や BUSY だったりするでしょう。 モデムが相手との接続に失敗した場合には、スクリプトを終了させたいと 思うことがよくあるでしょう。 問題は、どの文字列を次に受信するかということを、 スクリプトが正確に知ることはできないということです。 ある時には BUSY を受信するかもしれませんが、 次には NO CARRIER を受信するかもしれません。 これらの「中断」文字列は、ABORT
シーケンスにより
スクリプト中に指定することができます。
それは、以下の例のようにスクリプトに指定します:
このシーケンスは受信待ちをおこないません。それから文字列 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'
しつつもユーザになにが起っているのか示すことが可能です。
例を示します:
このシーケンスは SAY 文字列のみユーザに示し、script の詳細は隠します。
例えば、上記 script を実行した場合、ユーザが見るのは以下です:
レポート文字列レポート 文字列は ABORT 文字列に似ています。 違うのは、その文字列自身とキャリッジリターン等の 次の制御文字までの 全ての文字がレポートファイルに書かれるということです。 レポート文字列はモデムのコネクト文字列の転送レートと chat ユーザへのリターン値を切りわけるために使えます。 レポート文字列ロジックの分析は、受信待ち文字列の検索などの 他の文字列処理と同時におこなわれます。 レポート文字列と中断文字列に同じ文字列を使用することも可能ですが、 おそらくあまり使い道がないでしょう。 レポート文字列はプログラムの終了コードに影響を及ぼしません。 これらの「レポート」文字列は、REPORT
シーケンスにより
スクリプト中に指定することができます。
それは、以下の例のようにスクリプトに指定します:
このシーケンスは受信待ちをおこなわず、文字列 ATDT5551212 を送信して 電話をかけます。受信待ち文字列は CONNECT です。 文字列 CONNECT を受信すると、スクリプトの残りが実行されます。 さらに、文字列 "CONNECT" と、それに続く接続レートなどの 任意の文字がレポートファイルに記録されます。 CLR_REPORT 文字列このシーケンスを使用して、以前に設定した REPORT 文字列をクリア できます。 REPORT 文字列は規定サイズ(コンパイル時に決定)の配列に保持されます; CLR_REPORT はクリアされたエントリの領域を再要求し、 新たな文字列をそこに格納できるようにします。 エコー
エコーオプションはモデムからの出力を stderr
へエコーするか否か
を制御します。
このオプションを -e
オプションにて設定することができますし、
ECHO
キーワードにて制御することもできます。
「受信待ち-送信」文字列の組 ECHO
ON
はエコーを有効にし、
ECHO
OFF
は無効にします。
このキーワードを使用してどの会話を見せるかを選択可能です。
例えば以下の script では:
モデム設定結果およびダイヤル結果は見せませんが、 CONNECT (もしくは BUSY ) メッセージ後は全てをエコーします。 回線切断
HANGUP オプションはモデムの回線切断をエラーと扱うか否かを制御します。
このオプションは、
システムにダイヤル後に回線切断しコールバックする script 中で有効です。
HANGUP オプションは ON
もしくは OFF
にできます。
タイムアウトタイムアウトの初期値は 45 秒です。これは -t パラメータにより 変更することができます。 次に受信待ちする文字列のタイムアウト値を変更するには、以下のようにします:
これは login: プロンプトを受信待ちする際のタイムアウトを 10 秒に変更します。 さらに password プロンプトを受信待ちする際にはタイムアウトを 5 秒に変更します。 一旦タイムアウト値が変更されると、次に変更されるまでは そのままになります。 EOT の送信チャットプログラムは特殊な応答文字列 EOT により、 リモート側へ EOT 文字を送信します。 通常、これはファイル終了を表す文字です。 EOT に続けてリターン文字が送られることはありません。 ^D シーケンスを使って EOT を送信文字列に埋め込むことができます。 ブレークの生成特殊な応答文字列 BREAK により、ブレーク信号が送られます。 ブレークは送信側では特殊な信号として扱われます。 受信側では通常、転送レートの変更要求として処理されます。 これにより、正常に login プロンプトを受信できるまで ブレーク信号を送ることで、リモート側がサポートしている転送レートを 順次切り替えさせることができます。 \K シーケンスを使ってブレーク信号を送信文字列に埋め込むことができます。 エスケープシーケンス受信待ち文字列と応答文字列には、エスケープシーケンスを指定することができます。 応答文字列では、全てのエスケープシーケンスが使えます。 受信待ち文字列では、ほとんどのエスケープシーケンスが使えます。 受信待ち文字列では使えないエスケープシーケンスについては、 説明文中にそのことが書かれています。
終了コードchat プログラムは以下の終了コードを返します。
関連項目UUCP のドキュメントからも、chat スクリプトに関する 追加情報が得られるでしょう。 chat スクリプトは uucico プログラムで使われる スクリプトによって提示されたアイデアを基にしています。 uucico(1), uucp(1), syslog(3), syslogd(8). 著作権
chat
プログラムは、パブリックドメインのソフトウェアです。
これは GNU のパブリックライセンス (一般公有使用許諾) とは異なります。
このプログラムを分割する場合には、その両方を管理するようにしてください。
|
|