Linux如何查看最近执行的命令?

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

linux查看最近执行的命令
(图片来源网络,侵删)

基础命令: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条。

    linux查看最近执行的命令
    (图片来源网络,侵删)
  • 执行历史命令
    使用加序号可以快速执行某条历史命令,如!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可避免连续重复的命令被记录。

    linux查看最近执行的命令
    (图片来源网络,侵删)
  • 限制历史记录数量
    通过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)的记录文件可能不同。

实时监控命令执行:scriptscriptreplay

对于需要实时监控或回放命令执行场景的场景,可以使用scriptscriptreplay工具。

录制终端会话

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权限。
  • 可能产生大量日志,需合理规划存储。

第三方工具:lastcommacct

lastcommacct是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: 可以通过以下方法增强安全性:

  1. 限制.bash_history文件的权限(如chmod 600 ~/.bash_history),防止其他用户读取。
  2. 使用auditd服务记录系统级操作,普通用户无法清除审计日志。
  3. 定期将.bash_history备份到不可修改的位置(如只读文件系统或远程日志服务器)。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/391243.html<

(0)
运维的头像运维
上一篇2025-10-10 13:20
下一篇 2025-10-10 13:31

相关推荐

  • cmd at命令实例有哪些具体用法?

    在Windows操作系统中,命令提示符(CMD)是一个强大的工具,它允许用户通过文本命令与系统进行交互,at命令是一个计划任务工具,用于在指定的时间运行命令或程序,尽管在较新的Windows版本中(如Windows 8和Windows 10),at命令已被schtasks命令取代,但了解at命令的实例和用法仍然……

    2025-11-20
    0
  • bat如何启动服务?命令格式是怎样的?

    在Windows操作系统中,BAT脚本(批处理文件)是一种强大的工具,可以通过简单的命令实现自动化操作,其中启动服务是常见的应用场景,服务是Windows中在后台运行的应用程序,通常没有用户界面,用于提供系统功能或支持其他应用程序,通过BAT脚本启动服务,可以简化手动操作,提高管理效率,以下是关于使用BAT脚本……

    2025-11-20
    0
  • echo命令作用究竟是什么?

    echo命令是Linux和Unix-like系统中非常基础且广泛使用的命令行工具,其核心作用是在终端(控制台)输出指定的文本、字符串或变量值,虽然功能看似简单,但echo命令在脚本编写、系统管理、调试和用户交互等多个场景中都扮演着不可或缺的角色,通过灵活使用echo命令,用户可以快速实现信息显示、内容拼接、格式……

    2025-11-20
    0
  • Linux命令运行的具体方法有哪些?

    在Linux操作系统中,运行命令是用户与系统交互的核心方式,通过命令行界面(CLI)可以高效地管理文件、配置系统、运行程序等,Linux命令的运行涉及命令的基本结构、参数传递、命令查找机制、权限管理等多个方面,以下将详细解析Linux运行命令的具体方法和相关知识点,命令的基本结构与运行方式Linux命令通常由三……

    2025-11-20
    0
  • cmd命令如何获取当前时间戳?

    在Windows操作系统中,cmd命令是用户与系统交互的重要工具,而时间戳则是记录和追踪事件发生时间的关键数据,结合cmd命令与时间戳,可以实现日志记录、任务调度、文件管理等多种实用功能,本文将详细解析如何通过cmd命令获取、处理和应用时间戳,并通过具体示例和表格展示操作方法,获取当前时间戳的cmd命令在cmd……

    2025-11-20
    0

发表回复

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