
やること
死活監視のために、あるサーバ(運用サーバ)から複数の機器へPing(Test-Connectionコマンドレットを使用)を実行していたのですが、なぜか稼働中なのにPingが通らない(タイムアウトになる)サーバがありました。
ん?と思い調べてみたところ、ルータ側でPingを発行している運用サーバがあるセグメントからの通信を通らないようにしていました。
確かに、通常は運用サーバがあるセグメントからアクセスする必要はないサーバなので、セキュリティを考えると止めるのが正解なので、単純に通るようにするわけにもいきません(とうかルータの設定変更が面倒)。
どうしようか悩んでいたんですが、ふと閃きました。
対象の機器に通信が通るサーバーにTeraTermで接続、そこからPingを実行して、そのログを解析すればいいんじゃね?
※ 後で考えると、他にも解決策はいろいろあるとは思うのですけどねぇ...
要するに、別のサーバを踏み台にしてやろうってことですね。
まぁ、やってみましょう。
作ってみた
とりあえず、こんな感じですかね。
# teraTerm用のマクロファイル
[System.String]$teraTTLFile = 'D:\AAA\teraTarmMacroTTL.ttl'
# teraTerm用のログファイル
[System.String]$teraLog = 'D:\AAA\teraTarmMacroLog.log'
# Tera Term 用マクロ実行プログラム
[System.String]$teraMacroExe = "C:\Program Files\teraterm\ttpmacro.exe"
# teraTerm用のマクロファイルの出力
Write-Output ("connect `' /I 10.110.12.30:23 /nossh /T=1`'") | out-file $teraTTLFile Default
Write-Output "wait `'login:`'" | out-file $teraTTLFile Default -append
Write-Output "sendln `'root`'" | out-file $teraTTLFile Default -append
Write-Output "wait `'Password:`'" | out-file $teraTTLFile Default -append
Write-Output "sendln `'infrateam`'" | out-file $teraTTLFile Default -append
Write-Output "wait `'#`'" | out-file $teraTTLFile Default -append
Write-Output ("logopen `'" + $teraLog + "`' 0 0") | out-file $teraTTLFile Default -append
Write-Output "sendln `'ping 10.110.11.60`'" | out-file $teraTTLFile Default -append
Write-Output "wait `'#`'" | out-file $teraTTLFile Default -append
Write-Output "logclose" | out-file $teraTTLFile Default -append
Write-Output "sendln `'exit`'" | out-file $teraTTLFile Default -append
# teratermでPingを実行して、結果をログ出力します。
Start-Process -FilePath $teraMacroExe -ArgumentList $teraTTLFile -Wait
# teraTarmのログを取得して、文字列検索(Pingの実行結果)を行います。
$teraLogGrepAlive = @(Get-Content $teraLog | Select-String "10.110.11.60 is alive" -quiet)
# 文字が見つかった場合
if ($teraLogGrepAlive -eq $True) {
Write-Host "10.11.11.1 Ping成功"
# 文字が見つからなかった場合
} else {
Write-Host "10.11.11.1 Ping失敗"
}
出力パスとかは長いので変数にしています。
teraTermマクロファイルをpowerShellから作成しているのは、処理が終わった後に削除したいからです。
上記のサンプルには、削除処理は付けてないですけどね。
teraTarmMacroTTL.ttl
実際に作成された「teraTarmMacroTTL.ttl」はこちら。
接続先はunix(Solaris)。
10.110.12.30にポート23で接続して、10.110.11.60にpingを実行して終了させています。
途中にlogopen を付けることで、pingの実行結果を「teraTarmMacroLog.log」に吐きだします。
connect ' /I 10.110.12.30:23 /nossh /T=1'
wait 'login:'
sendln 'root'
wait 'Password:'
sendln 'infrateam'
wait '#'
logopen 'D:\AAA\teraTarmMacroLog.log' 0 0
sendln 'ping 10.110.11.60'
wait '#'
logclose
sendln 'exit'
connectに /I オプションを付けるとこで、teraTarmの画面が表示されなくなります。
手動で実行するなら、teraTarmの画面が表示された方が良いでしょうが、タスクとかでスケジュール実行させるなら、表示させない方が無難です。
ちなみに、私の場合「Systemwalker Operation Manager」というソフトで実行させたかったのですが、そのためには /I を付けないと動作してくれませんでした。
実は、teraTarmのマニュアルからこのオプションを発見できなくて、google先生のお力で探し出しました。
teraTarmのマニュアルのどこに書いてるんだろ?
Pingの実行
上記で作成されるマクロファイルを引数として、Start-ProcessコマンドレットでteraTarmを実行します。
-Waitを付けて、teraTarmマクロが終了するまで待機させます。
上手く行けば「teraTarmMacroLog.log」にPingの実行結果が書き込まれるはずです。
ログの解析
Pingが成功していたら、ログには「10.110.11.60 is alive」という文字が出力されるはずです。
(もしかしたら、環境によって出力内容は違うかも)
そこで、Get-Contentコマンドレットを使用して、ログ内に「10.110.11.60 is alive」という文字が存在するか判定します。
まぁ、要するにgrepですよね。
後は、上記の結果を判定して成功時と失敗時のそれぞれの処理を書いてやるだけです。
サンプルでは画面にメッセージを出すだけですけど、失敗時はメールを送信するとか、いろいろ楽しめると思います。
感想
いやぁ。意外となんとかなりましたね。
今回はTeraTarmとPingの連携でしたが、他にも応用できそうですね。
スポンサードリンク


