當你在透過 SSH 連線 Linux 系統時,不慎刪除了 /lib 目錄 (2022) (★
103 分)
在這篇文章中,作者描述了一個令人尷尬卻可能發生的情境──當使用 SSH 連線至 Linux 系統時,不慎刪除了關鍵的
/lib 目錄。由於
/lib 資料夾包含執行動態連結程式所必須的共享庫(包含 ld-linux),此舉會導致大部分非靜態可執行檔案(例如 ls、cat 等)無法運作,進而在執行時回傳「No such file or directory」錯誤,同時也無法啟動新的 SSH 連線或 tmux 視窗。
文章提出一種預防及救援方案,首先建議在系統中安裝靜態版 busybox(Busybox:一個集成多種工具的單一二進位檔,不依賴外部共享庫),以便於在意外發生時能夠利用其內建工具(例如 wget)下載及恢復遺失的庫檔。然而,由於像 Debian 這樣的最小安裝預設僅提供動態版 busybox,若系統缺乏靜態可執行檔,則需要採取其他方法。
作者進一步說明,若無靜態 busybox 可用,可透過 bash 內建功能進行救援。一種方法是利用 bash 的內建指令下載必須的檔案,並且透過覆寫已存在的可執行檔(例如用 cp 指令建立 busybox 的複本)來恢復系統功能。若連 bash 都不可用,則可以藉由多數 shell 內建的 printf 指令,轉換八進位字面值來重構二進位檔,從而達成系統恢復的目的。
此外,文章也提供了一個更進階的解決方法,說明如何利用 C 程式建立一個極小型的 ELF(Executable and Linkable Format,Linux 執行檔格式)程式,其功能僅限於從標準輸入拷貝到標準輸出。透過 gcc(GNU Compiler Collection,GNU 編譯器集)搭配 -Os 及其他最佳化參數,將編譯出來的二進位檔縮小至不到 1KB,再利用 Python 將該檔案轉換為一系列 printf 指令,以便透過 SSH 會話直接重現該程式。部分討論中,技術高手分享了他們遇過類似狀況時的經驗,並補充建議平時應預先安裝靜態版 busybox,以及在生產環境中設置備援機制,以防止意外刪除關鍵共享庫,從而提高系統的容錯性。
👥
55 則討論、評論 💬
https://news.ycombinator.com/item?id=43444160