背景など
ネットワークストレージのディスク容量を毎月取る必要に迫られたものの、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
とか案外面倒だと分かりました。