如何管理你的 Linux 命令历史记录
您可能知道使用上下箭头键滚动浏览 Bash 历史记录,但您是否知道 Bash 历史记录不仅仅是重复命令?故事远不止这些。或者,历史应该远不止这些吗?无论如何,history 命令是那些功能强大且至少在基本层面上值得了解的晦涩命令之一。本文将揭开 Bash 历史记录的神秘面纱,使其成为一个更友好的系统管理工具。
背景
在 Bash 中,命令历史记录存储在.bash_history
主目录中的文件 ( ) 中。前导 (.) 使文件在正常视图中隐藏。要查看它,请发出命令ls -a
。
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc
您可以像操作任何其他纯 ASCII 文本文件一样操作 .bash_history 文件。
您需要了解的三个相关环境变量是 HISTFILE、HISTFILESIZE 和 HISTSIZE。
- HISTFILE—/home/<用户名>/.bash_history
- HISTFILESIZE — 1000
- 历史规模—1000
HISTFILE 变量保存 Bash 历史文件的名称和位置。HISTFILESIZE 表示.bash_history
文件中可以存储的命令数。HISTSIZE 表示缓存的命令数。一旦达到 1000 条命令,最旧的命令将被丢弃,因为会保存新的命令。
$ echo $HISTSIZE
1000
$ echo $HISTFILESIZE
1000
$ echo $HISTFILE
/home/khess/.bash_history
每个用户(包括 root)都默认分配了这些变量和大小。如果要更改这些变量,请编辑主目录中的 .bashrc 文件。例如,如果要将大小变量更改为 500 个命令,请编辑该.bashrc
文件并使用以下条目:
export HISTSIZE=500
export HISTFILESIZE=500
要使用新值而无需注销并重新登录,您可以执行该.bashrc
文件。
$ . ~/.bashrc
您的值现在对当前 shell 和任何子 shell 均有效。
$ echo $HISTSIZE
500
$ echo $HISTFILESIZE
500
如果你不希望历史记录保留重复的命令,则可以通过在 .bashrc 文件中添加以下内容来指示历史记录忽略重复的条目:
export HISTCONTROL=ignoredups
问题
Bash 历史记录的问题在于,它直到您注销后才会写入.bash_history
文件。这使得无法使用 history 命令进行脚本编写。例如,假设您正在教授 Linux 课程,并且想要检查学生是否运行了特定命令以将他们的文件复制到已安装的外部驱动器。如果学生保持登录状态,您将无法确定是否已执行复制,因为您的脚本使用他们的历史文件 (/home/student/.bash_history) 来检查命令是否已运行。
解决方案
要解决此功能,请使用命令的写入选项history
。作为课堂指导的一部分,您可以让学生运行此命令来保存他们的历史记录,即使他们没有注销。
$ history -w
这会将所有当前会话命令历史记录写入 HISTFILE。现在您的检查脚本可以轻松找到该命令是否已运行。您还必须相信学生会运行历史命令。
[ 查看 Seth Kenlon 的历史课: 利用这些技巧让 Bash 历史更有用]
另一个问题
由于 HISTSIZE 和 HISTFILESIZE 相对较大(1000 个命令),因此学生可能之前运行过该命令。您可以在他们的 .bashrc 中添加 export HISTCONTROL=ignoredups 条目,但如果学生两天前运行过类似的命令,这将无济于事,因为该文件只会显示一个命令。
这个问题的解决办法
要解决此问题,您应该在登录时清除学生的历史记录。再次编辑 .bashrc 文件并向其中添加以下命令。
history -c
此命令会在每次登录时清除历史记录,并消除拾取以前运行的命令的问题。您不必担心从以前的会话中拾取命令,因为如果您在中设置了空闲时间限制,系统会在指定的时间段后注销空闲用户/etc/profile
。编辑/etc/profile
文件并添加以下条目。
TMOUT=300
TMOUT 变量使用一定数量的空闲时间。在本例中,300 秒是五分钟。您可以将此值设置为任意秒数。此值将在所有用户的下一次登录时生效。要设置单独的超时值,请使用 .bashrc
但请注意,用户可以随意更改此文件。
[立即下载:系统管理员的 Bash 脚本指南。]
包起来
Bash 历史记录是一个方便的工具,但如果您不熟悉它的选项和特性,它可能会令人沮丧。历史记录中还有更多可用选项。查看手册页以获取更多信息。请记住,您输入的每个命令都是历史记录。