SSHのconfigファイル活用のすすめ

2019年4月17日

シェルのコマンドライン

SSHには接続先の設定を記述しておけるconfigファイルという機能があります。

サーバ系のプログラマーやエンジニアであれば常識だと思いますが、何故か意外と知らずに使っていない人を時々見かけます。

SSHクライアントのconfig設定について簡単にご紹介したいと思います。

configファイルについて

場所

ユーザのホームディレクトリ下の.ssh/configになります。

無い場合は自分で作成します。

接続名と接続先の設定

Host sv1
  HostName xxxx.yyyy.zzzz

上記のように記述すると SSH sv1 とするだけでxxxx.yyyy.zzzzに接続できるようになります。

上記の例でHostNameの行は設定を見やすくするためインデントしていますが、インデントは無くても大丈夫です。

接続ユーザの設定

Host sv1
  HostName xxxx.yyyy.zzzz
  User user1

上記のように設定すると SSH sv1 とするだけで SSH user1@xxxx.yyyy.zzzz の代替になります。

接続ポートの設定

Host sv1
  HostName xxxx.yyyy.zzzz
  User user1
  Post 2222

同様に接続ポートも上記のように指定することができます。

わざわざ-pオプションを指定して SSH -p 2222 user1@xxxx.yyyy.zzzz と接続する代わりに SSH sv1 で接続できるようになります。

秘密鍵ファイルの指定

Host sv1
  HostName xxxx.yyyy.zzzz
  User user1
  Post 2222
  IdentityFile ~/.ssh/user1.key

上記のように秘密鍵ファイルも指定できますので-iオプションを指定する必要がなくなります。

毎回の接続はSSH sv1 とするだけでよくなり SSH -i ~/.ssh/user1.key -p 2222 user1@xxxx.yyyy.zzzz と指定する必要がなくなります。

複数の接続先の設定

Host sv1
  HostName xxxx.yyyy.zzzz
  User user1
  Post 2222
  IdentityFile ~/.ssh/user1.key
Host sv2
  HostName aaaa.bbbb.cccc
  User user2
  Post 3222
  IdentityFile ~/.ssh/user2.key

複数の接続先の設定を行いたい場合は上記のように続けて記述しておけば大丈夫です。

上記の例では見やすくするためインデントや改行を入れていますが、無くても構いません。

共通設定の方法

Hostにワイルドカード(*)が指定できますので、それを利用すれば設定を共通化することができます。

Host sv1
  HostName xxxx.yyyy.zzzz
  IdentityFile ~/.ssh/user1.key
Host sv2
  HostName aaaa.bbbb.cccc
  IdentityFile ~/.ssh/user2.key
Host *
  User sv-user
  Port 2222

Hostは上からマッチした順で適用されるのでワイルドカードの設定は最後に書くようにして下さい。

Host *.api などのように一部分をワイルドカードにして一部のサーバの設定を共通化することも可能です。

他の便利な設定や使い方

CompressionやCompressionLevel、ConnectTimeout、TCPKeepAliveなど他にもたくさんの便利なオプションが用意されています。

詳しくはman ssh_configを参照して下さい。

様々な環境に対応できるだけの設定がありますのでconfig設定を便利になものにできると思います。

まとめ

サーバ系の仕事をしてきたという肩書で入ってきた人や元々会社にいた人でSSHのconfig設定ファイルの存在を知らないが意外と多く、本当にサーバ系のプログラマーやエンジニアをやってきたのか疑わしいと思えることがあります。

昔、外資系のゲーム会社の技術者から上司がサンプルでAWSの複数のインスタンスをアップしたりダウンしたりするスクリプトを貰ったことがありました。

私はすぐにスクリプトの意図が分かり、スクリプトを自動化するためにconfigにAWSの接続設定を設定しておかないと動かないと理解しました。

しかし当時の上司が理解しておらず「とりあえずスクリプト動かしてみて」と言われ「このスクリプトはSSHのconfigを適切に設定しないと動かないですよ」と忠告したにも関わらず「いいから動かしてみて」と言ってきました。

上司が「エラーがでて動かないね。どう使うんだろう」とか言ってるので、たまらずネット上のSSHのconfig機能を解説しているサイトを見せて、「接続名をsv1、sv2、sv3などにしてループで数字をインクリメントして動作する意図のスクリプトですよ」と教えた記憶があります。

その上司はサーバのNFSのサービスの起動を/etc/rc.localに記述していたり、お世辞にも私から見てエンジニアを名乗れた人ではありませんでした・・・。

SSHのconfig設定は色々な事を便利に出来るようになりますので、ぜひ活用して下さい。