使用帶有通配符的 sudo 從 root 擁有的目錄中刪除文件

使用帶有通配符的 sudo 從 root 擁有的目錄中刪除文件

假設我有一個/var/log/nginx受保護的資料夾(由 root 使用者擁有,其他人無法讀取或寫入該資料夾)。即使使用 sudo,我也不能不sudo rm -f /var/log/nginx/ab*得到“沒有這樣的文件或目錄”。我是否必須實際加載 root shell 才能執行此操作,或者有其他方法嗎?

答案1

原因

shell 解釋並擴展任何全域字元(通配符),例如星號。該命令的這種解釋發生在目前 shell 中(在sudo執行該命令之前),該 shell 沒有該目錄的讀取權限。由於目前 shell 無法找到與 glob 模式相符的文件,因此不會執行路徑名擴展,並且 shell 將rm-f、 和/var/log/nginx/ab*(帶有文字星號)作為命令的參數傳遞sudo

sudo命令依序啟動rm嘗試刪除路徑為/var/log/nginx/ab*(星號是 Unix 檔案名稱的合法字元)的檔案的命令。由於這樣的文件實際上並不存在,因此它會報告失敗。對 GNU 來說rm,這個錯誤訊息是明確的;這滿的下面的錯誤訊息表示要刪除的(單一)檔案不存在:

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

解決方案

解決方案是以超級使用者身分啟動新的 shell,並具有執行檔案名稱擴充所需的權限:

sudo bash -c "rm -f /var/log/nginx/ab*"

上面的命令啟動一個以 root 身分執行的新 shell,並且該-c選項用於傳遞要由 shell 執行的命令。由於該命令被引用,因此當前 shell 不會解釋星號,而是會原樣傳遞給新的根 shell,從而允許它在啟動命令之前擴展路徑名rm

答案2

這要么是您的檔案名稱有問題,要么是檔案名稱中可能存在空格。

因此請嘗試以下解決方法:

  1. 嘗試使用前綴--來表示選項的結束,例如:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. 使用find

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. 如果您認為您的檔案在 Linux 上受到保護,請先嘗試刪除保護:

    chattr -i ab*
    

相關內容