家用住宅主机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 服务器虽然不对外暴露太多服务,但依然需要定期检查安全状态。
通过本文的每日自动化脚本,你每天只需花几秒钟查看日志,就能及时发现异常。
建议先在本机完整跑一遍,再放到生产环境。
如果遇到其他报错,检查命令拼写和权限即可。

分享到:
上一篇
外贸站宝塔面板网站谷歌收录缓慢站内整改清单
下一篇
跨境独立站宝塔面板服务器Ollama远程访问穿透方案
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意