You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何便捷更新authorized_keys,替换旧SSH密钥并移除弃用密钥

批量替换旧1024-bit RSA密钥为ED25519密钥的自动化方案

准备工作

  1. 生成新的ED25519密钥:

    ssh-keygen -t ed25519 -C "your-email@example.com"
    

    按提示设置密钥密码(可选但推荐),生成的密钥默认路径为~/.ssh/id_ed25519(私钥)和~/.ssh/id_ed25519.pub(公钥)。

  2. 创建服务器列表文件~/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 "=== 批量处理全部完成 ==="

脚本使用说明

  1. 给脚本添加执行权限:
    chmod +x replace_ssh_keys.sh
    
  2. 先在1-2台测试服务器上运行脚本,验证操作正常:
    ./replace_ssh_keys.sh
    
  3. 确认无误后,再对全部服务器执行批量替换。

关键优势

  • 无需将旧密钥加载到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:18:50