Tera Term マクロで特権モードに移行する
Cisco 機器の CLI で作業を行う場合、CLI にログイン後、特権EXECモードに移行してコマンドを実行します。よって Tera Term マクロでもログイン後に特権EXECモードに移行する処理を記述する必要があります。この処理の記述テクニックについて解説します。
動作確認環境
- Tera Term Version 4.104
Cisco 機器のユーザや line の特権レベルを考慮する
Cisco 機器ではローカルユーザ設定や line 設定にてオプションとして「特権レベル」を設定することができます。この特権レベルの設定によって、ログイン後のデフォルトの CLI モードが変わります。
デフォルトの特権レベルではログイン直後のモードはユーザEXECモードになります。ただ特権レベルが変更されている場合、ログイン直後のモードが特権EXECモードになる場合があります。
この記事では特権レベルの設定が何であっても対応できるマクロを作成することにします。
特権EXECモードに移行する処理の記述方法
では本題の、Cisco 機器にログイン後に特権EXECモードに移行する処理の記述方法について説明します。
ログイン後のモードを確認して条件分岐する
上で記載した通り特権レベルの設定が何であっても(ログイン後のモードがユーザEXECモードでも特権EXECモードでも)対応できるマクロを作成します。このためにはログイン後のモードをチェックして条件分岐するという処理にする必要があります。
条件分岐といっても、ログイン後のモードが特権EXECモードの場合は目的の「特権モードに移行する」ことは果たせているので、実際にはログイン後のモードがユーザEXECモードの場合のみ特権モードに移行する処理を実行するという処理内容になります。
現在のモードをチェックする方法
現在のモードをチェックするためには、Tera Term の wait コマンドを使用してユーザEXECモードのプロンプトと特権EXECモードのプロンプトを同時に待ち受け、待ち受け完了後にシステム変数 result の値を確認することでできます。以下の wait コマンドの仕様を再確認しましょう。
- wait <文字列①> <文字列②> ...
- <文字列①> <文字列②> ...:待受け対象の文字列を半角スペース区切りで10個まで指定可能
- 受信した文字列によってシステム変数 result に以下のように値が格納される
- 文字列① ⇒ result ← 1
- 文字列② ⇒ result ← 2
- ...
- 文字列⑩ ⇒ result ← 10
現在のモードを判別するためには以下のようにプロンプト文字列を指定した wait コマンドを使用します。
- wait <ユーザEXECモードのプロンプト> <特権EXECモードのプロンプト>
- 受信した文字列によってシステム変数 result に以下のように値が格納される
- ユーザEXECモードのプロンプト ⇒ result ← 1
- 特権EXECモードのプロンプト ⇒ result ← 2
上記のように wait コマンドを記述することで、以下のようにモードを判別できます。
- wait コマンド実行後に result が 1 の場合 ⇒ ユーザEXECモード
- wait コマンド実行後に result が 2 の場合 ⇒ 特権EXECモード
これより、wait コマンド実行後に result が 1 の場合に特権EXECモードに移行する処理を実行するようなマクロ内容にすれば良いと言えます。
ユーザEXECモードから特権EXECモードに移行する処理
ユーザEXECモードから特権EXECモードに移行する場合、以下のような手順になります。
- 「enable」コマンドを送信する
- 「Password:」の表示を待つ
- enable パスワードを送信する
この処理をマクロにすると以下のようになります。
; enableパスワードを変数に設定
enablepass = 'admin'
; 特権EXECモードに移行する処理
sendln 'enable'
wait 'Password:'
sendln enablepass
enable パスワードを変数に設定することはオプションですが、保守性向上のために変数化しておくことをお勧めします。
特権EXECモードに移行する処理の記述例
上説明した内容を実際にマクロにしてみます。以下は対象 Cisco 機器のホスト名が「MyRouter」の場合の、特権EXECモードに移行するマクロです。
; プロンプト文字列とenableパスワードを変数に設定
prompt_user = 'MyRouter>'
prompt_privilege = 'MyRouter#'
enablepass = 'admin'
; Enterを送信してプロンプトを受信
sendln
; プロンプトを待ち受け
wait prompt_user prompt_privilege
; result = 1 の場合にのみ特権EXECモードに移行する処理を実行
if result = 1 then
sendln 'enable'
wait 'Password:'
sendln enablepass
endif
待ち受けプロンプト文字列は正規表現化を推奨
当サイトではプロンプトを待ち受ける際の文字列指定を、プロンプトそのままの文字列ではなく正規表現化することを推奨しています。詳しくは以下の記事で解説しているため気になる人は確認してみてください。

プロンプト文字列を正規表現化した場合、特権EXECモードに移行するマクロ例は以下のように変わります。
; ホスト名、プロンプト文字列、enableパスワードを変数に設定
hostname = 'MyRouter'
sprintf2 prompt_user '^%s.*>' hostname
sprintf2 prompt_privilege '^%s.*#' hostname
enablepass = 'admin'
; Enterを送信してプロンプトを受信
sendln
; プロンプトを待ち受け
waitregex prompt_user prompt_privilege
; result = 1 の場合にのみ特権EXECモードに移行する処理を実行
if result = 1 then
sendln 'enable'
wait 'Password:'
sendln enablepass
endif
【マクロ例】Telnet ログインして特権EXECモードに移行するマクロ
以下は Cisco 機器に Telnet ログインして特権EXECモードに移行するマクロです。
;;=========================================
;; (1)変数定義パート
;;=========================================
hostname = 'MyRouter'
address = '10.1.1.1'
vtypass = 'admin'
username = 'admin'
userpass = 'admin'
enablepass = 'admin'
sprintf2 prompt_user '^%s.*>' hostname
sprintf2 prompt_privilege '^%s.*#' hostname
;;=========================================
;; (2)メイン処理パート
;;=========================================
; Telnet接続
sprintf2 connectCommand '%s:23 /nossh /T=1' address
connect connectCommand
; プロンプト待ち受け
wait 'Username:' 'Password:'
; 認証方式別にログイン処理を行う
if result = 1 then
; ユーザ認証の場合の処理を記述
sendln username
wait 'Password:'
sendln userpass
elseif result = 2 then
; パスワード認証の場合の処理を記述
sendln vtypass
endif
; 特権EXECモードに移行
sendln
waitregex prompt_user prompt_privilege
if result = 1 then
sendln 'enable'
wait 'Password:'
sendln enablepass
endif
まとめ
- Cisco 機器にログイン後のモードは特権レベルの設定により変わる場合がある
- wait コマンドを使用してプロンプトの判別をすることができる
- 現在のモードがユーザEXECモードの場合に特権モードへの移行処理を実行することで、特権レベルの設定が何であれ対応できるマクロにできる
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント