Требовать sudo для удаления файлов, но при этом разрешить запись

Требовать sudo для удаления файлов, но при этом разрешить запись

Все мои файлы размещены на рейд-сервере, и там довольно много места, поэтому мне нечасто придется что-либо удалять.

У меня все еще есть вещи, которые постоянно пишут в raid, поэтому я не хочу использовать sudo для этого. Но возможно ли установить разрешения так, чтобы запись была разрешена, а удаление файлов нет?

Я предполагаю, что это также потребует от меня использования sudo для команд mv, но это не проблема.

Дополнительная информация:

Рейд использует btrfs raid1

ОС находится на отдельном диске (сервер Ubuntu 14.04)

решение1

Для создания или удаления файлов вам нужны права на запись в каталог. Для изменения файла вам нужны права на запись в файл.

Рассматривая это дерево:

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

Теперь вы можете изменить FileX и FileY, но не можете удалить их. Также вы не можете создать FileZ в FolderA.

решение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.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, и, следовательно, не может делать то, что вам нужно.

Многие/большинство других файловых систем поддерживают по крайней мере один из списков 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— плохая идея.

Связанный контент