SSHを使ったリモート開発
Visual Studio Code Remote - SSH 拡張機能を使用すると、SSHサーバーが実行されている任意のリモートマシン、仮想マシン、またはコンテナー上のリモートフォルダーを開き、VS Codeの機能セットを最大限に活用できます。サーバーに接続すると、リモートファイルシステム上のどこでもファイルやフォルダーを操作できます。
拡張機能はコマンドや他の拡張機能をリモートマシン上で直接実行するため、これらの利点を得るためにローカルマシンにソースコードがある必要はありません。拡張機能はリモートOSにVS Code Serverをインストールします。このサーバーは、リモートOS上の既存のVS Codeインストールとは独立しています。
これにより、VS Codeは、完全なIntelliSense(補完機能)、コードナビゲーション、デバッグなど、ローカル品質の開発エクスペリエンスを提供します。コードがどこでホストされているかに関わらず、これらを利用できます。
はじめに
注: このトピックを確認した後、入門的なSSHチュートリアルを開始できます。
システム要件
ローカル: サポートされているOpenSSH互換のSSHクライアントもインストールされている必要があります。
リモートSSHホスト: 以下で動作しているSSHサーバー
- x86_64 Debian 8以降、Ubuntu 16.04以降、CentOS / RHEL 7以降。
- ARMv7l (AArch32) Raspberry Pi OS (旧称 Raspbian) Stretch/9以降 (32ビット)。
- ARMv8l (AArch64) Ubuntu 18.04以降 (64ビット)。
- Windows 10 / Server 2016/2019 (1803以降) で公式のOpenSSHサーバーを使用。
- macOS 10.14以降 (Mojave) のSSHホストで、リモートログインが有効になっているもの。
- リモートホストには1 GBのRAMが必要ですが、少なくとも2 GBのRAMと2コアCPUを推奨します。
x86_64、ARMv7l (AArch32)、ARMv8l (AArch64) 用の他のglibc
ベースのLinuxディストリビューションも、必要な前提条件が満たされていれば動作するはずです。前提条件とコミュニティサポートされているディストリビューションを起動して実行するためのヒントについては、Linuxでのリモート開発の記事を参照してください。
ARMv7l (AArch32) とARMv8l (AArch64) のサポートは利用可能ですが、これらのデバイスにインストールされている一部の拡張機能は、拡張機能内でx86ネイティブコードが使用されているため、動作しない場合があります。
インストール
開始するには、以下が必要です。
-
OpenSSH互換のSSHクライアントがまだインストールされていない場合は、それをインストールします。
-
Visual Studio Code または Visual Studio Code Insiders をインストールします。
-
Remote-SSH拡張機能をインストールします。VS Codeで他のリモート拡張機能を使用する予定がある場合は、Remote Development拡張パックのインストールを選択することもできます。
SSHホストのセットアップ
-
SSHホストがセットアップされていない場合は、Linux、Windows 10 / Server (1803以降)、またはmacOS SSHホストの指示に従うか、Azure上にVMを作成してください。
-
オプション: LinuxまたはmacOSのSSHホストが複数のユーザーによって同時にアクセスされる場合、セキュリティを向上させるために、VS Codeのユーザー設定で**Remote.SSH: Remote Server Listen On Socket**を有効にすることを検討してください。
設定エディターで
詳細については、ヒントとコツの記事を参照してください。
-
オプション: パスワードベースの認証はサポートされていますが、ホストには**鍵ベースの認証**を設定することをお勧めします。詳細については、ヒントとコツの記事を参照してください。
リモートホストへの接続
初めてリモートホストに接続するには、次の手順に従います。
-
ターミナルまたはPowerShellウィンドウから、
user@hostname
を適切に置き換えて次のコマンドを実行し、SSHホストに接続できることを確認します。ssh user@hostname # Or for Windows when using a domain / AAD account ssh user@domain@hostname
-
VS Codeで、コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**Remote-SSH: Connect to Host...**を選択し、手順1と同じ
user@hostname
を使用します。 -
VS Codeが接続しようとしているサーバーの種類を自動的に検出できない場合、手動で種類を選択するよう求められます。
プラットフォームを選択すると、
remote.SSH.remotePlatform
プロパティの下にVS Code設定として保存され、いつでも変更できます。 -
しばらくすると、VS CodeはSSHサーバーに接続して自身をセットアップします。VS Codeは進行状況の通知を使用して最新情報を提供し、
Remote - SSH
出力チャンネルで詳細なログを確認できます。ヒント: 接続がハングしたり失敗したりしますか?一般的な問題を解決するための情報については、トラブルシューティングのヒントを参照してください。
SSHファイル権限に関するエラーが表示される場合は、SSHファイル権限エラーの修正のセクションを参照してください。
-
接続後、空のウィンドウが表示されます。どのホストに接続されているかは、常にステータスバーで確認できます。
ステータスバーの項目をクリックすると、接続中に利用可能なリモートコマンドのリストが表示されます。
-
その後、ローカルで行うのと同じように、**ファイル > 開く...** または **ファイル > ワークスペースを開く...** を使用して、リモートマシン上の任意のフォルダーまたはワークスペースを開くことができます。
ここから、ホストに接続したときに使用したい拡張機能をインストールして、編集を開始してください。
注: ARMv7l / ARMv8l
glibc
SSHホストでは、拡張機能内のx86コンパイル済みネイティブコードが原因で一部の拡張機能が動作しない場合があります。
リモートSSHホスト上のフォルダーをコンテナーで開く
LinuxまたはmacOSのSSHホストを使用している場合、Remote - SSHとDev Containers拡張機能を組み合わせて使用することで、リモートホスト上のフォルダーをコンテナー内で開くことができます。ローカルにDockerクライアントをインストールする必要さえありません。
そうするには
- リモートホストへのDockerのインストール、およびVS CodeとDev Containers拡張機能のローカルへのインストールについては、インストール手順に従ってください。
- オプション: パスワードを何度も入力する必要がないように、サーバーへのSSHキーベース認証を設定します。
- Remote - SSH拡張機能のクイックスタートに従って、ホストに接続し、そこにあるフォルダーを開きます。
- コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**Dev Containers: Reopen in Container**コマンドを使用します。
Dev Containersのクイックスタートの残りの部分はそのまま適用されます。Dev Containers拡張機能の詳細については、そのドキュメントを参照してください。このモデルがニーズに合わない場合は、リモートDockerホストでの開発の記事で他のオプションを確認することもできます。
リモートホストからの切断
リモートホストでのファイルの編集が終了したら、接続を閉じるには、**ファイル > リモート接続を閉じる**を選択してホストから切断します。このコマンドにはデフォルトでキーボードショートカットは含まれていません。VS Codeを終了するだけでもリモート接続を閉じることができます。
ホストと詳細設定の記憶
頻繁に使用するホストのセットがある場合や、追加オプションを使用してホストに接続する必要がある場合は、SSH設定ファイルの形式に従うローカルファイルに追加できます。
セットアップを簡単にするために、拡張機能は手動でこのファイルを編集することなく、ホストを追加する手順をガイドできます。
まず、コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**Remote-SSH: Add New SSH Host...**を選択するか、アクティビティバーのSSH**リモートエクスプローラー**にある**新規追加**アイコンをクリックします。
その後、SSH接続情報の入力を求められます。ホスト名を入力することもできます。
または、コマンドラインからホストに接続するために使用する完全なssh
コマンドを入力します。
最後に、使用する設定ファイルを選択するよう求められます。リストされているものとは異なる設定ファイルを使用したい場合は、User settings.json
ファイルで"remote.SSH.configFile"
プロパティを設定することもできます。残りの処理は拡張機能が行います。
例えば、入力ボックスにssh -i ~/.ssh/id_rsa-remote-ssh yourname@remotehost.yourcompany.com
と入力すると、このエントリが生成されます。
Host remotehost.yourcompany.com
User yourname
HostName another-host-fqdn-or-ip-goes-here
IdentityFile ~/.ssh/id_rsa-remote-ssh
ここに示されているキーの生成に関する詳細については、ヒントとコツを参照してください。このファイルは、SSH設定ファイルの形式がサポートするあらゆる内容で手動で編集できるため、これは単なる一例です。
今後、コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**Remote-SSH: Connect to Host...**を選択したとき、または**リモートエクスプローラー**の**SSHターゲット**セクションに、このホストが表示されるようになります。
**リモートエクスプローラー**を使用すると、リモートホスト上に新しい空のウィンドウを開くか、以前開いたフォルダーを直接開くことができます。ホストを展開し、ホスト上で開きたいフォルダーの横にある**フォルダーを開く**アイコンをクリックします。
拡張機能の管理
VS Codeは拡張機能を2つの場所のいずれかで実行します。UI/クライアント側でローカルに実行するか、SSHホスト上でリモートに実行するかです。テーマやスニペットのようにVS CodeのUIに影響を与える拡張機能はローカルにインストールされますが、ほとんどの拡張機能はSSHホスト上に存在します。これにより、スムーズなエクスペリエンスが保証され、ローカルマシンからSSHホスト上の特定のワークスペースに必要な拡張機能をインストールできます。このようにして、別のマシンからでも、拡張機能を含め、中断したところから正確に作業を再開できます。
拡張機能ビューから拡張機能をインストールすると、自動的に適切な場所にインストールされます。インストールされると、カテゴリのグループ分けに基づいて拡張機能がどこにインストールされているかを判別できます。
リモートSSHホスト用のカテゴリがあります。
そして**ローカル - インストール済み**カテゴリもあります。
注: 拡張機能の作成者の方で、ご自身の拡張機能が正しく動作しない、または間違った場所にインストールされることに気づいた場合は、詳細についてリモート開発のサポートを参照してください。
実際にリモートで実行する必要があるローカル拡張機能は、**ローカル - インストール済み**カテゴリで薄く表示され、無効になります。リモートホストに拡張機能をインストールするには、**インストール**を選択します。
また、拡張機能ビューに移動し、**ローカル - インストール済み**のタイトルバーの右にあるクラウドボタンを使用して**SSHにローカル拡張機能をインストール: {ホスト名}**を選択することで、ローカルにインストールされているすべての拡張機能をSSHホストにインストールできます。これにより、SSHホストにインストールするローカル拡張機能を選択できるドロップダウンが表示されます。
「常にインストールされる」拡張機能
どのSSHホストでも常にインストールしておきたい拡張機能がある場合は、settings.json
ファイルのremote.SSH.defaultExtensions
プロパティを使用してそれらを指定できます。例えば、GitLensとResource Monitor拡張機能をインストールしたい場合、その拡張機能IDを次のように指定します。
"remote.SSH.defaultExtensions": [
"eamodio.gitlens",
"mutantdino.resourcemonitor"
]
詳細: 拡張機能をローカル/リモートで強制的に実行する
拡張機能は通常、ローカルまたはリモートのどちらかで実行されるように設計およびテストされており、両方ではありません。ただし、拡張機能がそれをサポートしている場合、settings.json
ファイルで特定の場所で強制的に実行できます。
例えば、以下の設定は、Container Tools拡張機能をローカルで強制的に実行し、Remote - SSH: Editing Configuration Files拡張機能をデフォルトではなくリモートで実行するように強制します。
"remote.extensionKind": {
"ms-azuretools.vscode-containers": [ "ui" ],
"ms-vscode-remote.remote-ssh-edit": [ "workspace" ]
}
"workspace"
の代わりに"ui"
という値を使用すると、拡張機能はローカルのUI/クライアント側で強制的に実行されます。これは通常、テスト目的でのみ使用すべきであり、拡張機能のドキュメントに別途記載がない限り、**拡張機能を破損する可能性**があるため注意が必要です。詳細については、リモート開発のサポートに関する記事を参照してください。
ポート転送 / SSHトンネルの作成
開発中に、公開されていないリモートマシン上のポートにアクセスする必要がある場合があります。これには、目的のリモートポートをローカルマシンに「転送」するSSHトンネルを使用する方法が2つあります。
一時的なポート転送
ホストに接続した後、セッション中**一時的に**新しいポートを転送したい場合は、コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**ポートの転送**を選択するか、**ポートビュー**の**ポートの追加**ボタンを選択します。ポートビューは下部のパネルで確認できるほか、コマンド**Ports: Focus on Ports View**を実行しても表示されます。
転送したいポートの入力を求められ、それに名前を付けることができます。
リモートポートにアクセスするために使用すべきlocalhostのポートが通知されます。例えば、ポート3000でリッスンしているHTTPサーバーを転送した場合、3000が既に使用中であったため、localhostのポート4123にマッピングされたと通知される場合があります。その後、https://:4123
を使用してこのリモートHTTPサーバーに接続できます。
同じ情報は、後でアクセスする必要がある場合、リモートエクスプローラーの**転送されたポート**セクションで利用できます。
転送したポートをVS Codeに記憶させたい場合は、設定エディター (⌘, (Windows, Linux Ctrl+,)) で**Remote: Restore Forwarded Ports**をチェックするか、settings.json
で"remote.restoreForwardedPorts": true
を設定します。
トンネル上のローカルポートの変更
トンネルのローカルポートをリモートサーバーのポートと異なるものにしたい場合は、**転送されたポート**パネルから変更できます。
変更したいトンネルを右クリックし、コンテキストメニューで**ローカルアドレスポートの変更**を選択します。
常にポートを転送する
**常に転送したい**ポートがある場合、ホストと詳細設定を記憶するために使用するのと同じSSH設定ファイルでLocalForward
ディレクティブを使用できます。
例えば、ポート3000と27017を転送したい場合、ファイルを次のように更新できます。
Host remote-linux-machine
User myuser
HostName remote-linux-machine.mydomain
LocalForward 127.0.0.1:3000 127.0.0.1:3000
LocalForward 127.0.0.1:27017 127.0.0.1:27017
リモートホスト上でターミナルを開く
VS Codeからリモートホスト上にターミナルを開くのは簡単です。接続すると、VS Codeで開く**任意のターミナルウィンドウ**(**ターミナル > 新しいターミナル**)は、ローカルではなくリモートホスト上で自動的に実行されます。
この同じターミナルウィンドウからcode
コマンドラインを使用して、リモートホスト上の新しいファイルやフォルダーを開くなど、さまざまな操作を実行することもできます。コマンドラインから利用可能なすべてのオプションを確認するには、code --help
と入力してください。
SSHホストでのデバッグ
リモートホストに接続すると、アプリケーションをローカルで実行する場合と同じようにVS Codeのデバッガーを使用できます。例えば、launch.json
で起動構成を選択し、デバッグを開始する(F5)と、アプリケーションはリモートホスト上で起動し、デバッガーがそれにアタッチされます。
.vscode/launch.json
でのVS Codeのデバッグ機能の設定に関する詳細については、デバッグのドキュメントを参照してください。
SSHホスト固有の設定
SSHホストに接続すると、VS Codeのローカルのユーザー設定も再利用されます。これによりユーザーエクスペリエンスの一貫性が保たれますが、ローカルマシンと各ホスト間で一部の設定を変えたい場合があります。幸いなことに、ホストに接続した後、コマンドパレット (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) から**基本設定: リモート設定を開く**コマンドを実行するか、設定エディターの**リモート**タブを選択することで、ホスト固有の設定も行うことができます。これらの設定は、ホストに接続するたびに既存のユーザー設定を上書きします。また、ワークスペース設定はリモート設定とユーザー設定を上書きします。
ローカルツールでの作業
Remote - SSH拡張機能は、ソースコードの同期や、リモートホスト上のコンテンツとローカルツールを使用するための直接的なサポートを提供しません。しかし、ほとんどのLinuxホストで機能する一般的なツールを使用してこれを行うには2つの方法があります。具体的には、次のことができます。
SSHFSは最も便利なオプションであり、ファイルの同期を必要としません。ただし、VS Code経由で作業するよりもパフォーマンスが著しく低下するため、単一ファイルの編集やコンテンツのアップロード/ダウンロードに最適です。多数のファイルを一度にまとめて読み書きするアプリケーション(ローカルのソース管理ツールなど)を使用する必要がある場合は、rsyncがより良い選択肢です。
既知の制限事項
Remote - SSHの制限事項
- 鍵ベースの認証が推奨されます。代替認証方法で入力されたパスワードやその他のトークンは保存されません。
- Alpine LinuxおよびglibcベースではないLinux SSHホストはサポートされていません。
- 古い(コミュニティサポートの)Linuxディストリビューションでは、必要な前提条件をインストールするために回避策が必要です。
- WindowsではPuTTYはサポートされていません。
- SSHを使用してGitリポジトリをクローンし、SSHキーにパスフレーズがある場合、VS Codeのプルおよび同期機能がリモートで実行されているときにハングする可能性があります。この問題を回避するには、パスフレーズのないSSHキーを使用するか、HTTPSを使用してクローンするか、コマンドラインから
git push
を実行してください。 - ローカルプロキシ設定はリモートホストで再利用されないため、適切なプロキシ情報がリモートホストに構成されていない限り(例えば、適切なプロキシ情報を含むグローバルな
HTTP_PROXY
またはHTTPS_PROXY
環境変数など)、拡張機能が機能しない可能性があります。 - SSHに関連する現在アクティブな問題のリストはこちらを参照してください。
Container Tools拡張機能の制限事項
WSL、Remote - Tunnels、またはRemote - SSHウィンドウからContainer ToolsまたはKubernetes拡張機能を使用している場合、Container ExplorerまたはKubernetesビューで**Visual Studio Codeをアタッチ**コンテキストメニューアクションを使用すると、利用可能なコンテナーから2回目を選択するよう求められます。
拡張機能の制限事項
多くの拡張機能は、変更なしでリモートSSHホストで動作します。ただし、場合によっては、特定の機能に変更が必要な場合があります。拡張機能の問題に遭遇した場合、問題を報告する際に拡張機能の作者に伝えることができる一般的な問題と解決策の要約があります。
さらに、ARMv7l (AArch32) / ARMv8l (AArch64) デバイスにインストールされている一部の拡張機能は、拡張機能内のネイティブモジュールやランタイムがx86_64のみをサポートしているため、動作しない場合があります。これらの場合、拡張機能はARMv7l / ARMv8l用のバイナリをコンパイル/含めることで、これらのプラットフォームのサポートをオプトインする必要があります。
よくある質問
...でSSHクライアントをセットアップするにはどうすればよいですか?
詳細については、サポートされているSSHクライアントのインストールを参照してください。
...でSSHサーバーをセットアップするにはどうすればよいですか?
ホスト用のSSHサーバーのセットアップに関する詳細については、サポートされているSSHサーバーのインストールを参照してください。
パスワードのような別の/追加の認証メカニズムでSSHサーバーにサインインできますか?
はい、トークンまたはパスワードの入力を自動的に求められるはずです。ただし、パスワードは保存されないため、鍵ベースの認証を使用する方が通常は便利です。
「不正な権限」に関するSSHエラーを修正するにはどうすればよいですか?
これらの種類のエラーを解決するための詳細については、SSHファイル権限エラーの修正を参照してください。
リモートSSHホストにはどのようなLinuxパッケージ/ライブラリをインストールする必要がありますか?
ほとんどのLinuxディストリビューションでは、追加の依存関係のインストール手順は必要ありません。SSHの場合、LinuxホストにはBash(/bin/bash
)、tar
、およびcurl
またはwget
のいずれかがインストールされている必要があります。これらのユーティリティは、特定の軽量化されたディストリビューションでは不足している可能性があります。リモート開発では、カーネル >= 3.10、glibc >= 2.17、libstdc++ >= 3.4.18も必要です。現在サポートされているのはglibcベースのディストリビューションのみであるため、Alpine Linuxはサポートされていません。
詳細については、Linuxの前提条件を参照してください。
VS Code Serverがリモートマシン/VMで実行されている場合の接続要件は何ですか?
VS Code Serverのインストールには、ローカルマシンから以下の宛先への送信HTTPS(ポート443)接続が必要です。
update.code.visualstudio.com
vscode.download.prss.microsoft.com
デフォルトでは、Remote - SSHはリモートホストでダウンロードを試み、接続が確立されると、VS Code Serverをローカルでダウンロードしてリモートに転送するフォールバックを行います。この動作は、remote.SSH.localServerDownload設定で、常にローカルでダウンロードしてから転送するか、またはローカルでダウンロードしないように変更できます。
インターネット接続なしで拡張機能を手動でインストールするには、**拡張機能: VSIX からインストール...**コマンドを使用できますが、拡張機能パネルを使用して拡張機能をインストールする場合、ローカルマシンとVS Code Serverは、以下の宛先への送信HTTPS(ポート443)アクセスが必要です。
marketplace.visualstudio.com
*.gallerycdn.vsassets.io
(Azure CDN)
最後に、一部の拡張機能(C#など)は、download.microsoft.com
またはdownload.visualstudio.microsoft.com
から二次的な依存関係をダウンロードします。その他の拡張機能(Visual Studio Live Shareなど)には、追加の接続要件がある場合があります。問題が発生した場合は、詳細について拡張機能のドキュメントを参照してください。
サーバーとVS Codeクライアント間のその他すべての通信は、認証された安全なSSHトンネルを介して行われます。
リモートSSHホスト上にあるソースコードにローカルツールを使用できますか?
はい。通常、これはSSHFSを使用するか、rsync
を使用することで、ファイルをローカルマシンにコピーして行います。SSHFSはリモートファイルシステムをマウントするもので、個々のファイルを編集したりソースツリーを閲覧したりする必要があるシナリオに最適であり、同期手順は不要です。ただし、ファイルを一括管理するソース管理ツールのようなものを使用する場合には理想的ではありません。この場合、rsync
アプローチの方が優れています。リモートソースコードの完全なコピーをローカルマシンに取得できるためです。詳細については、ヒントとコツを参照してください。
リモートホストへのSFTP/FTPファイルシステムアクセスのみで(シェルアクセスなしで)VS Codeを使用できますか?
一部のクラウドプラットフォームでは、開発者に対して直接のシェルアクセスではなく、リモートファイルシステムアクセスのみを提供しています。VS Codeのリモート開発は、パフォーマンスとユーザーエクスペリエンスの利点が損なわれるため、このユースケースを念頭に置いて設計されていません。
しかし、このユースケースは通常、SFTPのような拡張機能と、Node.js、Python、C#などのリモートデバッグ機能を組み合わせることで対応できます。
拡張機能の作成者として、何をすべきですか?
VS Codeの拡張機能APIはローカル/リモートの詳細を抽象化しているため、ほとんどの拡張機能は変更なしで動作します。ただし、拡張機能は任意のNodeモジュールやランタイムを使用できるため、調整が必要な状況もあります。更新が必要ないことを確認するために、拡張機能をテストすることをお勧めします。詳細については、リモート開発のサポートを参照してください。
質問またはフィードバック
- 詳細については、ヒントとコツまたはFAQを参照してください。
- Stack Overflowで検索します。
- 機能リクエストを追加するか、問題を報告します。
- 弊社のドキュメントまたはVS Code自体に貢献します。
- 詳細については、CONTRIBUTINGガイドを参照してください。