批量 SSH 免密配置脚本(自动生成密钥 + 分发公钥)

批量 SSH 免密配置脚本(自动生成密钥 + 分发公钥) 豆包生成的意外好用已验证#!/bin/bash # 批量生成SSH密钥并配置集群免密登录 # 依赖sshpass (安装命令yum install sshpass -y 或 apt install sshpass -y) # 请修改这里的配置 # 服务器IP列表一行一个或空格分隔 IP_LIST( 192.168.1.10 192.168.1.11 192.168.1.12 ) # SSH登录用户名所有机器统一账号 SSH_USERroot # SSH登录密码所有机器统一密码 SSH_PASS你的服务器密码 # # 临时文件存储所有机器的公钥 ALL_PUB_KEYS$(mktemp) echo 开始收集所有服务器公钥 # 1. 批量登录每台机器生成密钥并收集公钥 for ip in ${IP_LIST[]}; do echo -e \n[${ip}] 正在生成SSH密钥... # 自动执行 ssh-keygen全程默认回车无密码密钥 sshpass -p ${SSH_PASS} ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} \ ssh-keygen -t rsa -N -f ~/.ssh/id_rsa y /dev/null 21 # 检查密钥是否生成成功 if [ $? -eq 0 ]; then echo [${ip}] 密钥生成成功开始收集公钥 # 读取公钥并追加到临时文件 sshpass -p ${SSH_PASS} ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} \ cat ~/.ssh/id_rsa.pub ${ALL_PUB_KEYS} else echo [${ip}] 连接失败或生成密钥失败跳过 fi done echo -e \n 所有公钥收集完成开始批量写入授权文件 # 2. 把所有公钥写入每台机器的 authorized_keys for ip in ${IP_LIST[]}; do echo -e \n[${ip}] 正在写入公钥到 authorized_keys... # 创建.ssh目录不存在则创建 写入公钥 设置权限必须600 sshpass -p ${SSH_PASS} ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} \ mkdir -p ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh ${ALL_PUB_KEYS} if [ $? -eq 0 ]; then echo [${ip}] 免密配置完成 else echo [${ip}] 配置失败 fi done # 清理临时文件 rm -f ${ALL_PUB_KEYS} echo -e \n 全部任务完成所有机器已实现互相免密登录 补充一个批量追加公钥脚本只追加不覆盖#!/bin/bash # 批量把公钥追加到所有服务器的 authorized_keys # 依赖sshpass # 请修改这里的配置 # 服务器IP列表一行一个 IP_LIST( 192.168.1.10 192.168.1.11 192.168.1.12 ) # SSH登录信息 SSH_USERroot SSH_PASS你的密码 # 要批量追加的公钥可以写多个每个一行 PUB_KEYS ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user1host ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user2host ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user3host # # 开始执行 echo 开始批量追加公钥 for ip in ${IP_LIST[]}; do echo -e \n 处理机器$ip # 远程执行创建目录 → 追加公钥 → 设置权限必须 sshpass -p ${SSH_PASS} \ ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} mkdir -p ~/.ssh echo ${PUB_KEYS} ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys if [ $? -eq 0 ]; then echo ✅ $ip 公钥追加成功 else echo ❌ $ip 执行失败 fi done echo -e \n 所有任务执行完成 补充2 新增脚本批量修改配置#!/bin/bash # 批量修改 /etc/sysctl.conf 并生效 # 依赖sshpass # 请修改这里的配置 # 机器IP列表 IP_LIST( 192.168.1.10 192.168.1.11 192.168.1.12 ) # SSH 登录信息 SSH_USERroot SSH_PASS你的密码 # # 要追加的配置行 CONFIG_LINEnet.ipv4.ip_local_port_range 1024 65535 echo 开始批量修改 sysctl 配置 for ip in ${IP_LIST[]}; do echo -e \n 处理机器$ip # 远程执行追加配置 生效 sshpass -p ${SSH_PASS} \ ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} echo ${CONFIG_LINE} /etc/sysctl.conf sysctl -p if [ $? -eq 0 ]; then echo ✅ $ip 配置修改并生效成功 else echo ❌ $ip 执行失败 fi done echo -e \n 所有机器配置完成 补充3 批量 SCP 分发 解压 赋权脚本免密自动执行#!/bin/bash # 批量 SCP 分发 dist.zip 解压 赋权 一键脚本 # 依赖sshpass、unzip远程机器需要有 unzip # 请修改这里的配置 # 目标服务器 IP 列表 IP_LIST( 192.168.1.10 192.168.1.11 192.168.1.12 ) # SSH 登录信息 SSH_USERroot SSH_PASS你的服务器密码 # 本地要发送的 dist.zip 路径当前目录下直接写 dist.zip LOCAL_FILEdist.zip # 远程机器存放路径默认放在 root 家目录 REMOTE_DIR/root/ # echo 开始批量分发、解压、赋权 # 检查本地文件是否存在 if [ ! -f $LOCAL_FILE ]; then echo ❌ 错误本地文件 $LOCAL_FILE 不存在请检查路径 exit 1 fi for ip in ${IP_LIST[]}; do echo -e \n echo 处理机器$ip # 1. 免密 SCP 上传文件 echo → 正在上传 $LOCAL_FILE 到 $ip:$REMOTE_DIR sshpass -p $SSH_PASS scp -o StrictHostKeyCheckingno -o ConnectTimeout10 \ $LOCAL_FILE ${SSH_USER}${ip}:${REMOTE_DIR} if [ $? -ne 0 ]; then echo ❌ $ip 上传失败跳过后续步骤 continue fi # 2. 远程解压 赋权 echo → 正在解压 赋权 sshpass -p $SSH_PASS ssh -o StrictHostKeyCheckingno -o ConnectTimeout10 ${SSH_USER}${ip} cd ${REMOTE_DIR} unzip -o dist.zip /dev/null 21 # -o 覆盖不询问 chmod -R x dist if [ $? -eq 0 ]; then echo ✅ $ip 执行完成上传 → 解压 → 赋权 else echo ❌ $ip 解压或赋权失败 fi done echo -e \n echo 所有机器任务执行完毕