ネットワーク

【完成版】Teratermマクロで複数のFortigateに一括ログインしログ取得する

CSVに書いた複数のFortigateへ順番にSSHログインし、テキストファイルに書いたコマンドを実行して、ホスト名_日付.txt でログを保存するマクロです。そのままコピーして使えます。

このマクロができること

  1. connect.csv から機器情報を読み込む
  2. 読み込んだ情報でSSH接続する
  3. ログ取得を開始する(ファイル名は ホスト名_日付.txt
  4. command.txt からコマンドを読み込む
  5. コマンドを順に実行する
  6. ログを終了する
  7. 切断して次の機器へ進む
  8. 全機器が終わったらTeraTermを終了する

ファイル構成

3つのファイルを同じフォルダに置きます。

fortigate_log.ttl   ← このマクロ
connect.csv         ← 接続先の一覧
command.txt         ← 投入するコマンド

connect.csv

Test-FW01,192.168.101.220,test-user,test-password
Test-FW02,192.168.101.221,test-user,test-password

「ホスト名, IPアドレス, ユーザ名, パスワード」の順です。

command.txt

get system status
get system performance status
diagnose sys session stat
get router info routing-table all

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

マクロ本体

;=========================================================
; 複数Fortigate 一括ログ取得マクロ
;=========================================================

messagebox "開始します" "確認"

;---------------------------------------------------------
; 1. 接続先CSVを開く
;---------------------------------------------------------
csvfile = 'connect.csv'
separator = ','

getdir Dir
csvfile_path = ''
strconcat csvfile_path Dir
strconcat csvfile_path '\'
strconcat csvfile_path csvfile

fileopen fh csvfile_path 0 1

;---------------------------------------------------------
; 機器ごとのループ
;---------------------------------------------------------
while 1

  IP = ''
  USER = ''
  PASSWD = ''
  HOSTNAME = ''

  ; CSVを1行読み込む。末尾ならループ終了
  filereadln fh buf
  if result then
    break
  endif

  ; カンマで分割
  strsplit buf separator
  if result <> 4 then
    messagebox "CSVの形式が不正です" "エラー"
    continue
  endif

  HOSTNAME = groupmatchstr1
  IP       = groupmatchstr2
  USER     = groupmatchstr3
  PASSWD   = groupmatchstr4

  ; プロンプトを組み立てる
  EnPrompt = ''
  strconcat EnPrompt HOSTNAME
  strconcat EnPrompt ' #'

  ;-------------------------------------------------------
  ; 2. SSH接続
  ;-------------------------------------------------------
  sprintf2 conbuf '%s:22 /ssh /auth=password /user=%s /passwd=%s /timeout=10' IP USER PASSWD
  connect conbuf

  testlink
  pause 2
  if result <> 2 then
    sprintf2 errmsg '%s への接続に失敗しました' HOSTNAME
    messagebox errmsg "接続エラー"
    continue
  endif

  wait EnPrompt

  ;-------------------------------------------------------
  ; 3. ログ取得を開始(ホスト名_日付.txt)
  ;-------------------------------------------------------
  getdir MacroPath
  getdate TodayStr "%Y%m%d"
  sprintf2 LogName '%s_%s.txt' HOSTNAME TodayStr
  makepath LogFilePath MacroPath LogName

  ; 0=テキストモード / 1=追記
  logopen LogFilePath 0 1

  ;-------------------------------------------------------
  ; ページャを無効化(これがないと --More-- で止まる)
  ;-------------------------------------------------------
  sendln 'config system console'
  wait '#'
  sendln 'set output standard'
  wait '#'
  sendln 'end'
  wait EnPrompt

  ;-------------------------------------------------------
  ; 4-5. command.txt を読み込んで順に実行
  ;-------------------------------------------------------
  command_file_path = ''
  strconcat command_file_path Dir
  strconcat command_file_path '\command.txt'

  fileopen fh2 command_file_path 0 1

  timeout = 30

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

  :breakloop

  fileclose fh2

  ;-------------------------------------------------------
  ; 6. ログ終了
  ;-------------------------------------------------------
  logclose

  ;-------------------------------------------------------
  ; 7. 切断して次の機器へ
  ;-------------------------------------------------------
  sendln 'exit'
  pause 1
  disconnect 0
  pause 1

endwhile

fileclose fh

messagebox "全機器の処理が完了しました" "完了"

;---------------------------------------------------------
; 8. TeraTermを終了してマクロ終了
;---------------------------------------------------------
closett
end

使い方

  1. 上のコードをコピーして fortigate_log.ttl という名前で保存する
  2. 同じフォルダに connect.csvcommand.txt を作る
  3. .ttl ファイルをダブルクリックする(TeraTermの ttpmacro.exe に関連付けられている必要があります)

ログはマクロと同じフォルダに Test-FW01_20210603.txt の形式で出力されます。

動かないときの確認ポイント

症状 原因と対処
接続エラーになる IPアドレス、ユーザ名、パスワードを確認。pause 2pause 5 に増やす
途中で止まる ページャが無効化できていない。プロンプト待ちの文字列が実機と違う
ログが空になる wait EnPrompt のプロンプト文字列が実機と一致していない
2台目以降が失敗する disconnect 0 が効いていない。pause を長くする
CSVの最終行でエラー CSV末尾に空行がないか確認する

プロンプトの文字列は機種やバージョンで異なります。Fortigateは Test-FW01 # のようにホスト名と # の間に半角スペースが入ります。実機で1回手動接続し、表示されるプロンプトをそのまま EnPrompt に設定してください。

セキュリティ上の注意

connect.csv には管理者パスワードが平文で入ります。以下を守ってください。

  • 共有フォルダやGit、クラウドストレージに置かない
  • 作業終了後はCSVを削除する
  • 可能であれば公開鍵認証に切り替える
  • パスワードを毎回入力させるなら passwordbox を使う
passwordbox 'パスワードを入力してください' '一括接続'
PASSWD = inputstr

Cisco機器で使う場合

ページャ無効化の部分を差し替えれば、Cisco IOSでも同じ構成で動きます。

sendln 'terminal length 0'
wait EnPrompt

enable が必要な場合は、接続直後に以下を追加してください。

sendln 'enable'
wait 'Password:'
sendln ENPASSWD
wait EnPrompt

関連記事

-ネットワーク