在 Visual Studio 中连接到你的目标 Linux 系统

Linux 支持在 Visual Studio 2017 及更高版本中提供。

可以将 Linux 项目配置为以远程计算机或适用于 Linux 的 Windows 子系统 (WSL) 为目标。 对于远程计算机和 WSL,需要在 Visual Studio 2017 中设置远程连接。

可以将 Linux 项目配置为以远程计算机或适用于 Linux 的 Windows 子系统 (WSL) 为目标。 对于远程计算机,需要在 Visual Studio 中设置远程连接。 若要连接到 WSL,请直接跳到连接到 WSL 部分。

如果你使用的是远程连接,Visual Studio 会在远程计算机上生成 C++ Linux 项目。 至于是物理计算机、云中的虚拟机,还是 WSL,这并不重要。 为了生成项目,Visual Studio 会将源代码复制到远程 Linux 计算机。 然后,代码会根据 Visual Studio 设置进行编译。

注意

从 Visual Studio 2019 版本 16.5 开始,Visual Studio 支持与 Linux 系统进行符合美国联邦信息处理标准 (FIPS) 140-2 的安全加密连接,以用于远程开发。 若要使用符合 FIPS 的连接,请改为按照设置符合 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 选项窗格的屏幕截图。

    在选项窗格中,选中了“CrossPlatform”>“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>

    注意

    如果使用 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 建立连接并缓存所接受指纹。

你还可使用 update 参数从 ConnectionManager.exe 更新远程连接。

支持的 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 服务器

首先,介绍一些背景信息。 要使用的 SSH 算法无法从 Visual Studio 中进行选择, 而是在与 SSH 服务器的初始握手期间确定的。 每一端(客户端和服务器)都提供了它支持的算法列表,然后选择两端通用的第一个算法。 只要 Visual Studio 和服务器之间至少有一个用于加密、HMAC、密钥交换等的通用算法,连接就会成功。

Open SSH 配置文件 (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 到 shell 的所有输出。 日志记录适用于 Visual Studio 中的任何跨平台 CMake 项目或基于 MSBuild 的 Linux 项目。

可以配置是输出到文件,还是输出到“输出”窗口中的“跨平台日志记录”窗格内。 对于基于 MSBuild 的 Linux 项目,发送到远程计算机的 MSBuild 命令不会路由到“输出窗口”,因为它们在进程外发出。 它们将记录到前缀为“msbuild_”的文件。

用于连接管理器的命令行实用工具

Visual Studio 2019 version 16.5 或更高版本ConnectionManager.exe 是用于在 Visual Studio 之外管理远程开发连接的命令行实用工具。 它对于预配新开发计算机之类的任务非常有用。 你也可以使用它来设置 Visual Studio 进行持续集成。 有关 ConnectionManager 命令的示例和完整参考,请参阅 ConnectionManager 参考

TCP 端口转发

基于 MSBuild 的 Linux 项目和 CMake 项目使用 rsync 命令将标题从远程系统复制到 Windows 以供 IntelliSense 使用。 如果无法启用 TCP 端口转发,请禁用远程标头的自动下载。 要禁用它,请使用“工具”>“选项”>“跨平台”>“连接管理器”>“远程标头 IntelliSense 管理器”。 如果远程系统没有启用 TCP 端口转发,则当开始下载 IntelliSense 的远程标头时就会出现此错误:

显示无法打开 SSH 通道的 Visual Studio 错误消息的屏幕截图。提供了日志文件的路径。

Visual Studio 的 CMake 支持也使用 rsync 将源文件复制到远程系统。 如果无法启用 TCP 端口转发,则可以将 sftp 用作远程复制源方法。 sftp 通常会比 rsync 慢,但在 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 会受到影响。 如果你受此依赖项的影响,则可以在开发者社区上对此建议票证投赞成票。

连接到 WSL

在 Visual Studio 2017 中,使用用于远程 Linux 计算机的相同步骤连接到 WSL。 使用 localhost 作为“主机名”。

从 Visual Studio 2019 版本 16.1 开始,Visual Studio 本机支持将 C++ 与适用于 Linux 的 Windows 子系统 (WSL) 结合使用。 这意味着可以直接在本地 WSL 安装上生成和调试。 不再需要添加远程连接或配置 SSH。 可在此处找到有关如何安装 WSL的详细信息。

若要配置 WSL 安装,使其可与 Visual Studio 结合使用,则需安装以下工具:gccclanggdbmakeninja-build(仅适用于使用 Visual Studio 2019 版本 16.6 或更高版本的 CMake 项目)、rsynczip。 你可以使用此命令将它们安装在使用 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 及适用于 Linux 的 Windows 子系统 (WSL))的介绍性博客文章。

另请参阅

配置 Linux 项目
配置 Linux CMake 项目
部署、运行和调试 Linux 项目
配置 CMake 调试会话