豆包生成的,意外好用,已验证
#!/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_USER="root"
# 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 StrictHostKeyChecking=no -o ConnectTimeout=10 "${SSH_USER}@${ip}" \
"ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y >/dev/null 2>&1"
# 检查密钥是否生成成功
if [ $? -eq 0 ]; then
echo "[${ip}] 密钥生成成功,开始收集公钥"
# 读取公钥并追加到临时文件
sshpass -p "${SSH_PASS}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${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 StrictHostKeyChecking=no -o ConnectTimeout=10 "${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_USER="root"
SSH_PASS="你的密码"
# 要批量追加的公钥(可以写多个,每个一行)
PUB_KEYS="
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user1@host
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user2@host
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD... user3@host
"
# ==============================================================
# 开始执行
echo "===== 开始批量追加公钥 ====="
for ip in "${IP_LIST[@]}"; do
echo -e "\n>>> 处理机器:$ip"
# 远程执行:创建目录 → 追加公钥 → 设置权限(必须)
sshpass -p "${SSH_PASS}" \
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${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_USER="root"
SSH_PASS="你的密码"
# ==============================================================
# 要追加的配置行
CONFIG_LINE="net.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 StrictHostKeyChecking=no -o ConnectTimeout=10 "${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_USER="root"
SSH_PASS="你的服务器密码"
# 本地要发送的 dist.zip 路径(当前目录下直接写 dist.zip)
LOCAL_FILE="dist.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 StrictHostKeyChecking=no -o ConnectTimeout=10 \
"$LOCAL_FILE" "${SSH_USER}@${ip}:${REMOTE_DIR}"
if [ $? -ne 0 ]; then
echo "❌ $ip 上传失败,跳过后续步骤"
continue
fi
# 2. 远程解压 + 赋权
echo "→ 正在解压 + 赋权"
sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "${SSH_USER}@${ip}" "
cd ${REMOTE_DIR}
unzip -o dist.zip >/dev/null 2>&1 # -o 覆盖不询问
chmod -R +x dist
"
if [ $? -eq 0 ]; then
echo "✅ $ip 执行完成:上传 → 解压 → 赋权"
else
echo "❌ $ip 解压或赋权失败"
fi
done
echo -e "\n====================================="
echo "===== 所有机器任务执行完毕 ====="

&spm=1001.2101.3001.5002&articleId=159502784&d=1&t=3&u=2748554cacad448590a7e07c43587155)
3307

被折叠的 条评论
为什么被折叠?



