脚本自动生成专业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自动巡检脚本是运维工程师的得力助手,它将繁琐的巡检工作自动化、标准化、可视化,大大提升了工作效率和质量。

相关推荐
java_logo2 小时前
SGLANG Docker容器化部署指南
linux·运维·docker·容器·eureka·1024程序员节
Qayrup2 小时前
各个系统的 docker安装
运维·docker·容器
敲代码的瓦龙3 小时前
操作系统?进程!!!
linux·c++·操作系统
打不了嗝 ᥬ᭄3 小时前
数据链路层
linux·网络·网络协议·http
piaoxue8204 小时前
MFA MACOS 安装流程
linux·运维·服务器
柱子子子子4 小时前
Ubuntu24.04 不能使用todesk 解决办法
运维·服务器
天若有情6735 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
BJ_Bonree5 小时前
圆桌论坛精华实录 | AI是重构运维逻辑的颠覆性革命?博睿数据与行业大咖亲授“AI+可观测性”的破局之道
运维·人工智能·重构
鱼干~5 小时前
electron基础
linux·javascript·electron