ssh-copy-id配合循环是最简单可靠的方式,只需本地有密钥、目标机ssh开放且连通;先生成无密码rsa密钥对,再用hosts.txt列出user@host格式目标,最后通过while循环逐台执行ssh-copy-id。

直接用 ssh-copy-id 配合循环是最简单可靠的方式,不需要额外安装工具,只要本地有密钥、目标机开放 SSH 且能连通即可。
准备前提:生成密钥并整理目标列表
确保本地已生成无密码的 SSH 密钥对(推荐 RSA):
- 运行
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa(-N ""表示空密码,避免交互) - 确认公钥存在:
ls ~/.ssh/id_rsa.pub - 新建一个文本文件(如
hosts.txt),每行写一个目标地址,格式统一为:user@host或user@host:port(端口非 22 时需显式指定)
例如:root@192.168.1.10ubuntu@web01.example.com:2222
方法一:纯 shell 循环 + ssh-copy-id(推荐)
一行命令即可执行,兼容性好、逻辑清晰:
- 执行命令:
while read host; do ssh-copy-id -i ~/.ssh/id_rsa.pub "$host"; done - 首次连接会提示输入目标机密码,输完即完成该节点分发;后续再运行会跳过已存在的密钥
- 若某台机器连接失败(如网络不通、用户不存在),脚本会报错但继续下一台,不影响整体流程
方法二:零依赖 Bash 脚本(适合受限环境)
不依赖 ssh-copy-id,只用 ssh 和 cat,适合最小化系统或定制化场景:
- 保存为
deploy-key.sh并赋予执行权限:chmod +x deploy-key.sh - 脚本内容如下:
#!/bin/bash KEY=$(cat ~/.ssh/id_rsa.pub) while read host; do ssh "$host" "mkdir -p ~/.ssh && chmod 700 ~/.ssh" echo "$KEY" | ssh "$host" "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" done <h3>注意事项与排错</h3> <p>分发后若仍需输密码,常见原因有:</p>
-
~/.ssh/authorized_keys权限不是 600(必须是 600) -
~/.ssh目录权限不是 700(不能大于 755) - 目标机
/etc/ssh/sshd_config中PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys未启用或被注释 - SELinux 或 AppArmor 限制了 SSH 读取密钥文件(可临时 setenforce 0 测试)











