当前位置:首页>Linux>如何实时监控 Linux 用户执行了什么命令(sysdig/tlog/auditd)

如何实时监控 Linux 用户执行了什么命令(sysdig/tlog/auditd)

  • 2026-10-11 06:31:36
如何实时监控 Linux 用户执行了什么命令(sysdig/tlog/auditd)

在Linux系统中 .bash_history 只记录了用户曾经输入过的命令,另外,它也有可能被用户清理(history -c)。

如果我们需要实时了解系统上用户正在做什么,或者需要一份即使用户试图隐藏操作也无法删除的记录,那么 Bash 历史记录并不是合适的工具。

若需满足实时监控与防篡改审计需求,须采用其他工具。下面将逐一介绍。

1. 查看用户的 Bash 历史文件

用户在交互式 Bash Shell 中执行的每一条命令,通常都会保存在其主目录下一个名为 .bash_history 的隐藏文件中。

cat /home/ymadmin/.bash_history
[root@yyzcdb81 ~]# cat /home/ymadmin/.bash_history
#1770083790
exit
#1785902380
top
#1785902397
w
#1785902411
exit
[root@yyzcdb81 ~]# 

这样就可以看到用户在之前 Shell 会话中输入过的命令。

不过,默认情况下历史文件并不包含时间戳。我们能知道用户执行了哪些命令,但不知道是什么时候执行的。

2. 为 Bash 历史记录添加时间戳

要显示每条历史记录对应的日期和时间,设置 HISTTIMEFORMAT 环境变量即可:

export HISTTIMEFORMAT='%F %T '
history

格式说明:

  • %F — 以 YYYY-MM-DD 格式显示日期
  • %T — 以 HH:MM:SS 格式显示时间

设置完成后,history 命令会在每条命令旁边显示时间戳,审查用户活动就方便多了。

……
 1823  2026-08-03 09:21:43 last
 1824  2026-08-03 09:25:05 last reboot
 1825  2026-08-03 09:29:12 last
 1826  2026-08-03 09:33:57 last | awk '{print $3}' | sort | uniq -c | sort -rn | head -20
 1827  2026-08-03 09:36:07 lastb
 1828  2026-08-03 09:56:14 w
 1829  2026-08-03 09:56:17 who 
 1830  2026-08-03 09:56:19 whoa -a
 1831  2026-08-03 09:56:23 who -a
 1832  2026-08-03 09:56:36 LANG=en_US
 1833  2026-08-03 09:56:41 who -a
 1834  2026-08-03 09:56:53 who am i
 1835  2026-08-03 09:58:47 who | awk '{print $5}' | tr -d '()' | sort | uniq -c
 1836  2026-08-03 09:59:11 who | grep "^root"
 1837  2026-08-03 10:01:08 w
 1838  2026-08-05 13:22:11 cat /home/ymadmin/.bash_history
……

如果想让所有用户自动启用此功能,在 /etc/profile 或 /etc/bash.bashrc 中添加:

export HISTTIMEFORMAT='%F %T '

注意:这只对用户重新登录后的新 Shell 会话生效。.bash_history 并不是可靠的审计日志——文件属于用户本人,他们可以用 history -c 清空、通过 unset HISTFILE 禁用历史记录,甚至在注销前直接编辑文件。

时间戳让历史记录在回顾我们自己执行的命令时更实用,但无法阻止他人删除或篡改历史。如果我们需要一份值得信赖的用户活动记录,就要用到本文后面介绍的专用审计工具。

3. 查看谁在登录、在做什么

w 命令可以快速查看系统当前已登录用户的情况。它告诉我们:谁在线、从哪个终端连进来、空闲了多久,以及当前正在运行什么命令。

[root@yyzcdb81 ~]# w
 11:58:48 up 15 days, 22:04,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.129.2.30      11:55    0.00s  0.31s  0.00s w
root     pts/1    10.129.2.30      11:58    8.00s  0.30s  0.02s -bash
[root@yyzcdb81 ~]# 

输出包含:

  • 已登录的用户名
  • 连接的远程主机或终端
  • 登录时间和空闲时间
  • 当前正在执行的命令或进程

这对于快速了解系统状态很有用,但要记住:w 只显示系统当前状态的快照,既不会持续监控用户活动,也不会保留命令历史。

4. 用 Sysdig 实时监控命令

如果我们需要在用户执行命令的同时看到它们,sysdig 是一个远比 Bash 历史更好的选择。它通过实时监测系统调用来工作,让我们能同步观察用户活动。

安装 sysdig 后运行:

sysdig -c spy_users

参数含义:

  • sysdig — 启动系统调用追踪工具
  • -c spy_users — 使用内置的 spy_users 探测器,显示登录用户执行的交互式命令及目录变更。

用户一按回车,我们就能在屏幕上看到这条命令。这让 sysdig 非常适合在线系统的故障排查或活动监控。

[root@yyzcdb81 tmp]# sysdig -c spy_users
16833 13:27:30 root) ls --color=auto -l --color=auto
16833 13:27:34 root) cd /
16833 13:27:35 root) ls --color=auto -l --color=auto
16833 13:27:43 root) cd /backup
16833 13:27:44 root) ls --color=auto -l --color=auto
16833 13:27:58 root) du -sh
……

关于sysdig的安装,下一篇文章专门介绍。

5. 用 tlog 录制用户终端会话

有时候,仅靠实时监控是不够的。我们可能还需要一份完整的用户终端会话记录,以便事后回放审查。这就是 tlog 的用武之地。

tlog 可以录制整个终端会话,包括用户输入和终端输出,方便我们事后回放,用于审计或故障排查。

手动启动录制会话:

tlog-rec-session

回放已录制的会话:

tlog-play -i session.log

命令说明:

  • tlog-rec-session — 启动一个终端会话,将用户输入和屏幕显示的所有内容都记录下来
  • tlog-play -i session.log — 按原始时序回放录制好的会话,方便我们完整复盘操作过程

在生产环境中,管理员通常通过 PAM(可插拔认证模块)来配置 tlog,让录制在用户登录时自动启动,不需要用户自己执行 tlog-rec-session。

RHEL、Rocky Linux 及其他 Red Hat 系发行版的官方仓库中都包含 tlog。Debian 和 Ubuntu 也有,但可能需要手动安装。

6. 用 auditd 实现持久审计

如果我们需要一份用户无法篡改的可靠审计轨迹,auditd 是正确的选择。它从内核层面记录系统事件,并将日志保存在 /var/log/audit/audit.log——普通用户既不能编辑也无法删除。

在 64 位系统上记录所有用户执行程序的审计规则:

auditctl -a always,exit -F arch=b64 -S execve

查看最近录制的执行事件:

ausearch -m execve -ts recent

命令说明:

  • auditctl -a always,exit -F arch=b64 -S execve — 添加一条审计规则,记录每一次 execve 系统调用(任何程序被执行时都会触发这个调用)
  • ausearch -m execve -ts recent — 在审计日志中搜索最近记录的 execve 事件

由于 auditd 在内核级别记录事件,而不是依赖用户的 Shell 历史,它提供了一条远比 Shell 历史值得信赖的审计轨迹。正因如此,在需要满足安全合规要求的环境中,auditd 被广泛采用。

7. 用 script 命令录制终端会话

如果我们想录制终端会话用于故障排查、演示或文档记录,script 命令是一个快捷轻便的选择。

开始录制:

script -a session.log

参数含义:

  • -a — 追加写入现有日志文件,而不是覆盖它
  • session.log — 终端会话的保存文件

会话期间终端上显示的所有内容都会写入日志文件。录制完成后,输入以下命令停止:

exit

script 命令很轻量,大多数 Linux 发行版都自带,无需额外安装。但要注意,它只能录制手动启动的会话。

对于全系统持续审计或自动录制用户会话的需求,tlog 或 auditd 这类工具更为合适。

# 总结

想要快速查看用户执行过哪些命令,Bash 历史确实很方便,但它只能作为参考,不能当作正式的审计日志——因为用户完全可以自己修改甚至删除这些记录。

如果只是想知道当前有哪些用户在活动、在做什么,用 w 命令就足够了。

要是想实时监控命令的执行,sysdig 可以帮你在命令运行的同时就捕获到它的踪迹。

不过,如果要做长期的审计或者录制完整的操作会话,还是得靠 tlog 和 auditd 这类更专业的工具。它们不依赖 Shell 的历史文件,记录也无法被用户随意更改,可靠性要高得多。

最新文章

随机文章