如何查看Linux系统执行过的命令历史记录?

在Linux系统中,查看已执行的命令是日常运维、安全审计和故障排查的重要操作,Linux提供了多种方式记录和查询命令执行历史,包括Shell内置的历史命令记录、系统日志文件、实时监控工具等,本文将详细介绍这些方法的具体操作、适用场景及注意事项。

怎么查看linux执行了哪些命令

使用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)。

    怎么查看linux执行了哪些命令

  • 查看带时间戳的历史记录:若配置了HISTTIMEFORMAT,可通过grepawk解析时间戳:

    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命令可将终端操作录制为文本文件,包括输入的命令和输出结果:

怎么查看linux执行了哪些命令

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

注意事项

  1. 历史记录可能被篡改:用户可通过history -c清空当前会话记录,或直接编辑~/.bash_history文件,重要审计需结合系统日志(如/var/log/secure)交叉验证。
  2. 权限限制:系统日志文件通常需root权限查看,普通用户可通过sudo命令获取权限。
  3. 日志轮转:系统日志会通过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)设置历史文件权限为600chmod 600 ~/.bash_history;(2)在~/.bashrc中添加unset HISTFILE,禁用当前用户的历史记录;(3)启用auditd服务审计命令执行,并将日志保存到只读目录;(4)限制普通用户sudo权限,避免通过sudo查看系统日志。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20254.html

(0)
酷番叔酷番叔
上一篇 2025年8月30日 12:41
下一篇 2025年8月30日 13:06

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信