Edited at

[Mac]~/.ssh/config から Host => HostName の対応表を作って出力する


前置き

※前置きはどうでもいいんだよ!って方は 本題 からどうぞw

最近 MacBook デビューしました私です。(会社からの借り物ですが)

いまいろいろセットアップをしているところですが、SSH接続関係のセットアップの際に、.ssh/configファイルでSSH接続を管理する を参考にSSHでサーバーに接続する設定を ~/.ssh/config に書いておき、SSH接続は名前だけで接続できるようにしました。

こんなかんじです。(※細かい設定はここでは端折ってます)


~/.ssh/config

Host hoge_1

HostName 192.0.2.1
User johnsmith
Port 22
IdentityFile ~/.ssh/xxxxxxxx
Host hoge_2
HostName 192.0.2.2
User johnsmith
Port 22
IdentityFile ~/.ssh/xxxxxxxx
Host hoge_3
HostName 192.0.2.3
User johnsmith
Port 22
IdentityFile ~/.ssh/xxxxxxxx
Host hoge_4
HostName 192.0.2.4
User johnsmith
Port 22
IdentityFile ~/.ssh/xxxxxxxx
Host hoge_5
HostName 192.0.2.5
User johnsmith
Port 22
IdentityFile ~/.ssh/xxxxxxxx


本題

設定自体は人からもらったものを流用していることもあり、目的のサーバーへ繋ぐための名前がわからなくなることがよくあります。

~/.ssh/config を都度見て確認していますが、上記のサンプルくらいのボリュームならともかく実際の config はもっとたくさん設定が書いてあり長いです。

これを毎回ファイルを見て調べるのは面倒なので、名前と接続先だけを一覧表として出力するコマンドを作ってみました。


コマンド

$ cat ~/.ssh/config | grep -e 'Host ' -e 'HostName' | sed -e 'N;s/\n//g' | awk '{print $2" => "$4}'


出力結果

hoge_1 => 192.0.2.1

hoge_2 => 192.0.2.2
hoge_3 => 192.0.2.3
hoge_4 => 192.0.2.4
hoge_5 => 192.0.2.5

ポイントは sed コマンドにつけている N; です。細かい話はここでは端折りますが、簡単に言うと2行単位で処理をするというものです。


ざっくり解説(スキップ可)


grep -e 'Host ' -e 'HostName' の時点

Host hoge_1

HostName 192.0.2.1
Host hoge_2
HostName 192.0.2.2
Host hoge_3
HostName 192.0.2.3
Host hoge_4
HostName 192.0.2.4
Host hoge_5
HostName 192.0.2.5

こんな風に10行出力されます。sed コマンドは普通は1行単位で処理をしますが、これを2行単位で処理をすることができるというありがたいオプションです。2行の出力を1行として扱うようにすると言い換えてもいいかもしれません。

詳しくはこちらのエントリが参考になります。

http://blog.livedoor.jp/morituri/archives/52036613.html


sed -e 'N;s/\n//g' まで実行すると

こうなります。一度に2行づつ処理したので10行あったものが5行になりました。

改行を消してもいるため1行目と2行目の文字列がそのまま横に並んでいます。

Host hoge_1  HostName 192.0.2.1

Host hoge_2 HostName 192.0.2.2
Host hoge_3 HostName 192.0.2.3
Host hoge_4 HostName 192.0.2.4
Host hoge_5 HostName 192.0.2.5

あとは awk で好きなように出力すればおkというかんじです。

今回は hoge_1 => 192.0.2.1 と出力させたいので awk '{print $2" => "$4}' としてます。


エイリアス登録

ついでにエイリアス登録しておきます。(会社の先輩から言われるまで全くその発想が出なかったのは内緒)

コマンドを別ファイルにする必要はないのですが、こうすると面倒なシングルクオートのエスケープに悩まされることがなくなりますので個人的にはおすすめの手法です。


コマンドを別ファイルに


~/.myscripts/ssh_list.sh

#!/bin/sh

cat ~/.ssh/config | grep -e 'Host ' -e 'HostName' | sed -e 'N;s/\n//g' | awk '{print $2" => "$4}'


alias で別ファイルにしたコマンドを実行


~/.bash_profile

alias sshlist='. ~/.myscripts/ssh_list.sh'


これで sshlist コマンドを実行すればいつでも対応表を呼び出せるようになりました。よかったら試してみてください。


動作環境


  • macOS 10.13.6 High Sierra