誰動了個人Linux?原來history這麼強大!

當咱們頻繁使用 Linux 命令行時,有效地使用歷史記錄,能夠大大提升工做效率。編程

在平時 Linux 操做過程當中,不少命令是重複的,你必定不但願大量輸入重複的命令。若是你是系統管理員,你可能須要對用戶操做進行審計,管理好 Linux 命令歷史記錄顯得很是重要。vim

今天咱們來介紹一下,在 Linux 使用 history 來減小重複命令的幾個實用技巧。centos

1 基本原理

圖片

Linux 命令的歷史記錄,會持久化存儲,默認位置是當前用戶家目錄的 .bash_history 文件。緩存

當 Linux 系統啓動一個 Shell 時,Shell 會從 .bash_history 文件中,讀取歷史記錄,存儲在相應內存的緩衝區中。安全

咱們平時所操做的 Linux 命令,都會記錄在_緩衝區_中。包括 history 命令所執行的歷史命令管理,都是在操做_緩衝區_,而不是直接操做 .bash\_history 文件。bash

當咱們退出 Shell,好比按下 Ctrl+D 時,Shell 進程會把歷史記錄緩衝區的內容,寫回到 .bash\_history 文件中去。app

2 使用詳解

清楚了 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 系統默認沒有設置這個值。

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"`

源於:公衆號-編程修養

相關文章
相關標籤/搜索