
我經常使用 dd 。我一直擔心有一天會犯錯誤,例如在 sda(電腦磁碟)而不是 sdb(USB 磁碟)上寫入,然後擦除電腦上的所有內容。
我知道 dd 應該是一個高級用戶工具,但對我來說,按錯鍵基本上可以搞砸整個計算機,這對我來說沒有意義。
為什麼沒有一種安全措施來阻止 dd 寫入它從中獲取命令的磁碟?不知道怎麼會有人故意這樣做。
請注意,我自己沒有嘗試過,我只是讀到它,所以我可能是錯的。
答案1
我知道 dd 應該是一個高級用戶工具,但對我來說,按錯鍵基本上可以搞砸整個計算機,這對我來說沒有意義。
考慮一下土木建築中使用的電動工具的種類,以及如果做錯一件小事可能會搞砸什麼。這些事情可以變得更容易預防嗎?可能吧,但平衡點是在多大程度上使事故更容易預防,從而使該工具變得不那麼有用和/或更尷尬。
駕駛汽車是一個類似的類比,可能會帶來更可怕的後果,但人類一直在設法做到這一點(事實上,太多了)。當然,如果他們做得慢一些會比較安全,但我們共同決定哪些風險值得冒。同樣,如果計算機dd
不存在的話,它會更安全,但由於它的實用性被認為大於它的風險,所以它確實存在。
為什麼沒有一種安全措施來阻止 dd 寫入它從中獲取命令的磁碟?
事實上是有的,因為預設情況下設備檔案(例如/dev/sda1
)需要超級使用者權限才能寫入。因此,除非您正在使用 asroot
或 via sudo
,否則您實際上無法使用 .NET 一鍵搞砸整台電腦dd
。
這讓我們想到為什麼有關於使用超級用戶權限運行命令的所有警告。 這些警告非常普遍,我認為在沒有看到它們的情況下很難最終操作 *nix 系統,有點像進入建築區而不注意到安全帽區跡象。
如果您沒有理由進入建築區,請離開。如果這樣做,請採取適當的安全預防措施。世界可能是一個危險的地方,有些地方比其他地方更危險。不要不假思索地行動。確保不會發生任何壞事的某種程度的安全性——因此您不必費心思考——意味著您也無能為力。有時這是可取的,有時卻不是。
答案2
有理由問為什麼 dd 命令不先檢查其目標是否包含已安裝的檔案系統,然後提示確認或需要特殊標誌。一個簡單的答案是,它會破壞任何希望能夠以這種方式使用 dd 的腳本,而這些腳本不是為處理互動式輸入而設計的。例如,在安裝原始設備的分割區時修改該設備的分割表可能是合理的;您只需要小心,只修改第一個磁區。
市面上有大量的 Linux 系統,我們不可能知道人們想出了什麼樣的瘋狂設定。因此 dd 的維護者不太可能做出向後不相容的更改,從而導致未知數量的環境出現問題。
答案3
若要“新增一個小步驟,例如選項或確認訊息”,您可以執行 artm 在問題評論中建議的操作:使用包裝腳本。
換句話說,與其直接處理有點令人畏懼的 dd 命令列參數,不如在 bash(或 Python 等)中創建一個腳本,使用您感興趣的選項語法來獲取您感興趣的 dd 參數。此腳本檢查參數是否合理,並列印出參數(可能還有最終的 dd 命令列),以便您可以驗證一切是否都應如此。然後腳本會詢問您“確定繼續嗎?[y/N]”,因此y
如果您希望腳本實際運行為您構建的 dd 命令行,則必須輸入。
因此,如果您不想讓腳本寫入 /dev/sda 或其分割區,您可以使其無法執行此操作。為了幫助您驗證是否確實選擇了所需的輸入和輸出設備,該腳本可以使用 blkid 命令來取得這些設備的 UUID 和磁碟標籤。 ETC。