我把所有文件都存储在服务器突袭中,并且它具有相当大的空间,因此我通常不需要删除任何内容。
我仍然需要一直将某些内容写入 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.txt
in创建另一个名称onlyroot
(占用极小的空间;文件不会被复制)。现在,作为普通用户,您可以one.txt
在normal
文件夹中删除文件,但在该文件夹中您将拥有一个不可触碰的版本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
不是一个好主意。