在 Linux 中,有一個非常有用的命令可以向你顯示最近使用過的所有最後命令。該命令簡稱為history。
顯示時間戳
通常當你從命令行鍵入歷史記錄時,它會顯示命令# 和命令。出於審計目的,將時間戳與命令一起顯示可能會有所幫助,如下所示。
exportHISTTIMEFORMAT='%F%T'history|more12020-06-2519:02:39systemctlrestartnetwork22020-06-2519:02:43exit32020-06-2519:02:47id42020-06-2519:02:56cat/etc/hosts使用 Control+R 搜索歷史記錄
這可能是你歷史上最常用的功能。當你已經執行了一個很長的命令時,你可以簡單地使用關鍵字搜索歷史記錄並重新執行相同的命令,而無需完全鍵入它。
在以下示例中,我搜索了host,它顯示cat /etc/hosts了歷史記錄中包含單詞的上一個命令host。
(reverse-i-search)`host':cat/etc/hostscat/etc/hosts#<ip-address><hostname.domain.org><hostname>11localhost.localdomainlocalhostserver1::1localhost.localdomainlocalhostserver1
有時你想在執行之前編輯歷史命令。例如,你可以搜索systemctl,它將
systemctlrestartnetwork
從命令歷史記錄中顯示,選擇此命令(按 ESC 鍵)並更改restart為stop並再次重新執行,如下所示。
(reverse-i-search)`systemctl':systemctlstopnetworksystemctlstopnetwork使用 4 種不同的方法快速重複上一個命令
有時你可能會因為各種原因重複前面的命令。以下是重複上次執行命令的 4 種不同方式。
執行歷史記錄中的特定命令
在下面的例子中,如果你想重複命令#4,你可以做!4如下所示。
history | more
systemctlrestartnetworkexitidcat/etc/hosts
!4
cat/etc/hosts#<ip-address><hostname.domain.org><hostname>11localhost.localdomainlocalhostserver1::1localhost.localdomainlocalhostserver1執行以特定單詞開頭的上一個命令
輸入!後跟要重新執行的命令的開頭幾個字母。在以下示例中,輸入!ps並回車,執行以 開頭的上一個命令ps,即ps aux | grep yp。
!ps
psaux|grepyproot1694701365161264?Sl13:100:00ypbindroot17503004124740pts/0S+19:190:00grepyp控制歷史總行數
將以下兩行附加到.bash_profile並重新登錄到 bash shell 以查看更改。在此示例中,1500 命令將存儲在 bash 歷史記錄中。
vi ~/.bash_profile
HISTSIZE=1500HISTFILESIZE=1500更改歷史文件名
默認情況下,歷史記錄存儲在~/.bash_history文件中。將以下行添加到 .bash_profile 並重新登錄到 bash shell,將歷史命令存儲在.my_commandline文件而不是.bash_history文件中。當你想要使用不同的歷史文件名跟蹤從不同終端執行的命令時,會使用它。
vi ~/.bash_profile
HISTFILE=/root/.my_commandline消除歷史的連續重複輸入
在下面的例子pwd中輸入了 3 次,當你做 history 時,你可以看到它的所有 3 次連續出現。為了消除重複的,設置HISTCONTROL到ignoredups如下所示。
history | tail -4
44pwd45pwd46pwd47history|tail-4exportHISTCONTROL=ignoredupshistory|tail-356exportHISTCONTROL=ignoredups57pwd58history|tail-4擦除整個歷史中的重複項
上面顯示的 ignoreups 僅當它們是連續命令時才會刪除重複項。要消除整個歷史記錄中的重複項,請將 HISTCONTROL 設置為 erasedups,如下所示。
exportHISTCONTROL=erasedupspwdsystemctlrestartnetworkhistory|tail-338pwd39systemctlrestartnetwork40history|tail-3ls-lsystemctlrestartnetworkhistory|tail-635exportHISTCONTROL=erasedups36pwd37history|tail-338ls-l39systemctlrestartnetwork40history|tail-6強制歷史記錄不記住特定命令
當你執行命令時,你可以通過設置HISTCONTROL為ignorespaceAND 在命令前鍵入一個空格來指示歷史記錄忽略該命令,如下所示。我可以看到很多初級系統管理員對此感到興奮,因為他們可以從歷史記錄中隱藏命令。了解ignorespace工作原理是很好的。但是,作為最佳實踐,不要有目的地向歷史隱瞞任何事情。
exportHISTCONTROL=ignorespacels-ltrpwdsystemctlrestartnetwork#Notethatthereisaspaceatthebeginningofservice,toignorethiscommandfromhistory
history | tail -3
67ls-l68pwd69history|tail-3清除所有以前的歷史記錄
有時你可能想清除所有以前的歷史記錄,但又想讓歷史記錄向前推進。
history -c
替換歷史命令中的單詞
當你搜索歷史記錄時,你可能想要執行不同的命令,但使用剛剛搜索的命令中的相同參數。
在下面的示例中,!!:$vi 命令的 next 獲取從前一個命令到當前命令的參數。
lsnginx.confnginx.confvi!!:$vinginx.conf`
在下面的示例中,!^vi 命令的next 獲取從前一個命令(即cp命令)到當前命令(即vi命令)的第一個參數。
cpnginx.confnginx.conf.bakvi!^
vi nginx.conf
將特定參數替換為特定命令
在下面的示例中,!cp:2搜索歷史記錄中以 cp 開頭的上一個命令,並採用 cp 的第二個參數並將其替換為 ls -l 命令,如下所示。
cp~/longname.txt/really/a/very/long/path/long-filename.txtls-l!cp:2ls-l/really/a/very/long/path/long-filename.txt
在下面的示例中,!cp:$搜索歷史記錄中以 cp 開頭的上一個命令,並採用 cp 的最後一個參數(在這種情況下,也是如上所示的第二個參數)並將其替換為 ls -l 命令,如下所示.
ls -l !cp:$
ls-l/really/a/very/long/path/long-filename.txt禁用歷史的使用
如果你想同時禁用歷史記錄並且不希望 bash shell 記住你輸入的命令,請將 設置HISTSIZE為 0,如下所示。
exportHISTSIZE=0history#Notethathistorydidnotdisplayanything忽略歷史記錄中的特定命令
有時你可能不想用基本命令(例如pwd和 )弄亂你的歷史記錄ls。使用HISTIGNORE你想從歷史中忽略指定的所有命令。請注意,添加ls到HISTIGNOREignores onlyls而不是ls -l. 因此,你必須提供你希望從歷史記錄中忽略的確切命令。
exportHISTIGNORE="pwd:ls:ls-ltr:"pwdlsls-lsystemctlrestartnetwork
history | tail -3
79exportHISTIGNORE="pwd:ls:ls-l:"80systemctlrestartnetwork81history[Notethathistorydidnotrecordpwd,lsandls-l] 熱文推薦 藍隊應急響應姿勢之Linux 通過DNSLOG回顯驗證漏洞 記一次服務器被種挖礦溯源 內網滲透初探 | 小白簡單學習內網滲透 實戰|通過惡意 pdf 執行 xss 漏洞 免殺技術有一套(免殺方法大集結)(Anti-AntiVirus) 內網滲透之內網信息查看常用命令 關於漏洞的基礎知識 任意賬號密碼重置的6種方法 乾貨 | 橫向移動與域控權限維持方法總匯 手把手教你Linux提權
歡迎關注LemonSec
覺得不錯點個「贊」、「在看」哦