題 如何禁用可怕的終端命令?


你如何禁用可怕的終端命令?

我使用SSH訪問遠程Ubuntu服務器而無法訪問物理服務器。我以為我在打字'shutdown'進入在Ubuntu OS上運行的NoSQL服務器,但實際上我告訴Ubuntu服務器關閉。然後我不得不告訴服務器管理員我做了什麼,以便他可以為我啟動物理服務器。那太尷尬了!

我怎樣才能防止這種情況再次發生?


82
2018-06-18 14:52


起源


已經討論了這個問題,通常是相關的 rm 副作用比副作用差 shutdown。結論:如果你繼續以root身份運行隨機命令,這裡就無法阻止壞事發生。 - Dmitry Grigoryev
正如其他人已經註意到別名,這樣做可以使人們“養成以非標準方式工作的命令的習慣”。那麼愚蠢的NoSQL服務器使用這個命令對其他人來說似乎不好嗎? - bmb
我使用的NoSQL服務器是Redis。 - MelodiousFires
只是不在root帳戶下工作。 - alk
我敢說你學到了這一課,所以不必再覺得需要再次禁用任何命令。我還補充說,你不要傻瓜式的GNU / Linux,你只是比傻瓜好。


答案:


標準答案是“不要以root身份登錄”。以root身份運行的所有命令都很可怕。如果這不是一個選項,你可以將一些別名命令放入你的 .bashrc 禁用你發現特別可怕的命令。例如:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

然後,如果您鍵入shutdown,您將收到以下消息:

If you really want to do that, type: /sbin/shutdown

確保 您的 .bashrc 先加載, 在你嘗試之前 在生產服務器上)

退出當前 ssh 會話並再次登錄或使用 . ~/.bashrc 應該加載/運行.bashrc。也許嘗試跑步 rm 沒有任何參數,以確保您的服務器沒有禁用自動加載 .bashrc 在登錄或類似。

請注意,如果您主要關注暫停和關閉,則可以考慮安裝 莫莉後衛,這將使您在關閉機器之前鍵入主機名。如果您經常在命令行上關閉整個操作系統,但是想要確保關閉正確的操作系統,這會更有用。

您還可以使用一個不太可怕的命令(例如logout或exit)來測試。


204
2018-06-18 15:19



不要以root身份登錄:如果您對登錄的計算機造成混淆,這將無濟於事。我建議 改變提示 能給你視覺提示的東西。 - isanae
根據我的經驗,將“可怕”命令別名化以產生“安全”行為是一個壞主意。這是因為人們傾向於養成以非標準方式工作的命令的習慣,這使得他們在香草系統上做一些非常令人遺憾的事情。簡單的答案是以root身份登錄時非常謹慎。 - TimGJ
@isanae我用ssh打開終端到生產服務器的快捷方式會使終端背景亮紅燈。這讓我很注意。 - Peter A. Schneider
source 是別名 . 並且不受所有shell支持。 - gronostaj
還要注意,雖然Debian和Ubuntu都有默認值 ~/.bash_profile 資源 .bashrc,這不是標準行為,在大多數係統中, .bashrc 通過ssh登錄時不會讀取,因此這不會產生任何影響。添加別名要好得多 ~/.profile 要么 ~/.bash_profile 代替。 - terdon


sudo 存在是有原因的 - 使用它。 當您的命令(在本例中為交互式CLI)完成後,您將被轉儲回用戶級shell,而不是root shell。在root shell中有很多值得注意的理由。 (我很驚訝這不是一個答案......)

話雖如此,不要成為使用的布偶 sudo 對於 一切。了解您正在做什麼,並了解它為什麼/不需要root權限。


此外,您可以區分根/用戶shell的提示。 這也讓你更明顯地回到shell提示符而不是“其他一些CLI“。我的色彩非常豐富多彩,並且有許多有用的信息(例如主機名) 非常 很容易知道命令將在哪個主機上執行,並且還可以更容易地回顧歷史記錄並找到提示 - 根shell使用默認提示。

My PS1

這更適合用於“您的“帳戶,但如果您認真對待安全/系統管理,那麼您將不會共享密碼/帳戶,並且您不會在沒有完全了解的情況下坐在root shell中。


正如人們一遍又一遍地說過“別名命令以創建一個安全的環境是一個壞主意“你會在安全的環境中感到舒服,在你不應該的地方輸入那些'可怕的'命令。然後有一天你會換工作,或登錄新機器,然後繁榮”悶悶不樂,我不是故意的,對不起“...


73
2018-06-19 11:40



sudo 輪到你去喝咖啡了。 - ivan_pozdeev
他不會有同樣的問題 sudo shutdown?如果他在錯誤的機器上執行它,它仍然是一場災難。 - Barmar
@Barmar NoSQL是否理解sudo命令? - Taemyr
@Taemyr sudo 是一個shell命令,它與數據庫無關。 - Barmar
@Barmar:實際上我認為OP意味著將它輸入到NoSQL cmdline程序中,而不是打入bash。所以他們不會打字 sudo shutdown,因為我認為 sudo 不是NoSQL命令。不在root shell中就完全解決了這個問題並且是一個非常好的主意。因此,在運行重要命令之前,請仔細查看提示。 - Peter Cordes


包'molly-guard'(至少在Debian派生系統上)將安裝一個關閉,停止,關閉和重啟的包裝器。如果它檢測到終端是遠程終端,則會提示輸入主機名。如果不匹配,則取消該命令。


44
2018-06-18 16:18



那些其他(可能更可怕)的東西呢 rm -rf /? - marcellothearcane
@marcellothearcane set -u 在某些情況下可能會有所幫助,比如寫作時 rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT。 - Alex Hall
@marcellothearcane對於任何類似於現代Linux系統的東西,都需要 --no-preserve-root 你不太可能偶然輸入。 - α CVn
誰是莫莉,我想...可能是某人的貓。 - the0ther
@ the0ther,一個2歲的孩子,在同一天兩次觸發恐龍機器上的SCRAM開關。房間裡的人們在開關上裝了一個蓋子。 catb.org/jargon/html/M/molly-guard.html - CSM


我接受了一個我非常喜歡的答案,但是,如果其他人正在閱讀並想要一個更簡單的答案,那麼這就是我的。

找到.bashrc文件並將其作為最後一行:

alias shutdown=notforuse

然後當你輸入shutdown時你會得到類似的東西 ~bash: notforuse is not a command

這可能很愚蠢,但它很簡單並且有效。不過我更喜歡以更好的方式來解答答案!


4
2018-06-18 15:29



嗯,我曾經這樣做過 rm 給巨魔人 - alias rm='echo "You can't use rm!" #' - MD XF
我認為這是一個壞主意,原因有三個。首先,對於擁有root權限的任何其他人來說,這會讓人感到困惑。其次,它訓練你可以輸入“shutdown”並按Enter鍵,這意味著你可能會在你有root訪問權限的下一個系統上犯同樣的錯誤。第三,如果有一個有效的命令被調用,這將變得非常混亂 notforuse 在路上。 - David Richerby
我和@DavidRicherby就是這個。不是個好主意。 - Tico
如果你真的想使用別名,你至少可以放置所有這些 驚嚇命令 我們說,文件中有別名 ~/.SaveMyReputation 並添加為您的最後一行 .bashrc 一條線 [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation。您可能希望最終添加額外的行 echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell" 在那個文件裡面。至少你可以帶上這個別名文件在其他機器上(它應該是 .bash_aliases,但在此 “過時” 案例最好使用其他名稱)。 - Hastur
如果您打算這樣做,請使用類似的名稱減少混淆 alias shutdown=shutdown-disabled-by-an-alias。 (這只解決了@DavidRicherby指出的第三個也是最小的問題。)雖然下一個人可能只需要2秒才能看到 notforuse is not a command 跑步 type -a shutdown 並找到別名,然後鍵入 sudo \shutdown 禁用別名擴展。 (假設他們有 sudo 別名 sudo='sudo ' 所以它在第一個arg中擴展了別名。 - Peter Cordes


你可能已經成為一些新的Ubuntu愚蠢的犧牲品。

Ubuntu曾經擁有正常,經典 shutdown 帶有強制時間參數的命令。

如果我打字,這就是Ubuntu 12上發生的事情 shutdown,即使是普通用戶:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

然後

$ shutdown +100
shutdown: need to be root.

現在,這是Ubuntu 16.10。我不是根:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

如果沒有參數,它會在60秒後安排關閉,即使您不是root用戶,也只是使用管理員權限創建的帳戶。

責怪規範。


2
2018-06-23 22:54



/sbin/shutdown  由...提供 systemd-sysv 包 默認情況下,這不是Ubuntu愚蠢,它是 systemd 愚蠢,它不是來自Ubuntu,而是來自至少Debian,反過來,它似乎佔據了整體 systemd 紅帽的運動。指責時,責怪正確的實體 - 而不僅僅是你不喜歡的實體。 - Ruslan
@Ruslan沒有人把這個廢話包裝到他們的發行版中,沒有人逃脫了愚蠢的責任。 - Kaz


對於 shutdown (reboothalt 和相關的):我有一份副本,問我是否確實(並且它無論如何都沒有)。我將這些腳本存儲在 /usr/local/sbin。在Debian上,這優先於其他 /sbin (它是PATH的第一個目錄)。

系統腳本使用完整路徑,所以這樣  阻止我停止遠程服務器而不是本地機器(來自的不良行為) 真棒 WM),但沒有其他間接影響,我仍然可以在真正需要時將它們用作/ sbin / shutdown。


1
2018-06-19 15:39



這種黑客攻擊只有在你將它們應用到你登錄的每台計算機上時才有效...這通常是不切實際的,你不會發現它為時已晚:通過輸入 shutdown 在關鍵系統上做到了 不 有你的黑客。 - jpaugh
@jpaugh:是的,這是一個黑客攻擊,我只將它用於我經常登錄的個人服務器,並且終端保持打開狀態太長時間。 [注意:我的個人計算機也使用不同的顏色提示:remote-root,remote-user,local-root,local-user]。對於真正的服務器和遠程機器,我避免root,我盡可能少地root,並且肯定,不要忘記退出它們。我正在使用我的遙控器作為“雲”(在雲計算之前,所以按照舊方式處理)。 - Giacomo Catenazzi


Sudoers文件允許更精細的粒度級別,而不僅僅是''允許使用sudo'*,特別是您可以使用命令別名來創建特定用戶或組限制的命令組的白名單。我使用過限制為ssh訪問的遠程服務器並允許無密碼的sudo(我們確實需要密碼保護的ssh密鑰)。這樣做有一些很好的理由,但確實存在危險,所以我們使用命令別名來允許不受限制地訪問他們需要做的事情(重新啟動服務器等)而不給予他們沒有的權限。

還有語法可以說 '無法運行此命令'。它可以解決,因此它不應該用作真正的安全措施,但它適用於您描述的方案。

男人sudoers有一些關於如何設置這一切的好例子。

當然這需要使用sudo,但這應該是不言而喻的。


1
2018-06-23 16:08





對於關閉,有一個molly-guard。您只需要安裝它,當您嘗試通過ssh關閉時,它會要求您鍵入主機名。

對於刪除文件,有像libtrash這樣的解決方案,它通過一個模擬垃圾桶 LD_PRELOAD 圖書館。

你可以測試你正在改變/刪除/ ...的文件 也許 程序。在測試某些東西時,這非常酷。


0
2018-06-23 19:18



這個 maybe 事情似乎被設計破壞了:使用no-ops來阻塞一些系統調用會使任何依賴這些系統調用成功的非平凡程序崩潰。 - Dmitry Grigoryev


試試這個:當你在遠程shell上時,每​​次你打算鍵入“返回”鍵時,停止5秒鐘,手指懸停在“返回”鍵上,然後重新讀取你要發送的命令。可以嗎?你確定嗎?

這似乎很苛刻,但另一方面,我們不應該花很多時間在遠程砲彈上。我們應該找到自動化維護工作的所有方法,以便我們很少(如果有的話)需要登錄到遠程服務器。


-2
2018-06-24 17:07



試過,不工作。我進入了 shutdown,停了5秒,重讀命令(大聲!),我確信它是正確的。然後按Enter鍵並執行命令。所以這並沒有禁用可怕的命令,我害怕。我會嘗試用這個手指懸停的東西,也許距離太小/太大。 - wojciech_rak