journalctl 不能按用户名直接过滤,必须用数字 UID 且仅匹配主动写入 _UID 字段的日志;可查 SSH/GDM/LightDM 登录、systemd 用户服务等,不包括普通命令、sudo 操作或 cron 行为。

journalctl 不能按用户名(如 alice)直接过滤,必须用数字 UID,且只匹配那些**主动写入了 _UID 字段**的日志条目——不是该用户做的所有事都会被记录。
先查 UID,再用 _UID= 过滤
用户名不被支持,必须转成整数 UID:
- 查目标用户的 UID:
id -u username(例如id -u alice输出1002) - 执行过滤:
journalctl _UID=1002 - 查当前登录用户可简写:
journalctl _UID=$(id -u)
能查到什么?哪些行为有 _UID 记录?
只有以下明确携带 UID 元数据的来源才会被匹配:
- SSH、GDM、LightDM 等 PAM 登录/登出事件(含 session start/end)
- systemd 用户级服务日志(如
systemctl --user start myapp触发的) - 少数 setuid 程序调用
sd_journal_print()并显式传入 UID
以下不会出现在 _UID= 结果中:
- 用户登录后执行的任意命令(
ls、curl、nc等) - SSH 登录后的交互操作(除非命令自己打日志)
-
sudo切换身份后的操作(sudo 自身日志走/var/log/auth.log) - cron、at、tmux、screen 内的行为
提升排查效率的实用组合
单靠 _UID 信息有限,建议搭配其他字段缩小范围:
- 查最近 5 秒内该 UID 的登录相关日志:
journalctl _UID=1002 --since "5 seconds ago" | grep -i -E "(sshd|session|logind)" - 输出 JSON 并用 jq 提取关键字段:
journalctl _UID=1002 -o json --since "10 seconds ago" | jq 'select(.SYSLOG_IDENTIFIER=="sshd" or .UNIT | startswith("user@"))' - 结合会话 ID 查更细粒度行为:先运行
loginctl list-sessions得到 session ID(如c2),再执行journalctl SESSION=c2
真正要查用户行为,得看这些补充日志源
_UID 日志只是起点。完整分析需交叉验证:
-
/var/log/auth.log(或/var/log/secure):SSH 源 IP、密钥指纹、失败次数、sudo 提权记录 - auditd 日志(
/var/log/audit/audit.log):可审计execve、网络连接、提权行为(需提前配置规则) - systemd-logind 日志:
journalctl _COMM=systemd-logind查登录/登出、多设备并发 session -
~/.bash_history:仅当 shell 启用时间戳且未被清除时可参考(非 journalctl 范畴)


















