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

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

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

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

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

Советуйте... спасибо!

9
задан 20.03.2017, 12:17

3 ответа

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

От man 5 acl:

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

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

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

Для установки его (изменяют устройство, каталоги, и т.д., соответственно):

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

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

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

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

5
ответ дан 07.12.2019, 13:32

Я могу предложить обходное решение: Сделайте отдельный каталог "отбрасывания", выполните отдельное мини-задание туда, которое исправляет полномочия и затем перемещает файлы в каталог данных приложения. Можно использовать incron для этого, таким образом, не было бы фактически никакой значимой задержки.

1
ответ дан 07.12.2019, 13:32

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

  • umask, который Вы не хотите использовать
  • обертка программы, которая устанавливает umask того приложения, не пользователя
  • крон, как @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" было бы самым простым.
1
ответ дан 07.12.2019, 13:32

Теги

Похожие вопросы