ネットワーク

Teratermマクロでコマンドをテキストファイルから一括実行する

投入するコマンドをマクロ本体に書いてしまうと、コマンドを変えるたびにマクロを修正することになります。コマンドを別のテキストファイルに分けておけば、マクロは触らずに投入内容だけ差し替えられます。

ファイル構成

マクロと同じフォルダに command.txt を置きます。

macro.ttl
command.txt

command.txt の中身

show version
get system status
show running-config

1行に1コマンドを書きます。

コード

EnPrompt = 'test-FW#'

getdir Dir
command_file_path = ''
strconcat command_file_path Dir
strconcat command_file_path '\command.txt'

; 読み取り専用で開く
fileopen fh2 command_file_path 0 1

:freadloop
  filereadln fh2 com
  if result goto breakloop
  sendln com
  wait EnPrompt
goto freadloop

:breakloop

fileclose fh2

各コマンドの役割

コマンド 役割
fileopen fh2 <パス> 0 1 ファイルを読み取り専用で開く
filereadln fh2 com 1行読み込んで変数 com に入れる
if result goto breakloop ファイル末尾に達したらループを抜ける
sendln com 読み込んだコマンドを送信する
wait EnPrompt プロンプトが返るまで待つ
fileclose fh2 ファイルを閉じる

filereadlnファイル末尾に達すると result に1を返します。これを終了条件に使っています。

waitが重要な理由

wait を入れずに sendln を連続させると、前のコマンドの出力が終わる前に次のコマンドが送られます。タイミングによっては、コマンドが実行されないまま次に進んでしまいます。

; 悪い例:結果が取れないことがある
sendln 'show version'
sendln 'show running-config'
; 良い例:プロンプトを待ってから次へ
sendln 'show version'
wait EnPrompt
sendln 'show running-config'
wait EnPrompt

ページャを無効にしておく

出力が長いコマンドでは、機器側が --More-- で止まります。この状態で wait を掛けるとプロンプトが返らず、マクロが固まります。

接続直後にページャを無効化してください。

; Cisco IOS
sendln 'terminal length 0'
wait EnPrompt

; Fortigate
sendln 'config system console'
wait '#'
sendln 'set output standard'
wait '#'
sendln 'end'
wait EnPrompt

これを忘れると「途中でマクロが止まる」という現象になります。原因が分かりにくいので、最初に入れておくことをおすすめします。

waitにタイムアウトを設定する

プロンプトが返らないケースに備え、タイムアウトを設定しておくと安全です。

timeout = 30
sendln com
wait EnPrompt
if result = 0 then
  messagebox "コマンドの応答がありませんでした" "タイムアウト"
endif

timeout に秒数を設定すると、wait はその時間で打ち切られ、result に0が返ります。

関連記事

-ネットワーク