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


9

Мой вопрос похож на Как установить права доступа к файлам по умолчанию для ВСЕХ вновь созданных файлов в Linux - но отличается по-разному:

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

Обоснование: рассматриваемый каталог является «приемным бункером» для приложения. Пользователи в группе помещают файлы в каталог, а приложение (работающее под другим идентификатором пользователя в той же группе) берет их и обрабатывает их. Проблема заключается в том, что владельцем каждого файла, размещенного в каталоге, является пользователь, который разместил его там, а разрешения по умолчанию имеют значение «rw-r - r--»; Я хочу изменить это на "rw-rw ----". Приложение, выполняющее получение, не может сделать это явно, потому что идентификатор пользователя, под которым выполняется приложение, не владеет рассматриваемым файлом, а разрешения по умолчанию не позволяют приложению выполнять chmod для файла! Очевидно, что пользователь может выполнить команду chmod после помещения файла туда, но я хочу, чтобы «сброс» пользователем был как можно более простым. (Эти люди не Linux-грамотны,

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

Пожалуйста, посоветуйте ... спасибо!

Ответы:


5

Вы можете использовать ACL (список контроля доступа), чтобы установить разрешения по умолчанию для файлов в каталоге.

От man 5 acl:

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

  1. Новый объект наследует ACL по умолчанию для содержащегося каталога в качестве ACL доступа.

  2. Записи ACL доступа, соответствующие битам разрешений файла, модифицируются таким образом, что они не содержат разрешений, которые не содержатся в разрешениях, указанных параметром mode.

Чтобы настроить его (сменить устройство, каталоги и т. Д. Соответственно):

Отредактируйте ваш /etc/fstabфайл и добавьте aclопцию монтирования.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Перемонтируйте ( справочную mount.cifsстраницу Samba ) свою файловую систему, перезагрузившись или воспользовавшись:

mount -o remount,acl /home

Убедитесь, что у вас есть setfaclи getfaclутилиты.

Установите ACL по умолчанию для каталога (вам также может понадобиться установить ACL для существующих файлов):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Смотрите связанный учебник для получения дополнительной информации.

Источник: учебник, часть 1 и часть 2

Справка: списки контроля доступа POSIX в Linux


Я не думаю, что вы должны добавить aclв качестве опции в mountкоманде, когда вы добавили его в /etc/fstab. Это будет избыточно, и когда вы запустите mountкоманду в своем ответе, вы получите такой вывод: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(см. acl,aclВ конце). Пожалуйста, исправьте это, если я не ошибаюсь.
its_me

1

Я могу предложить обходной путь: создайте отдельный каталог «drop», запустите отдельный minijob, который фиксирует разрешения, а затем перемещает файлы в каталог данных приложения. Вы можете использовать incron для этого, чтобы практически не было заметной задержки.


1

Я могу придумать четыре возможных способа сделать это:

  • Umask, который вы не хотите использовать
  • программная оболочка, которая устанавливает маску этого приложения, а не пользователя
  • cron, как описал @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;Различные системы имеют улучшения производительности (например, -exec+опция)
  • настройки на основе каталогов, которые требуют небольшого программирования оболочки, но в основном оболочка при установке приглашения или вызова cd изменит umask, если в этом каталоге присутствует файл точек (или, возможно, каталог предков); для Баш, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"было бы самым простым.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.