TeraTerm でのログ自動取得方法

TeraTerm は、ネットワークでのリモート接続を実現する、ターミナルソフトだ。
とわざわざ言わなくても、Windows から UNIX/Linux へアクセスするなら定番中の定番。
あまり使う人はいないけど、強力なマクロ機能があって重宝する。
そんな TeraTerm でログを自動取得するためのマクロ(特定のホストへマクロでアクセスする時に使うことが前提の記載)を備忘として書いてみる。


〜〜〜 2010年4月3日 追記 ここから〜〜〜
TeraTerm のログ取得方法は、実に5つ。

  1. ログインしたらメニューバーの「ファイル」→「ログ」を選択して手動でログを取る。
  2. メニューバーの「設定」→「その他の設定」→「ログ」タブで「自動的にログ採取を開始する」にチェックを入れる。
  3. TeraTermコマンドラインで実行し、引数でログ取得を実行させる。これは VBScript などでも利用できる。
  4. TeraTerm ショートカットファイルのプロパティで、リンク先にログ取得を実行させる引数を入れる(要はコマンドライン)。
  5. TeraTerm マクロでログ取得を実行する。


それぞれ一長一短なので、好きな方法でログを収集する。
僕の好みは、マクロでログ取得〜♪
ここで確認した TeraTerm は、4.63 で、少し前のバージョン。
以下は、Ver4.52時点での、具体的なやり方とか、失敗時のノウハウをダラダラと書いていっただけ(^^ゞ


〜〜〜 2010年4月3日 追記 ここまで〜〜〜


いまどきなら、テンプレートとして提供されている ssh での自動ログイン用マクロを使う人が多いだろう。

username = 'xxx'
hostname = 'xxx.xxx.xxx.xxx'

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

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

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

connect msg


で、接続したあと個別にログをとってたり…
この、ログ取得をマクロで自動取得するためには logopen を使う。テキストの最後に、こんな感じで追記するだけだ。

logopen 'c:\teraterm.log' 0 1

変数を使うなら…

logname = 'c:\teraterm.log'
logopen logname 0 1

c:\ というフォルダに、 teraterm.log というテキストファイルを作成して保存。
すでにあるなら、追記していく…という設定内容。
これでうまく動作した?
そうそう、この logopen というコマンド…。 connect でどこかに接続した後じゃないと、うまく動作しないみたい。メッセージボックスで変数の内容を確認したときには問題なかったのに、いざログファイルを取得させようとしたところでエラーがでまくってた。
変なところでハマっちゃった。


閑話休題
これだけでも割と楽になるんだけど、対象ホストがたくさんあったり、毎日アクセスする必要があったりすると、ログの移動が大変に思ったりする。
じゃあ、最初からログに日付をつけよう。
そのためには、変数を利用しないと都合が悪い。

; 日付を取得
getdate datestr
; ログファイル名を組み立てる
logname = 'c:\'
strconcat logname datestr
strconcat logname '.log'
logopen logname 0 1


これでうまく動作したなら、ログファイル名は c:\YYYY-MM-DD.log になる。
YYYY = 年、MM = 月、 DD = 日 となる。
月日は、一桁にならず、かならず二桁(1月だったら 01)で表示される。


logname が、ログファイルの名前のための変数。
strconcat は、変数に文字列を加えるためのマクロ用コマンド。


でもって、日付の間にハイフン (-) が入ってほしくない時がある。
このときは、こんな感じで変数の内容を切り貼りする。

;;; ログファイルの自動命名規則

; HostID を設定する。
;HostID = hostname
HostID   = 'xxxxxxxxxxxxx'

; 日付を取得する。
getdate datestr

; datestr の日付形式(YYYY-MM-DD)を分割する。
strcopy datestr 1 4 YYYY
strcopy datestr 6 2 MM
strcopy datestr 9 2 DD

; ファイル名を組み立てる。
logname = 'c:\'
strconcat logname YYYY
strconcat logname MM
strconcat logname DD
strconcat logname '_'
strconcat logname HostID
strconcat logname '.log'

logopen logname 0 1


長いね…
細かいチューニングをしようとすると、とたんに利用するコマンドが増えるね。


username = 'xxx'
hostname = 'xxx.xxx.xxx.xxx'
HostID   = 'xxxxxxxxxxxxx'
getdate datestr
strcopy datestr 1 4 YYYY
strcopy datestr 6 2 MM
strcopy datestr 9 2 DD
logname = 'c:\'
strconcat logname YYYY
strconcat logname MM
strconcat logname DD
strconcat logname '_'
strconcat logname HostID
strconcat logname '.log'

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

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

connect msg
logopen logname 0 1
sendln ''


あと、不特定多数の機器へアクセスする際に自動でログを取得する方法もあったんだけど…
ド忘れ。
備忘を作っておかないと、自分が困る(^_^;


〜〜〜 2010年4月3日 追記 〜〜〜
この getdate なんだけど、いつの間にか性能向上してた。
確認した TeraTerm は、4.63 で、少し前のバージョン。


strftime フォーマットが使えるのは、TeraTerm本体の自動ログ取得機能だけじゃなくて、マクロ内でも一緒だった。


こんな感じ。
getdate datestr "log-%Y%m%d-&h.txt"


すごく楽になったw
10行も費やしてたのにねぇ…


でもってヘルプの使いやすさが格段に向上してたのも笑った。
チルトホイールで上下に移動する♪


Excel VBA で、TeraTerm マクロファイルを作る VBA マクロを組んでみた。
ホスト名やユーザ名を列記して、マクロを自分の好きなディレクトリで分類できる機能も持たせた。
大量のサーバがある場合に、かなり便利。
さらに、telnet 接続しかできないサーバと ssh 接続が出来るサーバが混在してても、セルへフラグを立てることで同じ挙動(少なくともマクロを実行した人の観点では同じ挙動)をする TeraTerm マクロに仕上げた。
もちろん、getpassword を使っているので、最初に一度だけパスワードを入力すれば良い仕様。
SSH 接続する理由がよく分からないモンになった…
また、VBAだけに、最初の導入で TeraTerm マクロ自身やログを置くディレクトリを作る機能も盛り込んでみたり。
TeraTerm のセットアップが、かなり楽になったと思う。
そのうち、TeraTermマクロだけで TeraTermマクロを作るマクロを作りたいな。そのうち。
必要なコマンドはあるっぽいし。


要望があれば、また機会を改めて公開したい。
…そんな要望ないだろうなw
まぁいいや。自分が満足してるから。


〜〜〜 2013年6月24日 追記 ここから〜〜〜
それから、公開用に Telnet 接続を実行するマクロを組み込んだ Excelファイルを作ってみたので、こちらにも記載。
http://d.hatena.ne.jp/KuroNeko666/20130314/1363286510
TeraTermExcel.zip 直

〜〜〜 2013年6月24日 追記 ここまで〜〜〜


〜〜〜 追記ここまで 〜〜〜

もうひとつのログ取得方法

度忘れしてたけど、ヘルプファイルをみてたらズバリ書いてあったのでここで追記。
こちらの方法は、日付でログを分けるような、柔軟な対応ができないので困る(^_^;


まず、TeraTerm の実行ファイルで、ショートカットを作る。
そのショートカットのプロパティを見ると、セットアップがデフォルトのままなら、こんな内容になっている。


"C:\Program Files\teraterm\ttermpro.exe"


ここに、ログをつけるオプションを追記してOKボタンを押せば良い。


"C:\Program Files\teraterm\ttermpro.exe" /L="c:\teraterm.log"


ダブルクォーテーションは、パスにスペースが入る場合に必須。


たぶん、あいだにバッチファイルとかを挟んで %date:~0,4% とかで日付を指定することも、やろうと思えば出来るんだろうけど、どうせ同じスクリプトを作るなら TeraTerm のマクロで完結したい。
もっとも、起動オプションでログを作るメリットもある。
マクロだと、どうしてもマクロファイルを TeraTerm に関連付けるなり、起動オプションとして別個に指定するなり、起動後にメニューから呼び出してやるなりしなければならない。
スタートから呼び出すショートカットのプロパティで起動オプションとしてログを固定でつけてあげれば、少なくともログを取り忘れることは無い。
もっとも、この設定では TeraTerm を複数起動させるとごちゃごちゃしてわからなくなることも…
要は、自分の目的に合った方法が一番イイ。

@echo off

"%programfiles%\teraterm\ttermpro.exe" /L="c:\%date:~0,4%%date:~6,2%%date:~9,2%_<HOSTNAME>.log"

とか考えたけど、すべて TeraTerm のマクロで書くのと変わらず、やっぱり面倒に思った。

さらなるログ取得方法

ひとつめのログ取得方法にアクセス頂いたようなので、同じキーワードでググってみた。


VBSとか、書く内容は同じだし、そこまでする必要は感じなかった。
TeraTermマクロで完結できるしね(^_^;


で、strftimeフォーマットでの設定を知った。コレは便利そう。


http://d.hatena.ne.jp/hkano/20081015/1235911558


でも、ログを「日付別に作成」は出来ても、「機器別に作成」はできなさそう。残念。


結論としては、日付やアクセスする機器ごとにログの名前を変えるなら、スクリプトに頼るほかなさげ。
日付別だけでいいなら、やり方はぐっと簡単になる。


〜2009.7.31 追記〜
☆君さんより指摘頂き、ログファイル名に機器名が使えることに気づきました。
ありがとうございます。


なるほど、strftime format はググってざっと見てたけど勘違いしてた。
…なんで対象を自分のホスト名のことだと思ったんだろう?(^_^;


名前解決(hosts か DNS)がきちんと設定されているなら、ホスト名がきちんと使えるって便利。
ということで、結論の書き換え。


マクロに頼らなくてもログの名前なら、strftime format を使うことでかなり融通が効く。


IPアドレスでログを残したくない(機能や通称でログを保存したい)けど、ホスト名とIPアドレスの名前解決がきちんと設定されてない…という環境なら、マクロを考えても良い。
個人的に、ログの名前にIPアドレスが記載されているのはわかりにくくて仕方ないので hosts ファイルを修正してでも別名で使いたい。
むしろ hosts ファイルは環境にあわせて修正しまくっているので、都合がいい。


自分の PC で設定するなら strftime format を使おう。
同僚やお客さんとかに配布する必要があったら、マクロで書けばいいや。


〜2009.8.25 さらに追記〜
strftime format でなく、マクロで書くメリットがもうひとつあったので追記。


会社だと、リモート接続するのにいくつかの踏み台を経由する必要のあるサーバが存在する。
踏み台をおくことで、誰が、いつ、どのサーバにアクセスしたのか記録されるので、セキュリティアップにつながるから。
もちろん、目的のサーバは、踏み台からのアクセス以外、基本的に弾いている。


で、そこにアクセスしたときのログを見たいのに、最初の踏み台となるサーバの名前ばっかりだと分かりにくすぎるw

〜追記ここまで〜


そうそう、肝心なバージョン情報を忘れてた。
上記は、すべて TeraTermPro Ver 4.52 UTF-8 対応のもの。
OS は、Windows XP