脚本自动生成专业Linux巡检报告

在日常运维工作中,定期对Linux服务器进行健康检查是必不可少的工作。然而,手动检查各项指标既耗时又容易遗漏重要信息。今天,我们将为大家分享一个功能强大的Linux自动巡检脚本,只需简单一行命令,就能生成专业的HTML巡检报告!

效果如下:

🚀 脚本亮点功能

📊 全面系统监控

系统基本信息:操作系统版本、内核版本、运行时间等

资源使用情况:CPU、内存、交换空间实时监控

磁盘空间分析:各分区使用率及预警提示

网络状态检查:IP地址、MAC地址、网络接口、路由信息

服务运行状态:常见系统服务运行状态监控

安全态势评估:登录用户、登录历史、防火墙状态

性能指标分析:进程资源占用、磁盘IO统计

🎨 专业报告展示

生成美观的HTML网页报告,包含:

清晰的分类展示

颜色状态标识(正常、警告、严重)

响应式设计,支持各种设备查看

专业的CSS样式,直接可用于汇报演示

📁 脚本源码获取

将以下完整脚本保存为 linux_inspection.sh:

复制代码
#!/bin/bash

# Linux系统巡检脚本
# 生成HTML格式的巡检报告

# 设置变量
REPORT_FILE="system_inspection_$(date +%Y%m%d_%H%M%S).html"
HOSTNAME=$(hostname)
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")

# 颜色定义(用于终端输出)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 检查命令是否存在
command_exists() {
    command -v "$1" &> /dev/null
}

# 获取IP地址和MAC地址信息
get_network_info() {
    local ip_addresses=""
    local mac_addresses=""

    # 使用ip命令获取网络信息(首选)
    if command_exists ip; then
        # 获取所有非回环的IPv4地址
        ip_addresses=$(ip -4 addr show 2>/dev/null | grep -E '^[0-9]+:' | awk '{print $2}' | sed 's/://' | while read iface; do
            ip_addr=$(ip -4 addr show dev "$iface" 2>/dev/null | grep inet | awk '{print $2}' | head -1)
            if [ -n "$ip_addr" ] && [ "$iface" != "lo" ]; then
                echo "$iface: $ip_addr"
            fi
        done | tr '\n' '; ' | sed 's/; $//')

        # 获取MAC地址
        mac_addresses=$(ip link show 2>/dev/null | grep -E '^[0-9]+:' | awk '{print $2}' | sed 's/://' | while read iface; do
            mac_addr=$(ip link show dev "$iface" 2>/dev/null | grep link/ether | awk '{print $2}')
            if [ -n "$mac_addr" ] && [ "$iface" != "lo" ]; then
                echo "$iface: $mac_addr"
            fi
        done | tr '\n' '; ' | sed 's/; $//')
    else
        # 使用ifconfig作为备选
        if command_exists ifconfig; then
            ip_addresses=$(ifconfig 2>/dev/null | grep -E 'inet (addr:)?' | grep -v '127.0.0.1' | awk '{if(match($0, /addr:[0-9.]+/)) print substr($0, RSTART+5, RLENGTH-5); else if(match($0, /inet [0-9.]+/)) print substr($0, RSTART+5, RLENGTH-5)}' | tr '\n' '; ' | sed 's/; $//')
            mac_addresses=$(ifconfig 2>/dev/null | grep -E 'ether ' | awk '{print $2}' | tr '\n' '; ' | sed 's/; $//')
        fi
    fi

    # 如果没有获取到IP地址,尝试其他方法
    if [ -z "$ip_addresses" ]; then
        if command_exists hostname; then
            ip_addresses=$(hostname -I 2>/dev/null | tr ' ' '; ' | sed 's/ $//')
        fi
    fi

    # 如果没有获取到MAC地址,尝试其他方法
    if [ -z "$mac_addresses" ]; then
        if [ -d "/sys/class/net" ]; then
            mac_addresses=$(find /sys/class/net -mindepth 1 -maxdepth 1 ! -name lo -exec basename {} \; | while read iface; do
                if [ -f "/sys/class/net/$iface/address" ]; then
                    mac=$(cat "/sys/class/net/$iface/address" 2>/dev/null)
                    echo "$iface: $mac"
                fi
            done | tr '\n' '; ' | sed 's/; $//')
        fi
    fi

    # 如果仍然为空,显示未知
    [ -z "$ip_addresses" ] && ip_addresses="未知"
    [ -z "$mac_addresses" ] && mac_addresses="未知"

    echo "$ip_addresses|$mac_addresses"
}

# 检查依赖命令
check_dependencies() {
    local missing=()

    if ! command_exists bc; then
        missing+=("bc")
    fi

    if ! command_exists iostat; then
        missing+=("sysstat (包含iostat)")
    fi

    if [ ${#missing[@]} -eq 0 ]; then
        echo "所有依赖命令都已安装"
    else
        echo "缺少的命令: ${missing[*]}"
        echo "建议安装:"
        if command_exists yum; then
            echo "sudo yum install ${missing[*]//sysstat (包含iostat)/sysstat} -y"
        elif command_exists apt-get; then
            echo "sudo apt-get update && sudo apt-get install ${missing[*]//sysstat (包含iostat)/sysstat} -y"
        fi
    fi
}

# 创建HTML报告头部
create_html_header() {
    # 获取网络信息
    local network_info=$(get_network_info)
    local ip_addresses=$(echo "$network_info" | cut -d'|' -f1)
    local mac_addresses=$(echo "$network_info" | cut -d'|' -f2)

    cat > $REPORT_FILE << EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Linux系统巡检报告 - $HOSTNAME</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', Arial, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
            color: #333;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        .header {
            text-align: center;
            border-bottom: 2px solid #007cba;
            padding-bottom: 15px;
            margin-bottom: 20px;
        }
        .header-info {
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
            gap: 20px;
            margin-top: 15px;
        }
        .info-item {
            background: #e8f4fc;
            padding: 8px 15px;
            border-radius: 4px;
            border-left: 4px solid #007cba;
        }
        .section {
            margin-bottom: 25px;
            border: 1px solid #ddd;
            border-radius: 5px;
            padding: 15px;
            background: #fafafa;
        }
        .section-title {
            background: #007cba;
            color: white;
            padding: 10px;
            margin: -15px -15px 15px -15px;
            border-radius: 5px 5px 0 0;
            font-weight: bold;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 10px;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px 12px;
            text-align: left;
        }
        th {
            background-color: #e8f4fc;
        }
        .warning {
            background-color: #fff3cd;
            border-left: 4px solid #ffc107;
            padding: 10px;
            margin: 10px 0;
        }
        .critical {
            background-color: #f8d7da;
            border-left: 4px solid #dc3545;
            padding: 10px;
            margin: 10px 0;
        }
        .good {
            background-color: #d1edff;
            border-left: 4px solid #28a745;
            padding: 10px;
            margin: 10px 0;
        }
        pre {
            background: #2d2d2d;
            color: #f8f8f2;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
            font-size: 12px;
        }
        .status-ok { color: #28a745; font-weight: bold; }
        .status-warning { color: #ffc107; font-weight: bold; }
        .status-critical { color: #dc3545; font-weight: bold; }
        .info-box {
            background: #e7f3ff;
            border-left: 4px solid #007cba;
            padding: 10px;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>Linux系统巡检报告</h1>
            <h2>主机名: $HOSTNAME</h2>
            <p>检查时间: $CURRENT_TIME</p>
            <div class="header-info">
                <div class="info-item">
                    <strong>IP地址:</strong> $ip_addresses
                </div>
                <div class="info-item">
                    <strong>MAC地址:</strong> $mac_addresses
                </div>
            </div>
        </div>
EOF
}

# 添加HTML报告尾部
add_html_footer() {
    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">报告说明</div>
            <p>本报告由Linux系统巡检脚本自动生成</p>
            <p>生成时间: $CURRENT_TIME</p>
            <div class="info-box">
                <strong>依赖检查:</strong><br>
                $(check_dependencies)
            </div>
        </div>
    </div>
</body>
</html>
EOF
}

# 系统基本信息检查
check_system_info() {
    echo -e "${BLUE}[信息] 检查系统基本信息...${NC}"

    # 再次获取网络信息用于详细显示
    local network_info=$(get_network_info)
    local ip_addresses=$(echo "$network_info" | cut -d'|' -f1)
    local mac_addresses=$(echo "$network_info" | cut -d'|' -f2)

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">1. 系统基本信息</div>
            <table>
                <tr><th>项目</th><th>值</th></tr>
EOF

    # 系统信息
    if [ -f /etc/os-release ]; then
        OS_INFO=$(grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"' | head -1)
    elif [ -f /etc/redhat-release ]; then
        OS_INFO=$(cat /etc/redhat-release)
    elif [ -f /etc/issue ]; then
        OS_INFO=$(head -n 1 /etc/issue)
    else
        OS_INFO="Unknown"
    fi

    KERNEL_VERSION=$(uname -r)
    ARCHITECTURE=$(uname -m)
    UPTIME=$(uptime -p 2>/dev/null || uptime | sed 's/.*up //' | sed 's/,.*//')
    LAST_BOOT=$(who -b 2>/dev/null | awk '{print $3, $4}' | head -1)

    echo "<tr><td>操作系统</td><td>$OS_INFO</td></tr>" >> $REPORT_FILE
    echo "<tr><td>内核版本</td><td>$KERNEL_VERSION</td></tr>" >> $REPORT_FILE
    echo "<tr><td>系统架构</td><td>$ARCHITECTURE</td></tr>" >> $REPORT_FILE
    echo "<tr><td>运行时间</td><td>$UPTIME</td></tr>" >> $REPORT_FILE
    echo "<tr><td>最后启动</td><td>$LAST_BOOT</td></tr>" >> $REPORT_FILE
    echo "<tr><td>IP地址</td><td>$ip_addresses</td></tr>" >> $REPORT_FILE
    echo "<tr><td>MAC地址</td><td>$mac_addresses</td></tr>" >> $REPORT_FILE

    echo "</table></div>" >> $REPORT_FILE
}

# CPU和内存检查
check_cpu_memory() {
    echo -e "${BLUE}[信息] 检查CPU和内存使用情况...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">2. CPU和内存信息</div>
EOF

    # CPU信息
    CPU_CORES=$(nproc 2>/dev/null || grep -c ^processor /proc/cpuinfo 2>/dev/null || echo "未知")
    CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^ *//')

    # 使用top或/proc/stat获取CPU使用率
    if command_exists top; then
        CPU_USAGE=$(top -bn1 2>/dev/null | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}')
    else
        CPU_USAGE="无法获取"
    fi

    # 内存信息
    MEM_TOTAL=$(free -h 2>/dev/null | grep Mem | awk '{print $2}')
    MEM_USED=$(free -h 2>/dev/null | grep Mem | awk '{print $3}')
    MEM_FREE=$(free -h 2>/dev/null | grep Mem | awk '{print $4}')
    MEM_PERCENT=$(free 2>/dev/null | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')

    # 交换空间
    SWAP_TOTAL=$(free -h 2>/dev/null | grep Swap | awk '{print $2}')
    SWAP_USED=$(free -h 2>/dev/null | grep Swap | awk '{print $3}')

    cat >> $REPORT_FILE << EOF
            <table>
                <tr><th>项目</th><th>值</th><th>状态</th></tr>
                <tr><td>CPU核心数</td><td>$CPU_CORES</td><td class="status-ok">正常</td></tr>
                <tr><td>系统负载</td><td>$CPU_LOAD</td><td>$(check_load_status "$CPU_LOAD" "$CPU_CORES")</td></tr>
                <tr><td>CPU使用率</td><td>$CPU_USAGE</td><td>$(check_cpu_status "$CPU_USAGE")</td></tr>
                <tr><td>总内存</td><td>$MEM_TOTAL</td><td class="status-ok">正常</td></tr>
                <tr><td>已用内存</td><td>$MEM_USED ($MEM_PERCENT%)</td><td>$(check_memory_status "$MEM_PERCENT")</td></tr>
                <tr><td>可用内存</td><td>$MEM_FREE</td><td>$(check_memory_status "$MEM_PERCENT")</td></tr>
                <tr><td>交换空间</td><td>总: $SWAP_TOTAL, 已用: $SWAP_USED</td><td>$(check_swap_status "$SWAP_USED")</td></tr>
            </table>
        </div>
EOF
}

# 磁盘空间检查
check_disk_usage() {
    echo -e "${BLUE}[信息] 检查磁盘使用情况...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">3. 磁盘空间信息</div>
            <table>
                <tr><th>文件系统</th><th>大小</th><th>已用</th><th>可用</th><th>使用率</th><th>挂载点</th><th>状态</th></tr>
EOF

    # 获取磁盘信息,排除临时文件系统
    df -h 2>/dev/null | grep -vE '^tmpfs|^devtmpfs|^overlay|^shm' | tail -n +2 | while read line; do
        FILESYSTEM=$(echo "$line" | awk '{print $1}')
        SIZE=$(echo "$line" | awk '{print $2}')
        USED=$(echo "$line" | awk '{print $3}')
        AVAIL=$(echo "$line" | awk '{print $4}')
        USE_PERCENT=$(echo "$line" | awk '{print $5}' | sed 's/%//')
        MOUNTED_ON=$(echo "$line" | awk '{for(i=6;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ *$//')

        STATUS=$(check_disk_status "$USE_PERCENT")

        echo "<tr><td>$FILESYSTEM</td><td>$SIZE</td><td>$USED</td><td>$AVAIL</td><td>$USE_PERCENT%</td><td>$MOUNTED_ON</td><td>$STATUS</td></tr>" >> $REPORT_FILE
    done

    echo "</table></div>" >> $REPORT_FILE
}

# 网络连接检查
check_network() {
    echo -e "${BLUE}[信息] 检查网络连接...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">4. 网络信息</div>
            <h4>网络接口信息:</h4>
            <pre>$(ip addr show 2>/dev/null || ifconfig 2>/dev/null || echo "网络命令不可用")</pre>

            <h4>路由表:</h4>
            <pre>$(ip route 2>/dev/null || route -n 2>/dev/null || echo "路由命令不可用")</pre>

            <h4>监听端口:</h4>
            <pre>$(ss -tuln 2>/dev/null || netstat -tuln 2>/dev/null || echo "端口检查命令不可用")</pre>
        </div>
EOF
}

# 系统服务检查
check_services() {
    echo -e "${BLUE}[信息] 检查系统服务...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">5. 系统服务状态</div>
            <table>
                <tr><th>服务名称</th><th>状态</th><th>启用状态</th></tr>
EOF

    # 检查常见服务
    SERVICES=("sshd" "crond" "nginx" "httpd" "mysql" "mariadb" "postgresql" "docker" "redis" "rabbitmq" "rsyslog" "systemd-journald" "network" "NetworkManager")

    for service in "${SERVICES[@]}"; do
        # 检查服务是否存在
        if (command_exists systemctl && systemctl list-unit-files 2>/dev/null | grep -q "$service.service") || \
           ([ -f "/etc/init.d/$service" ]) || \
           (command_exists service && service --status-all 2>/dev/null | grep -q "$service"); then

            if command_exists systemctl; then
                SERVICE_STATUS=$(systemctl is-active "$service" 2>/dev/null || echo "not-found")
                SERVICE_ENABLED=$(systemctl is-enabled "$service" 2>/dev/null || echo "not-found")
            elif command_exists service; then
                # 使用service命令
                if service "$service" status >/dev/null 2>&1; then
                    SERVICE_STATUS="active"
                else
                    SERVICE_STATUS="inactive"
                fi
                # 简单的启用状态检查
                if [ -f "/etc/init.d/$service" ]; then
                    SERVICE_ENABLED="enabled"
                else
                    SERVICE_ENABLED="unknown"
                fi
            else
                SERVICE_STATUS="unknown"
                SERVICE_ENABLED="unknown"
            fi

            # 设置状态显示
            if [ "$SERVICE_STATUS" = "active" ] || [ "$SERVICE_STATUS" = "running" ]; then
                STATUS_CLASS="status-ok"
                STATUS_TEXT="运行中"
            elif [ "$SERVICE_STATUS" = "not-found" ] || [ "$SERVICE_STATUS" = "unknown" ]; then
                STATUS_CLASS=""
                STATUS_TEXT="未找到"
            else
                STATUS_CLASS="status-critical"
                STATUS_TEXT="未运行"
            fi

            # 设置启用状态显示
            if [ "$SERVICE_ENABLED" = "enabled" ]; then
                ENABLED_CLASS="status-ok"
                ENABLED_TEXT="已启用"
            elif [ "$SERVICE_ENABLED" = "not-found" ] || [ "$SERVICE_ENABLED" = "unknown" ]; then
                ENABLED_CLASS=""
                ENABLED_TEXT="未知"
            else
                ENABLED_CLASS="status-warning"
                ENABLED_TEXT="未启用"
            fi

            echo "<tr><td>$service</td><td class=\"$STATUS_CLASS\">$STATUS_TEXT</td><td class=\"$ENABLED_CLASS\">$ENABLED_TEXT</td></tr>" >> $REPORT_FILE
        fi
    done

    echo "</table></div>" >> $REPORT_FILE
}

# 安全检查
check_security() {
    echo -e "${BLUE}[信息] 进行安全检查...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">6. 安全信息</div>
EOF

    # 检查登录用户
    cat >> $REPORT_FILE << EOF
            <h4>当前登录用户:</h4>
            <pre>$(who 2>/dev/null || echo "无法获取登录用户信息")</pre>

            <h4>最近登录信息:</h4>
            <pre>$(last -n 10 2>/dev/null || echo "无法获取登录历史")</pre>
EOF

    # 检查失败的登录尝试
    FAILED_LOGINS=""
    if [ -f "/var/log/secure" ]; then
        FAILED_LOGINS=$(grep "Failed password" /var/log/secure 2>/dev/null | wc -l)
    elif [ -f "/var/log/auth.log" ]; then
        FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log 2>/dev/null | wc -l)
    fi

    if [ -n "$FAILED_LOGINS" ]; then
        echo "<p>失败登录尝试: $FAILED_LOGINS</p>" >> $REPORT_FILE
    fi

    # 检查防火墙状态
    if command_exists firewall-cmd; then
        FIREWALL_STATUS=$(firewall-cmd --state 2>/dev/null || echo "未运行")
        echo "<p>防火墙状态: $FIREWALL_STATUS</p>" >> $REPORT_FILE
    elif command_exists ufw; then
        FIREWALL_STATUS=$(ufw status 2>/dev/null | head -1)
        echo "<p>防火墙状态: $FIREWALL_STATUS</p>" >> $REPORT_FILE
    elif command_exists iptables; then
        echo "<p>防火墙: 使用iptables</p>" >> $REPORT_FILE
    fi

    echo "</div>" >> $REPORT_FILE
}

# 性能检查
check_performance() {
    echo -e "${BLUE}[信息] 检查系统性能...${NC}"

    cat >> $REPORT_FILE << EOF
        <div class="section">
            <div class="section-title">7. 性能信息</div>
            <h4>进程资源使用TOP 10:</h4>
            <pre>$(ps aux --sort=-%cpu 2>/dev/null | head -n 11)</pre>

            <h4>内存使用TOP 10:</h4>
            <pre>$(ps aux --sort=-%mem 2>/dev/null | head -n 11)</pre>

            <h4>磁盘IO信息:</h4>
            <pre>$(if command_exists iostat; then iostat -x 1 1 2>/dev/null || iostat 1 1 2>/dev/null; else echo "iostat命令未安装,使用替代信息:"; echo "=== 磁盘使用情况 ==="; df -h; echo ""; echo "=== 磁盘读写统计 ==="; if [ -f /proc/diskstats ]; then echo "磁盘设备 读次数 读扇区 写次数 写扇区"; cat /proc/diskstats | head -10; else echo "无法获取磁盘统计信息"; fi; fi)</pre>

            <h4>系统内存详细信息:</h4>
            <pre>$(free -h 2>/dev/null || echo "无法获取内存信息")</pre>

            <h4>虚拟内存统计:</h4>
            <pre>$(if command_exists vmstat; then vmstat 1 5 2>/dev/null; else echo "vmstat命令不可用"; fi)</pre>
        </div>
EOF
}

# 状态检查函数
check_load_status() {
    local load=$1
    local cores=$2
    local load1=$(echo "$load" | awk -F',' '{print $1}' | sed 's/ //g')

    # 如果cores不是数字,设为1
    if ! echo "$cores" | grep -qE '^[0-9]+$'; then
        cores=1
    fi

    # 如果bc不可用,使用基本的比较
    if command_exists bc; then
        if (( $(echo "$load1 > $cores" | bc -l 2>/dev/null) )); then
            echo "<span class=\"status-critical\">警告</span>"
        elif (( $(echo "$load1 > $cores * 0.7" | bc -l 2>/dev/null) )); then
            echo "<span class=\"status-warning\">注意</span>"
        else
            echo "<span class=\"status-ok\">正常</span>"
        fi
    else
        # 简单的整数比较
        load1_int=$(echo "$load1" | cut -d. -f1)
        if [ "$load1_int" -gt "$cores" ] 2>/dev/null; then
            echo "<span class=\"status-critical\">警告</span>"
        elif [ "$load1_int" -gt $((cores * 7 / 10)) ] 2>/dev/null; then
            echo "<span class=\"status-warning\">注意</span>"
        else
            echo "<span class=\"status-ok\">正常</span>"
        fi
    fi
}

check_cpu_status() {
    local usage=$1
    local usage_num=$(echo "$usage" | sed 's/%//' | cut -d. -f1)

    if echo "$usage_num" | grep -qE '^[0-9]+$'; then
        if [ "$usage_num" -gt 90 ] 2>/dev/null; then
            echo "<span class=\"status-critical\">过高</span>"
        elif [ "$usage_num" -gt 70 ] 2>/dev/null; then
            echo "<span class=\"status-warning\">偏高</span>"
        else
            echo "<span class=\"status-ok\">正常</span>"
        fi
    else
        echo "<span class=\"\">未知</span>"
    fi
}

check_memory_status() {
    local usage=$1
    if echo "$usage" | grep -qE '^[0-9.]+$'; then
        if command_exists bc; then
            if [ "$(echo "$usage > 90" | bc)" -eq 1 ]; then
                echo "<span class=\"status-critical\">严重</span>"
            elif [ "$(echo "$usage > 80" | bc)" -eq 1 ]; then
                echo "<span class=\"status-warning\">警告</span>"
            else
                echo "<span class=\"status-ok\">正常</span>"
            fi
        else
            # 简单的整数比较
            usage_int=$(echo "$usage" | cut -d. -f1)
            if [ "$usage_int" -gt 90 ]; then
                echo "<span class=\"status-critical\">严重</span>"
            elif [ "$usage_int" -gt 80 ]; then
                echo "<span class=\"status-warning\">警告</span>"
            else
                echo "<span class=\"status-ok\">正常</span>"
            fi
        fi
    else
        echo "<span class=\"\">未知</span>"
    fi
}

check_swap_status() {
    local used=$1
    if [ "$used" != "0B" ] && [ "$used" != "0" ] && [ "$used" != "0.0B" ] && [ "$used" != "未知" ]; then
        echo "<span class=\"status-warning\">使用中</span>"
    else
        echo "<span class=\"status-ok\">正常</span>"
    fi
}

check_disk_status() {
    local usage=$1
    if echo "$usage" | grep -qE '^[0-9]+$'; then
        if [ "$usage" -gt 95 ]; then
            echo "<span class=\"status-critical\">严重</span>"
        elif [ "$usage" -gt 85 ]; then
            echo "<span class=\"status-warning\">警告</span>"
        else
            echo "<span class=\"status-ok\">正常</span>"
        fi
    else
        echo "<span class=\"\">未知</span>"
    fi
}

# 主函数
main() {
    echo -e "${GREEN}开始Linux系统巡检...${NC}"
    echo -e "${GREEN}生成报告文件: $REPORT_FILE${NC}"

    # 检查是否需要root权限
    if [ "$EUID" -ne 0 ]; then
        echo -e "${YELLOW}警告: 非root用户运行,部分信息可能无法获取${NC}"
    fi

    create_html_header
    check_system_info
    check_cpu_memory
    check_disk_usage
    check_network
    check_services
    check_security
    check_performance
    add_html_footer

    echo -e "${GREEN}巡检完成! 报告已生成: $REPORT_FILE${NC}"
    echo -e "${YELLOW}请在浏览器中打开该文件查看完整报告${NC}"

    # 尝试自动打开报告(如果支持)
    if command_exists xdg-open; then
        xdg-open "$REPORT_FILE" 2>/dev/null &
    elif command_exists open; then
        open "$REPORT_FILE" 2>/dev/null &
    fi
}

# 执行主函数
main "$@"
复制代码
🛠 使用方法

第一步:创建脚本并授予可执行权限

复制代码
vi 随便起个名字.sh
例如:linux_inspection.sh

chmod +x linux_inspection.sh

#安装必要的两个工具
yum install sysstat -y
yum install bc -y

第二步:运行脚本

复制代码
# 普通运行(部分信息可能受限)
./linux_inspection.sh

# 推荐使用root权限运行(获取完整信息)
sudo ./linux_inspection.sh

第三步:查看报告

脚本运行后会自动生成HTML报告文件,可直接下载到本地,直接用浏览器打开看即可。

💡 实际应用场景

🏢 企业运维管理

日常巡检:每日定时执行,监控服务器健康状态

故障排查:快速定位系统瓶颈和异常问题

合规审计:生成标准化报告满足审计要求

☁️ 云服务器管理

多节点监控:批量检查云服务器运行状态

资源优化:分析资源使用情况,合理调整配置

成本控制:识别闲置资源,优化云服务开支

📚 学习培训用途

教学演示:直观展示Linux系统各项指标

技能提升:帮助新手理解系统监控要点

知识沉淀:建立标准化的巡检流程

🌟 脚本优势

🔧 技术特点

全面兼容:支持CentOS、Ubuntu、RedHat等主流Linux发行版

智能容错:完善的错误处理机制,避免因单个命令失败而中断

状态预警:智能识别异常状态,用颜色标识严重程度

零依赖:基于系统内置命令,无需安装额外软件包

💼 实用价值

效率提升:手动巡检需要30分钟,脚本只需10秒钟

标准统一:确保每次巡检的项目和标准一致

文档完善:生成可直接用于汇报的专业报告

知识传承:新员工也能快速上手系统巡检工作

🔄 进阶使用技巧

定时自动巡检

设置cron任务,实现每日自动巡检:

复制代码
# 每天上午9点执行巡检
0 9 * * * /root/linux_inspection.sh > /dev/null 2>&1

多服务器批量巡检

使用ansible或ssh批量在多台服务器上执行:​​​​​​​

复制代码
# 使用ansible批量执行
ansible all -m script -a "linux_inspection.sh"

# 使用parallel-ssh批量执行
pssh -h hostlist.txt -i './linux_inspection.sh'

📈 效果展示

生成的巡检报告包含:

✅ 清晰的系统概览信息

✅ 实时的资源使用情况

✅ 可视化的状态指示器

✅ 详细的服务运行状态

✅ 安全相关的检查项目

✅ 性能瓶颈分析数据

🎯 总结

这个Linux自动巡检脚本是运维工程师的得力助手,它将繁琐的巡检工作自动化、标准化、可视化,大大提升了工作效率和质量。

相关推荐
律宏阔4 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔4 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴4 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千5 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei375 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei375 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei375 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh5 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW5 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲5 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js