ネットワーク機器やLinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルサーバーへのキッティング、定常的な保守作業をTera Termマクロで自動化しようとした際、「意図しないタイミングでEnterが送信され、設定コマンドが途中で実行された」「次のコマンドが処理しきれずに暴発した」といったトラブルに直面したことはないでしょうか。
手動であれば問題なく入力できる処理も、マクロによる高速な自動入力になると、わずかなタイミングのずれや改行コードのミスマッチが原因で予期せぬ挙動を引き起こします。
この記事では、Tera Termマクロの sendln コマンドで起こる改行や送信トラブルの根本原因を紐解き、実務で今すぐ使える確実な対策と実践的なマクロ記述テクニックをインフラエンジニア向けに分かりやすく解説します。最後までお読みいただければ、安定して動作する信頼性の高い自動化マクロを作成できるようになります。
Tera Termマクロのsendlnコマンドとは
Tera Termマクロ(.ttlファイル)において、リモートホストへ文字列を送信するための最も基本的なコマンドが send と sendln です。
sendlnとsendの違いと改行コードの仕組み
send コマンドと sendln コマンドの最大の違いは、送信する文字列の「末尾に自動で改行コードが付与されるかどうか」にあります。
send 'command': 指定した文字列のみを送信します。改行コードは付与されないため、リモート側でコマンドを実行させるためには手動でEnterキーに相当するコードを追加する必要があります。sendln 'command': 指定した文字列の末尾に、Tera Termの端末設定「改行コード(送信)」で指定された改行コードを自動的に付与して送信します。これにより、コマンドラインに入力した後に自動でEnterキーが押された状態になり、コマンドが実行されます。この改行コードの設定は「設定」→「端末」→「改行コード」→「送信」から変更でき、CR・LF・CR+LFの3種類から選択できます(今回の検証環境ではCRに設定されています)。
一見すると sendln は非常に便利ですが、この「自動付与される改行コード」の仕様こそが、環境や機器によってはトラブルの元となる原因です。
よくあるトラブル:コマンドが意図せず暴発・途切れる原因
自動化マクロを実行した際に「コマンドが途中で切れる」「想定していない行でエンターが押されて設定が壊れた」という現象が起きる場合、よくある原因として特に注意したいのが「コマンド送信のタイミング」です。加えて、接続先のCLICLI [シーエルアイ]Command Line Interface。コマンドで操作するインターフェースや端末設定によっては「改行コードの扱い」が問題になる場合もあります。
原因1:リモート側の処理が追いついていない
Tera Termマクロは、デフォルトではリモート側のコマンド処理完了を自動的に待ってくれるわけではなく、追加の待ち時間なしに次の処理へ進みます。人間が手動でコマンドを打つ場合と比べ、圧倒的に高速にコマンドが送信されます。
そのため、前のコマンドの処理が完了する前に次のコマンドを送信すると、接続先によっては入力処理が追いつかず、意図しない入力やコマンド実行につながる可能性があります。
原因2:改行コード(CR/LF)のミスマッチ
Tera TermからLinuxサーバーやネットワーク機器へコマンドを送信する場合、Tera Term側の「改行コード(送信)」設定と、接続先のCLIの入力処理の組み合わせによっては、意図しない入力として扱われる場合があります。
sendln が送信する改行コードと、接続先の端末やアプリケーションの入力処理の組み合わせによっては、意図しない空行や入力処理につながる場合があります。
接続先の端末設定やアプリケーションによっては、CRとLFの扱いが異なる場合があるため、意図しない空行や入力処理につながることがあります。この問題を解決するには、Tera Termの「設定」→「端末」→「改行コード」→「送信」を接続先に合わせて変更します。また、マクロ内で send コマンドと制御文字を組み合わせて、改行コードを明示的に指定する方法も有効です。
; CRを明示的に送信send 'show running-config' #13
; LFを明示的に送信send 'ls -la' #10※CRとLFのどちらを使用すべきかは、接続先の端末やCLIの仕様に依存します。上記はCR/LFを明示的に送信する方法を示した例であり、「ネットワーク機器はCR、LinuxはLF」という意味ではありません。
sendlnのトラブルを防ぐ実践的なマクロ記述テクニック
ここからは、前述したトラブルを回避し、実務で安心して使える堅牢なTera Termマクロを書くための具体的な対策をステップ形式で解説します。
対策1:pauseやwaitでコマンド送信のタイミングを制御する
連続する sendln コマンドでは、必要に応じて一定時間待機する pause や、機器からの応答を待つ wait / waitln を使用して、コマンド送信のタイミングを制御します。
ステップ1として、一定時間の静的待機を行う pause コマンドの使用例を確認します。
; pauseコマンドによる数秒のウェイト挿入例(秒数を指定)sendln 'enable'pause 2
sendln 'configure terminal'pause 1
sendln 'hostname SW-CORE-01'pause 1ステップ2として、機器からの応答(プロンプトなど)を確実に検知してから次の処理へ進む wait コマンドの活用例です。ネットワーク機器の処理速度は負荷によって変動するため、実務では wait や waitln を使う方がより確実です。wait は指定した文字列を受信するまで待つのに対し、waitln は指定した文字列を含む行を受信するまで待ちます。プロンプトなど行単位で判定したい場合には waitln が適しています。
なお、wait コマンドはシステム変数 timeout でタイムアウト時間を制御できます。timeout を設定しないと、応答が返ってこない場合にマクロが永久に停止してしまうため、必ず適切な値をセットしましょう。タイムアウトが発生するとシステム変数 result に 0 がセットされるため、これを使ってエラー処理を実装できます。
実運用では '#' のような短い文字列ではなく、'SW-CORE#' のように実際のプロンプトに合わせてできるだけ具体的な文字列を指定してください。短い文字列を指定すると、コマンド出力の中に含まれる同じ文字を誤検知してしまう場合があります。
; タイムアウトを30秒に設定timeout = 30
; プロンプトが表示されるのを待ってから次へ進む例(Cisco IOS/IOS XE)sendln 'show running-config'wait 'SW-CORE#'if result = 0 messagebox 'タイムアウトしました' 'エラー' endendif
sendln 'write memory'wait '[OK]'if result = 0 messagebox 'タイムアウトしました' 'エラー' endendif対策2:送信処理のサブルーチン化で安定性を高める
マクロ内で何度も sendln を記述するとコードが冗長になり、ウェイトの入れ忘れによるミスも増えます。そのため、送信処理をサブルーチン化し、送信と待機処理をまとめて扱う方法も有効です。
TTL(Tera Term Language)の call コマンドは引数を直接渡す構文に対応していないため、グローバル変数に値をセットしてからサブルーチンを呼び出す形式を使います。
まず、固定秒数で待機するシンプルな方法です。以下のサンプルコードでは、送信文字列(input_str)とウェイト時間(wait_sec)をグローバル変数に格納し、サブルーチン内で参照しています。処理時間が安定している環境や、簡易的なマクロに向いています。
; メイン処理の呼び出し例(固定秒数待機版)input_str = 'en'wait_sec = 2call send_command
input_str = 'conf t'wait_sec = 1call send_command
input_str = 'interface GigabitEthernet0/1'wait_sec = 1call send_command
input_str = 'description Link-to-Router'wait_sec = 1call send_command
end
; サブルーチン定義(固定秒数待機版):send_command ; グローバル変数 input_str の文字列を送信 sendln input_str ; グローバル変数 wait_sec の秒数だけ待機 pause wait_sec returnただし、対策1で解説したとおり、機器の処理速度は負荷によって変動します。より確実にトラブルを防ぎたい場合は、プロンプトの応答を wait で待つサブルーチンを使いましょう。以下の例では、送信後にプロンプト文字列(wait_str)が返ってくるまで待機し、タイムアウト時にはエラーメッセージを表示して処理を中断します。
; メイン処理の呼び出し例(プロンプト待機版)timeout = 30
input_str = 'en'wait_str = 'SW-CORE#'call send_command_wait
input_str = 'conf t'wait_str = '(config)#'call send_command_wait
input_str = 'interface GigabitEthernet0/1'wait_str = '(config-if)#'call send_command_wait
input_str = 'description Link-to-Router'wait_str = '(config-if)#'call send_command_wait
end
; サブルーチン定義(プロンプト待機版):send_command_wait sendln input_str wait wait_str if result = 0 messagebox 'コマンド実行がタイムアウトしました' 'エラー' end endif returnこのようにサブルーチンを経由させることで、コマンド送信後の待機処理を共通化でき、ウェイトの入れ忘れを防ぎやすくなります。適切なプロンプトなどを待つことで、コマンドの送信タイミングを制御し、取りこぼしや意図しない連続実行のリスクを低減できます。
まとめ:安定したTera Termマクロで自動化効率を最大化しよう
今回は、Tera Termマクロの sendln コマンドで起こる改行や送信トラブルの原因と、その対策について解説しました。
記事のポイントを以下にまとめます。
sendlnは文字列の末尾に改行を付けて送信する。マクロでは次のコマンドへ自動的に進むため、接続先の処理完了を待たずにコマンドが連続送信されないよう、waitなどで応答と同期することが重要。- よくあるトラブルの原因として「コマンド送信のタイミング」と「改行コードの扱い」に特に注意が必要。
pauseで一定時間待機したり、wait/waitlnで機器からの応答を待ったりすることで、コマンド送信のタイミングを制御できる。特に処理時間が変動する環境では、固定時間のpauseよりもプロンプトなどの応答を待つ方法が適している。- コマンド送信をサブルーチン化することで、コードの可読性が上がり、ウェイトの入れ忘れによるミスを防止できる。
これらのテクニックを取り入れることで、大規模なキッティングや定常作業であっても安定性の高い自動化を実現しやすくなります。ぜひ日々の業務に活用してみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。