Tera Termマクロ活用入門(2):リモートマシンを自在に操作する

 「Tera Term」(テラターム)はWindows向けのターミナルエミュレータとして有名だが、マクロ機能を利用することでネットワーク経由でサーバーやネットワーク機器を自動制御するためのツールとしても利用できる。今回は、ネットワーク経由でLinuxサーバーを制御したり、Windowsのバッチファイルと連携させて使用する例を紹介しよう。

TeraTermおよびTeraTermマクロを活用しよう

 前回は「Tera Termマクロ活用入門(1):各種ログインを自動化する」と題し、Tera Termマクロの基本と、SSHを利用した自動ログインを行うマクロなどを紹介した。続いて本記事では、ネットワーク経由でLinuxサーバーを操作する例として、ログの取得やバッチ処理の実行、Windowsのバッチファイルとの連携などを行うマクロを紹介しよう。

 なお、Tera Termの詳しい紹介やインストール方法、基本的な使い方、Cygwinとの連携方法などについては『Windows用定番SSHクライアント「Tera Term」の使い方』という記事でまとめられているので、こちらも参照していただきたい。

リモートのマシンでコマンドを実行し、その結果をローカルのファイルとして保存する

 ネットワーク経由でサーバーを管理している場合、頻繁に利用するような各種診断コマンドやメンテナンスコマンド、ログの取得コマンドなどを自動実行するマクロを用意しておくと便利だ。次のリスト1は、「ネットワーク経由でSSH接続およびログイン→ログ取得の開始→コマンドの実行→ログアウト」という一連の作業を自動実行するマクロである。

 このマクロでは、あらかじめ指定しておいたユーザー名で指定ホストにログインし、「df」コマンドを実行してその結果をローカルの指定ディレクトリに「df-<日付>-<時間>.log」というファイル名で保存するというものだ。この例ではdfコマンドを発行しているが、マクロ内の(1)の部分を書き換えることで任意のコマンドを実行できる。

リスト1 リモートマシンでdfコマンドを実行するTera Termマクロ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '<ユーザー名>'
hostname = "<ホスト名>"
keyfile = "<SSH公開鍵のパス名>"

remote_prompt = "$"  ; リモートマシンのプロンプト記号。bash系なら「$」、cshなら「%」、tcshなら「>」など
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; パスワードの入力を求める
msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

; ログイン処理を実行
msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg inputstr
strconcat msg '"'
connect msg

; ログイン後の処理
; 日時から保存ファイル名を組み立てる
logfile = "Z:\softrev\teraterm2\"
getdate timestamp "df-%Y%m%d-%H%M%S.log
strconcat logfile timestamp

logopen logfile 0 0  ; ログの記録を開始
wait remote_prompt
sendln "df"  ; 「df」コマンドを実行(1)
wait remote_prompt
logclose  ; ログ記録を終了
closett  ; 切断

 この例では公開鍵認証を使用し、接続毎にパスフレーズを入力してログインを行っているが、パスフレーズをパスワードファイルに保存しておき、自動的にログインを行うことも可能だ。前回記事の「SSHで自動ログインを行う」を参考にマクロを修正して欲しい。

 なお、リスト1のマクロでは、あくまでログとして結果をファイルに保存しているため、得られたファイルには下記のようにプロンプトやログインメッセージなどの情報が付加されてしまう。また、この方法ではテキスト形式のデータしか保存できない。

Last login: Fri Jan 15 18:34:17 2010 from *****.com
user11@*****:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda1              3842376   1451204   2195984  40% /
tmpfs                   513300         0    513300   0% /lib/init/rw
tmpfs                   513300         0    513300   0% /dev/shm
/dev/hda2               980340      8412    922128   1% /tmp
/dev/hda4             31657192    596480  29452608   2% /var
sf-file-users:/home/users
                     570593184 225962840 338833448  41% /home/users
sf-file-groups:/home/groups
                     865014080 292452944 563773096  35% /home/groups
user11@*****:~$

リモートのマシンでコマンドを実行し、その出力をローカルにファイルとして保存する

 プロンプトやログインメッセージを含まない生の出力結果が欲しい場合や、出力結果がバイナリデータだった場合は、次のリスト2のように出力を一時ファイルに保存し、それをSCPでローカルに転送する、という方法を利用すればよい。Tera TermにはSCPクライアント機能も備えられており、Tera Termマクロの「scprecv」や「scpsend」コマンドでSCPによるファイルの転送が行える。次のリスト2は、コマンドの実行結果を一時ファイルとして保存し、それを「scprecv」コマンドを利用してローカルにscpでコピーしているというものだ。

リスト2 特定のマシンにSSHで接続してコマンドを実行し、その結果をファイルに保存してローカルにコピーするTera Termマクロ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Username = '<ユーザー名>'
hostname = "<ホスト名>"
keyfile = "<SSH公開鍵のパス名>"

remote_prompt = "$"  ; リモートマシンのプロンプト記号。bash系なら「$」、cshなら「%」、tcshなら「>」など
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; パスワードの入力を求める
msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

; ログイン処理を実行
msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg inputstr
strconcat msg '"'
connect msg

; ログイン後の処理
; 日時から保存ファイル名を組み立てる
logfile = "Z:\softrev\teraterm2\"  ; 結果の保存先
getdate timestamp "dmesg-%Y%m%d-%H%M%S.log"  ; ファイル名
strconcat logfile timestamp

wait remote_prompt  ; ログイン完了を待つ
sendln "dmesg > /tmp/dmesg.tmp"  ; dmesgを実行し、結果を「/tmp/dmesg.tmp」に保存(1)
wait remote_prompt  ; 処理終了を待つ

scprecv "/tmp/dmesg.tmp" logfile  ; 「/tmp/dmesg.tmp」をscpでローカルにコピー(2)
mpause 100  ; 0.1秒間待機
sendln "exit"  ; 切断
unlink  ; 制御終了

こちらも、(1)の部分を任意のコマンドに変更したり、(2)の部分で指定するファイルを変更することでさまざまにカスタマイズが行える。

バッチファイルとの連携

 Windows上で簡単な定型処理を実行する方法の1つに、バッチファイルを利用するものがある。バッチファイルはMS-DOS時代から備えられているシンプルな自動処理機構で、利用した経験があるユーザーも多いだろう。続いては、このバッチファイルとTera Termマクロを連携させる例を紹介しよう。

 Tera Termのマクロ機能は「ttpmacro.exe」という実行ファイルが担っており、バッチファイル内で実行したいマクロファイルを引数にttpmacro.exeを実行することで、バッチファイル内からTera Termマクロを呼び出すことができる。

 次のリスト3、4はバッチファイルとTera Termマクロを利用し、任意のファイルを指定したサーバーにSCPでアップロードする、という例だ。リスト3のマクロを「scpupload.ttl」、リスト4のマクロを「scpupload.bat」という名前で同じディレクトリに保存し、次のようにコマンドプロンプトから実行することで指定したサーバーにファイルをアップロードできる。

> scpupload.bat <アップロードするファイル> <保存先パス名>

リスト3 SCPで任意のファイルをアップロードするTera Termマクロ(scpupload.ttl)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Username = '<ユーザー名>'
hostname = "<ホスト名>"
keyfile = "<SSH公開鍵のパス名>"

remote_prompt = "$"  ; リモートマシンのプロンプト記号。bash系なら「$」、cshなら「%」、tcshなら「>」など
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; パスワードの入力を求める
msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

; ログイン処理を実行
msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg inputstr
strconcat msg '"'
connect msg

; ログイン後の処理
; SCPを実行
wait remote_prompt  ; 接続待ち
scpsend param2 param3  ; 指定したファイルをscpでアップロード
mpause 100 ; 0.1秒間待機

; 切断
sendln "exit"  ; 切断
unlink  ; 制御終了

リスト4 SCPで任意のファイルをアップロードするバッチファイル

@echo off
REM scp upload with Tera Term
if "%1" == "" goto error

"C:\Program Files\teraterm\ttpmacro.exe" /I %~dp0scpupload.ttl %1 %2
goto end

:error
echo ttscp.bat file dest

:end

 この例では、ttpmacro.exeの引数として処理したいファイルの名前を与えている。ttpmacro.exeに与えた引数は、Tera Termマクロ内では順に「param2」、「param3」、「param3」……という変数名でアクセス可能だ。Tera Termマクロ内では、引数をそのまま「scpsend」コマンド(指定したファイルをSCPでアップロードするコマンド)の引数に与えている。なお、引数としてはファイルのフルパスを与える必要がある点に注意して欲しい。

 ここでは解説のため簡単な例を挙げているが、これらを利用してたとえばローカル側で実行した処理結果をリモートマシンに自動アップロードし、リモートマシンで処理してその結果をローカルマシンに返す、といった応用なども考えられるだろう。

今回紹介したツール:TeraTerm