需要 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 的功能。

另一方面,由于您专门打算用它来防止简单错误,因此最好使用类似 autosnap 的功能来充分利用 btrfs 的快照功能。

答案4

我认为一个解决方案就是在您的中创建一个函数bashrc,例如:

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

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

sudowrapper每次调用时都需要sudo忘记凭据,否则会出现奇怪的行为。vimf

只有当您想避免自己做错事时才这样做,如果您的目标是防止他人做坏事,那么写下您的密码.bashrc不是一个好主意。

相关内容