Linux 批量分发 SSH key 方法

7次阅读

批量分发 ssh 公钥的核心是将本地公钥追加至目标机~/.ssh/authorized_keys 并设权限为 600;推荐用 ssh-copy-id 配合循环实现自动化,如 while read host; do ssh-copy-id -i ~/.ssh/id_rsa.pub “$host”; done

Linux 批量分发 SSH key 方法

批量分发 SSH 公钥到多台 Linux 主机,核心是把本地的 ~/.ssh/id_rsa.pub(或其他公钥)内容追加到目标机器的 ~/.ssh/authorized_keys 文件中,同时确保权限正确。手动一台台操作效率低,推荐用脚本或工具自动化。

用 ssh-copy-id 批量推送(最简单)

ssh-copy-id 是 OpenSSH 自带工具,专为单台主机设计,但配合 shell 循环可轻松扩展为批量操作:

  • 先准备一个 IP 或主机名列表(如 hosts.txt,每行一个)
  • 运行命令:
    while read host; do ssh-copy-id -i ~/.ssh/id_rsa.pub "$host"; done
  • 若目标用户不是当前用户名,写成 "user@host";若端口非 22,加 -p 2222
  • 首次连接会提示确认并输入密码,后续再执行可跳过(因密钥已存在)

用 Ansible 自动化分发(适合运维场景)

Ansible 无需在目标机装客户端,基于 SSH 工作,天然适合批量密钥管理:

  • 安装 Ansible:pip install ansible 或系统包管理器安装
  • 创建主机清单 inventory,例如:
    [servers]<br>192.168.1.10<br>192.168.1.11<br>web01.example.com

  • 执行命令一键分发:
    ansible all -i inventory -m authorized_key -a "user=ubuntu state=present key='{{lookup('file','~/.ssh/id_rsa.pub') }}'" --ask-pass
  • 若已配置 SSH 密钥登录某跳板机,可用 --private-key 指定私钥路径

纯 Bash 脚本 + scp + ssh(零依赖方案)

不依赖额外工具,仅靠基础命令,适合受限环境:

  • 脚本示例(保存为 deploy-key.sh):
    #!/bin/bash<br>KEY=$(cat ~/.ssh/id_rsa.pub)<br>while read host; do<br>  ssh "$host" "mkdir -p ~/.ssh && chmod 700 ~/.ssh"<br>  echo "$KEY" | ssh "$host" "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"<br>done < hosts.txt

  • 注意:必须保证当前用户对每台目标主机有密码登录权限(或已有其他可用密钥)
  • 执行前加 chmod +x deploy-key.sh,然后运行 ./deploy-key.sh

关键注意事项

无论用哪种方式,以下几点直接影响是否能免密登录成功:

  • 权限必须严格 :目标机上 ~/.ssh 目录权限应为 700authorized_keys 应为 600,否则 SSH 会拒绝读取
  • SELinux 或 AppArmor 可能拦截,若分发后仍需密码,检查 ls -Z ~/.ssh 和日志 /var/log/secure
  • 目标用户家目录不能是 root、nobody 等特殊用户,且 sshd_configPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys 需启用
  • 如果用非默认密钥(如 id_ed25519),记得用 -i 明确指定私钥路径,避免客户端选错

text=ZqhQzanResources