ログイン先を選択して自動ログインを行うTeratermマクロ(ユーザスイッチ対応・マクロでのログ強制管理etc…対応版)

2017/02/18

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

https://github.com/blacknon/TeratermListLoginMacro

 

以前記述した、ログイン先をリストボックスで選択して自動的にログインするTeratermマクロを改修・改良した。
といってもそんなに大きい変更はしておらず、以下の内容について変更を加えただけだ。

  • ログインユーザから管理者ユーザへのスイッチ(「su」もしくは「sudo su -」コマンドでの対応)
  • ログイン時に自動的に実行させるコマンドの定義(command.list)
  • Teraterm側でログの自動取得が有効になっていても、マクロ側でログを管理させるようにする
  • host.listの空白行・コメント行の対応

このマクロは、以下の4つで構成されている。

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

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

Sponsored Links

1.SSHAutoLogin.ttl

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

●SSHAutoLogin.ttl

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;  Filename : SSHAutoLogin.ttl
;  Description : SSH Auto login - host selection listbox from host.list
;  Author : Blacknon
;  Created : 2015/01/18
;  Modified :
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;-------------------------------------------------------
;; 接続時の基本的な情報を設定する
;;-------------------------------------------------------
;; ホストに関する情報をもつファイル「host.list」の場所を設定する
HOST_FILE = "host.list"
;; ログイン時に実行させるコマンドの情報をもつファイル「command.list」の場所を設定する
COMMAND_FILE = "command.list"
;; ログ作成用ディレクトリの情報を取得する
Getdir CurrentDir
LOG_DIR_PATH = CurrentDir
Strconcat LOG_DIR_PATH '\log\'
;;-------------------------------------------------------
;; ホスト選択画面を作成する
;;-------------------------------------------------------
;; ホストファイルの行数を取得する
Fileopen HOST_LIST HOST_FILE 0
i = 0
While
Filereadln HOST_LIST LIST_LINE
;;ファイル読み込みの終了処理
If result = 1 Break
;; 空白行を無視する
Strlen LIST_LINE
If result = 0 continue
;; 「#」から始まる行をコメントとして無視
Strmatch LIST_LINE '^#'
If result <> 0 continue
i=i+1
EndWhile
;; 配列を作成
Strdim HOST_NAME 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 Break
;; 空白行を無視する
Strlen LIST_LINE
If result = 0 continue
;; 「#」から始まる行をコメントとして無視
Strmatch LIST_LINE '^#'
If result <> 0 continue
;;ホストに関する情報を各変数へ代入する
Strsplit LIST_LINE ','
HOST_NAME[i]      = Groupmatchstr1
HOST_IP[i]        = Groupmatchstr2
HOST_ROOT_USER[i] = Groupmatchstr3
HOST_ROOT_PASS[i] = Groupmatchstr4
HOST_USER[i]      = Groupmatchstr5
HOST_PASS[i]      = Groupmatchstr6
HOST_SUDO_FLAG[i] = Groupmatchstr7
i=i+1
Endwhile
;; ホスト選択画面を表示させる
listbox 'ログインするホストを選択してください' 'ホスト選択' HOST_NAME
;;-------------------------------------------------------
;; 選択されたホストにログインを行う
;;-------------------------------------------------------
;; ホスト選択画面で選択されたホストの情報を変数に代入する
If result >= 0 then
HOST_CONNECT_NAME      = HOST_NAME[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
;; SSH接続コマンドを作成する
COMMAND = HOST_CONNECT_IP
Strconcat COMMAND ':22 /ssh /2 /auth=password /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 Break
Flushrecv
Wait '$' '#'
Sendln COMMAND_LIST_LINE
Endwhile
Fileclose COMMAND_LIST
End

2.host.list

各ホストの情報を記述する。列の順番は、左から順に以下のようになっている。

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

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

●host.list

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

3.Command.list

Command.listは、ただのコマンドの羅列だ。
例えば、以下のように記述する。

●Command.list

#dateコマンドを実行する
date
#whoamiコマンドを実行する
whoami
#pwdコマンドを実行する
pwd
#hostnameコマンドを実行する
hostname

実際に、このマクロでアクセスした例がこちら。
まず、接続したいホストを以下の画面で選択。

20150118_000007

 

選択後、Teratermのウィンドウが開き管理ユーザにスイッチ、Command.listに記述されているコマンドが実行される。

20150118_000008

 

Ubuntuで接続した場合は、「sudo su -」でスイッチされている。

20150118_000009

 

マクロのファイルは、こちらにアップしておいた。


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 1 comments

  1. Pingback: Pythonによるssh自動接続用スクリプト(試作) | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

メールアドレスが公開されることはありません。

*