远程开发提示和技巧
本文介绍了每个 Visual Studio Code 远程开发 扩展的故障排除提示和技巧。有关设置和使用每个特定扩展的详细信息,请参阅 SSH、容器 和 WSL 文章。或者尝试入门 教程,帮助您快速在远程环境中运行。
有关 GitHub Codespaces 的提示和问题,请参阅 GitHub Codespaces 文档。
SSH 提示
SSH 功能强大且灵活,但也增加了设置复杂性。本节包含一些在不同环境中启动和运行“远程 - SSH”扩展的提示和技巧。
配置基于密钥的身份验证
SSH 公钥身份验证 是一种便捷的高安全性身份验证方法,它将本地“私钥”与您与 SSH 主机上的用户帐户关联的“公钥”结合在一起。本节将指导您如何生成这些密钥并将它们添加到主机。
提示:Windows 的 PuTTY 不是 受支持的客户端,但您可以 转换您的 PuTTYGen 密钥。
快速入门:使用 SSH 密钥
要为您的远程主机设置基于 SSH 密钥的身份验证。首先,我们将创建一个密钥对,然后将公钥复制到主机。
创建您的本地 SSH 密钥对
检查您是否已在 本地 机器上拥有 SSH 密钥。这通常位于 macOS/Linux 上的 ~/.ssh/id_ed25519.pub
,以及 Windows 上的 .ssh
目录(例如 C:\Users\your-user\.ssh\id_ed25519.pub
)。
如果您没有密钥,请在 本地 终端/PowerShell 中运行以下命令以生成 SSH 密钥对
ssh-keygen -t ed25519 -b 4096
提示:没有
ssh-keygen
?安装 受支持的 SSH 客户端。
限制私钥文件的权限
-
对于 macOS/Linux,请运行以下 shell 命令,必要时替换您的私钥路径
chmod 400 ~/.ssh/id_ed25519
-
对于 Windows,请在 PowerShell 中运行以下命令以授予您的用户名显式读取权限
icacls "privateKeyPath" /grant <username>:R
然后,在 Windows 资源管理器中导航到私钥文件,右键单击并选择“属性”。选择“安全”选项卡>“高级”>“禁用继承”>“从此对象中删除所有继承的权限”。
授权您的 macOS 或 Linux 机器连接
在 本地终端窗口 中运行以下命令之一,替换用户和主机名(如果需要)以将您的本地公钥复制到 SSH 主机。
-
连接到 macOS 或 Linux SSH 主机
export USER_AT_HOST="your-user-name-on-host@hostname" export PUBKEYPATH="$HOME/.ssh/id_ed25519.pub" ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST"
-
连接到 Windows SSH 主机
-
主机使用 OpenSSH Server,并且用户 属于管理员组
export USER_AT_HOST="your-user-name-on-host@hostname" export PUBKEYPATH="$HOME/.ssh/id_ed25519.pub" ssh $USER_AT_HOST "powershell Add-Content -Force -Path \"\$Env:PROGRAMDATA\\ssh\\administrators_authorized_keys\" -Value '$(tr -d '\n\r' < "$PUBKEYPATH")'"
-
否则
export USER_AT_HOST="your-user-name-on-host@hostname" export PUBKEYPATH="$HOME/.ssh/id_ed25519.pub" ssh $USER_AT_HOST "powershell New-Item -Force -ItemType Directory -Path \"\$HOME\\.ssh\"; Add-Content -Force -Path \"\$HOME\\.ssh\\authorized_keys\" -Value '$(tr -d '\n\r' < "$PUBKEYPATH")'"
您可能需要验证 SSH 主机上远程用户的
.ssh
文件夹中的authorized_keys
文件是否归您所有,并且没有其他用户有权访问它。有关详细信息,请参阅 OpenSSH wiki。
-
授权您的 Windows 机器连接
在 本地 PowerShell 窗口中运行以下命令之一,替换用户和主机名(如果需要)以将您的本地公钥复制到 SSH 主机。
-
连接到 macOS 或 Linux SSH 主机
$USER_AT_HOST="your-user-name-on-host@hostname" $PUBKEYPATH="$HOME\.ssh\id_ed25519.pub" $pubKey=(Get-Content "$PUBKEYPATH" | Out-String); ssh "$USER_AT_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '${pubKey}' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
-
连接到 Windows SSH 主机
-
主机使用 OpenSSH Server,并且用户 属于管理员组
$USER_AT_HOST="your-user-name-on-host@hostname" $PUBKEYPATH="$HOME\.ssh\id_ed25519.pub" Get-Content "$PUBKEYPATH" | Out-String | ssh $USER_AT_HOST "powershell `"Add-Content -Force -Path `"`$Env:PROGRAMDATA\ssh\administrators_authorized_keys`" `""
-
否则
$USER_AT_HOST="your-user-name-on-host@hostname" $PUBKEYPATH="$HOME\.ssh\id_ed25519.pub" Get-Content "$PUBKEYPATH" | Out-String | ssh $USER_AT_HOST "powershell `"New-Item -Force -ItemType Directory -Path `"`$HOME\.ssh`"; Add-Content -Force -Path `"`$HOME\.ssh\authorized_keys`" `""
验证 SSH 主机上远程用户的
.ssh
文件夹中的authorized_keys
文件是否归您所有,并且没有其他用户有权访问它。有关详细信息,请参阅 OpenSSH wiki。
-
使用专用密钥提高安全性
虽然在所有 SSH 主机上使用单个 SSH 密钥很方便,但如果任何人获得了对您的私钥的访问权限,他们也将访问所有主机。您可以通过为您的开发主机创建单独的 SSH 密钥来防止这种情况。只需按照以下步骤操作
-
在不同的文件中生成单独的 SSH 密钥。
macOS/Linux:在 本地终端 中运行以下命令
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519-remote-ssh
Windows:在 本地 PowerShell 中运行以下命令
ssh-keygen -t ed25519 -f "$HOME\.ssh\id_ed25519-remote-ssh"
-
按照 快速入门 中的相同步骤授权 SSH 主机上的密钥,但将
PUBKEYPATH
设置为id_ed25519-remote-ssh.pub
文件而不是其他文件。 -
在 VS Code 中,在命令面板 (F1) 中运行“Remote-SSH: Open Configuration File...”,选择 SSH 配置文件,并添加(或修改)以下主机条目
Host name-of-ssh-host-here User your-user-name-on-host HostName host-fqdn-or-ip-goes-here IdentityFile ~/.ssh/id_ed25519-remote-ssh
提示:您也可以在 Windows 路径中使用
/
。如果您使用\
,则需要使用两个斜杠。例如,C:\\path\\to\\my\\id_ed25519
。
重用在 PuTTYGen 中生成的密钥
如果您使用 PuTTYGen 为要连接到的主机设置了 SSH 公钥身份验证,则需要转换您的私钥,以便其他 SSH 客户端可以使用它。为此
-
本地 打开 PuTTYGen 并加载要转换的私钥。
-
从应用程序菜单中选择**转换 > 导出 OpenSSH 密钥**。将转换后的密钥保存到用户配置文件文件夹中的 `.ssh` 目录下的**本地**位置(例如 `C:\Users\youruser\.ssh`)。
-
验证此新的**本地**文件的所有者是你,并且没有其他用户有权访问它。
-
在 VS Code 中,在命令面板 (F1) 中运行**远程-SSH: 打开配置文件...**,选择要更改的 SSH 配置文件,并在配置文件中添加(或修改)一个主机条目,如下所示,指向该文件
Host name-of-ssh-host-here User your-user-name-on-host HostName host-fqdn-or-ip-goes-here IdentityFile ~/.ssh/exported-keyfile-from-putty
提高多用户服务器的安全
Remote - SSH 扩展安装并维护“VS Code Server”。服务器使用随机生成的密钥启动,任何新的服务器连接都需要提供密钥。密钥存储在远程磁盘上,只有当前用户可读。有一个无需身份验证即可访问的 HTTP 路径,位于 ` /version` 。
默认情况下,服务器监听 `localhost` 上的随机 TCP 端口,该端口随后会转发到你的本地机器。如果你正在连接到**Linux 或 macOS**主机,你可以切换到使用锁定到特定用户的 Unix 套接字。然后会转发此套接字而不是端口。
注意:此设置**禁用连接多路复用**,因此建议配置公钥身份验证。
要配置它
-
确保在 Windows、macOS 或 Linux 上有**本地 OpenSSH 6.7+ SSH 客户端**,以及**OpenSSH 6.7+ Linux 或 macOS 主机**(Windows 不支持此模式)。
-
通过在你的**本地** VS Code 用户设置中启用**Remote.SSH: 远程服务器监听套接字**将 Remote - SSH 切换到套接字模式。
-
如果你已经连接到 SSH 主机,请从命令面板 (F1) 中选择**远程-SSH: 杀死主机上的 VS Code Server...**,以便设置生效。
如果连接时遇到错误,你可能需要在 SSH 主机的sshd 配置上启用套接字转发。为此
- 在文本编辑器(如 vi、nano 或 pico)中打开**SSH 主机**(而非本地)上的 ` /etc/ssh/sshd_config` 。
- 添加设置 `AllowStreamLocalForwarding yes` 。
- 重新启动 SSH 服务器。(在 Ubuntu 上,运行 `sudo systemctl restart sshd`。)
- 重试。
排查挂起或失败的连接
如果在尝试连接时遇到 VS Code 挂起(并可能超时)的问题,你可以尝试采取一些措施来解决此问题。
常规故障排除:删除服务器
有助于排查各种 Remote-SSH 问题的一个命令是**远程-SSH: 杀死主机上的 VS Code Server**。这将删除服务器,这可以解决你可能遇到的各种问题和错误消息,例如“无法建立到 `server_name` 的连接:VS Code Server 无法启动”。
查看 VS Code 是否正在等待提示
在 VS Code 中启用 `remote.SSH.showLoginTerminal` 设置并重试。如果系统提示你输入密码或令牌,请参阅启用备用 SSH 身份验证方法,了解有关减少提示频率的详细信息。
如果你仍然遇到问题,请在 `settings.json` 中设置以下属性并重试
"remote.SSH.showLoginTerminal": true,
"remote.SSH.useLocalServer": false
解决某些版本的 Windows OpenSSH 服务器的 bug
由于 Windows 版 OpenSSH 服务器的某些版本存在 bug,用于确定主机是否正在运行 Windows 的默认检查可能无法正常工作。这不会发生在随 Windows 1909 及更早版本一起提供的 OpenSSH 服务器上。
幸运的是,你可以通过在 `settings.json` 中添加以下内容来解决此问题,从而明确告诉 VS Code 你的 SSH 主机是否正在运行 Windows
"remote.SSH.useLocalServer": false
你还可以使用以下属性强制 VS Code 将特定主机识别为 Windows
"remote.SSH.remotePlatform": {
"host-in-ssh-config-or-fqdn": "windows"
}
一个修复程序已合并,因此此问题应在服务器版本大于 8.1.0.0 的版本中得到解决。
在远程主机上启用 TCP 转发
Remote - SSH 扩展使用 SSH 隧道来促进与主机的通信。在某些情况下,这可能在 SSH 服务器上被禁用。要查看是否这是问题,请打开输出窗口中的**Remote - SSH** 类别,并检查以下消息
open failed: administratively prohibited: open failed
如果你确实看到了该消息,请按照以下步骤更新 SSH 服务器的sshd 配置
- 在文本编辑器(如 Vim、nano、Pico 或 Notepad)中打开**SSH 主机**(而非本地)上的 ` /etc/ssh/sshd_config` 或 `C:\ProgramData\ssh\sshd_config` 。
- 添加设置 `AllowTcpForwarding yes` 。
- 重新启动 SSH 服务器。(在 Ubuntu 上,运行 `sudo systemctl restart sshd`。在 Windows 上,在管理员 PowerShell 中运行 `Restart-Service sshd`)。
- 重试。
在 SSH 配置文件中设置 ProxyCommand 参数
如果你位于代理后面并且无法连接到 SSH 主机,你可能需要在**本地**SSH 配置文件中为你的主机使用 `ProxyCommand` 参数。你可以阅读这篇文章SSH ProxyCommand 文章,了解其用法的示例。
确保远程机器有互联网访问权限
远程机器必须有互联网访问权限,才能从 Marketplace 下载 VS Code Server 和扩展。有关连接要求的详细信息,请参阅常见问题解答。
在远程主机上设置 HTTP_PROXY / HTTPS_PROXY
如果你的远程主机位于代理后面,你可能需要在**SSH 主机**上设置 HTTP_PROXY 或 HTTPS_PROXY 环境变量。打开你的 `~/.bashrc` 文件,添加以下内容(将 `proxy.fqdn.or.ip:3128` 替换为相应的 hostname/IP 和端口)
export HTTP_PROXY=http://proxy.fqdn.or.ip:3128
export HTTPS_PROXY=$HTTP_PROXY
# Or if an authenticated proxy
export HTTP_PROXY=http://username:[email protected]:3128
export HTTPS_PROXY=$HTTP_PROXY
解决 ` /tmp` 使用 `noexec` 挂载的问题
某些远程服务器设置为禁止从 ` /tmp` 执行脚本。VS Code 会将它的安装脚本写入系统临时目录,并尝试从那里执行它。你可以与你的系统管理员协商,确定是否可以解决此问题。
检查在安装过程中是否启动了不同的 shell
某些用户从他们的 ` .bash_profile` 或其他启动脚本在他们的**SSH 主机**上启动了一个不同的 shell,因为他们希望使用与默认 shell 不同的 shell。这可能会破坏 VS Code 的远程服务器安装脚本,不建议这样做。相反,请使用 `chsh` 来更改远程机器上的默认 shell。
连接到每次连接都动态分配机器的系统
某些系统会在每次建立 SSH 连接时将 SSH 连接动态路由到集群中的一个节点。这对 VS Code 来说是个问题,因为它会建立两个连接来打开远程窗口:第一个用于安装或启动 VS Code Server(或查找已运行的实例),第二个用于创建 VS Code 用于与服务器通信的 SSH 端口隧道。如果 VS Code 在创建第二个连接时被路由到不同的机器,它将无法与 VS Code Server 通信。
解决此问题的一个方法是使用 OpenSSH 中的 `ControlMaster` 选项(仅限 macOS/Linux 客户端),如启用备用 SSH 身份验证方法中所述,以便 VS Code 的两个连接将通过单个 SSH 连接多路复用到同一节点。
联系你的系统管理员寻求配置帮助
SSH 是一种非常灵活的协议,支持多种配置。如果你在登录终端或**Remote-SSH**输出窗口中看到其他错误,可能是由于缺少设置。
联系你的系统管理员,了解 SSH 主机和客户端所需设置的信息。可以将连接到 SSH 主机的特定命令行参数添加到SSH 配置文件中。
要访问你的配置文件,请在命令面板 (F1) 中运行**远程-SSH: 打开配置文件...**。然后,你可以与管理员协商添加必要的设置。
启用备用 SSH 身份验证方法
如果你正在连接到 SSH 远程主机,并且
- 使用双重身份验证进行连接
- 使用密码身份验证
- 使用带密码的 SSH 密钥,而SSH Agent未运行或不可访问
那么 VS Code 应该会自动提示你输入所需的信息。如果你没有看到提示,请在 VS Code 中启用 `remote.SSH.showLoginTerminal` 设置。此设置会在 VS Code 运行 SSH 命令时显示终端。然后,你可以在终端出现时输入你的身份验证代码、密码或密码短语。
如果你仍然遇到问题,你可能需要在 `settings.json` 中添加以下属性并重试
"remote.SSH.showLoginTerminal": true,
"remote.SSH.useLocalServer": false
如果你在 macOS 和 Linux 上并且希望减少输入密码或令牌的频率,你可以在**本地机器**上启用 `ControlMaster` 功能,以便 OpenSSH 通过单个连接运行多个 SSH 会话。
要启用 `ControlMaster`
-
在你的 SSH 配置文件中添加类似这样的条目
Host * ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 600
-
然后运行 `mkdir -p ~/.ssh/sockets` 来创建 sockets 文件夹。
设置 SSH Agent
如果你正在使用带密码的密钥连接到 SSH 主机,则应确保SSH Agent在**本地**运行。VS Code 会自动将你的密钥添加到代理,这样你就不必每次打开远程 VS Code 窗口时都输入密码短语。
要验证代理是否正在运行,并且可以从 VS Code 的环境访问,请在本地 VS Code 窗口的终端中运行 `ssh-add -l`。你应该会看到代理中密钥的列表(或者一条消息,指示它没有密钥)。如果代理未运行,请按照以下说明启动它。启动代理后,务必重新启动 VS Code。
Windows
要在 Windows 上自动启用 SSH Agent,请启动一个 **本地管理员 PowerShell** 并运行以下命令
# Make sure you're running as an Administrator
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
现在,代理将在登录时自动启动。
Linux
要在后台启动 SSH Agent,请运行
eval "$(ssh-agent -s)"
要在登录时自动启动 SSH Agent,请将以下几行添加到您的 ~/.bash_profile
中
if [ -z "$SSH_AUTH_SOCK" ]; then
# Check for a currently running instance of the agent
RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
if [ "$RUNNING_AGENT" = "0" ]; then
# Launch a new instance of the agent
ssh-agent -s &> .ssh/ssh-agent
fi
eval `cat .ssh/ssh-agent`
fi
macOS
代理应该在 macOS 上默认运行。
使本地 SSH Agent 在远程可用
本地机器上的 SSH Agent 允许 Remote - SSH 扩展连接到您选择的远程系统,而无需重复提示输入密码,但是像 Git 这样的在远程运行的工具无法访问您本地解锁的私钥。
您可以通过在远程打开集成终端并运行 ssh-add -l
来查看这一点。该命令应该列出已解锁的密钥,但实际上报告了一个错误,指出无法连接到身份验证代理。设置 ForwardAgent yes
将使本地 SSH Agent 在远程环境中可用,从而解决此问题。
您可以通过编辑您的 .ssh/config
文件(或任何 Remote.SSH.configFile
设置的文件 - 使用 **Remote-SSH: Open SSH Configuration File...** 命令确保)并添加以下内容来实现这一点
Host *
ForwardAgent yes
请注意,您可能希望更加严格,只为特定命名的主机设置此选项。
修复 SSH 文件权限错误
SSH 对文件权限非常严格,如果设置不正确,您可能会看到类似“WARNING: UNPROTECTED PRIVATE KEY FILE!” 的错误。有几种方法可以更新文件权限来解决此问题,这些方法将在下面的部分中介绍。
本地 SSH 文件和文件夹权限
macOS / Linux
在您的本地机器上,确保设置了以下权限
文件夹/文件 | 权限 |
---|---|
.ssh 在您的用户文件夹中 |
chmod 700 ~/.ssh |
.ssh/config 在您的用户文件夹中 |
chmod 600 ~/.ssh/config |
.ssh/id_ed25519.pub 在您的用户文件夹中 |
chmod 600 ~/.ssh/id_ed25519.pub |
任何其他密钥文件 | chmod 600 /path/to/key/file |
Windows
具体的预期权限可能会因您使用的具体 SSH 实现而异。我们建议您使用开箱即用的 Windows 10 OpenSSH 客户端。
在这种情况下,请确保 SSH 主机上远程用户的 .ssh
文件夹中的所有文件都是由您拥有的,并且没有其他用户有权访问它。有关详细信息,请参阅 Windows OpenSSH wiki。
对于所有其他客户端,请参阅客户端的文档以了解实现的预期。
服务器 SSH 文件和文件夹权限
macOS / Linux
在您连接到的远程机器上,请确保设置了以下权限
文件夹/文件 | Linux / macOS 权限 |
---|---|
.ssh 在您用户文件夹中 |
chmod 700 ~/.ssh |
.ssh/authorized_keys 在您用户文件夹中 |
chmod 600 ~/.ssh/authorized_keys |
请注意,目前仅支持 Linux 主机,因此省略了 macOS 和 Windows 10 的权限。
Windows
有关为 Windows OpenSSH 服务器设置适当的文件权限的详细信息,请参阅 Windows OpenSSH wiki。
安装支持的 SSH 客户端
操作系统 | 说明 |
---|---|
Windows 10 1803+ / Server 2016/2019 1803+ | 安装 Windows OpenSSH 客户端。 |
早期 Windows 版本 | 安装 Git for Windows。 |
macOS | 预安装。 |
Debian/Ubuntu | 运行 sudo apt-get install openssh-client |
RHEL / Fedora / CentOS | 运行 sudo yum install openssh-clients |
VS Code 将在 PATH 中查找 ssh
命令。如果没有找到,它将在 Windows 上尝试在默认的 Git for Windows 安装路径中找到 ssh.exe
。您还可以通过将 remote.SSH.path
属性添加到 settings.json
中来明确告诉 VS Code 在哪里找到 SSH 客户端。
安装支持的 SSH 服务器
操作系统 | 说明 | 详细信息 |
---|---|---|
Debian 8+ / Ubuntu 16.04+ | 运行 sudo apt-get install openssh-server |
有关详细信息,请参阅 Ubuntu SSH 文档。 |
RHEL / CentOS 7+ | 运行 sudo yum install openssh-server && sudo systemctl start sshd.service && sudo systemctl enable sshd.service |
有关详细信息,请参阅 RedHat SSH 文档。 |
SuSE 12+ / openSUSE 42.3+ | 在 Yast 中,转到 Services Manager,在列表中选择“sshd”,然后单击 **Enable**。接下来,转到 Firewall,选择 **Permanent** 配置,并在服务下选中 **sshd**。 | 有关详细信息,请参阅 SuSE SSH 文档。 |
Windows 10 1803+ / Server 2016/2019 1803+ | 安装 Windows OpenSSH 服务器。 | |
macOS 10.14+ (Mojave) | 启用 远程登录。 |
解决在 SSH 主机上执行 Git push 或同步时出现的挂起问题
如果您使用 SSH 克隆 Git 仓库,并且您的 SSH 密钥具有密码,VS Code 的拉取和同步功能在远程运行时可能会挂起。
您可以使用没有密码的 SSH 密钥、使用 HTTPS 克隆,或从命令行运行 git push
来解决此问题。
使用 SSHFS 访问远程主机上的文件
SSHFS 是一种安全的远程文件系统访问协议,它建立在 SFTP 之上。与 CIFS / Samba 共享相比,它具有优势,因为它只需要对机器的 SSH 访问权限。
注意: 出于性能原因,SSHFS 最适合用于单文件编辑和上传/下载内容。如果您需要使用对多个文件进行批量读/写操作的应用程序(例如本地源代码控制工具),rsync 是更好的选择。
macOS / Linux:
在 Linux 上,您可以使用发行版的包管理器安装 SSHFS。对于 Debian/Ubuntu:sudo apt-get install sshfs
注意: WSL 1 不支持 FUSE 或 SSHFS,因此 Windows 上的说明有所不同。WSL 2 包含 FUSE 和 SSHFS 支持,因此这种情况很快就会改变。
在 macOS 上,您可以使用 Homebrew 安装 SSHFS
brew install --cask macfuse
brew install gromgit/fuse/sshfs-mac
brew link --overwrite sshfs-mac
此外,如果您不想使用命令行来挂载远程文件系统,您还可以安装 SSHFS GUI。
要使用命令行,请从本地终端运行以下命令(将 user@hostname
替换为远程用户和主机名/IP)
export USER_AT_HOST=user@hostname
# Make the directory where the remote filesystem will be mounted
mkdir -p "$HOME/sshfs/$USER_AT_HOST"
# Mount the remote filesystem
sshfs "$USER_AT_HOST:" "$HOME/sshfs/$USER_AT_HOST" -ovolname="$USER_AT_HOST" -p 22 \
-o workaround=nonodelay -o transform_symlinks -o idmap=user -C
这将使远程机器上的主文件夹在 ~/sshfs
下可用。完成后,您可以使用操作系统的 Finder / 文件资源管理器或使用命令行将其卸载
umount "$HOME/sshfs/$USER_AT_HOST"
Windows
请按照以下步骤操作
-
在 Linux 上,将
.gitattributes
文件添加到您的项目中,以 **强制在 Linux 和 Windows 之间保持一致的行尾**,以避免由于这两个操作系统之间的 CRLF/LF 差异而导致意外问题。有关详细信息,请参阅 解决 Git 行尾问题。 -
接下来,使用 Chocolatey 安装 SSHFS-Win:
choco install sshfs
-
安装完 Windows 的 SSHFS 后,您可以使用文件资源管理器的 **映射网络驱动器...** 选项,路径为
\\sshfs\user@hostname
,其中user@hostname
是您的远程用户和主机名/IP。您可以使用命令提示符以以下方式编写脚本:net use /PERSISTENT:NO X: \\sshfs\user@hostname
-
完成后,右键单击文件资源管理器中的驱动器,然后选择 **断开连接** 以断开连接。
从终端连接到远程主机
配置主机后,您可以通过传递远程 URI 从终端直接连接到该主机。
例如,要连接到 remote_server
并打开 /code/my_project
文件夹,请运行
code --remote ssh-remote+remote_server /code/my_project
我们需要猜测输入路径是文件还是文件夹。如果它具有文件扩展名,则它被视为文件。
要强制打开文件夹,请在路径中添加斜杠或使用
code --folder-uri vscode-remote://ssh-remote+remote_server/code/folder.with.dot
要强制打开文件,请添加 --goto
或使用
code --file-uri vscode-remote://ssh-remote+remote_server/code/fileWithoutExtension
使用 rsync 来维护本地源代码副本
除了 使用 SSHFS 访问远程文件 之外,还可以 使用 rsync
将远程主机上文件夹的整个内容复制到本地机器。rsync
命令将在每次运行时确定需要更新哪些文件,这比使用 scp
或 sftp
效率更高,也更方便。如果您确实需要使用多文件或性能密集型的本地工具,这主要是一个需要考虑的问题。
rsync
命令在 macOS 上开箱即用,可以使用 Linux 包管理器安装(例如,在 Debian/Ubuntu 上使用 sudo apt-get install rsync
)。对于 Windows,您需要使用 WSL 或 Cygwin 来访问该命令。
要使用该命令,请导航到您要存储同步内容的文件夹,并运行以下命令,将 user@hostname
替换为远程用户和主机名/IP,将 /remote/source/code/path
替换为远程源代码位置。
在 **macOS、Linux 或 WSL 内部**
rsync -rlptzv --progress --delete --exclude=.git "user@hostname:/remote/source/code/path" .
或者使用 **Windows 上的 PowerShell 中的 WSL**
wsl rsync -rlptzv --progress --delete --exclude=.git "user@hostname:/remote/source/code/path" "`$(wslpath -a '$PWD')"
您可以在每次想要获取最新文件副本时重新运行此命令,并且只会传输更新。.git
文件夹被故意排除,原因是为了性能考虑,以及为了让您可以使用本地 Git 工具,而无需担心远程主机上的状态。
要推送内容,请在命令中反转源和目标参数。但是,**在 Windows 上**,您应该在项目中添加一个 .gitattributes
文件以**强制一致的换行符**,然后再执行此操作。有关详细信息,请参阅解决 Git 换行符问题。
rsync -rlptzv --progress --delete --exclude=.git . "user@hostname:/remote/source/code/path"
清理远程的 VS Code 服务器
SSH 扩展提供了一个命令用于清理远程机器上的 VS Code 服务器,**Remote-SSH: 从主机卸载 VS Code 服务器...**。该命令执行两件事:它会杀死所有正在运行的 VS Code 服务器进程,并删除服务器安装所在的文件夹。
如果您想手动运行这些步骤,或者如果该命令对您不起作用,则可以运行类似这样的脚本
# Kill server processes
kill -9 $(ps aux | grep vscode-server | grep $USER | grep -v grep | awk '{print $2}')
# Delete related files and folder
rm -rf $HOME/.vscode-server # Or ~/.vscode-server-insiders
VS Code 服务器以前安装在 ~/.vscode-remote
下,因此您也可以检查该位置。
SSH 到远程 WSL 2 主机
您可能希望使用 SSH 连接到远程机器上运行的 WSL 发行版。查看本指南,了解如何从外部机器 SSH 到 Windows 10 上的 Bash 和 WSL 2。
提交问题
如果您在使用 Remote-SSH 扩展时遇到问题,并且认为您需要提交问题,请首先确保您已阅读了本网站上的文档,然后查看故障排除 wiki 文档,了解如何获取日志文件以及尝试可能有助于缩小问题范围的更多步骤。
开发容器提示
如果您想了解有关使用 Dev Containers 的技巧,可以访问 Dev Containers 技巧和窍门。
WSL 提示
首次启动:VS Code 服务器先决条件
一些 WSL Linux 发行版缺少 VS Code 服务器启动所需的库。您可以使用其包管理器将其他库添加到您的 Linux 发行版中。
Debian 和 Ubuntu
打开 Debian 或 Ubuntu WSL shell 以添加 wget
和 ca-certificates
sudo apt-get update && sudo apt-get install wget ca-certificates
Alpine
以 root 身份打开 Alpine WSL shell(wsl -d Alpine -u root
)以添加 libstdc++
apk update && apk add libstdc++
在 Windows 10 2018 年 4 月更新(版本 1803)和更早版本中,需要 /bin/bash
apk update && apk add bash
选择 WSL 扩展使用的发行版
**WSL: 新窗口** 将打开注册为默认的 WSL 发行版。
要打开非默认发行版,请从要使用的发行版的 WSL shell 运行 code .
,或者使用**WSL: 使用发行版打开新窗口**。
在 Windows 10 2019 年 5 月更新(版本 1903)之前的 WSL 版本中,WSL 命令只能使用**默认发行版**。出于这个原因,如果您同意更改默认发行版,WSL 扩展可能会提示您。
您始终可以使用wslconfig.exe 更改您的默认值。
例如
wslconfig /setdefault Ubuntu
您可以通过运行以下命令查看已安装的发行版
wslconfig /l
配置服务器启动环境
当 WSL 扩展在 WSL 中启动 VS Code 服务器时,它不会运行任何 shell 配置脚本。这样做是为了避免自定义配置脚本阻止启动。
如果您需要配置启动环境,您可以使用环境设置脚本,如此处所述。
配置远程扩展主机环境
远程扩展主机和终端的环境基于默认 shell 的配置脚本。为了评估远程扩展主机进程的环境变量,服务器会创建一个默认 shell 的实例作为**交互式登录 shell**。它会从其中探测环境变量,并将其用作远程扩展主机进程的初始环境。因此,环境变量的值取决于配置为默认的 shell 以及该 shell 的配置脚本的内容。
请参阅Unix shell 初始化,以了解每个 shell 的配置脚本概述。大多数 WSL 发行版都将 /bin/bash
配置为默认 shell。/bin/bash
将首先查找 /etc/profile
下的启动文件,以及 ~/.bash_profile
、~/.bash_login
、~/.profile
下的任何启动文件。
要更改 WSL 发行版的默认 shell,请按照这篇博文中的说明操作。
修复 code
命令无法正常工作的问题
如果从 Windows 上的 WSL 终端键入 code
无法正常工作,因为找不到 code
,则您可能在 WSL 中的 PATH 中缺少一些关键位置。
通过打开 WSL 终端并键入 echo $PATH
进行检查。您应该看到 VS Code 安装路径列出。默认情况下,这将是
/mnt/c/Users/Your Username/AppData/Local/Programs/Microsoft VS Code/bin
但是,如果您使用的是**系统安装程序**,则安装路径为
/mnt/c/Program Files/Microsoft VS Code/bin
...或...
/mnt/c/Program Files (x86)/Microsoft VS Code/bin
这是 WSL 的一项功能,即路径从 Windows 中的 PATH 变量继承。要更改 Windows PATH 变量,请使用 Windows 开始菜单中的**编辑您的帐户的环境变量**命令。
如果您已禁用路径共享功能,请编辑您的 .bashrc
,添加以下内容,然后启动一个新终端
WINDOWS_USERNAME="Your Windows Alias"
export PATH="$PATH:/mnt/c/Windows/System32:/mnt/c/Users/${WINDOWS_USERNAME}/AppData/Local/Programs/Microsoft VS Code/bin"
# or...
# export PATH="$PATH:/mnt/c/Program Files/Microsoft VS Code/bin"
# or...
# export PATH="$PATH:/mnt/c/Program Files (x86)/Microsoft VS Code/bin"
**注意:**务必在目录名称中使用引号或转义空格字符。
查找 code
命令的问题
如果从 Windows 命令提示符键入 code
无法启动 VS Code,您可以通过运行 VSCODE_WSL_DEBUG_INFO=true code .
来帮助我们诊断问题。
请提交问题并附加完整输出。
查找启动或连接到服务器的问题
当 WSL 窗口无法连接到远程服务器时,您可以在 WSL 日志中获取更多信息。提交问题时,务必始终发送 WSL 日志的完整内容。
通过运行命令**WSL: 打开日志** 打开 WSL 日志。日志将在 WSL 选项卡下的终端视图中显示。
要获取更详细的日志记录,请在用户设置中启用设置 remote.WSL.debug
。
服务器无法启动,出现分段错误
您可以通过向我们发送核心转储文件来帮助我们调查此问题。要获取核心转储文件,请按照以下步骤操作
在 Windows 命令提示符中
- 运行
code --locate-extension ms-vscode-remote.remote-wsl
以确定 WSL 扩展文件夹。 cd
到返回的路径。- 使用 VS Code 打开
wslServer.sh
脚本,code .\scripts\wslServer.sh
。 - 在最后一行(在
"$VSCODE_REMOTE_BIN/$COMMIT/bin/$SERVER_APPNAME" "$@"
之前)添加ulimit -C unlimited
。 - 启动运行远程服务器的 WSL 窗口,并等待分段错误出现。
核心文件将位于上面的 WSL 扩展文件夹中。
我在尝试重命名打开的工作区中的文件夹时看到 EACCES: 权限被拒绝错误
这是 WSL 文件系统实现的已知问题(Microsoft/WSL#3395,Microsoft/WSL#1956),由 VS Code 激活的文件监视器引起。该问题只有在 WSL 2 中才能解决。
要避免此问题,请将 remote.WSL.fileWatcher.polling
设置为 true。但是,基于轮询的方案对大型工作区会产生性能影响。
对于大型工作区,您可能希望增加轮询间隔 remote.WSL.fileWatcher.pollingInterval
,并使用files.watcherExclude 控制要监视的文件夹。
WSL 2 没有该文件监视器问题,不受新设置的影响。
解决 WSL 中的 Git 换行符问题(导致许多文件被修改)
由于 Windows 和 Linux 使用不同的默认换行符,因此 Git 可能会报告大量修改的文件,这些文件除了换行符外没有其他差异。为了防止这种情况发生,您可以使用 .gitattributes
文件或在 Windows 侧全局禁用换行符转换。
通常,在您的存储库中添加或修改 .gitattributes
文件是解决此问题的最可靠方法。将此文件提交到源代码控制将有助于其他人,并允许您根据需要按存储库更改行为。例如,将以下内容添加到存储库根目录下的 .gitattributes
文件中,将强制所有内容都为 LF,除了需要 CRLF 的 Windows 批处理文件
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
请注意,这在**Git v2.10+** 中有效,因此如果您遇到问题,请确保已安装最新的 Git 客户端。您可以在存储库中添加需要 CRLF 的其他文件类型到同一个文件中。
如果您希望始终上传 Unix 样式的换行符 (LF),可以使用 input
选项。
git config --global core.autocrlf input
如果您希望完全禁用换行符转换,请改为运行以下命令
git config --global core.autocrlf false
最后,您可能需要重新克隆存储库才能使这些设置生效。
在 Windows 和 WSL 之间共享 Git 凭据
如果您使用 HTTPS 克隆存储库,并且**在 Windows 中配置了凭据助手**,您可以将其与 WSL 共享,以便您输入的密码在两侧都保留下来。(请注意,这并不适用于使用 SSH 密钥。)
只需按照以下步骤操作
-
在 Windows 上配置凭据管理器,方法是在**Windows 命令提示符**或**PowerShell** 中运行以下命令
git config --global credential.helper wincred
-
配置 WSL 以使用相同的凭据助手,方法是在**WSL 终端**中运行以下命令
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager-core.exe"
您在 Windows 侧使用 Git 时输入的任何密码现在都将在 WSL 中可用,反之亦然。
解决从 WSL 执行 Git 推送或同步时挂起的问题
如果您使用 SSH 克隆 Git 仓库,并且您的 SSH 密钥具有密码,VS Code 的拉取和同步功能在远程运行时可能会挂起。
您可以使用没有密码的 SSH 密钥、使用 HTTPS 克隆,或从命令行运行 git push
来解决此问题。
GitHub Codespaces 提示
有关GitHub Codespaces 的技巧和问题,请参阅GitHub Codespaces 文档。您还可以查看可能影响 Codespaces 的已知 Web 限制和调整。
扩展提示
虽然许多扩展可以无需修改即可运行,但仍存在一些问题会导致某些功能无法按预期工作。在某些情况下,您可以使用其他命令来解决问题,而在其他情况下,可能需要修改扩展。本节提供常见问题的快速参考以及解决问题的技巧。您还可以参考支持远程开发上的主扩展文章,以深入了解如何修改扩展以支持远程扩展主机。
解决关于缺少依赖项的错误
某些扩展依赖于某些 WSL Linux 发行版的基本安装中未找到的库。您可以使用 Linux 发行版的包管理器将其他库添加到您的 Linux 发行版中。对于基于 Ubuntu 和 Debian 的发行版,运行 sudo apt-get install <package>
来安装所需的库。查看扩展或错误消息中提到的运行时的文档以获取其他安装详细信息。
本地绝对路径设置在远程应用时失败
当您连接到远程端点时,VS Code 的本地用户设置会被重用。虽然这保持了用户体验的一致性,但您可能需要在本地机器和每个主机/容器/WSL 之间更改绝对路径设置,因为目标位置不同。
解决方案:您可以在连接到远程端点后,通过从命令面板 (F1) 运行 首选项:打开远程设置命令或选择设置编辑器中的 远程选项卡来设置特定于端点的设置。这些设置将在您每次连接时覆盖您已有的任何本地设置。
需要在远程端点上安装本地 VSIX
有时您希望在远程机器上安装本地 VSIX,无论是在开发期间还是在扩展作者要求您尝试修复程序时。
解决方案:连接到 SSH 主机、容器或 WSL 后,您可以像在本地一样安装 VSIX。从命令面板 (F1) 运行 扩展:从 VSIX 安装... 命令。您可能还想将 "extensions.autoUpdate": false
添加到 settings.json
以防止自动更新到最新的 Marketplace 版本。有关在远程环境中开发和测试扩展的更多信息,请参阅 支持远程开发。
浏览器未在本地打开
某些扩展使用外部节点模块或自定义代码来启动浏览器窗口。不幸的是,这可能会导致扩展在远程而不是本地启动浏览器。
解决方案:扩展可以使用 vscode.env.openExternal
API 来解决此问题。有关详细信息,请参阅 扩展作者指南。
剪贴板不起作用
某些扩展使用诸如 clipboardy
之类的节点模块来与剪贴板集成。不幸的是,这可能会导致扩展在远程端错误地与剪贴板集成。
解决方案:扩展可以切换到 VS Code 剪贴板 API 来解决此问题。有关详细信息,请参阅 扩展作者指南。
无法从浏览器或应用程序访问本地 Web 服务器
在容器、SSH 主机或通过 GitHub Codespaces 工作时,浏览器连接到的端口可能会被阻止。
解决方案:扩展可以使用 vscode.env.openExternal
或 vscode.env.asExternalUri
API(它会自动转发本地主机端口)来解决此问题。有关详细信息,请参阅 扩展作者指南。作为变通方法,请使用 转发端口命令手动执行此操作。
Webview 内容未出现
如果扩展的 webview 内容使用 iframe
连接到本地 Web 服务器,则 webview 连接到的端口可能会被阻止。此外,如果扩展硬编码 vscode-resource://
URI 而不是使用 asWebviewUri
,则内容可能不会出现在 Codespaces 浏览器编辑器中。
解决方案:扩展可以使用 webview.asWebviewUri
来解决 vscode-resource://
URI 的问题。
如果端口被阻止,最好的方法是改用 webview 消息传递 API。作为变通方法,vscode.env.asExternalUri
可以用于允许 webview 从 VS Code 连接到生成的本地主机 Web 服务器。但是,目前由 MicrosoftDocs/vscodespaces#11 阻止在 Codespaces 基于浏览器的编辑器(仅限)中使用。有关变通方法的详细信息,请参阅 扩展作者指南。
被阻止的本地主机端口
如果您尝试从外部应用程序连接到本地主机端口,则该端口可能会被阻止。
解决方案:VS Code 1.40 引入了一个新的 vscode.env.asExternalUri
API,用于扩展以编程方式转发任意端口。有关详细信息,请参阅 扩展作者指南。作为变通方法,您可以使用 转发端口命令手动执行此操作。
存储扩展数据的错误
扩展可能试图通过查找 Linux 上的 ~/.config/Code
文件夹来持久化全局数据。此文件夹可能不存在,这会导致扩展抛出错误,例如 ENOENT: no such file or directory, open '/root/.config/Code/User/filename-goes-here
。
解决方案:扩展可以使用 context.globalStorageUri
或 context.storageUri
属性来解决此问题。有关详细信息,请参阅 扩展作者指南。
无法登录/每次连接到新端点时都必须登录
需要登录的扩展可以使用自己的代码来持久化密钥。由于缺少依赖项,此代码可能会失败。即使成功,密钥也会存储在远程位置,这意味着您需要为每个新端点登录。
解决方案:扩展可以使用 SecretStorage API 来解决此问题。有关详细信息,请参阅 扩展作者指南。
不兼容的扩展阻止 VS Code 连接
如果在远程主机、容器或 WSL 上安装了不兼容的扩展,我们已经看到由于不兼容性导致 VS Code 服务器挂起或崩溃的情况。如果扩展立即激活,这可能会阻止您连接并能够卸载扩展。
解决方案:按照以下步骤手动删除远程扩展文件夹
-
对于容器,确保您的
devcontainer.json
不再包含对故障扩展的引用。 -
接下来,使用单独的终端/命令提示符连接到远程主机、容器或 WSL。
- 如果是 SSH 或 WSL,请相应地连接到环境(运行
ssh
连接到服务器或打开 WSL 终端)。 - 如果使用容器,请通过调用
docker ps -a
并查看列表中是否存在具有正确名称的图像来识别容器 ID。如果容器已停止,请运行docker run -it <id> /bin/sh
。如果它正在运行,请运行docker exec -it <id> /bin/sh
。
- 如果是 SSH 或 WSL,请相应地连接到环境(运行
-
连接后,运行
rm -rf ~/.vscode-server/extensions
以用于 VS Code 稳定版,或运行rm -rf ~/.vscode-server-insiders/extensions
以用于 VS Code 预览版,以删除所有扩展。
附带或获取预构建的本机模块的扩展失败
与 VS Code 扩展捆绑在一起(或为其动态获取的)本机模块必须使用 Electron 的 electron-rebuild
重新编译。但是,VS Code 服务器运行 Node.js 的标准(非 Electron)版本,这会导致二进制文件在远程使用时失败。
解决方案:需要修改扩展来解决此问题。他们需要为 VS Code 附带的 Node.js 中的“模块”版本包含(或动态获取)两组二进制文件(Electron 和标准 Node.js),然后检查他们的激活函数中是否 context.executionContext === vscode.ExtensionExecutionContext.Remote
以设置正确的二进制文件。有关详细信息,请参阅 扩展作者指南。
扩展仅在非 x86_64 主机或 Alpine Linux 上失败
如果扩展在 Debian 9+、Ubuntu 16.04+ 或 RHEL/CentOS 7+ 远程 SSH 主机、容器或 WSL 上运行,但在支持的非 x86_64 主机(例如 ARMv7l)或 Alpine Linux 容器上失败,则扩展可能只包含不支持这些平台的本机代码或运行时。例如,扩展可能只包含 x86_64 编译版本的本机模块或运行时。对于 Alpine Linux,由于 libc
在 Alpine Linux(musl
)和 سایر التوزيعات (glibc
) 中实现方式的根本差异,包含的本机代码或运行时可能无法正常工作。
解决方案:扩展将需要选择性地支持这些平台,方法是为这些其他目标编译/包含二进制文件。需要注意的是,某些第三方 npm 模块也可能包含会导致此问题的本机代码。因此,在某些情况下,您可能需要与 npm 模块作者合作以添加其他编译目标。有关详细信息,请参阅 扩展作者指南。
扩展由于缺少模块而失败
依赖于 Electron 或 VS Code 基础模块(扩展 API 未公开)但未提供回退的扩展在远程运行时可能会失败。您可能会在开发者工具控制台中看到错误,例如找不到 original-fs
。
解决方案:删除对 Electron 模块的依赖或提供回退。有关详细信息,请参阅 扩展作者指南。
无法访问/将远程工作区文件传输到本地机器
在外部应用程序中打开工作区文件的扩展可能会遇到错误,因为外部应用程序无法直接访问远程文件。
解决方案:如果您创建了一个旨在本地运行的“UI”扩展,您可以使用vscode.workspace.fs
API 与远程工作区文件系统进行交互。然后,您可以将它作为您的“工作区”扩展的依赖项,并在需要时使用命令调用它。有关不同类型的扩展以及如何使用命令在它们之间进行通信的详细信息,请参阅扩展作者指南。
无法从扩展访问连接的设备
访问本地连接设备的扩展在远程运行时将无法连接到这些设备。
解决方案:目前还没有。我们正在调查解决此问题的最佳方法。
问题和反馈
报告问题
如果您在使用远程开发扩展时遇到问题,请务必收集正确的日志,以便我们能够帮助您诊断问题。
每个远程扩展都具有查看其日志的命令。
您可以从命令面板 (F1) 中使用远程 - SSH: 显示日志获取远程 - SSH 扩展日志。在报告远程 - SSH 问题时,请还验证您是否能够从外部终端(不使用远程 - SSH)SSH 登录到您的机器。
类似地,您可以使用开发容器: 显示容器日志获取开发容器扩展日志。
与上面两个类似,您可以使用WSL: 显示日志获取 WSL 扩展日志。此外,请检查您的问题是否在WSL 库 中被跟踪(而不是由 WSL 扩展引起)。
如果您在远程使用其他扩展时遇到问题(例如,其他扩展在远程上下文中无法正常加载或安装),则最好从远程扩展主机输出通道(输出: 聚焦于输出视图)中获取日志,并从下拉菜单中选择日志(远程扩展主机)。
注意:如果您只看到日志(扩展主机),则这是本地扩展主机,并且远程扩展主机未启动。这是因为日志通道仅在日志文件创建后才会创建,因此如果远程扩展主机未启动,则未创建远程扩展主机日志文件,并且不会在输出视图中显示。这仍然是包含在您的问题中的有用信息。
远程问题和反馈资源
我们提供各种其他远程资源
- 请参阅远程开发常见问题解答。
- 在Stack Overflow 上搜索。
- 添加功能请求或报告问题。