マクロは陰で使うもの。生産性を上げても給料は上がらず仕事が増えるだけなので仕事をサボろう!

Cisco 機器にログインしコマンドログを取得する Tera Term マクロの共有

目次

動作確認環境

  • 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⇒付与しない

関連

不具合報告先


Tera Term マクロ関連記事リスト


Amazon で買えるおすすめアイテム(アフィリエイト)

ブログ始めるなら 【アフィリエイトリンク】

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次