远程开发技巧与窍门
本文介绍 Visual Studio Code Remote Development 扩展的故障排除技巧与窍门。有关设置和使用每个特定扩展的详细信息,请参阅 SSH、容器和 WSL 文章。或者尝试入门教程,以帮助您快速在远程环境中运行。
有关 GitHub Codespaces 的技巧和问题,请参阅 GitHub Codespaces 文档。
SSH 技巧
SSH 功能强大且灵活,但这也会增加一些设置复杂性。本节包含有关在不同环境中启动和运行 Remote - SSH 扩展的一些技巧与窍门。
配置 $EDITOR 变量
对于 macOS / Linux 远程主机,将此代码片段添加到您的 shell 配置文件(例如 .bashrc
或 .zshrc
)中
if [ "$VSCODE_INJECTION" = "1" ]; then
export EDITOR="code --wait" # or 'code-insiders' if you're using VS Code Insiders
fi
对于 Windows 主机,以下是等效的 PowerShell 命令
if ($env:VSCODE_INJECTION -eq "1") {
$env:EDITOR = "code --wait" # or 'code-insiders' for VS Code Insiders
}
现在运行使用 $EDITOR 变量的终端命令(例如 git commit
)时,将在 VS Code 中打开文件,而不是默认的基于终端的编辑器(例如 vim
或 nano
)。
配置基于密钥的身份验证
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,并加载要转换的私钥。
-
从应用程序菜单中选择Conversions > Export OpenSSH key。将转换后的密钥保存到用户配置文件文件夹中
.ssh
目录下的本地位置(例如C:\Users\youruser\.ssh
)。 -
验证这个新的本地文件是否归您所有,并且没有其他用户有权访问它。
-
在 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/exported-keyfile-from-putty
提高多用户服务器上的安全性
Remote - SSH 扩展安装并维护“VS Code Server”。服务器使用随机生成的密钥启动,并且任何新连接到服务器的连接都需要提供该密钥。密钥存储在远程磁盘上,只有当前用户可读。有一个无需身份验证即可访问的 HTTP 路径:/version
。
默认情况下,服务器监听本地主机的随机 TCP 端口,然后该端口转发到您的本地计算机。如果您连接到 Linux 或 macOS 主机,则可以切换到使用锁定到特定用户的 Unix 套接字。然后转发此套接字而不是端口。
注意:此设置会禁用连接多路复用,因此建议配置公钥身份验证。
要进行配置
-
确保您在 Windows、macOS 或 Linux 上有本地 OpenSSH 6.7+ SSH 客户端,并且有 OpenSSH 6.7+ Linux 或 macOS 主机(Windows 不支持此模式)。
-
通过在您的本地 VS Code 用户设置中启用
Remote.SSH: Remote Server Listen On Socket
将 Remote - SSH 切换到套接字模式。 -
如果您已经连接到 SSH 主机,请从命令面板 (F1) 中选择Remote-SSH: Kill VS Code Server on Host...,以便设置生效。
如果连接时遇到错误,您可能需要在 SSH 主机的 sshd config 中启用套接字转发。为此,请执行以下操作
- 在 SSH 主机上(而不是本地)使用文本编辑器(如 vi、nano 或 pico)打开
/etc/ssh/sshd_config
。 - 添加设置
AllowStreamLocalForwarding yes
。 - 重启 SSH 服务器。(在 Ubuntu 上,运行
sudo systemctl restart sshd
。) - 重试。
故障排除挂起或失败的连接
如果您在尝试连接时遇到 VS Code 挂起(并可能超时)的问题,可以尝试以下几种方法来解决此问题。
常规故障排除:删除服务器
一个有助于排查各种 Remote-SSH 问题的命令是Remote-SSH: Kill VS Code Server on Host。这将删除服务器,可以修复您可能看到的大范围问题和错误消息,例如“无法建立连接到 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 server 的 bug
由于某些版本 Windows OpenSSH server 的 bug,默认检查以确定主机是否运行 Windows 可能无法正常工作。Windows 1909 及更早版本随附的 OpenSSH server 不会出现此问题。
幸运的是,您可以通过将以下内容添加到 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 config
- 在 SSH 主机上(而不是本地)使用文本编辑器(如 Vim、nano、Pico 或 Notepad)打开
/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 文章以了解其用法示例。
确保远程计算机具有 Internet 访问权限
远程计算机必须具有 Internet 访问权限,才能从 Marketplace 下载 VS Code Server 和扩展。有关连接要求的详细信息,请参阅常见问题解答。
在远程主机上设置 HTTP_PROXY / HTTPS_PROXY
如果您的远程主机位于代理后面,则可能需要在 SSH 主机上设置 HTTP_PROXY 或 HTTPS_PROXY 环境变量。打开您的 ~/.bashrc
文件并添加以下内容(将 proxy.fqdn.or.ip:3128
替换为适当的主机名/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:password@proxy.fqdn.or.ip:3128
export HTTPS_PROXY=$HTTP_PROXY
绕过以 noexec 方式挂载的 /tmp
某些远程服务器被设置为不允许从 /tmp
执行脚本。VS Code 会将其安装脚本写入系统临时目录并尝试从那里执行。您可以与系统管理员协商确定是否可以绕过此问题。
检查安装期间是否启动了不同的 shell
一些用户在其 SSH 主机上的 .bash_profile
或其他启动脚本中启动不同的 shell,因为他们想使用与默认 shell 不同的 shell。这可能会破坏 VS Code 的远程服务器安装脚本,不建议这样做。相反,请使用 chsh
在远程计算机上更改您的默认 shell。
连接到按连接动态分配机器的系统
某些系统每次建立 SSH 连接时,都会将 SSH 连接动态路由到集群中的一个节点。这对 VS Code 来说是一个问题,因为它需要建立两个连接才能打开远程窗口:第一个连接用于安装或启动 VS Code Server(或找到一个已在运行的实例),第二个连接用于创建 VS Code 用于与服务器通信的 SSH 端口隧道。如果在建立第二个连接时 VS Code 被路由到不同的机器,它将无法与 VS Code Server 通信。
一种解决方法是在 OpenSSH(仅限 macOS/Linux 客户端)中使用 ControlMaster
选项,如启用备用 SSH 身份验证方法中所述,这样 VS Code 的两个连接将通过与同一节点的单个 SSH 连接进行多路复用。
联系您的系统管理员寻求配置帮助
SSH 是一个非常灵活的协议,支持许多配置。如果您在登录终端或Remote-SSH输出窗口中看到其他错误,可能是由于缺少设置。
请联系您的系统管理员,了解您的 SSH 主机和客户端所需的设置信息。连接到 SSH 主机的特定命令行参数可以添加到SSH 配置文件中。
要访问您的配置文件,请在命令面板 (F1) 中运行Remote-SSH: Open Configuration File...。然后,您可以与管理员一起添加必要的设置。
启用备用 SSH 身份验证方法
如果您正在连接到 SSH 远程主机,并且
- 使用双因素身份验证连接
- 使用密码身份验证
- 当 SSH 代理未运行或无法访问时使用带有密码的 SSH 密钥
那么 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
创建套接字文件夹。
设置 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 推送或同步时挂起的问题
如果您使用 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
文件以**强制执行一致的行尾**。有关详细信息,请参阅解决 WSL 中的 Git 行尾问题。
rsync -rlptzv --progress --delete --exclude=.git . "user@hostname:/remote/source/code/path"
清理远程上的 VS Code Server
SSH 扩展提供了一个用于清理远程计算机上的 VS Code Server 的命令:**Remote-SSH: 从主机卸载 VS Code Server...**。此命令会执行两项操作:终止所有正在运行的 VS Code Server 进程,并删除服务器安装所在的文件夹。
如果您想手动运行这些步骤,或者命令对您不起作用,可以运行如下脚本
# 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 Server 之前安装在 ~/.vscode-remote
下,您也可以检查该位置。
通过 SSH 连接到远程 WSL 2 主机
您可能希望使用 SSH 连接到在远程计算机上运行的 WSL 发行版。请参阅此指南,了解如何从外部计算机通过 SSH 连接到 Windows 10 上的 Bash 和 WSL 2。
提交问题
如果您在使用 Remote-SSH 扩展时遇到问题并认为需要提交问题,请首先确保您已阅读本网站的文档,然后参阅故障排除 Wiki 文档,了解如何获取日志文件以及尝试有助于缩小问题来源范围的更多步骤。
开发容器技巧
如果您想了解有关使用开发容器的技巧,可以访问开发容器 技巧和窍门。
WSL 技巧
首次启动:VS Code Server 先决条件
某些 WSL Linux 发行版缺少 VS Code Server 启动所需的库。您可以使用其包管理器将附加库添加到您的 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 月更新(build 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 Server 时,它不会运行任何 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 命令提示符**或 **PowerShell** 中运行以下命令配置 Windows 上的凭据管理器
git config --global credential.helper wincred
-
配置 WSL 使用相同的凭据帮助程序,但在**WSL 终端**中运行以下命令
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"
现在,您在 Windows 端使用 Git 时输入的任何密码都可用于 WSL,反之亦然。
解决从 WSL 进行 Git push 或 sync 时挂起的问题
如果您使用 SSH 克隆 Git 仓库,并且您的 SSH 密钥带有密码短语,VS Code 的拉取和同步功能在远程运行时可能会挂起。
要么使用不带密码短语的 SSH 密钥,要么使用 HTTPS 克隆,或者从命令行运行 git push
来解决此问题。
GitHub Codespaces 技巧
有关 GitHub Codespaces 的技巧和问题,请参阅 GitHub Codespaces 文档。您还可以查看可能影响您的 Codespaces 的已知 Web 限制和适应性。
扩展技巧
虽然许多扩展都可以直接使用,但有一些问题可能会阻止某些功能按预期工作。在某些情况下,您可以使用其他命令来解决问题,而在其他情况下,可能需要修改扩展。本节提供了常见问题及其解决方法快速参考。您还可以参考关于支持远程开发的主要扩展文章,获取关于修改扩展以支持远程扩展主机的深入指南。
解决缺少依赖项的错误
某些扩展依赖于某些 WSL Linux 发行版基本安装中未找到的库。您可以使用其包管理器将附加库添加到您的 Linux 发行版中。对于基于 Ubuntu 和 Debian 的发行版,运行 sudo apt-get install <package>
安装所需的库。请查阅您的扩展或错误消息中提到的运行时的文档,以获取附加安装详细信息。
在远程应用时,本地绝对路径设置失败
当您连接到远程终结点时,VS Code 的本地用户设置会被重用。虽然这保持了您的用户体验一致,但由于目标位置不同,您可能需要在本地计算机和每个主机/容器/WSL 之间调整绝对路径设置。
**解决方法:** 连接到远程终结点后,您可以通过从命令面板 (F1) 运行“**首选项: 打开远程设置**”命令,或在设置编辑器中选择“**远程**”选项卡来设置特定于终结点的设置。这些设置会在您连接时覆盖任何现有的本地设置。
需要在远程终结点上安装本地 VSIX
有时您希望在远程计算机上安装本地 VSIX,无论是在开发期间还是在扩展作者要求您试用修复时。
**解决方法:** 连接到 SSH 主机、容器或 WSL 后,您可以通过与本地相同的方式安装 VSIX。从命令面板 (F1) 运行“**扩展: 从 VSIX 安装...**”命令。您可能还需要向 settings.json
添加 "extensions.autoUpdate": false
以防止自动更新到最新的 Marketplace 版本。有关在远程环境中开发和测试扩展的更多信息,请参阅支持远程开发。
浏览器未在本地打开
某些扩展使用外部 Node 模块或自定义代码来启动浏览器窗口。遗憾的是,这可能会导致扩展在远程而不是本地启动浏览器。
**解决方法:** 扩展可以使用 vscode.env.openExternal
API 来解决此问题。有关详细信息,请参阅扩展作者指南。
剪贴板无法工作
某些扩展使用 Node 模块,例如 clipboardy
,与剪贴板集成。遗憾的是,这可能会导致扩展错误地与远程端的剪贴板集成。
**解决方法:** 扩展可以切换到 VS Code 剪贴板 API 来解决此问题。有关详细信息,请参阅扩展作者指南。
无法从浏览器或应用程序访问本地 Web 服务器
在容器、SSH 主机内工作或通过 GitHub Codespaces 工作时,浏览器连接的端口可能被阻止。
**解决方法:** 扩展可以使用 vscode.env.openExternal
或 vscode.env.asExternalUri
API(它们会自动转发 localhost 端口)来解决此问题。有关详细信息,请参阅扩展作者指南。作为一种临时方法,请使用“**转发端口**”命令手动执行此操作。
Webview 内容未显示
如果扩展的 Webview 内容使用 iframe
连接到本地 Web 服务器,则 Webview 连接的端口可能被阻止。此外,如果扩展硬编码 vscode-resource://
URI 而不是使用 asWebviewUri
,则内容可能不会在 Codespaces 浏览器编辑器中显示。
**解决方法:** 扩展可以使用 webview.asWebviewUri
来解决 vscode-resource://
URI 的问题。
如果端口被阻止,最好的方法是使用webview 消息传递 API。作为一种临时方法,可以使用 vscode.env.asExternalUri
允许 webview 从 VS Code 连接到生成的 localhost Web 服务器。但是,目前这仅被 MicrosoftDocs/vscodespaces#11 阻止在基于浏览器的 Codespaces 编辑器中使用。有关临时方法的详细信息,请参阅扩展作者指南。
被阻止的 localhost 端口
如果您尝试从外部应用程序连接到 localhost 端口,则该端口可能被阻止。
**解决方法:** 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 Server 因不兼容而挂起或崩溃的情况。如果扩展立即激活,这可能会阻止您连接并无法卸载该扩展。
**解决方法:** 按照以下步骤手动删除远程扩展文件夹
-
对于容器,确保您的
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,请相应地连接到环境(运行
-
连接后,针对 VS Code 稳定版运行
rm -rf ~/.vscode-server/extensions
和/或针对 VS Code Insiders 运行rm -rf ~/.vscode-server-insiders/extensions
以删除所有扩展。
随扩展一起提供或获取预构建原生模块的扩展失败
与 VS Code 扩展捆绑(或动态获取)的原生模块必须使用 Electron 的 electron-rebuild
重新编译。但是,VS Code Server 运行的是标准的(非 Electron)Node.js 版本,这可能导致二进制文件在远程使用时失败。
**解决方法:** 需要修改扩展才能解决此问题。它们需要包含(或动态获取)两组二进制文件(Electron 和标准 Node.js),以对应 VS Code 附带的 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,由于 Alpine Linux (musl
) 和其他发行版 (glibc
) 实现 libc
的根本差异,包含的本机代码或运行时可能无法工作。
**解决方法:** 扩展需要通过编译/包含这些附加目标的二进制文件来选择支持这些平台。重要的是要注意,一些第三方 npm 模块也可能包含可能导致此问题的本机代码。因此,在某些情况下,您可能需要与 npm 模块作者合作添加额外的编译目标。有关详细信息,请参阅扩展作者指南。
扩展因缺少模块而失败
依赖 Electron 或 VS Code 基本模块(未由扩展 API 公开)但未提供回退的扩展在远程运行时可能会失败。您可能会在开发者工具控制台中看到类似 original-fs
未找到的错误。
**解决方法:** 删除对 Electron 模块的依赖或提供回退。有关详细信息,请参阅扩展作者指南。
无法访问/传输远程工作区文件到本地计算机
在外部应用程序中打开工作区文件的扩展可能会遇到错误,因为外部应用程序无法直接访问远程文件。
**解决方法:** 如果您创建一个旨在本地运行的“UI”扩展,可以使用 vscode.workspace.fs
API 与远程工作区文件系统交互。然后,您可以将其作为您的“工作区”扩展的依赖项,并根据需要使用命令调用它。有关不同类型的扩展以及如何在它们之间使用命令通信的详细信息,请参阅扩展作者指南。
无法从扩展访问附加设备
访问本地附加设备的扩展在远程运行时将无法连接到它们。
**解决方法:** 目前没有。我们正在调查解决此问题的最佳方法。
问题与反馈
报告问题
如果您在使用某个远程开发扩展时遇到问题,收集正确的日志非常重要,这样我们才能帮助您诊断问题。
每个远程扩展都有一个查看其日志的命令。
您可以通过命令面板 (F1) 使用“**Remote-SSH: 显示日志**”获取 Remote - SSH 扩展日志。报告 Remote - SSH 问题时,请同时确认您是否能够从外部终端(不使用 Remote - SSH)SSH 连接到您的机器。
同样,您可以使用“**开发容器: 显示容器日志**”获取开发容器扩展日志。
与上面两个类似,您可以使用“**WSL: 显示日志**”获取 WSL 扩展日志。同时检查您的问题是否在WSL 仓库中被上游跟踪(并且不是由于 WSL 扩展引起)。
如果您在使用其他扩展时遇到远程问题(例如,其他扩展在远程上下文中无法正常加载或安装),从**远程扩展主机**输出通道(**输出: 聚焦输出视图**)获取日志并从下拉菜单中选择**日志 (远程扩展主机)** 会很有帮助。
**注意**:如果您只看到**日志 (扩展主机)**,这是本地扩展主机,并且远程扩展主机未启动。这是因为日志通道只有在日志文件创建后才会创建,因此如果远程扩展主机未启动,远程扩展主机日志文件不会创建,也不会显示在输出视图中。这仍然是有用的信息,可以包含在您的问题中。
远程问题和反馈资源
我们有各种其他远程资源
- 请参阅远程开发常见问题。
- 在 Stack Overflow 上搜索。
- 添加功能请求或报告问题。