CSVに書いた複数のFortigateへ順番にSSHログインし、テキストファイルに書いたコマンドを実行して、ホスト名_日付.txt でログを保存するマクロです。そのままコピーして使えます。
このマクロができること
connect.csvから機器情報を読み込む- 読み込んだ情報でSSH接続する
- ログ取得を開始する(ファイル名は
ホスト名_日付.txt) command.txtからコマンドを読み込む- コマンドを順に実行する
- ログを終了する
- 切断して次の機器へ進む
- 全機器が終わったら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
使い方
- 上のコードをコピーして
fortigate_log.ttlという名前で保存する - 同じフォルダに
connect.csvとcommand.txtを作る .ttlファイルをダブルクリックする(TeraTermのttpmacro.exeに関連付けられている必要があります)
ログはマクロと同じフォルダに Test-FW01_20210603.txt の形式で出力されます。
動かないときの確認ポイント
| 症状 | 原因と対処 |
|---|---|
| 接続エラーになる | IPアドレス、ユーザ名、パスワードを確認。pause 2 を pause 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