SSブログ

TeraTermのマクロにおけるリンクと状態制御 その1(2021/02/02) [Windows]

TeraTermのマクロでそこそこのマクロを組んでいます。まあこのマクロ仕様、いろいろとクセがありますね。
多くの人が経験するのは、なんと言ってもマクロの暴走でしょうか。プロンプト受付とコマンド発行の対応が取れておらず、超速でコマンドを発行しまくるのはよくあることです。また、telnet/sshコネクションが切れてしまい、showコマンドを発行する際、接続がありませんとエラーが出てしまうケースもよくあります。

制御の甘さをごまかすためにpause命令で数秒のウェイトを入れたり、それでもおかしい場合はさらにウェイトの秒数を増やしたりと、まさにカオスです。
私の持論として、基本的にウェイト(pause)は不要です。コマンド発行のsendと、それに対する応答waitが対応できていれば、暴走することはありません。まあ、大規模なマクロや汎用性の高いマクロを作ろうとすると、どうしてもウェイトによる微調整が必要になってくる部分もありますが…

「自動でtelnet/ssh接続し、ログ取得を行うマクロを作成」する場合のテクニックを一つ紹介します。
意識しないといけないステップ・状態把握は、ざっと以下の3つがあります。
1)ホストへのtelnet/ssh接続とその状態
2)接続ホストとTeraTermマクロのリンク状態
3)ホストの入力受付状態

順に追って説明します。
1の「ホストへのtelnet/ssh接続とその状態」はconnect命令の実行です。telnet接続しているか or ssh接続しているか、です。これを実行しないと何も始まりません。概念的にも分かりやすいですね。ただ、telnetとssh接続には決定的な違いがあります。最初に言っておきますが、sshの方が10倍制御が難しいです。

telnet接続の場合、「Login:」や「Password:」といったプロンプトがホストから返ってくるので、該当文字列をwait命令で待つことで、意図せず2)と3)の制御ができています。「Login:」が返ってきていることは、入力可能であることと同義だからです。

一方、ssh接続は厄介です。制御がうまくいかない人も多いのではないでしょうか。ssh接続の場合、「Login:」や「Password:」といったプロンプトの返答はなく、connect命令でユーザ名とパスワードを直接指定して接続します。その結果、接続・リンクの状態が不明な「中間状態」が発生します。一言で言えば、「処理中」の状態ですね。
当然、完了していない状態でsendコマンドを発行しようとするとエラーとなってしまいます。だからしばしばpause 10などとマクロに書かれ、適当に10秒待って次の処理へ進むという荒っぽいマクロができあがってしまうのです。

これに対しては2)の状態確認を行う必要があり、testlink命令で確認を行います。
testlinkの戻り値によって、
・ssh接続が完了していること
・TeraTermのマクロ制御とリンクしていること
の2つが確認可能です。ssh接続の場合、暗号化処理が重いのか、1秒~4秒程度のランダムなタイムラグが生じることがあり、より制御を難しくしています。

次に3)の管理・確認が必要です。前述の2)の状態確認では、ssh接続がTeraTermのマクロ制御とリンクしていることは分かりますが、「ホストが送信文字列を受け付け可能か?」には関係しません。
つまり、ssh接続直後など受け付け不可状態で送信した文字列(showコマンド等)は無視されるため、期待するプロンプト文字列が返ってこず、wait待ち状態が続く制御不能状態に陥ります。
これもまたpause 10などと乱暴にマクロに書かれ、適当に待ってから次の処理へ進むという荒っぽいマクロが作られる原因になっています。

実は3)の制御処理は結構厄介です。ダミーのsend(空行)を発行し、応答文字列の有無で判断すれば良いという考えるかもしれません。これはシステムにもよりますが、ssh接続直後にログインバナーなどが表示されるケースがあり、さらにそのバナーの中にプロンプト応答文字列として使われる>や#、%などが含まれている場合もあります。がダミーのsend(空行)に対応する反応とは限らないからです。

例)
step1)ssh接続のconnect命令を実行
step2)マクロでsend(空行)を発行 → しかしホスト側は受け付け不可状態のため無視
step3)ホスト側は依然として受け付け不可状態だが、ssh接続後のログインバナーを応答
step4)マクロは応答をsendに対する反応と誤認識し、文字列送信(コマンド発行)可能と判断

とまあ、泥沼ですね。マクロが暴走する原因に思い当たる節があるのではないでしょうか。
あまりに面倒なので適当なウェイトを掛けてで荒療治するというのも、コストを考えれば現実的な解だったりします…

タグ:TeraTerm
nice!(0)  コメント(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。