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 を使用する任意のディストリビューションでも同じ手順を使用できます。

  1. Linux システム上で、OpenSSH サーバーをインストールして起動します。

    sudo apt install openssh-server
    sudo service ssh start
    
  2. システム起動時に自動的に ssh サーバーを起動したい場合、systemctl を使用して有効にします。

    sudo systemctl enable ssh
    

リモート接続を設定する

  1. Visual Studio のメニュー バーで [ツール] > [オプション] を選択して、[オプション] ダイアログを開きます。 その後、[クロス プラットフォーム] > [接続マネージャー] を選択し、[接続マネージャー] ダイアログを開きます。

    まだ Visual Studio で接続を設定したことがない場合、プロジェクトを初めてビルドする際に、Visual Studio によって [接続マネージャー] ダイアログが開かれます。

  2. [接続マネージャー] ダイアログで、 [追加] ボタンを選択して新しい接続を追加します。

    Visual Studio の [オプション] ペインのスクリーンショット。

    [オプション] ペインで、[クロス プラットフォーム] > [C++] > [接続マネージャー] の順に選択すると、[追加] ボタンが強調表示されます。

    既存の接続を編集するには、[編集] を選択します。 いずれの場合も、 [リモート システムへの接続] ウィンドウが表示されます。

    Visual Studio の [リモート システムへの接続] ウィンドウのスクリーンショット。

    [リモート システムへの接続] ウィンドウには、ホスト名、ポート、ユーザー名、認証の種類、パスワードのフィールドがあります。 [ポート] を 22 に設定します。 [認証の種類] を [パスワード] に設定します。

  3. 次の情報を入力してください。

    入力 説明
    ホスト名 ターゲット デバイスの名前または IP アドレス
    ポート SSH サービスが実行されているポート (通常は 22)
    ユーザー名 認証するユーザー
    認証の種類 パスワードと秘密キーの両方がサポートされます
    パスワード 入力したユーザー名のパスワード
    秘密キー ファイル ssh 接続用に作成された秘密キー ファイル
    パスフレーズ 上で選択した秘密キーで使用されるパスフレーズ

    すべての必須フィールドの入力を完了し、ポートが 1 から 65535 までの整数に設定されるまで、[接続] ボタンをクリックすることはできません。

    認証には、パスワードまたはキー ファイルとパスフレーズを使用することができます。 多くの開発シナリオではパスワード認証で十分ですが、キー ファイルはさらに安全です。 既にキーの組があるなら、それを再利用できます。

    17.10 より前のバージョンの Visual Studio では、リモート接続に EC、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 で変換する必要があります。

  4. [接続] ボタンを選択すると、リモート コンピューターへの接続が試行されます。

    接続が成功すると、Visual Studio ではリモートのヘッダーを使うように IntelliSense が構成されます。 詳しくは、「リモート システムのヘッダーでの IntelliSense」をご覧ください。

    接続が失敗した場合、エラー情報を含む情報バーが表示され、変更が必要な可能性のあるフィールドは赤色の枠で囲まれます。

    Visual Studio の [リモート システムへの接続] ウィンドウのスクリーンショット。[ホスト名] および [ポート] フィールドが赤色の枠で囲まれており、エントリが正しくないことを示しています。

    キー ファイルを認証に使う場合は、ターゲット マシンの 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 からシェルへのすべての出力が含まれます。 ログ記録は、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 のリモート ヘッダーのダウンロードが開始されると、次のエラーが表示されます。

SSH チャネルを開くことができなかったことを示す Visual Studio のエラー メッセージのスクリーンショット。ログ ファイルへのパスが提示されています。

rsync は、ソース ファイルをリモート システムにコピーするために、Visual Studio の CMake サポートでも使用されます。 TCP ポート フォワーディングを有効にできない場合は、リモート コピー ソース メソッドとして sftp を使用できます。 sftprsync よりも低速なことが多いですが、TCP ポート フォワーディングとの依存関係がありません。 CMake 設定エディターで、remoteCopySourcesMethod プロパティを使用すれば、リモート コピー ソース メソッドを管理できます。 リモート システムで TCP ポート フォワーディングが無効になっている場合、最初に rsync が呼び出されたときに CMake 出力ウィンドウにエラーが表示されます。

Rsync エラー メッセージが表示されている Visual Studio 出力ウィンドウのスクリーンショット。

出力ウィンドウには、メッセージ "サーバー上で TCP 転送が有効になっていることを確認してください"、"rsync: サーバー接続時のメッセージが表示されませんでした"、"rsync エラー: main.c(1675) [sender=3.1. 3] でクライアント サーバー プロトコル (コード 5) を開始中のエラー"、"SSH チャネルを開くことができませんでした" が表示されています。

gdbserver は、埋め込みデバイスでのデバッグに使用できます。 TCP ポート フォワーディングを有効にできない場合は、すべてのリモート デバッグ シナリオで gdb を使用する必要があります。 リモート システム上のプロジェクトをデバッグする場合、既定で gdb が使用されます。

Visual Studio の Linux サポートは、TCP ポート フォワーディングに依存しています。 リモート システム上で TCP ポート フォワーディングが無効になっている場合、rsyncgdbserver の両方が影響を受けます。 お客様がこの依存関係の影響を受けている場合は、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 または clanggdbmakeninja-build (Visual Studio 2019 バージョン 16.6 以降を使用する CMake プロジェクトにのみ必要)、rsync、および zipapt を使用するディストリビューションにそれらをインストールするには、次のコマンドを使用します。これにより、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 デバッグ セッションを構成する