[技术文章]Linux命令 第17节 history 显示shell命令历史
Posted zicreate
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[技术文章]Linux命令 第17节 history 显示shell命令历史相关的知识,希望对你有一定的参考价值。
1.命令功能
history 命令用于显示shell命令历史,历史命令保存在内存中的,当退出或者登录shell时,会自动保存或读取文件"~/.bash_history"。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。
当同一账号,同时登录多个bash时,只有最后一个退出的会写入bash_history,其他的都被覆盖了。
2.命令格式
history (参数)
[!number] [!command] [!!]
3.命令参数
-c:清空命令历史-d n:删除历史中指定的命令,n表示命令号number:显示最近的number条历史,如 history 10 -a:追加本次会话新执行的命令历史列表至历史文件,因为多终端所以如果想看当前都发生了什么操作就可以执行-a进行查看-n:读历史文件(本地数据)中未读过的行到历史列表(内存数据)-r:读历史文件(本地数据)附加到历史列表(内存数据)-w:保存历史列表(内存数据)到指定的历史文件(本地数据)-s:展开历史参数成一行,附加在历史列表后。用于伪造命令历史
number :第几个指令,如 `$ !2` ,执行 history 中,命令序号为 2 的命令。 command :指令的开头几个字母 ! :上一个指令
4.使用场景
场景1:显示历史命令
使用history命令显示最近使用的9条历史命令:
$ history 9 991 rsync -avzi --out-format='%i %n%L' workspace/ root@10.39.85.24:/tmp/testdir 992 ls -l zicreate.txt 993 cd .. 994 ls 995 python 996 cd /tmp/ 997 exit 998 vim ~/.bash_history 999 history 9
场景2:执行历史命令
执行第998 个历史指令:
$ !998
执行上一个指令:
$ !!
快速重复执行上一条命令,有 4 种方法可以重复执行上一条命令:
使用上方向键,并回车执行。
按 !! 并回车执行。
输入 !-1 并回车执行。
按 Ctrl+P 并回车执行。
执行最近一次以 vim 为开头的指令:
$ !vim
场景3:清空历史命令
为了不留执行命令的痕迹,可以history –c
即可清理历史命令:
$ history -c
这种手法在我们做某些秘密操作时还是太明显,更隐秘的方法是这样的,一般人我不告诉他:
直接在当前 shell 内把HISTSIZE设置为0,这种方法只在本shell有效,并且这样的话按键上翻下翻也无效了。
$ HISTSIZE=0 $ history
不过这种设置的局限性是其作用范围仅仅针对当前shell及其子shell,如果切换用户或登出再登入其设置失效。不过其特点是设置完立刻生效。
除了使用history命令,也可以使用上下方向键来翻阅命令历史(向下箭头会向前翻阅),直到你找到所需命令为止。
但需要小心安全的问题,尤其是 root 的历史纪录档案,这是黑客们的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话,后果不堪设想!
场景4:其他操作
(1)删除指定历史记录
$ history -d 987
(2)造历史命令
$ history -s :(){ :|:& };:
上面的 fork 炸弹“:(){ :|:& };:” 千万不要尝试,千万不要尝试,千万不要尝试。
(3)命令替换
例如,!!:$ 将为当前的命令获得上一条命令的参数:
$ ls zicreate.txtzicreate.txt$ vim !!:$ vim zicreate.txt
补充:使用 !$
可以达到同样的效果,而且更简单。
!#
上一个命令名
!^
上一个命令的第一个参数
!$
上一个命令的最后一个参数
!:n
上一个命令的第n个参数
搜索,!cp:2
从命令历史中搜索以 cp 开头的命令,并获取它的第二项参数:
$ cp zicreate.txt /tmp/zicreate.txt$ ls -l !cp:2ls -l /tmp/zicreate.txt
也可以 !cp:$
获取 cp 命令的最后一项参数:
$ ls -l !cp:$ls -l /tmp/zicreate.txt
场景5:用 Ctrl + R 搜索历史命令
有时候一连串的操作,我们已经输入了太多的命令,而一条很长的历史命令通过上翻找到这条历史记录太慢的话,可以使用这个快捷操作。方法是:按下 Ctrl +R 或者 Ctrl + Shift + r 然后输入关键字。
例如我搜索 git ,显示如下:
[注:在命令行提示符下按下Ctrl+R,终端将显示如下提示(reverse-i-search),此时可以输入要搜索的关键字]
(reverse-i-search)`git': git push
如果还想继续向上查询,继续按 Ctrl+r 。当看到你要的命令后按回车键,就可以重新执行这条命令了,如果你需要在执行一条历史命令之前编辑它。看到你想要的命令后按下左键或者右键,就可以在执行这条命令之前编辑它了。
扩展
调用历史参数详解
#cmd !^ : 利用上一个命令的第一个参数做cmd的参数 #cmd !$ : 利用上一个命令的最后一个参数做cmd的参数 #cmd !* : 利用上一个命令的全部参数做cmd的参数 #cmd !:n : 利用上一个命令的第n个参数做cmd的参数 #!n :调用第n条命令 #!-n:调用倒数第n条命令 #!!:执行上一条命令 #!$:引用前一个命令的最后一个参数同组合键Esc,. #!n:^ 调用第n条命令的第一个参数 #!n:$ 调用第n条命令的最后一个参数 #!m:n 调用第m条命令的第n个参数 #!n:* 调用第n条命令的所有参数 #!string:执行命令历史中最近一个以指定string开头的命令 #!string:^ 从命令历史中搜索以string 开头的命令,并获取它的第一个参数 #!string:$ 从命令历史中搜索以string 开头的命令,并获取它的最后一个参数 #!string:n 从命令历史中搜索以string 开头的命令,并获取它的第n个参数 #!string:* 从命令历史中搜索以string 开头的命令,并获取它的所有参数
与history相关的环境变量
HISTFILE 指定存放历史文件位置,默认位置在~/.bash_profile(针对用户)、 /etc/profile(针对全局,如果 ~/.bash_profile内没有相关环境变量内容则使用全局变量设置) HISTFILESIZE 命令历史文件记录历史的条数 HISTSIZE 命令历史记录的条数,默认为1000 HISTTIMEFORMAT="%F %T" 显示命令发生的时间 HISTIGNORE="str1:str2:..." 忽略string1,string2历史 HISTCONTROL 包含一下4项,让哪一项生效只需要让其=下面一项即可 ignoredups: 忽略重复的命令;连续且相同方为“重复” ignorespace: 忽略所有以空白开头的命令 ignoreboth:ignoredups,ignorespace erasedups: 删除重复命令
以上是关于[技术文章]Linux命令 第17节 history 显示shell命令历史的主要内容,如果未能解决你的问题,请参考以下文章