2017/02/18

バージョン管理するのもつらいし、ソース等はGitHubに移動することにした。 利用するのであれば、そちらを参照してもらったほうがいいと思う。


以前記述した、ログイン先をリストボックスで選択して自動的にログインするTeratermマクロをさらにもう少し改修・改良してみた。 変更内容は、リストに記述されているログイン先ごとに、どのiniファイルを読み込ませるのかを事前に定義し、サーバや種類ごとにウィンドウの色分けなどをさせる、というもの。

このマクロは、以下の5つ(5種類?)で構成されている。

  • SSHAutoLogin.ttl(自動ログインマクロ本体)
  • host.list(自動ログインを行うホストのリストファイル)
  • command.list(自動ログイン実行時に実行させるコマンドのリスト)
  • log(ログを出力させるフォルダ)
  • iniファイル(読み込ませるiniファイル)

なお、このマクロはTeratermのバージョンが4.78以降のものである必要がある。

1.SSHAutoLogin.ttl

自動ログインのマクロ本体。 ソースは以下のようになる。

SSHAutoLogin.ttl

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Filename : SSHListLogin.ttl
; Description : SSH List login - host selection listbox from host.list
; Author : Blacknon
; Created : 2015/01/18
; Modified : 2017/02/18
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;;-------------------------------------------------------
;; 接続時の基本的な情報を設定する
;;-------------------------------------------------------
;; ホストに関する情報をもつファイル「host.list」の場所を設定する
 HOST_FILE = "host.list"

;; ログイン時に実行させるコマンドの情報をもつファイル「command.list」の場所を設定する
 COMMAND_FILE = "command.list"

;; ログ作成用ディレクトリの情報を取得する
 Getdir CurrentDir
 LOG_DIR_PATH = CurrentDir
 Strconcat LOG_DIR_PATH '\log\'

;; iniファイル設置ディレクトリの情報を取得する
 Getdir CurrentDir
 INI_DIR_PATH = CurrentDir
 Strconcat INI_DIR_PATH '\ini\'

;;-------------------------------------------------------
;; ホスト選択画面を作成する
;;-------------------------------------------------------
;; ホストファイルの行数を取得する
 Fileopen HOST_LIST HOST_FILE 0
 i = 0
 While
 Filereadln HOST_LIST LIST_LINE

 ;;ファイル読み込みの終了処理
 If result = 1 Then
 Break
 Endif

 ;; 空白行を無視する
 Strlen LIST_LINE
 If result = 0 Then
 Continue
 Endif

 ;; 「#」から始まる行をコメントとして無視
 Strmatch LIST_LINE '^#'
 If result <> 0 Then
 Continue
 Endif
 i=i+1
 EndWhile

;; 配列を作成
 Strdim HOST_NAME i
 Strdim HOST_INI i
 Strdim HOST_IP i
 Strdim HOST_USER i
 Strdim HOST_PASS i
 Strdim HOST_ROOT_USER i
 Strdim HOST_ROOT_PASS i
 Strdim HOST_SUDO_FLAG i

;; ホストに関する情報をホストファイルから取得する
 Fileopen HOST_LIST HOST_FILE 0
 i = 0
 While
 Filereadln HOST_LIST LIST_LINE

 ;;ファイル読み込みの終了処理
 If result = 1 Then
 Break
 Endif

 ;; 空白行を無視する
 Strlen LIST_LINE
 If result = 0 Then
 Continue
 Endif

 ;; 「#」から始まる行をコメントとして無視
 Strmatch LIST_LINE '^#'
 If result <> 0 Then
 Continue
 Endif

 ;;ホストに関する情報を各変数へ代入する
 Strsplit LIST_LINE ','
 HOST_NAME[i] = Groupmatchstr1
 HOST_INI[i] = Groupmatchstr2
 HOST_IP[i] = Groupmatchstr3
 HOST_ROOT_USER[i] = Groupmatchstr4
 HOST_ROOT_PASS[i] = Groupmatchstr5
 HOST_USER[i] = Groupmatchstr6
 HOST_PASS[i] = Groupmatchstr7
 HOST_SUDO_FLAG[i] = Groupmatchstr8

 i=i+1
 Endwhile

;; ホスト選択画面を表示させる
 listbox 'ログインするホストを選択してください' 'ホスト選択' HOST_NAME

;;-------------------------------------------------------
;; 選択されたホストにログインを行う
;;-------------------------------------------------------
;; ホスト選択画面で選択されたホストの情報を変数に代入する
 If result >= 0 then
 HOST_CONNECT_NAME = HOST_NAME[result]
 HOST_CONNECT_INI = HOST_INI[result]
 HOST_CONNECT_IP = HOST_IP[result]
 HOST_CONNECT_ROOT_USER = HOST_ROOT_USER[result]
 HOST_CONNECT_ROOT_PASS = HOST_ROOT_PASS[result]
 HOST_CONNECT_USER = HOST_USER[result]
 HOST_CONNECT_PASS = HOST_PASS[result]
 HOST_CONNECT_SUDO_FLAG = HOST_SUDO_FLAG[result]
 Else
 End
 Endif

;; ログイン用のユーザーが定義されているか確認する
 Strlen HOST_CONNECT_USER
 If result <> 0 Then
 SSH_CONNECT_USER = HOST_CONNECT_USER
 SSH_CONNECT_PASS = HOST_CONNECT_PASS
 Else
 SSH_CONNECT_USER = HOST_CONNECT_ROOT_USER
 SSH_CONNECT_PASS = HOST_CONNECT_ROOT_PASS
 Endif

;; 接続用のINIファイルPATHを取得する
 INI_FILE = INI_DIR_PATH
 Strconcat INI_FILE HOST_CONNECT_INI

;; SSH接続コマンドを作成する
 COMMAND = HOST_CONNECT_IP
 Strconcat COMMAND ':22 /ssh /2 /auth=password /F="'
 Strconcat COMMAND INI_FILE
 Strconcat COMMAND '" /user='
 Strconcat COMMAND SSH_CONNECT_USER
 Strconcat COMMAND ' /passwd='
 Strconcat COMMAND SSH_CONNECT_PASS

;; SSH接続を行う
 Connect COMMAND

;;-------------------------------------------------------
;; ログの記録を開始する
;;-------------------------------------------------------
;; ログ名に利用する日付情報を取得する
 Getdate Str_Getdate
 Strcopy Str_Getdate 1 4 Str_Year
 Strcopy Str_Getdate 6 2 Str_Mon
 Strcopy Str_Getdate 9 2 Str_Day

;; ログ名に利用する時刻情報を取得する
 Gettime Str_Gettime
 Strcopy Str_Gettime 1 2 Str_Hour
 Strcopy Str_Gettime 4 2 Str_Min
 Strcopy Str_Gettime 7 2 Str_Sec

;; ログ名を生成する
 LOG_PATH = LOG_DIR_PATH
 Strconcat LOG_PATH Str_Year
 Strconcat LOG_PATH Str_Mon
 Strconcat LOG_PATH Str_Day
 Strconcat LOG_PATH '_'
 Strconcat LOG_PATH Str_Hour
 Strconcat LOG_PATH Str_Min
 Strconcat LOG_PATH Str_Sec
 Strconcat LOG_PATH '_'
 Strconcat LOG_PATH HOST_CONNECT_NAME
 Strconcat LOG_PATH '.log'

;; 現在記録しているログの情報を取得する
 Loginfo NOW_LOG_PATH

;; 現在ログが記録されていた場合、マクロで規定したフォルダに移動する
 If result <> -1 Then
 ;; 一度ログの記録を停止する
 Logclose

 ;; 取得されていたログをマクロで規定した場所にコピーする
 Filecopy NOW_LOG_PATH LOG_PATH

 ;; 取得されていたログを削除する
 Filedelete NOW_LOG_PATH
 Endif

;; ログの記録を開始する
 Logopen LOG_PATH 0 1 1 1

;;-------------------------------------------------------
;; Command.listの内容を実行させる
;;-------------------------------------------------------
;; host.listでログインユーザの設定がされていたか確認する
 Strlen HOST_CONNECT_USER
 If result <> 0 Then
 Wait '$' '#'
 Sendln ''

 Wait '$' '#'
 Sendln '#rootユーザーにスイッチする'

 ;; 「sudo su -」でスイッチする必要がある場合
 Strlen HOST_CONNECT_SUDO_FLAG
 If Result > 0 Then
 Wait '$' '#'
 Sendln 'sudo su -'

 Wait ':'
 Sendln SSH_CONNECT_PASS
 Else
 Wait '$' '#'
 Sendln 'su -'

 Wait ':'
 Sendln HOST_CONNECT_ROOT_PASS
 Endif
 Endif
 Wait '$' '#'
 Sendln ''

;; Command.listを読み込む
 Fileopen COMMAND_LIST COMMAND_FILE 0
 While 1
 Filereadln COMMAND_LIST COMMAND_LIST_LINE
 If RESULT = 1 Then
 Break
 Endif

 Flushrecv
 Wait '$' '#'
 Sendln COMMAND_LIST_LINE
 Endwhile
 Fileclose COMMAND_LIST
End

2.host.list

各ホストの情報を記述する。2列目に、iniファイル名を記述するように変更した。 列の順番は、左から順に以下のようになっている。

  • HOST_NAME(任意の名称。接続するホストの選択時やログ名に利用する)
  • HOST_INI(接続時に使用するiniファイル名。)
  • HOST_IP(ホストのIPアドレス。接続時に利用する)
  • HOST_ROOT_USER(管理者ユーザ名。ログインユーザを設定してスイッチする場合はrootユーザを設定)
  • HOST_ROOT_PASS(管理者ユーザパスワード。)
  • HOST_USER(ログインユーザ名。管理者ユーザで直接ログイン出来る場合は不要。)
  • HOST_PASS(ログインユーザパスワード。管理者ユーザで直接ログイン出来る場合は不要。)
  • SUDO_FLAG(スイッチ文を「sudo su -」とするか否か。何かしら(0でも1でも)入力すると有効になる。)

記述例を以下に記述する。

# SSHAutoLogin.ttl用 ログインホスト設定ファイル
# 左から順に、以下の内容を記述していく。
# HOST_NAME(任意の名称。接続するホストの選択時やログ名に利用する。必須。)
# HOST_INI(任意のINIファイル名。Teraterm実行時に読み込むiniファイルを指定する。必須。)
# HOST_IP(ホストのIPアドレス。接続時に利用する。必須。)
# HOST_ROOT_USER(管理者ユーザ名。ログインユーザを設定してスイッチする場合はrootユーザを設定。必須。)
# HOST_ROOT_PASS(管理者ユーザパスワード。必須。)
# HOST_USER(ログインユーザ名。管理者ユーザで直接ログイン出来る場合は不要。)
# HOST_PASS(ログインユーザパスワード。管理者ユーザで直接ログイン出来る場合は不要。)
# SUDO_FLAG(スイッチ文を「sudo su -」とするか否か。何かしら(0でも1でも)入力すると有効になる。スイッチ時のコマンドが「su -」の場合は不要)

# HOST_NAME, HOST_INI, HOST_IP, HOST_ROOT_USER, HOST_ROOT_PASS, HOST_USER, HOST_PASS, SUDO_FLAG

# CentOS(「su -」)でスイッチする例
Test-CentOS1,CentOS.ini,172.28.0.101,root,password,test,password

# CentOS(「su -」)でスイッチせずに直接ログインする例
Test-CentOS2,CentOS.ini,172.28.0.102,root,password

# Ubuntu(sudo su -)でスイッチする例
Test-Ubuntu1,Ubuntu.ini,172.28.0.103,test,password,test,password,1st,1
CCC,CCC.ini,172.26.15.242,cccuser,Password3

Command.listについては以前のものと変わらず、iniファイルはただ同じ名称のteraterm.iniを配置するだけなので割愛。 マクロのファイルは、こちらにアップしておいた。