分享:一键自动化巡检服务器

在服务器上编写下列脚本check.sh

bash 复制代码
#!/bin/bash
# 综合系统巡检工具
# 功能整合:安全检测、性能监控、环境变量检查、句柄分析、服务状态监控等
# 使用前请以root权限运行,建议定期执行(如每日/每周)

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
    echo -e "${RED}错误:此脚本需要以root权限运行,请使用sudo或切换到root用户${NC}"
    exit 1
fi

# 检查必要工具是否安装
check_dependencies() {
    local deps="sysstat iotop net-tools bc lsof"
    local missing=""

    for dep in $deps; do
        if ! command -v $dep &> /dev/null && ! dpkg -s $dep &> /dev/null && ! rpm -q $dep &> /dev/null; then
            missing="$missing $dep"
        fi
    done

    if [ -n "$missing" ]; then
        echo -e "${YELLOW}检测到缺少必要工具,正在尝试安装...${NC}"
        if command -v apt &> /dev/null; then
            apt update -y &> /dev/null
            apt install -y $missing &> /dev/null
        elif command -v yum &> /dev/null; then
            yum install -y $missing &> /dev/null
        else
            echo -e "${RED}无法自动安装依赖,请手动安装: $missing${NC}"
            exit 1
        fi
    fi
}

# 初始化巡检报告
REPORT_FILE="system_inspection_$(date +%Y%m%d_%H%M%S).log"
echo -e "系统综合巡检报告 - $(date)\n" > $REPORT_FILE

# 添加内容到报告
add_to_report() {
    echo -e "$1" >> $REPORT_FILE
}

# 显示开始信息
echo -e "${YELLOW}===== 系统综合巡检工具 ====="
echo "巡检时间: $(date)"
echo "报告将保存至: $REPORT_FILE"
echo "正在检查依赖工具..."
check_dependencies
echo "=================================${NC}"

# 1. 系统基本信息
echo -e "\n${BLUE}1. 系统基本信息${NC}"
add_to_report "1. 系统基本信息"

os_info=$(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"' 2>/dev/null || echo "未知")
kernel_version=$(uname -r)
hostname=$(hostname)
uptime=$(uptime | awk '{print $3 " " $4}' | sed 's/,//')
ip_address=$(hostname -I | awk '{print $1}')

echo -e "  系统版本: $os_info"
echo -e "  内核版本: $kernel_version"
echo -e "  主机名: $hostname"
echo -e "  IP地址: $ip_address"
echo -e "  运行时间: $uptime"
add_to_report "  系统版本: $os_info"
add_to_report "  内核版本: $kernel_version"
add_to_report "  主机名: $hostname"
add_to_report "  IP地址: $ip_address"
add_to_report "  运行时间: $uptime"

# 2. 环境变量安全检测
echo -e "\n${BLUE}2. 环境变量安全检测${NC}"
add_to_report "\n2. 环境变量安全检测"

# 2.1 PATH环境变量分析
echo -e "  PATH环境变量分析..."
path_var=$PATH
IFS=':' read -ra path_array <<< "$path_var"
echo "    PATH包含 ${#path_array[@]} 个路径"
add_to_report "    PATH包含 ${#path_array[@]} 个路径"

dangerous_paths="/ /root /tmp /var/tmp /dev/shm"
for path in "${path_array[@]}"; do
    for dangerous in $dangerous_paths; do
        if [ "$path" = "$dangerous" ]; then
            echo -e "${RED}    危险路径: $path (包含在PATH中)${NC}"
            add_to_report "    ${RED}危险路径: $path (包含在PATH中)${NC}"
        fi
    done

    if [ -d "$path" ] && [ -w "$path" ] && ! ls -ld "$path" | grep -qE '^drwxr-xr-x'; then
        echo -e "${YELLOW}    可写路径: $path (存在非授权写入风险)${NC}"
        add_to_report "    ${YELLOW}可写路径: $path (存在非授权写入风险)${NC}"
    fi
done

# 2.2 敏感环境变量扫描
echo -e "\n  敏感环境变量扫描..."
sensitive_vars="PASSWORD SECRET KEY TOKEN CREDENTIAL PASS DB_PASS"
found_sensitive=0
for var in $sensitive_vars; do
    matches=$(env | grep -i "$var" | grep -v -E '^SHLVL=|^PWD=|^_=|^LS_COLORS=')
    if [ -n "$matches" ]; then
        found_sensitive=1
        echo -e "${YELLOW}    潜在敏感变量:${NC}"
        echo "$matches" | awk -F= '{print "      " $1 "=***(内容已隐藏)***"}'
        add_to_report "    ${YELLOW}潜在敏感变量: $var${NC}"
    fi
done
if [ $found_sensitive -eq 0 ]; then
    echo -e "${GREEN}    未发现明显敏感环境变量${NC}"
    add_to_report "    ${GREEN}未发现明显敏感环境变量${NC}"
fi

# 2.3 环境配置文件检查
echo -e "\n  环境配置文件权限检查..."
env_files="/etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile"
for file in $env_files; do
    expanded_file=$(eval echo "$file")
    if [ -f "$expanded_file" ]; then
        perms=$(stat -c "%a" "$expanded_file" 2>/dev/null || echo "未知")
        if [ "$perms" -gt 644 ] 2>/dev/null; then
            echo -e "${RED}    不安全权限: $expanded_file (权限$perms,建议≤644)${NC}"
            add_to_report "    ${RED}不安全权限: $expanded_file (权限$perms,建议≤644)${NC}"
        else
            echo -e "    安全权限: $expanded_file (权限$perms)"
            add_to_report "    安全权限: $expanded_file (权限$perms)"
        fi
    fi
done

# 3. 系统句柄数分析
echo -e "\n${BLUE}3. 系统句柄数分析${NC}"
add_to_report "\n3. 系统句柄数分析"

# 3.1 句柄限制配置
echo -e "  句柄限制配置..."
sys_max_open=$(cat /proc/sys/fs/file-max 2>/dev/null || echo "0")
sys_current_max=$(cat /proc/sys/fs/file-nr 2>/dev/null | awk '{print $1}' || echo "0")
sys_available=$((sys_max_open - sys_current_max))

echo "    系统级最大句柄数: $sys_max_open"
echo "    当前系统已使用句柄: $sys_current_max"
echo "    系统句柄剩余可用: $sys_available"
add_to_report "    系统级最大句柄数: $sys_max_open"
add_to_report "    当前系统已使用句柄: $sys_current_max"
add_to_report "    系统句柄剩余可用: $sys_available"

user_soft=$(ulimit -Sn 2>/dev/null || echo "未知")
user_hard=$(ulimit -Hn 2>/dev/null || echo "未知")
echo "    用户级句柄限制(软): $user_soft"
echo "    用户级句柄限制(硬): $user_hard"
add_to_report "    用户级句柄限制(软): $user_soft"
add_to_report "    用户级句柄限制(硬): $user_hard"

if command -v bc &> /dev/null && [ "$sys_max_open" -gt 0 ]; then
    usage_rate=$(echo "scale=2; $sys_current_max / $sys_max_open * 100" | bc)
    echo "    系统句柄整体使用率: $usage_rate%"
    add_to_report "    系统句柄整体使用率: $usage_rate%"

    if (( $(echo "$usage_rate > 80" | bc -l) )); then
        echo -e "${RED}    警告: 系统句柄使用率超过80%,可能面临耗尽风险${NC}"
        add_to_report "    ${RED}警告: 系统句柄使用率超过80%,可能面临耗尽风险${NC}"
    fi
else
    echo "    系统句柄整体使用率: 无法计算(bc未安装或数据无效)"
    add_to_report "    系统句柄整体使用率: 无法计算(bc未安装或数据无效)"
fi

# 3.2 进程句柄TOP分析
echo -e "\n  句柄使用TOP 10进程..."
if command -v lsof &> /dev/null; then
    echo "    排名  PID    句柄数  进程名"
    echo "    -------------------------"
    add_to_report "    进程句柄使用TOP 10:"
    add_to_report "    排名  PID    句柄数  进程名"
    add_to_report "    -------------------------"

    rank=0
    lsof -n 2>/dev/null | awk '{print $2}' | sort | uniq -c | sort -nr | head -10 | while read count pid; do
        if [ -n "$pid" ] && [ "$pid" -gt 0 ] 2>/dev/null; then
            cmd=$(ps -p $pid -o comm= 2>/dev/null || echo "未知")
            rank=$((rank+1))
            printf "    %-5d %-6d %-7d %s\n" $rank $pid $count "$cmd"
            add_to_report "    $rank    $pid    $count    $cmd"
        fi
    done
else
    echo -e "${YELLOW}    lsof未安装,无法分析进程句柄使用情况${NC}"
    add_to_report "    ${YELLOW}lsof未安装,无法分析进程句柄使用情况${NC}"
fi

# 4. 系统性能深度检测
echo -e "\n${BLUE}4. 系统性能检测${NC}"
add_to_report "\n4. 系统性能检测"

# 4.1 CPU性能分析
echo -e "  CPU性能分析..."
cpu_cores=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || echo "未知")
cpu_model=$(grep -m1 'model name' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed -e 's/^ *//' || echo "未知")

echo "    CPU型号: $cpu_model"
echo "    CPU核心数: $cpu_cores"
add_to_report "    CPU型号: $cpu_model"
add_to_report "    CPU核心数: $cpu_cores"

if command -v mpstat &> /dev/null; then
    cpu_usage=$(mpstat 5 1 2>/dev/null | awk '/Average/ {printf "%.2f", 100 - $13}' || echo "未知")
    echo "    CPU平均使用率(5秒): $cpu_usage%"
    add_to_report "    CPU平均使用率(5秒): $cpu_usage%"

    if command -v bc &> /dev/null && [ "$cpu_usage" != "未知" ]; then
        if (( $(echo "$cpu_usage > 80" | bc -l) )); then
            echo -e "${RED}    警告: CPU使用率超过80%${NC}"
            add_to_report "    ${RED}警告: CPU使用率超过80%${NC}"
        fi
    fi
else
    echo "    CPU平均使用率: mpstat未安装,无法获取"
    add_to_report "    CPU平均使用率: mpstat未安装,无法获取"
fi

echo -e "\n    CPU占用TOP5进程:"
ps -eo %cpu,pid,user,comm --sort=-%cpu 2>/dev/null | head -6 | awk 'NR==1 {print "      " $0} NR>1 {printf "      %.2f%%  %-6d %-8s %s\n", $1, $2, $3, $4}'
add_to_report "    CPU占用TOP5进程:"
ps -eo %cpu,pid,user,comm --sort=-%cpu 2>/dev/null | head -6 >> $REPORT_FILE

# 4.2 内存性能分析
echo -e "\n  内存性能分析..."
mem_total=$(free -h 2>/dev/null | grep Mem | awk '{print $2}' || echo "未知")
mem_used=$(free -h 2>/dev/null | grep Mem | awk '{print $3}' || echo "未知")
mem_free=$(free -h 2>/dev/null | grep Mem | awk '{print $4}' || echo "未知")
mem_available=$(free -h 2>/dev/null | grep Mem | awk '{print $7}' || echo "未知")

if command -v free &> /dev/null; then
    mem_used_percent=$(free 2>/dev/null | grep Mem | awk '{printf "%.2f", $3/$2*100}' || echo "未知")
else
    mem_used_percent="未知"
fi

echo "    总内存: $mem_total"
echo "    已使用: $mem_used ($mem_used_percent%)"
echo "    空闲内存: $mem_free"
echo "    可用内存: $mem_available"
add_to_report "    总内存: $mem_total"
add_to_report "    已使用: $mem_used ($mem_used_percent%)"
add_to_report "    空闲内存: $mem_free"
add_to_report "    可用内存: $mem_available"

if command -v bc &> /dev/null && [ "$mem_used_percent" != "未知" ]; then
    if (( $(echo "$mem_used_percent > 85" | bc -l) )); then
        echo -e "${RED}    警告: 内存使用率超过85%${NC}"
        add_to_report "    ${RED}警告: 内存使用率超过85%${NC}"
    fi
fi

echo -e "\n    内存占用TOP5进程:"
ps -eo %mem,rss,pid,user,comm --sort=-%mem 2>/dev/null | head -6 | awk 'NR==1 {print "      " $0} NR>1 {printf "      %.2f%%  %-6s %-6d %-8s %s\n", $1, $2"K", $3, $4, $5}'
add_to_report "    内存占用TOP5进程:"
ps -eo %mem,rss,pid,user,comm --sort=-%mem 2>/dev/null | head -6 >> $REPORT_FILE

# 4.3 磁盘性能分析
echo -e "\n  磁盘性能分析..."
echo "    磁盘分区使用率:"
add_to_report "    磁盘分区使用率:"
df -h 2>/dev/null | grep -vE 'tmpfs|loop|udev' | awk 'NR>1 {print $0}' | while read line; do
    echo "    $line"
    add_to_report "    $line"
    usage=$(echo $line | awk '{print $5}' | sed 's/%//' 2>/dev/null || echo "0")
    if [ "$usage" -gt 85 ] 2>/dev/null; then
        mount_point=$(echo $line | awk '{print $6}')
        echo -e "${RED}    警告: $mount_point 分区使用率超过85%${NC}"
        add_to_report "    ${RED}警告: $mount_point 分区使用率超过85%${NC}"
    fi
done

echo -e "\n    磁盘I/O性能(5秒采样):"
if command -v iostat &> /dev/null; then
    iostat -x 5 1 2>/dev/null | awk 'NR>3 {printf "      %-8s  读速: %-6sB/s  写速: %-6sB/s  利用率: %s\n", $1, $6*512, $7*512, $14 "%"}'
    add_to_report "    磁盘I/O性能(5秒采样):"
    iostat -x 5 1 2>/dev/null | awk 'NR>3' >> $REPORT_FILE
else
    echo -e "${YELLOW}    iostat未安装,无法获取磁盘I/O性能${NC}"
    add_to_report "    ${YELLOW}iostat未安装,无法获取磁盘I/O性能${NC}"
fi

# 4.4 网络性能分析
echo -e "\n  网络性能分析..."
echo "    网络接口流量(5秒采样):"
if command -v sar &> /dev/null; then
    sar -n DEV 5 1 2>/dev/null | awk 'NR>2 {if($6+$7>0) printf "      %-6s  接收: %-6sB/s  发送: %-6sB/s  总流量: %-6sB/s\n", $2, $6, $7, $6+$7}'
    add_to_report "    网络接口流量(5秒采样):"
    sar -n DEV 5 1 2>/dev/null | awk 'NR>2' >> $REPORT_FILE
else
    echo -e "${YELLOW}    sar未安装,无法获取网络流量信息${NC}"
    add_to_report "    ${YELLOW}sar未安装,无法获取网络流量信息${NC}"
fi

echo -e "\n    网络连接状态分布:"
if command -v netstat &> /dev/null; then
    netstat -ant 2>/dev/null | awk '/^tcp/ {++S[$NF]} END {for(a in S) print "      " a ": " S[a] " 个连接"}' || echo "      无法获取网络连接信息"
    add_to_report "    网络连接状态分布:"
    netstat -ant 2>/dev/null | awk '/^tcp/ {++S[$NF]} END {for(a in S) print "      " a ": " S[a] " 个连接"}' >> $REPORT_FILE 2>/dev/null || add_to_report "      无法获取网络连接信息"
else
    echo -e "${YELLOW}    netstat未安装,无法获取网络连接信息${NC}"
    add_to_report "    ${YELLOW}netstat未安装,无法获取网络连接信息${NC}"
fi

# 5. 系统安全检测
echo -e "\n${BLUE}5. 系统安全检测${NC}"
add_to_report "\n5. 系统安全检测"

# 5.1 用户安全检查
echo -e "  用户安全检查..."
empty_passwords=$(awk -F: '($2 == "" && $1 != "root") {print $1}' /etc/shadow 2>/dev/null || echo "")
if [ -z "$empty_passwords" ]; then
    echo -e "${GREEN}    未发现空密码账户${NC}"
    add_to_report "    ${GREEN}未发现空密码账户${NC}"
else
    echo -e "${RED}    发现以下空密码账户: $empty_passwords${NC}"
    add_to_report "    ${RED}发现以下空密码账户: $empty_passwords${NC}"
fi

privileged_users=$(awk -F: '($3 == 0 && $1 != "root") {print $1}' /etc/passwd 2>/dev/null || echo "")
if [ -z "$privileged_users" ]; then
    echo -e "${GREEN}    未发现除root外的特权用户${NC}"
    add_to_report "    ${GREEN}未发现除root外的特权用户${NC}"
else
    echo -e "${RED}    发现以下非root特权用户: $privileged_users${NC}"
    add_to_report "    ${RED}发现以下非root特权用户: $privileged_users${NC}"
fi

# 5.2 关键文件权限检查
echo -e "\n  关键文件权限检查..."
critical_files="/etc/passwd /etc/shadow /etc/sudoers /etc/group /etc/hosts /etc/resolv.conf"

for file in $critical_files; do
    if [ -f "$file" ]; then
        perms=$(stat -c "%a" "$file" 2>/dev/null || echo "未知")
        case $file in
            "/etc/shadow")
                if [ "$perms" -ne 400 ] 2>/dev/null; then
                    echo -e "${RED}    不安全的权限: $file 权限为 $perms (应设置为400)${NC}"
                    add_to_report "    ${RED}不安全的权限: $file 权限为 $perms (应设置为400)${NC}"
                else
                    echo -e "${GREEN}    安全的权限: $file 权限为 $perms${NC}"
                    add_to_report "    ${GREEN}安全的权限: $file 权限为 $perms${NC}"
                fi
                ;;
            "/etc/sudoers")
                if [ "$perms" -ne 440 ] 2>/dev/null; then
                    echo -e "${RED}    不安全的权限: $file 权限为 $perms (应设置为440)${NC}"
                    add_to_report "    ${RED}不安全的权限: $file 权限为 $perms (应设置为440)${NC}"
                else
                    echo -e "${GREEN}    安全的权限: $file 权限为 $perms${NC}"
                    add_to_report "    ${GREEN}安全的权限: $file 权限为 $perms${NC}"
                fi
                ;;
            *)
                if [ "$perms" -gt 644 ] 2>/dev/null; then
                    echo -e "${RED}    不安全的权限: $file 权限为 $perms (建议不高于644)${NC}"
                    add_to_report "    ${RED}不安全的权限: $file 权限为 $perms (建议不高于644)${NC}"
                else
                    echo -e "${GREEN}    安全的权限: $file 权限为 $perms${NC}"
                    add_to_report "    ${GREEN}安全的权限: $file 权限为 $perms${NC}"
                fi
                ;;
        esac
    else
        echo -e "${YELLOW}    警告: 未找到文件 $file${NC}"
        add_to_report "    ${YELLOW}警告: 未找到文件 $file${NC}"
    fi
done

# 5.3 SSH与防火墙检查
echo -e "\n  远程访问与防火墙检查..."
ssh_config="/etc/ssh/sshd_config"
if [ -f "$ssh_config" ]; then
    root_login=$(grep -E '^PermitRootLogin' $ssh_config 2>/dev/null | awk '{print $2}' | head -1)
    if [ "$root_login" = "no" ]; then
        echo -e "${GREEN}    SSH已禁用root直接登录${NC}"
        add_to_report "    ${GREEN}SSH已禁用root直接登录${NC}"
    else
        echo -e "${RED}    SSH允许root直接登录 (建议设置为PermitRootLogin no)${NC}"
        add_to_report "    ${RED}SSH允许root直接登录 (建议设置为PermitRootLogin no)${NC}"
    fi
fi

if command -v ufw &> /dev/null; then
    ufw_status=$(ufw status 2>/dev/null | grep "Status" | awk '{print $2}')
    if [ "$ufw_status" = "active" ]; then
        echo -e "${GREEN}    UFW防火墙已激活${NC}"
        add_to_report "    ${GREEN}UFW防火墙已激活${NC}"
    else
        echo -e "${RED}    UFW防火墙未激活${NC}"
        add_to_report "    ${RED}UFW防火墙未激活${NC}"
    fi
elif command -v firewalld &> /dev/null; then
    firewalld_status=$(systemctl is-active firewalld 2>/dev/null)
    if [ "$firewalld_status" = "active" ]; then
        echo -e "${GREEN}    firewalld防火墙已激活${NC}"
        add_to_report "    ${GREEN}firewalld防火墙已激活${NC}"
    else
        echo -e "${RED}    firewalld防火墙未激活${NC}"
        add_to_report "    ${RED}firewalld防火墙未激活${NC}"
    fi
else
    echo -e "${YELLOW}    未检测到UFW或firewalld防火墙${NC}"
    add_to_report "    ${YELLOW}未检测到UFW或firewalld防火墙${NC}"
fi

# 6. 服务与系统更新检查
echo -e "\n${BLUE}6. 服务状态与系统更新${NC}"
add_to_report "\n6. 服务状态与系统更新"

# 6.1 关键服务状态
critical_services="sshd firewalld crond rsyslog docker nginx mysql redis"

echo -e "  关键服务状态检查..."
for service in $critical_services; do
    if systemctl is-active --quiet $service 2>/dev/null; then
        echo -e "${GREEN}    服务正常运行: $service${NC}"
        add_to_report "    ${GREEN}服务正常运行: $service${NC}"
    else
        if systemctl list-unit-files --type=service 2>/dev/null | grep -q "$service"; then
            echo -e "${RED}    服务已安装但未运行: $service${NC}"
            add_to_report "    ${RED}服务已安装但未运行: $service${NC}"
        else
            echo -e "${YELLOW}    服务未安装: $service${NC}"
            add_to_report "    ${YELLOW}服务未安装: $service${NC}"
        fi
    fi
done

# 6.2 系统更新检查
echo -e "\n  系统更新检查..."
if command -v apt &> /dev/null; then
    updates=$(apt list --upgradable 2>/dev/null | wc -l)
    security_updates=$(apt list --upgradable 2>/dev/null | grep -i security | wc -l)
    echo -e "    可用系统更新: $((updates-1)) 个 (其中安全更新: $security_updates 个)"
    add_to_report "    可用系统更新: $((updates-1)) 个 (其中安全更新: $security_updates 个)"
elif command -v yum &> /dev/null; then
    updates=$(yum check-update 2>/dev/null | wc -l)
    security_updates=$(yum check-update --security 2>/dev/null | wc -l)
    echo -e "    可用系统更新: $((updates-1)) 个 (其中安全更新: $security_updates 个)"
    add_to_report "    可用系统更新: $((updates-1)) 个 (其中安全更新: $security_updates 个)"
else
    echo -e "    系统更新检查: 不支持的包管理器"
    add_to_report "    系统更新检查: 不支持的包管理器"
fi

# 7. 日志与定时任务检查
echo -e "\n${BLUE}7. 日志与定时任务检查${NC}"
add_to_report "\n7. 日志与定时任务检查"

# 7.1 错误日志检查
echo -e "  系统错误日志检查..."
if [ -f "/var/log/messages" ]; then
    error_logs=$(grep -iE "error|fail|critical|alert|emergency" /var/log/messages 2>/dev/null | grep -v "CRON" | tail -10)
elif [ -f "/var/log/syslog" ]; then
    error_logs=$(grep -iE "error|fail|critical|alert|emergency" /var/log/syslog 2>/dev/null | grep -v "CRON" | tail -10)
else
    error_logs=""
fi

if [ -n "$error_logs" ]; then
    echo -e "${YELLOW}    发现错误日志记录:${NC}"
    echo "$error_logs" | while read line; do
        echo "      $line"
        add_to_report "      $line"
    done
else
    echo -e "${GREEN}    未发现明显错误日志${NC}"
    add_to_report "    ${GREEN}未发现明显错误日志${NC}"
fi

# 7.2 登录失败检查
echo -e "\n  登录失败记录检查..."
if [ -f "/var/log/secure" ]; then
    failed_logins=$(grep "Failed password" /var/log/secure 2>/dev/null | tail -5)
elif [ -f "/var/log/auth.log" ]; then
    failed_logins=$(grep "Failed password" /var/log/auth.log 2>/dev/null | tail -5)
else
    failed_logins=""
fi

if [ -n "$failed_logins" ]; then
    echo -e "${YELLOW}    发现登录失败记录:${NC}"
    echo "$failed_logins" | while read line; do
        echo "      $line"
        add_to_report "      $line"
    done
else
    echo -e "${GREEN}    未发现登录失败记录${NC}"
    add_to_report "    ${GREEN}未发现登录失败记录${NC}"
fi

# 7.3 定时任务检查
echo -e "\n  定时任务安全检查..."
suspicious_crons=$(grep -r -E 'wget|curl|bash -i|nc |netcat' /etc/cron* 2>/dev/null | grep -v -E '#|/usr/bin/' || echo "")
if [ -n "$suspicious_crons" ]; then
    echo -e "${YELLOW}    发现可能存在风险的定时任务:${NC}"
    echo "$suspicious_crons" | while read line; do
        echo "      $line"
        add_to_report "      $line"
    done
else
    echo -e "${GREEN}    未发现明显风险的系统级定时任务${NC}"
    add_to_report "    ${GREEN}未发现明显风险的系统级定时任务${NC}"
fi

# 巡检总结
echo -e "\n${YELLOW}===== 系统综合巡检完成 ====="
echo "巡检报告已保存至: $REPORT_FILE"
echo "重点关注项:"

summary_warnings=""
if command -v bc &> /dev/null && [ "$sys_max_open" -gt 0 ]; then
    usage_rate=$(echo "scale=2; $sys_current_max / $sys_max_open * 100" | bc)
    if (( $(echo "$usage_rate > 80" | bc -l) )); then 
        echo "  - 系统句柄使用率过高"
        summary_warnings="$summary_warnings\n  - 系统句柄使用率过高"
    fi
fi

if [ "$cpu_usage" != "未知" ] && command -v bc &> /dev/null; then
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then 
        echo "  - CPU使用率过高"
        summary_warnings="$summary_warnings\n  - CPU使用率过高"
    fi
fi

if [ "$mem_used_percent" != "未知" ] && command -v bc &> /dev/null; then
    if (( $(echo "$mem_used_percent > 85" | bc -l) )); then 
        echo "  - 内存使用率过高"
        summary_warnings="$summary_warnings\n  - 内存使用率过高"
    fi
fi

if [ -n "$empty_passwords" ] || [ -n "$privileged_users" ]; then 
    echo "  - 用户安全配置存在问题"
    summary_warnings="$summary_warnings\n  - 用户安全配置存在问题"
fi

if [ -z "$summary_warnings" ]; then
    echo "  - 未发现严重问题"
fi

echo "=========================${NC}"

add_to_report "\n===== 巡检总结 ====="
add_to_report "检查完成时间: $(date)"
add_to_report "重点关注项:"
if [ -n "$summary_warnings" ]; then
    add_to_report "$summary_warnings"
else
    add_to_report "  - 未发现严重问题"
fi

echo -e "\n${GREEN}系统巡检完成!详细报告请查看: $REPORT_FILE${NC}"

执行

bash 复制代码
chmod +x check.sh
./check.sh
cat system_inspection_20250930_151222.log
相关推荐
无敌最俊朗@2 小时前
TCP/IP 四层模型协作流程详解
服务器·网络·网络协议·tcp/ip·dubbo
梅见十柒3 小时前
Linux/UNIX系统编程手册笔记:POSIX
linux·服务器·网络·笔记·tcp/ip·udp·unix
IT成长日记3 小时前
【Nginx开荒攻略】静态文件服务深度解析:MIME类型映射与优化实战
linux·运维·服务器·nginx·mime
弗里德姆4 小时前
DIY主机无网络安装PVE全记录:手机热点+笔记本网络共享实战
服务器·网络·pve
wanhengidc4 小时前
云手机服务器多开需要注意哪些
运维·服务器·智能手机
赋创小助手4 小时前
Supermicro NVIDIA Grace Superchip存储服务器超微ARS-121L-NE316R开箱评测
运维·服务器·人工智能·深度学习·机器学习·自然语言处理
z_y_j2299704385 小时前
服务器中使用Docker部署前端项目
服务器·前端·docker·容器
数字冰雹5 小时前
图观 流渲染场景服务器
服务器·前端·数据库·数据可视化
前方一片光明6 小时前
Linux—升级openssh常见的问题与解决方案
linux·运维·服务器