0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tera Termマクロをbatから引数付きで起動し、NW機器の状態確認ログを自動保存する

0
Posted at

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 statusshow 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に含まれる秘匿情報には注意が必要です。

まずは検証環境で動作を確認し、対象機器のプロンプトやコマンドに合わせて調整してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?