VSCode Remote-SSH密钥配置全流程:从生成到免密登录云服务器
1. 为什么你需要VSCode Remote-SSH和密钥登录?
如果你和我一样,经常需要在云服务器上写代码、调试程序,那你肯定受够了每次打开终端都要输入一长串密码的麻烦。更别提有时候密码复杂到你自己都记不住,或者在不同的服务器之间反复横跳,那感觉简直是在做记忆力体操。我之前就深受其害,直到我彻底搞定了VSCode的Remote-SSH插件配合密钥登录,才真正体会到了什么叫“丝滑”的远程开发。
简单来说,VSCode Remote-SSH能让你用本地VSCode的界面,直接操作远程服务器上的文件和代码。你本地看到的编辑器、侧边栏、终端,实际上都是在读写和运行远程服务器上的内容。这带来的好处是巨大的:你可以在自己熟悉的、配置好的VSCode环境里,直接享用云服务器强大的计算资源(比如大内存、多核CPU、或者特定的GPU),本地只需要一个轻薄的笔记本就够了。
而“密钥登录”则是实现这一切“丝滑”体验的安全基石。它比密码登录安全得多,也方便得多。原理其实很像一把物理锁和钥匙:你在本地生成一对密钥(一个公钥,一个私钥)。公钥就像一把锁,你把它装到云服务器的门上(authorized_keys文件里);私钥就是你随身携带的、独一无二的钥匙。当你用VSCode连接服务器时,服务器会用你装好的“锁”来验证你手里的“钥匙”。匹配成功,门就开了,全程无需输入密码。这既避免了密码在网络上传输可能被截获的风险,也彻底告别了手动输密码的繁琐。
所以,这套组合拳的目标非常明确:为开发者搭建一个既安全高效,又极度舒适的远程开发环境。无论你是需要一台稳定的Linux环境做后端开发,还是需要特定配置的服务器跑机器学习模型,接下来的步骤都能帮你一步到位。我踩过的一些坑,比如权限问题、配置文件路径错误、密钥格式不对,都会在后面的详细流程里给你标清楚,保证你一次成功。
2. 前期准备:安装必备工具
工欲善其事,必先利其器。在开始配置密钥之前,我们需要确保手头有两样核心工具:VSCode的Remote-SSH扩展,以及用于生成和管理密钥的Git(或者任何其他包含OpenSSH客户端的工具)。别担心,安装过程非常简单。
2.1 安装VSCode Remote-SSH扩展
打开你的VSCode,侧边栏找到那个方块形状的“扩展”图标,或者直接用快捷键 Ctrl+Shift+X 呼出扩展市场。在搜索框里输入“Remote-SSH”。
你会看到微软官方发布的“Remote - SSH”扩展,通常它会有个蓝色的“微软”认证标志。直接点击“安装”按钮。我个人的习惯是,直接安装那个功能更全的“Remote Development”扩展包。这个扩展包一次性包含了Remote-SSH(连接服务器)、Remote-Containers(连接容器)和Remote-WSL(连接WSL)三个插件,对于未来可能的多场景开发非常有用。安装了这个扩展包,Remote-SSH自然也就装好了。
安装完成后,你会在VSCode左侧活动栏看到一个全新的图标,看起来像两台显示器,这就是“远程资源管理器”(Remote Explorer)。点击它,在顶部的下拉菜单中选择“SSH Targets”,我们的主战场就在这里了。
2.2 安装Git(获取SSH客户端)
生成SSH密钥对,我们需要一个SSH客户端。在Windows上,最方便的方式就是安装Git for Windows,因为它自带了一个叫“Git Bash”的终端,这个终端里集成了完整的OpenSSH工具链,包括我们需要的 ssh-keygen 和 ssh-copy-id 命令。
前往Git的官方网站(git-scm.com),下载适合你操作系统(Windows)的安装程序。运行安装程序时,大部分选项保持默认即可。但有一个关键步骤我建议你留意:在“Choosing the default editor used by Git”这一步,你可以选择“Use Visual Studio Code as Git‘s default editor”,这样以后Git的提交信息就会默认用VSCode来编辑,更统一。另外,在“Adjusting your PATH environment”这一步,建议选择“Git from the command line and also from 3rd-party software”,这会把Git的命令行工具添加到系统PATH,方便在任何终端(比如Windows自带的PowerShell或CMD)里也能使用SSH命令。
安装完成后,你可以在开始菜单找到“Git Bash”并打开它。它会呈现一个类似Linux终端的界面,我们可以在这里执行后续的所有SSH相关命令。当然,如果你本来就是macOS或Linux用户,系统已经自带了OpenSSH,直接打开终端(Terminal)就行,可以跳过Git的安装。
3. 生成你的专属SSH密钥对
这是整个流程中最核心的一步,也是决定安全性的关键。我们将在本地机器上生成一对非对称加密的密钥。整个过程都在本地完成,非常安全。
3.1 选择密钥算法与生成命令
打开你刚刚安装好的Git Bash(或系统终端)。我们将使用 ssh-keygen 这个命令来生成密钥。目前主流的算法有两种:RSA 和 Ed25519。
- RSA:老牌且应用广泛,兼容性极好,几乎所有服务器都支持。命令中
-b 4096指定密钥长度为4096位,这是当前推荐的安全强度。 - Ed25519: newer,更安全、更快,生成的密钥也更短。但极少数非常老旧的系统可能不支持。
对于绝大多数现代的云服务器(如阿里云、腾讯云、AWS、Google Cloud的较新镜像),两者都可以。我个人现在更倾向于使用Ed25519,因为它更快更安全。你可以根据喜好任选其一。
在终端中输入以下命令之一(记得把邮箱换成你自己的,这只是一个标识符):
# 使用RSA算法
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 或使用Ed25519算法
ssh-keygen -t ed25519 -C "your_email@example.com"
3.2 交互式生成过程详解
输入命令后,终端会进入一个交互式流程,我会带你一步步走完:
-
“Enter file in which to save the key”: 询问你密钥文件的保存路径和名称。直接按回车,会使用默认路径和默认名称(例如
C:\Users\你的用户名\.ssh\id_rsa或id_ed25519)。这里有个重要提示:如果你之前已经为其他服务器生成过密钥(比如GitHub),并且不想覆盖它,可以在这里输入一个新的名字,比如id_ed25519_mycloudserver。这样就能在同一台电脑上管理多对密钥了。我通常会用服务器用途来命名,一目了然。 -
“Enter passphrase”: 询问你是否为私钥设置一个“通行短语”(passphrase)。这相当于给你的私钥再加一把密码锁。即使别人偷走了你的私钥文件,没有这个通行短语也无法使用。我强烈建议你设置一个!虽然每次使用密钥时会多输入一次这个短语,但安全性大大提升。你可以把它想象成银行卡密码。如果图省事,可以直接回车留空。我这里为了演示,先留空。
-
“Enter same passphrase again”: 确认上一步输入的通行短语。
命令执行成功后,你会看到类似“Your public key has been saved in ...”的提示,以及一个随机艺术图案。这表示密钥对已经生成好了。
3.3 理解生成的文件
现在,让我们看看生成了什么。默认情况下,它们保存在你的用户目录下的 .ssh 文件夹里(例如 C:\Users\你的用户名\.ssh)。你可以用命令 ls -al ~/.ssh/ 来查看。
你会看到两个关键文件(假设你用了默认名):
id_ed25519: 这是私钥。它必须被像保护密码一样保护起来,绝对不能泄露给任何人,也不要上传到任何服务器。它只留在你的本地电脑上。id_ed25519.pub: 这是公钥。它的内容是可以公开的,我们接下来就要把它上传到云服务器。你可以用文本编辑器打开它看看,内容是一长串以算法名(如ssh-ed25519)开头的字符。
简单类比:公钥是锁,私钥是钥匙。你把锁(公钥)装在服务器上,自己用钥匙(私钥)开锁进门。
4. 将公钥部署到云服务器
生成了钥匙(私钥)和锁(公钥)之后,现在我们需要把“锁”安装到远程服务器的“门”上。这个“门”就是服务器上对应用户目录下的 ~/.ssh/authorized_keys 文件。
4.1 使用 ssh-copy-id 一键上传(最推荐)
这是最简单、最不容易出错的方法。ssh-copy-id 这个脚本会自动处理文件创建、权限设置等所有琐事。在Git Bash或终端里,输入以下命令:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@your_server_ip
请替换:
~/.ssh/id_ed25519.pub为你的公钥的实际路径和文件名(如果你自定义了名字)。username为你在云服务器上的登录用户名,通常是root(对于有root权限的服务器)或ubuntu(对于AWS/Ubuntu镜像)、ec2-user(对于Amazon Linux)等。your_server_ip替换为你的云服务器的公网IP地址或域名。
执行这个命令后,它会提示你输入一次该用户登录服务器的密码。这是你最后一次需要手动输入服务器密码!输入正确后,脚本会自动将你的公钥内容追加到服务器 ~/.ssh/authorized_keys 文件的末尾。你会看到“Number of key(s) added: 1”的成功提示。
4.2 手动上传公钥(备用方案)
如果某些环境没有 ssh-copy-id 命令(比如一些精简的Docker镜像),我们可以手动操作。原理很简单:将本地公钥文件的内容,添加到服务器指定文件中。
第一步,复制公钥内容。 在本地,你可以用以下命令直接输出公钥内容并复制:
cat ~/.ssh/id_ed25519.pub
全选终端里显示的那一行长字符串(通常以 ssh-ed25519 AAAAC3... 开头),并复制。
第二步,登录服务器并添加公钥。 先用密码方式登录服务器:
ssh username@your_server_ip
登录成功后,依次执行以下命令:
# 1. 确保.ssh目录存在,并设置正确的权限(700表示只有所有者可读可写可执行)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 2. 将复制的公钥内容追加到authorized_keys文件末尾
echo "你刚才复制的公钥内容" >> ~/.ssh/authorized_keys
# 3. 为authorized_keys文件设置严格的权限(600表示只有所有者可读可写)
chmod 600 ~/.ssh/authorized_keys
权限设置至关重要! 如果 .ssh 目录或 authorized_keys 文件的权限太开放(比如其他人可写),SSH守护进程出于安全考虑会直接拒绝使用密钥登录。这是新手最容易踩的坑之一。
完成后,可以输入 exit 退出服务器。
4.3 验证公钥是否生效
在部署完公钥后,强烈建议立刻测试一下密钥登录是否已经生效。不要关闭当前的本地终端,新开一个终端窗口(或者用原来的窗口,如果你已经退出了之前的连接),输入:
ssh username@your_server_ip
如果一切配置正确,这次你将不会被要求输入服务器密码,而是直接登录成功(如果你设置了私钥通行短语,则会提示你输入那个短语)。如果它还在问服务器密码,说明公钥部署环节有问题,需要回头检查路径、权限和文件内容。
5. 在VSCode中配置SSH连接信息
现在服务器端已经装好了我们的“锁”,本地也有“钥匙”。接下来就是告诉VSCode,当连接某个特定服务器时,该使用哪把“钥匙”。这是通过一个SSH配置文件(config)来实现的。
5.1 创建与编辑SSH配置文件
回到VSCode,点击左侧的“远程资源管理器”(Remote Explorer)图标,确保顶部下拉菜单选中的是“SSH Targets”。然后,你会看到旁边有一个小齿轮(设置)图标,鼠标悬停显示“Open SSH Configuration File...”。点击它。
通常会弹出两个选项:
C:\Users\你的用户名\.ssh\config(用户全局配置文件)你的VSCode工作区路径\.vscode\ssh\config(项目级配置文件)
选择第一个,即你用户目录下的全局配置文件。如果这个文件不存在,VSCode会帮你创建它。这个文件就是用来管理所有你通过SSH连接的远程主机的。
5.2 编写主机配置条目
用文本编辑器打开这个 config 文件后,我们来为云服务器添加一个配置块。每个服务器对应一个 Host 块。下面是一个详细的示例,我加了很多注释:
# 我的阿里云Web服务器
Host my-awesome-server # 这是一个别名,方便记忆,在VSCode里就显示这个名字
HostName 123.123.123.123 # 服务器的真实公网IP或域名
User ubuntu # 登录用户名,我用的Ubuntu镜像
Port 22 # SSH端口,默认是22。如果你的服务器改了SSH端口,这里必须改!
IdentityFile ~/.ssh/id_ed25519_mycloudserver # 指向你的私钥文件的绝对路径
# 以下是一些非常实用的可选参数
# Compression yes # 启用压缩,传输文件时更快,适合带宽小但文件多的场景
ServerAliveInterval 60 # 每60秒发送一个保活包,防止连接因超时被断开
ServerAliveCountMax 3 # 最多发送3次保活包没回应就认为连接断了
# ForwardAgent yes # 启用代理转发,方便在服务器上继续使用本地的SSH密钥访问其他服务(如Git)
# TCPKeepAlive yes # 启用TCP层的保活机制
关键参数解读:
Host: 这是你在VSCode列表里看到的名字,可以随便起,比如“公司测试机”、“线上数据库”。HostName和User: 这两个是必须的,指明了“去哪”和“以谁的身份”。IdentityFile: 这是实现免密的关键! 必须正确指向你本地私钥文件的路径。Windows用户注意,路径可以用C:\Users\...的格式,也可以用/c/Users/...的Git Bash格式。我通常用后者,兼容性更好。ServerAliveInterval: 这个参数我强烈建议加上。特别是通过某些网络环境连接时,长时间不操作SSH连接会被中间路由器掐掉,这个选项能保持连接活跃。
你可以在这个文件里为多个服务器创建多个 Host 块,VSCode会全部列出来。保存这个配置文件。
6. 连接、验证与高级技巧
配置保存后,激动人心的时刻就到了:首次连接。
6.1 在VSCode中发起连接
在“远程资源管理器”的SSH Targets列表里,点击右上角的刷新按钮。你应该立刻能看到你刚刚配置的 Host 别名(例如“my-awesome-server”)出现在列表里。
将鼠标悬停在这个主机条目上,右侧会出现一个“在当前窗口中连接”的图标(一个小箭头)。点击它。VSCode会打开一个新窗口,底部状态栏会显示“正在打开远程...”,并开始与服务器建立SSH连接。
如果这是你第一次连接这台服务器,可能会弹出SSH主机密钥验证的警告(类似于“The authenticity of host ... can‘t be established”)。这是正常的,SSH在防止中间人攻击。确认你连接的IP没错后,点击“Continue”即可。
接下来,如果你为私钥设置了通行短语(Passphrase),VSCode会弹出一个输入框让你输入。输入正确后,连接就会继续。如果没有设置通行短语,那么你将直接、无声地连接到远程服务器!
连接成功后,你会发现VSCode的界面左下角变成了“SSH: your_hostname”,并且新窗口的文件管理器打开的就是远程服务器上的用户家目录。你可以像操作本地文件一样浏览、编辑、保存远程文件。同时,集成终端(Terminal)里打开的也是远程服务器的Shell。至此,免密登录的远程开发环境已经完全搭建成功。
6.2 故障排查与常见问题
连接过程并非总是一帆风顺。这里分享几个我遇到过的典型问题及解决方法:
-
“Permission denied (publickey)”: 这是最常见的错误。
- 检查
IdentityFile路径: 在VSCode的config文件里,路径是否正确?特别是Windows的路径斜杠和大小写。可以尝试将路径用双引号括起来。 - 检查服务器公钥: 再次确认服务器的
~/.ssh/authorized_keys文件里,你的公钥内容是否完整、没有多余空格或换行。可以登录服务器用cat ~/.ssh/authorized_keys查看。 - 检查文件权限: 这是重灾区。确保服务器上
.ssh目录权限是700 (drwx------),authorized_keys文件权限是600 (-rw-------)。可以用ls -la ~/.ssh检查。 - 确认登录用户:
config文件里的User,和authorized_keys文件所属的用户,必须是同一个。
- 检查
-
连接超时或失败:
- 检查IP和端口:
HostName(IP)是否正确?服务器防火墙是否开放了SSH端口(默认22)?有些云平台(如AWS、阿里云)有安全组规则,需要手动放行22端口。 - 检查网络: 服务器是否可通?可以用本地终端先
ping一下IP试试。
- 检查IP和端口:
-
VSCode能连,但终端
ssh命令不能连:- 这通常是因为两者读取的私钥路径或配置文件不同。确保你在终端里测试时,使用了正确的私钥,例如
ssh -i ~/.ssh/id_ed25519_mycloudserver user@host。
- 这通常是因为两者读取的私钥路径或配置文件不同。确保你在终端里测试时,使用了正确的私钥,例如
6.3 多密钥管理与实用技巧
当你需要管理多台服务器,或者为同一台服务器的不同用途(如个人账户和部署账户)使用不同密钥时,config 文件的威力就显现出来了。
你可以为每个 Host 块指定不同的 IdentityFile。甚至可以使用通配符来简化管理。例如,所有以 .mycompany.com 结尾的服务器都使用同一把公司密钥:
Host *.mycompany.com
User deploy
IdentityFile ~/.ssh/id_ed25519_company
Port 2222
另一个超级实用的技巧是 代理转发(Agent Forwarding)。在 config 文件中为某个主机加上 ForwardAgent yes。这样,当你从这台服务器再去连接另一台服务器(比如跳板机后面的内网机器)或者克隆Git仓库时,可以“借用”你本地电脑上的SSH密钥进行认证,而无需将私钥复制到服务器上,既方便又安全。
最后,关于连接稳定性,如果你经常遇到连接意外断开,除了前面提到的 ServerAliveInterval,还可以在VSCode的设置里搜索“remote.SSH”,找到诸如“Remote.SSH: Connect Timeout”等选项,适当增加超时时间。
更多推荐

所有评论(0)