History
history命令可以用来显示曾执行过的命令。执行过的命令默认存储在HOME目录中的.bash_history文件中,可以通过查看该文件来获取执行命令的历史记录。需要注意的是.bash_history不包含当前会话所执行的命令,执行过的命令在关机时才会写入文件,除非执行命令history -w。
常用参数:
1.n 显示n个最近的记录
History 3
2.-w <文件> 覆盖原有文件或者将记录写入一个新文件
用法示例:
将所有执行过的命令写入history.txt文件中
$ history -w history.txt 或者
$ history -w & cp ~/.bash_history history.txt
3.-c 参数:将目前的shell中的所有 history 内容全部消除,下图是执行效果,执行history -c命令后,之前的所有的记录都清除啦。
4.在每个用户目录都有一个.bash_history文件,里面记录了该用户的所有命令操作,无论这个用户是直接登录的还是通过xshell ssh方式过来的。
那么,首先必然有一个root用户,所有在/root/.bash_history里面记录了root用户的命令操作,你可以用cat、vim等工具来查看。
另外,假设你还有一个用户叫做XXX,那么在/home/XXX/.bash_history里面就记录了XXX用户的命令操作。
Linux下History命令主要用于显示历史指令记录内容, 下达历史纪录中的指令 。
>History命令语法:
[www.linuxidc.com@linux]# history [n]
[www.linuxidc.com@linux]# history [-c]
[www.linuxidc.com@linux]# history [-raw] histfiles
参数:
n :数字,要列出最近的 n 笔命令列表
-c :将目前的shell中的所有 history 内容全部消除
-a :将目前新增的history 指令新增入 histfiles 中,若没有加 histfiles,则预设写入 ~/.bash_history
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中
-w :将目前的 history 记忆内容写入 histfiles。Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中。默认保存1000条,你也可以更改这个值。如果你键入 history, history会向你显示你所使用的前1000个历史命令,并且给它们编了号,你会看到一个用数字编号的列表快速从屏幕上卷过。你可能不需要查看1000个命令中的所有项目, 当然你也可以加入数字来列出最近的 n 笔命令列表。linux中history命令不仅仅让我们可以查询历史命令而已. 我们还可以利用相关的功能来帮我们执行命令。运行特定的历史命令history会列出bash保存的所有历史命令,并且给它们编了号,我们可以使用“叹号接编号”的方式运行特定的历史命令.
语法说明:
[www.linuxidc.com@linux]# [!number] [!command] [!!]
参数说明:
number :第几个指令的意思;
command :指令的开头几个字母
! :上一个指令的意思!
History命令实战
1.出所有的历史记录:
[www.linuxidc.com@linux] # history
2.只列出最近10条记录:
[www.linuxidc.com@linux] # history 10 (注,history和10中间有空格)
3.使用命令记录号码执行命令,执行历史清单中的第99条命令
[www.linuxidc.com@linux] #!99 (!和99中间没有空格)
4.重复执行上一个命令
[www.linuxidc.com@linux] #!!
5.执行最后一次以rpm开头的命令(!代表的是字符串,这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。)
[www.linuxidc.com@linux] #!rpm
6.逐屏列出所有的历史记录:
[www.linuxidc.com@linux]# history | more
7.立即清空history当前所有历史命令的记录
[www.linuxidc.com@linux] #history -c
除了使用history命令,在 shell 或 GUI 终端提示下,你也可以使用上下方向键来翻阅命令历史(向下箭头会向前翻阅),直到你找到所需命令为止。这可以让我们很方便地编辑前面的某一条命令,而不用重复输入类似的命令。History命令的用途确实很大!但需要小心安全的问题!尤其是 root 的历史纪录档案,这是黑客们的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话,后果不堪设想!
5.与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: 删除重复命令
让上述环境变量生效方式:
1、直接在当前shell内输入相关变量,比如我们不想留存命令历史,我们把HISTSIZE设置为0
[root@localhost ~]# HISTSIZE=0
[root@localhost ~]# history
经测试,成功。不过这种设置的局限性是其作用范围仅仅针对当前shell及其子shell,如果切换用户或登出再登入其设置失效。不过其特点是设置完立刻生效。
下面通过实验说明这个问题
[root@localhost ~]# bash
[root@localhost ~]# history
[root@localhost ~]# history
以上结果说明在当前shell内设置history的环境变量后,其作用范围为当前shell及子shell
Last login: Fri Jul 29 17:26:41 2016 from 10.1.250.62
[root@localhost ~]# history
1 history
重新登陆后原有的history环境变量失效
2、另一种让history环境变量生效的方式是修改~/.bash_profile文件
[root@localhost ~]# 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
HISTTIMEFORMAT="%F %T " 此为新添加的history环境变量,我添加了发生命令操作的时间
export PATH
wq保存退出。
[root@localhost ~]# history
1 history
2 ll
3 cd
4 hostory
5 history
6 vi ~/.bash_profile
7 history
由结果可知变量并没有生效,我们重新登录再尝试下。
6.通过上面的两个结果,我们可以发现第二种修改配置文件虽然也可以成功修改history环境变量但是其生效需要重新登陆,并不是改完就生效。但是它的特点是此修改始终有效,时效性为永久。
history命令的使用
-c: 清空命令历史
-d n: 删除历史中指定的命令,n表示命令号
#: 显示最近的#条历史
-a: 追加本次会话新执行的命令历史列表至历史文件,因为多终端所以如果想看当前都发生了什么操作就可以执行-a进行查看
-n: 读历史文件(本地数据)中未读过的行到历史列表(内存数据)
-r: 读历史文件(本地数据)附加到历史列表(内存数据)
-w: 保存历史列表(内存数据)到指定的历史文件(本地数据)
-s: 展开历史参数成一行,附加在历史列表后。用于伪造命令历史
下面来演示上面几种命令的使用
[root@localhost ~]# history
清空历史
[root@localhost ~]# history -c
[root@localhost ~]# history
2016-07-29 20:29:26 history
从历史文件读取之前的命令历史
[root@localhost ~]# history -r
[root@localhost ~]# history
删除指定命令历史
[root@localhost ~]# history -d 4
[root@localhost ~]# history
伪造历史命令
[root@localhost ~]# history -s rm -rf /* 做下恶作剧
[root@localhost ~]# history
我相信任谁输入history看到这个命令都会吓一身汗。
调用历史参数详解
#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 开头的命令,并获取它的所有参数
下面通过实验来实践上面的历史参数的具体用法
[root@localhost ~]# history
我们先使用!!来调用上一条命令
[root@localhost ~]# !!
history
[root@localhost ~]# !h
history
常用的快捷键
重新调用前一个命令中最后一个参数:
!$
Esc, .(点击Esc键后松开,然后点击. 键)
这两个很常用,特别是Esc,.