当我们频繁使用Linux命令行时,有效利用历史记录可以大大提高工作效率。在正常的Linux运行中,很多命令都是重复的,你肯定不想输入很多重复的命令。如果你是系统管理员,可能需要审计用户操作,管理Linux命令历史是非常重要的。今天我们将介绍一些在Linux中使用history来减少重复命令的实用技巧。1基本原理Linux命令的历史记录会被持久化存储,默认位置是当前用户主目录下的.bash_history文件。当Linux系统启动一个shell时,shell会从.bash_history文件中读取历史记录,并存储到相应内存的缓冲区中。我们平时操作的Linux命令都会记录在缓冲区中。历史命令的管理,包括history命令,都在操作缓冲区,而不是直接操作.bash_history文件。当我们退出shell时,比如按下Ctrl+D,shell进程会将历史缓冲区的内容写回.bash_history文件。2使用详解把history的基本原理说清楚了,下面就来详细学习一下如何使用吧。(1)基本使用直接输入history命令,可以看到显示了所有最近操作的命令$history1bash2ls3vim.bash_history4cat.bash_history5history6bash有时候不需要显示所有历史命令,只显示最近10条历史记录,可以在命令后添加数字N即可。$history10一般情况下,只有当Shell正常退出时,缓冲区的内容才会被保存到文件中。如果你想主动保存缓冲区的历史,可以执行-w选项$history-w当然,如果你执行过一些敏感命令操作,可以执行-c直接删除缓冲区内容$history-c(2)重复命令如果你想重复一些命令,可以使用!快速执行重复的命令。比如要重复执行第1024条历史命令,可以执行如下命令$!10241024这个数字可以通过历史查看。重复之前的命令$!!重复倒数第6条历史命令,可以用负数表示,-6表示倒数第6条记录$!-6(3)搜索历史命令有时候,需要重复某个字符串开头的最后一条命令,你也可以使用!进行操作,然后回车执行。比如刚刚执行了一个很长的命令,只记录命令以curl开头,然后可以通过!curl快速执行命令$!curl效率很高,但是存在不安全因素,因为有可能执行的命令不是你想执行的,那就坏了。可以使用:p安全地执行。$!curl:pcurlwww.sina.com.cn添加:p后,只打印搜索到的命令。如果要执行它们,请按向上键并按回车键。如果只知道某条命令包含x信息,不以x开头,也可以用?执行包含字符串的命令(4)交互式搜索历史命令在Linux中,您还可以交互式地搜索历史命令,简单高效直接。在命令行输入Ctrl+R后,进入交互界面,输入要搜索的关键字。如果匹配到多个命令,可以多次按Ctrl+R切换到上一个匹配的命令。(reverse-i-search)`sina':echosina可以看到,我输入sina后,会自动匹配上次匹配sina的命令,然后回车执行命令。(5)重复执行上一条命令这里有几种重复上一条命令的方法,你可以选择一个你喜欢的!!!-1Ctrl+pUpCtrl+R(6)显示时间戳有时需要审计Linux系统,在历史记录和显示中添加时间戳是非常有用的。$exportHISTTIMEFORMAT='%F%T'$history3462021-04-1815:21:33curlbaidu.com472021-04-1815:21:35pwd482021-04-1815:21:39history3可以看到history已经显示了时间戳。其实对于审计需求这些还不够,更详细的信息可以补充:$exportHISTTIMEFORMAT="%F%T`who-uami2>/dev/null|awk'{print$NF}'|sed\-e's/[()]//g'``whoami`"62021-04-1816:07:48113.200.44.237rootls72021-04-1816:07:59113.200.44.237rootpwd82021-04-1816:08:14113.200.44.237roothistory(seven)控制历史记录总数Linux系统默认最多存储1000条历史记录,可以通过HISTSIZE环境变量查看$echo$HISTSIZE1000对于需要审计的场景,1000条历史记录可能太少了,我们可以修改$exportHISTSIZE=10000请注意,HISTSIZE变量只能控制缓冲区中历史记录的数量。如果需要控制.bash_history文件中存储的最大记录数,可以通过HISTFILESIZE来控制。以上命令行修改仅在当前Shell环境下生效。如果需要永久生效,需要写入配置文件$echo"exportHISTSIZE=10000">>~/.bash_profile$echo"exportHISTFILESIZE=200000">>~/.bash_profile$source~/.bash_profile(8)更改历史文件名有时,为了便于管理和备份,需要更改历史文件的路径和名称。简单,也可以通过环境变量HISTFILE更改其文件名$echo"exportHISTFILE=/data/backup/chopin.bash_history">>~/.bash_profile$souce~/.bash_profile(9)在特殊环境下禁用history,weneedtodisablehistory$echo"exportHISTSIZE=0">>~/.bash_profile$echo"exportHISTFILESIZE=0">>~/.bash_profile$source~/.bash_profile哈哈,直接把上面两个变量的值设为0,实现禁用历史记录的功能(10)黑客必知的一个小技巧最后分享一个黑客必知的鲜为人知的技巧。在命令前多加一个空格,这样的命令就不会被记录到历史中,爽不爽?如果此技巧在您的系统中不起作用,请检查环境变量HISTCONTROL是否包含ignorespace。好像centos系统默认没有设置这个值。3总结时间在Linux系统中,history命令可以很方便的帮我们管理历史命令。通常,我们的命令会先记录在缓存区,等Shell退出时才会记录在文件中。history命令提供了非常方便的管理功能。合理的配置和管理历史可以让你的Linux系统更加健壮和安全。好了,老规矩,有心人肖兄给大家总结一下history命令的常用方法historyn:只显示最近的n条历史记录history-c:清空缓冲区history中的历史记录history-w:清空缓冲区中的历史记录缓冲区保存到文件history-dN:删除第N条历史记录重复执行命令的几种方式:!!,!-1,!N,!string等交互式历史命令搜索,请使用Ctrl+R快捷键为了正确使用几个相关的环境变量让你的Linux系统更安全:HISTSIZE:控制最大缓冲区历史记录数HISTFILESIZE:控制最大历史文件数HISTIGNORE:设置哪些命令不记录在历史记录中HISTTIMEFORMAT:设置时间历史命令显示的格式HISTCONTROL:扩展控制选项如果在生产环境中,需要将这些环境变量持久化到配置文件~/.bash_profileexportHISTCONTROL=ignoreboth#ignorespace:忽略以空格开头的命令#ignoredups:忽略连续重复的命令#ignoreboth:表示上面两个参数都设置了#se??ttings是追加而不是覆盖
