如何便捷更新authorized_keys,替换旧SSH密钥并移除弃用密钥
批量替换旧1024-bit RSA密钥为ED25519密钥的自动化方案
准备工作
生成新的ED25519密钥:
ssh-keygen -t ed25519 -C "your-email@example.com"按提示设置密钥密码(可选但推荐),生成的密钥默认路径为
~/.ssh/id_ed25519(私钥)和~/.ssh/id_ed25519.pub(公钥)。创建服务器列表文件
~/server_list.txt,每行填写一个远程账户信息,格式为:user1@server.example.com user2@server2.example.com:2222 # 端口非默认22时需指定
自动化替换脚本
创建名为replace_ssh_keys.sh的脚本,内容如下:
#!/bin/bash # 配置参数 OLD_KEY="$HOME/.ssh/id_rsa" # 旧1024-bit RSA私钥路径 NEW_KEY="$HOME/.ssh/id_ed25519.pub" # 新ED25519公钥路径 SERVER_LIST="$HOME/server_list.txt" # 服务器列表文件路径 # 检查必要文件是否存在 if [ ! -f "$OLD_KEY" ]; then echo "错误:旧密钥文件 $OLD_KEY 不存在" exit 1 fi if [ ! -f "$NEW_KEY" ]; then echo "错误:新公钥文件 $NEW_KEY 不存在" exit 1 fi if [ ! -f "$SERVER_LIST" ]; then echo "错误:服务器列表文件 $SERVER_LIST 不存在" exit 1 fi # 遍历服务器执行替换操作 while IFS= read -r server; do echo "=== 处理服务器: $server ===" # 用旧密钥登录,添加新公钥到远程authorized_keys(无需加载旧密钥到agent) ssh -i "$OLD_KEY" "$server" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys" < "$NEW_KEY" if [ $? -ne 0 ]; then echo "⚠️ 添加新密钥失败,跳过该服务器后续操作" continue fi # 提取旧密钥的公钥内容,移除远程authorized_keys中的对应条目 OLD_PUB_KEY=$(ssh-keygen -y -f "$OLD_KEY") # 适配GNU sed(Linux),如果是BSD sed(如macOS服务器),需改为 sed -i '' '/.../d' ssh -i "$OLD_KEY" "$server" "sed -i '/${OLD_PUB_KEY//\//\\/}/d' ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" if [ $? -eq 0 ]; then echo "✅ 该服务器密钥替换完成" else echo "⚠️ 删除旧密钥失败,请手动检查该服务器" fi echo "" done < "$SERVER_LIST" echo "=== 批量处理全部完成 ==="
脚本使用说明
- 给脚本添加执行权限:
chmod +x replace_ssh_keys.sh - 先在1-2台测试服务器上运行脚本,验证操作正常:
./replace_ssh_keys.sh - 确认无误后,再对全部服务器执行批量替换。
关键优势
- 无需将旧密钥加载到ssh-agent:通过
ssh -i参数直接指定旧密钥登录,避免了手动加载及后续移除密钥的麻烦。 - 自动化完成新密钥部署+旧密钥清理:替代手动执行ssh-copy-id和删除旧密钥的重复操作。
- 批量处理高效:适配50+服务器的场景,减少人工操作成本。
注意事项
- 如果远程服务器使用BSD版本的sed(如macOS、FreeBSD),需修改脚本中的sed命令为
sed -i '' '/${OLD_PUB_KEY//\//\\/}/d',否则会报错。 - 确保旧密钥能正常登录所有目标服务器,若存在多套旧密钥,需拆分服务器列表并修改
OLD_KEY参数分别处理。 - 操作完成后,建议备份旧密钥后删除,同时检查
~/.ssh/config文件,移除所有对旧密钥的引用,确保新密钥成为唯一登录方式。
内容的提问来源于stack exchange,提问作者jdhildeb
相关产品推荐
相关产品推荐

