文件名auto-inspect.sh

#!/bin/bash

set -euo pipefail

# --- 收集数据 ---
HOSTNAME=$(hostname)
#IP_ADDRS=$(ip -br addr show 2>/dev/null | awk '$1 !~ /lo/ && $3 != "" {print $3}' | tr '\n' ', ' | sed 's/, $//')
# 获取第一个非回环(non-loopback)的 IPv4 内网地址
INTERNAL_IP=$(ip -4 addr show scope global | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
OS_INFO=$(cat /etc/os-release 2>/dev/null | grep -i pretty_name | cut -d'"' -f2 || uname -s)
KERNEL=$(uname -r)
UPTIME=$(uptime)

# 报告文件名
REPORT_FILE="auto_inspect_$(date +%F)_${INTERNAL_IP}.md"


# CPU负载检查
# 获取负载
LOAD5=$(awk -v load5=$(cut -d' ' -f2 /proc/loadavg) -v cores=$(nproc) 'BEGIN {print int(100 * load5 / cores)}')
echo $LOAD5
if [ "$LOAD5" -gt 80 ]; then
    LOAD_STATUS="❌ 高"
elif [ $LOAD5 -gt 60 ]; then
    LOAD_STATUS="⚠️ 偏高"
else
    LOAD_STATUS="✅ 正常"
fi


# 内存检查
MEM_TOTAL=$(free | awk 'NR==2 {print $2}')
MEM_USED=$(free | awk 'NR==2 {print $3}')
MEM_PCT=$((100 * MEM_USED / MEM_TOTAL))
if [ $MEM_PCT -gt 80 ]; then
    MEM_STATUS="❌ 高"
elif [ $MEM_PCT -gt 60 ]; then
    MEM_STATUS="⚠️ 偏高"
else
    MEM_STATUS="✅ 正常"
fi

# 磁盘检查(取根分区 / 使用率)
ROOT_USAGE_PCT=$(df / | awk 'NR==2 {gsub(/%/,""); print $5}')
if [ $ROOT_USAGE_PCT -gt 80 ]; then
    DISK_STATUS="❌ 危险"
elif [ $ROOT_USAGE_PCT -gt 60 ]; then
    DISK_STATUS="⚠️ 偏高"
else
    DISK_STATUS="✅ 正常"
fi

# 检查是否有 failed 服务
FAILED_SERVICES=$(systemctl list-units --type=service --state=failed --no-pager 2>/dev/null | grep -c "failed" || echo 0)
if [ "$FAILED_SERVICES" -gt 0 ]; then
    SERVICE_STATUS="❌ 存在 $FAILED_SERVICES 个失败服务"
else
    SERVICE_STATUS="✅ 正常"
fi

# 检查异常 UID=0 账户
ABNORMAL_ROOT_USERS=$(awk -F: '$3 == 0 && $1 != "root" {print $1}' /etc/passwd 2>/dev/null | wc -l)
if [ "$ABNORMAL_ROOT_USERS" -gt 0 ]; then
    SECURITY_STATUS="❌ 发现异常 root 权限账户"
else
    SECURITY_STATUS="✅ 正常"
fi

# SSH 密码登录是否开启
SSH_PASSWORD_AUTH=$(grep -i "^PasswordAuthentication" /etc/ssh/sshd_config 2>/dev/null | awk '{print $2}' | head -n1)
if [[ "${SSH_PASSWORD_AUTH,,}" == "yes" ]]; then
    SSH_STATUS="⚠️ 密码登录开启(建议禁用)"
else
    SSH_STATUS="✅ 密码登录已禁用"
fi

# --- 生成报告 ---
cat > "$REPORT_FILE" <<EOF
# Linux 服务器巡检报告

- **巡检时间**:$(date '+%Y-%m-%d %H:%M:%S')
- **主机名**:\`${HOSTNAME}\`
- **IP地址**:\`${INTERNAL_IP}\`
- **操作系统**:\`${OS_INFO}\`

## 📊 健康状态汇总

| 检查项 | 状态 | 说明 |
|--------|------|------|
| **CPU负载率** | ${LOAD_STATUS} | 近5分钟负载率 ${LOAD5}% |
| **内存使用率** | ${MEM_STATUS} | 当前约 ${MEM_PCT}% |
| **磁盘使用率(/)** | ${DISK_STATUS} | 当前 ${ROOT_USAGE_PCT}% |
| **系统服务** | ${SERVICE_STATUS} | systemd failed units |
| **安全账户** | ${SECURITY_STATUS} | 非 root 的 UID=0 用户 |
| **SSH 安全配置** | ${SSH_STATUS} | PasswordAuthentication 设置 |

---

## 1. CPU 与负载

### 系统负载(1/5/15 分钟)
\`\`\`text
$(uptime)
\`\`\`

### CPU 核心数
\`\`\`text
$(nproc) 核心
\`\`\`

### Top 5 CPU 占用进程
\`\`\`text
$(ps aux --sort=-%cpu | head -n 6)
\`\`\`

---

## 2. 内存与 Swap

### 内存使用情况
\`\`\`text
$(free -h)
\`\`\`

### Swap 使用状态
\`\`\`text
$(free | awk 'NR==3 {if($3>0) print "已使用 " $3 " KB"; else print "未使用"}')
\`\`\`

---

## 3. 磁盘存储

### 分区使用情况(排除 tmpfs)
\`\`\`text
$(df -hT | grep -v tmpfs)
\`\`\`

### Inode 使用情况
\`\`\`text
$(df -i | grep -v tmpfs)
\`\`\`

### /var 目录下大文件(Top 5)
\`\`\`text
$(du -sh /var/* 2>/dev/null | sort -hr 2>/dev/null | head -n 5 || echo "无法读取 /var")
\`\`\`

---

## 4. 网络状态

### 监听端口(TCP/UDP)
\`\`\`text
$(ss -tulnp 2>/dev/null | head -n 20)
\`\`\`

### TCP 连接统计
\`\`\`text
$(ss -s | grep -i tcp || echo "无 TCP 统计信息")
\`\`\`

### 活跃外连连接(非本地)
\`\`\`text
$(ss -tnp state established 2>/dev/null | grep -v '127.0.0.1' | head -n 10 || echo "无活跃外连")
\`\`\`

---

## 5. 关键进程与服务

### Top 5 内存占用进程
\`\`\`text
$(ps aux --sort=-%mem | head -n 6)
\`\`\`

### systemd 失败的服务
\`\`\`text
$(systemctl list-units --type=service --state=failed --no-pager 2>/dev/null || echo "无失败服务")
\`\`\`

---

## 6. 安全检查

### 异常 UID=0 账户(除 root 外)
\`\`\`text
$(awk -F: '$3 == 0 && $1 != "root" {print $1}' /etc/passwd 2>/dev/null || echo "无异常账户")
\`\`\`

### SSH 关键配置
\`\`\`text
$(grep -E "^PermitRootLogin|^PasswordAuthentication" /etc/ssh/sshd_config 2>/dev/null || echo "SSH 配置文件未找到或不可读")
\`\`\`

### 最近 5 次成功登录
\`\`\`text
$(last -n 5 2>/dev/null || echo "登录记录不可读")
\`\`\`

### 最近 5 次失败登录(需权限)
\`\`\`text
$(sudo lastb -n 5 2>/dev/null || echo "无权限查看失败登录(请以 root 或 sudo 运行)")
\`\`\`

---

## 7. 系统日志摘要(错误级别)

### journal 日志(systemd 系统)
\`\`\`text
$(journalctl -p err..alert --since today -n 30 --no-pager 2>/dev/null || echo "journalctl 不可用或无错误日志")
\`\`\`

### /var/log/messages(传统系统)
\`\`\`text
$(tail -n 30 /var/log/messages 2>/dev/null || echo "/var/log/messages 不可读")
\`\`\`

---

> **说明**:
> - 本报告由 \`server_inspection.sh\` 自动生成
> - 建议每日巡检,重点关注:磁盘 >85%、内存 >90%、异常账户、SSH 暴力破解
> - 如需自动化,请配合 cron 定时任务使用

EOF

echo "✅ 巡检完成!报告已保存至:$(pwd)/$REPORT_FILE"
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐