Mac
Linux
SSH

[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 Host | 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 Host の時点

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 Host | sed -e 'N;s/\n//g' | awk '{print $2" => "$4}'

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

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

これで sshlist コマンドを実行すればいつでも対応表を呼び出せるようになりました。
ついでに .bash_profile 内でさっそく呼び出しているので iterm2 の起動のたびに sshlist が実行されてリストがプロンプト上に表示されます。よかったら試してみてください。

動作環境

  • macOS 10.13.6 High Sierra