使用 sudo 或以 root 身分刪除資料夾之間的區別

使用 sudo 或以 root 身分刪除資料夾之間的區別

今天,我注意到使用 sudo 或以 root 身分執行命令之間有一個有趣的區別。

使用 sudorm -rf /opt/nextcloud/*不會刪除資料夾

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

當我第一次成為root然後執行命令時,資料夾被刪除

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

為什麼是這樣?使用 sudo 刪除資料夾的正確方法是什麼?

答案1

該命令sudo rm -rf /opt/nextcloud/*由以普通使用者身分執行的 shell 解釋。 shell甚至在運行*之前就嘗試擴展sudo。如果由於某種原因*無法擴展,則命令變為:

  • 要麼sudo rm -rf /opt/nextcloud/*where sudo(and then rm) 得到/opt/nextcloud/*字面量*,並且不會發生進一步的擴展;這是 POSIX 行為;/opt/nextcloud/*顯然不存在。
  • sudo rm -rf在某些情況下(例如在 Bash 中nullglob設定該選項時)。

還有其他可能性(例如failglob在 Bash 中進行比較),但它們似乎與您的情況不匹配。

無論如何,-f選項rm變得相關。它的意思是

-f
不提示確認。在沒有檔案運算元或運算元不存在的情況下,不要寫入診斷訊息或修改退出狀態。 […]

來源

實際上,您提供了“不存在的操作數”或“無檔案操作數”,因此該命令不執行任何操作並默默地成功。


我的假設是非提升的 shell 無法擴展,/opt/nextcloud/*因為普通用戶沒有/opt/nextcloud/.另一種可能性是您輸入錯誤/opt/nextcloud/*,但沒有發現這一點,因為沒有錯誤訊息。沒有錯誤訊息,因為這就是rm -f工作原理。

sudo ls /opt/nextcloud/不涉及外殼的擴展。該命令ls以 root 身份運行。它ls本身可以存取指定的目錄及其內容,因此它可以工作。

sudo su -當你進入以 root 身分執行的 shell後。該外殼能夠擴展/opt/nextcloud/*,因此可以rm -rf /opt/nextcloud/*按您的預期工作。

相關內容