SSH でも Telnet でも使えるログインマクロを作ろう
ネットワーク機器にリモート接続するためのプロトコルとして SSH と Telnet の2つがあります。機器にログインする Tera Term マクロを作成する場合、SSH 接続が許可されている機器に対しては SSH 接続用の処理を、Telnet 接続が許可されている機器に対しては Telnet 接続用の処理を記述する必要があります。
このため、単純に考えると SSH 接続用のログインマクロと Telnet 接続用のログインマクロの2つを作成して管理していく必要がありますが、これには手間がかかり保守性が低くなります。
SSH と Telnet のどちらの場合でも使用できるログインマクロがあれば、管理していくマクロは1つで済むため保守性が上がります。この記事ではこのようなマクロを作成するためのテクニックを解説します。
- 対象機器は Cisco 製の一般的なスイッチ・ルータ・ファイアウォール
- SSH の認証方式はユーザパスワード認証のみに対応
- Telnet の認証方式はユーザ認証とパスワード認証の両方に対応
動作確認環境
- Tera Term Version 4.104
SSH と Telnet の両方に対応するためのテクニック
SSH ログインと Telnet ログインの両方の処理を用意し使い分ける
SSH と Telnet の両方に対応するためには、SSH ログイン用の処理と Telnet ログイン用の処理の両方をマクロの中に用意しておきます。そして後で説明する仕組みに基づいて SSH と Telnet の処理を使い分けます。
この記事では SSH、Telent ログイン用の処理、及び使用する変数は以下の通りとします。
; ログイン処理で使用する変数
address ;接続先機器のアドレス
vtypass ;VTYパスワード
username ;ログインユーザ名
userpass ;ログインユーザパスワード
; SSH ログイン用の処理
sprintf2 connectCommand '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect connectCommand
; 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
SSH か Telnet かを判別するための変数を用意する
SSH と Telnet のどちらを使用して接続するのかを判別するために、変数を用意してマクロユーザに指定させるという仕様にします。
この記事では以下の connect_protocol という変数を用意して使用することにします。
- connect_protocol
- 型:文字列
- 値:
- ssh ⇒ SSH 接続であることを意味する
- telnet ⇒ Telnet 接続であることを意味する
- その他 ⇒ エラー判定とする
connect_protocol = 'ssh' ;接続プロトコル。「ssh」か「telnet」で指定
マクロ処理ではこの connect_protocol の値によって条件分岐するような処理内容とします。
; connect_protocol が ssh の場合は SSH 接続する
strcompare connect_protocol 'ssh'
if result = 0 then
; SSH 接続する処理を記述
endif
; connect_protocol が telnet の場合は Telnet 接続する
strcompare connect_protocol 'telnet'
if result = 0 then
; Telnet 接続する処理を記述
endif
strcompare コマンドで2つの文字列の比較ができます。コマンド実行後の result の値が 0 の場合は指定した2つの文字列が等しいことを意味します。
また connect_protocol の値が ssh と telnet の何れでもない場合はエラーとしてマクロを停止する処理を追加しておきます。このエラー処理のために変数 error_flag を定義して使用しています。
; エラー判定用変数の初期化
error_flag = 1
; SSH or Telnet 接続処理
; SSH or Telnet 接続が成功した後に error_flag = 0 と設定する
; connect_protocol の設定が正しくない場合はマクロを停止
if error_flag = 1 then
messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
end
endif
SSH or Telnet 接続に成功後に error_flag = 0 と設定するため、SSH or Telnet 接続処理を通過後に error_flag = 1 の場合はエラーと判断できます。
【マクロ例】SSH ログインと Telnet ログインの両方に対応したマクロ
上で説明したテクニックを使用して SSH ログインと Telnet ログインの両方に対応したマクロを作成すると以下のようになります。おまけで特権EXECモードに移行する処理も追加しています。
;;=========================================
;; (1)変数定義パート
;;=========================================
; 接続先機器情報を設定(マクロユーザ編集箇所)
hostname = 'MyRouter' ;ホスト名
address = '10.1.1.1' ;接続先アドレス
vtypass = 'admin' ;VTYパスワード、使用しない場合は変更不要
username = 'admin' ;ユーザ名、使用しない場合は変更不要
userpass = 'admin' ;ユーザパスワード、使用しない場合は変更不要
enablepass = 'admin' ;Enableパスワード
connect_protocol = 'ssh' ;接続プロトコル。「ssh」か「telnet」で指定
; 以下2行は編集不要
sprintf2 prompt_user '^%s.*>' hostname ;ユーザEXECモードのプロンプトを表す正規表現
sprintf2 prompt_privilege '^%s.*#' hostname ;特権EXECモードのプロンプトを表す正規表現
;;=========================================
;; (2)メイン処理パート
;;=========================================
; エラー判定用変数の初期化
error_flag = 1
; connect_protocol が ssh の場合は SSH 接続する
strcompare connect_protocol 'ssh'
if result = 0 then
sprintf2 connectCommand '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
connect connectCommand
error_flag = 0 ;エラーフラグの無効化
endif
; connect_protocol が telnet の場合は Telnet 接続する
strcompare connect_protocol 'telnet'
if result = 0 then
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
error_flag = 0 ;エラーフラグの無効化
endif
; connect_protocol の設定が正しくない場合はマクロを停止
if error_flag = 1 then
messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
end
endif
; 特権EXECモードに移行
sendln
waitregex prompt_user prompt_privilege
if result = 1 then
sendln 'enable'
wait 'Password:'
sendln enablepass
endif
; 必要ならコマンド実行等の後続の処理を記述
マクロユーザが編集する必要がある箇所は「(1)変数定義パート」の「; 接続先機器情報を設定(マクロユーザ編集箇所)」以下の変数の値です。具体的には以下の通りです。
- SSH 接続の場合
- hostname
- address
- username
- userpass
- enablepass
- connect_protocol → 「connect_protocol = 'ssh'」にする
- Telnet 接続の場合
- ユーザ認証の場合
- hostname
- address
- username
- userpass
- enablepass
- パスワード認証の場合
- hostname
- address
- vtypass
- enablepass
- 共通
- connect_protocol → 「connect_protocol = 'telnet'」にする
- ユーザ認証の場合
まとめ
- SSH と Telnet の両方に対応できるログインマクロは保守性が高い
- SSH と Telnet の両方に対応できるログインマクロを作るためには、プロトコル判別用の変数を用意し、その値によって条件分岐する
- プロトコル判別用の変数に不正な値が設定された場合のエラー処理を用意しておこう
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント