批量 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_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 "===== 所有机器任务执行完毕 ====="

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值