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