--- title: "7个Shell服务器巡检脚本|新手直接复制可用(附详细步骤)" source: "https://mp.weixin.qq.com/s/DEqH_oRSVJF_dLcl1sJpog" author: - "[[Python小甲鱼]]" published: created: 2025-10-31 description: "本文整理了7个生产级Shell巡检脚本,覆盖系统健康、磁盘、网络、进程、安全、数据库、批量巡检场景。" tags: - "clippings" --- 原创 Python小甲鱼 *2025年10月28日 07:01* 本文整理了7个生产级Shell巡检脚本,覆盖系统健康、磁盘、网络、进程、安全、数据库、批量巡检场景。每个脚本都标注了 **配置修改点** 、 **使用步骤** 和 **新手避坑提示** ,复制代码就能用,适合运维新手快速上手。 ## 脚本总览:按需求选脚本 | 脚本序号 | 脚本名称 | 核心用途 | 适用场景 | | --- | --- | --- | --- | | 1 | 系统健康检查脚本 | 检查CPU、内存、磁盘、网络、进程等基础资源 | 日常服务器健康巡检(每天1次) | | 2 | 磁盘空间深度检查脚本 | 定位大文件、日志堆积、Inode占用问题 | 磁盘满预警、清理前分析 | | 3 | 网络连接检查脚本 | 检查端口监听、TCP连接、网络连通性 | 网络故障排查、端口异常检测 | | 4 | 应用进程健康检查脚本 | 监控关键进程、端口、HTTP接口响应 | 核心业务(Nginx/MySQL/Redis)监控 | | 5 | 安全基线检查脚本 | 检查账户安全、SSH配置、文件权限 | 安全合规审计、服务器加固 | | 6 | MySQL数据库检查脚本 | 检查连接数、慢查询、主从复制状态 | MySQL实例健康监控 | | 7 | 批量服务器巡检脚本 | 并发巡检多台服务器,生成HTML汇总报告 | 多服务器集群(10台以上)管理 | ## 脚本1:系统健康状态全面检查(最常用) ### 脚本用途 日常巡检核心脚本,一键检查服务器CPU、内存、磁盘、网络、进程等关键指标,生成带颜色的报告,异常指标自动标黄/红。 ### 核心功能 - • 收集系统基本信息(主机名、内核、运行时长) - • 检查CPU使用率+负载,显示TOP5高CPU进程 - • 检查内存/swap使用,显示TOP5高内存进程 - • 检查磁盘/Inode使用率,定位大目录 - • 检查网络接口、TCP连接状态(TIME\_WAIT过多预警) - • 检查僵尸进程、关键服务(sshd/crond)运行状态 ### 使用步骤 1. 1\. 复制下方代码,保存为 `system_health_check.sh` 2. 2\. 赋予执行权限: `chmod +x system_health_check.sh` 3. 3\. 执行脚本:`./system_health_check.sh` (需root权限) 4. 4\. 定时执行(每天早8点): `echo "0 8 * * * /path/to/system_health_check.sh" | crontab -` ### 完整代码(新手注意修改配置区) ``` #!/bin/bash ################################################################################ # 脚本名称: system_health_check.sh # 功能描述: 系统健康状态全面检查(新手用前改配置区!) # 版本信息: v2.0 ################################################################################ # -------------------------- 新手必改:配置区 -------------------------- HOSTNAME=$(hostname) DATE=$(date +"%Y-%m-%d %H:%M:%S") # 报告保存路径(不用改,默认存/var/log) REPORT_FILE="/var/log/system_check_$(date +%Y%m%d_%H%M%S).log" # 告警阈值(可根据服务器配置调整) CPU_WARNING=80 # CPU使用率告警阈值(%) MEM_WARNING=85 # 内存使用率告警阈值(%) DISK_WARNING=85 # 磁盘使用率告警阈值(%) LOAD_WARNING=4 # 系统负载阈值(CPU核心数*2,比如4核设8) INODE_WARNING=80 # Inode使用率告警阈值(%) # ------------------------------------------------------------------- # 颜色定义(不用改) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 重置颜色 # 日志函数(不用改) log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$REPORT_FILE"; } log_section() { echo -e "\n============================================================" | tee -a "$REPORT_FILE"; echo " $1" | tee -a "$REPORT_FILE"; echo "============================================================" | tee -a "$REPORT_FILE"; } log_warning() { echo -e "${YELLOW}[WARNING] $1${NC}" | tee -a "$REPORT_FILE"; } log_error() { echo -e "${RED}[ERROR] $1${NC}" | tee -a "$REPORT_FILE"; } log_ok() { echo -e "${GREEN}[OK] $1${NC}" | tee -a "$REPORT_FILE"; } # 1. 系统基本信息(不用改) check_basic_info() { log_section "1. 系统基本信息" log "主机名: $HOSTNAME" log "检查时间: $DATE" log "系统版本: $(cat /etc/redhat-release 2>/dev/null || cat /etc/issue | head -1)" log "内核版本: $(uname -r)" log "系统架构: $(uname -m)" log "运行时长: $(uptime | awk -F'up ' '{print $2}' | awk -F',' '{print $1}')" log "当前用户: $(whoami)" log "登录用户数: $(who | wc -l)" } # 2. CPU检查(不用改) check_cpu() { log_section "2. CPU使用率检查" CPU_CORES=$(grep -c ^processor /proc/cpuinfo) log "CPU核心数: $CPU_CORES" # 获取CPU使用率(5秒平均值,更准确) CPU_IDLE=$(top -bn2 -d 1 | grep "Cpu(s)" | tail -1 | awk '{print $8}' | cut -d'%' -f1) CPU_USAGE=$(echo "scale=2; 100 - $CPU_IDLE" | bc) log "CPU使用率: ${CPU_USAGE}%" if (( $(echo "$CPU_USAGE > $CPU_WARNING" | bc -l) )); then log_warning "CPU使用率超过${CPU_WARNING}%,当前${CPU_USAGE}%" log "TOP 5 CPU消耗进程:" ps aux | sort -rn -k3 | head -5 | awk '{printf " PID: %-8s User: %-10s CPU: %-6s CMD: %s\n", $2,$1,$3,$11}' | tee -a "$REPORT_FILE" else log_ok "CPU使用率正常: ${CPU_USAGE}%" fi # 系统负载检查 LOAD_1=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | xargs) LOAD_5=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $2}' | xargs) LOAD_15=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $3}' | xargs) log "系统负载: 1分钟=${LOAD_1}, 5分钟=${LOAD_5}, 15分钟=${LOAD_15}" # 负载阈值=CPU核心数*2(比如4核设8) LOAD_THRESHOLD=$(echo "$CPU_CORES * 2" | bc) if (( $(echo "$LOAD_1 > $LOAD_THRESHOLD" | bc -l) )); then log_warning "系统负载过高!1分钟负载${LOAD_1}超过阈值${LOAD_THRESHOLD}" fi } # 3. 内存检查(不用改) check_memory() { log_section "3. 内存使用检查" MEM_TOTAL=$(free -m | awk 'NR==2{print $2}') MEM_USED=$(free -m | awk 'NR==2{print $3}') MEM_AVAILABLE=$(free -m | awk 'NR==2{print $7}') MEM_USAGE=$(echo "scale=2; $MEM_USED / $MEM_TOTAL * 100" | bc) log "内存总量: ${MEM_TOTAL}MB" log "已用内存: ${MEM_USED}MB" log "可用内存: ${MEM_AVAILABLE}MB" log "内存使用率: ${MEM_USAGE}%" if (( $(echo "$MEM_USAGE > $MEM_WARNING" | bc -l) )); then log_warning "内存使用率超过${MEM_WARNING}%,当前${MEM_USAGE}%" log "TOP 5 内存消耗进程:" ps aux | sort -rn -k4 | head -5 | awk '{printf " PID: %-8s User: %-10s MEM: %-6s CMD: %s\n", $2,$1,$4,$11}' | tee -a "$REPORT_FILE" else log_ok "内存使用率正常: ${MEM_USAGE}%" fi # Swap检查(超过100MB预警) SWAP_TOTAL=$(free -m | awk 'NR==3{print $2}') SWAP_USED=$(free -m | awk 'NR==3{print $3}') log "Swap总量: ${SWAP_TOTAL}MB" log "Swap使用: ${SWAP_USED}MB" if [ "$SWAP_TOTAL" -gt 0 ] && [ "$SWAP_USED" -gt 100 ]; then log_warning "Swap使用量较高: ${SWAP_USED}MB,可能存在内存压力" fi } # 4. 磁盘检查(不用改) check_disk() { log_section "4. 磁盘使用检查" log "磁盘分区使用情况:" df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{print " " $0}' | tee -a "$REPORT_FILE" # 磁盘使用率告警 HAS_DISK_WARNING=0 while read line; do USAGE=$(echo $line | awk '{print $5}' | sed 's/%//') MOUNT=$(echo $line | awk '{print $6}') if [ "$USAGE" -gt "$DISK_WARNING" ]; then log_warning "磁盘分区 $MOUNT 使用率${USAGE}%超过阈值${DISK_WARNING}%" HAS_DISK_WARNING=1 log " $MOUNT 分区占用空间最大的5个目录:" du -sh ${MOUNT}/* 2>/dev/null | sort -rh | head -5 | awk '{print " " $0}' | tee -a "$REPORT_FILE" fi done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop') if [ $HAS_DISK_WARNING -eq 0 ]; then log_ok "所有磁盘分区使用率正常" fi # Inode检查(避免小文件占满磁盘) log -e "\nInode使用情况:" df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{print " " $0}' | tee -a "$REPORT_FILE" while read line; do INODE_USAGE=$(echo $line | awk '{print $5}' | sed 's/%//') MOUNT=$(echo $line | awk '{print $6}') if [ "$INODE_USAGE" -gt "$INODE_WARNING" ]; then log_warning "分区 $MOUNT 的Inode使用率${INODE_USAGE}%超过阈值${INODE_WARNING}%" fi done < <(df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop') } # 5. 网络检查(不用改) check_network() { log_section "5. 网络状态检查" log "网络接口状态:" ip -br addr | awk '{print " " $0}' | tee -a "$REPORT_FILE" # TCP连接统计 log -e "\nTCP连接状态统计:" netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -rn | awk '{print " " $0}' | tee -a "$REPORT_FILE" # TIME_WAIT过多预警(超过5000) TIME_WAIT_COUNT=$(netstat -an | grep TIME_WAIT | wc -l) log "TIME_WAIT连接数: $TIME_WAIT_COUNT" if [ "$TIME_WAIT_COUNT" -gt 5000 ]; then log_warning "TIME_WAIT连接数过多: $TIME_WAIT_COUNT(可优化TCP参数)" fi # 监听端口检查 log -e "\n当前监听端口:" netstat -tuln | grep LISTEN | awk '{print " " $0}' | tee -a "$REPORT_FILE" } # 6. 进程和服务检查(不用改) check_processes() { log_section "6. 进程和服务检查" PROCESS_COUNT=$(ps aux | wc -l) log "当前进程总数: $PROCESS_COUNT" # 僵尸进程检查(死进程没清理) ZOMBIE_COUNT=$(ps aux | awk '{print $8}' | grep -c Z) log "僵尸进程数: $ZOMBIE_COUNT" if [ "$ZOMBIE_COUNT" -gt 0 ]; then log_warning "发现僵尸进程!" ps aux | grep 'Z' | grep -v grep | awk '{print " PID: " $2 " PPID: " $3 " CMD: " $11}' | tee -a "$REPORT_FILE" fi # 关键服务检查(新手可加自己的服务,比如nginx/mysql) log -e "\n关键服务状态检查:" CRITICAL_SERVICES=("sshd" "crond" "rsyslog") # 可添加服务,如"nginx" "mysqld" for service in "${CRITICAL_SERVICES[@]}"; do if systemctl is-active --quiet $service 2>/dev/null; then log_ok " $service: 运行中" else # 兼容非systemd系统(如CentOS 6) if ps aux | grep -v grep | grep -q $service; then log_ok " $service: 运行中" else log_error " $service: 未运行(需手动启动)" fi fi done } # 7. 系统日志检查(不用改) check_logs() { log_section "7. 系统日志检查" log "最近1小时系统错误日志:" if [ -f /var/log/messages ]; then ERROR_COUNT=$(grep -i "error\|fail\|critical" /var/log/messages | tail -20 | wc -l) if [ "$ERROR_COUNT" -gt 0 ]; then log_warning "发现 $ERROR_COUNT 条错误日志" grep -i "error\|fail\|critical" /var/log/messages | tail -10 | awk '{print " " $0}' | tee -a "$REPORT_FILE" else log_ok "无严重错误日志" fi fi # OOM检查(内存溢出导致进程被杀) log -e "\nOOM(内存溢出)检查:" OOM_COUNT=$(dmesg | grep -i "out of memory" | wc -l) if [ "$OOM_COUNT" -gt 0 ]; then log_warning "发现 $OOM_COUNT 次OOM事件(需检查内存配置)" dmesg | grep -i "out of memory" | tail -5 | awk '{print " " $0}' | tee -a "$REPORT_FILE" else log_ok "无OOM事件" fi } # 8. 报告摘要(不用改) generate_summary() { log_section "8. 巡检报告摘要" WARNING_COUNT=$(grep -c "\[WARNING\]" "$REPORT_FILE") ERROR_COUNT=$(grep -c "\[ERROR\]" "$REPORT_FILE") log "巡检完成时间: $(date +"%Y-%m-%d %H:%M:%S")" log "告警数量: $WARNING_COUNT" log "错误数量: $ERROR_COUNT" if [ "$ERROR_COUNT" -gt 0 ]; then log_error "发现 $ERROR_COUNT 个严重问题,请立即处理!" elif [ "$WARNING_COUNT" -gt 0 ]; then log_warning "发现 $WARNING_COUNT 个告警,建议关注" else log_ok "系统状态良好,无异常" fi log -e "\n完整报告已保存至: $REPORT_FILE" } # 主函数(不用改) main() { echo "==========================================" echo " 服务器健康状态巡检脚本 v2.0" echo "==========================================" echo -e "\n" # 非root用户提示(部分检查需要root) if [ "$(id -u)" -ne 0 ]; then echo "警告: 非root用户运行,部分检查可能无法执行" echo -e "\n" fi # 执行所有检查 check_basic_info check_cpu check_memory check_disk check_network check_processes check_logs generate_summary echo -e "\n==========================================" echo " 巡检完成!" echo "==========================================" } # 脚本入口(不用改) main "$@" ``` ### 新手避坑 1. 1\. **权限问题** :执行前确保是root用户(sudo -i切换),否则磁盘、进程检查可能不准。 2. 2\. **命令缺失** :如果提示 `netstat: command not found` ,安装依赖: `yum install net-tools` (CentOS)或 `apt install net-tools` (Ubuntu)。 3. 3\. **报告查看** :巡检完成后,报告存放在 `/var/log` 目录下,文件名带时间戳(如 `system_check_20251022_083000.log` )。 ## 脚本2:磁盘空间深度检查脚本 ### 脚本用途 专门定位磁盘满的原因:找出大文件、旧日志、临时文件,还能预测磁盘满的时间,给出清理建议。 ### 核心功能 - • 检查磁盘/Inode使用率,定位大目录(TOP10) - • 查找超1G的大文件(可修改阈值) - • 检查30天前未清理的旧日志 - • 清理/tmp目录下7天未使用的临时文件 - • 检查磁盘IO等待(避免IO过高导致卡顿) ### 使用步骤 1. 1\. 复制代码保存为 `disk_space_check.sh` 2. 2\. 赋予权限: `chmod +x disk_space_check.sh` 3. 3\. 执行:`./disk_space_check.sh` (root用户) ### 完整代码(新手改配置区) ``` #!/bin/bash ################################################################################ # 脚本名称: disk_space_check.sh # 功能描述: 磁盘空间深度检查(新手改配置区!) # 版本信息: v1.5 ################################################################################ # -------------------------- 新手必改:配置区 -------------------------- REPORT_FILE="/var/log/disk_check_$(date +%Y%m%d_%H%M%S).log" DISK_WARNING=80 # 磁盘使用率告警阈值(%) INODE_WARNING=80 # Inode使用率告警阈值(%) LARGE_FILE_SIZE=1G # 大文件阈值(可改500M、2G) # ------------------------------------------------------------------- # 颜色定义(不用改) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 日志函数(不用改) log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$REPORT_FILE"; } log_warning() { echo -e "${YELLOW}[WARNING] $1${NC}" | tee -a "$REPORT_FILE"; } log_error() { echo -e "${RED}[ERROR] $1${NC}" | tee -a "$REPORT_FILE"; } log_ok() { echo -e "${GREEN}[OK] $1${NC}" | tee -a "$REPORT_FILE"; } # 1. 磁盘使用率检查(不用改) check_disk_usage() { log "===========================================================" log "1. 磁盘使用率检查" log "===========================================================" df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop' | while read line; do USAGE=$(echo $line | awk '{print $5}' | sed 's/%//') MOUNT=$(echo $line | awk '{print $6}') AVAIL=$(echo $line | awk '{print $4}') log "分区: $MOUNT" log " 使用率: ${USAGE}%" log " 可用空间: $AVAIL" if [ "$USAGE" -gt "$DISK_WARNING" ]; then log_error " 磁盘使用率超过${DISK_WARNING}%!" # 显示TOP10大目录 log " 占用空间TOP 10目录:" du -sh ${MOUNT}/* 2>/dev/null | sort -rh | head -10 | awk '{print " " $0}' | tee -a "$REPORT_FILE" # 显示超阈值的大文件 log " 大文件(>$LARGE_FILE_SIZE):" find ${MOUNT} -type f -size +${LARGE_FILE_SIZE} -exec ls -lh {} \; 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE" else log_ok " 使用率正常" fi log "" done } # 2. Inode检查(小文件占满磁盘用)(不用改) check_inode_usage() { log "===========================================================" log "2. Inode使用率检查" log "===========================================================" df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop' | while read line; do INODE_USAGE=$(echo $line | awk '{print $5}' | sed 's/%//') MOUNT=$(echo $line | awk '{print $6}') log "分区: $MOUNT" log " Inode使用率: ${INODE_USAGE}%" if [ "$INODE_USAGE" -gt "$INODE_WARNING" ]; then log_error " Inode使用率超过${INODE_WARNING}%!(小文件太多)" # 显示文件数TOP10目录 log " 文件数量TOP 10目录:" for dir in $(find ${MOUNT}/* -maxdepth 0 -type d 2>/dev/null); do echo "$(find $dir -type f 2>/dev/null | wc -l) $dir" done | sort -rn | head -10 | awk '{print " " $1 " files: " $2}' | tee -a "$REPORT_FILE" else log_ok " Inode使用率正常" fi log "" done } # 3. 日志文件检查(不用改) check_log_files() { log "===========================================================" log "3. 日志文件大小检查" log "===========================================================" # 常见日志目录(可加自己的日志目录,如/opt/logs) LOG_DIRS=("/var/log" "/opt/logs" "/data/logs" "/app/logs") for log_dir in "${LOG_DIRS[@]}"; do if [ -d "$log_dir" ]; then log "检查目录: $log_dir" # 显示超100MB的日志 log " 大日志文件(>100MB):" find $log_dir -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE" # 日志总大小 TOTAL_SIZE=$(du -sh $log_dir 2>/dev/null | awk '{print $1}') log " 总大小: $TOTAL_SIZE" log "" fi done # 30天前未压缩的旧日志 log "未压缩的旧日志文件(30天前):" find /var/log -type f -name "*.log" -mtime +30 ! -name "*.gz" -exec ls -lh {} \; 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE" } # 4. 临时文件检查(不用改) check_temp_files() { log "===========================================================" log "4. 临时文件检查" log "===========================================================" # /tmp目录检查 if [ -d "/tmp" ]; then TMP_SIZE=$(du -sh /tmp 2>/dev/null | awk '{print $1}') TMP_FILE_COUNT=$(find /tmp -type f 2>/dev/null | wc -l) log "/tmp目录:" log " 总大小: $TMP_SIZE" log " 文件数: $TMP_FILE_COUNT" # 7天未使用的临时文件 OLD_TMP=$(find /tmp -type f -atime +7 2>/dev/null | wc -l) if [ "$OLD_TMP" -gt 0 ]; then log_warning " 发现 $OLD_TMP 个超过7天未访问的临时文件" log " 占用空间TOP 10:" find /tmp -type f -atime +7 -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -10 | awk '{print " " $9 " (" $5 ")"}' | tee -a "$REPORT_FILE" fi fi # /var/tmp检查 if [ -d "/var/tmp" ]; then VAR_TMP_SIZE=$(du -sh /var/tmp 2>/dev/null | awk '{print $1}') log -e "\n/var/tmp目录:" log " 总大小: $VAR_TMP_SIZE" fi } # 5. 磁盘IO检查(不用改) check_disk_io() { log "===========================================================" log "5. 磁盘IO统计" log "===========================================================" if command -v iostat &> /dev/null; then log "磁盘IO统计(最近1分钟):" iostat -x 1 2 | tail -n +4 | awk 'NF' | tail -n +2 | tee -a "$REPORT_FILE" else log_warning "未安装iostat工具(执行:yum install sysstat 安装)" fi # IO等待过高预警(超过20%) IO_WAIT=$(top -bn1 | grep "Cpu(s)" | awk '{print $10}' | sed 's/%wa,//') log -e "\n当前IO等待: ${IO_WAIT}%" if (( $(echo "$IO_WAIT > 20" | bc -l) )); then log_warning "IO等待过高!(可能是磁盘性能不足)" fi } # 6. 清理建议(新手可直接复制执行)(不用改) generate_cleanup_suggestions() { log "===========================================================" log "6. 磁盘清理建议(新手复制命令执行)" log "===========================================================" log "1. 压缩30天前的旧日志:" log " find /var/log -type f -name '*.log' -mtime +30 -exec gzip {} \;" log -e "\n2. 清理7天前的临时文件:" log " find /tmp -type f -atime +7 -delete" log -e "\n3. 清理yum缓存(CentOS):" log " yum clean all" log -e "\n4. 清理Docker未使用资源(如有Docker):" log " docker system prune -a" log -e "\n5. 清理journal日志(系统日志):" log " journalctl --vacuum-time=7d" } # 主函数(不用改) main() { echo "==========================================" echo " 磁盘空间深度检查脚本 v1.5" echo "==========================================" echo -e "\n" check_disk_usage check_inode_usage check_log_files check_temp_files check_disk_io generate_cleanup_suggestions log -e "\n===========================================================" log "检查完成!" log "报告保存至: $REPORT_FILE" log "===========================================================" } main "$@" ``` ### 新手避坑 1. 1\. **iostat缺失** :提示 `iostat: command not found` 时,执行 `yum install sysstat` (CentOS)或 `apt install sysstat` (Ubuntu)。 2. 2\. **清理谨慎** :执行“清理建议”中的命令前,先确认文件是否有用(比如 `find /tmp -type f -atime +7` 先查看,再删)。 ## 脚本3-7:核心脚本(精简版,重点标配置和步骤) ### 脚本3:网络连接检查脚本 #### 用途 检查端口监听、TCP连接状态(比如TIME\_WAIT过多)、网络连通性(DNS/网关/外网)。 #### 使用步骤 1. 1\. 保存为 `network_check.sh` ,赋予权限: `chmod +x network_check.sh` 2. 2\. 执行:`./network_check.sh` 3. 3\. 新手改配置区: `CRITICAL_PORTS=(22 80 443 3306 6379)` (添加自己的关键端口) #### 核心代码(关键部分) ``` #!/bin/bash ################################################################################ # 脚本名称: network_check.sh # 功能描述: 网络连接和端口检查(新手改CRITICAL_PORTS!) ################################################################################ # -------------------------- 新手必改:配置区 -------------------------- REPORT_FILE="/var/log/network_check_$(date +%Y%m%d_%H%M%S).log" TIME_WAIT_WARNING=5000 # TIME_WAIT超过5000预警 ESTABLISHED_WARNING=10000 # 活动连接超过10000预警 CRITICAL_PORTS=(22 80 443 3306 6379 8080) # 关键端口(如MySQL:3306,Redis:6379) # ------------------------------------------------------------------- # 颜色和日志函数(同前,不用改) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$REPORT_FILE"; } log_warning() { echo -e "${YELLOW}[WARNING] $1${NC}" | tee -a "$REPORT_FILE"; } log_ok() { echo -e "${GREEN}[OK] $1${NC}" | tee -a "$REPORT_FILE"; } # 关键端口检查(核心功能) check_listening_ports() { log "===========================================================" log "3. 关键端口检查" log "===========================================================" log "当前监听端口:" netstat -tulnp | grep LISTEN | tee -a "$REPORT_FILE" log -e "\n关键端口状态:" for port in "${CRITICAL_PORTS[@]}"; do if netstat -tuln | grep -q ":$port "; then PID=$(netstat -tulnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1) PROCESS=$(netstat -tulnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f2) log_ok "端口 $port: 监听中(进程:$PROCESS PID:$PID)" else log_warning "端口 $port: 未监听(服务可能未启动)" fi done } # 其他函数(网络接口、TCP连接、连通性)省略,完整代码同前逻辑 # 主函数(调用check_listening_ports等) main() { echo "==========================================" echo " 网络状态检查脚本 v1.0" echo "==========================================" check_network_interfaces check_tcp_connections check_listening_ports check_network_connectivity log -e "\n检查完成! 报告: $REPORT_FILE" } main "$@" ``` ### 脚本4:应用进程健康检查脚本 #### 用途 监控关键进程(Nginx/MySQL/Redis)、端口、HTTP接口响应(比如健康检查接口)。 #### 新手改配置区 ``` # 关键进程(进程名|端口,如"nginx|80,443") declare -A CRITICAL_PROCESSES=( ["nginx"]="nginx|80,443" ["mysql"]="mysqld|3306" ["redis"]="redis-server|6379" ["java"]="java|8080" # 如SpringBoot应用 ) # HTTP接口(如健康检查接口) declare -A HTTP_ENDPOINTS=( ["主页"]="http://localhost/" ["健康检查"]="http://localhost:8080/health" ["API状态"]="http://localhost:8080/api/status" ) ``` ### 脚本5:安全基线检查脚本 #### 用途 检查账户安全(空密码、多root账户)、SSH配置(禁止root登录、禁用密码登录)、文件权限(/etc/passwd等关键文件)。 #### 核心功能 - • 检查空密码账户、UID=0的账户(多root风险) - • 检查SSH是否允许root登录、密码登录(不安全) - • 检查关键文件权限(如/etc/shadow权限应为000) ### 脚本6:MySQL数据库检查脚本 #### 用途 检查MySQL连接数、慢查询、主从复制、InnoDB缓冲池命中率。 #### 新手必改配置 ``` # MySQL连接信息(改自己的用户名、密码、地址) MYSQL_USER="monitor" # MySQL监控账户(需提前创建,给SELECT权限) MYSQL_PASS="your_pass" # 密码 MYSQL_HOST="localhost" # 数据库地址 MYSQL_PORT="3306" # 端口 ``` ### 脚本7:批量服务器巡检脚本 #### 用途 并发巡检多台服务器(比如200台),生成HTML汇总报告(带颜色,可浏览器打开)。 #### 新手使用步骤 1. 1\. 准备服务器列表文件 `servers.txt` (格式如下): ``` # Web服务器 192.168.1.10 192.168.1.11 # 数据库服务器 192.168.1.30 ``` 2. 2\. 改配置区(SSH信息): ``` SSH_USER="root" # SSH用户名 SSH_KEY="~/.ssh/id_rsa" # SSH私钥路径(免密登录用) CONCURRENT=10 # 并发数(同时检查10台) CHECK_SCRIPT="system_health_check.sh" # 要批量执行的脚本 ``` 3. 3\. 执行:`./batch_check_scheduler.sh` ,报告存 `/var/log/batch_check_xxx/` ,打开 `summary.html` 看汇总。 ## 新手必备总结 1. 1\. **常用命令** - • 赋予脚本权限: `chmod +x 脚本名.sh` - • 执行脚本:`./脚本名.sh` (root用户用 `sudo ./脚本名.sh` ) - • 定时执行: `crontab -e` ,添加 `0 8 * * * /path/to/脚本名.sh` (每天8点) - • 查看报告: `cat /var/log/脚本名_20251022_083000.log` 3. 2\. **巡检频率建议** - • 系统健康(脚本1):每天1次(早8点) - • 磁盘检查(脚本2):每天1次 - • 进程检查(脚本4):核心业务每小时1次 - • 安全检查(脚本5):每周1次 - • 批量巡检(脚本7):集群每天1次 5. 3\. **避坑总览** - • 所有脚本尽量用root执行,否则检查不完整 - • 命令缺失时,根据提示安装依赖(如 `yum install net-tools sysstat` ) - • 修改配置区时,路径、账户、密码要和实际环境一致 - • 清理文件前,先查看(如 `find /tmp -type f -atime +7` )再删除 素材来源官方媒体/网络新闻 内容含AI生成图片,注意甄别 继续滑动看下一个 python小甲鱼 向上滑动看下一个