首页/安全/取证与溯源速查/进程记账(psacct/acct)历史命令
Linux 取证135 条

进程记账(psacct/acct)历史命令

开启进程记账后系统持续记录每个进程的启动者、命令名与结束时间,用 lastcomm、sa、ac 查询,是 shell 历史之外的执行证据。

取证与溯源速查安全更新于 2026-10-13

进程记账是什么

开启进程记账(acct / psacct)后,内核会在每个进程结束时把一条记录写入记账文件,包含命令名、执行用户、终端、起始与结束时间以及耗时。它提供的是 shell 历史之外的执行证据:命令是否真的被执行过、由谁执行、在什么时刻结束,都能从记账文件中查到,而 shell 历史只反映输入过什么。记账必须依赖服务处于运行状态,未开启的系统完全没有数据,这一点要先确认再下结论。

基本信息

记账文件/var/account/pacct(部分发行版为 /var/log/account/pacct)
查询命令lastcomm、sa、ac -p
服务名Debian 系 acct,RHEL 系 psacct
记录粒度进程级,通常不含命令参数

典型使用场景

  • 确认某命令是否真的被执行过,而不是只被输入过
  • 核对命令执行用户与终端,识别共用账号下的实际操作者
  • 按用户统计 CPU 与执行时间,发现异常的高负载命令
  • 与认证日志互证:登录后是否立即执行了可疑程序
  • 为清理类动作是否存在提供独立于 shell 历史的证据

查询记账记录

查询记账记录
systemctl is-active acct 2>/dev/null || systemctl is-active psacct 2>/dev/null   # 先确认服务状态
lastcomm --user alice | head -20        # 按用户查执行过的命令
sa -u | head -20                        # 汇总各用户的资源使用
ac -p | head                            # 按用户统计连接时长
ls -l /var/account/pacct 2>/dev/null    # 记账文件是否存在及大小
lastcomm --command rm | head -10        # 按命令名过滤,例如查看删除动作

lastcomm 输出读法

列含义判读要点
命令名被执行的程序名受限长度,长名字可能被截断
标记F 表示 fork 未 exec,S 表示以超级用户运行S 标记用于识别提权执行
用户名执行该进程的账号共用账号下可用终端列辅助区分
终端与时间登录终端与结束时刻用于与认证日志拼接时间线
记录内容受配置影响,默认通常只保存命令名而不含参数,因此无法从记账文件得知命令操作了哪些文件,需要配合 shell 历史或审计日志使用。
记账文件会随轮转被替换或压缩,早期记录可能已经不在当前文件中,采集时应优先归档并记录当前文件的时间范围。
开启记账会带来持续的磁盘写入与一定性能开销,生产环境是否启用以运维策略为准,取证时只做读取,不要现场开启服务。

易错点

  • 服务未开启却按「没有记录」下结论,忽略了数据根本不存在
  • 把记账记录当作完整命令行证据,实际参数并未保存
  • 记账文件已轮转,未归档旧文件导致时间范围缺口
  • 为取证在现场启用记账,改变系统状态且只能记录之后的行为

数据来源与参考

  • psacct 官方文档(lastcomm、ac、sa)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌