1年目でもやれる Tera Termマクロ
単体試験や事前試験等で複数台のネットワーク機器から複数回ログを取得したい、そんなときに自動で取得してくれるマクロがあると便利ですよね。
今回は「少しの編集で使える、コマンド入力+ログ取得用のTera Termマクロ」を目指し、エンジニア歴一年目が作ってみます。
対象者:Tera Termマクロを作った経験のない方
本記事は以下の構成となっています
1 事前準備
2 よく使われるコマンド
3 今回作るマクロ
4 ざっくり解説
1 事前準備
Tera Termマクロを使う前に必要な準備があります
①マクロファイルの拡張子は.ttlとすること
新しくテキストファイルを作って、ファイル名の最後の拡張子「~.txt」を「~.ttl」とすればOKです
②マクロファイルとTera Termを連携させる
Tera Termと連携させないとマクロはうまく起動できません。
「windowsキー」⇒「設定」⇒「アプリ」と選んでいく


「既定のアプリ」(①)⇒「ファイルの種類ごとに既定のアプリを選ぶ」(②)を選択

左側のファイルの種類「.ttl」(①)が見つかるまでスクロールして、既定を選ぶから「Tera Term Macro Interpreter」を選択

これにて事前準備終わりです
2 よく使われるコマンド
ここではマクロ全体でよく使われているコマンドを解説します
;コメントアウト
;以降の文字は全てマクロから無視されます。説明文を追加したい時によく使われます。
/タイトル--------------
----------------------/各章の始まりと終わりを表しています。
タイトルの部分にはその章のタイトルが書かれています。
〇〇〇 = ×××〇に×のものを代入します
例:今日は何曜日? = 水曜日
代入された値は計算で使っていきます
get~系主に何かを取得したい時に使われます
例
getdate 現在の日付を得る
getdir マクロの現在のディレクトリを得る
strconcat A B継ぎ足しコマンド。
例: strconcat リンゴ ジュース
リンゴにジュースを継ぎ足して、リンゴジュースとなります。
3 今回作ったマクロ
結論、こういったマクロになります。
説明不要!マクロだけほしい、という方は下記をコピペの上編集して使ってください。
複数機器で使いたい場合は、その数分マクロをコピーして作ってください。
;start
;#/各種設定(案件に応じて編集要)-------------
HOSTADDR = '192.168.0.3'
HOSTNAME = 'RT2'
USERNAME = 'admin'
PASSWORD = 'password'
ENABLEPASS = 'enablepass123'
FILENAME = 'SW_正常系試験'
COMMAND_LIST = 'readfile_cmd_list.txt'
;#-----------------------------------------/
;#/LOGIN方法(接続タイプに応じて編集要)------
;「SSH」    
;「TELNET」 
LOGIN = "SSH" 
;#-----------------------------------------/
;ログの保存場所
 getdir LOGSAVE
 strconcat LOGSAVE '\log\'
 
;ログのファイル名の処理
 LOGALL = LOGSAVE
 getdate LOGDATE '_%Y%m%d-%H%M%S.log'
 strconcat LOGALL HOSTNAME
 strconcat LOGALL '_'
 strconcat LOGALL FILENAME
 strconcat LOGALL LOGDATE
;#SSH接続オプション---------------------------------
COMMAND_SSH = HOSTADDR
strconcat COMMAND_SSH ':22 /ssh /2 /auth=password '
strconcat COMMAND_SSH ' /user='
strconcat COMMAND_SSH USERNAME
strconcat COMMAND_SSH ' /passwd='
strconcat COMMAND_SSH PASSWORD
;#SSHアクセス処理
strcompare LOGIN "SSH"
if result = 0 then
    connect COMMAND_SSH
endif
;#--------------------------------------------------
;#TELNET接続オプション------------------------------
;COMMAND_TELNET = HOSTADDR
;strconcat COMMAND_TELNET ':23 /nossh '
;#TELNETアクセス処理
;strcompare LOGIN "TELNET"
;if result = 0 then
    ;connect COMMAND_TELNET
;endif
;#--------------------------------------------------
;ログ取得開始
logopen LOGALL 1 1
pause 3
;#SSH用---------------------------
wait '>'
sendln "enable"
wait 'Password:'
sendln ENABLEPASS
;#--------------------------------
;#TELNET用------------------------
;wait 'Username:'
;sendln USERNAME
;wait 'Password:'
;sendln PASSWORD
;wait '>'
;sendln "enable"
;wait 'Password:'
;sendln ENABLEPASS
;#--------------------------------
;テキストファイル実行
fileopen filehandle COMMAND_LIST 0
while 1
filereadln filehandle command_line
if result = 1 break
flushrecv
sendln command_line
wait ’#’
endwhile
fileclose FileHandle
closett
; マクロ終了
end4 ざっくり解説
初期設定(編集必要)
;start
;#/各種設定(案件に応じて編集要)-------------
HOSTADDR = '192.168.0.3'
HOSTNAME = 'RT2'
USERNAME = 'admin'
PASSWORD = 'password'
ENABLEPASS = 'enablepass123'
FILENAME = 'SW_正常系試験'
COMMAND_LIST = 'readfile_cmd_list.txt'
;#-----------------------------------------/HOSTADDR = '192.168.0.3' 接続先のIPアドレスを入力します
HOSTNAME = 'RT2' 取得する機器のホスト名を入力します
USERNAME = 'admin' 接続先で設定しているユーザー名を入力します
PASSWORD = 'password' 上記で入力したユーザーのパスワードを入力します
ENABLEPASS = 'enablepass123' 接続先で設定しているenable パスワードを入力します
FILENAME = 'SW_正常系試験' 出力するファイル名をここで定義します
COMMAND_LIST = 'readfile_cmd_list.txt' 実行するコマンドを纏めたテキストファイルの名前を入力します
LOGIN方法(編集必要)
;#/LOGIN方法(接続タイプに応じて編集要)------
;「SSH」    
;「TELNET」 
LOGIN = "SSH" 
;#-----------------------------------------/LOGIN = "SSH" ログイン方法をここに入力します。今回はSSHと入力。
ログの保存場所(ファイル名を変えたい場合以外は編集不要)
;ログの保存場所
 getdir LOGSAVE
 strconcat LOGSAVE '\log\'
 
;ログのファイル名の処理
 LOGALL = LOGSAVE
 getdate LOGDATE '_%Y%m%d-%H%M%S.log'
 strconcat LOGALL HOSTNAME
 strconcat LOGALL '_'
 strconcat LOGALL FILENAME
 strconcat LOGALL LOGDATEgetdir LOGSAVEマクロがあるファイルのディレクトリを得る。この場合LOGSAVEという文字列変数にディレクトリを格納しています。
strconcat LOGSAVE '\log\' マクロのあるカレントディレクトリを格納したLOGSAVE以下にあるlogというフォルダを指定しています。
つまりlogというフォルダにtera termのログが保存されます。
;ログのファイル名の処理
LOGALL = LOGSAVE 下記の計算で使うため、ここでLOGALLにLOGSAVEを代入しています
getdate LOGDATE '_%Y%m%d-%H%M%S.log' getdateで日時を取得
・%Y(Year) 年
・%m(month) 月
・%d(day) 日
・%H(hour) 時間
・%M(Minute) 分
・%S(Second) 秒
以上をLOGDATEに代入しています。
strconcat LOGALL HOSTNAME 
strconcat LOGALL '_' 
strconcat LOGALL FILENAME 
strconcat LOGALL LOGDATE上記で代入したLOGDATE、初期設定で代入しているHOSTNAME、FILENAMEをLOGALLに継ぎ足しています。
HOSTNAMEの後にアンダーバーが欲しかったので、’_’も継ぎ足しています。
この形式だとファイル名が、HOSTNAME_FILENAME_年月日-時分秒 となります。
SSH接続オプション
TELNET接続をする場合は、全ての行の頭に「;」をつけてください。
つけないとエラーを起こします。
;#SSH接続オプション---------------------------------
COMMAND_SSH = HOSTADDR
strconcat COMMAND_SSH ':22 /ssh /2 /auth=password '
strconcat COMMAND_SSH ' /user='
strconcat COMMAND_SSH USERNAME
strconcat COMMAND_SSH ' /passwd='
strconcat COMMAND_SSH PASSWORD
;#SSHアクセス処理
strcompare LOGIN "SSH"
if result = 0 then
    connect COMMAND_SSH
endif
;#--------------------------------------------------COMMAND_SSH = HOSTADD COMMAND_SSHにHOSTADDを代入しています
下記の計算で使います
strconcat COMMAND_SSH ':22 /ssh /2 /auth=password ' COMMAND_SSHに以降の文字を継ぎ足しています。
・:22 TCP22番ポート(SSH)を指定
・/ssh SSHで接続
・/2 SSHのバージョンを指定。この場合はversion 2
・/auth=password 認証方式の指定。パスワード認証を選んでいます。
公開鍵認証もすることができますが、ここでは割愛します。機会があれば書いてみようと思います。
strconcat COMMAND_SSH ' /user='
strconcat COMMAND_SSH USERNAME sshにログインするために必要なユーザーネームをここで入力しています
strconcat COMMAND_SSH ' /passwd='
strconcat COMMAND_SSH PASSWORD上記で入力したユーザーネームのパスワードをここで入力しています
TELNET接続オプション
SSH接続をする場合は、全ての行の頭に「;」をつけてください。
今回はSSHのため、;をつけています。
;#TELNET接続オプション------------------------------
;COMMAND_TELNET = HOSTADDR
;strconcat COMMAND_TELNET ':23 /nossh'
;#TELNETアクセス処理
;strcompare LOGIN "TELNET"
;if result = 0 then
    ;connect COMMAND_TELNET
;endif
;#--------------------------------------------------基本的にはSSHと同じです。
/nossh/nossh でSSHをしないようにしています
ログ取得開始
; ログ取得開始
logopen LOGALL 1 1
pause 3
;#SSH用---------------------------
wait '>'
sendln "enable"
wait 'Password:'
sendln ENABLEPASS
;#--------------------------------
;#TELNET用------------------------
;wait 'Username:'
;sendln USERNAME
;wait 'Password:'
;sendln PASSWORD
;wait '>'
;sendln "enable"
;wait 'Password:'
;sendln ENABLEPASS
;#--------------------------------logopen LOGALL 1 1ここでログのファイル名処理の所で代入した「LOGALL」を使います
この処理によって、ログがテキストに書き込まれていきます。
pause 3処理が重なっているため、ここで5秒待機(=pause 5(秒))をいれます。
あまりに実行が早すぎるとログが取得できない可能性があるためです。
;#SSH用---------------------------
wait '>'
sendln "enable"
wait 'Password:'
sendln ENABLEPASS
;#--------------------------------TELNET接続する場合は頭に「;」をつけてください
wait '>'
sendln "enable"‘>’
という文字が見えたら(つまりはユーザーモードに入ったら)、’enable’を入力するという意味です
wait 'Password:'
sendln ENABLEPASSユーザーモードでenableを入力すると、enableパスワードを設定している場合パスワードの入力が求められますよね。
ですのでここでは
‘Password = ‘
が見えたら各種設定で設定したenableパスワードを入力するよう、ここで指示しています
;#TELNET用------------------------
;wait 'Username:'
;sendln USERNAME
;wait 'Password:'
;sendln PASSWORD
;wait '>'
;sendln "enable"
;wait 'Password:'
;sendln ENABLEPASS
;#--------------------------------SSH接続する際は頭に「;」をつけてください
今回はSSのため「;」をつけています
コマンドはSSHとほとんと同じなので割愛します
テキストファイルオープン
;テキストファイル実行
fileopen filehandle COMMAND_LIST 0
while 1
filereadln filehandle cmdline
if result = 1 break
flushrecv
sendln cmdline
wait '#'
endwhile
fileclose FileHandle流すコマンドの数が多い場合、正常に動作しないことがあります
その場合はwait ‘#’の前にpause 1をいれてみてください
fileopen filehandle COMMAND_LIST 0 取得したいコマンドをまとめたテキストファイルをここで開くための行です。
初期設定で定義しているCOMMAND_LISTのファイルが開かれます
 while 1 whileとendwhileの間を繰り返します。
つまりここからendwhileまで繰り返しをすることを意味しています。テキストにまとめたコマンドを1行ずつ流し込むために必要です。
filereadln filehandle COMMAND_LINEテキストから1行ずつコマンドを読み込む、という意味の行です
if result = 1 break最終行まで読んだら(if result = 1)、ループを抜ける(break)ための行
flushrecv
sendln COMMAND_LINE・ flushrecv
マクロには受信バッファがあります。古い文字がたまっていると予期しない動作をする可能性があるため、ここでバッファ内に溜まったものを消してします
・sendln cmdline
読み込んだテキストのコマンドをここで実行しています
・wait ’#’
 endwhile
wait ’#’ で、上記で実行したコマンドが終了するのを待っています
戻り次第、endwhileでループ一周目終了、while 1に戻ります
fileclose FileHandleコマンドを最終行まで読んでループを抜けた後ここに飛びます
ここでは開いていたテキストファイルを閉じています
;tera termを閉じる
closettclosett最後にclosettでtera termを閉じます。
:log_processログイン後設定でlogを選んだ場合、途中の処理は全て不要になるため一気にここまできます。
この場合ログ保存を開始しenableモードに入った段階でマクロは終了します。
以上になります。
閲覧していただき、ありがとうございました。
今回はコマンド取得用の簡単な構成ですが、まだまだ拡張の余地はあります(ターミナルサーバーやコンソール接続、SSHの公開鍵バージョン等)
また機会があれば随時追加していく予定です。
 
       
           
           
           
     
     
    