vscode remote ssh 连接失败但命令行 ssh 可通,主因是未正确加载 ~/.ssh/config 或私钥权限非600;需从终端启动 code、用绝对路径指定 identityfile,并确保远程插件安装到位。

Remote SSH 扩展装了但连不上,ssh 命令行能通怎么办
VSCode 的 Remote SSH 本质是复用本地 ssh 客户端配置,不是自己实现一套连接逻辑。如果终端里 ssh user@host 能成功,但 VSCode 点“Connect to Host”卡在“Setting up SSH Host”或报 Could not establish connection to "xxx",大概率是 VSCode 没读到你的 ~/.ssh/config 或私钥权限不对。
实操建议:
- 确认 VSCode 启动方式:直接从终端运行
code(而非桌面图标),否则它可能看不到 shell 的环境变量和ssh-agent状态 - 检查
~/.ssh/config中对应 Host 的IdentityFile路径是否为绝对路径(如/Users/you/.ssh/id_rsa,不能写~/.ssh/id_rsa) - 私钥文件权限必须是
600:chmod 600 ~/.ssh/id_rsa,否则 OpenSSH 会静默拒绝加载 - Windows 用户注意:WSL 和 Windows 版 VSCode 的
ssh配置不互通,别混用%USERPROFILE%\.ssh\和/home/user/.ssh/
连接后打开的不是项目根目录,而是家目录
Remote SSH 默认登录后工作目录就是远程用户的家目录,不会自动 cd 到你期望的代码路径。这不是 bug,是设计如此——它只建立连接,不预设上下文。
实操建议:
- 连接成功后,在 VSCode 的资源管理器里手动点击右上角“Open Folder”,再选远程服务器上的项目路径(比如
/var/www/myapp) - 更省事的办法:在
~/.ssh/config里加一行RemoteCommand cd /path/to/project && $SHELL -l(仅限支持RemoteCommand的 OpenSSH 版本,且需关闭RequestTTY) - 不推荐改
~/.bashrc自动 cd:VSCode 的 Remote SSH 启动的是非交互式 shell,很多 rc 文件不会被 source
编辑保存后文件没实时同步,或者提示“Permission denied”
Remote SSH 是直连远程文件系统,所有读写都走 SSH 协议,不存在“本地编辑再上传”的中间环节。所谓“不同步”通常是权限或挂载方式导致的假象。
常见错误现象:
- 保存时弹出
Unable to write file ... Permission denied:说明当前 VSCode 进程以用户 A 登录,但目标文件属主是用户 B,且无写权限 - 改了代码,服务没反应:不是文件没保存,而是你没重启服务,或服务监听的是另一个路径(比如用
npm run dev启的服务默认只 watch 当前目录,而你打开的是父目录) - 用 Docker 容器开发时发现文件修改不生效:因为容器内挂载的是宿主机目录,但 VSCode 连的是宿主机,此时你编辑的是宿主机文件,容器内看到的确实是实时的——除非你用了 volume driver 或缓存策略
关键点:Remote SSH 不做文件同步,它让你像在本地一样操作远程磁盘。所以一切权限、路径、服务配置问题,都要按纯远程 Linux 操作去排查。
为什么有些插件在远程端不生效,比如 ESLint 或 Prettier
Remote SSH 把插件分成了两类:前端插件(运行在本地 VSCode 进程)和后端插件(安装在远程服务器上)。像 ESLint 这种需要调用 Node.js 二进制、读取 .eslintrc 的,必须装在远程。
实操建议:
- 打开命令面板(
Ctrl+Shift+P),运行Extensions: Install Extensions on SSH,再搜 ESLint,确保勾选“Install on SSH: xxx” - 检查远程服务器是否已安装对应语言环境:比如 Prettier 依赖
node,ESLint 依赖eslintCLI,这些必须在远程$PATH里可执行 - 不要在本地全局安装
eslint并指望它远程起作用——Remote SSH 不转发本地 CLI 调用 - 某些插件(如 GitLens)会同时需要本地和远程组件,留意它的文档是否明确写了 Remote SSH 支持状态
最常被忽略的一点:Remote SSH 的“远程”指的是你 ssh 登录进去的那个用户环境。它不等价于“整个服务器”,也不绕过 shell 权限模型。任何你以为“应该能行”的操作,先在终端里用同一用户跑一遍,再对照看 VSCode 里哪一步断了——这才是最快定位问题的方式。











