TeraTermマクロを書く上で面倒なもののひとつに「–More–」の処理があります。「–More–」を適切に処理する方法について解説します。
–More–とは
ネットワーク機器でコンフィグを表示させた場合、稀に数万行に及ぶコンフィグを表示させる必要があり、うっかりシリアルコンソール接続でこれをやるとすべて表示させるのに数時間かかります。
そのため大抵はページャー機能が実装されていて、数十行表示すると「–More–」といったメッセージが表示されます。そして、スペースキーを押下すると次のページが表示されるようになっています。
可能であれば「–More–」を無効化する
Cisco機器の場合「terminal length 0」というコマンドで一気にすべての行を表示させる事ができます。
これはメーカーによってコマンドが異なりますし、こういうコマンドが存在しない場合もあります。そのため、TeraTermマクロ側での対処を検討する必要があります。
どのように対処するか
対処方法は「–More–」を受信したらスペースを送信するようにします。問題は冒頭でも述べたとおりメーカーによって表示が異なるため、「–More–」だったり「– More –」のように空白が含まれる可能性があります。そこで、正規表現を使って処理する事にします。
connect '/C=3' sendln pause 1 do wait 'login:' 'Password:' 'Router#' if result == 1 then ;loginプロンプトが表示された場合 sendln 'foo' continue elseif result == 2 then ;Passowrdプロンプトが表示された場合 sendln 'router' continue endif loop while result != 3 ;Router#を受信するまでループする ;コンフィグを表示するためにenableモードへ入る sendln 'en' wait 'Router(config)#' ;コンフィグを表示するコマンドを送信 sendln 'show running' do waitregex 'Router(config)#' '--¥s*[mM]ore¥s*--' if result == 2 then ;Moreを受信た場合の処理 send ' ' ;スペースを送信 pause 1 ;次ページが表示される間待つ endif loop while result != 1 ;Router(config)#を受信するまでループする ;以下はログアウト処理 sendln 'exit' wait 'Router#' sendln 'exit'
前半部分は「TeraTermマクロでシリアルログインする方法」で紹介したIX2015へシリアルログインするためのTeraTermマクロです。今回もIX2015を例にしました。この機種はCiscoライクでterminal length 0が使えるのですが、例として「–More–」の処理を行っています。
肝心なのは「sendln ‘ ‘」でなく「send ‘ ‘」としている所です。改行まで送信すると上手く動かないケースが多いので、ここはスペースのみ送りましょう。
今回はNEC製のIX2015を例に使用しましたが、ヤマハ製のルーターやCheckPointのファイアウォールなど「–More–」の箇所さえ機器の表示と合わせればどのようなメーカーや機種でも対応させる事ができますので、試してみてください。
今回のサンプルマクロでは「–¥s*[mM]ore¥*–」としており、スペースが有っても無くてもマッチするようにしています。