サーバのバッチプログラムのテストをする必要があるが、整った自動テスト環境はない。
さらに、どのようなコマンドを実行した結果どうなったかという証跡が求められる…という環境にいるとします。
手動でコマンド叩いて、ログディレクトリまでログファイルを見にいって、実行結果をコピーして証跡として保存して…。
でも全て手動だと再実行も面倒。ある程度自動化したいところです。
TeraTermマクロを使う
サーバを操作する際に使われるターミナルソフトは色々ありますが、特によく使われるのがTeraTermだと思います。
TeraTermにはマクロ機能があり、サーバへの接続・ログの記録・コマンドの実行・切断まで一通り行うことができます。
TeraTermのログには、実行した全ての操作が記録されるので、そのまま証跡としても使えます。
サーバへの接続
connect '192.168.0.30:22 /ssh /auth=password /user=srvusr /passwd=srvpass'
connect
で接続先・ログインユーザ・パスワードを指定します。telnet接続の場合は/nossh
を指定します。
ログの記録
logopen ログファイルパス 0 0
logopen
でログの記録を開始します。ログファイルパスはフルパス指定の方がよいです。(ファイル名だけだと既定のディレクトリに出力される)
後ろの数字は、1つ目がバイナリフラグ、2つ目が追記フラグです:
- バイナリフラグ(0: 改行など特殊文字を出力しない 1: 全て出力)
- 追記フラグ(0: 既にファイルがあれば上書き 1: 既にファイルがあれば追記)
logclose
でログの記録を終了します。
コマンドの実行
sendln 'cat /home/hoge/result.txt'
sendln
の後ろのシングルクォートで囲んだコマンドが実行されます。
ただ、TeraTermはあくまでコマンドを送っているだけなので、前のコマンドが終了したかどうか関係なく送ります。
コマンドが終わったかどうかは判定できませんが、wait
で特定の文字が表示されるまで待つことができるので、プロンプトの記号が表示されたらコマンドが終了したことにする、という方法が使えます。
sendln 'cat /home/hoge/result.txt'
wait '$'
ログの記録と合わせて使う場合は、もう一工夫必要です。コマンドの実行が早すぎると、ログにうまく出力できない場合があります。(コマンドの実行順と結果出力順がおかしくなる、等)
そのため、ログを綺麗にとる場合はmpause
で数秒コマンド送信を遅らせるとよいです。
sendln 'cat /home/hoge/result.txt'
mpause 500
wait '$'
mpause
はミリ秒指定です。秒指定のpause
もあります。
切断
sendln 'exit'
exit
通常通り、ログインシェルを終了すればターミナルも終了します。
マクロ側のexit
でマクロを終了します。
変数の使用
hoge = 'value'
TeraTermマクロでは変数を使用できます。
変数は各コマンドの引数に使えるので、mpause
の待ち時間指定を変数にしておくと便利です。
この変数は直接サーバでは使えませんが、シェルの変数として設定すればコマンドの内容も可変にできます。
target_pg = 'testbatch.sh'
sprintf2 cmd_setvar 'TARGET_PG=%s' target_pg
sendln cmd_setvar
sprintf2
でフォーマットした文字列を変数に設定します。
ここではTARGET_PG=testbatch.sh
という文字列をcmd_setvar
というマクロ変数に入れ、それをコマンドとして実行しています。
マクロの分割
全てのコマンドを1つのファイルに含めてもいいですが、マクロ変数の定義などは別のファイルとして切り離した方が使いやすいです。
include
で他のマクロファイルを実行できます。
include '.\variables.ttl'
サンプル
ちなみに、先頭が;
の行はコメントになります。
; 変数の設定
ptime = 500
exit
; マクロ変数読み込み
include '.\variables.ttl'
; 接続
connect '192.168.0.30:22 /ssh /auth=password /user=srvusr /passwd=srvpass'
wait '$'
; ログ開始
logopen 'C:\Users\noraplant42\log\test.log' 0 0
; 対象プログラム設定
target_pg = 'testbatch.sh'
sprintf2 cmd_setvar 'TARGET_PG=%s' target_pg
sendln cmd_setvar
mpause ptime
wait '$'
; 対象プログラム実行
sendln '/home/hoge/$TARGET_PG'
mpause ptime
wait '$
; 実行結果確認
sendln 'cat /home/hoge/result.txt'
mpause ptime
wait '$
; ログ終了
logclose
; 切断とマクロ終了
sendln 'exit'
exit
ttpmacro.exe
の引数にファイルを指定して実行します。
ttpmacro.exe C:\Users\noraplant42\test.ttl
注意点
私の環境では、マクロを書いたファイルの文字コードをSJISにしないと、マクロ実行時にエラーになってしまいました。
コメント等に日本語を含む場合はSJISで書くといいかもしれません。