誰動了我的Linux?原來History這么強大!
當(dāng)我們頻繁使用 Linux 命令行時,有效地使用歷史記錄,可以大大提高工作效率。
在平時 Linux 操作過程中,很多命令是重復(fù)的,你一定不希望大量輸入重復(fù)的命令。如果你是系統(tǒng)管理員,你可能需要對用戶操作進行審計,管理好 Linux 命令歷史記錄顯得非常重要。
今天我們來介紹一下,在 Linux 使用 history 來減少重復(fù)命令的幾個實用技巧。
1 基本原理
Linux 命令的歷史記錄,會持久化存儲,默認位置是當(dāng)前用戶家目錄的 .bash_history 文件。
當(dāng) Linux 系統(tǒng)啟動一個 Shell 時,Shell 會從 .bash_history 文件中,讀取歷史記錄,存儲在相應(yīng)內(nèi)存的緩沖區(qū)中。
我們平時所操作的 Linux 命令,都會記錄在緩沖區(qū)中。包括 history 命令所執(zhí)行的歷史命令管理,都是在操作緩沖區(qū),而不是直接操作 .bash_history 文件。
當(dāng)我們退出 Shell,比如按下 Ctrl+D 時,Shell 進程會把歷史記錄緩沖區(qū)的內(nèi)容,寫回到 .bash_history 文件中去。
2 使用詳解
清楚了 history 的基本原理,我們來具體學(xué)習(xí)一下如何使用它。
(一)基礎(chǔ)用法
直接輸入 history 命令,可以看到最近操作的所有命令都顯示出來了
- $ history
- 1 bash
- 2 ls
- 3 vim .bash_history
- 4 cat .bash_history
- 5 history
- 6 bash
有時候我不需要顯示所有的歷史命令,只顯示最后的 10 條歷史記錄,可以在命令后加數(shù)字 N 即可
- $ history 10
正常情況下,只有在 Shell 正常退出時,才會將緩沖區(qū)內(nèi)容保存到文件。如果你想主動保存緩沖區(qū)的歷史記錄,執(zhí)行 -w 選項即可
- $ history -w
當(dāng)然,如果你執(zhí)行了一些敏感的命令操作,可以執(zhí)行 -c 將緩沖區(qū)內(nèi)容直接刪除
- $ history -c
(二)重復(fù)執(zhí)行命令
如果要重復(fù)執(zhí)行一些命令,可以使用 ! 來快速執(zhí)行重復(fù)的命令。
舉個例子,重復(fù)執(zhí)行第 1024 歷史命令,可以執(zhí)行如下命令
- $ !1024
1024 這個編號可以通過 history 查看哦
重復(fù)執(zhí)行上一條命令
- $ !!
重復(fù)執(zhí)行倒數(shù)第 6 條歷史命令,可以通過負數(shù)表示,-6 表示倒數(shù)第 6 條記錄
- $ !-6
(三)搜索歷史命令
有時候,需要重復(fù)執(zhí)行某字符串開頭的最后一個命令,同樣可以通過 ! 來操作,然后按 Enter 執(zhí)行即可
比如,剛才執(zhí)行了一個很長命令,只記錄命令開頭是 curl,這時就可以通過 !curl 快速執(zhí)行該命令
- $ !curl
這個用法很高效,但存在不安全因素,因為有可能執(zhí)行的命令不是你想要執(zhí)行的,那就壞事了??梢酝ㄟ^ :p 來安全地執(zhí)行。
- $ !curl:p
- curl www.sina.com.cn
加上 :p 后,只是打印出了搜索到的命令,如果要執(zhí)行,請按 Up 鍵,然后回車即可。
如果你只知道某條命令包含了 x 信息,不是以 x 開頭,同樣可以通過 ? 來執(zhí)行包含字符串的命令
- $ !?sina
(四)交互式搜索歷史命令
在 Linux 搜索歷史命令,還可以通過交互式的搜索方式,簡直高效直接。在命令行輸入 Ctrl+R 后,進入交互界面,鍵入需要搜索的關(guān)鍵字,如果匹配到多條命令,可以多次鍵入 Ctrl+R 來切換上一條匹配的命令。
- (reverse-i-search)`sina': echo sina
可以看到,我輸入了 sina 后,就自動匹配到最近一次和 sina 匹配的命令,這時按下回車就可以執(zhí)行該命令。
(五)重復(fù)執(zhí)行上條命令
在這里總結(jié)下多種重復(fù)執(zhí)行上條命令的方式,你可以選擇一種自己喜歡的就可以啦
- !!
- !-1
- Ctrl+p
- Up
- Ctrl+R
(六)顯示時間戳
有時候需要對 Linux 系統(tǒng)做審計,那為歷史記錄添加時間戳,顯示非常有用。
- $ 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
可以看到,歷史記錄已經(jīng)顯示了時間戳。其實這些對于審計需求,還不夠,可以加上更詳細的信息:
- $ 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
(七)控制歷史記錄總數(shù)
默認情況下,Linux 系統(tǒng)最多存儲 1000 條歷史記錄,可以通過 HISTSIZE 環(huán)境變量查看
- $ echo $HISTSIZE
- 1000
對于需要做審計的場景,1000 條歷史記錄可能會太少了,我們可以修改為合適的值
- $ export HISTSIZE=10000
注意,HISTSIZE 變量只能控制緩沖區(qū)中的歷史記錄數(shù)量,如果需要控制 .bash_history 文件存儲的最大記錄數(shù),可以通過 HISTFILESIZE 進行控制
上述命令行修改只在當(dāng)前 Shell 環(huán)境生效,如果需要永久生效,需要寫入配置文件
- $ echo "export HISTSIZE=10000" >> ~/.bash_profile
- $ echo "export HISTFILESIZE=200000" >> ~/.bash_profile
- $ source ~/.bash_profile
(八)更改歷史記錄文件名
有時,為了方便管理和備份,需要更改歷史記錄文件的路徑和名稱。簡單,同樣可以通過環(huán)境變量 HISTFILE 更改它的文件名稱
- $ echo "export HISTFILE=/data/backup/chopin.bash_history" >> ~/.bash_profile
- $ souce ~/.bash_profile
(九)禁用歷史記錄
處于某種特殊環(huán)境,我們需要禁用歷史記錄
- $ echo "export HISTSIZE=0" >> ~/.bash_profile
- $ echo "export HISTFILESIZE=0" >> ~/.bash_profile
- $ source ~/.bash_profile
哈哈,直接把上述兩個變量的值設(shè)置為 0,就實現(xiàn)了禁用歷史記錄的功能
(十)黑客必知的一個小技巧
最后分享一個不為人知的,黑客必知的小技巧。
在命令前額外多加一個空格,這樣的命令是不會被記錄到歷史記錄的,感覺是不是很酷
這個技巧如果在你的系統(tǒng)不管用,請查看下環(huán)境變量 HISTCONTROL 是否包含 ignorespace,貌似 centos 系統(tǒng)默認沒有設(shè)置這個值。
3 總結(jié)時間
在 Linux 系統(tǒng),history 命令可以非常方便,幫助我們管理歷史命令,平時我們命令都會先記錄在緩存區(qū),在 Shell 退出時才會記錄到文件中。
history 命令提供了很方便的管理功能,合理去配置和管理歷史記錄,可以讓你的 Linux 系統(tǒng)更加健壯和安全。
好了,老規(guī)矩,貼心的肖哥還是來總結(jié)一下 history 命令常用方法
- history n:只顯示最近的 n 條歷史記錄
- history -c:清除緩存區(qū)中的歷史記錄
- history -w:將緩存區(qū)的歷史記錄保存到文件
- history -d N:刪除第 N 條歷史記錄
幾種重復(fù)執(zhí)行命令的方法:!!、!-1、!N、!string 等
交互式歷史命令搜索,請使用 Ctrl+R 快捷鍵
合適使用幾個相關(guān)的環(huán)境變量,讓你的 Linux 系統(tǒng)更安全:
- HISTSIZE:控制緩沖區(qū)歷史記錄的最大個數(shù)
- HISTFILESIZE:控制歷史記錄文件中的最大個數(shù)
- HISTIGNORE:設(shè)置哪些命令不記錄到歷史記錄
- HISTTIMEFORMAT:設(shè)置歷史命令顯示的時間格式
- HISTCONTROL:擴展的控制選項
如果在生產(chǎn)環(huán)境,這些環(huán)境變量需要持久化到配置文件 ~/.bash_profile
- export HISTCONTROL=ignoreboth
- # ignorespace: 忽略空格開頭的命令
- # ignoredups: 忽略連續(xù)重復(fù)命令
- # ignoreboth: 表示上述兩個參數(shù)都設(shè)置
- # 設(shè)置追加而不是覆蓋
- shopt -s histappend
- export HISTSIZE=1000
- export HISTFILESIZE=200000
- export HISTTIMEFORMAT="%F %T "
- export HISTIGNORE="ls:history"
本文轉(zhuǎn)載自微信公眾號「編程修養(yǎng)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系編程修養(yǎng)公眾號。