從 Bash 歷史檔案中刪除特定行

從 Bash 歷史檔案中刪除特定行

如何從history的資料庫中刪除特定行?

答案1

您需要登出並重新登入或執行history -a,以便將當前歷史記錄提交到磁碟。

然後只需編輯該文件即可~/.bash_history

答案2

您可以使用命令列分兩步驟從歷史文件中刪除:

  1. 鍵入history -d <line_number>會從記憶體中的歷史記錄中刪除指定的行。
  2. 鍵入會將history -w目前記憶體中的歷史記錄寫入檔案~/.bash_history

這兩個步驟一起從記憶體中永久刪除該行歷史並從.bash_歷史記錄文件也是如此。

答案3

防止首先要新增至歷史記錄中的命令,請確保環境變數HISTCONTROL在其冒號分隔的值中包含 value ignorespace,例如(將 例如 新增至.bashrc):

$ export HISTCONTROL=ignorespace

這將防止任何帶有前導空格的命令被添加到歷史記錄中。然後您可以透過運行來完全清除歷史記錄

$  history -c -w
  ^-- additional space character

答案4

幾種技巧:

防止敏感資訊儲存在歷史文件中

如果您在命令列上輸入了一些密碼,然後意識到所有命令都已記錄,您可以:

  1. 強制退出目前會話而不儲存歷史記錄:

     kill -9 $$
    

    這將刪除所有當前歷史記錄。

    1. 正如正確指出的S0和S0'評論,另一種方法是修改歷史檔案名稱:

      HISTFILE=
      
  2. 在開啟的 bash 會話中鍵入↑ (up arrow),直到顯示敏感訊息,然後使用行編輯按鍵(如Ctrl+)W刪除敏感訊息,然後然後 ↓ (down arrow)直到提示新的空白行,打字Enter

從歷史文件中刪除敏感訊息

如果您發現敏感資訊已被存儲,並且您想要刪除它,但不是整個歷史記錄:

一個簡單的sed命令就可以完成這項工作:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

但是,當您鍵入此內容時,您會建立另一個歷史記錄行,其中包含您嘗試刪除的搜尋模式(敏感資訊)。所以你可以:

sed -e "/$(head -n1)/d" -i .bash_history

這將head -n1根據來自終端的輸入運行。看起來你的終端機已掛起(不會有提示);只需鍵入要從文件中刪除的資訊即可。這是一個讓您輸入命令(部分)的技巧,而無需實際將其輸入到命令列中,從而使其不符合包含在歷史記錄中的資格。然後sed將使用您鍵入的文字搜尋.bash_history 並刪除包含敏感資訊的所有行。注意:如果您的敏感資訊模式包含斜杠,則必須使用反斜線對其進行轉義,或更改命令sed以使用此語法來指定模式中未出現的分隔符號:

sed -e "\|$(head -n1)|d" -i .bash_history

另一種方法可能是僅刪除敏感訊息,但保留包含該資訊的命令。為此,您可以簡單地將敏感資訊替換為您選擇的替代文字:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

從特定樹中的任何文件中刪除敏感訊息

最後,確保這不會留在其他忘記文件:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

將列出所有相關文件。

find . -type f -print0 |
    xargs -0 grep -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

將會取代以 為根的目錄樹中所有檔案中出現的所有敏感資訊.。注意:即使此命令使用xargs -0,它也不會處理名稱中帶有換行符的檔案。

相關內容