はじめに
インフラ作業では、サーバーへ SSH 接続して設定ファイルを編集したり、ログを手元に持ってきたりする操作が日常的に発生します。従来は Tera Term と WinSCP を併用するのが一般的でしたが、VS Code の Remote-SSH 拡張を使うと、SSH 接続・ファイル編集・ファイル転送を 1 つの画面にまとめられます。
本記事では、Windows 環境を前提に、Remote-SSH の導入から SSH config の設定、パスワード認証・公開鍵認証での接続、そして接続時に詰まりやすいエラーの対処までを解説します。VS Code をインフラ作業の中心に据えたい場合の出発点として活用できます(関連記事『インフラエンジニアのための VS Code 活用|導入とサーバー管理』もご参照ください。
- Remote-SSH 拡張のインストール手順
- SSH config ファイルの書き方と各項目の意味
- パスワード認証・公開鍵認証での接続手順
- 接続後のファイル編集・転送・画面分割の使い方
Could not establish connection・Bad owner or permissionsの対処
Remote-SSH を導入し、config に接続先を登録しておくと、リモートエクスプローラーから数クリックでサーバーへ接続できます。接続先のファイルはローカルと同じ操作で直接編集・保存でき、FTP ソフトを別途立ち上げずにファイル転送も行えます。Windows では秘密鍵の権限まわりでエラーが出やすいものの、対処の手順はおおむね決まっています。
Remote-SSH 拡張のインストール
Remote-SSH を使うには、ローカル側に OpenSSH 互換の SSH クライアントが必要です(PuTTY は非対応)。Windows 10/11 では OpenSSH クライアントが標準で利用できるため、多くの場合は追加インストールなしで進められます。
拡張機能のインストール手順は次のとおりです。
- 拡張機能メニューを開きます(Ctrl + Shift + X)
- 検索バーに
Remote - SSHと入力します。 - Microsoft 製の「Remote – SSH」をインストールします。
インストールが完了すると、左下のステータスバーにリモート接続用のアイコンが表示され、アクティビティバーに「リモートエクスプローラー」のアイコンが追加されます。
参考: Visual Studio Code 公式ドキュメント(Remote development over SSH)
“The Remote – SSH extension is used to connect to SSH hosts”
(Remote – SSH 拡張は SSH ホストへの接続に使用します)
https://code.visualstudio.com/docs/remote/ssh

SSH config ファイルを作成する
毎回 IP アドレスやユーザー名を入力する手間を省くため、接続先の情報を SSH config ファイルに登録します。VS Code からは、コマンドパレット経由で config ファイルを開けます。
- コマンドパレットを開きます(Ctrl + Shift + P または F1)。
Remote-SSH: Open Configuration File(構成ファイルを開く)を選択します。- 保存場所の候補が表示されるので、Windows では通常
C:\Users\<ユーザー名>\.ssh\configを選びます。 - 開いた config ファイルに接続先を記述し、保存します(Ctrl + S)
config の書式と各項目の意味
config には、次のような書式で接続先を記述します。
Host my-server
HostName 192.168.1.100
User user01
Port 22
IdentityFile C:\Users\<ユーザー名>\.ssh\id_rsa各項目の意味は次のとおりです。
- Host: VS Code 上に表示される接続名(任意の名前を指定できます)
- HostName: 接続先の IP アドレスまたはホスト名
- User: ログインするユーザー名
- Port: ポート番号(22 番の場合は省略できます)
- IdentityFile: 秘密鍵のパス(公開鍵認証を使う場合に指定します)
パスワード認証で接続する場合は、IdentityFile の行を省略できます。公開鍵認証の設定手順は後のセクションで扱います。
接続先を複数登録する場合
複数のサーバーへ接続する場合は、Host ブロックを並べて記述します。すべての接続に共通する設定は Host * にまとめられます。次の例では、共通設定として接続維持のための ServerAliveInterval を指定しています。
Host *
ServerAliveInterval 60
Host web-server
HostName 203.0.113.10
User admin
Host db-server
HostName 203.0.113.20
User admin
Port 2222ServerAliveInterval 60 は、無通信状態が続いたときに接続が切れるのを抑える設定です。登録した接続先は、リモートエクスプローラーの一覧に表示されます。
サーバーに接続する
config に接続先を登録したら、リモートエクスプローラーから接続します。初回はパスワード認証で接続し、以降は公開鍵認証に切り替えると、毎回のパスワード入力を省けます。
パスワード認証で接続する
- アクティビティバーの「リモートエクスプローラー」を開きます。
- 「SSH」の一覧に、config に登録した接続名(例:
my-server)が表示されます。 - 接続名の横にある「→」アイコン(Connect to Host in New Window)をクリックすると、新しいウィンドウで接続が始まります。
- 初回のみ、次の確認が表示されます。
- OS の種類: Linux/Windows/macOS から選びます(Linux サーバーなら Linux)。
- Fingerprint: 接続してよいか確認されるので、「Continue」を選びます。
- 画面上部にパスワード入力欄が表示されるので、入力します。
- 左下のステータスバーに「SSH: my-server」と表示されれば接続完了です。
接続を終了する場合は、左下のステータスバー(SSH: …)をクリックし、メニューから「リモート接続を終了する」を選びます。
公開鍵認証で接続する
公開鍵認証を設定すると、接続のたびにパスワードを入力する必要がなくなり、セキュリティ面でも有利です。手順は、鍵の生成 → 公開鍵のサーバー登録 → config への指定、という流れです。
1. ローカルで鍵ペアを生成する
ローカルのターミナル(Git Bash や PowerShell)で、次のコマンドを実行します。
ssh-keygen -t ed25519既定では C:\Users\<ユーザー名>\.ssh に、秘密鍵 id_ed25519 と公開鍵 id_ed25519.pub が作成されます。途中でパスフレーズを設定すると、より安全に運用できます。Git Bash を使う場合の切り替えは、関連記事『VS Code のターミナルをコマンドプロンプトに変更する手順』で扱っています(※公開後にリンクを有効化)。
2. 公開鍵をサーバーへ登録する
公開鍵 id_ed25519.pub の内容を、サーバー側の ~/.ssh/authorized_keys に追記します(上書きしないよう注意します)。VS Code で接続中であれば、リモートのファイルツリーから ~/.ssh を開き、authorized_keys に公開鍵の内容を追記する方法もあります。
サーバー側のパーミッションは、~/.ssh を 700、authorized_keys を 600 に設定しておくと、権限不足による認証失敗を避けやすくなります。
3. config に IdentityFile を指定する
config の該当ホストに、秘密鍵のパスを IdentityFile として追記します。
Host my-server
HostName 192.168.1.100
User user01
IdentityFile C:\Users\<ユーザー名>\.ssh\id_ed25519この状態で再接続すると、パスワードを求められずに接続できます。
参考: Visual Studio Code 公式ドキュメント(Remote Development Tips and Tricks)
“You can use / for Windows paths as well”
(Windows のパスでも / を使用できます)
https://code.visualstudio.com/docs/remote/troubleshooting
なお、上記のとおり Windows のパスは / でも記述できます。\(バックスラッシュ)を使う場合は、C:\\Users\\... のように二重にする必要があります。
接続後にできること
接続が完了すると、サーバー上のファイルをローカルと同じ操作感で扱えます。インフラ作業でよく使う 3 つの機能を紹介します。
ファイルを直接編集する
リモートのファイルツリーからファイルを開き、編集して Ctrl + S で保存すると、その内容がサーバー上のファイルへ反映されます。vi の操作に不慣れな場合でも、エディタ上で設定ファイルを編集できます。手元の仕様書からの貼り付けや、長い設定ファイルのスクロールも、エディタ上で行えます。
ファイルを転送する(ドラッグ&ドロップ)
FTP ソフトを別途立ち上げなくても、ファイルの転送が行えます。
- アップロード: ローカルのファイルを、VS Code のファイルツリーへドラッグ&ドロップします。
- ダウンロード: サーバー上のファイルを右クリックし、「ダウンロード」を選びます。
これらの操作では、裏で SCP による通信が行われます。ログの取得やスクリプトの配置といった作業を、VS Code 内で完結できます。
画面を分割して編集と実行を並行する
エディタは左右(または上下)に分割できます。左側で設定ファイル(例: nginx.conf)を編集し、右側のターミナルで systemctl restart nginx を実行する、といった流れを 1 画面で進められます。設定変更とサービス再起動を繰り返す作業では、ウィンドウを行き来する手間を減らせます。
よくある接続エラーと対処
Remote-SSH では、Windows 環境特有の権限や設定が原因で接続に失敗することがあります。ここでは遭遇しやすい 2 つのエラーと対処を紹介します。
Could not establish connection
接続時に「Could not establish connection」というポップアップが表示され、出力ログに「プロセスが、存在しないパイプに書き込もうとしました。」といったメッセージが出る場合です。原因は複数考えられるため、次の順で切り分けると整理しやすくなります。
ローカルのターミナルから ssh my-server を実行し、VS Code 以外でも接続できるかを確認します。ここで失敗する場合は、config やネットワーク側に原因があります。
ローカルに OpenSSH 互換のクライアントが入っているかを確認します(PuTTY は非対応です)。
VS Code の出力パネルで「Remote-SSH」を選び、どの段階で失敗しているかを確認します。
VS Code が config を読み込めていない場合は、設定の「Remote.SSH: Config File」(remote.SSH.configFile)に config の絶対パス(例: C:\Users\<ユーザー名>\.ssh\config)を入力し、VS Code を再起動してから再接続します。
参考: Visual Studio Code 公式ドキュメント(Remote development over SSH)
“Install an OpenSSH compatible SSH client (PuTTY is not supported)”
(OpenSSH 互換の SSH クライアントをインストールします(PuTTY は非対応))
https://code.visualstudio.com/docs/remote/ssh-tutorial
なお、接続時に bash: powershell: command not found が出る場合は、ターミナルプロファイル起因のエラーです。対処は関連記事『VS Code のターミナルをコマンドプロンプトに変更する手順』を参照してください(※公開後にリンクを有効化)。
Bad owner or permissions(秘密鍵の権限)
公開鍵認証で接続しようとした際、出力ログに次のようなメッセージが出て失敗する場合です。
Load key "C:\Users\...\.ssh\id_ed25519": bad permissions
Permission denied (publickey).これは、秘密鍵ファイルが所有者以外(Administrators や SYSTEM など)からアクセスできる状態を、OpenSSH が危険とみなして使用を拒否しているためです。Windows の既定では権限が広めに設定されていることが多く、このエラーが発生しやすくなっています。対処は、秘密鍵へのアクセス権を自分のユーザーのみに絞ることです。
- 対処 A: GUI で権限を変更する
-
- 秘密鍵ファイル(例:
id_ed25519)を右クリックし、「プロパティ」>「セキュリティ」>「詳細設定」を開きます。 - 「継承の無効化」をクリックし、「継承されたアクセス許可を削除します」を選んで一度空にします。
- 「追加」>「プリンシパルの選択」で自分のユーザーのみを追加し、読み取り権限を許可します。
- アクセス許可リストが「自分のユーザーのみ」の状態になっていることを確認して「OK」を押します。
- 秘密鍵ファイル(例:
- 対処 B: コマンドで権限を変更する(icacls)
-
会社支給 PC など GUI 操作が制限される環境では、
icaclsで同じ設定を行えます。PowerShell またはコマンドプロンプトで次のコマンドを実行すると、継承を解除して自分のユーザーのみにアクセス権を絞れます。icacls "C:\Users\%USERNAME%\.ssh\id_ed25519" /inheritance:r icacls "C:\Users\%USERNAME%\.ssh\id_ed25519" /grant:r "%USERNAME%:R"/inheritance:rは継承されたアクセス許可を削除し、/grant:rは対象ユーザーへ権限を再設定します。秘密鍵は読み取り(R)の権限があれば認証に使えます。設定後に再接続すると、エラーが解消されているか確認できます。
まとめ
VS Code の Remote-SSH 拡張を使うと、SSH 接続・ファイル編集・転送を 1 つの画面に集約できます。config に接続先を登録し、初回はパスワード認証、以降は公開鍵認証へ切り替えると、接続の手間を減らせます。Windows では秘密鍵の権限まわりでエラーが出やすいものの、権限を自分のみに絞ることで対処できます。
- Remote-SSH には OpenSSH 互換クライアントが必要(PuTTY は非対応)
- 接続先は SSH config の Host ブロックに登録
- 共通設定は Host * にまとめて記述
- 公開鍵認証は ed25519 鍵の生成と authorized_keys への追記で設定
- 接続後はファイルの直接編集とドラッグ&ドロップ転送が可能
- Could not establish connection は config パスの明示で切り分け
- Bad owner or permissions は秘密鍵の権限を自分のみに絞って解消
以上、最後までお読みいただきありがとうございました。
