自分がよく使うTeratermマクロによる自動ログインのやり方をまとめてみたよ

# まえがき
自分はよくサーバーに自動ログインさせるのによくTeratermマクロを使います。

とはいえコマンドを覚えるほどではなくて、毎回ググってる次第(´・ω・｀)
たいがいメンドくなったので、自分メモとして記載します。

なお、Teratermマクロで使用可能な関数は[ここ](https://ttssh2.osdn.jp/manual/ja/macro/command/index.html)にあります。


※2020/07/06　パスワードの暗号化を追記

# 自動ログイン
定番です。

```bash:自動ログインサンプル.ttl
;=====================================================================
; 接続情報
HOSTADDR = '192.168.33.100'
USERNAME = 'username'
PASSWORD = 'password'
;=====================================================================

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

; 接続
connect COMMAND

end
```

コピペですぐに作れるよう、接続ホスト等の変数は先頭にまとめてます。

`strconcat`で地道にログインコマンドのオプションを組み立てて、`connect`で接続を実行します。
実行されるコマンドは最終的に

```
connect '192.168.33.100:22 /ssh /2 /auth=password /user=vagrant /passwd=vagrant'
```

となります。

`/ssh /2`は「SSH2による接続」の意。

`/auth`は認証方法の指定です。以下の種類があるみたいですよ。

| 認証方法 | 設定方法 |
| ------- | ----------------------------------|
| パスワード認証 | /auth=password /user=(ユーザー名) /passwd=(パスワード) |
| 公開鍵認証 | /auth=publickey /user=(ユーザー名) /passwd=(パスワード) /keyfile=(ファイルパス) |
| チャレンジレスポンス認証 | /auth=challenge  /user=(ユーザー名) /passwd=(パスワード) |
| Pageantを使った認証 | /auth=password /user=(ユーザー名) |

公開鍵認証の場合、`/keyfile`で使用する鍵ファイルを指定するんですが、
このパスは何もしないと**絶対パス**で書かないといけません。
というか、**相対パスで書くことも可能ですが「Teratermがある場所」からのパス指定となります**。
それだとメンドいので、一緒に**作業ディレクトリを変更するこ**とをオススメします。

```bash:公開鍵認証サンプル.ttl
;=====================================================================
; 接続情報
HOSTADDR = '192.168.33.100'
USERNAME = 'username'
PASSWORD = 'password'
KEYFILE  = 'authfile'
;=====================================================================

; 処理ディレクトリを現在ディレクトリに変更
getdir DIR
setdir DIR

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEYFILE

; 接続
connect COMMAND

end
```

こんな感じ。

`getdir`で現在のディレクトリのパスを取得して、`setdir`で作業ディレクトリを変更してます。
なので、自動ログインマクロがあるところに鍵ファイルを置いておけばよいです。



チャレンジレスポンス認証とPageantを使った認証は、自分は使ったことがないです。。。(´・ω・｀)


また、ログインコマンドに`/F=(ファイルパス)`を追加することで、
Teratermの設定ファイルを読み込ませることが出来ます。
環境により背景色を変える、とかやりたい場合、
設定ファイルをローカルに保存して、自動ログインのマクロ上で`/F`指定してやれば実現できるかと。




## パスワードの暗号化

パスワード認証でのログインの場合、パスワードを直接書いて実行していましたが、
いまどきそれはさすがにダメかしら？(´・ω・｀) と思ったので改めて調べたところ、
パスワードを暗号化して保存する方法があったので追記。

```bash:公開鍵認証サンプル.ttl
;=====================================================================
; 接続情報
HOSTADDR = '192.168.33.100'
USERNAME = 'username'
PASSFILE = 'filepath'
;=====================================================================

; パスワード取得
getpassword PASSFILE HOSTADDR passwd

; 処理ディレクトリを現在ディレクトリに変更
; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND passwd

; 接続
connect COMMAND

end
```

`getpassword` を使用します。
この関数は、第1引数で指定したファイルから、第2引数で指定した名前のパスワードを取得します。
もしファイルの中に指定した名前がない場合は、入力ダイアログを出して入力させます。

このファイル上、別の名前であればいくつでもパスワードが設定できるので、
複数環境があっても名前さえ変えれば1ファイルで管理できます。
だいたいはホスト名で設定していけば、一意になるんじゃないかしら？


# ログイン後に任意のコマンドを実行する

踏み台サーバ経由で接続したいときとか、
とりあえずサーバに接続してログを垂れ流したいときとか、
ローカル環境を起動時に手動で何かコマンドを打たないといけないときとかとか・・・・。

ログインした後の手間も省きたいときに使います。

```bash:踏み台サーバ経由で接続したいときサンプル.ttl

;------------------------------
; ログイン部分は省略
;------------------------------

; 接続後処理
wait 'vagrant@'

; 別サーバへSSH
sendln 'ssh user@other-server'

; マクロ終了
end
```

`wait`で前のコマンドが終了されるのを待って、`sendln`で実行したいコマンドを投げてます。

`sendln`は、本来はコンソールへ文字テキスト＋改行コードを送信する関数なので、
コマンドを投げたところで結果を取得したりはしないです。。
そこで、`wait`により終わって入力が戻ってくるまでマクロを停めてます。

ホントはそれ用の関数がありそうなんだけど見つからなかったので。。。


# マクロを分割する

踏み台サーバ経由でプロジェクト用の環境を用意している場合、
踏み台は同じだけどその後の接続先が違うってパターンがよくあるんじゃないかなぁ、と。

その自動ログインマクロを用意しようとすると、
粗方おなじなんだけどSSH投げるところだけ違う・・・・、てことになりがちです。

そういうときは、**マクロを分割して共通化**しています。

```bash:マクロを分割するサンプル(共通).ttl
;=====================================================================
; 踏み台接続情報
HOSTADDR = '192.168.33.100'
USERNAME = 'username'
PASSWORD = 'password'
;=====================================================================

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

; 接続
connect COMMAND
```

```bash:マクロを分割するサンプル(プロジェクト別).ttl
;=====================================================================
; プロジェクト接続情報
PRJSSH = 'user@other-server'
;=====================================================================

; 処理ディレクトリを現在ディレクトリに変更
getdir DIR
setdir DIR

; 接続
include 'マクロを分割するサンプル(共通).ttl'

; 別サーバへSSH
SSHCOMMAND = 'ssh '
strconcat SSHCOMMAND PRJSSH
sendln SSHCOMMAND

end
```

踏み台サーバへの接続を共通化しておいて、
プロジェクト別の自動ログインマクロから`include`で読み出しています。
パスは`getdir`からの`setdir`で作業ディレクトリをマクロがある場所にしているので相対パスでOK。

もし特定プロジェクトでは接続後になんかコマンド打ちたい場合もこれなら対応できます。


## プロジェクト別にマクロを用意するのもメンドくなった場合

↑の方法で共通化できたとはいえそのコピペもメンドくなることもあります。
たとえば、プロジェクトの環境として開発/検証/本番を用意した場合、とか。
SSH先が変わるだけであと全部同じってときは、ダイアログを使っています。

```bash:プロジェクト別にマクロを用意するのもメンドくなった場合サンプル.ttl
; 処理ディレクトリを現在ディレクトリに変更
getdir DIR
setdir DIR

; 接続
include 'マクロを分割するサンプル(共通).ttl'

; ダイアログを表示
strdim ENV 3
ENV[0] = 'user@develop-server'
ENV[1] = 'user@staging-server'
ENV[2] = 'user@product-server'

listbox '接続先を選択' '' ENV

; 接続
SSHCOMMAND = 'ssh '
strconcat SSHCOMMAND ENV[result]
sendln SSHCOMMAND

end
```

`setdim`で配列を用意、各環境の接続先を入れておきます。
で、`listbox`でダイアログを表示させて選択可能にします。
選択した値は必ず`result`変数に入るので、それを使ってSSHコマンドを作って投げる・・・・て感じ。

まぁ、この方法はサーバに入ってから必ず打たないといけないコマンドとか無い限りはあんまり使わないけど。。。


# パスワードがテキストファイルに入ってるとき

1回だけやった方法。

先方環境の接続パスワードが定期的に変更となるみたいで、
変更された際はパスワードが記載されたテキストファイルが送られてきていました。
なので、そのテキストファイルを開いてパスワードをマクロにコピペしていたんですが、
それさえもメンドくさくなったので、テキストファイルを読み込んで使うようにしました。

```bash:パスワードがテキストファイルに入ってるときサンプル.ttl
;=====================================================================
; 接続情報
HOSTADDR = '192.168.33.100'
USERNAME = 'username'
PASSFILE = 'filepath'
;=====================================================================

; パスワード取得
; パスワードはPASSFILEの1行目に設定すること
; ちなみに「書込不可」状態だと開けないのでPASSFILEは閉じておくこと
fileopen fhandle PASSFILE 0
filereadln fhandle PASSWORD
fileclose fhandle

; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

; 接続
connect COMMAND
```

`fileopen`でテキストファイルを開いて`fhandle`にハンドルを設定します。
最後の0はフラグオプションで、0だとファイルの先頭、それ以外はファイルの最後にファイルポインタが設定されます。

`filereadln`はファイルから1行読み出して変数へ設定。
今回の場合、ホントにパスワードしか書かれていないテキストファイルだったので、1行目だけ読み出してます。
必要であれば`while`とかでループさせるのかな。

`fileclose`は明記するまでもなくファイルクローズです。

あとは自動ログインと一緒。


# あとがき

基本的には自動ログインしかさせてないTeratermマクロ。
ただ、その自動ログインの方法や事情が様々あって多様になってます。なってました。
特に最後の1回だけ使ったヤツは、たまたま発掘できたので記載しておきましたが、
たぶんもう二度と使わないんじゃないかと思うんだけど、、、まぁいいか・・・・

これでコピペが捗る(´・ω・｀)


# 参考

- [TTL コマンドリファレンス](https://ttssh2.osdn.jp/manual/ja/macro/command/index.html)
- [Tera Term（テラターム）の便利な使い方](http://www.j-oosk.com/)
    - マクロつくる際にググるとよくこちらのサイト様にたどり着き助けてもらってました(´▽｀)

# 余談
QiitaでTeratermマクロを載せるとき、
シンタックスハイライトって何にしたらいいんだろ・・・・？
とりあえず今回のは全部bashにしてみた。