Linux Bash Shell 中“历史命令”的强大功能
我们在日常工作中经常使用history命令来检查命令的历史记录或获取有关用户执行的命令的信息。在这篇文章中,我们将了解如何有效地使用 history 命令来提取用户在 Bash shell 中执行的命令。这可能对审计目的有用,或者可以找出在什么日期和时间执行了什么命令。
默认情况下,执行history命令时不会看到日期和时间戳。但是,bash shell 提供了用于编辑用户命令历史记录的CLI工具。让我们看看history命令的一些实用技巧和强大功能。
1. 列出 Linux 中最后执行/所有执行的命令
从终端执行简单的历史命令将显示带有行号的最后执行的命令的完整列表。
[narad@example ~]$ history 1 PS1='\e[1;35m[\u@\h \w]$ \e[m ' 2 PS1="\e[0;32m[\u@\h \W]$ \e[m " 3 PS1="\u@\h:\w [\j]$ " 4 ping google.com 5 echo $PS1 6 tail -f /var/log/messages 7 tail -f /var/log/messages 8 exit 9 clear 10 history 11 clear 12 history
2. 列出所有带日期和时间戳的命令
如何查找命令的日期和时间戳?使用带有变量的“export”命令将显示执行命令时的历史命令和相应的时间戳。
[narad@example ~]$ export HISTTIMEFORMAT='%F %T ' 1 2013-06-09 10:40:12 cat /etc/issue 2 2013-06-09 10:40:12 clear 3 2013-06-09 10:40:12 find /etc -name *.conf 4 2013-06-09 10:40:12 clear 5 2013-06-09 10:40:12 history 6 2013-06-09 10:40:12 PS1='\e[1;35m[\u@\h \w]$ \e[m ' 7 2013-06-09 10:40:12 PS1="\e[0;32m[\u@\h \W]$ \e[m " 8 2013-06-09 10:40:12 PS1="\u@\h:\w [\j]$ " 9 2013-06-09 10:40:12 ping google.com 10 2013-06-09 10:40:12 echo $PS1
HISTTIMEFORMAT 变量的含义
%F Equivalent to %Y - %m - %d %T Replaced by the time ( %H : %M : %S )
3. 过滤历史记录中的命令
我们可以看到,上面的输出中重复了多次相同的命令。如何过滤历史记录中的简单或非破坏性命令?使用以下“ export ”命令,在HISTIGNORE='ls -l:pwd:date:'中指定命令,系统将不会保存该命令,也不会在历史命令中显示。
[narad@example ~]$ export HISTIGNORE='ls -l:pwd:date:'
4.忽略历史记录中的重复命令
以下命令将帮助我们忽略用户输入的重复命令。如果用户在 Bash Prompt 中多次执行相同的命令,则历史记录中只会显示单个条目。
[narad@example ~]$ export HISTCONTROL=ignoredups
5. 取消设置导出命令
动态取消设置导出命令。无论导出命令导出了哪些命令,都使用变量逐一执行取消设置导出命令。
[narad@example ~]$ unset export HISTCONTROL
6. 永久保存导出命令
在.bash_profile中进行如下输入以永久保存导出命令。
[narad@example ~]$ vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs export HISTCONTROL=ignoredups PATH=$PATH:$HOME/bin export PATH
7.列出特定用户执行的命令
如何查看特定用户执行的命令历史记录。Bash 将历史记录保存在'~/.bash_history'文件中。我们可以查看或打开文件来查看命令历史记录。
[narad@example ~]$ vi .bash_history cd /tmp/ cd logstalgia-1.0.3/ ./configure sudo passwd root apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc ./configure make apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc++ apt-get install libsdl1.2-dev libsdl-image1.2-dev libpcre3-dev libftgl-dev libpng12-dev libjpeg62-dev make gcc apt-get install make mysql -u root -p apt-get install grsync apt-get install unison unison
8. 禁用存储命令历史记录
有些组织由于安全策略的原因,不保留命令历史记录。在这种情况下,我们可以编辑用户的.bash_profile文件(隐藏文件)并进行如下输入。
[narad@example ~]$ vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin HISTSIZE=0 export PATH .bash_profile (END)
使用以下命令保存文件并加载更改。
[narad@example ~]$ source .bash_profile
注意:如果您不希望系统记住您输入的命令,只需执行以下命令即可禁用或停止记录历史记录。
[narad@example ~]$ export HISTSIZE=0
提示:搜索 ' HISTSIZE ' 并以超级用户身份编辑 ' /etc/profile '文件。文件中的更改将影响全局。
9.删除或清除命令历史记录
使用上下箭头,我们可以看到以前使用过的命令,这些命令可能对你有帮助,也可能让你生气。使用“ -c ”选项从 bash 历史列表中删除或清除所有条目。
[narad@example ~]$ history -c
10.使用 Grep 命令搜索历史记录中的命令
通过将历史文件导入到“ grep ”中,通过“ .bash_history ”搜索命令,如下所示。例如,以下命令将从历史列表中搜索并查找“ pwd ”命令。
[narad@example ~]$ history | grep pwd 113 2013-06-09 10:40:12 pwd 141 2013-06-09 10:40:12 pwd 198 2013-06-09 15:46:23 history | grep pwd 202 2013-06-09 15:47:39 history | grep pwd
11. 搜索最后执行的命令
使用“Ctrl+r”命令搜索之前执行的命令。找到所需命令后,按“ Enter ”执行该命令,否则按“ esc ”取消该命令。
(reverse-i-search)`source ': source .bash_profile
12. 调用上次执行的命令
调用之前使用的特定命令。Bang和8 ( !8 )命令的组合将调用您已执行的第8号命令。
[narad@example ~]$ !8
13. 调用最后执行的特定命令
回想一下以前使用的命令(netstat -np | grep 22),其中带有“ ! ”并且后跟该特定命令的一些字母。
[narad@example ~]$ !net netstat -np | grep 22 (No info could be read for "-p": geteuid()=501 but you should be root.) tcp 0 68 192.168.50.2:22 192.168.50.1:1857 ESTABLISHED - tcp 0 0 192.168.50.2:22 192.168.50.1:2516 ESTABLISHED - unix 2 [ ] DGRAM 12284 - @/org/freedesktop/hal/udev_event unix 3 [ ] STREAM CONNECTED 14522 - unix 2 [ ] DGRAM 13622 - unix 3 [ ] STREAM CONNECTED 12250 - @/var/run/hald/dbus-ujAjOMNa0g unix 3 [ ] STREAM CONNECTED 12249 - unix 3 [ ] STREAM CONNECTED 12228 - /var/run/dbus/system_bus_socket unix 3 [ ] STREAM CONNECTED 12227 -
我们已尽力强调历史命令的强大功能。然而,这还不是结束。请通过下面的评论框与我们分享您使用历史命令的经验。