
如何從history
的資料庫中刪除特定行?
答案1
您需要登出並重新登入或執行history -a
,以便將當前歷史記錄提交到磁碟。
然後只需編輯該文件即可~/.bash_history
。
答案2
您可以使用命令列分兩步驟從歷史文件中刪除:
- 鍵入
history -d <line_number>
會從記憶體中的歷史記錄中刪除指定的行。 - 鍵入會將
history -w
目前記憶體中的歷史記錄寫入檔案~/.bash_history
。
這兩個步驟一起從記憶體中永久刪除該行歷史並從.bash_歷史記錄文件也是如此。
答案3
到防止首先要新增至歷史記錄中的命令,請確保環境變數HISTCONTROL
在其冒號分隔的值中包含 value ignorespace
,例如(將 例如 新增至.bashrc
):
$ export HISTCONTROL=ignorespace
這將防止任何帶有前導空格的命令被添加到歷史記錄中。然後您可以透過運行來完全清除歷史記錄
$ history -c -w
^-- additional space character
答案4
幾種技巧:
防止敏感資訊儲存在歷史文件中
如果您在命令列上輸入了一些密碼,然後意識到所有命令都已記錄,您可以:
強制退出目前會話而不儲存歷史記錄:
kill -9 $$
這將刪除所有當前歷史記錄。
正如正確指出的S0和S0'評論,另一種方法是修改歷史檔案名稱:
HISTFILE=
在開啟的 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
,它也不會處理名稱中帶有換行符的檔案。