家用住宅主机Linux服务器安全巡检每日自动化脚本
适用场景与准备工作
很多朋友在家用旧电脑或低功耗主机上跑 Linux 服务器(例如 Ubuntu Server 或 Debian),但缺少日常安全巡检习惯。
手动检查太麻烦,容易漏掉关键风险。
本文帮你写一个每日自动运行的巡检脚本,覆盖系统更新、登录失败记录、开放端口变化、磁盘和内存使用率。
你需要准备:
- 一台运行 Ubuntu 20.04+ 或 Debian 10+ 的 Linux 服务器,已经能通过 ssh 登录。
- 拥有 sudo 权限的普通用户(不要直接用 root)。
- 基本的命令行使用经验:能打开终端、粘贴命令、用 vim 或 nano 编辑文件。
第一步:编写安全巡检脚本
在 /home/你的用户名/ 下创建一个名为 daily_security_check.sh 的文件。
用 nano 编辑:
nano /home/你的用户名/daily_security_check.sh
粘贴以下内容(请根据实际情况修改 ADMIN_EMAIL 为你的邮箱地址,如果不想邮件通知可删除 mail 行):
#!/bin/bash
# 每日安全巡检脚本 v1.0
LOG_FILE="/var/log/security_daily_check.log"
ADMIN_EMAIL="you@example.com"
echo "===== 巡检时间: $(date) =====" | tee -a "$LOG_FILE"
# 1. 检查可更新的软件包(安全更新)
echo -e "\n--- 可更新的安全软件包 ---" | tee -a "$LOG_FILE"
sudo apt update -qq && sudo apt list --upgradable 2>/dev/null | grep -i security >> "$LOG_FILE"
# 2. 检查失败的 SSH 登录尝试(过去24小时)
echo -e "\n--- 最近24小时失败SSH登录 ---" | tee -a "$LOG_FILE"
journalctl -u ssh --since "24 hours ago" --no-pager | grep "Failed password" | wc -l >> "$LOG_FILE"
# 3. 检查当前监听的端口(对外)
echo -e "\n--- 当前开放端口(仅TCP) ---" | tee -a "$LOG_FILE"
ss -tlnp4 2>/dev/null >> "$LOG_FILE"
# 4. 检查磁盘使用率(超过90%告警)
echo -e "\n--- 磁盘使用率 ---" | tee -a "$LOG_FILE"
df -h | grep -vE '^Filesystem|tmpfs|devtmpfs' >> "$LOG_FILE"
# 5. 检查内存使用率
echo -e "\n--- 内存使用 ---" | tee -a "$LOG_FILE"
free -h >> "$LOG_FILE"
# 如有问题发送邮件(需安装 mailutils)
# tail -n 30 "$LOG_FILE" | mail -s "Daily Security Report for $(hostname)" "$ADMIN_EMAIL"
保存退出(nano 按 Ctrl+O 回车,再 Ctrl+X)。
赋予执行权限:
chmod +x /home/你的用户名/daily_security_check.sh
注意:脚本中的 apt update 需要 sudo,所以运行脚本时也要加 sudo。如果不想每次输密码,稍后设置 crontab 时需注意用户权限。
第二步:设置定时任务每日自动运行
输入 crontab -e 编辑当前用户的计划任务列表(第一次选择编辑器后,在文件末尾添加):
0 7 * * * /home/你的用户名/daily_security_check.sh
这表示每天早上 7 点执行一次。
保存后重启 cron 服务:
sudo systemctl restart cron
如果你想以 root 身份运行(避免 sudo 密码问题),可以使用 sudo crontab -e 编辑 root 的 crontab,但注意脚本中的日志目录需要 root 写入权限。
建议使用普通用户 + 配置 sudo 免密执行 apt 更新。
具体方法:运行 sudo visudo,在文件末尾添加:
你的用户名 ALL=(ALL) NOPASSWD: /usr/bin/apt
第三步:避坑指南
1. 日志权限不足
脚本中 LOG_FILE 是 /var/log/security_daily_check.log,普通用户无写入权限。
解决办法:让 crontab 以 root 身份运行脚本,或者将日志改为 ~/security_daily_check.log。
本文建议改为用户目录:
LOG_FILE="$HOME/security_daily_check.log"
2. 邮件发送不成功
脚本末行 mail 命令工作需要先安装 mailutils:
sudo apt install -y mailutils
并且确保系统有可用的 MTA(如 postfix)。
家庭环境下可不设邮件,改为将日志输出到文件,定期查看即可。
3. apt update 卡住或报错
如果服务器在凌晨运行,网络可能不稳定。
建议在 crontab 任务开头增加 sleep $((RANDOM % 300)) 随机延迟 5 分钟,减少同时请求压力。
4. 端口的白名单
巡检脚本只报告当前开放端口,不判断是否异常。
建议手动记录常用端口(如 22、80、443),若巡检时发现陌生端口再排查。
第四步:验证效果与查看报告
等待定时任务执行一次,或者手动运行脚本:
sudo /home/你的用户名/daily_security_check.sh
查看日志文件:
cat /home/你的用户名/security_daily_check.log
检查各项内容是否正常:
- 是否有未安装的安全更新?
- 失败 SSH 登录次数是否异常增多(正常每天几条,几百条说明被暴力破解)?
- 是否有未知端口监听?
- 磁盘占用是否超过 90%?
如果发现告警项,应立即处理:更新系统、禁止密码登录改用密钥、关闭不必要的端口、清理磁盘空间。
高频问题 FAQ
Q:我如何调整巡检时间?
A:修改 crontab 中的时间表达式。例如每天凌晨 2 点:0 2 * * *。可参考 crontab.guru 网站生成。
Q:脚本报错“command not found: ss”怎么办?
A:安装 iproute2:sudo apt install -y iproute2。如果使用 CentOS 系,则将 ss 替换为 netstat -tlnp4。
Q:我不想每次都输密码运行脚本?
A:按照第二步中的 sudoers 配置添加免密,或直接用 root 的 crontab 运行脚本。注意 root 运行时日志路径需写绝对目录。
Q:能不能把巡检结果通过微信或钉钉通知?
A:可以调用 Webhook,但需要额外配置。本文建议先通过邮件或文件查看,稳定后再考虑机器人通知。
写在最后
家用 Linux 服务器虽然不对外暴露太多服务,但依然需要定期检查安全状态。
通过本文的每日自动化脚本,你每天只需花几秒钟查看日志,就能及时发现异常。
建议先在本机完整跑一遍,再放到生产环境。
如果遇到其他报错,检查命令拼写和权限即可。