スポンサーリンク

【コピペで使えるteratermマクロ】マクロと同じフォルダにログを保存する

俺は、TeraTermを捨ててRLoginを使うぞ! | 雑誌の住人

以前にこんな記事書いた私ですが、結局teratermが便利すぎてteratermを起動しない日がない私です。
いやメインのクライアントはバリバリRLoginを使ってるんですが、作ったteratermマクロのメンテナンスとか、 コンソール接続とか、やっぱりteraterm使いたい場面は多いですね。

それで最近teratermマクロの整備をしてて、忘れた書き方をネットで調べたりしてるんですが、 ネットに書いてあRのは環境が違うと動作しないサンプルばっかりで、 そのままコピペじゃ使えないのが多いなと思ったのです。

そこで、【コピペで使えるteratermマクロ】というテーマを思いついて、この記事を書きました。 今回は、割とteratermマクロでやりたくなる動作なんですが、ネット上のサンプルだと いまいち分かりづらい気がしたんですよね。

という訳で以下がコピペすれば使える「マクロと同じフォルダにログを保存する」サンプルマクロです。

; Telnetする
strconcat HOSTADDR '192.168.1.1'
strconcat HOSTADDR ':23 /nossh /timeout=1 /AUTOWINCLOSE=off /NOLOG'
connect HOSTADDR

; ログをマクロと同じフォルダに取得
getdir DIR                       ; マクロのあるディレクトリを取得
getdate DATE "%Y%m%d-%H%M%S"     ; 日付と時刻を取得
sprintf2 logfilename '%s\telnet_log_[%s]_%s.log' DIR HOSTADDR DATE
logopen logfilename  0 1 1 1 0 0

はい! マクロコピペして動作すればもうOKって人はここでお帰りです! またのご来店をお待ちしております! この先はこのマクロの詳細を隅々まで理解したい人のみお読みください!

という訳でコメント行も記載していますが、1行ずつ細かく解説していきましょう。

2行目 strconcat HOSTADDR ‘192.168.1.1’

対象機器のIPアドレスを、HOSTADDRという変数に格納します。
なんで格納してるかと言うと、ログのファイル名を付ける時に後でこの変数を使うからです。

3行目 connect HOSTADDR ‘:23 /nossh /timeout=1 /AUTOWINCLOSE=off /NOLOG’

対象機器にTelnetするところの各種オプションを解説します。
なんでconnectする部分を入れてるかというと、connectした後じゃないとログの取得が始まらないからです。
これはセットで入れておいた方が良いだろうと判断して、サンプルに入れてます。

/nossh
sshは使いませんよというオプションです。
これ入れてないと、teraterm.iniの初期設定でデフォルトでsshが指定されてる場合、
telnetしたいのに勝手にsshで行っちゃうんですよね。

/timeout=1
これはtelnet対象機器から応答ない場合に1秒だけ待つ、という設定です。
機器が死んでる場合、数秒も待たずに切れた方がストレス少ないので入れてます。

/AUTOWINCLOSE=off
機器との接続が切れ、未接続となった時にteratermが自動で終了しないように入れてます。
一旦機器からexitして、再接続する、なんてマクロを組む時には必須ですね。
teraterm終了したら当然マクロもそこで止まっちゃいますから……。

/NOLOG
接続時にログを自動で取得しない、というオプションです。
私はteraterm.iniで自動でログ取りを開始する設定にしてるので、これを無効にするために入れてます。
これ入れておかないと、そのあとにマクロに書いたログ取りのところが無効化されちゃうので。
ちなみに、なんで自動でログ取りする設定にしてるかというと、ログの取り忘れを防止するためですよ。
ネットワークエンジニアならみんな自動ログ取り機能ONにしますよね?

さてここからが本番の「マクロと同じフォルダにログを保存する」部分の解説です。

6行目 getdir DIR ; マクロのあるディレクトリを取得

コメントの通りで、マクロのあるディレクトのパスを、変数DIRに格納します。
Cドライブの直下でマクロ実行したら、「c:\」という文字列が格納されます

7行目 getdate DATE “%Y%m%d-%H%M%S” ; 日付と時刻を取得

変数DATEに、現在の日付と時刻を格納します。
格納する日付と時刻は、%Y%m%d-%H%M%Sのフォーマットで格納されます。
このフォーマットの書き方、エンジニアならだいたい分かりますかね?
もちろんこのフォーマットは色々カスタマイズ可能です。
年月日だけ欲しいって人は「%Y%m%d」とすればOK。

8行目 sprintf2 logfilename ‘%s\telnet_log_[%s]_%s.log’ DIR HOSTADDR DATE

ここはログのファイル名を、フルパスで指定して、変数logfilenameに格納します。
上記で生成されるフルパス&ファイル名は、Cドライブ直下でマクロを実行した場合、
c:\telneet_log_[192.168.1.1]_20200101-010101.log
という感じになります。
次に、この行に書いてある「%s」と、後ろの方に書いてある「DIR HOSTADDR DATE」という変数、 これがちょっと分かりづらい。
ここは丁寧に解説しないと直感的には理解不能です。

%sはよく見ると、行の中に3つ出てくると思います。
この3つの%sが「DIR HOSTADDR DATE」と書いてある各変数に、
以下のように対応しているのです。

1個目の%s = DIR
2個目の%s = HOSTADDR
3個目の%s = DATE

これなんか分かりづらくないですか!?
私はサンプル見てから完全に理解するまで3時間くらいかかりましたよ。
お前の理解力が低い?
その通り!!!

9行目 logopen logfilename 0 1 1 1 0 0

という訳でこの9行目は、8行目で作成されたフルパスのファイル名使って、ログを取得しますよって行になります。
ここでの解説は、後ろについてる0と1の部分だけで十分ですかね。

公式のTTLコマンドリファレンスに記載してある解説を引用致します。

logopen https://ttssh2.osdn.jp/manual/4/ja/macro/command/logopen.html

1番目の0 = の値が0のとき、受信した漢字、改行文字は変換されてファイルに書き込まれ、エスケープシーケンスは書き込まれない。
2番目の1 = の値が0以外で、ファイル がすでに存在する場合、そのファイルに追加して書き込む。
3番目の1 = が 0 以外の場合、ASCII 非表示文字をログに書き込まない。
4番目の1 = が 0 以外の場合、ログの行頭に時刻を追加する。
5番目の0 = が 0 以外の場合、ログ転送のダイアログを表示しない。
6番目の0 = が 0 以外の場合、現在の端末バッファすべてを先にファイルに書き込む。 (バージョン 4.80以降)

そんな訳で実質6行しかないマクロにどんだけ解説するねんって感じではありますが、
この書き方なら環境にほぼ依存せずにコピペで使えるけど、やっぱりなんでそう書いてるのか
ちゃんと理解してほしいって気持ちもあるんですよ。
漢ならプログラムとかマクロで、説明できない行とかあったら嫌じゃないですか。
おまじないとかいう輩は撲滅したいじゃないですか。
日曜大工ならぬ日曜プログラマみたいな私ですが、一応そういう気持ちでコード書いてます。

それではこのマクロサンプル、誰かの役に立ったなら幸いです。
コピペで使えるteratermマクロ、またネタが出来たら記事書きたいと思います。

タイトルとURLをコピーしました