Tera Termマクロ活用入門(1):各種ログインを自動化する

 Windows向けのターミナルエミュレータ「Tera Term」(テラターム)には強力なマクロ機能が搭載されており、これを利用することでネットワーク経由でマシンを自動操作したり、管理情報を取得する、といったことが可能だ。本記事ではいくつかのサンプルとともにTera Termマクロの基本的な使い方を紹介する。

Tera TermおよびTera Termマクロの基本

 Tera Termのマクロ機能を紹介する前に、簡単にTera Termについて紹介をしておこう。Tera Termはオープンソースで開発されているWindows向けのターミナルエミュレータ(端末エミュレータ)だ。かつてはTelnetクライアントやCOMポート経由でのシリアル接続機能を備えた無償のターミナルエミュレータとして有名だったが、1998年にいったん開発が中断された後にオープンソース化され、現在ではSSHクライアント機能やCygwinとの連携機能、UTF-8対応などが追加されている。なお、Tera Termの詳しい紹介やインストール方法、基本的な使い方、Cygwinとの連携方法などについては『Windows用定番SSHクライアント「Tera Term」の使い方』という記事でまとめられているので、こちらも参照していただきたい。

 さて、Tera Termにはマクロ機能が搭載されており、リモートログインを自動化したり、ネットワーク経由でUNIX/Linuxサーバーなどを自動操作することができる。本記事ではこのマクロ機能の概要を紹介するとともに、まずは自動ログイン/自動多段ログインを行うマクロを紹介する。これらをうまく利用することで、日々の作業効率を大幅にアップできるのではないだろうか。

Tera Termマクロを利用する前の事前準備

 Tera Termのマクロを利用したい場合、Tera Termのマクロファイル(拡張子は「.ttl」)とTera Termのマクロ実行エンジン「ttpmacro.exe」を関連付けておくことで、.ttlファイルをダブルクリックするだけでマクロを実行できるようになる(図1)。これはTera Termのインストーラで設定できるが、デフォルトでは関連付けを行わない設定になっている(図2)。すでにTera Termをインストールしている環境では再度インストーラを実行するか、エクスプローラの設定で関連付けを行っておこう。

図1 .ttlファイルと「ttpmacro.exe」を関連付けておくことで、.ttlファイルのダブルクリックでマクロを実行できるようになる
図1 .ttlファイルと「ttpmacro.exe」を関連付けておくことで、.ttlファイルのダブルクリックでマクロを実行できるようになる
図2 インストーラの「追加タスクの選択」画面で、「.ttlファイルをttpmacro.exeに関連付ける」にチェックを入れておこう
図2 インストーラの「追加タスクの選択」画面で、「.ttlファイルをttpmacro.exeに関連付ける」にチェックを入れておこう

Tera Term用のマクロ言語「Tera Term Language(TTL)」の文法とドキュメント

 Tera Term用のマクロ言語は「Tera Term Language(TTL)」と呼ばれている。文法や利用できるコマンドの一覧についてはドキュメントを参照してほしいが、基本的には処理したいコマンドを1行に1つづつ順番に記述していく、というものになっている。もちろん変数も利用可能だ。

 TTLはさまざまなコマンドや制御構文を備えているが、まず覚えておきたいのが変数の代入と文字列の連結だ。変数への代入は、「<変数名> = <値>」という形で行える。なお、文字列を代入する場合は文字列を「”」もしくは「’」で囲む必要がある。

 たとえば変数var1に「hogehoge」という文字列を、変数var2には12345という数値をセットするには、以下のようにする。

var1 = 'hogehoge'
var2 = 12345

 そのほか、TTLの文法を簡単にまとめると次のようになる。

  • マクロファイル中の「;」から行末まではコメントとなり無視される
  • 空白(スペース、タブ)だけで構成される行は無視される
  • 「:」から始まる行はラベルとなる。ラベルは「goto」や「call」コマンドなどで使われる
  • 変数の宣言は不要(変数への代入が宣言の代わりとなる)
  • 変数名/コマンド名の大文字/小文字は区別されない
  • TTLで扱える値は整数(32bit符号付き)および文字列の2種類
  • 文字列の最大長は255文字
  • 変数名の1文字目はアルファベット(A〜Z、a〜z)および「_」。2文字以降はこれに加えて数字も利用可能。変数名の最大長は32文字
  • ラベル名には英数字(A〜Z、a〜z、0〜9、_)が利用可能。最大長は32文字
  • 利用できる演算子はC言語とほぼ同じ。ただし、「=」は比較にも利用できる(演算子「==」と同義)

TTLの制御コマンド

 TTLではifやfor、whileなど、条件分岐やループを行う制御コマンドが用意されている。詳しくはTTLコマンドリファレンスを参照して欲しいが、よく使われると思うものは以下のとおりだ。

if〜then〜elseif〜else〜endif(条件分岐)

 TTLでは、ifコマンドで条件分岐を行える。ifの後に続く条件式が真(0以外)なら、続くendifの間までに記述されたコマンドが実行される。また、elseifを使ってさらに条件分岐を行ったり、elseで条件が偽の場合の処理も記述できる。使用例は以下のとおりだ。

; if〜elseif〜else〜endifによる条件分岐
a = 1
if a = 1 then      ; aが1の場合
  b = "hogehoge"
elseif a = 2 then  ; aが2の場合
  b = "foo"
elseif a = 3 then  ; aが3の場合
  b = "foobar"
else               ; aがそれ以外の場合
  d = ""
endif

for(ループ)

 forコマンドは、C言語スタイルのforループを実装するコマンドである。forコマンドは制御変数、初期値、終了値という3つの引数を取る。

; forループ
for n 1 10     ; for〜nextまでの処理を、n=1からn=10まで計10回繰り返す
  send 'a'     ; "a"という文字を送信する
next

while(ループ)

 forのほか、whileによるループも使用可能だ。whileに続く条件式が真の間、endwhileまでの処理を繰り返す。

; whileループ
n = 1
while n < 11   ; 上記のfor〜nextループと同等のものをwhileで書いたもの
  send 'a'
  n = n + 1
endwhile

gotoによるジャンプ

 そのほか、マクロ中の特定の位置にジャンプするgotoコマンドも用意されている。

; gotoによるジャンプ
if b = "foobar" goto :END   ; ラベル「END」にジャンプする

<適当な処理>

:END  ; ラベル「END」

callによるジャンプ

 TTLではユーザーが独自のコマンドを実装する機構は用意されていないが、ラベルとcall/returnコマンドを用いることで、サブルーチンを用意できる。callコマンドはgotoコマンドと同様に指定したラベルにジャンプするものだが、ジャンプ後にreturnコマンドを実行することで、callを呼び出した次の行に再度制御を移すことが可能な点が異なる。

; callによるジャンプ
if b = "foobar" call :SUB   ; ラベル「SUB」にジャンプする

<適当な処理>

:SUB  ; ラベル「SUB」
  send 'a'
  send 'b'
  send 'hogehoge'
return ; このサブルーチンから抜け、呼び出し元(call :SUB)の次の行に実行を移す

TTLのコマンド

 TTLでは多くのコマンドが用意されているが、最後によく利用されると思われるコマンドを紹介しておこう(表1)。詳細についてはTTLコマンドリファレンスを参照して欲しい。

表1 TTLでよく利用されると思われるコマンド(抜粋)
コマンド名および引数 意味
connect <パラメータ> パラメータで指定したホストに接続する。パラメータは文字列で指定する
send <文字列もしくは整数> 指定した文字列を送信する。整数が指定された場合はその下位バイトをASCIIコードと見なして対応する文字を送信する
sendln <文字列> 指定した文字列に改行文字を付加して送信する
logopen <ファイル名> <バイナリフラグ> <追加フラグ> 指定したファイルにログを記録する。バイナリフラグが0の場合、改行文字は変換され、エスケープシーケンスは無視される。1の場合、ホストから送信された内容がそのままログに記録される。追加フラグは0なら既存のファイルに追加、1ならファイルを新規作成して上書き
wait <文字列> 指定した文字列がホストから送られるまで待機する
strconcat <変数名> <文字列> 指定した変数内の文字列の末尾に指定した文字列を連結する
strmatch <文字列> <正規表現> 正規表現マッチを行い、マッチすればシステム変数resultに1を、そうでなければ0をセットする
sprintf2 <変数名> <フォーマット文字列> <引数>… 引数をフォーマット文字列で指定した形でフォーマットし、指定した変数に格納する

ログイン関連マクロ:自動ログイン、メニューから選択してログイン、多段ログイン

 Tera Termには、サンプルとしていくつかのマクロファイルが付属しており、Tera Term本体と同じフォルダにインストールされる。まずはこれらのサンプルの紹介もかねて、telnetやSSHを利用してリモートログインを自動的に行うマクロを紹介しよう。

SSHで自動ログインを行う

 Tera Term付属の「ssh2login.ttl」は、Tera Termに付属するサンプルマクロの1つで、SSHを使って指定したサーバーに自動接続するマクロだ。内容は以下のリスト1のようになっている。

リスト1 SSHでの自動ログインを行う「ssh2login.ttl」

; sample macro of Tera Term
;
; File: ssh2login.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2004/12/4
; Author: Yutaka Hirata

username = 'nike'     ; 「nike」をログインに使用するユーザー名に書き換える
hostname = '192.168.1.3'    ; 「192.168.1.3」を接続するサーバーのIPアドレス/サーバー名に書き換える

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password' ; パスワードボックスを表示し、入力された内容を変数msgに格納

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr

connect msg

 このスクリプトを適当な名前でコピーし、「username」および「hostname」の部分を接続に使用するユーザー名と接続するサーバーに書き換えて実行するとパスワードを入力するダイアログが表示される(図3)。ここでパスワードを入力して「OK」をクリックすると、指定したユーザー名でログインが行われる。

図3 マクロを実行すると、パスワードを入力するダイアログが表示される
図3 マクロを実行すると、パスワードを入力するダイアログが表示される

 なお、このマクロでは平文でパスワードを送信する設定になっているが、SSHサーバーの設定によっては平文パスワードでのログインが行えない場合もある。その場合はチャレンジ&レスポンス認証、もしくは公開鍵を使用した認証を利用するよう、上記のマクロを次のリスト2リスト3のように書き換えればよい。

リスト2 チャレンジ&レスポンス認証を使用してリモートログインを行うマクロ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '<ユーザー名>'
hostname = '<接続先IPアドレスもしくはホスト名>'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

msg = hostname
strconcat msg ':22 /ssh /auth=challenge /user=' ; 「/auth=challenge」で認証方法としてチャレンジ&レスポンス認証を指定
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr

connect msg

リスト3 公開鍵認証を使用してリモートログインを行うマクロ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '<ユーザー名>'
hostname = '<接続先IPアドレスもしくはホスト名>'
keyfile = '<使用する秘密鍵のパス名>'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user=' ; 「/auth=publickey」で認証方法として公開鍵認証を指定
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg inputstr
strconcat msg '"'
connect msg

 これらのマクロでは、セキュリティの観点から接続時に毎回パスワード/パスフレーズを入力させる仕様になっているが、毎回パスワードを入力するのを面倒に感じる人もいるだろう。次のリスト4、5は入力したパスワードを保存しておき、2回目以降はそれを利用してパスワード入力なしにログインを行うマクロだ。これらのマクロを実行すると、初回実行時のみパスワード/パスフレーズの入力が求められ、入力されたパスワード/パスフレーズを指定したパスワードファイルに暗号化して保存する。2回目以降に実行した場合は保存しておいたパスワードを使用して自動的にログインが行われる。

 なお、パスワードは指定したパスワードファイルに、次のような形式で保存される。

[Password]
<ユーザー名>@<ホスト名>=<暗号化されたパスワード>

 パスワードが暗号化されているとはいえ解読される可能性もあるため、このファイルは不特定多数がアクセスできないように設定しておこう。また、もしパスワードを間違えて入力した場合はこのファイルを削除するか、<ユーザー名>@<ホスト名>の行を削除して再度マクロを実行すればよい。

リスト4 チャレンジ&レスポンス認証を使用してリモートログインを行うマクロ(パスワード保存版)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '<ユーザー名>'
hostname = '<接続先IPアドレスもしくはホスト名>'
passwdfile = '<パスワードファイルのパス名.dat>'    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwdkey = username
strconcat passwdkey '@'
strconcat passwdkey hostname
getpassword passwdfile passwdkey password

msg = hostname
strconcat msg ':22 /ssh /auth=challenge /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg password

connect msg

リスト5 公開鍵認証を使用してリモートログインを行うマクロ(パスワード保存版)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '<ユーザー名>'
hostname = '<接続先IPアドレスもしくはホスト名>'
keyfile = '<使用する秘密鍵のパス名>'
passwdfile = '<パスワードファイルのパス名.dat>'    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwdkey = username
strconcat passwdkey '@'
strconcat passwdkey hostname
getpassword passwdfile passwdkey password

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg password
strconcat msg '"'
connect msg

ログインと同時にログを記録する

 Tera Termには、ターミナルに表示された内容をそのままテキストファイルに保存するログ機能がある。TerTermの起動後、メニューの「ファイル」−「ログ」でログを保存するファイル名を指定してログ記録を開始できる(図4)が、接続後に毎回自動的に記録を行うようにマクロを設定しておくと便利だ。

図4 Tera Termでは「ファイル」−「ログ」メニューでログの記録を行える
図4 Tera Termでは「ファイル」−「ログ」メニューでログの記録を行える

 ログインと同時にログの記録を開始するには、先に紹介したマクロの「connect msg」行の後に、次のリスト6のような内容を追加すればよい。これは、指定したディレクトリ以下に「<ユーザー名>@<ホスト名>-<日時>.log」という形式でログを保存するものだ。

リスト6 接続後、自動的にログ記録を開始するマクロ

; 自動ログ記録
logdir = '<ログ保存先ディレクトリ>' ; 例)C:¥Users¥otp¥Desktop¥ など

logfile = logdir
strconcat logfile username
strconcat logfile '@'
strconcat logfile hostname
getdate datetime '-%Y%m%d-%H%M%S'
strconcat logfile datetime
strconcat logfile '.log'
logopen logfile 0 1

自動多段ログイン

 ネットワーク環境によっては、あるサーバー(中継サーバー)にSSHでログインし、さらにそのサーバーから別のサーバーにログインする、という作業が必要な場合がある。このような場合、中継サーバーへのログインと、そこから目的のサーバーへのログインを自動で行うようにマクロを用意すると便利だ。たとえば、上記で紹介している自動接続マクロの最後に次のリスト7のマクロを追加すればよい。

リスト7 リモートホストへの接続語、自動的に別のホストにSSH接続するマクロ

;; 2段目のSSH接続
host_2nd = '<ユーザー名>@<ホスト名> ; 目的のサーバー(2回目のSSH先)のユーザー名とホスト名。例)otp@192.168.3.4
remote_prompt = '$' ; シェルのプロンプトを指定する。bash系なら「$」、cshなら「%」、tcshなら「>」など

ssh_command = 'ssh '
strconcat ssh_command host_2nd

wait remote_prompt
sendln ssh_command

 たとえば、リスト4にこのマクロを追加したものを実行すると、Tera Termの起動後にまず中継サーバーへのSSH接続が行われ、続いて目的のサーバーへの接続が行われてパスフレーズ(もしくはパスワード。環境によって異なる)が要求される(図5)。

図5 多段ログインの実行例
図5 多段ログインの実行例

 また、リスト7の代わりにリスト8のようなマクロを利用することで、2回目以降はパスワードの入力を行わずに目的のサーバーへのログインが可能になる。

リスト8 リモートホストへの接続語、自動的に別のホストにSSH接続するマクロ(自動ログイン版)

;; 2段目のSSH接続
host_2nd = '<ユーザー名>@<ホスト名> ; 目的のサーバー(2回目のSSH先)のユーザー名とホスト名。例)otp@192.168.3.4
remote_prompt = '$' ; シェルのプロンプトを指定する。bash系なら「$」、cshなら「%」、tcshなら「>」など

ssh_command = 'ssh '
strconcat ssh_command host_2nd
passwdkey = hostname
strconcat passwdkey '-'
strconcat passwdkey host_2nd
passwd_prompt = 'pass'

getpassword passwdfile passwdkey password

wait remote_prompt
sendln ssh_command
wait passwd_prompt
sendln password

今回紹介したツール:Tera Term