1. 理解 SSH 免密登录原理
SSH 密钥对由两把密钥组成,它们是一对数学上相关联的字符串:
- 私钥(Private Key):保存在你的本地电脑,绝不能泄露。相当于你的"钥匙"。
- 公钥(Public Key):上传到服务器。相当于"锁"。
连接时,SSH 客户端用私钥对一段随机数据签名,服务器用公钥验证签名。验证通过即认证成功,全程无需在网络上传输密码或密钥。
- 更安全:密码可能被暴力破解,而 256 位 Ed25519 密钥的破解在计算上不可行
- 更便捷:登录无需输入密码,适合频繁连接和自动化脚本
- 可控制:私钥可以设置 passphrase 二次保护,也可以随时撤销(删除服务器上的公钥)
2. 生成 SSH 密钥对
在本地电脑上执行以下命令,生成一对新的 SSH 密钥。我们使用 Ed25519 算法,它在安全性和密钥长度上都有优势。
# 1. 确保 .ssh 目录存在
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 2. 生成 Ed25519 密钥对
# -t 指定算法类型
# -C 是注释(Comment),会附加在公钥末尾,仅用于标识这把密钥是谁的
# → 可以写邮箱、名字、日期,甚至任意文字;不写也完全不影响功能
# -f 指定保存路径(避免覆盖默认的 id_ed25519)
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/id_ed25519_openclaw
# 3. 按提示操作
# Enter passphrase (empty for no passphrase):
# → 直接回车留空(初学者建议不设 passphrase,后续可用 ssh-agent 管理)
# Enter same passphrase again:
# → 再次回车
# 4. 确认生成成功
ls -la ~/.ssh/id_ed25519_openclaw*
# 应该看到两个文件:
# id_ed25519_openclaw ← 私钥(保密!)
# id_ed25519_openclaw.pub ← 公钥(可以分享)
# 1. 确保 .ssh 目录存在
New-Item -ItemType Directory -Force -Path $env:USERPROFILE\.ssh
# 2. 生成 Ed25519 密钥对
ssh-keygen -t ed25519 -C "your-email@example.com" -f $env:USERPROFILE\.ssh\id_ed25519_openclaw
# 3. 按提示操作
# Enter passphrase (empty for no passphrase):
# → 直接回车留空
# Enter same passphrase again:
# → 再次回车
# 4. 确认生成成功
Get-ChildItem $env:USERPROFILE\.ssh\id_ed25519_openclaw*
# 应该看到两个文件:
# id_ed25519_openclaw ← 私钥(保密!)
# id_ed25519_openclaw.pub ← 公钥(可以分享)
passphrase 是对私钥文件的二次加密。设置后,即使私钥文件被盗,没有 passphrase 也无法使用。但每次 SSH 连接都需要输入 passphrase。初学者建议留空,熟练后再用 ssh-agent 管理。
3. 查看并复制公钥内容
公钥需要上传到服务器的 ~/.ssh/authorized_keys 文件中。先查看公钥内容。
# 查看公钥内容
cat ~/.ssh/id_ed25519_openclaw.pub
# 输出示例:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDIhz2GK/XCUj4i6Q5yQJNL1MXMY0RxzPV2QrBqfHrDq your-email@example.com
# 将公钥复制到剪贴板(后续粘贴用)
pbcopy < ~/.ssh/id_ed25519_openclaw.pub
# 确认复制成功:在任意文本编辑器中按 Cmd+V 应该能粘贴出公钥内容
# 查看公钥内容
Get-Content $env:USERPROFILE\.ssh\id_ed25519_openclaw.pub
# 输出示例:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDIhz2GK/XCUj4i6Q5yQJNL1MXMY0RxzPV2QrBqfHrDq your-email@example.com
# 将公钥复制到剪贴板
Get-Content $env:USERPROFILE\.ssh\id_ed25519_openclaw.pub | Set-Clipboard
# 确认复制成功:在记事本中按 Ctrl+V 应该能粘贴出公钥内容
4. 登录服务器并创建 authorized_keys
使用密码登录服务器(最后一次输入密码),创建 .ssh 目录和 authorized_keys 文件。
# 1. 用密码登录服务器(将 YOUR_SERVER_IP 替换为你的公网 IP)
ssh root@YOUR_SERVER_IP
# 2. 输入密码(你在 Step 1 设置的 root 密码)
# 登录成功后,提示符变为:root@VM-xx-ubuntu:~#
# 3. 创建 .ssh 目录并设置正确权限
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. 创建 authorized_keys 文件
# 方法 A:使用 echo 直接写入(将引号中的内容替换为你的真实公钥)
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your-email@example.com" > ~/.ssh/authorized_keys
# 方法 B:如果公钥已在剪贴板,先用 vim/nano 编辑
nano ~/.ssh/authorized_keys
# 粘贴公钥内容,按 Ctrl+O 保存,Ctrl+X 退出
# 5. 设置 authorized_keys 的权限(至关重要!)
chmod 600 ~/.ssh/authorized_keys
# 6. 验证文件内容
cat ~/.ssh/authorized_keys
# 应该能看到以 ssh-ed25519 开头的公钥内容
# 7. 退出服务器
exit
~/.ssh 目录必须是 700(只有所有者可读写执行),authorized_keys 必须是 600(只有所有者可读写)。如果权限不对,SSH 会拒绝使用密钥认证,这是安全设计。
5. 验证免密登录
断开连接后重新登录,这次应该不需要输入密码。
# 方法 A:指定私钥文件连接
ssh -i ~/.ssh/id_ed25519_openclaw root@YOUR_SERVER_IP
# 方法 B:如果你创建了默认密钥(id_ed25519 或 id_rsa),直接连接
ssh root@YOUR_SERVER_IP
# 成功标志:没有提示输入密码,直接看到服务器欢迎信息
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0 x86_64)
root@VM-0-12-ubuntu:~#
# 如果仍然提示密码,检查:
# 1. authorized_keys 中的公钥是否完整(没有截断)
# 2. ~/.ssh 权限是否为 700,authorized_keys 是否为 600
# 3. 服务器 /var/log/auth.log 中的错误信息
# 方法 A:指定私钥文件连接
ssh -i $env:USERPROFILE\.ssh\id_ed25519_openclaw root@YOUR_SERVER_IP
# 方法 B:如果你创建了默认密钥,直接连接
ssh root@YOUR_SERVER_IP
# 成功标志:没有提示输入密码,直接看到服务器欢迎信息
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0 x86_64)
root@VM-0-12-ubuntu:~#
# 如果仍然提示密码,检查:
# 1. authorized_keys 中的公钥是否完整
# 2. ~/.ssh 权限是否为 700,authorized_keys 是否为 600
# 3. PowerShell 中 ssh 的 verbose 输出:ssh -vv root@YOUR_SERVER_IP
6. 配置 SSH 别名(简化连接)
每次输入 ssh -i ~/.ssh/... root@xxx.xxx.xxx.xxx 很麻烦。配置 SSH 别名后,只需 ssh myserver 即可连接。
# 1. 创建或编辑 SSH 配置文件
nano ~/.ssh/config
# 2. 添加以下内容(将 YOUR_SERVER_IP 替换为实际 IP)
Host myserver
HostName YOUR_SERVER_IP
User root
IdentityFile ~/.ssh/id_ed25519_openclaw
IdentitiesOnly yes
StrictHostKeyChecking accept-new
# 3. 保存并设置权限(SSH 要求 config 文件权限为 600)
chmod 600 ~/.ssh/config
# 4. 现在只需一行命令即可连接
ssh myserver
# 5. 验证:你应该直接登录,无需输入 IP、用户名、密码
# 1. 创建或编辑 SSH 配置文件
notepad $env:USERPROFILE\.ssh\config
# 2. 添加以下内容
Host myserver
HostName YOUR_SERVER_IP
User root
IdentityFile C:\Users\你的用户名\.ssh\id_ed25519_openclaw
IdentitiesOnly yes
StrictHostKeyChecking accept-new
# 3. 保存
# 4. 现在只需一行命令即可连接
ssh myserver
# 5. 验证:你应该直接登录,无需输入 IP、用户名、密码
Host myserver:别名,可以自定义(如 openclaw、tx 等)HostName:服务器的真实 IP 地址User:登录用户名(root)IdentityFile:私钥文件路径IdentitiesOnly yes:只使用指定的密钥,不尝试其他密钥
7. 用 Kimi Code 辅助管理 SSH
既然你已经安装了 Kimi Code(Step 2),现在可以用它来帮助管理 SSH 配置、排查连接问题。
# 启动 Kimi Code
kimi
# 然后输入以下提示词,让 Kimi 帮你生成或检查 SSH 配置:
"帮我检查 ~/.ssh/config 的配置是否正确,Host 别名是 myserver,IP 是 123.45.67.89"
"生成一个 shell 脚本,自动备份 ~/.ssh 目录到 ~/backups/ssh-backup-日期.tar.gz"
"解释 ssh -i、ssh-copy-id、authorized_keys 的作用和区别"
"我的 ssh myserver 还是提示输入密码,帮我排查可能的原因并给出检查步骤"
从现在起,遇到任何命令行问题,都可以先问 Kimi:"我想做 XXX,应该用什么命令?" Kimi 会给出具体命令和解释。这是 Vibe Coding 的核心——用自然语言描述意图,让 AI 生成实现。
8. 服务器安全加固(可选但推荐)
确认免密登录完全正常后,建议关闭密码登录,仅允许密钥认证,进一步提升安全性。
# 1. 登录服务器
ssh myserver
# 2. 备份原配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
# 3. 编辑 SSH 服务配置
nano /etc/ssh/sshd_config
# 4. 找到并修改以下行(如果没有则添加在文件末尾)
PermitRootLogin prohibit-password # 禁止 root 密码登录
PasswordAuthentication no # 关闭密码认证
PubkeyAuthentication yes # 启用公钥认证(默认已启用)
# 5. 保存退出(Ctrl+O,回车,Ctrl+X)
# 6. 检查配置语法(重要!)
sshd -t
# 如果没有任何输出,说明语法正确
# 7. 重启 SSH 服务使配置生效
systemctl restart sshd
# 8. 不要退出当前会话!打开一个新的本地终端窗口,测试:
# ssh myserver
# 如果能正常登录,说明配置成功
# 如果失败,用当前会话改回配置
在关闭密码登录之前,请务必:
- 已经成功用密钥登录过至少一次
- 私钥文件已备份到安全位置(如密码管理器、U盘)
- 腾讯云控制台提供VNC 救援登录(即使 SSH 完全搞错也能通过网页修复)
- 修改配置后不要退出当前 SSH 会话,先新开窗口验证