在Linux系统中,管理员或用户经常需要查看最近执行的命令,以便排查问题、审计操作或追溯历史记录,Linux提供了多种命令和工具来实现这一需求,从基础的history
命令到更高级的审计工具,每种方法都有其适用场景和特点,本文将详细介绍这些方法,包括它们的原理、使用方式及注意事项。

基础命令:history
history
命令是最常用、最直接查看历史命令的方法,它默认记录用户在当前终端会话中执行过的命令,并将历史记录存储在用户主目录下的.bash_history
文件中(具体文件名可能因Shell不同而异,如.zsh_history
对应Zsh)。
基本用法
-
查看所有历史记录:
直接输入history
即可显示当前会话中的历史命令列表,每条命令前会带有序号。history
输出示例:
1 ls -l 2 cd /tmp 3 cat test.txt 4 history
-
显示最近N条命令:
通过history N
可以只显示最近的N条命令,例如history 10
显示最近10条。(图片来源网络,侵删) -
执行历史命令:
使用加序号可以快速执行某条历史命令,如!3
会执行序号为3的命令(即cat test.txt
)。
高级选项
-
时间戳显示:
在.bashrc
或.bash_profile
中设置HISTTIMEFORMAT="%F %T "
,可使history
显示命令执行时间。export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " history
输出示例:
1 2023-10-01 10:30:15 ls -l 2 2023-10-01 10:30:20 cd /tmp
-
忽略重复命令:
设置HISTCONTROL=ignoredups
可避免连续重复的命令被记录。(图片来源网络,侵删) -
限制历史记录数量:
通过HISTSIZE
控制当前会话记录的命令数量,HISTFILESIZE
控制.bash_history
文件的最大行数。export HISTSIZE=1000 export HISTFILESIZE=2000
局限性
history
仅记录当前用户的历史,且默认不记录命令执行时间(需手动配置)。- 历史记录可能被用户手动清除或修改,安全性较低。
查看其他用户的历史记录
若需要查看其他用户的历史记录,需具备root权限,并直接访问目标用户的.bash_history
文件。
sudo cat /home/username/.bash_history
注意事项:
- 直接查看历史文件可能遗漏实时会话中的命令(未保存至文件)。
- 需确保目标用户使用的是Bash Shell,其他Shell(如Fish、Zsh)的记录文件可能不同。
实时监控命令执行:script
与scriptreplay
对于需要实时监控或回放命令执行场景的场景,可以使用script
和scriptreplay
工具。
录制终端会话
script -a session.log
执行后,所有终端操作将被记录到session.log
文件中,包括输入、输出及时间戳,退出录制使用exit
。
回放会话
scriptreplay -t session.log.timing session.log
需先通过script
的-t
选项生成时间戳文件(如session.log.timing
)。
系统级审计工具:auditd
对于企业级安全审计,Linux内核自带的auditd
服务可记录所有用户的命令执行日志,包括时间、用户、命令参数等详细信息。
启用auditd
sudo systemctl start auditd sudo systemctl enable auditd
规则配置
通过auditctl
添加审计规则,例如监控/bin/
和/usr/bin/
下的所有命令:
sudo auditctl -a always,exit -F dir=/bin -F perm=x -F auid>=1000 sudo auditctl -a always,exit -F dir=/usr/bin -F perm=x -F auid>=1000
查看审计日志
sudo ausearch -m EXEC -ts recent
-m EXEC
:筛选执行类事件。-ts recent
:显示最近时间段的记录。
优点:
- 无法被普通用户篡改,安全性高。
- 支持细粒度过滤(如按用户、命令路径等)。
缺点:
- 配置复杂,需root权限。
- 可能产生大量日志,需合理规划存储。
第三方工具:lastcomm
与acct
lastcomm
和acct
是Linux进程 accounting 功能的工具,可记录所有命令的执行情况。
启用acct
sudo systemctl enable acct
查看历史命令
lastcomm
输出包括命令名称、用户、终端、执行时间等信息。
查看用户统计
sa -u
显示每个用户执行的命令数量、CPU时间等统计信息。
不同方法的对比
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
history |
当前用户会话记录 | 简单易用,无需额外配置 | 仅限当前会话,可被手动清除 |
直接查看.bash_history |
查看其他用户历史 | 无需安装额外工具 | 非实时,依赖文件完整性 |
script |
实时录制/回放会话 | 支持时间戳和完整操作记录 | 需手动启动,可能遗漏后台进程 |
auditd |
企业级安全审计 | 高安全性,不可篡改,细粒度过滤 | 配置复杂,资源消耗高 |
lastcomm |
系统级命令统计 | 记录所有用户,支持统计分析 | 需启用acct,日志可能庞大 |
相关问答FAQs
Q1: 为什么history
命令显示的时间戳不准确?
A: history
本身不记录时间戳,需通过HISTTIMEFORMAT
变量格式化显示,若未配置该变量,时间戳部分可能显示为空白或异常,建议在.bashrc
中添加export HISTTIMEFORMAT="%F %T "
以启用时间戳记录。
Q2: 如何防止历史记录被恶意删除?
A: 可以通过以下方法增强安全性:
- 限制
.bash_history
文件的权限(如chmod 600 ~/.bash_history
),防止其他用户读取。 - 使用
auditd
服务记录系统级操作,普通用户无法清除审计日志。 - 定期将
.bash_history
备份到不可修改的位置(如只读文件系统或远程日志服务器)。