#!/bin/bash
# system-health-check.sh
echo"=== 系统健康检查 $(date) ==="
echo"主机名: $(hostname)"
echo"运行时间: $(uptime)"
echo -e "\n1. CPU使用率:"
top -bn1 | grep "Cpu(s)" | awk '{print "总使用率: " 100-$8"%", "用户: "$2"%", "系统: "$4"%", "空闲: "$8"%"}'
echo -e "\n2. 内存使用:"
free -h | awk '/Mem:/ {print "总内存: "$2, "已用: "$3, "可用: "$4, "使用率: "$3/$2*100"%"}'
echo -e "\n3. 磁盘使用:"
df -h | grep -E '(/dev/sd|/dev/xvd|/dev/nvme)' | awk '{print $1": 总"$2", 已用"$3" ("$5")"}'
echo -e "\n4. 负载情况:"
echo"1分钟: $(cat /proc/loadavg | awk '{print $1}')"
echo"5分钟: $(cat /proc/loadavg | awk '{print $2}')"
echo"15分钟: $(cat /proc/loadavg | awk '{print $3}')"
echo -e "\n5. 网络连接数:"
ss -s | head -2
echo -e "\n6. 当前登录用户:"
who
#!/bin/bash
# realtime-monitor.sh
INTERVAL=5 # 监控间隔(秒)
DURATION=60 # 监控时长(秒)
echo"开始实时监控,间隔 ${INTERVAL}s,持续 ${DURATION}s..."
end=$((SECONDS+DURATION))
while [ $SECONDS -lt $end ]; do
clear
echo"=== 实时监控 $(date) ==="
echo"CPU使用: $(top -bn1 | grep "Cpu(s)" | awk '{printf "%.1f%%", 100-$8}')"
echo "内存使用: $(free | awk '/Mem:/ {printf "%.1f%%", $3/$2*100}')"
echo "磁盘使用: $(df / | awk 'NR==2 {print $5}')"
echo "负载: $(cat /proc/loadavg | awk '{print $1","$2","$3}')"
echo "TCP连接: $(ss -s | awk '/TCP:/ {print $2}')"
sleep $INTERVAL
done
#!/bin/bash
# nginx-log-analyzer.sh
LOG_FILE="/var/log/nginx/access.log"
if [ ! -f "$LOG_FILE" ]; then
echo"错误: 日志文件不存在: $LOG_FILE"
exit 1
fi
echo"=== Nginx访问日志分析 $(date) ==="
echo"分析文件: $LOG_FILE"
echo"统计时间范围: $(head -1 $LOG_FILE | awk '{print $4}' | tr -d '[') 到 $(tail -1 $LOG_FILE | awk '{print $4}' | tr -d '[')"
echo -e "\n1. 总请求数:"
wc -l $LOG_FILE | awk '{print $1}'
echo -e "\n2. 状态码统计:"
awk '{print $9}'$LOG_FILE | sort | uniq -c | sort -nr | head -10
echo -e "\n3. 最频繁访问的IP:"
awk '{print $1}'$LOG_FILE | sort | uniq -c | sort -nr | head -10
echo -e "\n4. 最常访问的URL:"
awk '{print $7}'$LOG_FILE | sort | uniq -c | sort -nr | head -10
echo -e "\n5. 请求方法统计:"
awk '{print $6}'$LOG_FILE | tr -d '"' | sort | uniq -c | sort -nr
echo -e "\n6. 每小时请求量:"
awk '{print $4}'$LOG_FILE | cut -d: -f1,2 | sort | uniq -c | tail -24
#!/bin/bash
# error-log-monitor.sh
LOG_DIR="/var/log"
ERROR_KEYWORDS="error|fail|exception|timeout|denied|refused"
echo"=== 系统错误日志监控 $(date) ==="
for log_file in $(find $LOG_DIR -name "*.log" -type f); do
echo -e "\n检查文件: $log_file"
error_count=$(grep -E -i "$ERROR_KEYWORDS""$log_file" | wc -l)
if [ $error_count -gt 0 ]; then
echo"发现 $error_count 个错误:"
grep -E -i "$ERROR_KEYWORDS""$log_file" | tail -5
else
echo"未发现错误"
fi
done
#!/bin/bash
# auto-backup.sh
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# 备份目录
mkdir -p $BACKUP_DIR/$DATE
echo"=== 开始系统备份 $(date) ==="
# 1. 备份重要配置文件
echo"备份配置文件..."
tar -czf $BACKUP_DIR/$DATE/etc-backup.tar.gz /etc 2>/dev/null
# 2. 备份网站数据
echo"备份网站数据..."
tar -czf $BACKUP_DIR/$DATE/www-backup.tar.gz /var/www 2>/dev/null
# 3. 备份数据库 (MySQL)
echo"备份MySQL数据库..."
mysqldump -u root -p$(cat /root/mysql_password) --all-databases > $BACKUP_DIR/$DATE/mysql-backup.sql 2>/dev/null
# 4. 备份日志文件
echo"备份日志文件..."
tar -czf $BACKUP_DIR/$DATE/logs-backup.tar.gz /var/log 2>/dev/null
echo"备份完成,文件保存在: $BACKUP_DIR/$DATE/"
# 清理旧备份
echo"清理超过 $RETENTION_DAYS 天的旧备份..."
find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; 2>/dev/null
#!/bin/bash
# incremental-backup.sh
SOURCE_DIR="/data"
BACKUP_DIR="/backup/incremental"
FULL_BACKUP_DIR="/backup/full"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_FILE="$BACKUP_DIR/last_snapshot"
echo"=== 增量备份开始 $(date) ==="
# 每周日执行全量备份
if [ $(date +%u) -eq 7 ]; then
echo"执行全量备份..."
rsync -a --delete $SOURCE_DIR/ $FULL_BACKUP_DIR/current/
echo"全量备份完成"
fi
# 执行增量备份
if [ -f "$SNAPSHOT_FILE" ]; then
echo"执行增量备份..."
rsync -a --delete --link-dest=$FULL_BACKUP_DIR/current/ $SOURCE_DIR/ $BACKUP_DIR/$TIMESTAMP/
else
echo"首次备份,创建基础快照..."
rsync -a $SOURCE_DIR/ $BACKUP_DIR/$TIMESTAMP/
fi
# 更新快照文件
echo$TIMESTAMP > $SNAPSHOT_FILE
echo"增量备份完成: $BACKUP_DIR/$TIMESTAMP/"
#!/bin/bash
# security-scan.sh
echo"=== 系统安全扫描 $(date) ==="
# 1. 检查可疑进程
echo"1. 检查可疑进程:"
ps aux | awk '{print $11}' | sort | uniq | grep -E '(\.sh|\.py|wget|curl|nc|netcat|telnet|ssh|scp)$'
# 2. 检查异常网络连接
echo -e "\n2. 检查异常网络连接:"
netstat -tunap | awk '$6 == "ESTABLISHED" {print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 3. 检查SUID文件
echo -e "\n3. 检查可疑SUID文件:"
find / -perm -4000 -type f 2>/dev/null | xargs ls -la
# 4. 检查root权限用户
echo -e "\n4. 检查具有root权限的用户:"
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 5. 检查空密码账户
echo -e "\n5. 检查空密码账户:"
awk -F: '($2 == "") {print $1}' /etc/shadow
# 6. 检查SSH安全配置
echo -e "\n6. SSH配置检查:"
grep -E "^(PermitRootLogin|PasswordAuthentication|Protocol)" /etc/ssh/sshd_config
echo -e "\n扫描完成!"
#!/bin/bash
# file-integrity-check.sh
BASE_DIR="/etc"
HASH_FILE="/root/file_hashes.txt"
echo"=== 文件完整性检查 $(date) ==="
if [ ! -f "$HASH_FILE" ]; then
echo"创建初始哈希文件..."
find $BASE_DIR -type f -exec sha256sum {} \; > $HASH_FILE
echo"初始哈希已保存到: $HASH_FILE"
exit 0
fi
echo"检查文件完整性..."
TEMP_FILE=$(mktemp)
find $BASE_DIR -type f -exec sha256sum {} \; > $TEMP_FILE
# 比较差异
if diff $HASH_FILE$TEMP_FILE > /dev/null; then
echo"所有文件完整,未发现更改"
else
echo"警告: 发现文件更改!"
diff $HASH_FILE$TEMP_FILE
# 更新哈希文件
cp $TEMP_FILE$HASH_FILE
echo"哈希文件已更新"
fi
rm -f $TEMP_FILE
#!/bin/bash
# performance-optimize.sh
echo"=== 系统性能调优 $(date) ==="
# 1. 调整内核参数
echo"优化内核参数..."
echo"net.core.rmem_max = 16777216" >> /etc/sysctl.conf
echo"net.core.wmem_max = 16777216" >> /etc/sysctl.conf
echo"vm.swappiness = 10" >> /etc/sysctl.conf
sysctl -p
# 2. 调整文件系统挂载参数
echo"优化文件系统..."
sed -i 's/defaults/defaults,noatime,nodiratime/' /etc/fstab
mount -o remount /
# 3. 调整进程限制
echo"调整进程限制..."
echo"* soft nofile 65535" >> /etc/security/limits.conf
echo"* hard nofile 65535" >> /etc/security/limits.conf
# 4. 优化磁盘IO
echo"优化磁盘IO调度..."
echo'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/rc.local
# 5. 清理系统缓存
echo"清理系统缓存..."
sync && echo 3 > /proc/sys/vm/drop_caches
echo"性能优化完成!"
#!/bin/bash
# mysql-optimize.sh
DB_USER="root"
DB_PASS=$(cat /root/mysql_password)
echo"=== MySQL数据库优化 $(date) ==="
# 1. 优化表
echo"优化数据库表..."
mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)" | whileread db; do
echo"优化数据库: $db"
mysql -u$DB_USER -p$DB_PASS$db -e "SHOW TABLES;" | whileread table; do
mysql -u$DB_USER -p$DB_PASS$db -e "OPTIMIZE TABLE $table;"
done
done
# 2. 清理日志
echo"清理二进制日志..."
mysql -u$DB_USER -p$DB_PASS -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
# 3. 分析表状态
echo"分析表状态..."
mysql -u$DB_USER -p$DB_PASS -e "SHOW STATUS LIKE 'Threads_connected';"
mysql -u$DB_USER -p$DB_PASS -e "SHOW STATUS LIKE 'Qcache%';"
echo"数据库优化完成!"
#!/bin/bash
# app-deploy.sh
APP_NAME="myapp"
APP_DIR="/opt/$APP_NAME"
BACKUP_DIR="/backup/$APP_NAME"
GIT_REPO="https://github.com/user/$APP_NAME.git"
echo"=== 应用部署 $(date) ==="
# 1. 备份当前版本
if [ -d "$APP_DIR" ]; then
echo"备份当前版本..."
tar -czf $BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).tar.gz $APP_DIR
fi
# 2. 拉取最新代码
echo"拉取最新代码..."
if [ -d "$APP_DIR" ]; then
cd$APP_DIR
git pull origin master
else
git clone$GIT_REPO$APP_DIR
cd$APP_DIR
fi
# 3. 安装依赖
echo"安装依赖..."
if [ -f "package.json" ]; then
npm install
elif [ -f "requirements.txt" ]; then
pip install -r requirements.txt
fi
# 4. 构建应用
echo"构建应用..."
if [ -f "build.sh" ]; then
chmod +x build.sh
./build.sh
fi
# 5. 重启服务
echo"重启服务..."
systemctl restart $APP_NAME
echo"应用部署完成!"
#!/bin/bash
# multi-server-deploy.sh
SERVERS=("server1""server2""server3")
APP_DIR="/opt/myapp"
DEPLOY_USER="deploy"
echo"=== 多服务器部署 $(date) ==="
for server in"${SERVERS[@]}"; do
echo"部署到服务器: $server"
# 1. 传输文件
rsync -avz --delete $APP_DIR/ $DEPLOY_USER@$server:$APP_DIR/
# 2. 执行远程命令
ssh $DEPLOY_USER@$server"
cd $APP_DIR
if [ -f 'package.json' ]; then
npm install --production
fi
sudo systemctl restart myapp
echo '部署完成: $server'
"
done
echo"所有服务器部署完成!"
#!/bin/bash
# network-check.sh
TARGETS=("8.8.8.8""google.com""baidu.com""github.com")
LOG_FILE="/var/log/network-check.log"
echo"=== 网络连通性检查 $(date) ===" >> $LOG_FILE
for target in"${TARGETS[@]}"; do
if ping -c 3 -W 2 $target > /dev/null 2>&1; then
echo"✓ $target 连通正常" | tee -a $LOG_FILE
else
echo"✗ $target 无法连通" | tee -a $LOG_FILE
# 发送告警
echo"网络告警: $target 无法连通 at $(date)" | mail -s "网络故障告警" admin@example.com
fi
done
# 检查端口连通性
PORTS=("80""443""22""3306")
for port in"${PORTS[@]}"; do
if nc -z -w 2 localhost $port; then
echo"✓ 端口 $port 监听正常" | tee -a $LOG_FILE
else
echo"✗ 端口 $port 未监听" | tee -a $LOG_FILE
fi
done
#!/bin/bash
# bandwidth-monitor.sh
INTERFACE="eth0"
INTERVAL=60# 监控间隔(秒)
LOG_FILE="/var/log/bandwidth.log"
echo "开始带宽监控,接口: $INTERFACE">> $LOG_FILE
whiletrue; do
# 获取当前流量统计
RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep $INTERVAL
# 获取新的流量统计
RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
# 计算速率 (bytes/s 转换为 Mbps)
RX_RATE=$(( (RX2 - RX1) / INTERVAL * 8 / 1000000 ))
TX_RATE=$(( (TX2 - TX1) / INTERVAL * 8 / 1000000 ))