【SSH】~/.ssh/configの書き方|Host別名で接続を簡単に・設定の優先順位の罠

【SSH】~/.ssh/configの書き方|Host別名で接続を簡単に・設定の優先順位の罠 SSH

SSHで同じサーバーに何度も接続していると、ssh -i ~/.ssh/id_ed25519 -p 10022 username@very-long-hostname.example.comのような長いコマンドを毎回打つのが面倒になります。そこで使うのが設定ファイル~/.ssh/configです。接続先の情報をあらかじめ「別名(エイリアス)」として登録しておけば、ssh myserverのように短い名前だけで接続できるようになります。

書き方はとてもシンプルですが、1つだけ知らないとハマる罠があります。それは「同じ設定項目は、最初にマッチした値が優先される」というルールです。これを知らずにHost *(全ホスト共通)を先頭に書くと、個別の設定が効かなくなります。この記事では、実際のサーバーへ別名で接続しながら(罠も実際に踏みながら)、~/.ssh/configの書き方を整理します。

先に結論

  • ~/.ssh/configHost 別名のブロックを書くと、ssh 別名で接続できます。
  • 主な項目はHostName(実際のホスト)・UserPortIdentityFile(鍵)です。
  • 設定は「最初にマッチした値が優先」。だからHost *は必ず一番下に書きます。
  • 個別のHostを上に、共通のHost *を下に、が鉄則です。
  • ssh -G 別名で、最終的に適用される設定値を接続せずに確認できます。
  • ファイルの権限は600にしておきます。

鍵(IdentityFile)の作り方はssh-keygenで公開鍵認証を設定する方法、ファイル転送での活用はscpコマンド、ポート変更済みサーバーへの接続はSSHポート番号の変更もあわせて参考になります。

スポンサーリンク

基本:Host別名で接続を短くする

~/.ssh/configHost 別名を書き、その下にインデントして接続情報を並べます。HostNameが実際の接続先、Userがログインユーザー、Portがポート、IdentityFileが秘密鍵です。

~/.ssh/config の基本
# ~/.ssh/config

Host myserver
    HostName very-long-hostname.example.com
    User username
    Port 10022
    IdentityFile ~/.ssh/id_ed25519

# これだけで、長いコマンドが…
#   ssh -i ~/.ssh/id_ed25519 -p 10022 username@very-long-hostname.example.com
# たったこれで済む:
ssh myserver

# scp も同じ別名が使える
scp file.txt myserver:/home/username/

実際のサーバーで試したところ、Host myserverブロックにHostNameUserPortIdentityFileを書いておくだけで、ssh myserverという短いコマンドだけで正しく接続できました(接続先のユーザー・ホスト名も設定どおりでした)。オプションを毎回打つ必要がなくなり、タイプミスも減ります。しかもscprsyncなど、SSHを使う他のコマンドでも同じ別名がそのまま使えるのが大きな利点です。PortUserを書いておけば、scpで-Pの大文字小文字に悩むこともなくなります。

設定値を確認する(ssh -G)

「この別名は、結局どの設定で接続するのか」を接続せずに確認できるのがssh -Gです。configの書き方が正しいかのチェックに便利です。

ssh -G で最終設定を確認
# 別名に対して最終的に適用される設定値を表示(接続はしない)
ssh -G myserver

# 主要な項目だけ抜き出す例
ssh -G myserver | grep -E "^hostname |^user |^port |^identityfile "
# hostname very-long-hostname.example.com
# user username
# port 10022
# identityfile ~/.ssh/id_ed25519

実機でも、ssh -G myserverhostnameuserportidentityfileなど、実際に使われる値がすべて表示されました。「configに書いたのに反映されない」というときは、まずssh -G本当に意図した値になっているかを確認するのが近道です。次の章で説明する「優先順位の罠」も、このssh -Gですぐに見抜けます。

【最重要】設定は「最初にマッチした値」が優先

~/.ssh/configの最大の落とし穴がこれです。同じ設定項目が複数の場所でマッチする場合、ファイルの上から見て「最初にマッチした値」が採用されます(後から上書きはされません)。この仕様を知らずに、全ホスト共通のHost *先頭に書くと、その下の個別設定が効かなくなります。

順序で結果が変わる
# OK: 個別の Host が先、Host * が後(正しい)
Host myserver
    User alice
Host *
    User defaultuser
# → myserver の User は alice(意図どおり)


# NG: Host * を先頭に書いてしまった
Host *
    User defaultuser
Host myserver
    User alice
# → myserver の User は defaultuser のまま!
#   (先に * がマッチして User が確定してしまう)
Host *は必ず一番下に書く(実証)

実機でこの順序の違いを確認しました。個別のHost myserverを先に、Host *を後に書いた場合、ssh -G myserverUserは意図どおりaliceになりました。ところがHost *を先頭に置くと、同じmyserverUserdefaultuserのままで、下に書いたaliceが無視されました。SSHは各設定項目について「最初に見つけた値」で確定し、あとから変更しないためです。したがって、「具体的なHostほど上・Host *のような包括的な設定ほど下」が鉄則です。共通の鍵やタイムアウト設定をHost *にまとめるのは便利ですが、その位置は必ずファイルの末尾にしてください。うまく効かないときはssh -Gで確定値を確認すれば、どこで上書きされたか一目で分かります。

ワイルドカードと共通設定(Host *)

Hostにはワイルドカード(*が使えます。似た名前のサーバーをまとめたり、Host *で全ホスト共通の設定を書いたりできます(位置は末尾に)。

ワイルドカードと共通設定
# 特定のドメインをまとめて設定
Host *.example.com
    User deploy
    Port 2222

# 本番とステージングを別名で(同じホストでもユーザーを分ける)
Host prod
    HostName app.example.com
    User produser
Host stg
    HostName app.example.com
    User stguser

# 全ホスト共通(必ず一番下に!)
Host *
    ServerAliveInterval 60
    IdentityFile ~/.ssh/id_ed25519

実機でも、Host *.example.comのワイルドカードがweb.example.comのようなホストにまとめて適用され(User deployPort 2222)、末尾のHost *ServerAliveIntervalすべてのホストに共通で効くことを確認しました。とくに便利なのがprodstgのように、同じHostNameでもUserや鍵を分けて別名を用意するパターンです(実機でもそれぞれproduserstguserと正しく解決されました)。本番とステージングの取り違えを防げます。ServerAliveIntervalは無通信でも定期的に信号を送って接続が切れるのを防ぐ設定で、共通設定としてHost *に入れておくと快適です。

ファイルの場所と権限

設定ファイルは~/.ssh/config(WindowsはC:\Users\ユーザー名\.ssh\config)に置きます。他人に書き換えられないよう、権限は600にしておきます。

設置と権限
# ファイルを作成・編集
nano ~/.ssh/config     # または vim, code など

# 権限を 600 に(自分だけ読み書き)
chmod 600 ~/.ssh/config

# ~/.ssh ディレクトリ自体は 700
chmod 700 ~/.ssh

# 別ファイルに分けて取り込むこともできる(先頭に書く)
# Include ~/.ssh/config.d/*

~/.ssh/configの権限が緩いとSSHが警告を出すことがあるため、秘密鍵と同様にchmod 600にしておくのが安全です。設定が増えてきたら、Includeで用途別のファイルに分割する方法もあります(Includeはマッチ順の関係でファイルの先頭に書くのが一般的です)。まずはHostブロックを1つ書いてssh 別名で接続できることを確かめ、少しずつ育てていくとよいでしょう。

主な設定項目一覧

~/.ssh/configでよく使う項目をまとめます。

項目 意味
Host 別名 この別名で接続できるようにする
HostName 実際の接続先(ドメイン/IP)
User ログインユーザー名
Port ポート番号(22以外のとき)
IdentityFile 使用する秘密鍵
ServerAliveInterval 接続維持のための定期送信(秒)

よくある失敗

Host *を先頭に書いて個別設定が効かない

最初にマッチした値が優先です。Host *は必ず一番下に置きます。

HostとHostNameを混同する

Hostは別名(自分で決める呼び名)、HostNameが実際の接続先です。

設定が反映されない

ssh -G 別名で確定値を確認します。インデントのずれやスペルミスが原因のことも。

configの権限が緩くて警告が出る

chmod 600 ~/.ssh/config~/.sshは700にします。

別名とHostNameを同じにして混乱する

別名は短く分かりやすい呼び名にすると、複数サーバーの管理が楽になります。

よくある質問

Q~/.ssh/configで何ができますか?
A接続先のホスト名・ユーザー・ポート・秘密鍵などを「別名」として登録し、ssh 別名という短いコマンドで接続できるようにします。長いオプションを毎回打つ必要がなくなり、scpやrsyncなどSSHを使う他のコマンドでも同じ別名がそのまま使えます。
QHostとHostNameの違いは何ですか?
AHostは自分で決める「別名(呼び名)」で、sshコマンドで指定する名前です。HostNameは実際の接続先(ドメインやIPアドレス)です。たとえばHost myserver / HostName app.example.comと書くと、ssh myserverapp.example.comに接続します。
Q設定を書いたのに反映されません。
Assh -G 別名で、最終的に適用される設定値を接続せずに確認してください。よくある原因は、Host *を先頭に書いてしまい「最初にマッチした値が優先」で個別設定が上書きされないケースです。Host *は必ずファイルの一番下に置きます。インデントのずれやスペルミスも確認しましょう。
QHost *はどこに書けばいいですか?
A必ずファイルの一番下に書きます。SSHの設定は「最初にマッチした値が優先」される仕様のため、全ホストにマッチするHost *を上に書くと、その下の個別設定が効かなくなります。実機でも、Host *を先頭に置くと個別のUser設定が無視されることを確認しています。
Q同じサーバーにユーザーを変えて接続したいときは?
A別名を分けて、それぞれに同じHostNameと異なるUserを書きます。たとえばHost prod(User produser)とHost stg(User stguser)を両方HostName app.example.comにすれば、ssh prodssh stgで使い分けられます。本番とステージングの取り違え防止に有効です。

まとめ

  • ~/.ssh/configHost 別名を書けば、ssh 別名で接続できます。
  • 主な項目はHostNameUserPortIdentityFile。scpなどでも同じ別名が使えます。
  • 「最初にマッチした値が優先」。だからHost *は必ず一番下に書きます。
  • 反映されないときはssh -G 別名で確定値を確認します。
  • ファイルの権限は600~/.ssh700にします。

~/.ssh/configは、SSHを日常的に使うほど効いてくる「設定の一元管理」の仕組みです。「Hostは別名・HostNameが実体」「Host *は一番下」の2点さえ押さえれば、複数サーバーの接続がぐっと楽になります。公開鍵認証とあわせて設定して、快適で安全なSSH環境を整えましょう。