最可靠的方式是利用内核级 auditd 捕获 execve 系统调用,因其覆盖所有命令执行场景、抗绕过且不依赖用户环境;需配置 arch=b64/b32 规则并持久化至 /etc/audit/rules.d/,配合 ausearch/aureport 解析日志,并强化日志防篡改与远程备份。

history 只能查看当前 shell 会话所属用户的历史命令,无法跨用户读取——这是设计使然,不是权限问题,也不是配置没调好。
真正能“查看当前所有用户的历史命令记录”的方案,根本不在 history 命令里,而取决于你是否提前做了审计部署。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
为什么 history 查不到其他用户命令
每个用户的 history 默认只读自己家目录下的 ~/.bash_history(或对应 shell 的历史文件),且:
- 不记录执行时间(除非设了 HISTTIMEFORMAT)
- 不记录 UID、PID、tty 等上下文
- 多终端不同步,关机前未 history -w 就会丢失
- 可被 HISTFILE=/dev/null 或 unset HISTFILE 绕过
- sudo su - 或 sudo -i 切换后,实际还是在目标用户自己的 history 里,但原始操作者信息已丢失
auditd 是唯一能可靠捕获所有用户命令的机制
它监听 execve 系统调用,不依赖 shell,绕过所有用户层伪装(包括 bash -c、python -c、sh -c):
- 记录完整可执行路径(如 /usr/bin/ls,不是简写的 ls)
- 包含真实 UID、PID、终端(tty)、时间戳
- 日志存于 /var/log/audit/audit.log,不可被普通用户删除或清空
- 需 root 权限配置和查询
实操要点:
- 确认服务运行:sudo systemctl status auditd
- 添加规则(x86_64):sudo auditctl -a always,exit -F arch=b64 -S execve -F uid!=0 -k user_cmd
- 持久化规则:写入 /etc/audit/rules.d/user-cmd.rules,再运行 sudo augenrules --load
- 查看格式化日志:sudo ausearch -k user_cmd | aureport -f -i
- 注意:auditd 不记录命令参数(出于安全考虑),但足够定位“谁、在哪个终端、何时、运行了哪个程序”
如果 auditd 不可用(如容器、无 root 权限),只能退而求其次
这类方案都依赖用户 shell 启动,且极易被绕过,仅作辅助参考:
- 检查各用户 ~/.bash_history 文件(需有读权限):sudo ls -l /home/*/\.bash_history
- 强制统一历史文件路径(需修改所有目标用户的 ~/.bashrc):export HISTFILE="/var/log/user-history/$USER",并确保目录可写、权限可控
- 使用 logger + PROMPT_COMMAND 写 syslog(见知识库中跳板机方案),但要求用户每次新开 shell 都 source 配置,且可被 unset PROMPT_COMMAND 干扰
- last 和 lastlog 只管登录,不管命令;ps auxf 是快照,无法回溯
别指望靠临时扫描 /proc 或 ps 抓到“历史命令”
进程早结束了,/proc/[pid]/cmdline 只存当前运行中的进程参数;ps 输出的是瞬时状态,不是历史。试图用 lsof、strace 或 systemctl status 追踪命令历史,都是方向性错误。
真正要查“所有用户干过什么”,关键不是翻 history,而是看系统有没有启用 auditd —— 没配过,就真没有可靠记录。临时补救意义不大,得从下一次登录开始部署。

















