目次
動作確認環境
- Tera Term Version 4.104
マクロ概要
ネットワーク作業では、事前・事後ログ、正常性確認ログとして、複数の状態確認コマンドのログを取得する必要がある。このマクロを使用することで、Cisco 機器(一般的なスイッチ・ルータ・ファイアウォール)にログインした上で設定されたコマンドを実行しログを保存することができる。
動作内容
- Cisco 機器にログインした上でログ保存を開始し、設定されたコマンドを実行してログアウトまで行う
- 必要に応じて1つまで踏み台を経由してログインすることも可能
- 踏み台は Cisco 機器(一般的なスイッチ・ルータ)であることを前提とする
- リモート接続プロトコルとしては Telnet と SSH に対応
- Telnet の認証方式としてはユーザ認証とパスワード認証に対応
- SSH の認証方式としてはユーザパスワード認証のみに対応
- 対象機器にログイン後、特権EXECモードに移行した上でログ保存を開始しコマンド実行する
- 実行コマンドはデフォルトでは 30 個まで指定可能。必要に応じて増やすことも可能
マクロテキスト
;;*********************************************************
;; Title: Cisco 機器にログインしコマンドログを取得するマクロ
;; 作成元: https://teramacro.com/
;; 説明ページ: https://teramacro.com/macro-ciscogetcmdlog/
;;*********************************************************
;;================================================
;; (1)変数定義パート(マクロユーザ編集箇所)
;; ※使わない変数でも記述を削除しないこと
;;================================================
; 接続先機器情報
hostname_target = 'ホスト名'
address_target = 'IPアドレス'
username_target = 'ログイン用ユーザ名'
userpass_target = 'ログイン用ユーザパスワード'
vtypass_target = 'ログイン用VTYパスワード'
enablepass_target = 'enableパスワード'
connectprotocol_target = '接続プロトコル' ;Telnetなら「telnet」SSHなら「ssh」とする
; 踏み台機器情報 ※踏み台が必要ない場合は「hostname_bastion = ''」とする
hostname_bastion = 'ホスト名' ;空文字列('')にすると踏み台を使用しない
address_bastion = 'IPアドレス'
username_bastion = 'ログイン用ユーザ名'
userpass_bastion = 'ログイン用ユーザパスワード'
vtypass_bastion = 'ログイン用VTYパスワード'
enablepass_bastion = 'enableパスワード'
connectprotocol_bastion = '接続プロトコル' ;Telnetなら「telnet」SSHなら「ssh」とする
; 実行コマンド設定
cmdNumber = 30 ;コマンド数上限
strdim cmdList cmdNumber ;コマンドを格納する配列。以下に要素数を上限に実行コマンドを記述する
cmdList[0] = 'terminal length 0' ;ここはページャ無効化コマンドにすること ASA の場合は「ter pa 0」にする
cmdList[1] = '実行コマンド(必要分だけ以下にも記載)'
cmdList[2] = ''
cmdList[3] = ''
cmdList[4] = ''
cmdList[5] = ''
cmdList[6] = ''
cmdList[7] = ''
cmdList[8] = ''
cmdList[9] = ''
cmdList[10] = ''
cmdList[11] = ''
cmdList[12] = ''
cmdList[13] = ''
cmdList[14] = ''
cmdList[15] = ''
cmdList[16] = ''
cmdList[17] = ''
cmdList[18] = ''
cmdList[19] = ''
cmdList[20] = ''
cmdList[21] = ''
cmdList[22] = ''
cmdList[23] = ''
cmdList[24] = ''
cmdList[25] = ''
cmdList[26] = ''
cmdList[27] = ''
cmdList[28] = ''
cmdList[29] = ''
; ログ保存設定
logfolder = '作業ログ' ;ログファイル保存先フォルダ名
logfilename = hostname_target ;ログファイル名
datetime_flag = 1 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない
;;================================================
;; (2)メイン処理パート
;; ※ここから下は編集しないこと
;;================================================
strcompare hostname_bastion ''
;;-----------------------------------------
; 踏み台を使用する場合の処理
;;-----------------------------------------
if result <> 0 then
;;-----------------------------------------
; 踏み台機器にログイン
;;-----------------------------------------
; ログイン処理
address = address_bastion
username = username_bastion
userpass = userpass_bastion
vtypass = vtypass_bastion
connect_protocol = connectprotocol_bastion
call LoginTelnetOrSSH
; 特権EXECモードに移行
enablepass = enablepass_bastion
sprintf2 prompt_user '^%s.*>' hostname_bastion
sprintf2 prompt_privilege '^%s.*#' hostname_bastion
call BecomePrivilege
;;-----------------------------------------
; 踏み台から対象機器にログイン
;;-----------------------------------------
; ログイン処理
address = address_target
username = username_target
userpass = userpass_target
vtypass = vtypass_target
connect_protocol = connectprotocol_target
call LoginTelnetOrSSHToCisco
else
;;-----------------------------------------
; 踏み台を使用しない場合の処理
;;-----------------------------------------
; 対象機器へのログイン処理
address = address_target
username = username_target
userpass = userpass_target
vtypass = vtypass_target
connect_protocol = connectprotocol_target
call LoginTelnetOrSSH
endif
;;-----------------------------------------
; 対象機器にて特権EXECモードに移行
;;-----------------------------------------
enablepass = enablepass_target
sprintf2 prompt_user '^%s.*>' hostname_target
sprintf2 prompt_privilege '^%s.*#' hostname_target
call BecomePrivilege
;;-----------------------------------------
; ログ保存開始
;;-----------------------------------------
call StartLogging
;;-----------------------------------------
; コマンド実行
;;-----------------------------------------
call ExecuteCommand
;;-----------------------------------------
; ログアウト
;;-----------------------------------------
sendln 'exit'
strcompare hostname_bastion ''
if result <> 0 then
sprintf2 prompt_privilege '^%s.*#' hostname_bastion
sendln
waitregex prompt_privilege
sendln 'exit'
endif
;;-----------------------------------------
; メイン処理終了
;;-----------------------------------------
end
;;================================================
;; (3)サブルーチンパート
;;================================================
;;-----------------------------------------
;;◆LoginTelnetOrSSH: Cisco 機器に Telnet または SSH でログインする
;; 変数:
;; - connect_protocol : 接続プロトコル
;; - telnet ⇒ サブルーチン TelnetLogin を呼び出す
;; - ssh ⇒ サブルーチン SSHLogin を呼び出す
;; - その他 ⇒ エラーとしてマクロを停止する
;;-----------------------------------------
:LoginTelnetOrSSH
error_flag = 1
strcompare connect_protocol 'ssh'
if result = 0 then
call SSHLogin
error_flag = 0
endif
strcompare connect_protocol 'telnet'
if result = 0 then
call TelnetLogin
error_flag = 0
endif
if error_flag = 1 then
messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
end
endif
return
;;-----------------------------------------
;;◆TelnetLogin: Cisco 機器に Telnet ログインする
;; 変数:
;; - address : IPアドレス
;; - username : ログインユーザ名
;; - userpass : ログインユーザパスワード
;; - vtypass : VTYパスワード
;;-----------------------------------------
:TelnetLogin
sprintf2 connectCommand '%s:23 /nossh /T=1' address
connect connectCommand
wait 'Username:' 'Password:'
if result = 1 then
sendln username
wait 'Password:'
sendln userpass
elseif result = 2 then
sendln vtypass
endif
return
;;-----------------------------------------
;;◆SSHLogin: SSHログインを行う
;; 変数:
;; - address : IPアドレス
;; - username : ログインユーザ名
;; - userpass : ログインユーザパスワード
;;-----------------------------------------
:SSHLogin
sprintf2 connectCommand '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect connectCommand
return
;;-----------------------------------------
;;◆BecomePrivilege: Cisco 機器で特権EXECモードに移行する
;; 変数:
;; - prompt_user : ユーザEXECモードのプロンプトを示す正規表現
;; - prompt_privilege : 特権EXECモードのプロンプトを示す正規表現
;; - enablepass : Enableパスワード
;;-----------------------------------------
:BecomePrivilege
flushrecv
sendln
waitregex prompt_user prompt_privilege
if result = 1 then
flushrecv
sendln 'enable'
wait 'Password:'
flushrecv
sendln enablepass
endif
return
;;-----------------------------------------
;;◆LoginTelnetOrSSHToCisco: Cisco 機器から Cisco 機器へ Telnet または SSH でログインする
;; 変数:
;; - connect_protocol : 接続プロトコル
;; - telnet ⇒ サブルーチン TelnetToCisco を呼び出す
;; - ssh ⇒ サブルーチン SSHToCisco を呼び出す
;; - その他 ⇒ エラーとしてマクロを停止する
;;-----------------------------------------
:LoginTelnetOrSSHToCisco
error_flag = 1
strcompare connect_protocol 'ssh'
if result = 0 then
call SSHToCisco
error_flag = 0
endif
strcompare connect_protocol 'telnet'
if result = 0 then
call TelnetToCisco
error_flag = 0
endif
if error_flag = 1 then
messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
end
endif
return
;;-----------------------------------------
;;◆TelnetToCisco: Cisco 機器から Cisco 機器へ Telnet 接続する
;; 変数:
;; - address : Telnet接続先のIPアドレス
;; - username : Telnetログインユーザ名
;; - userpass : Telnetログインユーザパスワード
;; - vtypass : Telnetログイン用VTYパスワード
;;-----------------------------------------
:TelnetToCisco
sprintf2 telnetCommand 'telnet %s' address
sendln telnetCommand
wait 'Username' 'Password:'
if result = 1 then
sendln username
wait 'Password:'
sendln userpass
elseif result = 2 then
sendln vtypass
endif
return
;;-----------------------------------------
;;◆SSHToCisco: Cisco 機器から Cisco 機器へ SSH 接続する
;; 変数:
;; - address : SSH接続先のIPアドレス
;; - username : SSHログインユーザ名
;; - userpass : SSHログインユーザパスワード
;;-----------------------------------------
:SSHToCisco
sprintf2 sshCommand 'ssh -l %s %s' username address
sendln sshCommand
wait 'Password:'
sendln userpass
return
;;-----------------------------------------
;;◆StartLogging: ログ保存を開始する
;; 変数:
;; - logfolder : ログ保存先フォルダ名 ※1階層のみ対応
;; - logfilename : ログファイル名
;; - datetime_flag : 「_%Y%m%d-%H%M%S」形式の日付時刻をログファイル名に付与するかどうか
;; 1 ⇒ 日付時刻を付与する
;; 1以外 ⇒ 日付時刻を付与しない
;;-----------------------------------------
:StartLogging
loginfo logfilename_temp
if result <> -1 logclose
getdir logfilepath
ifdefined logfolder
if result > 0 then
strcompare logfolder ''
if result <> 0 then
foldersearch logfolder
if result = 0 foldercreate logfolder
sprintf2 logfilepath '%s\%s' logfilepath logfolder
endif
endif
sprintf2 logfilepath '%s\%s' logfilepath logfilename
ifdefined datetime_flag
if result > 0 then
if datetime_flag = 1 then
gettime timestr '_%Y%m%d-%H%M%S'
strconcat logfilepath timestr
endif
endif
strconcat logfilepath '.log'
logopen logfilepath 0 0
return
;;-----------------------------------------
;;◆ExecuteCommand: Cisco 機器でコマンドを実行する
;; 変数:
;; - cmdNumber : 実行コマンドの数
;; - cmdList : 実行コマンドを格納した配列
;; - prompt_privilege : 特権EXECモードのプロンプトを示す正規表現
;;-----------------------------------------
:ExecuteCommand
for i 0 (cmdNumber - 1)
command = cmdList[i]
strcompare cmdList[i] ''
if result = 0 continue
flushrecv
sendln
waitregex prompt_privilege
flushrecv
sendln command
waitregex prompt_privilege
next
return
使い方
- 上記のマクロテキストをコピーしてテキストファイルに貼り付け、拡張子を「.ttl」として保存する
- マクロテキスト内の上部にある「(1)変数定義パート(マクロユーザ編集箇所)」内の変数の値を接続対象機器に合わせて変更して保存する
- マクロユーザが編集するべき設定項目は以下の通り
セクション | 項目(変数名) | 説明 | 備考 |
---|---|---|---|
接続先機器情報 | hostname_target | 接続先機器のホスト名 | 設定必須 |
address_target | 接続先機器のIPアドレス | 設定必須 | |
username_target | 接続先機器のログインユーザ名 | telnet でユーザ認証の場合、ssh の場合は設定 | |
userpass_target | 接続先機器のログインユーザパスワード | telnet でユーザ認証の場合、ssh の場合は設定 | |
vtypass_target | 接続先機器のログイン用VTYパスワード | telnet でパスワード認証の場合は設定 | |
enablepass_target | 接続先機器のenableパスワード | 設定必須 | |
connectprotocol_target | 接続先機器への接続プロトコル | 「telnet」か「ssh」を指定 | |
踏み台機器情報 | hostname_bastion | 踏み台機器のホスト名 | 設定必須 踏み台を使用しない場合は空文字列('')にする |
address_bastion | 踏み台機器のIPアドレス | 設定必須 | |
username_bastion | 踏み台機器のログインユーザ名 | telnet でユーザ認証の場合、ssh の場合は設定 | |
userpass_bastion | 踏み台機器のログインユーザパスワード | telnet でユーザ認証の場合、ssh の場合は設定 | |
vtypass_bastion | 踏み台機器のログイン用VTYパスワード | telnet でパスワード認証の場合は設定 | |
enablepass_bastion | 踏み台機器のenableパスワード | 設定必須 | |
connectprotocol_bastion | 踏み台機器への接続プロトコル | 「telnet」か「ssh」を指定 | |
実行コマンド設定 | cmdNumber | 実行コマンド数 | 配列の定義にて要素数として使用される |
cmdList | 実行コマンドを格納する配列 | 要素数として cmdNumber を使用する | |
cmdList[0]~ cmdList[cmdNumber-1] | 各実行コマンドを格納する配列要素 | cmdNumber をデフォルトから増やした場合は要素の定義を手動で追加する 値が空文字列の場合、無視される ページャ無効化コマンド(ter len 0)必須のため cmdList[0] は変えないこと | |
ログ保存設定 | logfolder | ログ保存先フォルダ名 | マクロファイル格納フォルダ内に指定した名前のフォルダが作成される |
logfilename | ログファイル名 | logfolder で指定したフォルダ内に保存される | |
datetime_flag | ログファイル名の末尾に日付時刻情報を付与するかどうか | 1 ⇒ 付与する 0 ⇒ 付与しない |
- 設定ができたらマクロファイルを保存する。マクロファイルをダブルクリックしてマクロを実行する
- 拡張子「.ttl」へのアプリの紐づけを実施していない場合はこちらの記事参照
設定例
接続機器情報、踏み台機器情報
- 踏み台を使用する場合
- 踏み台機器は VTY パスワード認証による Telnet 接続
- 接続先機器は SSH 接続
; 接続先機器情報
hostname_target = 'MyRouter01'
address_target = '10.1.1.1'
username_target = 'admin'
userpass_target = 'adminpass'
vtypass_target = ''
enablepass_target = 'admin'
connectprotocol_target = 'ssh' ;Telnetなら「telnet」SSHなら「ssh」とする
; 踏み台機器情報
hostname_bastion = 'MyRouter02'
address_bastion = '10.1.1.2'
username_bastion = ''
userpass_bastion = ''
vtypass_bastion = 'vtypass'
enablepass_bastion = 'admin'
connectprotocol_bastion = 'telnet' ;Telnetなら「telnet」SSHなら「ssh」とする
- 踏み台を使用しない場合
- 接続先機器は SSH 接続
; 接続先機器情報
hostname_target = 'MyRouter01'
address_target = '10.1.1.1'
username_target = 'admin'
userpass_target = 'adminpass'
vtypass_target = ''
enablepass_target = 'admin'
connectprotocol_target = 'ssh' ;Telnetなら「telnet」SSHなら「ssh」とする
; 踏み台機器情報
hostname_bastion = ''
address_bastion = ''
username_bastion = ''
userpass_bastion = ''
vtypass_bastion = ''
enablepass_bastion = ''
connectprotocol_bastion = '' ;Telnetなら「telnet」SSHなら「ssh」とする
実行コマンド設定
- 実行コマンドを 10 個まで指定する場合
; 実行コマンド設定
cmdNumber = 30 ;コマンド数上限
strdim cmdList cmdNumber ;コマンドを格納する配列。以下に要素数を上限に実行コマンドを記述する
cmdList[0] = 'terminal length 0'
cmdList[1] = 'show clock'
cmdList[2] = 'show version'
cmdList[3] = 'show flash:'
cmdList[4] = 'show inventory'
cmdList[5] = 'show running-config'
cmdList[6] = 'show startup-config'
cmdList[7] = 'show ip interface brief'
cmdList[8] = 'show interfaces'
cmdList[9] = 'show log'
cmdList[10] = ''
cmdList[11] = ''
cmdList[12] = ''
cmdList[13] = ''
cmdList[14] = ''
cmdList[15] = ''
cmdList[16] = ''
cmdList[17] = ''
cmdList[18] = ''
cmdList[19] = ''
cmdList[20] = ''
cmdList[21] = ''
cmdList[22] = ''
cmdList[23] = ''
cmdList[24] = ''
cmdList[25] = ''
cmdList[26] = ''
cmdList[27] = ''
cmdList[28] = ''
cmdList[29] = ''
- 実行コマンド数を増やす場合
; cmdNumber の値を増やす
cmdNumber = 40
; cmdNumber の値を増やした分、cmdListの要素の記述を増やす
cmdList[30] = 'コマンドを記載'
cmdList[31] = 'コマンドを記載'
cmdList[32] = 'コマンドを記載'
cmdList[33] = 'コマンドを記載'
cmdList[34] = 'コマンドを記載'
cmdList[35] = 'コマンドを記載'
cmdList[36] = 'コマンドを記載'
cmdList[37] = 'コマンドを記載'
cmdList[38] = 'コマンドを記載'
cmdList[39] = 'コマンドを記載'
ログ保存設定
- デフォルトの場合
- 「作業ログ」フォルダに保存
- ファイル名は「<対象機器ホスト名>_yyyymmdd-hhmmss.log」
; ログ保存設定
logfolder = '作業ログ' ;ログファイル保存先フォルダ名
logfilename = hostname_target ;ログファイル名
datetime_flag = 1 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない
- ファイル名に日付時刻を付与しない場合
datetime_flag = 0 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない
関連
不具合報告先
- https://teramacro.com/contact/
- 本記事のコメント ※ページ下部
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
【整備済み品】HP ノートパソコン 830G5/13.3型フルHD/Win 11/MS Office H&B 2019/第7世代i5-7200U 2.50GHz/メモリ 16GB/SSD 512GB/指紋リーダー/USB 3.0/WEBカメラ/初期設定済
コメント