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

踏み台経由で Cisco 機器にログインする Tera Term マクロの共有

目次

動作確認環境

  • Tera Term Version 4.104

マクロ概要

ネットワークのルーティングや接続制限の問題で作業端末から直接対象機器に接続できない環境では、踏み台を経由して対象機器に接続する場合がある。このマクロは、踏み台と対象機器がともに Cisco 機器であることを前提とし、踏み台を経由して対象機器にログインするためのマクロである。また、踏み台を使用しないで対象機器に直接ログインするために使用することもできる。

動作内容

  • Cisco 機器にログインした後、その Cisco 機器から別の Cisco 機器にログインする
  • 踏み台を使用しないよう設定した場合、直接対象機器にログインすることも可能
  • リモート接続プロトコルとしては Telnet と SSH に対応
  • Telnet の認証方式としてはユーザ認証とパスワード認証に対応
  • SSH の認証方式としてはユーザパスワード認証のみに対応
  • 対象機器にログイン後、特権EXECモードに移行した上でログ保存を開始する

マクロテキスト

;;*********************************************************
;; Title: 踏み台(Cisco機器)経由で Cisco 機器にログインするマクロ
;; 作成元: https://teramacro.com/
;; 説明ページ: https://teramacro.com/macro-loginindirect/
;;*********************************************************
;;================================================
;; (1)変数定義パート(マクロユーザ編集箇所)
;; ※使わない変数でも記述を削除しないこと
;;================================================
; 接続先機器情報
hostname_target = 'ホスト名'
address_target = 'IPアドレス'
username_target = 'ログイン用ユーザ名'
userpass_target = 'ログイン用ユーザパスワード'
vtypass_target = 'ログイン用VTYパスワード'
enablepass_target = 'enableパスワード'
connectprotocol_target = '接続プロトコル' ;Telnetなら「telnet」SSHなら「ssh」とする

; 踏み台機器情報
hostname_bastion = 'ホスト名' ;空文字列('')にすると踏み台を使用しない
address_bastion = 'IPアドレス'
username_bastion = 'ログイン用ユーザ名'
userpass_bastion = 'ログイン用ユーザパスワード'
vtypass_bastion = 'ログイン用VTYパスワード'
enablepass_bastion = 'enableパスワード'
connectprotocol_bastion = '接続プロトコル' ;Telnetなら「telnet」SSHなら「ssh」とする

; ログ保存設定
logfolder = '作業ログ' ;ログファイル保存先フォルダ名
logfilename = hostname_target ;ログファイル名
datetime_flag = 1 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない

;;================================================
;; (2)メイン処理パート
;; ※ここから下は編集しないこと
;;================================================
strcompare hostname_bastion ''
;;-----------------------------------------
; 踏み台を使用する場合の処理
;;-----------------------------------------
if result <> 0 then
 ;;-----------------------------------------
 ; 踏み台機器にログイン
 ;;-----------------------------------------
 ; ログイン処理
 address = address_bastion
 username = username_bastion
 userpass = userpass_bastion
 vtypass = vtypass_bastion
 connect_protocol = connectprotocol_bastion
 call LoginTelnetOrSSH

 ; 特権EXECモードに移行
 enablepass = enablepass_bastion
 sprintf2 prompt_user '^%s.*>' hostname_bastion
 sprintf2 prompt_privilege  '^%s.*#' hostname_bastion
 call BecomePrivilege

 ;;-----------------------------------------
 ; 踏み台から対象機器にログイン
 ;;-----------------------------------------
 ; ログイン処理
 address = address_target
 username = username_target
 userpass = userpass_target
 vtypass = vtypass_target
 connect_protocol = connectprotocol_target
 call LoginTelnetOrSSHToCisco

else
;;-----------------------------------------
; 踏み台を使用しない場合の処理
;;-----------------------------------------
 ; 対象機器へのログイン処理
 address = address_target
 username = username_target
 userpass = userpass_target
 vtypass = vtypass_target
 connect_protocol = connectprotocol_target
 call LoginTelnetOrSSH
endif

;;-----------------------------------------
; 対象機器にて特権EXECモードに移行
;;-----------------------------------------
enablepass = enablepass_target
sprintf2 prompt_user '^%s.*>' hostname_target
sprintf2 prompt_privilege  '^%s.*#' hostname_target
call BecomePrivilege

;;-----------------------------------------
; ログ保存開始
;;-----------------------------------------
call StartLogging

;;-----------------------------------------
; メイン処理終了
;;-----------------------------------------
end

;;================================================
;; (3)サブルーチンパート
;;================================================

;;-----------------------------------------
;;◆LoginTelnetOrSSH: Cisco 機器に Telnet または SSH でログインする
;; 変数:
;;  - connect_protocol : 接続プロトコル
;;   - telnet ⇒ サブルーチン TelnetLogin を呼び出す
;;   - ssh ⇒ サブルーチン SSHLogin を呼び出す
;;   - その他 ⇒ エラーとしてマクロを停止する
;;-----------------------------------------
:LoginTelnetOrSSH
 error_flag = 1 

 strcompare connect_protocol 'ssh'
 if result = 0 then
  call SSHLogin
  error_flag = 0
 endif

 strcompare connect_protocol 'telnet'
 if result = 0 then
  call TelnetLogin
  error_flag = 0
 endif

 if error_flag = 1 then
  messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
  end
 endif
return

;;-----------------------------------------
;;◆TelnetLogin: Cisco 機器に Telnet ログインする
;; 変数:
;;  - address : IPアドレス
;;  - username : ログインユーザ名
;;  - userpass : ログインユーザパスワード
;;  - vtypass : VTYパスワード
;;-----------------------------------------
:TelnetLogin
 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
return

;;-----------------------------------------
;;◆SSHLogin: SSHログインを行う
;; 変数:
;;  - address : IPアドレス
;;  - username : ログインユーザ名
;;  - userpass : ログインユーザパスワード
;;-----------------------------------------
:SSHLogin
 sprintf2 connectCommand '%s:22 /ssh /2 /auth=password /user=%s /passwd=%s /nosecuritywarning' address username userpass
 connect connectCommand
return

;;-----------------------------------------
;;◆BecomePrivilege: Cisco 機器で特権EXECモードに移行する
;; 変数:
;;  - prompt_user : ユーザEXECモードのプロンプトを示す正規表現
;;  - prompt_privilege : 特権EXECモードのプロンプトを示す正規表現
;;  - enablepass : Enableパスワード
;;-----------------------------------------
:BecomePrivilege
 flushrecv
 sendln
 waitregex prompt_user prompt_privilege
 if result = 1 then
  flushrecv
  sendln 'enable'
  wait 'Password:'
  flushrecv
  sendln enablepass
 endif
return

;;-----------------------------------------
;;◆LoginTelnetOrSSHToCisco: Cisco 機器から Cisco 機器へ Telnet または SSH でログインする
;; 変数:
;;  - connect_protocol : 接続プロトコル
;;   - telnet ⇒ サブルーチン TelnetToCisco を呼び出す
;;   - ssh ⇒ サブルーチン SSHToCisco を呼び出す
;;   - その他 ⇒ エラーとしてマクロを停止する
;;-----------------------------------------
:LoginTelnetOrSSHToCisco
 error_flag = 1 

 strcompare connect_protocol 'ssh'
 if result = 0 then
  call SSHToCisco
  error_flag = 0
 endif

 strcompare connect_protocol 'telnet'
 if result = 0 then
  call TelnetToCisco
  error_flag = 0
 endif

 if error_flag = 1 then
  messagebox 'プロトコル設定(connect_protocol)が不正のため処理を中止します' 'エラー'
  end
 endif
return

;;-----------------------------------------
;;◆TelnetToCisco: Cisco 機器から Cisco 機器へ Telnet 接続する
;; 変数:
;;  - address : Telnet接続先のIPアドレス
;;  - username : Telnetログインユーザ名
;;  - userpass : Telnetログインユーザパスワード
;;  - vtypass : Telnetログイン用VTYパスワード
;;-----------------------------------------
:TelnetToCisco
 sprintf2 telnetCommand 'telnet %s' address
 sendln telnetCommand
 wait 'Username' 'Password:'
 if result = 1 then
  sendln username
  wait 'Password:'
  sendln userpass
 elseif result = 2 then
  sendln vtypass
 endif
return

;;-----------------------------------------
;;◆SSHToCisco: Cisco 機器から Cisco 機器へ SSH 接続する
;; 変数:
;;  - address : SSH接続先のIPアドレス
;;  - username : SSHログインユーザ名
;;  - userpass : SSHログインユーザパスワード
;;-----------------------------------------
:SSHToCisco
 sprintf2 sshCommand 'ssh -l %s %s' username address
 sendln sshCommand
 wait 'Password:'
 sendln userpass
return

;;-----------------------------------------
;;◆StartLogging: ログ保存を開始する
;; 変数:
;;  - logfolder : ログ保存先フォルダ名 ※1階層のみ対応
;;  - logfilename : ログファイル名
;;  - datetime_flag : 「_%Y%m%d-%H%M%S」形式の日付時刻をログファイル名に付与するかどうか
;;      1 ⇒ 日付時刻を付与する
;;      1以外 ⇒ 日付時刻を付与しない
;;-----------------------------------------
:StartLogging
 loginfo logfilename_temp
 if result <> -1 logclose

 getdir logfilepath

 ifdefined logfolder
 if result > 0 then
  strcompare logfolder ''
  if result <> 0 then
   foldersearch logfolder
   if result = 0 foldercreate logfolder
   sprintf2 logfilepath '%s\%s' logfilepath logfolder
  endif
 endif

 sprintf2 logfilepath '%s\%s' logfilepath logfilename
 
 ifdefined datetime_flag
 if result > 0 then
  if datetime_flag = 1 then
   gettime timestr '_%Y%m%d-%H%M%S'
   strconcat logfilepath timestr
  endif
 endif

 strconcat logfilepath '.log'
 logopen logfilepath 0 0
return

使い方

  • 上記のマクロテキストをコピーしてテキストファイルに貼り付け、拡張子を「.ttl」として保存する
  • マクロテキスト内の上部にある「(1)変数定義パート(マクロユーザ編集箇所)」内の変数の値を接続対象機器に合わせて変更して保存する
  • マクロユーザが編集するべき設定項目は以下の通り
セクション項目(変数名)説明備考
接続先機器情報hostname_target接続先機器のホスト名設定必須
address_target接続先機器のIPアドレス設定必須
username_target接続先機器のログインユーザ名telnet でユーザ認証の場合、ssh の場合は設定
userpass_target接続先機器のログインユーザパスワードtelnet でユーザ認証の場合、ssh の場合は設定
vtypass_target接続先機器のログイン用VTYパスワードtelnet でパスワード認証の場合は設定
enablepass_target接続先機器のenableパスワード設定必須
connectprotocol_target接続先機器への接続プロトコル「telnet」か「ssh」を指定
踏み台機器情報hostname_bastion踏み台機器のホスト名設定必須
踏み台を使用しない場合は空文字列('')にする
address_bastion踏み台機器のIPアドレス設定必須
username_bastion踏み台機器のログインユーザ名telnet でユーザ認証の場合、ssh の場合は設定
userpass_bastion踏み台機器のログインユーザパスワードtelnet でユーザ認証の場合、ssh の場合は設定
vtypass_bastion踏み台機器のログイン用VTYパスワードtelnet でパスワード認証の場合は設定
enablepass_bastion踏み台機器のenableパスワード設定必須
connectprotocol_bastion踏み台機器への接続プロトコル「telnet」か「ssh」を指定
ログ保存設定logfolderログ保存先フォルダ名マクロファイル格納フォルダ内に指定した名前のフォルダが作成される
logfilenameログファイル名logfolder で指定したフォルダ内に保存される
datetime_flagログファイル名の末尾に日付時刻情報を付与するかどうか1 ⇒ 付与する
0 ⇒ 付与しない
  • 設定ができたらマクロファイルを保存する。マクロファイルをダブルクリックしてマクロを実行する
    • 拡張子「.ttl」へのアプリの紐づけを実施していない場合はこちらの記事参照

設定例

  • 踏み台を使用する場合
    • 踏み台機器は VTY パスワード認証による Telnet 接続
    • 接続先機器は SSH 接続
;;================================================
;; (1)変数定義パート(マクロユーザ編集箇所)
;; ※使わない変数でも記述を削除しないこと
;;================================================
; 接続先機器情報
hostname_target = 'MyRouter01'
address_target = '10.1.1.1'
username_target = 'admin'
userpass_target = 'adminpass'
vtypass_target = ''
enablepass_target = 'admin'
connectprotocol_target = 'ssh' ;Telnetなら「telnet」SSHなら「ssh」とする

; 踏み台機器情報
hostname_bastion = 'MyRouter02'
address_bastion = '10.1.1.2'
username_bastion = ''
userpass_bastion = ''
vtypass_bastion = 'vtypass'
enablepass_bastion = 'admin'
connectprotocol_bastion = 'telnet' ;Telnetなら「telnet」SSHなら「ssh」とする

; ログ保存設定
logfolder = '作業ログ'
logfilename = hostname_target
datetime_flag = 1 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない
  • 踏み台を使用しない場合
    • 接続先機器は SSH 接続
;;================================================
;; (1)変数定義パート(マクロユーザ編集箇所)
;; ※使わない変数でも記述を削除しないこと
;;================================================
; 接続先機器情報
hostname_target = 'MyRouter01'
address_target = '10.1.1.1'
username_target = 'admin'
userpass_target = 'adminpass'
vtypass_target = ''
enablepass_target = 'admin'
connectprotocol_target = 'ssh' ;Telnetなら「telnet」SSHなら「ssh」とする

; 踏み台機器情報
hostname_bastion = ''
address_bastion = ''
username_bastion = ''
userpass_bastion = ''
vtypass_bastion = ''
enablepass_bastion = ''
connectprotocol_bastion = '' ;Telnetなら「telnet」SSHなら「ssh」とする

; ログ保存設定
logfolder = '作業ログ'
logfilename = hostname_target
datetime_flag = 1 ; 1⇒日付時刻をファイル名末尾に付与する、0⇒付与しない

関連

不具合報告先


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


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

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

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

コメント

コメントする

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

目次