VS Code 远程开发每次都要输入密码?使用 SSH 密钥解决
文章目录
- VS Code 远程开发每次都要输入密码?使用 SSH 密钥解决
- 环境与示例
- 1. 生成 SSH 密钥
- 2. 将公钥安装到服务器
- 3. 配置 VS Code 的 SSH 连接
- 4. 如果私钥设了口令,配置 ssh-agent
- 5. 先验证命令行,再连接 VS Code
- 排查:为什么配置密钥后仍要求密码?
- 先确认是哪种密码
- 用日志判断失败发生在哪里
- 重新安装后仍失败
- 命令行能登录,但 VS Code 仍要求密码
- 补充:另一台电脑如何免密码登录同一个服务器
- 上传公钥时出现 Permission denied, please try again
- 通过原电脑为新电脑添加授权
- 查看服务器授权了哪些密钥
- 删除公钥
- 先备份,再确认行号
- 情况 A:清理错误行,保留两台电脑
- 情况 B:撤销新电脑授权,只保留原电脑
- 删除后验证
- 参考资料
使用 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 密钥
先检查是否已有密钥:
Test-Path"$env:USERPROFILE\.ssh\id_ed25519"Test-Path"$env:USERPROFILE\.ssh\id_ed25519.pub"如果两个结果都是True,可以使用已有密钥。如果没有密钥,执行:
ssh-keygen-t ed25519按三次回车就生成密钥了。
如果已有密钥,运行命令就会是以下这种情况,保存位置可以直接按回车,使用默认路径。若提示文件已存在,不要直接覆盖,以免影响其他服务器的登录,如下图。
生成后会得到两个文件:
| 文件 | 用途 |
|---|---|
id_ed25519 | 私钥,保留在本机,不要上传或公开 |
id_ed25519.pub | 公钥,添加到服务器 |
生成时还可以设置私钥口令。设置口令后,可通过后面的ssh-agent步骤减少重复输入;留空则不需要解锁私钥,但任何能读取该私钥的人都可能使用它登录。
2. 将公钥安装到服务器
在Windows PowerShell执行(记得改端口和后面的root@203.0.113.10):
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。
点击第一个进去之后,将对应服务器配置为:
Host my-server HostName 203.0.113.10 Port 23 User root IdentityFile C:/Users/你的Windows用户名(我的是LZJ)/.ssh/id_ed25519 IdentitiesOnly yes将IdentityFile替换成真实的私钥路径。也可以使用:
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,执行:
Set-Servicessh-agent-StartupType AutomaticStart-Servicessh-agent然后回到普通 PowerShell,以平时使用 VS Code 的 Windows 账户执行:
ssh-add"$env:USERPROFILE\.ssh\id_ed25519"输入一次私钥口令,再检查密钥是否已加入:
ssh-add-l如果私钥没有口令,可以跳过本节。
5. 先验证命令行,再连接 VS Code
在 Windows PowerShell 执行(记得改端口和后面的root@203.0.113.10):
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):
ssh-vv-p 23-i"$env:USERPROFILE\.ssh\id_ed25519"-o PreferredAuthentications=publickey root@203.0.113.10本次问题的日志中出现了:
Offering public key: ...id_ed25519... Authentications that can continue: publickey,password ... Permission denied (publickey,password).这表示客户端已经找到密钥并向服务器发送公钥,但服务器没有接受。此时应检查服务器上的公钥、文件权限和认证策略。
本次通过第 2 步重新安装当前公钥并修正权限后解决。由于该步骤同时更新了公钥和权限,无法仅凭日志确定原先究竟是哪一项有误。
重新安装后仍失败
先通过密码登录服务器(记得改端口和后面的root@203.0.113.10):
ssh-p 23-o PubkeyAuthentication=no-o PreferredAuthentications=password root@203.0.113.10然后在Linux 服务器上检查权限:
ls-ld~ ~/.ssh ~/.ssh/authorized_keys确认.ssh和authorized_keys属于登录用户,目录权限通常为700,文件权限为600,用户主目录不应允许其他用户随意写入。
管理员还可以查看 SSH 的基础有效配置:
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,也需要核对。
补充:另一台电脑如何免密码登录同一个服务器
原电脑配置成功后,另一台电脑连接同一服务器,仍然提示输入密码。这是因为密钥保存在各自电脑上:原电脑获得授权,不代表新电脑也自动获得授权。
推荐每台电脑使用独立密钥,并把各自的公钥添加到服务器。这样可以单独撤销某台电脑的授权,不需要复制私钥。
上传公钥时出现 Permission denied, please try again
这次在新电脑执行第 2 节的上传命令后,出现:
root@203.0.113.10's password: Permission denied, please try again.该命令显式使用密码认证。这个提示说明服务器没有接受输入的密码,上传过程还没有进入远程命令执行阶段,公钥也没有因此安装成功。仅凭这段输出,不能确定是密码输入错误还是服务器认证限制。
此时可以按Ctrl+C取消,通过原来已经能登录的电脑添加新公钥。
通过原电脑为新电脑添加授权
第一步:在新电脑的 Windows PowerShell 中准备公钥。
先按照第 1 节检查密钥;没有密钥时再执行:
ssh-keygen-t ed25519然后输入以下命令,回车显示公钥:
Get-Content"$env:USERPROFILE\.ssh\id_ed25519.pub"复制输出的完整一行,从ssh-ed25519开始,包含后面的密钥和可选备注。
第二步:通过原电脑或已有 Xshell 会话登录服务器。
在服务器终端执行:
mkdir-p~/.sshcat>>~/.ssh/authorized_keys粘贴新电脑的公钥,按一次Enter,再在空行按Ctrl+D结束输入,直到重新出现服务器命令提示符。
cat输入过程中不要用退格键修补公钥,也不要重复粘贴。若粘贴出错,结束输入后按下文的方法检查并清理错误行。
设置权限:
chmod700~/.sshchmod600~/.ssh/authorized_keys>>表示追加,不会覆盖原电脑的公钥;单个>会覆盖文件,不要混用。正常情况下,多台电脑的公钥各占一行,互不影响。
第三步:回到新电脑测试。
记得改端口和后面的账户@主机
ssh-p 23-i"$env:USERPROFILE\.ssh\id_ed25519"-o PreferredAuthentications=publickey root@203.0.113.10命令行验证成功后,再配置新电脑的 VS Code。
如果新电脑的私钥设置了口令,还需要在新电脑单独配置第 4 节的ssh-agent。
查看服务器授权了哪些密钥
在服务器终端执行:
cat-n~/.ssh/authorized_keys它会显示文件内容和行号。末尾的用户名@电脑名是备注,可以帮助识别,但备注可以修改,不能作为可靠的身份依据。
查看公钥指纹:
ssh-keygen-lf~/.ssh/authorized_keys在对应电脑的 Windows PowerShell 中查看本机公钥指纹:
ssh-keygen-lf"$env:USERPROFILE\.ssh\id_ed25519.pub"两边的SHA256:...相同,就对应同一把密钥。空行或格式损坏的行不能作为有效授权使用,需要结合原始文件内容检查。
删除公钥
先备份,再确认行号
在服务器终端执行以下命令,生成带时间的备份并显示内容:
key_backup="$HOME/.ssh/authorized_keys.bak.$(date+%Y%m%d-%H%M%S)"cp-p~/.ssh/authorized_keys"$key_backup"printf'备份文件:%s\n'"$key_backup"cat-n~/.ssh/authorized_keys运行结果如下,下面的密钥内容只是示意,不能用于登录:
1 ssh-ed25519 <原电脑公钥> user@old-pc 2 2ssh-ed25519 <新电脑公钥> user@new-pc 3 ssh-ed25519 <新电脑公钥> user@new-pc第 2 行多出了前缀字符2,格式损坏;第 3 行才是有效的新电脑公钥。第 2、3 行对应相同的公钥内容。
情况 A:清理错误行,保留两台电脑
只删除第 2 行:
sed-i'2d'~/.ssh/authorized_keys情况 B:撤销新电脑授权,只保留原电脑
删除第 2、3 行:
sed-i'2,3d'~/.ssh/authorized_keys情况 A 和 B 只用选择一种。行号以执行前的cat -n输出为准,不能直接照搬命令中的数字。如果已删除过一行,后面的行号会变化,下一次操作前必须重新查看。
删除后验证
cat-n~/.ssh/authorized_keys ssh-keygen-lf~/.ssh/authorized_keys同一公钥如果重复出现在多行,撤销授权时需要删除其所有有效条目。仅删除一个重复项,其他有效条目仍可用于登录。
先保持当前远程会话,另开窗口测试需要保留的电脑能否重新登录,再关闭当前会话。删除公钥会阻止使用该公钥建立新的连接,不会立即终止已经建立的会话;如果服务器仍允许密码等其他认证方式,目标电脑仍可能通过其他方式登录。
如果误删,可以在当前会话中恢复刚才的备份:
cp-p"$key_backup"~/.ssh/authorized_keys这个变量只在设置它的当前 shell 中有效;如果换了会话,需要使用实际的备份文件路径。恢复整份备份也会恢复其中已删除的授权,因此只应在确实需要回退时使用。
参考资料
- VS Code Remote - SSH 官方文档
- VS Code:配置 SSH 密钥认证