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