☰
VSCode远程开发免密码登录
2026/10/17 10:35:58 网站建设 项目流程

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'

输入一次服务器密码。首次连接如果出现主机指纹确认,应确认服务器身份后再继续。

这条命令会:

  1. 使用服务器密码登录,避免已有密钥干扰这次安装。
  2. 创建当前登录用户的~/.ssh目录。
  3. 将本机公钥追加到~/.ssh/authorized_keys,保留原有公钥。
  4. 将目录权限设为700、文件权限设为600。
  5. 将目录和文件的所有者设为当前登录用户及其主组。

注意-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~/.ssh
cat>>~/.ssh/authorized_keys

粘贴新电脑的公钥,按一次Enter,再在空行按Ctrl+D结束输入,直到重新出现服务器命令提示符。

cat输入过程中不要用退格键修补公钥,也不要重复粘贴。若粘贴出错,结束输入后按下文的方法检查并清理错误行。

设置权限:

chmod700~/.ssh
chmod600~/.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 密钥认证

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询