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

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

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を利用しようと考えたのだが、ブロードキャストコマンドが有効になっているのにも関わらず、どうもコマンドが送信されなかったので断念した。

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