題 我不小心在bash命令行輸入了密碼


我不小心在bash命令行輸入了我的密碼,誤以為 Last login: ... 換行 Wrong password (我當時很急)。我該怎麼做才能掩蓋我的踪跡?

我做的是編輯 .bash_history 並刪除違規行(必須重新登錄一次才能看到密碼出現在文件中,這樣我就可以將其刪除,然後再次重新登錄以查看它從UPARROW鍵下的歷史記錄中消失)。

是否還有其他可以保存命令歷史記錄的地方?該系統是CentOS 6.5。


182
2018-04-02 06:42


起源


只需更改密碼:) - gronostaj
更改密碼並不是那麼簡單......我需要讓管理員在15個不同的服務器上重新安裝我的新公鑰 - 這個人就像 /dev/null。 - MaDa
如果您無法在任何時候輕鬆更改密碼,那麼您可能會遇到嚴重的安全漏洞。當有人真正獲得您的密碼時,您會怎麼做?您有什麼方法可以立即撤銷系統訪問權限嗎? - gronostaj
您可以在不更改密鑰的情況下更改ssh密鑰的密碼: ssh-keygen -f id_rsa -p。 - jwg
只是提到這一點,至少在聯網的Windows登錄中,你已經被軟管了。管理員(在一些崇高的服務器塔中)默認是記錄所有登錄嘗試,當然用戶名是明文。所有有進取心的人都要搜索非用戶名字符串並將它們與下一個有效用戶名(或同一台機器上的下一次登錄嘗試)相關聯。並且沒有簡單的方法來刪除該管理日誌文件。所以你真的要改變你的密碼。 - Carl Witthoft


答案:


您可以從中刪除有問題的行 bash的歷史,而不是清除整個歷史。只需刪除行 -d 標誌,然後保存(寫)新的歷史記錄 -w 旗:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w

177
2018-04-02 12:25



請注意,如果您設置了“PROMPT_COMMAND = history -a”,則此功能無效。有了這個,當命令終止後顯示提示時,帶有密碼的命令會立即寫入.bash_history。您必須編輯.bash_history才能將其刪除。 - benrifkah


這有兩個部分:

  • bash 將歷史記錄存儲在文件中 ~/.bash_history 默認情況下,在會話結束時寫入
  • history 這是留在記憶中的

為安全起見,您需要從會話中清除它:

history -c

並根據需要截斷歷史文件:

> ~/.bash_history

如果您鍵入密碼的會話仍處於打開狀態,那麼另一種方式 掩蓋你的踪跡 是設置 HISTFILE 變量到null設備,以便不寫入歷史記錄 ~/.bash_history 當會話退出時:

export HISTFILE=/dev/null

120
2018-04-02 07:17



嘿看,這是管理員! - Raystafarian
雙關語沒有打算,對不起:)當我寫評論時,我沒有看到你的暱稱。 - MaDa
為了偏執(但由於某種原因仍然沒有改變你的密碼)不應該你 shred 該文件或以其他方式覆蓋多次? - kojiro
@MaDa沒問題。我甚至在答案中添加了另一種方法來將我的缺口帶入圖片中。 - devnull
設置 HISTFILE= 足夠。從 bash(1): 如果未設置,則在shell退出時不保存命令歷史記錄。 - Lekensteyn


由於bash(至少我所知道的所有歷史和當前版本)在退出之前不會自動保存歷史記錄,因此當您鍵入要確保永遠不會保存的命令時,通常適用的策略是立即鍵入:

kill -9 $$

這會殺死shell SIGKILL,無法捕獲,所以shell無法在退出時保存任何內容。

大多數其他方法涉及在事實之後(即在數據已經到達磁盤之後)進行清理,這有更多的錯誤機會(丟失副本),特別是如果系統可能正在使用btrfs或類似的情況。


23
2018-04-02 16:20



+1,而不僅僅是更多的錯誤機會 可以 甚至可以恢復,具體取決於是否/後執行了多少命令 - Cruncher
缺少“自動”一詞?因為dotancohen已經展示了一種在不退出shell的情況下保存歷史記錄的方法。 - Ben Voigt
可以將shell配置為在執行每個命令後保存歷史記錄,而不是在退出時保存歷史記錄。 - Kundor
+1這正是我想要推薦的!除了 rm ~/.bash_history~ 在OP已保存的情況下刪除備份文件 - Tomas
請注意,如果您設置了“PROMPT_COMMAND = history -a”,則此功能無效。有了這個,當命令終止後顯示提示時,帶有密碼的命令會立即寫入.bash_history。您必須編輯.bash_history才能將其刪除。 - benrifkah


在您不小心輸入了您不希望存儲在歷史記錄中的內容之後,您可以鍵入: unset HISTFILE

當您註銷時,Bash不知道存儲歷史記錄的位置,因此這將有效地禁用整個會話的歷史記錄。


11
2018-04-02 18:51



請注意,如果您設置了“PROMPT_COMMAND = history -a”,則此功能無效。有了這個,當命令終止後顯示提示時,帶有密碼的命令會立即寫入.bash_history。您必須編輯.bash_history才能將其刪除。 - benrifkah


我最喜歡的技巧是點擊向上箭頭,退出命令,鍵入內容(可能沒有必要),點擊向下箭頭,輸入“ls”,然後按回車鍵。感覺真的很好,但它確實有效。當我在歷史記錄中編輯錯誤的命令後生氣,然後通過不按ctrl-c中止編輯來破壞它時發現了這一點。我猜bash支持修正主義歷史。 ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

好像:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 

11
2018-04-03 20:58



那是 奇怪的。一個缺點是,它似乎知道您編輯的歷史記錄,因此可能有某種方法可以恢復舊版本? - MadTux
@MadTux - 完全,但.bash_history只是一個純文本文件。所以你可以做上面的例子,退出並重新連接。當你查看.bash_history文件的全部內容時,沒有什麼可以區分它,如果你剛剛運行“cd”,所以跟踪是乾淨的。 - Mark Jerde
請注意,如果您設置了“PROMPT_COMMAND = history -a”,則此功能無效。有了這個,當命令終止後顯示提示時,帶有密碼的命令會立即寫入.bash_history。您必須編輯.bash_history才能將其刪除。 - benrifkah


除了其他答案之外,在終端滾動緩衝區中找到密碼可能是相關的 - 現在顯示文本的歷史記錄,以及更多的問題,如果終端仿真器確實保存了硬盤,可能在硬盤上歷史到磁盤。 這種情況發生在KDE konsole中,歷史大小設置為“無限回滾”,永不丟棄任何輸出。


10
2018-04-03 19:58





$<space> command,命令不會添加到歷史記錄中,有時也很有用

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep

5
2018-04-02 14:07



雖然有趣,但目前尚不清楚這在所描述的場景中是如何有用的。您是否建議每個密碼都以空格開頭? - Ben Voigt
不,他所建議的是,有了這個,你輸入的任何你不想承諾歷史的行都應該輸入一個領先的空間。例如:“ls”變為“ls”,該行永遠不會顯示在歷史記錄或會話向上箭頭列表中。 - Bryan C.
請注意,只有$ HISTCONTROL包含ignorespace時,此前導空間技巧才有效。 - Bernd Jendrissek
@ jris198944通過命令行參數提供密碼可能會將其暴露給運行的系統上的任何人 ps。 - jamesdlin
無論如何,雖然如果你提前計劃這個技巧很有用,但這對某人的原始場景沒有幫助 偶然 在命令行輸入密碼。 - jamesdlin


另一種避免保存到歷史文件(在註銷之前)的替代方法只是chmod 444~ / .bash_history然後註銷。再次登錄並重置權限(或不重置,取決於你是多麼偏執!)。


4
2018-04-03 09:08





我看到反复提到

請注意,如果您設置了“PROMPT_COMMAND = history -a”[..],則無法執行此操作。您必須編輯.bash_history以將其刪除。

第一部分肯定是正確的,但您不必手動編輯.bash_history來修復它。 如果將兩個命令組合在一行上,它可以很好地工作:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w

1
2017-12-07 14:03



你能解釋一下究竟是什麼讓這種方法有效嗎? - Kamil Maciorowski
PROMPT_COMMAND僅在顯示下一個命令提示符之前執行。在單獨的行上輸入-d和-w命令的問題是PROMPT_COMMAND將在其間執行history -a命令。如果在一個命令行上同時執行-d和-w,則只會在之後執行 - Floris Kruisselbrink