最可靠的方式是执行systemctl list-unit-files --type=service --state=enabled --no-pager,它直接读取systemd单元注册表,权威反映系统承诺开机拉起的服务,不依赖运行状态、不含static/masked项,结果纯净可审计。

最可靠的方式是直接导出 systemd 单元注册表中明确标记为开机自启的服务清单,不依赖当前运行状态、不混入静态或被屏蔽项,适合审计场景。
用 systemctl list-unit-files 导出纯净启用服务
这条命令读取的是系统“承诺开机拉起哪些服务”的原始配置,结果权威、可复现:
- 执行:systemctl list-unit-files --type=service --state=enabled --no-pager > /tmp/autostart-services.txt
- 它只包含真正被
systemctl enable设置过、且未被mask或覆盖的.service单元 - 输出格式为两列:服务名 + 状态(固定为
enabled),便于后续解析或比对 - 加
--no-pager避免分页器截断,确保完整写入文件
排除干扰项,提升审计准确性
默认输出不含 static 和 masked,但若需进一步过滤模板实例或确认无误,可加简单处理:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 跳过带
@的模板(如getty@.service):
systemctl list-unit-files --type=service --state=enabled --no-pager | awk '$1 !~ /@/ {print $1}' > /tmp/autostart-services-clean.txt - 若需同时记录服务描述(方便人工核对),可用:
systemctl list-unit-files --type=service --state=enabled --no-pager | while read svc _; do echo "$svc $(systemctl show -p Description $svc 2>/dev/null | cut -d= -f2)"; done > /tmp/autostart-with-desc.txt
补充检查:/etc/rc.local(仅当兼容模式启用时)
虽然 systemd 主导系统中它已非主流,但审计要求全覆盖,需确认该兼容入口是否启用:
- 检查是否启用:systemctl is-enabled rc-local.service 2>/dev/null,返回
enabled才需关注 - 若启用,导出其内容:cat /etc/rc.local 2>/dev/null | grep -v '^#' | grep -v '^$' >> /tmp/autostart-services.txt
- 注意:/etc/rc.local 必须有执行权限(
chmod +x)才实际生效,仅存在不等于启用
不建议用于审计的替代方法
以下方式易漏项或含噪声,不适合正式审计报告:
-
systemctl list-units --type=service --state=active:只列当前运行的服务,漏掉开机启用但尚未触发的服务(如定时器拉起的logrotate.service) -
ls /etc/systemd/system/multi-user.target.wants/:只是符号链接集合,不反映vendor preset或全局策略覆盖情况 -
chkconfig --list或查/etc/rc.d/rc3.d/:在 CentOS 8+/Ubuntu 20.04+ 等纯 systemd 系统中基本失效,仅剩兼容残留

















