VS Code 远程开发每次都要输入密码?使用 SSH 密钥解决
使用 VS Code 的 Remote - SSH 连接 Linux 服务器时,每次重新打开编辑器都要输入服务器密码。想实现免密码连接,可以配置 SSH 密钥认证:私钥留在 Windows 本机,公钥安装到服务器。
本文记录一次实际排查过程。最终发现,本机已经正确使用密钥,但服务器没有接受对应公钥。重新安装公钥并修正权限后,连接恢复正常。
环境与示例
- 本机:Windows,使用 PowerShell。
- 远程:Linux,使用 VS Code Remote - SSH。
- 示例服务器:
203.0.113.10,请替换为自己的地址。 - SSH 端口:
23,请替换为实际端口;默认通常是22。 - 登录用户:
root,请替换为实际用户。
以下 Windows 命令都在本机 PowerShell 执行,不是在 VS Code 的远程终端执行。
1. 生成 SSH 密钥
先检查是否已有密钥:
powershell
Test-Path "$env:USERPROFILE\.ssh\id_ed25519"
Test-Path "$env:USERPROFILE\.ssh\id_ed25519.pub"

如果两个结果都是 True,可以使用已有密钥。如果没有密钥,执行:
powershell
ssh-keygen -t ed25519
保存位置可以直接按回车,使用默认路径。若提示文件已存在,不要直接覆盖,以免影响其他服务器的登录,如下图。

生成后会得到两个文件:
| 文件 | 用途 |
|---|---|
id_ed25519 |
私钥,保留在本机,不要上传或公开 |
id_ed25519.pub |
公钥,添加到服务器 |
生成时还可以设置私钥口令。设置口令后,可通过后面的 ssh-agent 步骤减少重复输入;留空则不需要解锁私钥,但任何能读取该私钥的人都可能使用它登录。
2. 将公钥安装到服务器
在 Windows PowerShell 执行(记得改端口和后面的root@203.0.113.10):
powershell
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh -p 23 -o PubkeyAuthentication=no -o PreferredAuthentications=password root@203.0.113.10 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys; chown "$(id -un):$(id -gn)" ~/.ssh ~/.ssh/authorized_keys'
输入一次服务器密码。首次连接如果出现主机指纹确认,应确认服务器身份后再继续。
这条命令会:
- 使用服务器密码登录,避免已有密钥干扰这次安装。
- 创建当前登录用户的
~/.ssh目录。 - 将本机公钥追加到
~/.ssh/authorized_keys,保留原有公钥。 - 将目录权限设为
700、文件权限设为600。 - 将目录和文件的所有者设为当前登录用户及其主组。
注意 -p 23:如果服务器使用自定义 SSH 端口,上传公钥和测试连接时都要指定同一个端口,我这里服务器指定的端口是23。
如果服务器禁用了密码登录,需要通过已有登录方式或管理控制台安装公钥。
3. 配置 VS Code 的 SSH 连接
在 VS Code 中按 F1,搜索 Remote-SSH: Open SSH Configuration File... (输入前面几个其实就会跳出来了),选择实际使用的 SSH 配置文件,通常是 Windows 用户目录中的 .ssh/config。


点击第一个进去之后,将对应服务器配置为:
sshconfig
Host my-server
HostName 203.0.113.10
Port 23
User root
IdentityFile C:/Users/你的Windows用户名(我的是LZJ)/.ssh/id_ed25519
IdentitiesOnly yes
将 IdentityFile 替换成真实的私钥路径。也可以使用:
sshconfig
IdentityFile ~/.ssh/id_ed25519
其中,Host 是 VS Code 中显示的连接名称,HostName 是服务器地址。IdentityFile 指向私钥,不是 .pub 公钥文件。
保存后执行 Remote-SSH: Connect to Host... ,选择 my-server。
4. 如果私钥设了口令,配置 ssh-agent
服务器密码和私钥口令是两回事。密钥认证成功后,如果仍提示 Enter passphrase for key ...,要求输入的是私钥口令。
以管理员身份打开 Windows PowerShell,执行:
powershell
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
然后回到普通 PowerShell,以平时使用 VS Code 的 Windows 账户执行:
powershell
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"
输入一次私钥口令,再检查密钥是否已加入:
powershell
ssh-add -l
如果私钥没有口令,可以跳过本节。
5. 先验证命令行,再连接 VS Code
在 Windows PowerShell 执行(记得改端口和后面的root@203.0.113.10):
powershell
ssh -p 23 -i "$env:USERPROFILE\.ssh\id_ed25519" -o PreferredAuthentications=publickey root@203.0.113.10
这条命令只尝试公钥认证。如果能够登录且没有要求服务器密码,就说明密钥登录已经成功。执行 exit 返回本机后,再重新连接 VS Code。

排查:为什么配置密钥后仍要求密码?
先确认是哪种密码
| 提示 | 含义 |
|---|---|
root@服务器地址 的密码 或 password |
仍要求服务器账户密码,需要检查公钥认证 |
Enter passphrase for key ... |
要求解锁本机私钥,可检查 ssh-agent |
用日志判断失败发生在哪里
执行(记得改端口和后面的root@203.0.113.10):
powershell
ssh -vv -p 23 -i "$env:USERPROFILE\.ssh\id_ed25519" -o PreferredAuthentications=publickey root@203.0.113.10
本次问题的日志中出现了:
text
Offering public key: ...id_ed25519...
Authentications that can continue: publickey,password
...
Permission denied (publickey,password).
这表示客户端已经找到密钥并向服务器发送公钥,但服务器没有接受。此时应检查服务器上的公钥、文件权限和认证策略。
本次通过第 2 步重新安装当前公钥并修正权限后解决。由于该步骤同时更新了公钥和权限,无法仅凭日志确定原先究竟是哪一项有误。
重新安装后仍失败
先通过密码登录服务器(记得改端口和后面的root@203.0.113.10):
powershell
ssh -p 23 -o PubkeyAuthentication=no -o PreferredAuthentications=password root@203.0.113.10
然后在 Linux 服务器上检查权限:
bash
ls -ld ~ ~/.ssh ~/.ssh/authorized_keys
确认 .ssh 和 authorized_keys 属于登录用户,目录权限通常为 700,文件权限为 600,用户主目录不应允许其他用户随意写入。
管理员还可以查看 SSH 的基础有效配置:
bash
sshd -T | grep -E '^(pubkeyauthentication|permitrootlogin|authorizedkeysfile|authenticationmethods|strictmodes) '
主要关注:
pubkeyauthentication是否允许公钥认证。authorizedkeysfile是否指向实际安装公钥的位置。- 使用 root 时,
permitrootlogin是否允许公钥登录;prohibit-password允许 root 使用公钥登录。 authenticationmethods是否要求公钥之外再提供密码或其他认证。
如果服务器配置了 Match 条件,实际连接的设置可能不同,需要结合连接用户、客户端地址及服务器认证日志检查。不要为了免密码登录直接关闭权限检查或放宽服务器认证策略。
命令行能登录,但 VS Code 仍要求密码
检查 VS Code 是否使用了相同的服务器地址、端口、用户和私钥。通过 Remote-SSH: Show Log 查看连接日志,确认它实际使用的 SSH 程序和配置文件;如果设置过 remote.SSH.path 或 remote.SSH.configFile,也需要核对。
本次解决结果
问题的关键证据是客户端日志中的 Offering public key,以及服务器随后继续要求其他认证。重新安装对应公钥、修正服务器目录和文件权限后,公钥登录成功,VS Code 重新连接也无需输入服务器密码。