列出曾經(jīng)輸入的命令
要減少輸入,首先要知道曾經(jīng)輸入過(guò)什么命令,對(duì)于這個(gè)問(wèn)題,Linux 有很好的解決方案,它就是今天的主角——history。
我們直接輸入 history 命令:
[roc@roclinux ~]$ history 1 cat .bash_history 2 echo "" > .bash_history 3 ls 4 man ls 5 date 6 logout 7 history
看到了什么?是不是曾經(jīng)輸入的命令都列了出來(lái)。但這里有一個(gè)問(wèn)題,雖然命令都列了出來(lái),但沒(méi)有時(shí)間戳呀,也不知道命令是什么時(shí)候執(zhí)行的,這怎么能稱得上是“history”呢?不用擔(dān)心,我們?cè)囋囅旅娴拿睢?pre>#我們?cè)O(shè)置了一個(gè)環(huán)境變量[roc@roclinux ~]$ export HISTTIMEFORMAT='%F %T ' #再來(lái)看history[roc@roclinux ~]$ history 1 2016-04-06 12:15:59 cat .bash_history 2 2016-04-06 12:15:59 echo "" > .bash_history 3 2016-04-06 12:15:59 ls 4 2016-04-06 12:15:59 man ls 5 2016-04-06 12:15:59 date 6 2016-04-06 12:15:59 logout 7 2016-04-06 12:16:16 history 8 2016-04-06 12:18:15 export HISTTIMEFORMAT='%F %T ' 9 2016-04-06 12:18:20 history看看是不是已經(jīng)給命令打上了時(shí)間的烙印了。
雖然時(shí)間戳出現(xiàn)了,但還有兩個(gè)問(wèn)題困擾著我們:
- 系統(tǒng)是怎么知道我們?cè)谑裁磿r(shí)間執(zhí)行了哪些命令呢?
- 有沒(méi)有發(fā)現(xiàn),輸出內(nèi)容中的前 6 條命令的時(shí)間戳竟然是完全一樣的,都是“2016-04-0612:15:59”,這又是為什么呢?
我們先來(lái)重新登錄一下系統(tǒng),然后輸入下面的命令,一起來(lái)尋找問(wèn)題的答案:
[roc@roclinux ~]$ cat .bash_history cat .bash_historyecho "" > .bash_historylsman lsdatelogout#1459916176history#1459916295export HISTTIMEFORMAT='%F %T '#1459916300history#1459916459logout
看到文件中的“#1459916176”這種格式的字符串了嗎?這些就是命令執(zhí)行的時(shí)間戳,通過(guò)這些標(biāo)記,history 就能正確顯示命令的執(zhí)行時(shí)間了。
為什么前 6 條命令的時(shí)間戳是一樣的呢?這是因?yàn)檫@些命令執(zhí)行時(shí)沒(méi)有開(kāi)啟“時(shí)間戳記錄功能”,在后面需要顯示時(shí)間戳?xí)r,它們只能取距離它們最近的有時(shí)間記錄的那個(gè)時(shí)間點(diǎn)作為它們的時(shí)間戳。這也就是前 6 條命令所顯示的時(shí)間戳都是同一個(gè)時(shí)間點(diǎn)的原因。
重復(fù)上一次的執(zhí)行
平時(shí)大家最常遇到的一個(gè)場(chǎng)景應(yīng)該是“想重復(fù)執(zhí)行上一條命令”,對(duì)于這種情況,我們首先想到的方法就是按“上方向鍵”,但其實(shí)我們有四種方法可以實(shí)現(xiàn)這一效果:
- 使用向上方向鍵,并回車執(zhí)行。
- 輸入 !!,并回車執(zhí)行。
- 輸入 !-1,并回車執(zhí)行。
- 輸入 Ctrl+P 組合鍵并回車執(zhí)行。
嘆號(hào)定位法
如果想執(zhí)行以前執(zhí)行過(guò)的某條命令,該怎么辦呢?這也是一種經(jīng)常會(huì)遇到的情況,下面我們就一起來(lái)看看:
[roc@roclinux ~]$ history 7 ls 8 vi test.go 9 ls 10 history 11 export HISTTIMEFORMAT='%F %T' 12 histroy 13 export HISTTIMEFORMAT='%F %T' 14 history 15 export HISTTIMEFORMAT= 16 man grep 17 ls 18 ll 19 history
看到 man grep了嗎?假設(shè)這條命令就是你想執(zhí)行的命令,你可以先記下它前面的標(biāo)號(hào) 16,然后這樣來(lái)執(zhí)行:
[roc@roclinux ~]$ !16Ctrl+R 搜索曾經(jīng)的命令
上面的嘆號(hào)定位法雖然好用,但有個(gè)缺點(diǎn),就是不太方便,這個(gè)方法需要我們先找出命令的編號(hào),然后才能執(zhí)行。下面,我們?cè)贋榇蠹医榻B一種更方便的方法,那就是“搜索定位法”。
搜索定位法,就是通過(guò) Ctrl+R 來(lái)實(shí)現(xiàn)歷史命令關(guān)鍵字的搜索功能,快速查找到要執(zhí)行的命令并執(zhí)行。
下面,同學(xué)們可以嘗試一下,在你們的 Shell 中按一下 Ctrl+R 組合鍵,是不是會(huì)出現(xiàn)下面的提示:
(reverse-i-search)`':
然后輸入一些關(guān)鍵字,比如“man”:
(reverse-i-search)`man': man grep
系統(tǒng)是不是就找到 man grep 這條歷史命令了,如果這條命令正是你想要執(zhí)行的,那么就直接回車,命令就會(huì)立即執(zhí)行了。
注意:如果找到的命令和想執(zhí)行的命令稍微有點(diǎn)不同的話,你可以按一下向左或向右方向鍵來(lái)對(duì)命令進(jìn)行微調(diào),等調(diào)整成你想要執(zhí)行的命令后,再按回車執(zhí)行。
清除所有的命令
安全是計(jì)算機(jī)世界里的頭等大事,出于安全的考慮,我們常常需要清除曾經(jīng)輸入的命令,避免被其他別有用心的人看到。這種情況下,我們就要用 -c 選項(xiàng)來(lái)幫忙了。
[roc@roclinux ~]$ history -c
-c
表示 clear,只要一執(zhí)行,那么我們的歷史命令列表瞬間就變得一干二凈了,曾經(jīng)的歷史命令統(tǒng)統(tǒng)不見(jiàn)了,這樣我們就再也不用擔(dān)心信息泄露了。
其實(shí),你想刪除歷史記錄可沒(méi)那么容易,上面的方法其實(shí)只是個(gè)障眼法,它只是讓系統(tǒng)暫時(shí)不顯示歷史命令。當(dāng)你再次重新登錄系統(tǒng)后,以前的歷史就又會(huì)重新出現(xiàn)。
我們?cè)嚵艘幌?,確實(shí)是這樣子的,這到底是怎么一回事呢?
事情的真相是這樣的:history-c 命令刪除的只是 Linux 系統(tǒng)內(nèi)存中的歷史命令,當(dāng) Shell 退出時(shí),就不會(huì)有歷史命令追加到文件 .bash_history 中。但當(dāng)重新登錄到 Shell 時(shí),Shell 便會(huì)加載文件 .bash_history,該文件中存儲(chǔ)著曾經(jīng)輸入的歷史命令,因此,系統(tǒng)的歷史命令就又出現(xiàn)了。
那么如何真正徹徹底底地刪除所有的歷史命令呢?我們可以采用以下方法。
[roc@roclinux ~]$ history -c[roc@roclinux ~]$ history -w
history-w 的作用就是用內(nèi)存中的歷史命令覆蓋 .bash_histroy 文件的內(nèi)容,這樣,即使 Shell 重新加載也加載不到任何命令了,因?yàn)榇藭r(shí) .bash_history 文件中已經(jīng)空空如也了。
history的配置
工欲善其事,必先利其器,科學(xué)地配置 history 命令,可以大大提高我們的工作效率,下面我們就來(lái)看看 history 都有哪些配置項(xiàng)。
(1) 設(shè)置歷史記錄的時(shí)間:
export HISTTIMEFORMAT='%F %T ' # 注意有個(gè)空格, 這樣在顯示時(shí)日期與命令之間會(huì)有空格分隔
(2) 控制歷史命令記錄的總個(gè)數(shù):
export HISTSIZE=1000 # 設(shè)置內(nèi)存中的history命令的個(gè)數(shù)export HISTFILESIZE=1000 # 設(shè)置文件中的history命令的個(gè)數(shù)
(3) 更換歷史命令的存儲(chǔ)位置:
一般情況下,歷史命令會(huì)被存儲(chǔ)在 ~/.bash_history 文件中。如果不想存儲(chǔ)在這個(gè)文件中,而想存儲(chǔ)在其他文件中,那么可以通過(guò)下面的方式來(lái)更改:
export HISTFILE=~/history.log
(4) 還有很多更加個(gè)性化的配置供大家選擇:
export HISTCONTROL=erasedups # 清除整個(gè)命令歷史中的重復(fù)條目export HISTCONTROL=ignoredups # 忽略記錄命令歷史中連續(xù)重復(fù)的命令export HISTCONTROL=ignorespace # 忽略記錄空格開(kāi)始的命令export HISTCONTROL=ignoreboth # 等價(jià)于ignoredups和ignorespace
尊重重要命令的隱私
試想一下,我們操作 Linux 系統(tǒng),如果把所有的命令都記錄到 .bash_history 中,會(huì)不會(huì)有風(fēng)險(xiǎn)呢?
當(dāng)然有風(fēng)險(xiǎn)啦,如果哪一天我們不幸中招,黑客攻入了我們的系統(tǒng),他只要查看一下 history 就能知道我們的很多秘密,比如一些登錄密碼。為了避免該類事情的發(fā)生,我們希望 history 不要顯示含有隱私信息的歷史命令,只顯示不含有隱私信息的命令。這個(gè)需求太個(gè)性化,但 history 仍然能夠?qū)崿F(xiàn),下面我們就為大家介紹兩種行之有效的解決方案。
第一種靠譜的解決方案:
- 第1步:設(shè)置 HISTCONTROL 環(huán)境變量:export HISTCONTROL=ignorespace。
- 第2步:輸入重要命令時(shí),記得在輸入命令前加上空格。
- 第3步:執(zhí)行 history,可以看到剛輸入的重要命令沒(méi)有出現(xiàn)在 history 中。
通過(guò)設(shè)置 HISTCONTROL=ignorespace,可以讓 history 不記錄你的特殊輸入(命令前加空格),這樣可以在一定程度上有效地保護(hù)我們的系統(tǒng)。
第二種靠譜的解決方案:
- 第1步:設(shè)置 HISTIGNORE 環(huán)境變量 export HISTIGNORE=*。
- 第2步:輸入重要命令,比如 mysql-uroot-p123。
- 第3步:查看你的 history,可以看到剛輸入的 mysql 命令沒(méi)有記錄在 history 中。
- 第4步:恢復(fù)命令的記錄 export HISTIGNORE=。
- 第4步后,系統(tǒng)又恢復(fù)正常,輸入的命令又能被正常記錄了。
這個(gè)方法雖然略顯煩瑣,需要你每次在輸入重要命令時(shí)都要先設(shè)置 HISTIGNORE=*,執(zhí)行完命令后再設(shè)置 HISTIGNORE=,但是,這種方法能規(guī)避由于你的粗心大意(忘記命令前加空格)帶來(lái)的巨大安全隱患,確保機(jī)密信息不會(huì)被泄露出去。