ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VS Code Remote-SSH 连接失败问题排查与解决实录

VS Code Remote-SSH 连接失败问题排查与解决实录

背景

在使用 VS Code 的 Remote-SSH 扩展连接远程服务器时,遇到长时间卡在“Install and start server if needed”阶段,最终连接失败。本文记录了从问题现象到根本原因定位,再到最终解决的全过程,希望对遇到类似问题的开发者有所帮助。

环境信息

  • 本地操作系统:Windows 10/11
  • VS Code 版本:1.108.1
  • Remote-SSH 扩展版本:0.122.0
  • 远程服务器:Linux 服务器,IP 140.143.17.2
  • SSH 客户端:Windows 自带的 OpenSSH_for_Windows_9.5p1

问题现象

在 VS Code 中尝试通过 Remote-SSH 连接远程服务器,输出日志卡在以下内容后无响应或最终报错:

[20:51:16.672] Install and start server if needed
...
[20:51:18.939] Bad permissions. Try removing permissions for user: WIN-78ER1CEPHED\CodexSandboxUsers on file C:/Users/Administrator/.ssh/config.
[20:51:19.285] Resolver error: Error
...

后续日志中还会出现:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Host key verification failed.

逐步排查与解决

第一步:识别日志中的关键错误

将 Remote-SSH 的输出级别调整为 2(调试模式)后,获得详细日志。其中两条最重要的错误信息:

  1. 本地 SSH config 文件权限错误
    Bad owner or permissions on C:\\Users\\Administrator/.ssh/config

  2. 远程主机密钥变更警告
    Host key for 140.143.17.2 has changed

这两条错误都会导致 SSH 客户端拒绝连接或提前终止管道,从而使得 VS Code 无法完成远程服务器的初始化。

第二步:修复 .ssh/config 权限问题

问题原因

Windows 上的 OpenSSH 客户端对 %USERPROFILE%\.ssh\config 文件的权限要求非常严格:该文件只能被当前用户读取和写入,任何其他用户或组的访问权限都会导致 SSH 拒绝使用该文件。

日志中明确指出了多余的用户:

WIN-78ER1CEPHED\CodexSandboxUsers

解决方案

使用 icacls 命令移除多余用户权限,并确保只有当前用户拥有完全控制权。

方法一:命令行(推荐)
以管理员身份打开 PowerShell 或 CMD,执行:

icacls "%USERPROFILE%\.ssh\config" /remove "WIN-78ER1CEPHED\CodexSandboxUsers"

更彻底的做法是重置整个 .ssh 目录的权限:

icacls "%USERPROFILE%\.ssh" /reset
icacls "%USERPROFILE%\.ssh" /grant:r "%USERNAME%:(F)" /inheritance:r
icacls "%USERPROFILE%\.ssh\*" /reset
icacls "%USERPROFILE%\.ssh\*" /grant:r "%USERNAME%:(F)" /inheritance:r

方法二:图形界面

  • 右键 .ssh\config → 属性 → 安全
  • 在用户组列表中选中 CodexSandboxUsers,点击“删除”
  • 确保列表中只保留当前用户(以及可选的 SYSTEM/Administrators)
  • 确定保存

验证权限修复:

icacls "%USERPROFILE%\.ssh\config"

输出中不应再出现 CodexSandboxUsers 字样。

第三步:处理主机密钥变更警告

完成权限修复后,重新连接时日志变为:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Offending ECDSA key in C:\\Users\\Administrator/.ssh/known_hosts:8
Host key for 140.143.17.2 has changed

这表示远程服务器的主机密钥与本地 known_hosts 中保存的记录不匹配。常见原因:服务器重装系统、更换 SSH 服务密钥,或者该 IP 被分配给另一台服务器。

解决方案

使用 ssh-keygen 命令删除旧的主机密钥记录:

ssh-keygen -R 140.143.18.2

执行后,known_hosts 中与该 IP 相关的行会被删除。然后重新连接,SSH 会提示接受新的主机密钥,输入 yes 即可。

注意:如果对安全性有极高要求,建议联系服务器管理员确认新指纹是否真实。一般情况下,确认服务器是自己可控的即可接受。

最终结果

完成上述两步后,VS Code Remote-SSH 能够顺利连接远程服务器,并自动下载、安装 VS Code Server,最终打开远程开发窗口。

经验总结

  1. 日志是排查问题的第一手资料
    Remote-SSH 扩展提供了详细的输出日志(可通过命令面板 Remote-SSH: Show Log 查看),务必开启调试模式(remote.SSH.loglevel = 2)以获得完整信息。

  2. Windows SSH 客户端对权限要求苛刻
    %USERPROFILE%\.ssh 目录及其下的所有文件(configid_rsaknown_hosts 等)都应该只允许当前用户访问。任何多余的 ACE(访问控制项)都会导致 SSH 拒绝工作。

  3. 主机密钥变更是常见现象
    当服务器重装系统、更换 IP 或首次连接时,都会出现主机密钥警告。正确使用 ssh-keygen -R 清理旧记录即可。

  4. 注意错误连锁反应
    权限错误导致 SSH 连接异常终止,进而引发 VS Code 无法解析远程端口和平台信息,出现 WARN: $PLATFORM is undefined 等后续错误。解决根本原因后,这些问题会自然消失。

  5. 建议的配置文件权限维护
    定期检查 .ssh 目录权限,避免其他软件(如某些备份工具或安全软件)无意中添加了额外用户权限。

附录:一键修复脚本(Windows)

将以下内容保存为 fix-ssh-permissions.bat,以管理员身份运行:

@echo off
set SSH_DIR=%USERPROFILE%\.ssh
if not exist "%SSH_DIR%" (echo .ssh directory not found, creating...mkdir "%SSH_DIR%"
)
echo Resetting permissions for %SSH_DIR% and its contents...
icacls "%SSH_DIR%" /reset
icacls "%SSH_DIR%" /grant:r "%USERNAME%:(F)" /inheritance:r
icacls "%SSH_DIR%\*" /reset 2>nul
icacls "%SSH_DIR%\*" /grant:r "%USERNAME%:(F)" /inheritance:r 2>nul
echo Done. Please restart VS Code and try connecting again.
pause

运行此脚本可快速解决 Windows 上常见的 .ssh 权限问题。

返回列表