【Tera Termマクロ】sendlnの改行コード・送信トラブルを解決する

【Tera Termマクロ】sendlnの改行コード・送信トラブルを解決する

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:3,739

Tera Termマクロの「sendln」コマンドで意図しない改行やコマンドの暴発が起きる原因と対策を解説。CR/LFの違いやpauseコマンドの挟み方など、実務の作業自動化で役立つ実践的なテクニックをインフラエンジニア向けに分かりやすく紹介します。

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

ベストセラー

世界一流エンジニアの思考法

難易度
実用性
思考法

技術スキル以上に大切な「考え方」をアップデートできる。世界基準の効率的な仕事術が学べます。

文系社会人のためのIT資格の歩き方: 文系のあなたに最適な道をご提案します (YKcreate kiki)

難易度
実用性
キャリア度

ロードマップが非常に明確。キャリアプランを見据えた、無駄のない学習順序を提案してくれます。

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

難易度
実用性
コミュ力

「伝える技術」もエンジニアの重要なスキル。相手の視点に立った、具体的な説明のコツが満載です。

技術広報入門 ー テックブログから始めるエンジニアカルチャーのつくり方

難易度
実用性
独自性

テックブログを入口にエンジニア組織の文化をどう設計し、育てていくかという実践論が学べます。

ネットワーク機器や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 'タイムアウトしました' 'エラー'
end
endif
sendln 'write memory'
wait '[OK]'
if result = 0
messagebox 'タイムアウトしました' 'エラー'
end
endif

対策2:送信処理のサブルーチン化で安定性を高める

マクロ内で何度も sendln を記述するとコードが冗長になり、ウェイトの入れ忘れによるミスも増えます。そのため、送信処理をサブルーチン化し、送信と待機処理をまとめて扱う方法も有効です。

TTL(Tera Term Language)の call コマンドは引数を直接渡す構文に対応していないため、グローバル変数に値をセットしてからサブルーチンを呼び出す形式を使います。

まず、固定秒数で待機するシンプルな方法です。以下のサンプルコードでは、送信文字列(input_str)とウェイト時間(wait_sec)をグローバル変数に格納し、サブルーチン内で参照しています。処理時間が安定している環境や、簡易的なマクロに向いています。

; メイン処理の呼び出し例(固定秒数待機版)
input_str = 'en'
wait_sec = 2
call send_command
input_str = 'conf t'
wait_sec = 1
call send_command
input_str = 'interface GigabitEthernet0/1'
wait_sec = 1
call send_command
input_str = 'description Link-to-Router'
wait_sec = 1
call 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ライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

人気記事


記事を評価

Thanks!
目次
Scroll to Top