SSブログ

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

基本的にTeraTermのマクロは「信頼性」がないことを前提に作り込んだ方がうまくいくと思います。プロトコルで言えばUDPの世界です。これはTeraTermマクロ自身に欠陥があるというわけではなく、単に制御の難しさを物語っているだけかと思います。
接続先のシステムは、サーバであったりネットワーク機器であったり、挙動は千差万別です。返す文字列や応答時間も様々なのですから。

ここでその1の話題に戻りますが、あるホストにconnectしても、以下3つの状態が存在することを理解する必要があり、誤動作の原因となりえる事項についてはきちんとチェック・制御を行うべきです。
1)ホストへのtelnet/ssh接続状態
2)TeraTermマクロのリンク状態
3)ホストの入力受付状態

簡単に書くと、新規接続時を行った後のマクロ処理中のステータス(1、2、3の状態)は以下のパターンがあります。
×××
○××
○○×
○○○

例えば2の状態を確実にするには、以下のようなコードを挿入すると良いです。
result=0
for i 1 200
  testlink
  if result=2 then
    break
  endif
  mpause 10
next

これは切断する際にも有効で、特に様々なネットワーク機器に連続してログイン・ログアウトするようなケースだと必須のコードかと思われます。exit等でログアウト(切断)処理を行っても反映に時間が掛かるため、完全に接続が切れていない状態で次のホストへのconnect処理を行おうとし、失敗してしまうためです。
result=2
for i 1 200
  testlink
  if result=0 then
    break
  endif
  mpause 10
next

3の状態を確実にするのはもっと大変です。まあ単純に入力可能状態を検知するだけなら、エンター(空行)を無数に入力して、プロンプト文字の応答が返ってきていることを確認すれば良いでしょう。
ただ、たった今返ってきたプロンプト文字列が、その直前に入力したエンター(空行)と紐付いていることを確実にすることが難しいのです。その典型的なダメ症状が、その2で紹介した以下の例です。

単純な改行の連続のはずなのに、空行ができてしまう
Router#
Router#
Router#

Router#
Router#


Router#
Router#

n回のエンター(空行)入力と、それに対応するn回のプロンプト表示を待てば簡単ではないかと思うかもしれませんが、接続直後の状態は不安定で、一切の入力を受け付けない入力不可状態の時間が存在します。つまり、n回のエンター(空行)入力に対して、n回未満のプロンプト表示しか返ってこないケースがあるということです。

結局それの不完全解は、pause命令で一定時間待つことです。一般には3~5秒程度待っておけばさすがに入力可能になっていることでしょう。だから世の中のサンプルコードにはpauseでウェイト処理を入れているものが多いです。
完全解としては推奨しませんが、きちんと実装するだけの工数を掛けられない人や、とにかく制御不能になって困っている人には簡易解としてはお薦めです。


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

nice! 0

コメント 0

コメントを書く

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