journalctl 必须用数字 uid(如 _uid=1002)筛选日志,不支持用户名;仅匹配显式写入 _uid 字段的日志(如 pam 登录、systemd 用户服务),不记录 shell 命令、ssh 交互、sudo 操作等。

journalctl 可以按用户 UID 筛选日志,但**不能直接用用户名(如 suspicious_user)筛选**,必须使用数字 UID;同时需明确:它只匹配那些**主动在日志中写入了 _UID 字段的条目**,不是该用户执行的所有操作都会留下记录。
必须用 UID 数字,不能用用户名
journalctl 的 _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 xxx触发的日志) - 少数 setuid 程序显式调用
sd_journal_print()并传入 UID
它不记录:
- 用户登录后执行的任意 shell 命令(
ls、curl、nc等) - SSH 登录后的所有交互行为(除非命令自己打日志)
-
sudo切换身份后的操作(sudo自身日志走auth.log或_GID/_UID不可靠) - 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(谨慎参考):仅当启用时间戳且未被清除时有辅助价值











