Установка разрешений по умолчанию для вновь созданных файлов и подкаталогов в каталоге в Linux?


99

У меня есть несколько долго работающих скриптов и приложений, которые хранят выходные результаты в каталоге, доступном нескольким пользователям. Мне нужен способ убедиться, что каждый файл и каталог, созданные в этом общем каталоге, автоматически имеют u=rwxg=rwxo=rразрешения.

Я знаю, что могу использовать umask 006в начале свои различные сценарии, но мне не нравится такой подход, поскольку многие пользователи пишут свои собственные сценарии и могут забыть установить маску самостоятельно.

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

Обновление : я думаю, что это можно сделать с помощью списков ACL POSIX , используя функциональность ACL по умолчанию, но на данный момент это все немного выше моей головы. Если кто-нибудь может объяснить, как использовать списки ACL по умолчанию, он, вероятно, хорошо ответит на этот вопрос.


1
ACL POSIX хороши, однако на хороших 60% машин, с которыми вы сталкиваетесь, они не включены для определенных файловых систем, в зависимости от дистрибутива. Вот очень хорошее введение и пример: suse.de/~agruen/acl/linux-acls/online
Tim Post

1
Вы имеете в виду тот же документ, который я связал :) У меня еще не было изменений, чтобы прочитать его, но спасибо, что подняли голову по проблеме доступности.
Дэвид Дин,

1
Ссылка в комментарии Тима Поста кажется мертвой, но благодаря Интернет-архиву я мог просмотреть ее и убедиться, что vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html содержит точно такой же документ. Отредактирую вопрос, чтобы обновить ссылку.
rmunn

Ответы:


78

Чтобы получить право владения, вы можете установить бит setuid группы в каталоге с помощью

chmod g+rwxs dirname

Это гарантирует, что файлы, созданные в каталоге, принадлежат группе. Затем вы должны убедиться, что все работают с umask 002 или 007 или чем-то в этом роде - вот почему Debian и многие другие системы Linux по умолчанию настроены с группами для каждого пользователя.

Я не знаю способа принудительно установить нужные разрешения, если umask пользователя слишком сильный.


23
На самом деле это не решение - он спрашивает о разрешениях, а не о владении, и единственный способ сделать это - с помощью списков контроля доступа
Ярин

3
«... убедитесь, что все работают с umask 002 или 007, или чем-то в этом роде» - это немного натянуто .... Как сделать так, чтобы Postfix, Dovecot, Clam и Spam Assassin все это делали?
jww 03

2
Что делает эта +sчасть? Спасибо.
tommy.carstensen

1
В данном случае это означает установить ID группы. То есть мы используем g + s для установки бита SGID. Я говорю «в этом случае», потому что + s был объединен с g для группы. + s также можно использовать для установки бита SUID (setuid).
Bastion

57

Вот как это сделать с помощью списков ACL по умолчанию, по крайней мере, в Linux.

Во-первых, вам может потребоваться включить поддержку ACL в вашей файловой системе. Если вы используете ext4, то он уже включен. Другие файловые системы (например, ext3) необходимо смонтировать с aclопцией. В этом случае добавьте параметр в свой /etc/fstab. Например, если каталог находится в вашей корневой файловой системе:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Затем перемонтируйте его:

mount -oremount /

Теперь используйте следующую команду, чтобы установить ACL по умолчанию:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Все новые файлы /shared/directoryтеперь должны получить желаемые разрешения. Конечно, это также зависит от приложения, создающего файл. Например, большинство файлов не будет выполняться кем-либо с самого начала (в зависимости от аргумента режима для вызова open (2) или creat (2)), как и при использовании umask. Некоторые утилиты, такие как cp, tarи, rsyncбудут пытаться сохранить разрешения исходного файла (ов), которые будут маскировать ваш ACL по умолчанию, если исходный файл не был доступен для групповой записи.

Надеюсь это поможет!


Кажется, что это все еще требуется umaskдля всех пользователей. = / unix.stackexchange.com/questions/71743/…
анатолий техтоник

1
@techtonik Как я уже писал, это зависит от приложения, создающего файл. Например, если вы используете, cpто он попытается скопировать разрешения исходного файла. Даже не umaskпомогает при использовании cp. Я видел такую ​​же проблему с tar. См. Этот вопрос .
pelle

@techtonik Я добавил предложение об этом в свой ответ.
pelle

1
да, похоже, проблема заключалась в том, что приложение принудительно установило права на 644, когда мои настройки ACL и POSIX были полностью для 664. Было бы неплохо разъяснить этот резервный механизм для людей, устраняющих проблему. Многие даже не знают об этом umask.
анатолий техтоник

Я имею в виду, что я потратил некоторое время, пытаясь проверить, правильно ли установлены флаги монтирования (а на ext4 они не могут быть установлены, потому что кажется, что они работают автоматически). Нет информации, как проверить, если ... setfacl works correctlyЯ предполагаю, что он должен потерпеть неудачу, но я не уверен, потому что ответ упускает этот момент.
анатолий техтоник

4

Это некрасиво, но вы можете использовать команду setfacl для достижения именно того, чего хотите.

На машине Solaris у меня есть файл, содержащий ACL для пользователей и групп. К сожалению, вам нужно перечислить всех пользователей (по крайней мере, я не мог найти способ заставить эту работу иначе):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Назовите файл acl.lst и введите свои настоящие имена пользователей вместо user_X.

Теперь вы можете установить эти ACL в своем каталоге, выполнив следующую команду:

setfacl -f acl.lst /your/dir/here

можно ли исключить список пользователей, если они все являются членами одной группы, и просто использовать разрешения группы?
Дэвид Дин,

Я задавал себе тот же вопрос. Прошло много времени с тех пор, как я это настраивал. Но каждый раз, когда у меня появляется новый пользователь (в той же группе, что и другие), я забываю обновить список и получаю жалобы на то, что новый пользователь не может записывать / удалять файлы. Итак, ответ: нет, нельзя.
innaM

4

в вашем сценарии оболочки (или .bashrc) вы можете использовать что-то вроде:

umask 022

umask - это команда, определяющая настройки маски, которая определяет, как устанавливаются права доступа к вновь создаваемым файлам.


1
Это неверно, потому что umask ограничивает разрешения, которые не может добавлять разрешения
ACV

@ACV вы можете уточнить? Это работает для меня, недавно созданные файлы теперь позволяют членам группы иметь разрешения rw, когда я это делаю umask 002в моем .bashrc.
Arthur Dent

3
@ArthurDent umask 002ограничивает доступ для других, оставляя группу без изменений. Помните, это ugo- это другие группы пользователей. Также помните, что umask в основном означает вычитание из значений по умолчанию. Для файлов: 666 - 002будет означать 664, что означает, что группа не затронута.
ACV
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.