在Linux系统中,查看命令执行记录是系统管理和日常运维中的常见需求,无论是排查问题、审计操作还是追溯历史命令,都需要掌握多种查看方法,Linux系统通过不同的机制记录命令执行历史,包括Shell历史记录、系统日志、进程监控工具等,每种方法适用于不同场景,下面将详细介绍这些查看命令执行记录的方式。

Shell历史记录查看
Shell历史记录是最直接、最常用的命令执行记录方式,主要依赖于Shell环境维护的历史列表,默认情况下,Bash Shell会将用户输入的命令保存在历史文件中,通常位于用户主目录下的.bash_history文件(历史文件路径可能因Shell类型不同而有所差异,如Zsh的默认历史文件为.zsh_history)。
基本查看命令
-
history
命令:这是查看当前Shell会话历史记录最常用的命令,执行history
会显示当前会话中执行过的命令列表,每条命令前带有一个数字序号,history
输出示例可能为:
1 ls -l 2 cd /home 3 ps aux
通过序号可以快速执行历史命令,如
!2
会执行序号为2的命令(即cd /home
)。(图片来源网络,侵删) -
查看历史文件内容:除了当前会话的历史记录,还可以直接查看历史文件内容,使用
cat
、less
或more
命令:cat ~/.bash_history less ~/.bash_history
less
命令支持分页浏览,适合查看较长的历史文件。
历史记录的定制与搜索
-
控制历史记录数量:通过设置
HISTSIZE
和HISTFILESIZE
环境变量可以控制当前会话和历史文件中保存的命令数量,在~/.bashrc
或~/.bash_profile
中添加:export HISTSIZE=1000 export HISTFILESIZE=2000
设置后需重新加载配置文件(如执行
source ~/.bashrc
)生效。(图片来源网络,侵删) -
历史记录时间戳:若要记录命令执行的时间戳,可以在
~/.bashrc
中启用HISTTIMEFORMAT
变量:export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
设置后,
history
命令的输出会包含每条命令的执行时间,1 2023-10-01 10:00:00 ls -l 2 2023-10-01 10:01:00 cd /tmp
-
搜索历史记录:使用
history
结合grep
可以快速搜索特定命令:history | grep "ssh"
或者在当前Shell中使用
Ctrl+R
进入反向搜索模式,输入关键词后按Enter
执行匹配的命令。
历史记录的清理与覆盖
- 清理当前会话历史记录:执行
history -c
可清空当前会话的历史列表。 - 删除历史文件中的特定命令:若要删除历史文件中的某条命令,可以先通过
history
找到序号,再使用history -d 序号
删除,例如删除序号为5的命令:history -d 5
删除后需执行
history -w
将当前会话历史写入文件,否则修改不会保存到历史文件中。
系统日志查看
除了Shell历史记录,Linux系统还会通过日志服务记录用户的登录信息和执行的命令,这些日志通常存储在/var/log/
目录下,适合审计和长期追溯。
查看登录日志
-
last
命令:显示用户的登录历史,包括登录时间、来源IP、终端等信息,last
输出示例可能为:
root pts/0 192.168.1.100 Tue Oct 1 10:00 still logged in user1 pts/1 10.0.0.50 Mon Sep 30 15:30 - 09:45 (18:15)
登录记录保存在
/var/log/wtmp
文件中,last
命令直接读取该文件。 -
lastb
命令:显示失败的登录尝试,用于排查异常登录行为,记录保存在/var/log/btmp
文件中。
查看命令执行日志(需配置)
默认情况下,Linux系统不会记录所有命令的执行日志,但可以通过配置syslog
或使用auditd
服务实现。
-
通过
syslog
记录命令:修改rsyslog
配置文件(如/etc/rsyslog.conf
),添加以下规则记录用户执行的命令::omusrmsg:* /dev/console *.*;auth,authpriv.none -/var/log/syslog local6.* /var/log/commands.log
然后通过
pam_exec
模块在用户登录时记录命令,具体配置较为复杂,需结合PAM
模块实现。 -
使用
auditd
服务:auditd
是Linux下的审计工具,可详细记录系统调用、文件访问和命令执行,审计所有用户执行的bash
命令:auditctl -a always,exit -F arch=b64 -S execve -F exe=/bin/bash -k commands
审计日志保存在
/var/log/audit/audit.log
中,使用ausearch
查看:ausearch -k commands -i
实时监控命令执行
若要实时监控当前或其他终端的命令执行,可以使用以下工具:
script
命令
script
命令可以记录当前终端的所有操作,包括输入和输出,生成一个typescript文件:
script -a session.log
执行后,终端中的所有命令和输出都会记录到session.log
中,输入exit
结束记录。
tmux
或screen
会话记录
使用tmux
或screen
管理终端会话时,可以启用会话日志功能,在tmux
中启用日志:
tmux new -s session_name # 在tmux会话中执行:Ctrl+b :,然后输入:set-option -g history-file /path/to/history.log
ps
和top
查看进程
若要查看当前正在执行的命令,可以使用ps
或top
命令:
ps aux top
ps aux
显示所有进程的详细信息,包括执行的命令和参数;top
实时更新进程列表,适合监控动态进程。
不同查看方式的对比
为了更直观地比较上述方法,下表总结了它们的适用场景和特点:
查看方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
history 命令 |
查看当前或历史Shell会话命令 | 简单快捷,支持搜索和序号执行 | 仅限当前用户,默认不记录时间戳 |
直接查看历史文件 | 永久保存的命令记录 | 可跨会话查看,支持文本编辑 | 需手动清理,默认无时间戳 |
last /lastb 命令 |
查看登录/失败登录记录 | 记录来源IP和登录时间 | 不记录具体命令执行内容 |
auditd 服务 |
系统级命令审计和追踪 | 详细记录,支持过滤和实时监控 | 配置复杂,需额外开启服务 |
script 命令 |
实时记录终端操作 | 记录完整交互过程 | 需手动启动,不记录历史命令 |
相关问答FAQs
问题1:为什么history
命令显示的历史记录和实际执行的不一致?
解答:这种情况通常由以下原因导致:
- 历史文件未同步:当前会话的历史记录未写入文件,可通过
history -w
强制同步。 - 多终端会话:多个终端同时运行时,
history
仅显示当前会话的历史,其他终端的记录需单独查看。 - 环境变量配置:若
HISTCONTROL
设置了ignorespace
或ignoredups
,以空格开头的命令或重复命令可能不会记录。 - 历史文件权限问题:若
~/.bash_history
文件权限异常(如只读),可能导致新命令无法写入。
问题2:如何永久记录所有用户的命令执行日志?
解答:要永久记录所有用户的命令执行日志,可通过以下步骤配置auditd
服务:
- 安装并启动
auditd
服务(若未安装,使用apt install auditd
或yum install auditd
安装)。 - 编辑
/etc/audit/rules.d/audit.rules
文件,添加以下规则:-a always,exit -F arch=b64 -S execve -F euid>=0 -F auid>=1000 -F auid!=4294967295 -k commands -a always,exit -F arch=b32 -S execve -F euid>=0 -F auid>=1000 -F auid!=4294967295 -k commands
上述规则会记录所有UID≥1000(普通用户)执行的命令。
- 重启
auditd
服务使规则生效:systemctl restart auditd
。 - 查看日志时使用
ausearch -k commands -i
,日志文件位于/var/log/audit/audit.log
。
注意:此方法需要确保auditd
服务正常运行,且日志文件存储空间充足。