【Tera term】ListBoxを使用したログイン/ログの取得(Teraterm)


構築~運用作業時に自動ログイン/ログの取得を行いたいと思い、Teratermマクロを作成する事としました。
ログの取得は設定で簡単に行えますが、マクロを提供する事で設定を行わずにログの取得を行えるようにしました。
他チームの人も使っていたので、普通に便利なんだなと思います。

Teratermマクロはあまり詳しくないですが、せっかく作成したので備忘としてこちらに記載致します。
参考になれば、幸いでございます。

まず、マクロファイルの作成を行います。
ファイルの拡張子が「ttl」のファイルを作成します。
作成したファイルを右クリックして、「プログラムで開く」→「別のプログラムを選択」→ 「常にこのアプリを使って.ttlファイルを開く」にチェック → C:\Program Files (x86)\teraterm\ttpmacro.exe (teratermをインストールした場所)を選択でマクロの実行をファイルのクリックで行う事が出来ます。


ファイルの中身に処理を記載していこうと思います。
ログインにサーバー名やポートの指定が必要になりますので、変数/配列に定義していきます。
・TargetsにIP
・Keysに秘密鍵
・Portsにポート
上記内容で定義しています。

軽くですが、解説します。
Teratermのコメントアウトは";"で行います。変数については、変数名 = 代入したい文字等 で行います。
配列はstrdim 配列名 要素数 で行います。


```:マクロ.ttl
;;ターゲットのホスト名またはIP
Targets = "localhost"

;;秘密鍵の選択
strdim Keys 2
Keys[0] = "秘密鍵_1"
Keys[1] = "秘密鍵_2"

;;ターゲットのポート
strdim Ports 2
Ports[0] = ":Port名_1"
Ports[1] = ":Port名_2"
```

ログイン時に必要となる情報を定義したら、Listboxを使用します。
Listboxからユーザーが選択した情報は、システム変数(result)に格納されます。
戻り値として情報を使ってるよとコメントに残しておきました。
実行してみると、以下のようなポップアップが出力されます。

```:マクロ.ttl
;;ListBox
;;ポート指定を行う際の戻り値(result)をPorts/Keysの配列内から値を取得。
listbox "ポートを指定してください" "Target_Ports"  Ports
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/d1c96eb8-ee99-736b-8b1f-7dfb5e0b000b.png)


秘密鍵のファイルパスを取得します。
getdirでマクロファイルのパスを取得。
今回は秘密鍵を.sshフォルダ配下に配置していますので、変数に"\.ssh\"を代入します。

strconcatは文字列の結合を行います。
strconcat 文字列１ 文字列2 で結合となり、文字列1に結合した文字列が代入されます。

```:マクロ.ttl
;;秘密鍵配置フォルダの取得
getdir Get_key_File
Folder_Name = "\.ssh\"
strconcat Get_key_File Folder_Name
strconcat Get_key_File keys[result]
```

ここまでで、ログイン時に必要となる情報の定義は完了です。
次にログインの処理を記載していきます。といっても、strconcatで文字を結合していくだけですが、、

変数Loginにログインに必要となる情報を継ぎ足していきます。
IPから代入し、ポート/SSH バージョン/認証方式/ユーザ名/秘密鍵の順番で継ぎ足しています。
connectで対象のサーバーにログインしています。

```:マクロ.ttl
;;接続コマンドの組み立て
Login = Targets
strconcat Login Ports[result]
strconcat Login '/ssh2 /auth=publickey /user=test_01 /keyfile='
strconcat Login Get_key_File
connect Login 
```

最後に、ログ取得の処理を記載します。
ログの名前を ホスト名_日付.log　のファイル名で取得したいので、ログイン後にhostnameコマンドの実施を行います。
ログイン直後にコマンド実行しようと失敗するので、Waitでプロンプトに"$"が出るまで処理を止めます。

sendlnを使用して、文字列を対象サーバーに送信します。
実行後に、recvlnでホストから一行の文字列の取得を行います。プロンプトの2行目の取得を行いたいので、recvlnを2回実行しています。

```:マクロ.ttl
wait '$'

;;ノート名取得
sendln 'hostname'
recvln
recvln
Host_Name = inputstr
```

現在の日時を取得します。
getdateを使用して、Date内に取得した日時を格納します。
書式については、下記リンクを参考に致しました。
https://ttssh2.osdn.jp/manual/4/ja/macro/command/getdate.html

ログの配置場所は、Teraterm_Logフォルダを指定しています。

logopenを実行後に、ログの取得を行います。
引数は\<filename> \<binary flag> \<append flag>で指定しています。
\<binary flag>はログの書き込みモードの指定、\<append flag>はログの書き込みの振る舞いです。
今回は、どちらも1で指定しています。Binaryで書き込み/同名のファイルが存在する場合に上書き保存ではなく追記する で指定しました。

endでマクロの実行を終了しています。

```:マクロ.ttl
getdate Date '_%Y%m%d-%H%M%S.log'
strconcat Host_Name Date

;;ログの配置場所
getdir Log_File
File_Name = "\Teraterm_Log\"
strconcat Log_File File_Name
strconcat Log_File Host_Name

logopen Log_File 1 1

end
```

最終的にはこんな感じになりました。

```:Login_Macro.ttl

;;===============================================
;;秘密鍵配置フォルダファイル/ターゲットのサーバーの定義等

;;ターゲットのホスト名またはIP
Targets = "localhost"

;;秘密鍵の選択
strdim Keys 2
Keys[0] = "秘密鍵_1"
Keys[1] = "秘密鍵_2"

;;ターゲットのポート
strdim Ports 2
Ports[0] = ":Port名_1"
Ports[1] = ":Port名_2"

;;ListBox
;;ポート指定を行う際の戻り値(result)をPorts/Keysの配列内から値を取得。
listbox "ポートを指定してください" "Target_Ports"  Ports

;;秘密鍵配置フォルダの取得
getdir Get_key_File
Folder_Name = "\.ssh\"
strconcat Get_key_File Folder_Name
strconcat Get_key_File keys[result]

;;===============================================
;;ターゲットへの接続処理

;;接続コマンドの組み立て
Login = Targets
strconcat Login Ports[result]
strconcat Login '/ssh2 /auth=publickey /user=test_01 /keyfile='
strconcat Login Get_key_File
connect Login 
;;==============================================
;;ログファイルの取得

;;プロンプトが返ってくるのを待つ
wait '$'

;;ノード名取得
sendln 'hostname'
recvln
recvln
Host_Name = inputstr

;;日付取得
getdate Date '_%Y%m%d-%H%M%S'
strconcat Host_Name Date

;;ログの配置場所
getdir Log_File
File_Name = "\Teraterm_Log\"
strconcat Log_File File_Name
strconcat Log_File Host_Name

logopen Log_File 1 1

end
```

Teratermマクロはごく稀にしかいじらないですが、便利です。
定型的な作業は自動化してみようかなと思います。