SSH で ~/.ssh/config に書いた設定が反映されない
ssh_config は各項目について最初に見つかった値を採用する。
汎用の Host * を先頭に置くと、後ろに書いた個別ホストの設定は勝てない。
並び順と Host パターンの一致を確認し、ssh -G で実効値を見る。
公開:
要約
~/.ssh/config の設定が効かない原因で最も多いのは、書く順番である。
ssh_config は各設定項目について「最初に指定された値を使う」と定められている。
後から書いた値で上書きされるわけではない。
Host *
User ubuntu
Host myserver
HostName 203.0.113.10
User deploy # ← 先に Host * の User が確定しているので採用されないこの設定で ssh myserver すると、接続先は正しいのにユーザーは ubuntu のままになる。
汎用ブロックを先頭に置いた時点で、後続の個別指定は勝てない。
よくある原因
Host *が先頭にある: ssh_config(5)(新しいタブで開く) のとおり「特記が無い限り、各設定項目は最初に指定された値が使われる」。
汎用ブロックは最後に置くのが原則である。- Host パターンが一致していない:
Host myserverと書いてssh myserver.example.comで接続すると一致しない。
パターンはコマンドラインに与えた文字列に対して照合される。 - ssh-agent の鍵が先に出る: agent に複数の鍵が登録されていると、
IdentityFileで指定した鍵より先にそちらが提示され、サーバー側で試行回数超過になることがある。 - config の権限が緩い: 他ユーザーから書き込める設定ファイルは読み込まれない。
解決策
1. 個別を先、汎用を後に置く
Host myserver
HostName 203.0.113.10
User deploy
IdentityFile ~/.ssh/id_ed25519_deploy
IdentitiesOnly yes
Host *
ServerAliveInterval 60この順序なら User は deploy に確定し、ServerAliveInterval は全ホスト共通の既定として効く。
2. 実効値を確認する
ssh -G myserverssh -G は接続せずに、そのホストへ適用される設定を解決して出力する。user deploy や identityfile の行を見れば、意図した値が採用されているかが一目で分かる。
想定と違えば、その項目を先に決めているブロックが上にある。
3. 鍵を固定する
IdentitiesOnly yesIdentitiesOnly は「設定または既定のファイルで指定した鍵だけを使う」ことを ssh に指示する。
agent がより多くの鍵を提示していても無視されるため、鍵が多い環境で「別の鍵で認証されてしまう」問題が止まる。
4. 権限と読み込み順を見る
chmod 600 ~/.ssh/config
ssh -v myserver 2>&1 | grep -i 'reading configuration'どの設定ファイルの何行目が適用されたかが出る。/etc/ssh/ssh_config 側で先に決まっている項目があれば、ユーザー設定では変えられないことも確認できる。