VSCode Remote-SSH连接服务器必看:如何用scp命令免密传输密钥文件(Windows→Ubuntu实战)
告别重复输入:在Windows与Ubuntu间构建无缝的VSCode Remote-SSH连接
每次打开VSCode,准备在远程服务器上沉浸式编码时,却被弹出的密码输入框打断思路,这种感觉确实令人沮丧。对于频繁使用VSCode Remote-SSH插件连接Ubuntu服务器的开发者而言,这种重复的身份验证不仅是效率的杀手,也破坏了工作流的连贯性。问题的核心在于SSH连接的认证方式——密码认证在便捷性上远不如密钥认证。本文将深入探讨如何彻底解决这一问题,不仅教你生成和部署SSH密钥,更会带你理解其背后的安全逻辑,并掌握一套在Windows与Linux系统间高效、安全传输文件的命令行方法。无论你是追求极致效率的资深开发者,还是希望深入理解SSH机制的技术爱好者,这篇实战指南都将为你提供一套清晰、可靠且一劳永逸的解决方案。
1. 理解SSH密钥认证:安全与便捷的基石
在深入操作之前,我们有必要先厘清一个核心概念:为什么SSH密钥认证比密码认证更优?简单来说,密码认证依赖于“你知道什么”(即密码),而密钥认证依赖于“你拥有什么”(私钥)和“服务器知道什么”(公钥)。这是一种非对称加密技术的典型应用。
当你使用ssh-keygen生成密钥对时,实际上创建了两个数学上紧密关联的文件:
- 私钥 (
id_rsa):这是一个必须严格保密的文件,相当于你的数字身份“锁”。它存储在你的本地客户端(如你的Windows电脑)上,不应与任何人分享。 - 公钥 (
id_rsa.pub):这是一个可以公开分发的文件,相当于“锁”对应的“钥匙模子”。它需要被放置到你希望登录的远程服务器(Ubuntu)上的特定位置。
认证过程可以类比为:你用私钥(锁)对一个随机挑战进行签名,服务器用你事先存放好的公钥(钥匙模子)来验证这个签名是否匹配。匹配成功,则身份通过。这种方式彻底避免了在网络中传输密码,从根本上杜绝了密码被窃听的风险。同时,一旦密钥对建立,只要私钥在手,你就可以实现免密登录,无需记忆和输入复杂的密码。
对于VSCode Remote-SSH而言,配置好密钥认证后,插件在建立连接时会自动使用本地的私钥进行身份验证,从而绕过繁琐的密码输入环节,实现“一键连接”的流畅体验。
2. 在Windows系统上生成你的专属SSH密钥对
整个流程的起点,是在你的本地Windows机器上创建一对独一无二的SSH密钥。我们将使用Windows系统自带的PowerShell或Windows Terminal来完成,无需安装任何额外软件。
打开PowerShell(以普通用户权限即可),输入以下命令:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
让我们拆解一下这个命令的参数:
-t rsa:指定生成的密钥类型为RSA。这是目前最广泛兼容的算法。-b 4096:指定密钥的位数为4096位。相比默认的2048位,4096位提供了更强的安全性,是当前推荐的标准。-C "your_email@example.com":为密钥添加一个注释,通常使用你的邮箱地址。这有助于你日后识别这个密钥的用途。
执行命令后,你会看到一系列交互提示:
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\YourUsername/.ssh/id_rsa):
第一个提示是询问密钥的保存路径和文件名。直接按回车,使用默认路径 C:\Users\你的用户名\.ssh\id_rsa。这个.ssh目录是SSH客户端的标准配置目录。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
接下来是设置密钥的通行短语。这是一个额外的安全层。我强烈建议你设置一个强密码短语。即使你的私钥文件不慎泄露,没有这个通行短语也无法使用它。当然,如果你追求极致的便捷性,且能确保私钥文件的安全(例如,仅存放在个人加密的电脑上),也可以直接按两次回车留空。请根据你的安全需求权衡。
注意:如果你选择设置通行短语,在每次使用该密钥进行SSH连接时(包括VSCode首次连接新会话时),系统可能会提示你输入这个短语。你可以通过SSH-Agent来管理,实现一次输入,多次使用。
生成成功后,你会在 C:\Users\你的用户名\.ssh\ 目录下看到两个新文件:
id_rsa:你的私钥文件。权限应非常严格(仅用户可读)。id_rsa.pub:你的公钥文件。内容是一长串以ssh-rsa开头的文本。
你可以用以下命令查看公钥内容,确认生成无误:
cat ~/.ssh/id_rsa.pub
3. 跨越系统鸿沟:使用SCP安全传输公钥至Ubuntu服务器
密钥生成后,下一步是将公钥文件 id_rsa.pub 安全地传输到远程Ubuntu服务器上。我们将使用 scp(Secure Copy Protocol)命令,它是基于SSH的文件传输工具,安全且无需额外安装。
传输的核心命令格式如下:
scp [本地文件路径] [远程用户名]@[远程服务器IP地址]:[远程目标路径]
假设你的情况是:
- 本地公钥路径:
C:\Users\YourUsername\.ssh\id_rsa.pub - 远程服务器IP:
192.168.1.100 - 远程用户名:
ubuntu - 你希望将公钥暂时放到远程用户的家目录下(例如
/home/ubuntu/)
那么,在Windows PowerShell中执行的命令就是:
scp C:\Users\YourUsername\.ssh\id_rsa.pub ubuntu@192.168.1.100:/home/ubuntu/
第一次执行此命令或连接新服务器时,你会看到关于主机密钥验证的提示,输入 yes 继续。然后,系统会提示你输入远程用户 ubuntu 的登录密码。输入正确密码后,传输便会开始。
传输成功后,你会在PowerShell中看到类似以下的进度反馈:
id_rsa.pub 100% 567 10.5KB/s 00:00
提示:在Windows路径中使用反斜杠
\时,如果路径包含空格,请务必使用引号将整个路径括起来,例如"C:\Users\My Name\.ssh\id_rsa.pub"。使用正斜杠/通常兼容性更好,如C:/Users/YourUsername/.ssh/id_rsa.pub。
为了确保文件已正确送达,你可以立即通过SSH登录服务器查看:
ssh ubuntu@192.168.1.100
# 输入密码登录后
ls -la /home/ubuntu/id_rsa.pub
4. 在Ubuntu服务器上配置授权密钥
公钥文件上传到服务器后,并不能直接生效。我们需要将其内容添加到对应用户的授权密钥列表中。标准的做法是将其追加到 ~/.ssh/authorized_keys 文件的末尾。
登录到你的Ubuntu服务器(如果刚才已登录,可继续操作),执行以下步骤:
首先,确保 .ssh 目录存在且权限正确。家目录下的 .ssh 目录权限应为 700(仅所有者可读、写、执行),authorized_keys 文件权限应为 600(仅所有者可读、写)。
# 如果 .ssh 目录不存在,则创建它
mkdir -p ~/.ssh
# 设置 .ssh 目录的正确权限
chmod 700 ~/.ssh
接下来,将我们刚刚上传的公钥文件内容,添加到授权文件末尾:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
然后,设置 authorized_keys 文件的权限:
chmod 600 ~/.ssh/authorized_keys
最后,为了安全起见,可以删除临时上传的公钥文件:
rm ~/id_rsa.pub
现在,最关键的一步来了:在服务器端,确保SSH服务配置允许公钥认证。编辑SSH服务器配置文件:
sudo nano /etc/ssh/sshd_config
检查并确认以下关键参数设置正确(通常默认已是如此):
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication yes # 在测试成功前,建议先保持为yes,测试成功后再考虑改为no以禁用密码登录,增强安全。
修改配置后,需要重启SSH服务使配置生效:
sudo systemctl restart sshd
5. 测试与验证:完成VSCode免密连接闭环
所有配置完成后,是时候进行最终测试了。我们首先在命令行验证密钥认证是否工作。
在不关闭当前SSH会话(你仍通过密码登录着)的情况下,新开一个Windows PowerShell窗口,尝试使用密钥登录:
ssh -i C:\Users\YourUsername\.ssh\id_rsa ubuntu@192.168.1.100
如果之前设置了密钥通行短语,此时会提示你输入。如果未设置且一切配置正确,你应该能直接登录到服务器,而不再需要输入用户密码。这证明密钥认证已成功配置。
现在,打开VSCode,配置Remote-SSH。点击左下角的绿色远程连接图标,选择“Connect to Host...”,然后选择“Configure SSH Hosts...”,编辑你的SSH配置文件(通常是 C:\Users\YourUsername\.ssh\config)。
为你的服务器添加一个清晰的主机配置。一个结构良好的配置示例如下:
Host my-ubuntu-server
HostName 192.168.1.100
User ubuntu
IdentityFile C:\Users\YourUsername\.ssh\id_rsa
# 可选:为稳定性添加以下参数
ServerAliveInterval 60
ServerAliveCountMax 3
保存配置文件后,在VSCode的远程资源管理器中,你应该能看到 my-ubuntu-server 这个主机选项。点击连接。
如果这是首次通过密钥连接,且你设置了通行短语,VSCode或系统可能会弹出对话框让你输入通行短语。输入正确后,VSCode将会建立连接并开始加载远程环境。从此以后,只要你使用相同的私钥和配置,打开该远程文件夹或连接该主机,都将实现免密直连。
6. 进阶技巧与故障排查指南
即使按照步骤操作,有时也可能遇到问题。以下是一些常见故障场景及其解决方案,以及可以进一步提升体验的进阶技巧。
常见问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
Permission denied (publickey). |
1. 公钥未正确加入authorized_keys。2. 服务器 ~/.ssh或authorized_keys文件权限过宽。3. SSH服务配置未启用公钥认证。 |
1. 检查authorized_keys文件内容是否正确、完整。2. 在服务器执行 chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys。3. 检查 /etc/ssh/sshd_config中PubkeyAuthentication是否为yes,并重启sshd。 |
| VSCode仍要求输入用户密码 | 1. VSCode未使用指定的私钥文件。 2. SSH配置文件( config)路径或语法错误。 |
1. 检查SSH配置中IdentityFile路径是否正确指向你的私钥(id_rsa)。2. 在PowerShell用 ssh -vT my-ubuntu-server查看详细连接日志,定位问题。 |
| VSCode要求输入密钥通行短语 | 这是正常行为,说明密钥认证在工作,但需要通行短语。 | 输入你创建密钥时设置的通行短语。可以考虑使用ssh-agent在会话中管理通行短语,避免重复输入。 |
| SCP传输失败,连接超时或被拒绝 | 1. 服务器IP或端口错误。 2. 服务器防火墙阻止了SSH端口(22)。 |
1. 确认IP地址和用户名。 2. 检查服务器防火墙设置(如 ufw),确保22端口开放:sudo ufw allow 22。 |
提升安全与效率的进阶技巧
-
使用SSH-Agent管理通行短语:在Windows上,你可以启动内置的
ssh-agent服务并添加私钥,这样只需在开机后输入一次通行短语,后续所有SSH连接(包括VSCode)都将自动使用。# 以管理员身份打开PowerShell Get-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent ssh-add ~\.ssh\id_rsa # 此时会提示输入通行短语 -
为不同服务器使用不同密钥对:不要在所有服务器上使用同一对密钥。可以为生产环境、测试环境、不同项目分别生成密钥对,并在SSH配置文件中通过
IdentityFile指定。这能实现更精细的访问控制和风险隔离。 -
考虑禁用密码登录(高风险操作):当确认密钥登录稳定可靠后,为了服务器安全,可以禁用密码认证。编辑
/etc/ssh/sshd_config,将PasswordAuthentication设置为no,然后重启sshd。务必确保至少有一个公钥已加入authorized_keys且能正常登录,否则你可能会把自己锁在服务器外! -
优化VSCode Remote-SSH体验:在远程服务器的用户家目录下安装常用的VSCode扩展。扩展会安装在远程,不影响本地环境。同时,合理利用VSCode的端口转发功能,可以方便地在本地浏览器访问远程服务器上运行的Web应用。
整个配置过程的核心,是将一个基于“知识”(密码)的认证流程,转变为一个基于“所有权”(私钥)的自动化流程。一旦打通,那种在Windows上轻点VSCode图标,瞬间切入Ubuntu服务器开发环境的感觉,会极大提升你的开发心流。我自己的多个项目环境都采用了这套配置,最初可能会花十几分钟设置,但它换来的是未来数月甚至数年的顺畅体验。如果在配置过程中遇到任何障碍,回头仔细检查文件权限和路径这两个最常出错的环节,问题通常都能迎刃而解。
更多推荐



所有评论(0)