Administrator
Published on 2025-10-18 / 17 Visits
0
0

linux批量执行命令脚本

run_commands_on_local_and_remote.sh


#!/bin/bash
linux批量执行命令脚本
# ========================================
#### 在本机和多台远程服务器上顺序执行命令
#### 每条命令执行后等待 3 秒
#### 使用 SSH 免密登录
# ========================================

# ---------- CONFIG 配置区 ----------
# 要执行的命令列表(每条命令一行)
COMMANDS=(
    "echo '当前时间: $(date)'"
    "df -h /"
    "free -m"
    "whoami"
    "hostname"
    # 添加更多命令...
)

# 远程服务器配置
USER="root"                    # 远程用户名
SERVERS=(
    "192.168.1.10"
    "192.168.1.11"
    "192.168.1.12"
    # 添加更多服务器 IP
)
SSH_PORT="22"                  # SSH 端口
SSH_OPTS="-o ConnectTimeout=10 -o StrictHostKeyChecking=no"

# 等待时间(秒)
DELAY=3

# 日志文件
LOG_FILE="/tmp/command_execution_$(date +%Y%m%d_%H%M%S).log"
# ------------------------------------

# 清空或创建日志文件
> "$LOG_FILE"

# 时间戳函数
timestamp() {
    echo "[$(date +%Y-%m-%d\ %H:%M:%S)]"
}

log() {
    echo "$(timestamp) $1" | tee -a "$LOG_FILE"
}

# ========== 1. 在本机执行所有命令 ==========
log "🚀 开始在本机执行命令..."

for CMD in "${COMMANDS[@]}"; do
    log "➡️ 本地执行: $CMD"
    eval "$CMD"
    if [ $? -eq 0 ]; then
        log "✅ 本地命令成功"
    else
        log "❌ 本地命令失败"
    fi
    sleep $DELAY
done

log "✅ 本机命令执行完成"

# ========== 2. 在每台远程服务器上执行命令 ==========
for SERVER in "${SERVERS[@]}"; do
    log "🌐 开始在远程服务器 $SERVER 上执行命令..."

    # 检查 SSH 是否可达
    if ! ssh $SSH_OPTS -p $SSH_PORT -q "$USER@$SERVER" "exit"; then
        log "❌ 无法连接到 $SERVER,请检查网络、SSH 服务或密钥"
        continue
    fi

    log "✅ 已连接到 $SERVER"

    for CMD in "${COMMANDS[@]}"; do
        # 转义引号,避免 SSH 解析错误
        SAFE_CMD=$(echo "$CMD" | sed "s/'/'\\\\''/g")
        REMOTE_CMD="echo '执行: $CMD'; $CMD; echo '退出码: \$?'"

        log "➡️ 远程执行 [$SERVER]: $CMD"
        ssh $SSH_OPTS -p $SSH_PORT "$USER@$SERVER" "$REMOTE_CMD"

        if [ $? -eq 0 ]; then
            log "✅ 命令在 $SERVER 上成功执行"
        else
            log "❌ 命令在 $SERVER 上执行失败"
        fi

        sleep $DELAY
    done

    log "✅ $SERVER 所有命令执行完成"
done

log "🎉 所有命令在本机和远程服务器执行完毕,日志保存在: $LOG_FILE"

Comment