2017年8月14日 星期一

Linux Bash 刪除 history 指令操作歷史紀錄

在 Linux Bash 下過的指令紀錄,可用 history 指令查詢。
下過的指令,會先存放在 buffer,退出 bash 時,再寫入記錄檔。因此,之後登入時,也能看到之前下過的指令。

history操作紀錄相關的幾個環境變數:
  • 操作歷史紀錄,儲存的檔案位置。(操作歷史紀錄檔)(.bash_history)
    # echo $HISTFILE
    /root/.bash_history
    
  • 操作歷史紀錄檔,最多儲存幾筆。
    # echo $HISTFILESIZE
    1000
    
  • history 最多列出幾筆(在記憶體中存放的筆數)
    # echo $HISTSIZE
    1000
    


刪除全部的操作紀錄:
# history -c
# history -w
說明:「history -c」會刪除「下 history 指令時,列出的操作紀錄」, 但不會刪除「.bash_history」(HISTFILE)的檔案內容,為避免重新登入後,又讀取「.bash_history」(HISTFILE)的檔案內容, 所以須再用「history -w」寫入目前已清空的操作紀錄。


只刪除這次登入後的操作紀錄:
  • 方法一:清空 HISTFILE 變數內容,則登出時,不會將本次操作紀錄儲存到 HISTFILE 設定的檔案。
    # unset HISTFILE
    
  • 方法二:將 HISTSIZE 設為0,下「history」指令時,也不會列出指令(記憶體中沒存放指令紀錄?),則登出時,不會更新記錄檔內容(?)。
    (註:參考資料是寫會刪除全部紀錄,但我測試是只有不會儲存本次操作紀錄)
    # HISTSIZE=0
    
  • 方法三:強制刪除本次登入 Bash 的 PID,則本次操作紀錄,不會儲存到記錄檔。
    # kill -9 $$
    

說明:
  • 「$$」的變數內容是本次登入的 PID,一般和「$BASHPID」一樣,但有時不同(在 subshell 中會不同)。
    # echo $$
    4308
    # echo $BASHPID
    4308
    # (echo $BASHPID)
    4376
    # (echo $BASHPID $$)
    4377 4308
    
  • 「subshell」不等於「Bash 裡面再執行一次 Bash」。
    「subshell」,可以訪問父 Shell 的任何變數。
    「Bash 裡面再執行一次 Bash」,只能訪問父 Shell 的環境變數。
    TestAA:自訂的變數
    HISTSIZE:環境變數
    # TestAA=10
    # HISTSIZE=3
    # echo $TestAA
    10
    # echo $HISTSIZE
    3
    
    # (echo $TestAA)
    10
    # (echo $HISTSIZE)
    3
    
    # bash
    # echo $TestAA
    (無資料)
    # echo $HISTSIZE
    3
    


參考:
Linux系统下history命令的记录如何删除 - 我的技术文档整理 - 开源中国社区
Quit Bash Shell Without Saving Bash History (5 Methods) - If Not True Then False
SHLVL 和 BASH_SUBSHELL 兩個變量的區別 - 壹讀


沒有留言:

張貼留言