前回は、show runをエラーなく表示させるマクロを学習しました。
今回はその応用として、show runを表示させた後、少し待ってからexitを叩いて、Tera Termを終了させてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
;/////////////////////////////////// ;Telnetで172.16.0.1のルータにログインし、 ;enableモードまで自動で移行します ;作者Feasible LAB. ;http://teraterm.feasible-lab.com/ ;/////////////////////////////////// connect '172.16.0.1:23 /nossh /T=1' wait 'Password:' sendln 'cisco' wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln 'cisco' wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' end |
前回までに作ったマクロはこの通りでした。
このマクロでは、以下の機能が含まれていましたね。
・CiscoルータにTelnetする
・ログインする
・enableモードに移行する
・show runする
今回は、ここに
・exitして、Ciscoルータから抜ける
というのを追加したいと思います。
既に、これまで学習してきた事で、この追加は簡単に行う事ができます。
これまで通り、手順化してみると
- show runのあと、『#』が表示されるのを待つ
- show runのあと、『#』が表示される
- show runのあと、『#』が表示されるのを目視確認する
- exitとタイプし、Enterする
- ルータから抜ける
こういう形になります。
ルータの設定や機種によっては、enableモードからexitしても、一発で抜ける事ができないかもしれません。
その場合は、exitを打つ動作を二回繰り返すようにします。
もう既に、簡単に書く事ができると思いますが、下にある私の解説を読む前に、ご自分で考えてみてください。
私も、「たかが一弱小ウェブサイトの分際で、読者様に向かって考えてみてくださいなどと・・・」と分不相応な事を言っているのは十分理解しているつもりですが、ここは一つ穏便に。。。
正直言いまして、私もこういった「自分で考えてみてください」的なウェブサイトは、さっさとすっ飛ばして答えを見てしまうタイプなんですが、聡明なる皆様の事ですから、このあたりのexitを書いてみる程度であればほいほいとできてしまうのは間違いなく・・・
さて、そろそろ書けたと思いますが、いかがでしょう。
簡単でしたね。
私の答えは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
;/////////////////////////////////// ;Telnetで172.16.0.1のルータにログインし、 ;enableモードまで自動で移行します ;作者Feasible LAB. ;http://teraterm.feasible-lab.com/ ;/////////////////////////////////// connect '172.16.0.1:23 /nossh /T=1' wait 'Password:' sendln 'cisco' wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln 'cisco' wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' pause 5 sendln '' wait '#' sendln 'exit' end |
思っていたのと違いますか?
「おい、吉川。だましやがったな!お前は前から信用ならねえと思ってたんだよ!」
そういう声が聞こえてきそうですが、ここは一旦私の話を聞いてください。後生ですからお願いします。
皆様が書かれたのは、もしかしたら、下記のようなものかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
;/////////////////////////////////// ;Telnetで172.16.0.1のルータにログインし、 ;enableモードまで自動で移行します ;作者Feasible LAB. ;http://teraterm.feasible-lab.com/ ;/////////////////////////////////// connect '172.16.0.1:23 /nossh /T=1' wait 'Password:' sendln 'cisco' wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln 'cisco' wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' wait '#' pause 3 sendln 'exit' end |
これ、実は間違いではありません。
むしろ大正解です。
この大正解には、二つの意味があります。
・マクロとかプログラミングには正解はありませんので、エラーじゃなければ正解
・正しい結果が得られれば正解
正しい書き方というのは存在しないので、あなたの書いたマクロも全く間違いではないのです。
では、なぜ、私はちょっと違う書き方をしたのでしょうか。
ひねくれているからでしょうか?小学校の通信簿に「協調性がない」と書かれていたからでしょうか?
小さな胸の痛みを否定はしませんが、私がちょっと違う書き方をしたのは、「経験によるもの」が大きいです。
その経験は何かというと、「show runの結果がめちゃめちゃ長いルータとかあるよね」ということです。
「show runの結果がめちゃめちゃ長いルータ」、要は、こちらが期待しているアウトプットを、何万行という単位で返してくる機器の事を言っています。
最近では、ハードウェアスペックが上がり過ぎというくらいにあがっている事もあり、サーバなどでログ情報を抜いたりすると、恐ろしいほどの量になる事もしばしばです。
恐ろしいほどの量がログとして表示され、なかなか表示が終わりきらない状態が続くと、Tera Termマクロの『wait』コマンドは、「待ちきれない」状態になってしまう事があります。
そうなると、まだ『#』が表示されていないのにexitを叩こうとして、「エラー終了」ということが起きてしまうのです。
では、私が書いた部分の意図を解説をしてみましょう。
1 2 3 4 5 6 7 |
sendln 'show run' pause 5 sendln '' wait '#' sendln 'exit' end |
ここでは、直前の’show run’から抜き出しています。
‘show run’をsendlnした後、pauseを5秒入れていますね。
細かく分解して説明する必要は既にないかと思いますが、念のため説明しておきます。
‘show run’を文字列としてマクロが送った後、5秒間の待機を入れています。
この「5秒間の待機」というのが、先ほど例に挙げた、「めちゃめちゃ長いshow run」対策です。
そして、その後の
1 |
senldn '' |
に注目してください。
これは、いわゆる「空(から)エンター」です。
”の中には何も書かれていないので、「何もない文字列を送ってEnterする」という意味になります。
手動でルータの設定を行ったり、ログを表示させたりするときにも、よく「空エンター」というのを使うと思います。もしかすると、無意識のうちに「空エンター」をしている人が多いのではないかと思います。
手動でコマンドを打っている時、「空エンター」を叩く理由はなんでしょうか。
それは、
「次に自分が入れるコマンドを入れてもいい状態にあることを確かめる」
という意味があります。
そこには、いくつかの「空エンター」を挟む事によって、前のコマンドとの間をあけて、コマンドを読みやすくする事も含まれますし、「ちゃんとプロンプトとして『#』が表示されてるよね?」ということを確認することも含まれます。
私が書いたマクロでは、意図的に「空エンター」させることによって、確実に『#』が表示され『wait』できる状態を作ったという意味があります。
こうすることによって、pause 5が待ち時間として長過ぎた場合に、wait ‘#’がうまく動作せず、マクロがエラーになることを防ぐ事ができるのです。
このように、考え方次第では、sendln, wait, pauseだけで、様々な動作をさせる事ができます。
マクロを作り始めた頃は、色々なエラーに悩まされる事があると思いますが、たいていのエラーは空エンターやpauseの値を変更することで対処する事ができます。
エラーが怖くなくなれば、もうあなたの目にはマクロが特殊なものには見えていないはずです。
次回からは、さらにマクロに動作を追加していきたいと思います。