Pocket

2014/02/26 追記
「host.list」にユーザ名、パスワードを記述する改良版を作成しました。

2014/03/04
更に改良を加え、外部host.listの他にコマンドを使用するコマンドを羅列したcommand.listを外部から読み込ませる方式に変更しました。また、host.listとcommand.listはマクロ実行時に選択させるようにしたので、Teratermマクロがわからない人でも使用可能。対象のマクロはこちら

先日、何十台の同一構成で構築されたLinuxサーバに一括で同一コマンドを実行させる対応があったので、そのためのTeratermマクロを作成した。

参考にしたページは以下。

人見知りネットワークエンジニアのblog :TeraTermマクロでAlaxalA機器のログを取る

http://blog.livedoor.jp/futa_se/archives/3034624.html

使用できる条件は以下。

  1. 全サーバで認証方式が同じ
  2. 全サーバでユーザ名、パスワードが同じ
  3. 全サーバで実行するコマンドが同じ

別途ホスト一覧ファイルを用意し、それを読み込ませて実行させる方式。

Sponsored Links

ホスト名一覧は以下のように記述する。

●host.list

#Memo1
server_hostname1
192.168.0.100
#Memo2
server_hostname2
192.168.0.101

「host.list」で、ホスト名は1サーバにつき3行で構成される。
1行目にコメントを、2行目にホスト名を記述し、3行目にIPアドレスを記述する。
ホスト名はログの名称に使用されるので、実際の接続に使われるのはIPアドレスになる。

●一括コマンド実行.ttl

;[Before]=====================================================
; Get Host List
HOSTFILE='C:\teraterm\hostlist.txt'
 
; UserName/Password
USERNAME='root'
PASSWORD='root'
 
; Log Folder
LOGSPATH='C:\teraterm\log\'
 
; Get Date
getdate Str_Getdate
strcopy Str_Getdate 1 4 Str_Year
strcopy Str_Getdate 6 2 Str_Mon
strcopy Str_Getdate 9 2 Str_Day
 
; Get Time
gettime Str_Gettime
strcopy Str_Gettime 1 2 Str_Hour
strcopy Str_Gettime 4 2 Str_Min
strcopy Str_Gettime 7 2 Str_Sec
 
;[MAIN]=======================================================
; Open Host List
fileopen HOSTLIST HOSTFILE 0
filereadln HOSTLIST HOSTNAME
while result=0
strlen HOSTNAME
if result=0 goto END
 
; Host List Line is Not Comment, Goto SubRoutine SSH_CONNECT
strmatch HOSTNAME '^#'
if result<>1 CALL SSH_CONNECT
 
 
;[END]========================================================
; SubRoutine END
:END
filereadln HOSTLIST HOSTNAME
endwhile
 
; Close Host List
fileclose HOSTLIST
 
; Finish This Macro
end
 
 
;[SSH_CONNECT]================================================
:SSH_CONNECT
; Write Log
FULLPATH = LOGSPATH
strconcat FULLPATH Str_Year
strconcat FULLPATH Str_Mon
strconcat FULLPATH Str_Day
strconcat FULLPATH '_'
strconcat FULLPATH Str_Hour
strconcat FULLPATH Str_Min
strconcat FULLPATH Str_Sec
strconcat FULLPATH '_'
 
strconcat FULLPATH HOSTNAME
strconcat FULLPATH '.log'
 
; Remote Access Server(SSH Connect)
filereadln HOSTLIST HOSTIP
sh_connect=HOSTIP
strconcat sh_connect ' /ssh /2 /nosecuritywarning /auth=password /user='
strconcat sh_connect USERNAME
strconcat sh_connect ' /passwd='
strconcat sh_connect PASSWORD
 
connect sh_connect
 
; Connet decision
if result<>2 then
strconcat FULLPATH '.error'
filecreate ERRORFILE FULLPATH
fileclose ERRORFILE
closett
return
endif
 
; Log write
logopen FULLPATH 1 1
logwrite '************************************************'#13#10
logwrite 'hostname :'
logwrite HOSTNAME
logwrite #13#10
 
logwrite 'username :'
logwrite USERNAME
logwrite #13#10
 
logwrite 'Execution time :'
Str_Get=Str_Getdate
strconcat Str_Get ' '
strconcat Str_Get Str_Gettime
logwrite Str_Get
logwrite #13#10
logwrite '************************************************'#13#10
logwrite #13#10
 
; Run Program
; 1
wait '@'
sendln 'df -h'
 
; 2
wait '@'
sendln 'free'
 
; 3
wait '@'
sendln 'dmidecode'
 
; Last
wait '@'
 
closett
return

「Before」で指定している変数の値を設定して使う。
実際に一括実行させるコマンドは「Run Program」以下に記述する。

とまあ、こんな感じ。少々おそまつだけど、UNIX系OSに対し一括でコマンドを実行させたいけど、rshを有効にしていない時に有効となる。

 

Pocket

Written by blacknon

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

Leave a Comment

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