journalctl 无法直接记录用户执行的命令,但可通过 _uid、user_unit、_comm 等字段间接追踪:1. 用 _uid=xxx 筛选指定用户日志;2. 用 user_unit=xxx --user 查用户服务;3. 用 _comm=sudo 结合 _uid 查 sudo 操作;4. 文本搜索仅作辅助。

journalctl 本身不直接记录“哪个用户执行了什么命令”,它记录的是系统服务、内核、用户会话(通过 systemd --user)等产生的日志。但你可以结合 UID、_UID 字段、USER_UNIT、_COMM、_CMDLINE 等字段,间接筛选出特定用户相关的日志条目——尤其是该用户启动的服务、登录会话、systemd 用户单元或通过 sudo 执行的操作。
1. 查看指定 UID 的所有日志(最常用且可靠)
每个日志条目在记录时会附带发起进程的 UID(保存在 _UID 字段中)。这是过滤用户行为最直接的方式:
- 查 UID 1001 的所有日志:
journalctl _UID=1001 - 查当前用户的日志(假设 UID 是 1000):
journalctl _UID=1000 - 配合时间范围更实用:
journalctl _UID=1001 --since "1 hour ago"
⚠️ 注意:普通用户默认无法读取其他用户的日志(包括 _UID=0),需 root 权限;非 root 用户只能看到自己 UID 的部分日志(取决于 journal 权限配置,如 ReadKMsg=yes 或 Storage=volatile 等)。
2. 筛选该用户启动的 systemd 用户服务
如果用户通过 systemctl --user start xxx 启动了服务,日志中会包含 USER_UNIT 字段:
- 列出该用户所有用户级服务的日志:
journalctl USER_UNIT --user(需在用户 session 中运行) - 查某个具体服务(如 myapp.service):
journalctl USER_UNIT=myapp.service --user - 结合 UID 更精准:
journalctl _UID=1001 USER_UNIT=myapp.service
3. 追踪 sudo 行为(需 audit 或 auth 日志支持)
sudo 操作通常记录在 auth.log(rsyslog)或 systemd-journald 的 systemd-logind / sudo 单元中。journalctl 可这样抓:
- 查 sudo 相关日志:
journalctl _COMM=sudo - 进一步限定用户:
journalctl _COMM=sudo _UID=1001 - 查看登录/认证事件(含 su/sudo):
journalctl UNIT=systemd-logind.service | grep -i "session\|sudo"
? 提示:若需完整审计 sudo 命令行,建议启用 auditd 或确保 sudo 配置了 Defaults logfile 并转发到 journald(通过 sudo -n logger "..." 或 rsyslog forwarding)。
4. 按用户名模糊匹配命令行或日志内容(辅助手段)
当明确知道用户执行了某命令(如 git push)或日志中含用户名时,可用文本搜索:
- 搜索日志中含 “alice” 的条目:
journalctl | grep -i alice(效率低,慎用于大日志) - 更高效方式:
journalctl -o short-iso | grep -i "alice.*git" - 结合字段过滤再搜索:
journalctl _UID=1001 | grep -i "ssh\|curl\|python"
⚠️ 注意:纯文本搜索无法区分“alice”是用户名、主机名还是路径名,仅作补充验证用。
真正想追踪“谁在何时执行了什么命令”,journalctl 有局限;生产环境建议搭配 auditd(记录 execve 系统调用)或 shell 历史 + psacct(accton)实现细粒度命令审计。











