为什么学这个
最近经常用 VS Code 的 Remote-SSH 插件远程连接 Linux 服务器写代码。体验确实好,但有一个极其破坏心流的痛点:每次打开新窗口、重启 VS Code 甚至网络稍微波动重连时,都要手动输入一遍服务器密码。 为了彻底告别这种无意义的重复劳动,我花时间梳理并配置了 SSH 的基于公钥的免密登录。配置完成后,点击即连,开发体验直线拉满。
核心内容/步骤
SSH 免密登录的核心原理很简单:在本地生成一把“钥匙”(私钥),把对应的“锁”(公钥)放到服务器上。 之后连接时,双方自动核对,匹配上了就直接放行。
具体分为三步:
1. 本地生成 SSH 密钥对
打开本地电脑的终端(Windows 用 PowerShell,Mac/Linux 用 Terminal),输入以下命令生成密钥对。推荐使用更安全、性能更好的 ed25519 算法:
Bash
ssh-keygen -t ed25519
关键点:执行后一路回车到底即可。千万不要设置密码(passphrase) ,否则每次连接还是会弹窗让你输入密钥的密码,失去了免密的意义。
完成后,会在本地的 ~/.ssh/ 目录下生成两个文件:id_ed25519(私钥,打死不能告诉别人)和 id_ed25519.pub(公钥,用来上传到服务器)。
2. 将公钥上传到服务器端
我们需要把刚才生成的 .pub 公钥文件内容,追加到服务器的 ~/.ssh/authorized_keys 文件中。
-
如果是 Mac / Linux 环境:
系统自带一键上传命令,极度舒适(执行时按提示输入一次服务器密码即可):
Bash
ssh-copy-id username@your_server_ip -
如果是 Windows 环境:
Windows 没有内置上面的命令,可以通过 PowerShell 执行以下单行命令实现同样的效果:
PowerShell
Get-Content ~/.ssh/id_ed25519.pub | ssh username@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3. 配置 VS Code 的 SSH Config
锁和钥匙配好后,最后告诉 VS Code 怎么用这把钥匙。
- 在 VS Code 中按
Ctrl + Shift + P(Mac:Cmd + Shift + P)。 - 搜索并选择
Remote-SSH: Open SSH Configuration File...。 - 选择你的本地 config 文件(通常在
~/.ssh/config)。 - 按照如下格式添加配置:
Plaintext
Host MyDevServer # 别名,会显示在 VS Code 侧边栏,随便起
HostName your_server_ip # 服务器的真实 IP 或域名
User username # 登录服务器的用户名
IdentityFile ~/.ssh/id_ed25519 # 本地私钥的绝对路径
保存配置。现在点击 VS Code 侧边栏的 MyDevServer,你会发现直接就秒连上了,再也不用输密码!
遇到的问题与解决方法
问题 1:Windows 下用命令行上传公钥老是报错?
解决:Windows PowerShell 的管道符处理有时比较折腾。如果上面的命令报错,最简单粗暴的“土办法”是:用记事本打开本地的 ~/.ssh/id_ed25519.pub,复制里面的那一行文本。然后用密码正常 SSH 登录进服务器,执行 nano ~/.ssh/authorized_keys,把刚才复制的内容粘贴进去,保存退出,并执行 chmod 600 ~/.ssh/authorized_keys 确保权限正确即可。
问题 2:配置完了,VS Code 还是弹窗要密码?
解决:90% 是服务器端 .ssh 目录的权限不对。SSH 协议对权限要求极严。登录服务器排查以下两点:
~/.ssh目录的权限必须是700(chmod 700 ~/.ssh)。~/.ssh/authorized_keys文件的权限必须是600(chmod 600 ~/.ssh/authorized_keys)。
收获与总结
通过这次折腾,不仅解决了实际的痛点,也加深了对 SSH 协议中公私钥认证机制的理解。这套逻辑不仅适用于 VS Code 远程开发,对于 Git 代码提交、服务器自动化部署(CI/CD)等场景同样适用。磨刀不误砍柴工,花十分钟配置好,以后每天都能省下几十次输密码的烦躁,非常划算。