logcheck 本身不自动发邮件,必须依赖本地 mta(如 sendmail、postfix 或 mailx)才能投递;没配好 mail 命令,报告就卡在脚本里出不去。

Logcheck 本身不自动发邮件,必须依赖本地 MTA(如 sendmail、postfix 或 mailx)才能投递;没配好 mail 命令,报告就卡在脚本里出不去。
logcheck.sh 脚本里邮件发送逻辑怎么触发
Logcheck 的核心是 logcheck.sh,它最后调用 mail 命令把分析结果发出去。这个命令是否执行、发给谁、用什么参数,全由脚本里的变量控制:
-
SYSADMIN变量决定收件人,比如SYSADMIN=wuhs@company.com;如果留空或仍是root,而 root 没配邮件别名,就会静默失败 -
MAILCMD默认是mail -s,但某些系统(如 CentOS 7)装的是mailx,得改成MAILCMD="mailx -s" - 脚本末尾有类似
cat $TMPDIR/report | $MAILCMD "$SUBJECT" $SYSADMIN的行——如果$TMPDIR/report是空文件,mail不报错也不发信,看起来像“没反应”
REPORTLEVEL 和 logcheck.violations 决定哪些内容进邮件
不是所有异常都默认上报。Logcheck 用 REPORTLEVEL 控制敏感度,它影响最终匹配 logcheck.violations 的严格程度:
-
REPORTLEVEL=workstation:跳过大量常规服务启停(如systemd\[.*\]: Started.*),只留明显异常 -
REPORTLEVEL=server(默认):中等粒度,覆盖多数生产环境需求 -
REPORTLEVEL=paranoid:连avahi-daemon离开组播组这种日志都可能报出来,容易误报
真正进邮件的内容,是先过 logcheck.ignore(过滤掉已知正常条目),再用 logcheck.violations 里的正则去匹配剩余行。如果某行既不在 ignore 里、又命中 violations,才会被写入 report 文件。
为什么邮件发不出?常见断点检查清单
遇到“脚本跑完但没收到邮件”,不要直接重装 Logcheck,按顺序查这几个点:
- 手动运行
echo "test" | mail -s "logcheck test" $USER,确认本地mail命令能发信;失败就先配好 MTA,不是 Logcheck 的问题 - 检查
logcheck.sh第 43 行左右的SYSADMIN是否写成邮箱地址(如SYSADMIN=admin@example.com),而非系统用户名 - 临时把
REPORTLEVEL改成paranoid,并往/var/log/messages里插一条测试日志(如logger "TEST VIOLATION"),再跑一次logcheck.sh,看$TMPDIR/report是否有内容 - 确认
/etc/logcheck/logcheck.logfiles里列的日志路径真实存在且可读,比如 RHEL 8 默认用/var/log/journal,但 Logcheck 不原生支持二进制 journal,得配合journalctl -o short-iso导出为文本再处理
忽略规则写不对,会导致误报或漏报
logcheck.ignore 是纯文本逐行匹配,不支持完整正则,只认固定字符串或简单通配(*)。比如想忽略 SSH 登录成功日志:
❌ 错误写法:sshd\[.*\]: Accepted(logcheck.ignore 不解析正则)
✅ 正确写法:sshd[ 或 Accepted password for —— 抓住不变的字面片段即可
另一个典型坑是 PID 变动:日志里实际是 sshd[12345]: Accepted,但你写了 sshd[12345],下次 PID 变成 12346 就失效了。应该只留 sshd[ 或 Accepted 这类稳定子串。
真正难处理的是时间戳和路径变量混杂的日志,比如 kernel: [12345.67890] eth0 renamed to ens33。这时候不能抄整行,得拆解:保留 renamed to 或 kernel:.*renamed(如果 logcheck.ignore 支持点号通配,部分版本可以;不确定就用 renamed 更稳)。











