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"