teratermで踏み台サーバ経由の多段SSHを自動化する

## teratermで踏み台サーバ経由の多段SSHを自動化する

### はじめに
　弊社ではセキュリティ上、サービスを提供しているサーバに直接接続するのではなく、踏み台を経由して接続することがルールとして定められています。
　
　また、管理しているサーバが多く、サーバ毎のユーザもわかれているため、割と高い頻度で発生する作業に対し、毎度手動で踏み台に接続→対象サーバに接続を行うという単純作業がだんだんと苦になってしまいました。。。(笑)
　
　なので、今回は踏み台を経由して対象サーバにSSHで接続するマクロを組んでみました！
　
　※以下記事の情報を元にマクロを作成しています（環境毎に色を変えたり等一部変更しています）
　・[踏み台サーバを経由してログインするTeratermのマクロ](https://qiita.com/baoh0308/items/fcedfcf50f7e97cb4e39)

### 環境
　Linux、teraterm

### 本記事でできること
　ダブルクリックのみで、踏み台を経由し接続したいサーバへ接続ができます

### はじめに：フォルダ構成
　一番上の階層に踏み台サーバの情報が記載された設定ファイル(springboard.ttl)があります。
　connectinfo.datに関しては、初回接続時に自動で生成されるファイルです。
　※次回からのログイン時はこのファイルのパスワード情報が使用されます。
　
　それ以下の階層は、グループ分けしたサーバの接続情報を記載しています。

```
TTLマクロ_踏み台経由
│  connectinfo.dat                      パスワードファイル(自動生成)
│  springboard.ttl                      踏み台情報
│
├─WEBサーバ
│  │  config.ttl                        設定ファイル
│  │  connect.ttl                       接続コマンド情報
│  │  hosts.ttl                         サーバ情報
│  │
│  ├─開発環境
│  │      ホスト名(例：web-dev-a).ttl    サーバ接続用TTL
│  │      ホスト名(例：web-dev-b).ttl
│  │
│  └─本番環境
│          ホスト名(例：web-honban-a).ttl
│          ホスト名(例：web-honban-b).ttl
│
└─バッチサーバ
    │  config.ttl
    │  connect.ttl
    │  hosts.ttl
    │
    └─開発環境
            ホスト名(例：bat-dev-a).ttl
            ホスト名(例：bat-dev-b).ttl
・・・
```
### 踏み台情報(springboard.ttl)
　踏み台サーバのIPアドレスと、ログインユーザーを記載します。
　パスワードに関しては、初回は入力が必要でそれ以降は自動生成される「connectinfo.dat」から参照します。

```springboard.ttl
;;踏み台情報
; 踏み台サーバのIPアドレス
FUMIDAI       = 'XXX.XXX.XXX.XXX'

;ユーザ、パスワード
LOGIN_USER='XXXXXX'                   ; 踏み台へのログインユーザ
PASS_FILE ='../../connectinfo.dat'
```

### 設定ファイル(config.ttl)
　COMMON_IDとCOMMON_PASSに、ログイン先の共通ログインIDとパスワードをそれぞれ記載します。
　※設定ファイル(config.ttl)と同じ階層にある環境への接続時に上記IDとパスワードが使用されます。

```config.ttl
;ウインドウタイトル
PLACE='XXX環境'

COMMON_ID='XXXXXX'                     ; ログイン先の共通ログインID
COMMON_PASS='XXXXXX'                   ; ログイン先の共通ログインIDのパスワード

;INIファイルの読み込み有無  無:0 有:1
READ_INI=0

getdir CURDIR                          ; マクロの場所

;マクロファイルのベース名を作る
strsplit param1 '.'
SERVER_NAME = groupmatchstr1           ; マクロファイル名から接続先サーバ名を作る

SERVER_IP='*'

for i 0 ELEMENT_NO-1                   ; サーバ名からIPを得る
    strcompare SERVER_NAME HOSTEN[i]
    if  result=0  then
        SERVER_IP = HOSTIP[i]
        SERVER_COLOR = COLOR[i]
        break
    endif
next


strcompare SERVER_IP '*'
if result=0 then
    messagebox 'ホストが見つかりません' "エラーメッセージ"
    end
endif
```
　
### 接続コマンド情報(connect.ttl)
　接続時のコマンドを、組み立てたり、設定された背景色に変更したりしています。

```connect.ttl
;============================================== 
;; 接続先ホスト／ユーザ名／パスワード設定 
;LOGIN_USER = 'ユーザ名' 
;; パスワードファイル指定
;LOGIN_PASS = 'パスワード' 
;============================================== 
;; パスワード取得
getpassword PASS_FILE LOGIN_USER LOGIN_PASS

;; コマンド組立て 

COMMAND = FUMIDAI 
strconcat COMMAND ':22 /ssh /2 /auth=password /user=' 
strconcat COMMAND LOGIN_USER 
strconcat COMMAND ' /passwd=' 
strconcat COMMAND LOGIN_PASS

;; 接続 
connect COMMAND

sprintf2 TITLE '%s(%s:%s)' PLACE SERVER_NAME SERVER_IP

settitle TITLE

sprintf2 SSH_LOGIN 'ssh -o StrictHostKeyChecking=no %s@%s' COMMON_ID SERVER_IP
sprintf2 SSH_SERVER_COLOR "echo -ne '%s'" SERVER_COLOR

wait '$'
sendln SSH_LOGIN

wait 'password:'
sendln COMMON_PASS

wait '~]$'
sendln SSH_SERVER_COLOR
end
```
　
### サーバ情報(hosts.ttl)
　接続したいサーバのホスト名、IPアドレスを記載します。
　COLORの配列で文字色と背景色をカラーコードで指定できます。
　例：#ffffff(白)
　　　#000030(青)
　　　#303000(黄)
　　　#300000(赤)

```hosts.ttl
;   ホスト名、IPアドレスの2つの配列を定義する。
;   strdimで宣言する要素数は2つとも同じにする。
;   各配列の順番は、関連している。
;   増減した時は、ELEMENT_NOの変更と、各配列の要素を調整する。

ELEMENT_NO=2

;接続先ホスト名選択
strdim HOSTEN ELEMENT_NO

;ホスト名(例：web-dev-a、web-dev-b)
HOSTEN[0] = 'web-dev-a'
HOSTEN[1] = 'web-dev-b'

strdim HOSTIP ELEMENT_NO
;IPアドレス
HOSTIP[0] = 'XXX.XXX.XXX.XXX'
HOSTIP[1] = 'XXX.XXX.XXX.XXX'

strdim COLOR ELEMENT_NO
COLOR[0] = '\e]10;#ffffff\a\e]11;#303000\a'      ---文字色：#ffffff(白)、背景色：#303000(黄)
COLOR[1] = '\e]10;#ffffff\a\e]11;#303000\a'
```
　
### サーバ接続用TTL(ホスト名(例：web-dev-a).ttl)
　実際にサーバに接続する用のTTLファイル。
　ファイル名はhosts.ttlのHOSTENで設定したホスト名と揃えてあげる必要があります。

```ホスト名(例：web-dev-a).ttl
include '../hosts.ttl'
include '../../springboard.ttl'
include '../config.ttl'
include '../connect.ttl'
```
　
### 補足！！！
　やっと完成したttlをチームメンバーに共有したところ、正常に接続できる人とできない人が。。。。
　
　確認すると、ttlファイルの関連付け先が間違っていることが原因でした。
　普段起動させている方がオレンジの枠(ttermpro.exe)ですが、こちらと紐づいていると動きませんでした。。。
　正しくは、赤枠(ttpmacro.exe)の方と紐づける必要があります。
　
　ぱっと見、問題なく紐づいているように見えるため、原因の特定に苦戦しました。。。。
　![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166365/4bd88c4f-b352-4583-ae8c-c89d418192a3.png)






### おわりに

　サーバへの接続を自動化したことで、サーバ接続時のストレスがなくなりましたー！
　今後の課題としては、現状サーバのパスワードがべた書きになってしまっているので、そちらも踏み台のパスワードと同様に暗号化したり、現状1サーバにつき1つのサーバ接続用TTLファイルが存在しているところを、ファイルを一つにまとめプルダウンで選択できるようにしていきたいです！

（2022/05/20 15:23追記）
[teratermで踏み台サーバ経由の多段SSHを自動化する Ver. 2](https://qiita.com/k-shiroma/items/60c708d9da484a9e72d3)にサーバのパスワード暗号化とプルダウンで選択可能にした内容を記載しております！

### 参考資料

　　踏み台サーバを経由してログインするTeratermのマクロ（最終閲覧日：2021年10月16日）
　　　https://qiita.com/baoh0308/items/fcedfcf50f7e97cb4e39