背景など
ネットワークストレージのディスク容量を毎月取る必要に迫られたものの、windows のバッチファイルで telnet など使えないため手作業でログ取りをしています。
teraterm マクロをタスクスケジューラに仕込めば簡単になると聞いて、teraterm マクロについて調べてみました。
teraterm マクロの実行方法
実行ファイル ttpmacro.exe の引数に、マクロを記述したファイルを与えることで実行できます。
具体的には以下のような設定になります(タスクにそのまま登録しても良いですが)。
"C:\Program Files\teraterm-4.78\ttpmacro.exe" /V "C:\scripts\teraterm\get_disk.ttl"
マクロを記述したファイルの拡張子は ttl が使われることが多いようです。
注意するべき点として、普段使用している ttermpro.exe との混同があります。マクロの実行には ttermpro.exe ではなく ttpmacro.exe を使います。
マクロ
inputstr と result はシステム変数であり、strscan や recvln を実行すると値が書き換えられます。
df -k を送信すると、結果が複数行で返ってくるのでプロンプト $ が見つかるまで recvln を繰り返しています。
送信したコマンドの結果に $ が含まれる場合、この方法では全ての結果を取得できません。
; 変数の定義
timeout=2 ; 2 秒でタイムアウト
servername='hoge'
ipaddr='192.168.XXX.ZZZ'
port='23'
username='user'
password='pass'
filename='Disk_'
logdir='C:\Temp'
; 変数の加工・構築
strconcat filename servername
strconcat ipaddr ':'
strconcat ipaddr port
strconcat ipaddr ' /nossh /T=1'
; 接続開始 ログイン
connect ipaddr
wait ':'
sendln username
wait ':'
sendln password
; コマンド結果の記録開始
changedir logdir
fileopen handle filename 0; 上書きモード
setsync 1 ; 同期モードの開始
wait '$' ; プロンプトが返ってくるのを待つ
sendln 'df -k';
recvln; エコーバックの読み捨て
result=1
recvln
strscan inputstr '$'
while result=0
filewriteln handle inputstr
recvln
strscan inputstr '$'
endwhile
setsync 0
sendln 'exit'
所感
泥臭い感じですね。batファイルと良い勝負してると思います。
system.net.sockets.tcpclient などで telnet を使ってみると wait とか案外面倒だと分かりました。