Powershellを中心とした自動ログイン・自動コマンド実行スクリプトを考えたときに詰まったところ。
Telnet接続だけならPowershellだけでどうにかなったんですが、SSHもあるとなるとPowershellだけでは無理なのでいろいろ調べました。
製品がFortiGateとHPEN Flex NetworkのComware SwitchだけならPutty/PlinkでPlinkをPowershellから呼び出したりPSCPでサクッと問題なかったんですが、Cisco ios 12台やら同じComwareでもMSRがあるとうまく動かない。
12台のIOSでも一行なら動くけど、Interactiveな操作も必要になる場合も多いのでPlinkだと厳しい。
そこで、PowershellからExcel/CSVをもとにTeraterm Macroを自動生成してそのマクロをTTPMacroで実行する方式にした。
その中でMacroにいろいろと苦労したところ。
NW機器のPromptを待つのに hostname # をWaitするのもいいが対応する製品毎にPromptは異なるんで、そこはExcel/CSVの設定とした。
Waitを使って wait ‘<hostname> #’ とかでもいいんだけれど、ここで問題になるのは少し長いコマンドになるとSetsync 1とかしててもうまく動かない。
waitln で同じことをしようとしてもPromptの最後に改行がないらしくHitしない。
そこでwaitn を利用して、バッファーに読み込んでるバイトで判断する。
たとえばCiscoでsh intする場合。
setln ‘show interface’
timeout=1
waitn 1
while result <>0
flushrecv
waitn 1
endwhile
setln
wait ‘<hostname> #’
timeout=10
ただし、コマンドによっては調整が必要になる。
例えばshow run とかの場合、途中で一回出力が止まる。
timeoutが1秒だと稀にミスるのでtimeout 3とかで乗り切る。
show tech系もたまに途中で止まるので、timeout 10とかで乗り切るが、出力が終わってから10秒待つのと同義なのであまり長い値にしすぎると自動化の意味がないし短すぎるとうまく動かない。
なのでコマンドに合わせた調整が必要。
Telnet/SSHで直接接続なら問題ない場合も、ConsoleやTerminal Server経由のアクセスの場合はTimeout調整入ります。
ほかに、Interactiveな場合も単純に↑を挟めばいいってものではなくなるのでコマンド出力に応じた調整もいります。
Teraterm ではなくTTPMacroのバッファがあんまり優秀じゃないイメージ。
なのでデータが流れてる間はバッファーにためず、終わってから一回改行して
プロンプトが返ってくるのをまつスタイル。
今のところコレでうまく動いている。