listboxを使ったteratermの選択型ログインマクロ

##目次
- はじめに
- ログインマクロ
- 解説
- 参考サイト

##はじめに
teratermログインマクロを作るたびに「あれどうやって作ったんだっけ？」となり調べ直すことが多いので、また同じ状況になった時のため自分用の備忘録的なもの。
listboxを使うことで環境や用途、ログイン方法などでカテゴリを分けることができる。
個別のマクロを数十ファイル用意している現場もあったため、できればこのような1つのマクロで複数の接続先に繋げられるようなものを用意したいところ…。

##ログインマクロ

以下マクロ
コピペして動作を確認してみてください。

```
;ログインマクロ.ttl
strdim LIST 4
	LIST[0] = 'IPADDRESS'
	LIST[1] = 'ホスト名①'
	LIST[2] = 'ホスト名②'
	LIST[3] = '手入力'

listbox '選択肢' '項目①' LIST

;IPAddressリストを表示させる。
if result = 0 then
	strdim IPLIST 2
		IPLIST[0] = '192.168.11.70'
		IPLIST[1] = '192.168.11.71'
	listbox 'サーバーを選択' 'IPADDRESS' IPLIST
	if result = -1 then
		end
	else
		CON = IPLIST[result]
		goto login
	endif
	
;ホスト名を表示したい場合①
elseif result = 1 then
	strdim HOSTLIST 2
		HOSTLIST[0] = 'DNSサーバー#1'
		HOSTLIST[1] = 'PROXYサーバー#2'

	strdim HOSTIP 2
		HOSTIP[0] = '192.168.11.70'
		HOSTIP[1] = '192.168.11.71'
		
	listbox 'サーバーを選択' 'ホスト名を表示する場合' HOSTLIST
	if result = -1 then
		end
	else
		CON = HOSTIP[result]
		goto login
	endif

;ホスト名を表示したい場合②
elseif result = 2 then
	strdim HOSTLIST 2
		HOSTLIST[0] = 'DNSサーバー#1,192.168.11.70'
		HOSTLIST[1] = 'PROXYサーバー#2,192.168.11.71'
	listbox 'サーバーを選択' 'ホスト名を表示する場合' HOSTLIST
	if result = -1 then
		end
	else
		strsplit HOSTLIST[result] ','
		CON = groupmatchstr2
		goto login
	endif
	
;手打ち入力の場合
elseif result = 3 then
	MESSAGE = 'ログインサーバーを入力'
	inputbox MESSAGE 'LIST[2]'
	CON = inputstr
	goto login
else
	end
endif

;ここにログイン方法を記述
:login
messagebox CON 'CHECK'
strconcat CON ':22 /ssh /auth=password /user=ログイン名 /passwd=パスワード'
connect CON
wait "#" "$" ">>"
sendln 'uname -n'
end
```

##解説

```
strdim LIST 4
	LIST[0] = 'IPADDRESS'
	LIST[1] = 'ホスト名①'
	LIST[2] = 'ホスト名②'
	LIST[3] = '手入力'

listbox '選択肢' '項目①' LIST
```
![2021-06-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/f2898011-5ae5-afe0-b188-66642e9849fe.png)
listboxをつかった表示はこのようになる。
私は通常、最初に環境や用途ごとにカテゴリを分けておくが、今回はその後の処理ごとに分けた。
選択した数字がresultに格納され、キャンセルを選択した時はresultに-1が格納される。



#####IPAddressリストを表示させる書き方

```
strdim IPLIST 2
	IPLIST[0] = '192.168.11.70'
	IPLIST[1] = '192.168.11.71'
listbox 'サーバーを選択' 'IPADDRESS' IPLIST
if result = -1 then
	end
else
	CON = IPLIST[result]
	goto login
endif
```
![2021-06-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/6e237e2d-fc24-6259-d8ca-57d27852bf1a.png)
listboxにそのままIPアドレスを記述させる書き方。
変数CONへ選択されたIPアドレスを格納してログイン処理へ飛ばす。
hostsに記述をしていたりDNSサーバーを用意している場合は、IPアドレスの代わりにhost名を記述してもログイン可能。

ちなみにキャンセルを押した時(resultが-1)の処理を書いておかないとマクロが途中で止まりとてもダサいので注意。


#####ホスト名を表示したい場合①

```
strdim HOSTLIST 2
	HOSTLIST[0] = 'DNSサーバー#1'
	HOSTLIST[1] = 'PROXYサーバー#2'
strdim HOSTIP 2
	HOSTIP[0] = '192.168.11.70'
	HOSTIP[1] = '192.168.11.71'
	
listbox 'サーバーを選択' 'ホスト名を表示する場合' HOSTLIST
if result = -1 then
	end
else
	CON = HOSTIP[result]
	goto login
endif
```

![2021-06-16 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/518501ad-1cce-a329-1426-14e95e185f82.png)
日本語で接続先の情報が欲しい時その１
listboxで表示はHOSTLISTを表示させ、変数にはHOSTIP[result]を格納させる。

#####ホスト名を表示したい場合②
```
strdim HOSTLIST 2
	HOSTLIST[0] = 'DNSサーバー#1,192.168.11.70'
	HOSTLIST[1] = 'PROXYサーバー#2,192.168.11.71'
listbox 'サーバーを選択' 'ホスト名を表示する場合' HOSTLIST
if result = -1 then
	end
else
	strsplit HOSTLIST[result] ','
	CON = groupmatchstr2
	goto login
endif
```
![2021-06-16 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/cabd1c79-8c7c-9307-bc44-4fff4553307d.png)
サーバー名(日本語)とIPアドレスを併記し、指定の文字で区切るstrsplitを用いてIPアドレスを変数に格納する方法。
strsplitで区切った文字はgroupmatchstr1~9に格納される。

色々と書きすぎる以下のようにとスクロールバーが表示され見切れてしまう状態になるが、

![2021-06-16 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/b9c64840-4b80-7f98-bc67-413ce7291965.png)

```
listbox '----------------------サーバーを選択-----------------------' 'ホスト名を表示する場合' HOSTLIST
```
![2021-06-16 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/51e4a502-52a1-1ef9-a7e6-679737f13b5b.png)
こうすることで幅を広げて全体を表示させることが可能。

#####手打ち入力の場合
```
MESSAGE = 'ログインサーバーを入力'
inputbox MESSAGE 'LIST[2]'
CON = inputstr
goto login
```
![2021-06-16 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/913964d3-a3e4-9439-564a-20ef16d5cd89.png)
IPアドレスやホスト名を手入力で入力しログインさせる方法。
修正の手間がいらない。が打ち間違えるというHEが発生する可能性は多少ある。

マクロ内で文字エンコードを変更したりログ保存の設定をする記述もしている場合、この項目を用意しておくとサーバーが増設された時などに、listbox用の記述を修正せずともとりあえずは手入力でログインできたりするのでちょっと楽。

```
:login
messagebox CON 'CHECK'
strconcat CON ':22 /ssh /auth=password /user=ログイン名 /passwd=パスワード'
connect CON
wait "#" "$" ">>"
sendln 'uname -n'
end
```
![2021-06-16 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519662/812342c6-aba1-cd75-3272-5b5cb0c60604.png)
今回は格納された変数を確認するmessageboxを用意した。
その後はssh接続での一般的な接続方法。
接続が同一でない場合は分岐内にログインを書いたり、他のログイン記述を複数個書いたりします。

##参考サイト
[TTL コマンドリファレンス](https://ttssh2.osdn.jp/manual/4/ja/macro/command/index.html)