Visual Studio でターゲットの Linux システムに接続する
Linux サポートは Visual Studio 2017 以降で使用できます。
Linux プロジェクトのターゲットは、リモート マシンとなるように構成することも、Windows Subsystem for Linux (WSL) とすることもできます。 両方のリモート マシンと WSL に対して、Visual Studio 2017 でリモート接続を設定する必要があります。
Linux プロジェクトのターゲットは、リモート マシンとなるように構成することも、Windows Subsystem for Linux (WSL) とすることもできます。 リモート マシンの場合は、Visual Studio でリモート接続を設定する必要があります。 WSL に接続するには、WSL への接続に関するセクションに進んでください。
リモート接続を使用する場合、Visual Studio はリモート マシンで C++ Linux プロジェクトをビルドします。 物理マシン、クラウド内の仮想マシン、WSL のいずれであるかは関係ありません。 プロジェクトをビルドするために、Visual Studio はソース コードをリモートの Linux コンピューターにコピーします。 その後、コードは Visual Studio の設定に基づいてコンパイルされます。
注意
Visual Studio 2019 バージョン 16.5 以降でも、Visual Studio では、リモート開発のために、Linux システムへの安全な Federal Information Processing Standard (FIPS) 140-2 準拠の暗号化接続がサポートされています。 FISP 準拠の接続を使用するには、代わりに「FIPS 準拠の安全なリモート Linux 開発のセットアップ」のステップに従ってください。
リモート システム上で SSH サーバーを設定する
Linux システム上でまだ ssh
が設定および実行されていない場合、次のステップに従ってインストールします。 この記事の例では、Ubuntu 18.04 LTS と OpenSSH サーバー バージョン 7.6 を使用します。 ただし、比較的最近のバージョンの OpenSSH を使用する任意のディストリビューションでも同じ手順を使用できます。
Linux システム上で、OpenSSH サーバーをインストールして起動します。
sudo apt install openssh-server sudo service ssh start
システム起動時に自動的に ssh サーバーを起動したい場合、systemctl を使用して有効にします。
sudo systemctl enable ssh
リモート接続を設定する
Visual Studio のメニュー バーで [ツール] > [オプション] を選択して、[オプション] ダイアログを開きます。 その後、[クロス プラットフォーム] > [接続マネージャー] を選択し、[接続マネージャー] ダイアログを開きます。
まだ Visual Studio で接続を設定したことがない場合、プロジェクトを初めてビルドする際に、Visual Studio によって [接続マネージャー] ダイアログが開かれます。
[接続マネージャー] ダイアログで、 [追加] ボタンを選択して新しい接続を追加します。
[オプション] ペインで、[クロス プラットフォーム] > [C++] > [接続マネージャー] の順に選択すると、[追加] ボタンが強調表示されます。
既存の接続を編集するには、[編集] を選択します。 いずれの場合も、 [リモート システムへの接続] ウィンドウが表示されます。
[リモート システムへの接続] ウィンドウには、ホスト名、ポート、ユーザー名、認証の種類、パスワードのフィールドがあります。 [ポート] を 22 に設定します。 [認証の種類] を [パスワード] に設定します。
次の情報を入力してください。
入力 説明 ホスト名 ターゲット デバイスの名前または IP アドレス ポート SSH サービスが実行されているポート (通常は 22) ユーザー名 認証するユーザー 認証の種類 パスワードと秘密キーの両方がサポートされます パスワード 入力したユーザー名のパスワード 秘密キー ファイル ssh 接続用に作成された秘密キー ファイル パスフレーズ 上で選択した秘密キーで使用されるパスフレーズ すべての必須フィールドの入力を完了し、ポートが 1 から 65535 までの整数に設定されるまで、[接続] ボタンをクリックすることはできません。
認証には、パスワードまたはキー ファイルとパスフレーズを使用することができます。 キー ファイルは、ユーザー名/パスワードよりも安全です。 既にキーの組があるなら、それを再利用できます。
17.10 より前のバージョンの Visual Studio では、リモート接続用の楕円曲線 (EC)、Rivert-Shamir-Adleman (RSA)、デジタル署名アルゴリズム (DSA) キーがサポートされています。 セキュリティ上の問題のために、VS 17.10 以降では、RSA キーと DSA キーはサポートされなくなりました。 現在サポートされているのは、EC キーのみです。 接続マネージャーと互換性のあるキー ペアを作成するには、
ssh-keygen -m pem -t ecdsa -f <key-name>
コマンドを使用します。Note
ssh-keygen
を使用して秘密キーを作成する場合は、スイッチ-m pem
を指定する必要があります。そうしないと、Visual Studio でキーが受け入れられません。 秘密鍵が-----BEGIN OPENSSH PRIVATE KEY-----
で始まる場合は、それをssh-keygen -p -f <FILE> -m pem
で変換する必要があります。[接続] ボタンを選択すると、リモート コンピューターへの接続が試行されます。
接続が成功すると、Visual Studio ではリモートのヘッダーを使うように IntelliSense が構成されます。 詳しくは、「リモート システムのヘッダーでの IntelliSense」をご覧ください。
接続が失敗した場合、エラー情報を含む情報バーが表示され、変更が必要な可能性のあるフィールドは赤色の枠で囲まれます。
キー ファイルを認証に使う場合は、ターゲット マシンの SSH サーバーが実行され、正しく構成されていることを確認します。
localhost
での WSL への接続に問題がある場合は、「WSL のlocalhost
接続の問題を修正する」を参照してください。
ホスト キーの検証
Visual Studio バージョン 16.10 以降では、Visual Studio からリモート システムに初めて接続するときは常に、サーバーのホスト キーのフィンガープリントを確認するように求められます。 以前に OpenSSH のコマンドライン クライアントまたは PuTTY を使用している方は、このプロセスを熟知していることでしょう。 フィンガー プリントによってサーバーが識別されます。 Visual Studio では、フィンガー プリントを使用して、目的の信頼されたサーバーに確実に接続します。
Visual Studio で初めて新しいリモート接続が確立されるとき、サーバーから提示されたホスト キーのフィンガープリントを受け入れるか拒否するかを尋ねられます。 また、キャッシュされたフィンガープリントに変更が加えられた場合もそうです。 必要に応じてフィンガープリントを確認することもできます。それには、接続マネージャーで接続を選択し、 [確認] を選択します。
Visual Studio を以前のバージョンから 16.10 以降にアップグレードすると、既存のリモート接続はいずれも新しい接続として扱われます。 最初に、ホスト キーのフィンガープリントの受け入れを求めるメッセージが表示されます。 次に、Visual Studio によって接続が確立され、受け入れたフィンガープリントがキャッシュされます。
また、ConnectionManager.exe
から update
引数を使用してリモート接続を更新することもできます。
サポートされている SSH アルゴリズム
Visual Studio バージョン 16.9 以降では、データの暗号化とキーの交換に使用される、セキュリティで保護されていない古い SSH アルゴリズムのサポートは削除されています。 サポートされているのは以下のアルゴリズムのみです。 これらは、クライアントとサーバー間、およびサーバーとクライアント間の両方の SSH 通信でサポートされています。
アルゴリズムの種類 | サポートされているアルゴリズム |
---|---|
暗号化 | aes128-cbc aes128-ctr aes192-cbc aes192-ctr aes256-cbc aes256-ctr |
HMAC | hmac-sha2-256 hmac-sha2-512 |
キーの交換 | diffie-hellman-group14-sha256 diffie-hellman-group16-sha512 diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 |
ホスト キー | ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521 |
SSH サーバーを構成する
最初に、背景を少々説明します。 あなたは、Visual Studio から使用する SSH アルゴリズムを選択することができません。 代わりに、SSH サーバーとの最初のハンドシェイク中にアルゴリズムが決定されます。 クライアントとサーバーのそれぞれで、サポートするアルゴリズムの一覧が提供され、その両方に共通する最初のアルゴリズムが選択されます。 暗号化、HMAC、キー交換などのために、Visual Studio とサーバーの間に共通するアルゴリズムが少なくとも 1 つあれば、接続は成功します。
OpenSSH 構成ファイル ( sshd_config
) には、既定では使用するアルゴリズムが構成されていません。 アルゴリズムが指定されていない場合、SSH サーバーはセキュリティで保護された既定値を使用します。 これらの既定値は、SSH サーバーのバージョンとベンダーによって異なります。 Visual Studio でそれらの既定値がサポートされていない場合、次のようなエラーが表示されることがあります: "リモート システムに接続できませんでした。 クライアントからサーバーへの共通の HMAC アルゴリズムが見つかりませんでした。" このエラーは、SSH サーバーが Visual Studio がサポートしていないアルゴリズムを使用するように構成されている場合に表示されます。
最新の Linux ディストリビューション上の既定の SSH サーバーは、Visual Studio でご利用になれます。 ただし、お客様が使用している SSH サーバーが以前のものであり、セキュリティで保護されていない従来のアルゴリズムを使用するように構成されていることもあります。 次の例で、より安全なバージョンに更新する方法を示します。
次の例では、SSH サーバーはセキュリティで保護されていない hmac-sha1
アルゴリズムを使用しています。これは、Visual Studio 16.9 ではサポートされていません。 SSH サーバーで OpenSSH を使用している場合は、次に示すように /etc/ssh/sshd_config
ファイルを編集して、より安全なアルゴリズムを有効にすることができます。 その他の SSH サーバーの構成方法については、サーバーのドキュメントを参照してください。
まず、サーバーが使用するアルゴリズムのセットに、Visual Studio でサポートされているアルゴリズムが含まれていることを確認します。 リモート マシンで次のコマンドを実行すると、サーバーでサポートされているアルゴリズムが一覧表示されます。
ssh -Q cipher; ssh -Q mac; ssh -Q kex; ssh -Q key
このコマンドを実行すると、次のような出力が生成されます。
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
...
ecdsa-sha2-nistp521-cert-v01@openssh.com
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com
この出力には、ご利用の SSH サーバーでサポートされている、暗号化、HMAC、キー交換、ホスト キー アルゴリズムがすべて一覧表示されます。 この一覧に、Visual Studio でサポートされているアルゴリズムが含まれていない場合は、先に進む前に SSH サーバーをアップグレードします。
リモート マシンで /etc/ssh/sshd_config
を編集すると、Visual Studio でサポートされているアルゴリズムを有効にすることができます。 次の例は、さまざまな種類のアルゴリズムをその構成ファイルに追加する方法を示しています。
これらの例は、/etc/ssh/sshd_config
内の任意の場所に追加できます。 それらを確実に、それらの独自の行に配置します。
ファイルを編集したら、SSH サーバーを再起動 (Ubuntu の sudo service ssh restart
) し、Visual Studio からもう一度接続を試みます。
暗号の例
追加: Ciphers <algorithms to enable>
例: Ciphers aes128-cbc,aes256-cbc
HMAC の例
追加: MACs <algorithms to enable>
例: MACs hmac-sha2-256,hmac-sha2-512
キー交換の例
追加: KexAlgorithms <algorithms to enable>
例: KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384
ホスト キーの例
追加: HostKeyAlgorithms <algorithms to enable>
例: HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384
リモート接続のログを記録する
ログを有効にして、接続の問題のトラブルシューティングに役立てることができます。 メニュー バーで、[ツール] > [オプション] の順に選択します。 [オプション] ダイアログで、[クロス プラットフォーム] > [ログ] を選択します。
[オプション] を開いて、[クロス プラットフォーム] > [接続マネージャー] > [ログ] の順に選択しています。 [ログ記録の有効化] をオンにし、[ファイルへのログ記録] をオンにし、[ログ ファイル ディレクトリ] をドキュメント フォルダーに設定し、[出力ウィンドウの [クロス プラットフォーム ログ] ペインにログする] をオンにしています。
ログには、接続、リモート マシンに送信されたすべてのコマンド (そのテキスト、終了コード、実行時間)、および Visual Studio からシェルへのすべての出力が含まれます。 ログ記録は、Visual Studio でのすべてのクロスプラットフォーム CMake プロジェクトまたは MSBuild ベースの Linux プロジェクトで機能します。
ファイルまたは出力ウィンドウの [クロス プラットフォームのログ] ペインに送られるように、出力を構成できます。 MSBuild ベースの Linux プロジェクトの場合、リモート マシンに送信された MSBuild コマンドは、プロセス外で出力されるため、[出力ウィンドウ] にはルーティングされません。 代わりに、"msbuild_" というプレフィックスが付いたファイルに記録されます。
接続マネージャーのコマンドライン ユーティリティ
Visual Studio 2019 バージョン 16.5 以降: ConnectionManager.exe
は、Visual Studio 外でのリモート開発の接続を管理するためのコマンドライン ユーティリティです。 これは、新しい開発マシンをプロビジョニングするなどのタスクに役立ちます。 または、これを利用して Visual Studio で継続的インテグレーションを設定することもできます。 ConnectionManager コマンドの例とすべてのリファレンスについては、「ConnectionManager リファレンス」を参照してください。
TCP ポート フォワーディング
rsync
は、MSBuild ベースの Linux プロジェクトと CMake プロジェクトの両方で使用され、IntelliSense で使用するヘッダーをリモート システムから Windows にコピーします。 TCP ポート フォワーディングを有効にできない場合は、リモート ヘッダーの自動ダウンロードを無効にします。 無効にするには、[ツール] > [オプション] > [クロス プラットフォーム] >[接続マネージャー] > [リモート ヘッダー IntelliSense マネージャー] の順に移動します。 リモート システムで TCP ポート フォワーディングが有効になっていない場合、IntelliSense のリモート ヘッダーのダウンロードが開始されると、次のエラーが表示されます。
rsync
は、ソース ファイルをリモート システムにコピーするために、Visual Studio の CMake サポートでも使用されます。 TCP ポート フォワーディングを有効にできない場合は、リモート コピー ソース メソッドとして sftp
を使用できます。 sftp
は rsync
よりも低速なことが多いですが、TCP ポート フォワーディングとの依存関係がありません。 CMake 設定エディターで、remoteCopySourcesMethod
プロパティを使用すれば、リモート コピー ソース メソッドを管理できます。 リモート システムで TCP ポート フォワーディングが無効になっている場合、最初に rsync
が呼び出されたときに CMake 出力ウィンドウにエラーが表示されます。
出力ウィンドウには、メッセージ "サーバー上で TCP 転送が有効になっていることを確認してください"、"rsync: サーバー接続時のメッセージが表示されませんでした"、"rsync エラー: main.c(1675) [sender=3.1. 3] でクライアント サーバー プロトコル (コード 5) を開始中のエラー"、"SSH チャネルを開くことができませんでした" が表示されています。
gdbserver
は、埋め込みデバイスでのデバッグに使用できます。 TCP ポート フォワーディングを有効にできない場合は、すべてのリモート デバッグ シナリオで gdb
を使用する必要があります。 リモート システム上のプロジェクトをデバッグする場合、既定で gdb
が使用されます。
Visual Studio の Linux サポートは、TCP ポート フォワーディングに依存しています。 リモート システム上で TCP ポート フォワーディングが無効になっている場合、rsync
と gdbserver
の両方が影響を受けます。 お客様がこの依存関係の影響を受けている場合は、Developer Community でこちらの提案チケットに投票してください。
WSL に接続する
Visual Studio 2017 では、リモート Linux マシンに使用するのと同じ手順を使用して WSL に接続できます。 [ホスト名] には localhost
を使用します。
Visual Studio 2019 バージョン 16.1 より、Visual Studio では、C++ を Windows Subsystem for Linux (WSL) とともに使用するためのネイティブ サポートが追加されています。 これは、ローカルの WSL インストールで直接ビルドおよびデバッグできることを意味します。 リモート接続を追加したり、SSH を構成したりする必要がなくなりました。 詳細については、こちらの WSL をインストールする方法の説明をご覧ください。
WSL インストールを Visual Studio で動作するように構成するには、次のツールをインストールする必要があります: gcc
または clang
、gdb
、make
、ninja-build
(Visual Studio 2019 バージョン 16.6 以降を使用する CMake プロジェクトにのみ必要)、rsync
、および zip
。 apt
を使用するディストリビューションにそれらをインストールするには、次のコマンドを使用します。これにより、g++ コンパイラもインストールされます。
sudo apt install g++ gdb make ninja-build rsync zip
WSL の localhost
接続の問題を修正する
localhost
で Linux 用 Windows サブシステム (WSL) に接続すると、ポート 22 で Windows ssh
クライアントとの競合が発生する場合があります。 WSL の /etc/ssh/sshd_config
で、ssh
が要求を待ち受けるポートを 23 に変更します:
Port 23
パスワードを使用して接続する場合は、/etc/ssh/sshd_config
で次のように設定する必要があります。
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
これらの変更を行った後、SSH サーバーを再起動します (Ubuntu の場合 sudo service ssh restart
)。
次に、ポート 23 を使って localhost
への接続を再試行します。
詳細については、「Linux ワークロードのダウンロード、インストール、セットアップ」をご覧ください。
WSL 用の MSBuild プロジェクトを構成するには、「Linux プロジェクトを構成する」を参照してください。 WSL 用の CMake プロジェクトを構成するには、Linux CMake プロジェクトの構成に関する記事を参照してください。 WSL を使用するシンプルなコンソール アプリケーションを作成するための詳細な手順については、入門のブログ記事「C++ with Visual Studio 2019 and the Windows Subsystem for Linux (WSL)」 (C++ と Visual Studio 2019 および Windows Subsystem for Linux (WSL)) をご覧ください。
参照
Linux プロジェクトを構成する
Linux CMake プロジェクトを構成する
Linux プロジェクトの配置、実行、デバッグ
CMake デバッグ セッションを構成する