需要 sudo 刪除文件,但仍允許寫入

需要 sudo 刪除文件,但仍允許寫入

我已經將所有文件放在伺服器突襲中,並且它具有相當過量的空間,因此我不需要經常刪除任何內容。

我仍然一直在向 raid 寫入內容,所以我不想使用 sudo 來執行此操作。但是否可以設定權限,允許寫入但不允許刪除檔案?

我認為這還需要我使用 sudo 來執行 mv 命令,但這不是問題

額外資訊:

Raid使用btrfs raid1

作業系統位於單獨的磁碟機上(Ubuntu 14.04 伺服器)

答案1

您需要目錄寫入權限才能建立或刪除檔案。您需要檔案寫入權限才能變更檔案。

考慮這棵樹:

FolderA: (no write permissions for you)
   - FileX (write permissions)
   - FileY (write permissions)

現在您可以更改 FileX 和 FileY,但無法刪除它們。您也不能在FolderA 中建立FileZ。

答案2

我認為這是不可能的。 Unix 中的檔案建立和刪除是透過寫入目錄的能力來控制的——基本上是相同的標誌。

現在您可以做的是建立兩個目錄—一個具有寫入權限,另一個僅限 root 使用者。

[romano:~/tmp/test] % ls -l
total 8
drwxrwxr-x 2 romano romano 4096 Oct  8 18:06 normal
drwxrwxr-x 2 root   root   4096 Oct  8 18:06 onlyroot

您通常從事normal.假設你有:

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt

您可以清楚地刪除文件並建立新文件;假設您想要保護“ one.txt”不被刪除。您可以做的是在以下位置創建指向它的硬連結onlyroot

[romano:~/tmp/test/normal] 1 % sudo ln one.txt ../onlyroot

這將為one.txtin創建另一個名稱onlyroot(使用可忽略不計的空間;不會複製文件)。現在,作為普通用戶,您可以刪除one.txtnormal資料夾,但該資料夾下方將有一個不可觸及的版本onlyroot

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt
[romano:~/tmp/test/normal] % rm one.txt
rm: remove regular empty file ‘one.txt’? y
[romano:~/tmp/test/normal] % cd ..
[romano:~/tmp/test] % cd onlyroot 
[romano:~/tmp/test/onlyroot] % ls
one.txt
[romano:~/tmp/test/onlyroot] % rm one.txt 
rm: remove regular empty file ‘one.txt’? y
rm: cannot remove ‘one.txt’: Permission denied

答案3

據我了解(基於https://btrfs.wiki.kernel.org/index.php/Project_ideas#RichACLs_.2F_NFS4_ACLS),btrfs 僅支援傳統的 Unix 權限和 POSIX.1e ACL,因此無法執行您想要的操作。

許多/大多數其他檔案系統至少支援 Linux richacls(我認為尚未在主線中)、NFSv4 ACL、ZFS ACL 或 Windows ACL 之一,所有這些都允許您明確拒絕“刪除”,但我不會這樣做想像不到您會願意為此放棄btrfs 的功能。

另一方面,由於您特意這樣做是為了防止簡單錯誤,因此您最好利用 btrfs 的快照功能(例如 autosnap)。

答案4

我認為一種解決方案是在您的 中建立一個函數bashrc,例如:

sudowrapper () { 
sudo -k;sudo "$@";sudo -K; 
}

vimf() {
    echo "pass" | sudowrapper -S nvim "$1"
}

sudowrapper每次呼叫時都需要sudo忘記憑證,否則會產生奇怪的行為。vimf

只有當您想避免自己做錯事時才執行此操作,如果您的目標是防止他人做壞事,那麼寫入密碼.bashrc是一個壞主意。

相關內容