Telnet における2つの認証方式
一般的にネットワーク機器への Telnet ログイン時の認証方式としては「ユーザ認証」と「パスワード認証」の2パターンがあります。対象機器がどちらのパターンなのかは対象機器の仕様および設定状況により決定されるため、対象機器ごとに確認を行う必要があります。
Tera Term マクロで Telnet 接続及びログインを行うためには、マクロ内に認証用の処理を記述する必要がありますが認証方式がユーザ認証の場合とパスワード認証の場合で異なる処理にする必要があります。このため、単純な仕組みのマクロを作成する場合、ユーザ認証用のマクロとパスワード認証用のマクロを分けて作成する必要があります。これは手間がかかり保守性も高くありません。
この記事では、Cisco 機器(一般的なスイッチ、ルータ、ファイアウォール)を対象として、Telnet の認証方式がユーザ認証とパスワード認証のどちらの場合でもログインできる Tera Term マクロを作成するテクニックについて解説します。
動作確認環境
- Tera Term Version 4.104
- Cisco C891FJ-K9 Version 15.9(3)M10
Telnet 認証方式によるログイン時の処理の違い
ユーザ認証による Telnet ログインの場合は、Telnet 接続後の流れは以下のようになります。
- 「Username:」と表示された後、ユーザ名を入力する
- 「Password:」と表示された後、パスワードを入力する
User Access Verification
Username: admin
Password:
MyRouter>
一方、パスワード認証による Telnet ログインの場合は、Telnet 接続後の流れは以下のようになります。
- 「Password:」と表示された後、パスワードを入力する
User Access Verification
Password:
MyRouter>
認証方式別に処理を分けるテクニック
上記のように認証方式によって処理の流れが異なるため、マクロ処理の中で認証方式を判別して条件分岐するという処理が必要になります。
① wait で複数の文字列を指定して result をチェックする
文字列を待ち受けるコマンドである wait ですが、待受け対象の文字列を2つ以上指定することが可能です。また、wait の結果どの文字列を受信したかによってシステム変数 result に格納される値が変わります。
- wait <文字列①> <文字列②> ...
- <文字列①> <文字列②> ...:待受け対象の文字列を半角スペース区切りで10個まで指定可能
- 受信した文字列によってシステム変数 result に以下のように値が格納される
- 文字列① ⇒ result ← 1
- 文字列② ⇒ result ← 2
- ...
- 文字列⑩ ⇒ result ← 10
この仕様を利用して、以下の流れで Telnet の認証方式を判別します。
- Telnet 接続する
- 「wait 'Username' 'Password:'」で文字列を待ち受ける
- result の値を確認して認証方式を判別する
- result = 1 ⇒ ユーザ認証
- result = 2 ⇒ パスワード認証
マクロの内容としては以下のようになります。
; Telnet接続
connect '10.1.1.1:23 /nossh /T=1'
; プロンプト待ち受け
wait 'Username:' 'Password:'
; 認証方式別にログイン処理を行う
if result = 1 then
; ユーザ認証の場合の処理を記述
elseif result = 2 then
; パスワード認証の場合の処理を記述
endif
② 認証方式別の処理を記述
上のマクロ例に対して、各認証方式用の処理を具体的に記述します。
; Telnet接続
connect '10.1.1.1:23 /nossh /T=1'
; プロンプト待ち受け
wait 'Username:' 'Password:'
; 認証方式別にログイン処理を行う
if result = 1 then
; ユーザ認証の場合の処理を記述
sendln 'admin'
wait 'Password:'
sendln 'admin'
elseif result = 2 then
; パスワード認証の場合の処理を記述
sendln 'admin'
endif
これで認証方式別に処理を分けるマクロは完成です。
再利用しやすいマクロに改良する
上で記載したマクロ例は、接続先機器のアドレスやパスワード情報をそのまま各所で入力しているため保守性の低いマクロになっています。保守性の高いマクロにするためには対象機器ごとに変わるパラメータを変数としてまとめて定義します。
改良後は以下のようなマクロ内容になります。このマクロを使用する際は「(1)変数定義パート」に記載されている変数の値を対象機器に合わせて変えるだけで良いということになります。
;;=========================================
;; (1)変数定義パート
;;=========================================
hostname = 'MyRouter'
address = '10.1.1.1'
vtypass = 'admin'
username = 'admin'
userpass = 'admin'
;;=========================================
;; (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モードに移行するまでの処理を追加すると以下のようになります。
;;=========================================
;; (1)変数定義パート
;;=========================================
hostname = 'MyRouter'
address = '10.1.1.1'
vtypass = 'admin'
username = 'admin'
userpass = 'admin'
enablepass = 'admin'
sprintf2 prompt_user '^%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
sendln 'enable'
wait 'Password:'
sendln enablepass
まとめ
- Telnet には認証方式が2パターンある
- Telnet の認証方式を判別するためには、wait コマンドで文字列を複数指定し result の値によって判別する
- 再利用しやすいマクロにするためには機器ごとのパラメータを変数化してマクロの先頭にまとめる
この記事では別の記事で説明しているテクニックを理解していることを前提にしている部分もあります。よくわからない点があった場合は以下に記載している記事リストをチェックしてみてください。
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント