背景
業務の中で複数機器の設定値をまとめて取得したい機会があったので、久々にTeraTermマクロを使って対応してみました。今回作成したマクロベースでTeraTermマクロでのCSVファイルの読み込み/ファイル書き出しを含め、基本的な記述方法をまとめておこうと思います。
利用したもの
- TeraTerm
- CSVファイル ※以下が内容のイメージ
HOSTNAME | HOSTADDR | USERNAME | PASSWORD |
---|---|---|---|
ホスト名① | ホストIP① | ユーザ名① | パスワード① |
ホスト名② | ホストIP② | ユーザ名② | パスワード② |
・・・ | ・・・ | ・・・ | ・・・ |
プログラム
CSVファイルに記載された複数機器の情報をもとに、各装置へログインし、コンフィグを取得するための汎用的なソースコードを以下に記載します。
- TeraTermマクロ
;-----------------------------------
;変数設定
;-----------------------------------
LOGDIR = 'C:\Users\...\...\config' ;ログ保存先ディレクトリ
csvfile = 'C:\Users\...\...\target.csv' ;対象装置情報一覧CSVファイル
timeout = 30 ;waitタイムアウト値
separator = ',' ;CSV区切り文字
fileopen fh csvfile 0 0 ;CSVファイルを開く
i = 0
while 1
i = i+1 :何行目の処理かiで管理
filereadln fh buf ;現在の行の内容をbufに格納して、行を進める
if result then ;空行ならループを抜ける(1行上の処理で値が取得できたかresultに結果が自動で入る)
break
endif
if i <= 1 then ;1行目は見出し行なのでスキップ
continue
endif
;-----------------------------------
;接続先情報取得
;-----------------------------------
strsplit buf separator ;bufから各変数の値を格納
HOSTNAME = groupmatchstr1
HOSTADDR = groupmatchstr2
USERNAME = groupmatchstr3
PASSWORD = groupmatchstr4
;-----------------------------------
;SSHログイン
;-----------------------------------
COMMAND = 'ssh ' ;ログインコマンド作成
strconcat COMMAND USERNAME
strconcat COMMAND '@'
strconcat COMMAND HOSTADDR
sendln COMMAND ;SSHログインコマンド実行
wait 'password:'
if result=0 then ;waitがtimeoutなら現在のターゲットの処理をスキップ
continue
endif
sendln PASSWORD
wait '$' ;プロンプトが表示されるまで待機
;-----------------------------------
;ファイル出力
;-----------------------------------
;出力ファイル作成
getdate DATESTR '%y%m%d' ;現在日時を取得
LOGFILE = LOGDIR ;ログファイル名作成
strconcat LOGFILE '\'
strconcat LOGFILE HOSTNAME
strconcat LOGFILE '_'
strconcat LOGFILE DATESTR
strconcat LOGFILE '.conf'
;ファイル出力開始
logautoclosemode 1
logopen LOGFILE 0 0 ;上書きで出力ファイルを開く
;-----------------------------------
;コマンド実行
;-----------------------------------
sendln '<ホスト名を出力するコマンド>' ;ホスト名を出力
wait '$'
sendln '<コンフィグを出力するコマンド>' ;コンフィグを出力 ※moreなどの対策に必要に応じて"terminal length 0"のようなコマンドも設定するとよい
wait '$'
;-----------------------------------
;マクロ終了
;-----------------------------------
logclose ;ログ記録終了
pause 2
sendln 'exit'
pause 2 ;待機時間を設定しておかないと、ログアウト前に次の処理が走ってしまうことがあるので注意
endwhile
fileclose fh ;CSVファイルを閉じる
end ;マクロを終了
工夫点
ソースコードは汎用的に作成したので別の機会にも使い回しし易い
終わりに
多数の操作対象に対して自動的に操作することにTeraTermマクロは便利なので、汎用的なコードを用意しておいて、今後も都度利用していきたいです。