批量分发 ssh 公钥的核心是将本地公钥追加至目标机~/.ssh/authorized_keys 并设权限为 600;推荐用 ssh-copy-id 配合循环实现自动化,如 while read host; do ssh-copy-id -i ~/.ssh/id_rsa.pub “$host”; done
批量分发 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目录权限应为700,authorized_keys应为600,否则 SSH 会拒绝读取- SELinux 或 AppArmor 可能拦截,若分发后仍需密码,检查
ls -Z ~/.ssh和日志/var/log/secure- 目标用户家目录不能是 root、nobody 等特殊用户,且
sshd_config中PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys需启用- 如果用非默认密钥(如
id_ed25519),记得用-i明确指定私钥路径,避免客户端选错































