WindowsのSSH configが反映されないときは?ssh -Gで設定を確認する方法
SSHのconfigに接続先やユーザー名を書いたのに、設定が反映されず、毎回コマンドで指定し直していることはありませんか?ポートを変更したはずなのに、別のポートへ接続しようとして困ることもあります。
そんなときは、OpenSSHが実際に読み取った設定を表示すると、意図した設定との違いを探しやすくなります。ssh -Gを使えば、サーバーへのSSH接続を開始せずに、接続先・ユーザー名・ポートなどを確認できます。
まずは、使っているSSHとconfigの保存先から見ていきましょう。そこが合っていれば、Hostの名前や設定の並び順へ進めます。以下のコマンドは、Windows版OpenSSHをPowerShellから使う例です。Windows TerminalでWSLやGit Bashを開いている場合は、それぞれの環境で使っているSSHと設定ファイルを確認してみてください。
使っているSSHを確認する
Get-Command ssh -All | Select-Object Source
ssh -V
「いつも使っているSSHのはず」と思っていても、複数のSSHが入っていると、別の実行ファイルが呼び出されることがあります。上のコマンドで表示された場所を見てみましょう。Windows標準のOpenSSHなら、通常はC:\Windows\System32\OpenSSH\ssh.exeです。Windows Terminalの設定を変えた場合も、どのSSHを起動しているかが手掛かりになります。
保存先とファイル名を確認する
次に、編集したconfigが正しい場所にあるかを見てみましょう。Windows版OpenSSHのユーザー設定は%USERPROFILE%\.ssh\configに保存します。PowerShellで次のコマンドを実行すると、ファイル名と保存場所を一覧で見られます。
Get-ChildItem -Force "$env:USERPROFILE\.ssh" |
Select-Object Name, FullName
ファイル名に.txtが付いていませんか?必要なのは、拡張子のないconfigという名前です。名前の似たsshd_configは接続を受け付けるサーバー側の設定なので、今回は接続する側のconfigを開きましょう。書き換える前にコピーを残しておくと、元の設定に戻せます。
保存先の仕様はMicrosoftのOpenSSH構成資料の「OpenSSH構成ファイル」で確認できます。
接続名に適用される設定を表示する
保存場所が合っていたら、設定がどう読み取られているかを見てみましょう。次の例では、blog-demoという別名に接続先・ユーザー名・ポートをまとめています。192.0.2.10は説明用のIPアドレスなので、実際に使うときはご自身の接続先に置き換えてください。
Host blog-demo
HostName 192.0.2.10
User deploy
Port 2222
Host *
User commonuser
Port 22
この設定を読み取らせるには、Hostに書いた別名を使って、次のコマンドを実行してみてください。
ssh -G blog-demo |
Select-String '^(hostname|user|port|identityfile) '
この例で表示されるのは、次の値です。ご自身の設定なら、書いたユーザー名・接続先・ポートと見比べてみましょう。秘密鍵の候補を表すidentityfileは、鍵の設定によって複数行になることがあります。
user deploy
hostname 192.0.2.10
port 2222
ここで気を付けたいのが、コマンドに渡す接続名です。上の例でssh -G 192.0.2.10とIPアドレスを直接指定すると、Host blog-demoには一致しません。別名にまとめた設定を使いたいときは、ssh -G blog-demoのように、その名前を指定しましょう。
-Gは、HostやMatchの条件を反映した設定を表示して終了します。まずはこの結果で設定を見比べ、サーバーにつながるか、鍵でログインできるかは、その後の接続で確かめる流れです。詳しい動作はOpenSSHの-Gの説明にまとまっています。
設定ファイルを指定して比較する
「このconfigを編集したのに、表示される値が違う」というときは、-Fでファイルを直接指定してみましょう。
ssh -G -F "$env:USERPROFILE\.ssh\config" blog-demo |
Select-String '^(hostname|user|port|identityfile) '
通常のssh -G blog-demoと結果を見比べると、読み込み元を調べる手掛かりになります。ただし、-Fを使うとシステム全体の設定ファイルも読み込まれなくなります。違いが出た場合は、使っているSSHやユーザー、configの保存先に加えて、システム全体の設定の影響も見てみてください。
個別設定を共通設定より上に置く
ファイルの内容が読まれているのに値が合わない場合は、設定の並び順が原因かもしれません。UserやPortには、先に得られた値が使われるというルールがあります。Host *の共通設定を先頭に書くと、後ろの接続先別設定よりも先に値が決まってしまいます。個別のHostを上、共通の初期値を下に置くと整理しやすくなります。
例えば、先ほどの例でHost *を先頭へ移すと、blog-demoでもuser commonuser、port 22になります。個別設定を上へ戻したら、もう一度ssh -Gを実行して、値の変化を見てみましょう。
なお、IdentityFileのように、複数の指定を追加できる項目もあります。「どの項目も最初の1件だけ」と覚えると迷いやすいので、鍵などの設定で困ったときはOpenSSHのssh_configマニュアルで該当項目を調べると役立ちます。
コマンドに指定した値も確認する
configが正しくても、接続コマンドに別の値が残っていることがあります。コマンドラインの指定が優先されるため、次の例ではconfigに書いた2222ではなく、2200が表示されます。
ssh -G -p 2200 blog-demo |
Select-String '^port '
普段ショートカットやWindows Terminalのプロファイルから接続しているなら、そちらの起動コマンドものぞいてみてください。以前設定した-pや-l、user@接続先が、configより優先されているかもしれません。
設定が合っている場合は接続・認証を調べる
ここまででhostname・user・portが意図した値になっていれば、設定の読み取りは確認できています。それでも接続できないときは、実際に表示されるエラーを手掛かりにすると、次に調べる場所を絞れます。
- 名前解決のエラーなら、HostNameのホスト名やDNSが手掛かりになります。
- 接続タイムアウトや接続拒否なら、接続先アドレス・ポート・SSHサービス・ファイアウォールを順に見てみましょう。
- 認証エラーなら、ユーザー名や使っている秘密鍵、接続先に登録した公開鍵を見直してみてください。
使っているクライアントの違いも気になる方は、Windowsのターミナル・SSHクライアント比較も参考にしてみてください。
-
前の記事
Kubernetesのセキュリティ告知:名前空間の越境とWindowsノードのNTLM認証 2026.09.28
-
次の記事
記事がありません