.ssh/configに記載した接続先へ楽に接続できるスクリプト作ってみた

# .ssh/configに記載した接続先へ楽に接続できるスクリプト作ってみた

ども。ちゅらっぷすの平田です。

唐突ですがみなさん、SSH接続好きですか？僕は好きです。

SSHログインする際、どのように接続してるのでしょうか。
色々あるかと思いますが、接続先が増えると面倒ですよね。

- ターミナル経由で毎回コピペして接続
 - 接続情報探すのが手間
- SSHクライアントなどで接続
 - ブックマーク名での検索機能がない場合がある
- スクリプトにコマンドを記載して実行
 - そのディレクトリを探すのが手間

まぁ、全部こじつけというか言い訳なんですが、仕事柄ターミナルをよく使うので、なんかスクリプトで楽できないかなぁと思い立ちました。

**楽するために苦労しよう**というエンジニアの謎の行動理論ですね。

## 環境等について

- Mac(MacBook Pro - High Sierra 10.13.6 で動作確認できた)
- ターミナル利用 できる
- alias の設定ができる
- 雑なスクリプトでも多少は我慢できる
- .ssh/config がある
- 指摘するときは優しく指摘できる
 
以上の点を踏まえてスクリプトを見ていただけたらなぁと思います。
mac以外では動作検証してないのでご了承ください。

## .ssh/config について

.ssh/config には、SSHログイン時の接続先情報を記載できます。

```
Host alias(設定名)
        User ユーザー名
        HostName ホスト名とかIPアドレス
        port 22
        IdentitiesOnly yes
        IdentityFile ~/.ssh/鍵ファイルのパス
```


今回、`.ssh/config`のaliasを利用して、

```
$ ssh alias
```
というようにalias(設定名)でSSH接続できる点を利用したいと思います。

## スクリプト

```
#!/bin/bash

## color settings(カラーコードの定数)
readonly C_GREEN=32;
readonly C_YELLOW=33;
readonly C_BLUE=34;
readonly C_MAGENTA=35;
readonly C_CYAN=36;
readonly C_L_RED=91;
readonly C_L_GREEN=92;
readonly C_L_YELLOW=93;
readonly C_L_BLUE=94;
readonly C_L_MAGENTA=95;
readonly C_L_CYAN=96;

## この関数にカラーコードに対応する定数と文字列を投げると、色付きで文字列が吐かれる
function f_c()
{
	printf "\033[${1}m${2}\033[0m\n";
}

## .ssh/config の'alias'を取得し、リスト化
hosts=`cat /Users/user_name/.ssh/config | grep "^Host " | sed -E 's/^Host //g'`;
c_count=0

account_list=()
f_c ${C_GREEN} "========================="
f_c ${C_GREEN} "||    アカウント一覧   ||"
f_c ${C_GREEN} "========================="
for HOST_LIST in ${hosts[@]}
do
	account_list+=(${HOST_LIST})
	c_count=`expr ${c_count} + 1`
	c_count=`printf %3d ${c_count}`
	echo "${c_count} : ${HOST_LIST}"
done

f_c ${C_GREEN} "========================="

echo ""
f_c ${C_GREEN} "アカウントを選択してください"
f_c ${C_L_YELLOW} "Ctl+C で終了します"

## 接続先番号を指定し、接続を行う
read select_account
echo "選択アカウント"
ssh ${account_list[$select_account-1]}
```

ぶっちゃけカラーコード指定して色付き文字を出力するところが一番難儀でしたw
もうちょっと綺麗に描きたかったけど個人用だからいいかな。。。

## aliasを設定してスクリプトを楽に実行する

`.bash_profile`に以下を追記します。

```
alias slssh='sh ~/シェルスクリプトの/長ったらしい/憎たらしい/パス/ファイル名.sh'
```

追記したらターミナルを再起動するか、

```
source ~/.bash_profile
```
を実行。するとaliasとして`slssh`が登録されてますので、

```
sh ~/シェルスクリプトの/長ったらしい/憎たらしい/パス/ファイル名.sh
```
と入力ぜずとも、`slssh`と入力するだけでスクリプトを実行できます。

## 使用感

<img width="570" alt="Visual_Studio_Code.png" src="https://qiita-image-store.s3.amazonaws.com/0/275273/77b976bf-8654-aa84-40e0-dc07c10970f6.png">

実は当記事の執筆時点ですでに1年ほどこのスクリプトを利用してましたが、まぁ悪くもなく良くもなくといったところですかね。
alias(Host)の検索機能が欲しいですな。

画像では省略されてて見えないですが、31個の接続先の中から接続したい項目を探して番号を入力。Enter。
問題なく社内のUbintuサーバーにSSHログインできてます。

## まとめ

多少楽にはなりましたが、流石にこれ以上接続先が増えるとしんどいですね。
定期的に整理した方が良いかも。

また、このスクリプトはあくまで個人用ですので、グループワーク等には向いてないと思います。
接続先情報の修正が発生した際、１０人でこのスクリプトを利用していた場合は全員、`.ssh/config`を修正しなければいけませんので。。。

ということを踏まえると、ぶっちゃけ。。。
### SSHクライアントツールの方が楽な気がする

ちなみに余談ですが、scpコマンドを利用する時もSSH接続のaliasが使えるので、その点、`.ssh/config`に記載して正解だったなぁと思いました。
※グループワークでは絶対に使わないでくださいね。責任とれませんのでw

### あなたへオススメするかもしれない記事☆

- [スタバで逆ナンされる方法(＊´・∀・＊)](https://qiita.com/joe_hirata/items/372212f1a5d9fd5b98cd)
- [文字列操作 〜SedとVimと、時々、正規表現〜](https://qiita.com/joe_hirata/items/3bfa91995771a2392bba)
- [PHPの「Unable to load dynamic library」を解消する方法
](https://qiita.com/joe_hirata/items/94c8d56cdd0774779b39)