マクロは陰で使うもの。生産性を上げても給料は上がらず仕事が増えるだけなので仕事をサボろう!

Tera Term マクロ SSH と Telnet の両方に対応したログインマクロを作成するテクニック (Cisco 機器)

目次

SSH でも Telnet でも使えるログインマクロを作ろう

ネットワーク機器にリモート接続するためのプロトコルとして SSHTelnet の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
CHECK!

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'」にする

まとめ

CHECK!
  • SSH と Telnet の両方に対応できるログインマクロは保守性が高い
  • SSH と Telnet の両方に対応できるログインマクロを作るためには、プロトコル判別用の変数を用意し、その値によって条件分岐する
  • プロトコル判別用の変数に不正な値が設定された場合のエラー処理を用意しておこう

Tera Term マクロ関連記事リスト


Amazon で買えるおすすめアイテム(アフィリエイト)

ブログ始めるなら 【アフィリエイトリンク】

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次