2021-05-12 14:32:11
Linux基礎知識之history的詳細說明
背景:history是Linux中常會用到內容,在工作中一些使用者會突然發現其安裝不了某個軟體,於是尋求運維人員的幫助,而不給你說明他到底做了哪些坑爹的操作。此時你第一件要做的就是要檢視其history命令歷史。檢視後興許你就會發現他到底幹了什麼坑爹的操作。
history可以讓你在一定情況下快速定位問題所在。
本文的history介紹及其實踐都是來自CentOS7.2環境
[root@localhost ~]# cat /etc/RedHat-release
CentOS Linux release 7.2.1511 (Core)
history的介紹
history是shell的內建命令,其內容在系統預設的shell的man手冊中。
history是顯示在終端輸入並執行的過命令,系統預設保留1000條。
[root@localhost ~]# history
1 ls
2 vi /etc/sysconfig/network-scripts/ifcfg-eno16777728
3 service network restart
4 ifconfig
5 ping www.linuxidc.com
6 systemctl disable firewalld.service
7 systemctl stop firewalld.service
8 exit
9 ls
10 type which
11 which ls
12 file /usr/bin/ls
13 which clock
14 file /usr/sbin/clock
15 man which
16 man what
17 man who
18 who
19 man who
20 man w
21 man who
22 who -q
23 man w
...
..
.
系統在關閉後會將現有history內容儲存在檔案~/.bash_history
與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
由結果可知變數並沒有生效,我們重新登入再嘗試下。
[root@localhost ~]# history
1 2016-07-29 20:00:29 history
2 2016-07-29 20:00:29 ll
3 2016-07-29 20:00:29 cd
4 2016-07-29 20:00:29 hostory
5 2016-07-29 20:00:29 history
6 2016-07-29 20:00:29 vi ~/.bash_profile
7 2016-07-29 20:00:29 history
8 2016-07-29 20:00:29 logout
9 2016-07-29 20:00:33 history
通過上面的兩個結果,我們可以發現第二種修改組態檔雖然也可以成功修改history環境變數但是其生效需要重新登陸,並不是改完就生效。但是它的特點是此修改始終有效,時效性為永久。
history命令的使用
-c: 清空命令歷史
-d n: 刪除歷史中指定的命令,n表示命令號
#: 顯示最近的#條歷史
-a: 追加本次對談新執行的命令歷史列表至歷史檔案,因為多終端所以如果想看當前都發生了什麼操作就可以執行-a進行檢視
-n: 讀歷史檔案(本地資料)中未讀過的行到歷史列表(記憶體資料)
-r: 讀歷史檔案(本地資料)附加到歷史列表(記憶體資料)
-w: 儲存歷史列表(記憶體資料)到指定的歷史檔案(本地資料)
-s: 展開歷史引數成一行,附加在歷史列表後。用於偽造命令歷史
下面來演示上面幾種命令的使用
[root@localhost ~]# history
1 2016-07-29 20:00:29 history
2 2016-07-29 20:00:29 ll
3 2016-07-29 20:00:29 cd
4 2016-07-29 20:00:29 hostory
5 2016-07-29 20:00:29 history
6 2016-07-29 20:00:29 vi ~/.bash_profile
7 2016-07-29 20:00:29 history
8 2016-07-29 20:00:29 logout
9 2016-07-29 20:00:33 history
10 2016-07-29 20:07:41 cd
11 2016-07-29 20:07:44 ls
12 2016-07-29 20:07:50 history
13 2016-07-29 20:08:12 cat /etc/profile
14 2016-07-29 20:12:10 HISTCONTROL=ignorespace
15 2016-07-29 20:27:28 history -p
16 2016-07-29 20:27:31 history
17 2016-07-29 20:28:10 ls /etc
18 2016-07-29 20:28:14 history
19 2016-07-29 20:28:57 history
清空歷史
[root@localhost ~]# history -c
[root@localhost ~]# history
2016-07-29 20:29:26 history
從歷史檔案讀取之前的命令歷史
[root@localhost ~]# history -r
[root@localhost ~]# history
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 ll
5 2016-07-29 20:30:59 cd
6 2016-07-29 20:30:59 hostory
7 2016-07-29 20:30:59 history
8 2016-07-29 20:30:59 vi ~/.bash_profile
9 2016-07-29 20:30:59 history
10 2016-07-29 20:30:59 logout
11 2016-07-29 20:31:01 history
刪除指定命令歷史
[root@localhost ~]# history -d 4
[root@localhost ~]# history
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 cd
5 2016-07-29 20:30:59 hostory
6 2016-07-29 20:30:59 history
7 2016-07-29 20:30:59 vi ~/.bash_profile
8 2016-07-29 20:30:59 history
9 2016-07-29 20:30:59 logout
10 2016-07-29 20:31:01 history
11 2016-07-29 20:32:50 history -d 4
12 2016-07-29 20:32:52 history
偽造歷史命令
12345678910111213141516 [root@localhost ~]# history -s rm -rf /* 做下惡作劇
[root@localhost ~]# history
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 cd
5 2016-07-29 20:30:59 hostory
6 2016-07-29 20:30:59 history
7 2016-07-29 20:30:59 vi ~/.bash_profile
8 2016-07-29 20:30:59 history
9 2016-07-29 20:30:59 logout
10 2016-07-29 20:31:01 history
11 2016-07-29 20:32:50 history -d 4
12 2016-07-29 20:32:52 history
13 2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
14 2016-07-29 20:34:00 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
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 cd
5 2016-07-29 20:30:59 hostory
6 2016-07-29 20:30:59 history
7 2016-07-29 20:30:59 vi ~/.bash_profile
8 2016-07-29 20:30:59 history
9 2016-07-29 20:30:59 logout
10 2016-07-29 20:31:01 history
11 2016-07-29 20:32:50 history -d 4
12 2016-07-29 20:32:52 history
13 2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
14 2016-07-29 20:34:00 history
15 2016-07-29 20:40:32 ls
16 2016-07-29 20:40:33 cd
17 2016-07-29 20:40:45 ls /etc/passwd
18 2016-07-29 20:41:35 history
我們先使用!!來呼叫上一條命令
[root@localhost ~]# !!
history
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 cd
5 2016-07-29 20:30:59 hostory
6 2016-07-29 20:30:59 history
7 2016-07-29 20:30:59 vi ~/.bash_profile
8 2016-07-29 20:30:59 history
9 2016-07-29 20:30:59 logout
10 2016-07-29 20:31:01 history
11 2016-07-29 20:32:50 history -d 4
12 2016-07-29 20:32:52 history
13 2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
14 2016-07-29 20:34:00 history
15 2016-07-29 20:40:32 ls
16 2016-07-29 20:40:33 cd
17 2016-07-29 20:40:45 ls /etc/passwd
18 2016-07-29 20:41:35 history
[root@localhost ~]# !h
history
1 2016-07-29 20:29:26 history
2 2016-07-29 20:30:59 history -r
3 2016-07-29 20:30:59 history
4 2016-07-29 20:30:59 cd
5 2016-07-29 20:30:59 hostory
6 2016-07-29 20:30:59 history
7 2016-07-29 20:30:59 vi ~/.bash_profile
8 2016-07-29 20:30:59 history
9 2016-07-29 20:30:59 logout
10 2016-07-29 20:31:01 history
11 2016-07-29 20:32:50 history -d 4
12 2016-07-29 20:32:52 history
13 2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
14 2016-07-29 20:34:00 history
15 2016-07-29 20:40:32 ls
16 2016-07-29 20:40:33 cd
17 2016-07-29 20:40:45 ls /etc/passwd
18 2016-07-29 20:41:35 history
19 2016-07-29 20:47:03 history
20 2016-07-29 20:48:22 history
大家感興趣可以一個個實驗。本文就介紹到這裡。
常用的快捷鍵
重新呼叫前一個命令中最後一個引數:
!$
Esc, .(點選Esc鍵後鬆開,然後點選. 鍵)
這兩個很常用,特別是Esc,.
我們在建立檔案後,通常會對其進行修改或其他的讀操作,這時候鍵入命令後利用上述快捷鍵即可快速補全所需命令。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-07/133769.htm
相關文章