
在Linux系统中 .bash_history 只记录了用户曾经输入过的命令,另外,它也有可能被用户清理(history -c)。
如果我们需要实时了解系统上用户正在做什么,或者需要一份即使用户试图隐藏操作也无法删除的记录,那么 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 会话中输入过的命令。
不过,默认情况下历史文件并不包含时间戳。我们能知道用户执行了哪些命令,但不知道是什么时候执行的。
要显示每条历史记录对应的日期和时间,设置 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禁用历史记录,甚至在注销前直接编辑文件。时间戳让历史记录在回顾我们自己执行的命令时更实用,但无法阻止他人删除或篡改历史。如果我们需要一份值得信赖的用户活动记录,就要用到本文后面介绍的专用审计工具。
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 只显示系统当前状态的快照,既不会持续监控用户活动,也不会保留命令历史。
如果我们需要在用户执行命令的同时看到它们,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的安装,下一篇文章专门介绍。
有时候,仅靠实时监控是不够的。我们可能还需要一份完整的用户终端会话记录,以便事后回放审查。这就是 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 也有,但可能需要手动安装。
如果我们需要一份用户无法篡改的可靠审计轨迹,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 被广泛采用。
如果我们想录制终端会话用于故障排查、演示或文档记录,script 命令是一个快捷轻便的选择。
开始录制:
script -a session.log
参数含义:
-a — 追加写入现有日志文件,而不是覆盖它session.log — 终端会话的保存文件会话期间终端上显示的所有内容都会写入日志文件。录制完成后,输入以下命令停止:
exit
script 命令很轻量,大多数 Linux 发行版都自带,无需额外安装。但要注意,它只能录制手动启动的会话。
对于全系统持续审计或自动录制用户会话的需求,tlog 或 auditd 这类工具更为合适。
想要快速查看用户执行过哪些命令,Bash 历史确实很方便,但它只能作为参考,不能当作正式的审计日志——因为用户完全可以自己修改甚至删除这些记录。
如果只是想知道当前有哪些用户在活动、在做什么,用 w 命令就足够了。
要是想实时监控命令的执行,sysdig 可以帮你在命令运行的同时就捕获到它的踪迹。
不过,如果要做长期的审计或者录制完整的操作会话,还是得靠 tlog 和 auditd 这类更专业的工具。它们不依赖 Shell 的历史文件,记录也无法被用户随意更改,可靠性要高得多。
