Tera Termマクロをbatから引数付きで起動し、Cisco IOS機器の状態確認ログを自動保存する
はじめに
ネットワーク機器の構築や保守では、作業前後に次のような情報を取得することがあります。
- 現在時刻
- running-config
- IOSバージョン
- インベントリ情報
- インターフェース状態
- MACアドレステーブル
- ログ
- NTP同期状態
対象機器が少なければ手作業でも対応できますが、接続先や保存ファイル名を毎回入力していると、入力ミスやログの保存漏れが起きやすくなります。
そこで、WindowsのbatファイルからTera Termマクロへ接続先情報を渡し、Cisco IOS機器へのSSH接続、状態確認コマンドの実行、ログ保存を自動化します。
このサンプルでは、ログインした時点で特権EXECモードのプロンプトが表示される環境を前提とします。
実行イメージ
run_collect.bat
│
├─ ホスト名
├─ IPアドレス
├─ ユーザー名
├─ パスワード
└─ 機器の用途
↓
collect_cisco.ttl
↓
Cisco IOS機器へSSH接続
↓
状態確認コマンド実行
↓
日付フォルダへログ保存
前提
- Windows端末にTera Termがインストールされていること
- 対象機器へSSH接続できること
- Tera Termマクロを利用できること
- 実行端末から対象機器へ疎通できること
- ログイン後に特権EXECモードのプロンプトが表示されること
ファイル構成は次のとおりです。
TeraTermMacro
├─ run_collect.bat
└─ collect_cisco.ttl
実行すると、マクロと同じ場所に日付フォルダを作成します。
TeraTermMacro
├─ run_collect.bat
├─ collect_cisco.ttl
└─ 20260703
└─ SW-TEST-01_192.0.2.10_20260703120000.log
batファイルを作成する
run_collect.bat を作成します。
@echo off
setlocal
rem Tera Term Macroの実行ファイル
set "TTPMACRO=C:\Program Files (x86)\teraterm\ttpmacro.exe"
rem batファイルと同じフォルダにあるTTLを指定
set "MACRO=%~dp0collect_cisco.ttl"
rem 接続先情報
set "HOST=SW-TEST-01"
set "IPADDRESS=192.0.2.10"
set "USER=admin"
set "PASSWD=change_me"
set "PURPOSE=Floor switch"
start "" "%TTPMACRO%" "%MACRO%" ^
"%HOST%" ^
"%IPADDRESS%" ^
"%USER%" ^
"%PASSWD%" ^
"%PURPOSE%"
endlocal
環境に合わせて、次の値を変更します。
set "HOST=SW-TEST-01"
set "IPADDRESS=192.0.2.10"
set "USER=admin"
set "PASSWD=change_me"
set "PURPOSE=Floor switch"
%~dp0 は、実行しているbatファイルが保存されているフォルダを表します。
そのため、batファイルを別の作業フォルダから実行した場合でも、同じフォルダにあるTTLファイルを指定できます。
Tera Termマクロを作成する
collect_cisco.ttl を作成します。
; ==================================================
; 初期処理
; ==================================================
getdir BASEDIR
setdir BASEDIR
HOST = param2
IPAddress = param3
USER = param4
PASSWORD = param5
PURPOSE = param6
timeout = 15
; Cisco IOSのプロンプト
PROMPT_PRIV = HOST
strconcat PROMPT_PRIV '#'
PROMPT_USER = HOST
strconcat PROMPT_USER '>'
; ==================================================
; 日付フォルダ作成
; ==================================================
gettime DAYDIR '%Y%m%d'
SAVEDIR = BASEDIR
strconcat SAVEDIR '\'
strconcat SAVEDIR DAYDIR
foldersearch SAVEDIR
if result = 0 then
foldercreate SAVEDIR
endif
; ==================================================
; SSH接続
; ==================================================
CONNECTCMD = IPAddress
strconcat CONNECTCMD ':22 /ssh /2 /auth=password /user='
strconcat CONNECTCMD USER
strconcat CONNECTCMD ' /passwd='
strconcat CONNECTCMD PASSWORD
strconcat CONNECTCMD ' /nosecuritywarning'
connect CONNECTCMD
; 接続後のプロンプトを待つ
; timeooutは15秒
wait PROMPT_PRIV PROMPT_USER
if result = 0 then
messagebox 'SSH接続後のプロンプトを確認できませんでした。' 'Connection error'
end
endif
; ユーザーEXECモードだった場合は処理を中止
if result = 2 then
messagebox '特権EXECモードではありません。privilege 15のユーザーを使用するか、enable処理を追加してください。' 'Privilege error'
end
endif
; ==================================================
; ログ保存開始
; ==================================================
LOGFILE = SAVEDIR
strconcat LOGFILE '\'
strconcat LOGFILE HOST
strconcat LOGFILE '_'
strconcat LOGFILE IPAddress
strconcat LOGFILE '_%Y%m%d%H%M%S.log'
gettime LOGFILE LOGFILE
logopen LOGFILE 0 1
CREATETIME = '%Y/%m/%d %H:%M:%S'
gettime CREATETIME CREATETIME
logwrite 'Purpose: '
logwrite PURPOSE
logwrite ' '#13#10
logwrite 'Host: '
logwrite HOST
logwrite ' '#13#10
logwrite 'IP Address: '
logwrite IPAddress
logwrite ' '#13#10
logwrite 'Create Time: '
logwrite CREATETIME
logwrite ' '#13#10
logwrite ' '#13#10
; ==================================================
; 状態確認コマンド
; ==================================================
sendln 'terminal length 0'
wait PROMPT_PRIV
mpause 200
sendln 'show clock'
wait PROMPT_PRIV
mpause 200
sendln 'show running-config'
wait PROMPT_PRIV
mpause 500
sendln 'show version'
wait PROMPT_PRIV
mpause 200
sendln 'show inventory'
wait PROMPT_PRIV
mpause 200
sendln 'show interfaces status'
wait PROMPT_PRIV
mpause 200
sendln 'show ip interface brief'
wait PROMPT_PRIV
mpause 200
sendln 'show mac address-table'
wait PROMPT_PRIV
mpause 200
sendln 'show logging'
wait PROMPT_PRIV
mpause 2000
sendln 'show ntp associations'
wait PROMPT_PRIV
mpause 200
sendln 'show ntp status'
wait PROMPT_PRIV
mpause 200
; ==================================================
; 終了処理
; ==================================================
logclose
sendln 'exit'
pause 1
closett
end
batから渡した引数を受け取る
Tera Termマクロでは、起動時に渡された値をparam2以降で参照できます。
HOST = param2
IPAddress = param3
USER = param4
PASSWORD = param5
PURPOSE = param6
今回の対応関係は次のとおりです。
| TTL側 | bat側 | 内容 |
|---|---|---|
param2 |
HOST |
ホスト名 |
param3 |
IPADDRESS |
IPアドレス |
param4 |
USER |
ユーザー名 |
param5 |
PASSWD |
パスワード |
param6 |
PURPOSE |
機器の用途 |
param1には実行するマクロファイルのパスが入るため、ユーザー引数はparam2から取得します。
SSH接続文字列を作成する
接続先情報を連結して、Tera Termの接続文字列を作成します。
CONNECTCMD = IPAddress
strconcat CONNECTCMD ':22 /ssh /2 /auth=password /user='
strconcat CONNECTCMD USER
strconcat CONNECTCMD ' /passwd='
strconcat CONNECTCMD PASSWORD
strconcat CONNECTCMD ' /nosecuritywarning'
connect CONNECTCMD
この例では、SSH version 2とパスワード認証を使用します。
Cisco IOSのプロンプトを待つ
固定時間のpauseだけでは、機器の応答が遅い場合に次のコマンドを早く送信してしまうことがあります。
そのため、この例では各コマンドの実行後に特権EXECモードのプロンプトを待ちます。
PROMPT_PRIV = HOST
strconcat PROMPT_PRIV '#'
sendln 'show version'
wait PROMPT_PRIV
ホスト名がSW-TEST-01の場合、次のプロンプトを待ちます。
SW-TEST-01#
ホスト名と実際のプロンプトが一致しない環境では、待機文字列を調整してください。
また、mpause 200をいれることで、貼付け時間の調整を行うことができます。
特権EXECモードを前提にする理由
このサンプルでは、ログイン直後に次のようなプロンプトが表示されることを前提としています。
SW-TEST-01#
次のようにユーザーEXECモードでログインする環境では、一部のコマンドを実行できません。
SW-TEST-01>
そのため、ユーザーEXECモードを検出した場合は処理を中止します。
wait PROMPT_PRIV PROMPT_USER
if result = 2 then
messagebox '特権EXECモードではありません。privilege 15のユーザーを使用するか、enable処理を追加してください。' 'Privilege error'
end
endif
enableが必要な場合
enableが必要な環境では、ユーザーEXECモードを検出した際に、パスワード入力ダイアログを表示する方法があります。
前述の中止処理の代わりに、次のような処理を追加します。
if result = 2 then
sendln 'enable'
wait 'Password:'
passwordbox 'Enable passwordを入力してください。' 'Cisco enable'
sendln inputstr
wait PROMPT_PRIV
if result = 0 then
messagebox '特権EXECモードへ移行できませんでした。' 'Privilege error'
end
endif
endif
enableパスワードをbatやTTLへ直接記載せず、実行時に入力できます。
日付フォルダを作成する
次の処理で、マクロと同じ場所に日付フォルダを作成します。
gettime DAYDIR '%Y%m%d'
SAVEDIR = BASEDIR
strconcat SAVEDIR '\'
strconcat SAVEDIR DAYDIR
foldersearch SAVEDIR
if result = 0 then
foldercreate SAVEDIR
endif
例えば、2026年7月3日に実行した場合は、次のフォルダが作成されます。
20260703
すでに同名フォルダが存在する場合は、新しく作成しません。
ログファイル名を作成する
ログファイル名には、ホスト名、IPアドレス、取得日時を含めます。
LOGFILE = SAVEDIR
strconcat LOGFILE '\'
strconcat LOGFILE HOST
strconcat LOGFILE '_'
strconcat LOGFILE IPAddress
strconcat LOGFILE '_%Y%m%d%H%M%S.log'
gettime LOGFILE LOGFILE
出力例は次のとおりです。
SW-TEST-01_192.0.2.10_20260703120000.log
対象機器と取得日時をファイル名から判別できます。
ログの先頭へ用途を記録する
機器名やIPアドレスだけでは、機器の役割が分かりにくい場合があります。
そのため、batから渡した用途をログの先頭へ記録します。
logwrite 'Purpose: '
logwrite PURPOSE
logwrite ' '#13#10
出力例は次のとおりです。
Purpose: Floor switch
Host: SW-TEST-01
IP Address: 192.0.2.10
Create Time: 2026/07/03 12:00:00
同じ型番の機器が多数ある環境では、用途や設置場所を残しておくとログを整理しやすくなります。
実行する確認コマンド
このサンプルでは、次のコマンドを実行します。
terminal length 0
show clock
show running-config
show version
show inventory
show interfaces status
show ip interface brief
show mac address-table
show logging
show ntp associations
show ntp status
機種、IOSバージョン、ライセンス、設定内容によって、利用できるコマンドや出力形式が異なります。
例えば、機器によってはshow interfaces statusやshow inventoryを利用できない場合があります。
検証環境で実行し、対象機器に合わせて調整してください。
注意点
パスワードを平文で保存しない
この例では説明を簡単にするため、batファイルへパスワードを記載しています。
set "PASSWD=change_me"
この方法では、batファイルを閲覧できるユーザーからパスワードを確認できます。
また、コマンドライン引数として渡した値が、端末上の別プロセスなどから参照される可能性もあります。
本番環境では、次の方法を検討してください。
- 実行時にパスワードを入力する
- Tera Termのパスワード入力ダイアログを利用する
- 認証情報を別管理する
- SSH鍵認証を利用する
- batやTTLのアクセス権を制限する
公開用サンプルへ、実際のユーザー名やパスワードを記載しないようにします。
running-configには秘匿情報が含まれる
show running-configの出力には、次の情報が含まれる場合があります。
- IPアドレス
- ホスト名
- SNMP Community
- ユーザー名
- パスワードハッシュ
- 認証設定
- VPN設定
- 公開IPアドレス
- 経路情報
ログを外部へ共有するときは、内容を確認してマスキングしてください。
show loggingは出力量が多くなる場合がある
ログバッファが大きい機器では、show loggingの出力量が多くなります。
取得目的に応じて、コマンドを削除するか、必要な条件で絞り込んでください。
また、多すぎる場合はtimeoutが耐えられない場合も考えられます。
必要であれば timeout = 60など、コマンド前に許容時間を拡張することも検討ください。
ファイル名に使用できない文字を避ける
ホスト名に次の文字が含まれていると、Windowsのファイル名として使用できません。
\ / : * ? " < > |
ファイル名に利用する値は、事前に置換するか、これらの文字を含めないようにします。
プロンプトが変化する環境では調整が必要
次のような環境では、ホスト名から作成したプロンプトと実際の表示が一致しない場合があります。
- プロンプトを独自設定している
- ホスト名にドメイン名が表示される
- コンソールサーバーを経由している
- 実行中にコンフィグレーションモードへ移行する
- Stack構成などで表示形式が異なる
対象環境に合わせて、waitで待つ文字列を調整してください。
まとめ
batファイルからTera Termマクロへ接続先情報を渡すことで、次の処理を自動化できます。
- Cisco IOS機器へのSSH接続
- 状態確認コマンドの実行
- 日付フォルダの作成
- ホスト名、IPアドレス、取得日時を含むログ保存
- ログ先頭への用途記録
機器ごとにbatファイルを用意すれば、ダブルクリックで状態確認ログを取得できます。
ただし、パスワードの平文保存や、running-configに含まれる秘匿情報には注意が必要です。
まずは検証環境で動作を確認し、対象機器のプロンプトやコマンドに合わせて調整してください。