VSCode SSH 连接失败的根本原因是本地 OpenSSH 客户端配置与权限问题:私钥权限须为600、IdentityFile 必须用绝对路径、authorized_keys 格式与权限需严格正确、shell 初始化脚本不能阻塞、且 VSCode 不继承 ssh-agent 或自定义环境变量。

VSCode 本身不管理 SSH 权限,所有访问权限问题都来自你本地的 OpenSSH 客户端行为——只要 ssh 命令在终端里连不上,VSCode 就一定失败。
私钥文件权限必须是 600
OpenSSH 会直接跳过权限过宽的私钥,哪怕公钥已正确写入服务器,VSCode 也会静默 fallback 到密码登录或报 Permission denied (publickey)。
- 运行
chmod 600 ~/.ssh/id_rsa(把id_rsa换成你实际用的私钥名) - Windows 用户请在 Git Bash 或 WSL 中执行,PowerShell 的
icacls需手动收紧 NTFS 权限 - 别把私钥放在 OneDrive / iCloud 同步目录下——同步进程可能重置权限
~/.ssh/config 中 IdentityFile 必须写绝对路径
VSCode 解析配置时完全不支持 ~/ 缩写,IdentityFile ~/id_rsa 看似能用,实则被忽略。
- Linux/macOS 正确写法:
IdentityFile /home/yourname/.ssh/id_rsa - Windows(WSL 风格):
IdentityFile /c/Users/yourname/.ssh/id_rsa - Windows(PowerShell/OpenSSH):
IdentityFile C:\Users\yourname\.ssh\id_rsa - 加一行
IdentitiesOnly yes,避免被 ssh-agent 或其他密钥干扰
远程服务器上 ~/.ssh/authorized_keys 的细节陷阱
公钥粘贴后多一个空格、换行、中文字符,或末尾多了不可见符号,都会导致认证失败。
- 在服务器上运行
cat ~/.ssh/authorized_keys | hexdump -C | tail,确认结尾是0a(LF 换行),不是0d 0a(CRLF) - 确保整行是一条完整记录:以
ssh-rsa AAAA...开头,邮箱结尾,中间无断行 - 权限必须是
chmod 600 ~/.ssh/authorized_keys,目录chmod 700 ~/.ssh - 检查
/etc/ssh/sshd_config是否启用:PubkeyAuthentication yes,改完记得sudo systemctl restart sshd
连接卡在 “Setting up SSH Host” 时的真实原因
这不是权限问题,而是 VSCode 启动远程服务前需要解析 shell 初始化输出,任何干扰都会中断流程。
- 删掉
~/.bashrc开头的echo、clear、read或阻塞型命令 - 确认
grep ^$USER /etc/passwd返回的是/bin/bash或/bin/sh,不是/sbin/nologin - 手动运行
bash -ilc 'echo OK',如果没输出或报错,说明 shell 初始化脚本有语法错误 - Alpine/BusyBox 等精简系统需额外安装
procps(含ps)和psmisc(含kill)
最常被忽略的一点:VSCode 不继承你在终端里启动的 ssh-agent,也不读取 $PATH 中的自定义环境变量。所有认证和路径依赖,都得靠 ~/.ssh/config 和文件系统权限兜底。


















