複数ウィンドウを開き、コマンド実行の上でブロードキャストコマンドウィンドウを表示させるTeratermマクロ
Pocket

一時的に各サーバの動作を監視したいとき、Teratermのウィンドウを複数表示させ、ブロードキャストコマンドで一括でコマンドを実行する事がある。
今回は、そんな時に利用できるよう、host.listに記述されたホストに対し連続でログインしコマンドを実行、ウィンドウを整列させブロードキャストコマンドのウィンドウを表示させるマクロを作成した。

基本的には、以前書いたログイン先を選択して自動ログインを行うTeratermマクロをカスタマイズしたものだ。
ファイルの種類などはこのマクロと同じため、メインとなるttlファイルの内容のみを記述する。

Sponsored Links

●SSHBroadCast.ttl

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;  Filename : SSHBroadCast.ttl
;  Description : SSH Auto login BroadCast Command
;  Author : Blacknon
;  Created : 2015/03/30
;  Modified :
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;-------------------------------------------------------
;; 接続時の基本的な情報を設定する
;;-------------------------------------------------------
;; ホストに関する情報をもつファイル「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\'
;;-------------------------------------------------------
;; 「host.list」に記述されたホストに連続で接続を行っていく
;;-------------------------------------------------------
;; ホストに関する情報をホストファイルから取得する
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
;;===================================================
;; 前回While時のマクロとウィンドウの接続を切断する
;;===================================================
;; Teratermマクロとウィンドウの接続を切断する
unlink
;;===================================================
;; 接続処理を開始する
;;===================================================
;;ホストに関する情報を各変数へ代入する
Strsplit LIST_LINE ','
HOST_NAME          = Groupmatchstr1
HOST_INI           = Groupmatchstr2
HOST_IP            = Groupmatchstr3
HOST_ROOT_USER     = Groupmatchstr4
HOST_ROOT_PASS     = Groupmatchstr5
HOST_USER          = Groupmatchstr6
HOST_PASS          = Groupmatchstr7
HOST_SUDO_FLAG     = Groupmatchstr8
;; ログイン用のユーザーが定義されているか確認する
Strlen HOST_USER
If result <> 0 Then
SSH_CONNECT_USER = HOST_USER
SSH_CONNECT_PASS = HOST_PASS
Else
SSH_CONNECT_USER = HOST_ROOT_USER
SSH_CONNECT_PASS = HOST_ROOT_PASS
Endif
;; 接続用のINIファイルPATHを取得する
INI_FILE = INI_DIR_PATH
Strconcat INI_FILE HOST_INI
;; SSH接続コマンドを作成する
COMMAND = HOST_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
Strconcat COMMAND ' /nosecuritywarning'
;; 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_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 1
;;===================================================
;; rootユーザーに切り替えを行う
;;===================================================
;; host.listでログインユーザの設定がされていたか確認する
Strlen HOST_USER
If result <> 0 Then
Wait '$' '#'
Sendln ''
Wait '$' '#'
Sendln '#rootユーザーにスイッチする'
;; 「sudo su -」でスイッチする必要がある場合
Strlen HOST_SUDO_FLAG
If Result > 0 Then
Wait '$' '#'
Sendln 'sudo su -'
Wait ':'
Sendln SSH_CONNECT_PASS
Else
Wait '$' '#'
Sendln 'su -'
Wait ':'
Sendln HOST_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
i=i+1
EndWhile
;;-------------------------------------------------------
;; ウィンドウの整列・ブロードキャストコマンドウィンドウの表示を行う
;;-------------------------------------------------------
;; ウィンドウを並べて表示させる 
callmenu 50815
callmenu 50445
;; Command.listを読み込む
Fileopen COMMAND_LIST COMMAND_FILE 0
While 1
Filereadln COMMAND_LIST COMMAND_LIST_LINE
If RESULT = 1 Break
;;Sendlnbroadcast COMMAND_LIST_LINE
Sendlnbroadcast 'exit'
;;messagebox COMMAND_LIST_LINE "test"
Endwhile
Fileclose COMMAND_LIST
End

 

作成にあたって、Teratermマクロに用意されているsendbroadcastやsendlnbroadcastを利用しようと考えたのだが、ブロードキャストコマンドが有効になっているのにも関わらず、どうもコマンドが送信されなかったので断念した。

作成したファイルについては、こちらにアップしておく。

Pocket

Written by blacknon

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

Leave a Comment

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

*