開発業務をやっていると、客先サーバーやら自社サーバー、ローカルの仮想サーバーなどいろいろ増えてツラくなってきます。
接続先が増えるとIPアドレスや鍵ファイル等の管理が面倒になってくるので、設定ファイルで管理しておくと簡単に接続できるようになります。
例えばSSH接続する時には
$ ssh user@hostname_or_ip -p 22 -i ~/.ssh/id_ed_25519
みたいな感じにしますが、設定しておくことで、
$ ssh nc_whale
みたいな感じに接続することができるようになります。
.sshディレクトリ構成
今回の設定方法ですが、.sshディレクトリ配下はこんな感じにします。
- .ssh/
- config.d/
- project_a.conf
- project_b.conf
- develop.conf
- localdev.conf
- …
- keys/
- client_a_web.key
- github_rsa
- github_rsa.key
- …
- config
- known_hosts
- id_ed25519
- id_ed25519.pub
- id_rsa
- id_rsa.pub
- config.d/
今回キーになるのは、configファイルとconfig.dディレクトリ、keysディレクトリになります。
- configファイル: 共通設定と外部設定ファイルの読み込み設定を記述
- config.dディレクトリ: 各サーバーへの接続設定を記述
- keysディレクトリ: 接続時の使用する鍵ファイルを管理します。
configファイル
configファイルにはSSH接続時に共通で使用するパラメータと外部設定ファイル読み込み設定を記述します。
私の場合はこんな感じにしています。
Host *
ServerAliveInterval 60
Include config.d/*.conf
共通設定として、接続時のタイムアウトによる切断を回避したいので、60秒ごとにビーコンを発信するようにします。
外部設定の読み込みは config.dディレクトリ配下にあるconf拡張子を持ったファイルを読み込むようにしています。
config.dディレクトリ
このディレクトリには接続先設定を含んだファイルを格納します。
私の場合、案件やローカル開発環境毎に分けて管理しています。グループに分けて接続先を管理できるので大量にあっても「なにがなんだかわからんぞ…」みたいなことになりにくいです。
各設定ファイルにはこんな感じに記述します。
# Cloudstack on WHALE
Host nc_whale
HostName 192.168.1.16
Port 22
User yusuke
IdentityFile ~/.ssh/id_ed25519
Host nc_shark
HostName shark.local
Port 60022
User yusuke
HostKeyAlgorithms ssh-rsa
PubkeyAcceptedKeyTypes ssh-rsa
IdentityFile ~/.ssh/id_rsa
Hostから始まるカタマリが 1つの接続設定で、1つの .conf ファイルには複数の接続先を設定できます。
また、#(シャープ)でコメントも書けるので、管理はしやすいかと思います。
よく使うパターンとしては、このパラメータを使う事が多いかと思います。
- HostName: ホスト名やIPアドレス、DNSから引けるドメインなど
- Port: ポート番号。22番はデフォルトポートなのでPortパラメータを省略すると22番ポートで接続しようとします。
- User: 接続ユーザ名
- IdentityFile: 接続に使用する鍵ファイルを指定
Hostの後ろにあるnc_whaleやnc_sharkはsshコマンドの引数として使用します。
192.168.1.16のサーバーに接続する場合、
$ ssh nc_whale
みたいな感じに書きます。
古いサーバーに接続する場合、HostKeyAlgorithms や PubkeyAcceptedKeyTypes なんかのパラメータを設定することで接続先毎に設定を変えることができます。
本番環境で多段SSHする時は ProxyCommand を使います。
パラメータについてはこのあたりが参考になります。(ありがたや!)
keysディレクトリ
keysディレクトリには接続に使用する鍵ファイルを放り込んでます。
ディレクトリを作成して分類した方が管理しやすくなると思いますが、今のところただ放り込んでます。
SSHコマンドの補完
接続先が増えると、Hostで指定した名前も覚えられなくなります…
ので、タブキーで補完できる設定もあります。
RedHat系もあると思いますが、DebianやUbuntuでBashを使っている場合は、bash-completion パッケージを導入します。
このコマンドでインストールします。
$ sudo apt install bash-completion
インストールしたら、~/.bashrcファイルに下記を追記します。
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
保存したら、このコマンドで.bashrcを再読み込みするか、ログインし直してください。
$ . ~/.bashrc
これでホスト名を補完できるようになります。
補完の仕方は、cd コマンドでディレクトリを探す感じで、タブキーを連打するだけです。超便利!