當咱們頻繁使用 Linux 命令行時,有效地使用歷史記錄,能夠大大提升工做效率。編程
在平時 Linux 操做過程當中,不少命令是重複的,你必定不但願大量輸入重複的命令。若是你是系統管理員,你可能須要對用戶操做進行審計,管理好 Linux 命令歷史記錄顯得很是重要。vim
今天咱們來介紹一下,在 Linux 使用 history 來減小重複命令的幾個實用技巧。centos
Linux 命令的歷史記錄,會持久化存儲,默認位置是當前用戶家目錄的 .bash_history
文件。緩存
當 Linux 系統啓動一個 Shell 時,Shell 會從 .bash_history
文件中,讀取歷史記錄,存儲在相應內存的緩衝區中。安全
咱們平時所操做的 Linux 命令,都會記錄在_緩衝區_中。包括 history
命令所執行的歷史命令管理,都是在操做_緩衝區_,而不是直接操做 .bash\_history 文件。bash
當咱們退出 Shell,好比按下 Ctrl+D
時,Shell 進程會把歷史記錄緩衝區的內容,寫回到 .bash\_history 文件中去。app
清楚了 history
的基本原理,咱們來具體學習一下如何使用它。curl
(一)基礎用法學習
直接輸入 history 命令,能夠看到最近操做的全部命令都顯示出來了url
`$ 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 系統默認沒有設置這個值。
在 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"`
源於:公衆號-編程修養