在Linux系统中,查看已执行的命令是日常运维、安全审计和故障排查的重要操作,Linux提供了多种方式记录和查询命令执行历史,包括Shell内置的历史命令记录、系统日志文件、实时监控工具等,本文将详细介绍这些方法的具体操作、适用场景及注意事项。
使用history命令查看当前会话的历史记录
history
命令是bash、zsh等Shell内置的工具,用于记录和管理当前用户在终端中执行的命令,默认情况下,history
会显示当前会话中最近执行的命令列表,每条命令前带有一个数字序号(表示在历史文件中的位置)。
基本用法
-
查看最近执行的命令:直接输入
history
,默认显示最近1000条命令(具体数量由HISTSIZE
变量控制)。history
输出示例:
1001 ls -l /home 1002 cd /tmp 1003 pwd 1004 cat test.txt
-
查看指定数量的历史命令:通过
n
参数限制显示条数,例如查看最近50条:history 50
-
搜索历史命令:结合
grep
命令可快速定位特定命令,例如查找包含“yum”的命令:history | grep yum
历史命令的保存与清理
- 手动保存当前会话历史:默认情况下,退出Shell时,当前会话的历史命令会自动追加到历史文件(通常为
~/.bash_history
),若需手动保存,可执行:history -a # 将当前会话的历史记录追加到历史文件
- 清空历史记录:
history -c # 清空当前会话的历史记录 history -r # 从历史文件中重新加载历史记录到当前会话
历史命令的个性化配置
通过修改~/.bashrc
或~/.bash_profile
文件,可自定义历史记录的行为,
export HISTSIZE=2000 # 设置历史记录最大保存条数 export HISTFILESIZE=2000 # 设置历史文件最大保存条数 export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 为历史命令添加时间戳 export HISTCONTROL=ignorespace # 忽略以空格开头的命令 export HISTCONTROL=ignoredups # 忽略重复命令
配置完成后,执行source ~/.bashrc
使生效,此时history
显示的命令将包含时间戳,便于追溯。
查看历史文件中的长期记录
history
命令显示的是当前会话和已保存到历史文件的记录,历史文件默认存储在用户主目录下(如~/.bash_history
),可通过$HISTFILE
变量查看路径。
查看历史文件内容
-
直接查看历史文件:
cat ~/.bash_history
输出格式为纯文本,每行一条命令,无时间戳(除非配置了
HISTTIMEFORMAT
)。 -
查看带时间戳的历史记录:若配置了
HISTTIMEFORMAT
,可通过grep
和awk
解析时间戳:grep -E '^[0-9]' ~/.bash_history | awk '{print $1" "$2" "$3}' | head -n 10
历史文件的权限与安全
历史文件默认权限为600
,仅当前用户可读写,若需防止其他用户查看,可手动设置权限:
chmod 600 ~/.bash_history
通过系统日志查看命令执行记录
除了Shell历史文件,Linux系统还会将关键命令执行记录(如sudo、登录操作)保存到系统日志中,适合审计和追溯。
常用日志文件及内容
日志文件路径 | 适用发行版 | |
---|---|---|
/var/log/secure |
RHEL/CentOS | 认证日志,记录sudo命令、SSH登录、远程执行命令等安全相关操作 |
/var/log/auth.log |
Ubuntu/Debian | 与/var/log/secure 类似,记录认证和授权信息 |
/var/log/bash.log |
自定义配置 | 若通过syslog 配置了bash日志,可记录所有bash命令执行详情(需root权限开启) |
/var/log/wtmp |
多数发行版 | 永久登录记录,通过last 命令查看(记录登录/登出时间、用户、终端等) |
/var/log/btmp |
多数发行版 | 失败登录记录,通过lastb 命令查看 |
查看日志中的命令记录
-
查看sudo执行记录:
grep sudo /var/log/secure
输出示例:
Aug 10 14:30:01 localhost sudo: user : TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/yum update -y
-
查看SSH远程执行的命令:若通过SSH执行命令,需检查
/var/log/secure
或/var/log/auth.log
中的session
信息:grep "session opened" /var/log/secure | grep ssh
-
开启bash详细日志(需root权限):修改
/etc/rsyslog.conf
,添加以下内容记录所有bash命令:if $programname == 'bash' then /var/log/bash.log
重启rsyslog服务:
systemctl restart rsyslog
。
实时监控命令执行
若需实时监控当前终端或用户执行的命令,可使用以下工具:
script
命令录制终端会话
script
命令可将终端操作录制为文本文件,包括输入的命令和输出结果:
script -a session.log # 开始录制,追加到session.log # 执行命令... exit # 结束录制
录制后的文件可通过cat session.log
查看,适合临时记录操作过程。
auditd
系统审计服务
auditd
是Linux内核的审计工具,可实时监控文件访问、系统调用、命令执行等,适合高安全性场景。
-
安装auditd:
yum install auditd # RHEL/CentOS apt install auditd # Ubuntu/Debian
-
添加审计规则(监控所有用户执行的命令):
auditctl -a always,exit -F arch=b64 -S execve -k commands
-
查看审计日志:
ausearch -k commands -i # 查看与commands相关的审计记录 aureport -x # 生成命令执行摘要报告
进阶方法:查看其他用户或进程的命令
查看其他用户的历史记录
需root权限,直接查看目标用户的历史文件:
cat /home/username/.bash_history
通过/proc
目录查看进程命令行
对于正在运行的进程,可通过/proc/$PID/cmdline
查看其启动命令,例如查看PID为1234的进程:
cat /proc/1234/cmdline
注意事项
- 历史记录可能被篡改:用户可通过
history -c
清空当前会话记录,或直接编辑~/.bash_history
文件,重要审计需结合系统日志(如/var/log/secure
)交叉验证。 - 权限限制:系统日志文件通常需root权限查看,普通用户可通过
sudo
命令获取权限。 - 日志轮转:系统日志会通过
logrotate
工具轮转(如/var/log/secure.1
、/var/log/secure.2.gz
),旧日志需解压后查看。
相关问答FAQs
问题1:为什么history命令显示的历史记录不全,有些最近执行的命令看不到?
解答:可能原因包括:(1)历史记录未从内存写入文件,可执行history -a
手动追加;(2)HISTFILESIZE
设置过小,导致旧记录被覆盖,检查echo $HISTFILESIZE
并适当调大;(3)当前会话异常退出(如强制关闭终端),导致未保存到历史文件,可通过/var/log/secure
或/var/log/auth.log
追溯登录后的操作。
问题2:如何防止历史命令被其他用户查看或篡改?
解答:(1)设置历史文件权限为600
:chmod 600 ~/.bash_history
;(2)在~/.bashrc
中添加unset HISTFILE
,禁用当前用户的历史记录;(3)启用auditd
服务审计命令执行,并将日志保存到只读目录;(4)限制普通用户sudo权限,避免通过sudo
查看系统日志。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20254.html