SSHで同じサーバーに何度も接続していると、ssh -i ~/.ssh/id_ed25519 -p 10022 username@very-long-hostname.example.comのような長いコマンドを毎回打つのが面倒になります。そこで使うのが設定ファイル~/.ssh/configです。接続先の情報をあらかじめ「別名(エイリアス)」として登録しておけば、ssh myserverのように短い名前だけで接続できるようになります。
書き方はとてもシンプルですが、1つだけ知らないとハマる罠があります。それは「同じ設定項目は、最初にマッチした値が優先される」というルールです。これを知らずにHost *(全ホスト共通)を先頭に書くと、個別の設定が効かなくなります。この記事では、実際のサーバーへ別名で接続しながら(罠も実際に踏みながら)、~/.ssh/configの書き方を整理します。
~/.ssh/configにHost 別名のブロックを書くと、ssh 別名で接続できます。- 主な項目は
HostName(実際のホスト)・User・Port・IdentityFile(鍵)です。 - 設定は「最初にマッチした値が優先」。だから
Host *は必ず一番下に書きます。 - 個別のHostを上に、共通の
Host *を下に、が鉄則です。 ssh -G 別名で、最終的に適用される設定値を接続せずに確認できます。- ファイルの権限は
600にしておきます。
鍵(IdentityFile)の作り方はssh-keygenで公開鍵認証を設定する方法、ファイル転送での活用はscpコマンド、ポート変更済みサーバーへの接続はSSHポート番号の変更もあわせて参考になります。
基本:Host別名で接続を短くする
~/.ssh/configにHost 別名を書き、その下にインデントして接続情報を並べます。HostNameが実際の接続先、Userがログインユーザー、Portがポート、IdentityFileが秘密鍵です。
# ~/.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ブロックにHostName・User・Port・IdentityFileを書いておくだけで、ssh myserverという短いコマンドだけで正しく接続できました(接続先のユーザー・ホスト名も設定どおりでした)。オプションを毎回打つ必要がなくなり、タイプミスも減ります。しかもscpやrsyncなど、SSHを使う他のコマンドでも同じ別名がそのまま使えるのが大きな利点です。PortやUserを書いておけば、scpで-Pの大文字小文字に悩むこともなくなります。
設定値を確認する(ssh -G)
「この別名は、結局どの設定で接続するのか」を接続せずに確認できるのがssh -Gです。configの書き方が正しいかのチェックに便利です。
# 別名に対して最終的に適用される設定値を表示(接続はしない) 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 myserverでhostname・user・port・identityfileなど、実際に使われる値がすべて表示されました。「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 myserverを先に、Host *を後に書いた場合、ssh -G myserverのUserは意図どおりaliceになりました。ところがHost *を先頭に置くと、同じmyserverのUserがdefaultuserのままで、下に書いた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 deploy・Port 2222)、末尾のHost *のServerAliveIntervalがすべてのホストに共通で効くことを確認しました。とくに便利なのがprod/stgのように、同じHostNameでもUserや鍵を分けて別名を用意するパターンです(実機でもそれぞれproduser/stguserと正しく解決されました)。本番とステージングの取り違えを防げます。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を同じにして混乱する
別名は短く分かりやすい呼び名にすると、複数サーバーの管理が楽になります。
よくある質問
ssh 別名という短いコマンドで接続できるようにします。長いオプションを毎回打つ必要がなくなり、scpやrsyncなどSSHを使う他のコマンドでも同じ別名がそのまま使えます。Hostは自分で決める「別名(呼び名)」で、sshコマンドで指定する名前です。HostNameは実際の接続先(ドメインやIPアドレス)です。たとえばHost myserver / HostName app.example.comと書くと、ssh myserverでapp.example.comに接続します。ssh -G 別名で、最終的に適用される設定値を接続せずに確認してください。よくある原因は、Host *を先頭に書いてしまい「最初にマッチした値が優先」で個別設定が上書きされないケースです。Host *は必ずファイルの一番下に置きます。インデントのずれやスペルミスも確認しましょう。Host *を上に書くと、その下の個別設定が効かなくなります。実機でも、Host *を先頭に置くと個別のUser設定が無視されることを確認しています。HostNameと異なるUserを書きます。たとえばHost prod(User produser)とHost stg(User stguser)を両方HostName app.example.comにすれば、ssh prodとssh stgで使い分けられます。本番とステージングの取り違え防止に有効です。まとめ
~/.ssh/configにHost 別名を書けば、ssh 別名で接続できます。- 主な項目は
HostName・User・Port・IdentityFile。scpなどでも同じ別名が使えます。 - 「最初にマッチした値が優先」。だから
Host *は必ず一番下に書きます。 - 反映されないときは
ssh -G 別名で確定値を確認します。 - ファイルの権限は
600、~/.sshは700にします。
~/.ssh/configは、SSHを日常的に使うほど効いてくる「設定の一元管理」の仕組みです。「Hostは別名・HostNameが実体」「Host *は一番下」の2点さえ押さえれば、複数サーバーの接続がぐっと楽になります。公開鍵認証とあわせて設定して、快適で安全なSSH環境を整えましょう。

