當我們頻繁使用 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
的基本原理,我們來具體學習一下如何使用它。
(一)基礎用法
直接輸入 history 命令,可以看到最近操作的所有命令都顯示出來了
$ history
1 bash
2 ls
3 vim .bash_history
4 cat .bash_history
5 history
6 bash
有時候我不需要顯示所有的歷史命令,只顯示最後的 10 條歷史記錄,可以在命令後加數字 N
即可
$ history 10
正常情況下,只有在 Shell 正常退出時,才會將緩衝區內容儲存到檔案。如果你想主動儲存緩衝區的歷史記錄,執行 -w
選項即可
$ history -w
當然,如果你執行了一些敏感的命令操作,可以執行 -c
將緩衝區內容直接刪除
$ history -c
(二)重複執行命令
如果要重複執行一些命令,可以使用 !
來快速執行重複的命令。
舉個例子,重複執行第 1024 歷史命令,可以執行如下命令
$ !1024
1024
這個編號可以通過 history
檢視哦
重複執行上一條命令
$ !!
重複執行倒數第 6 條歷史命令,可以通過負數表示,-6
表示倒數第 6 條記錄
$ !-6
(三)搜尋歷史命令
有時候,需要重複執行某字串開頭的最後一個命令,同樣可以通過 !
來操作,然後按 Enter 執行即可
比如,剛才執行了一個很長命令,只記錄命令開頭是 curl
,這時就可以通過 !curl
快速執行該命令
$ !curl
這個用法很高效,但存在不安全因素,因為有可能執行的命令不是你想要執行的,那就壞事了。可以通過 :p
來安全地執行。
$ !curl:p
curl www.sina.com.cn
加上 :p
後,只是列印出了搜尋到的命令,如果要執行,請按 Up
鍵,然後回車即可。
如果你只知道某條命令包含了 x
資訊,不是以 x
開頭,同樣可以通過 ?
來執行包含字串的命令
$ !?sina
(四)互動式搜尋歷史命令
在 Linux 搜尋歷史命令,還可以通過互動式的搜尋方式,簡直高效直接。在命令列輸入 Ctrl+R
後,進入互動介面,鍵入需要搜尋的關鍵字,如果匹配到多條命令,可以多次鍵入 Ctrl+R
來切換上一條匹配的命令。
(reverse-i-search)`sina': echo sina
可以看到,我輸入了 sina 後,就自動匹配到最近一次和 sina 匹配的命令,這時按下回車就可以執行該命令。
(五)重複執行上條命令
在這裡總結下多種重複執行上條命令的方式,你可以選擇一種自己喜歡的就可以啦
!!
!-1
Ctrl+p
Up
Ctrl+R
(六)顯示時間戳
有時候需要對 Linux 系統做審計,那為歷史記錄新增時間戳,顯示非常有用。
$ export HISTTIMEFORMAT='%F %T '
$ history 3
46 2021-04-18 15:21:33 curl baidu.com
47 2021-04-18 15:21:35 pwd
48 2021-04-18 15:21:39 history 3
可以看到,歷史記錄已經顯示了時間戳。其實這些對於審計需求,還不夠,可以加上更詳細的資訊:
$ export HISTTIMEFORMAT="%F %T `who -u am i 2>/dev/null| awk '{print $NF}'|sed \-e 's/[()]//g'` `whoami` "
6 2021-04-18 16:07:48 113.200.44.237 root ls
7 2021-04-18 16:07:59 113.200.44.237 root pwd
8 2021-04-18 16:08:14 113.200.44.237 root history
(七)控制歷史記錄總數
預設情況下,Linux 系統最多儲存 1000 條歷史記錄,可以通過 HISTSIZE
環境變數檢視
$ echo $HISTSIZE
1000
對於需要做審計的場景,1000 條歷史記錄可能會太少了,我們可以修改為合適的值
$ export HISTSIZE=10000
注意,HISTSIZE
變數只能控制緩衝區中的歷史記錄數量,如果需要控制 .bash_history
檔案儲存的最大記錄數,可以通過 HISTFILESIZE
進行控制
上述命令列修改只在當前 Shell 環境生效,如果需要永久生效,需要寫入配置檔案
$ echo "export HISTSIZE=10000" >> ~/.bash_profile
$ echo "export HISTFILESIZE=200000" >> ~/.bash_profile
$ source ~/.bash_profile
(八)更改歷史記錄檔名
有時,為了方便管理和備份,需要更改歷史記錄檔案的路徑和名稱。簡單,同樣可以通過環境變數 HISTFILE
更改它的檔名稱
$ echo "export HISTFILE=/data/backup/chopin.bash_history" >> ~/.bash_profile
$ souce ~/.bash_profile
(九)禁用歷史記錄
處於某種特殊環境,我們需要禁用歷史記錄
$ echo "export HISTSIZE=0" >> ~/.bash_profile
$ echo "export HISTFILESIZE=0" >> ~/.bash_profile
$ source ~/.bash_profile
哈哈,直接把上述兩個變數的值設定為 0
,就實現了禁用歷史記錄的功能
(十)黑客必知的一個小技巧
最後分享一個不為人知的,黑客必知的小技巧。
在命令前額外多加一個空格,這樣的命令是不會被記錄到歷史記錄的,感覺是不是很酷
這個技巧如果在你的系統不管用,請檢視下環境變數 HISTCONTROL
是否包含 ignorespace
,貌似 centos 系統預設沒有設定這個值。
3 總結時間
在 Linux 系統,history
命令可以非常方便,幫助我們管理歷史命令,平時我們命令都會先記錄在快取區,在 Shell 退出時才會記錄到檔案中。
history 命令提供了很方便的管理功能,合理去配置和管理歷史記錄,可以讓你的 Linux 系統更加健壯和安全。
好了,老規矩,貼心的肖哥還是來總結一下 history
命令常用方法
history n
:只顯示最近的 n 條歷史記錄history -c
:清除快取區中的歷史記錄history -w
:將快取區的歷史記錄儲存到檔案history -d N
:刪除第 N 條歷史記錄
幾種重複執行命令的方法:!!
、!-1
、!N
、!string
等
互動式歷史命令搜尋,請使用 Ctrl+R
快捷鍵
合適使用幾個相關的環境變數,讓你的 Linux 系統更安全:
HISTSIZE
:控制緩衝區歷史記錄的最大個數HISTFILESIZE
:控制歷史記錄檔案中的最大個數HISTIGNORE
:設定哪些命令不記錄到歷史記錄HISTTIMEFORMAT
:設定歷史命令顯示的時間格式HISTCONTROL
:擴充套件的控制選項
如果在生產環境,這些環境變數需要持久化到配置檔案 ~/.bash_profile
export HISTCONTROL=ignoreboth
# ignorespace: 忽略空格開頭的命令
# ignoredups: 忽略連續重複命令
# ignoreboth: 表示上述兩個引數都設定
# 設定追加而不是覆蓋
shopt -s histappend
export HISTSIZE=1000
export HISTFILESIZE=200000
export HISTTIMEFORMAT="%F %T "
export HISTIGNORE="ls:history"
推薦閱讀
寫給 Linux 初學者的一封信 全網最詳盡的負載均衡原理圖解 上古神器 sed 教程詳解,小白也能看的懂 Linux 三劍客之 grep 教程詳解 Linux 檔案搜尋神器 find 實戰詳解,建議收藏! Linux 網路分析必備技能:tcpdump 實戰詳解 Linux 三劍客之 awk 實戰詳解教程 80% 的人都不會的 15 個 Linux 實用技巧 誰動了我的Linux?原來history這麼強大! 在Linux上使用time優雅的統計程式執行時間
歡迎各位老鐵關注