Зробіть усі нові файли в каталозі доступними для групи


131

Припустимо, у мене є два користувачі Аліса та Боб, група GROUPNAME та папка foo, обидва користувачі є членами GROUPNAME (використовуючи Linux та ext3).

Якщо я збережу як користувач Алісі файл під foo, дозволу є: -rw-r--r-- Alice Alice. Однак, чи можна досягти того, щоб кожен файл, збережений у якомусь підкаталозі, fooмає дозволи -rwxrwx--- Alice GROUPNAME(тобто власник Аліса, група GROUPNAME)?


Відповіді:


91

Ви можете контролювати призначені біти дозволу з umask, а група, зробивши каталог setgid в GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Зверніть увагу, що ви повинні робити chgrp/ chmodдля кожного підкаталога; він не розповсюджується автоматично (тобто, ні існуючі, ні згодом створені каталоги в каталозі setgid не будуть встановлені жорстко , хоча останні будуть у групі GROUPNAME).

Також зауважте, що umaskце атрибут процесу і застосовується до всіх файлів, створених цим процесом, та його дітей (які успадковують umaskдію, що діє у свого батьківського fork()часу). Користувачам може знадобитися встановити це ~/.profile, і вони можуть стежити за речами, не пов'язаними з вашим каталогом, які потребують різних дозволів. Модулі можуть бути корисні, якщо вам потрібні різні налаштування, коли ви робите різні речі.

Ви можете керувати речами трохи краще, якщо ви можете використовувати POSIX ACL; повинно бути можливість вказати і маску дозволу, і групу, і дозволити їм розмножуватися. Підтримка POSIX ACL дещо мінлива.


6
Підкаталоги, створені після встановлення setgid у батьківському каталозі, матимуть setgid автоматично.
Arrowmaster

2
@Arrowmaster: на деяких системах, можливо, але не у всіх; Я тестував на OSX, і він не поширюється, принаймні для не-root.
geekosaur

2
У Debian (і я вважаю, що в більшості інших дистрибутивів Linux) поширюється і назва setgid, і назва групи.
Arrowmaster

3
В OS X заданий біт в каталозі просто ігнорується; нові файли та каталоги завжди надаються групі, що містить каталог.
Джон Плоскість

Чи можливо також, що файли, скопійовані або переміщені у foo (за допомогою cp відповідно. Mv), автоматично отримують потрібні дозволи ( -rwxrwx--- A G)?
студент

106

Якщо це можливо, використовуйте списки контролю доступу (ACL) .

У Linux переконайтеся, що файлова система, яку ви використовуєте, підтримує ACL (це робить більшість файлів Unix). Можливо, вам потрібно буде змінити параметри кріплення, щоб увімкнути ACL: з ext2 / ext3 / ext4 вам потрібно буде чітко вказати параметр aclкріплення, тому запис /etc/fstabповинен виглядати таким чином /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Запустіть, mount -o remount,acl /щоб активувати ACL без перезавантаження. Також встановіть інструменти командного рядка ACL getfaclі setfacl, як правило, надаються в пакеті під назвою acl.

Тепер, коли одноразове налаштування закінчилося, змініть ACL каталогу, щоб надати групі дозволу на запис і зробити ці права успадкованими новоствореними файлами. Під Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Якщо списки управління доступом не варіант, зробити каталог , що належить групі GROUPNAME, і встановити права доступу до 2775 або 2770: chmod g+rwxs /path/to/directory. sТут означає setgid біт; для каталогу це означає, що файли, створені в цьому каталозі, належатимуть до групи, якій належить каталог.

Вам також потрібно встановити Алісу та убиск Боба, щоб за замовчуванням усі їхні файли були доступними для запису. Типовий umask у більшості систем - 022, тобто файли можуть мати всі дозволи, крім запису по групі та ін. Змініть це на 002, це означає забороняти лише дозвіл на запис іншим. Зазвичай ви ставите це налаштування у своєму ~/.profile:

umask 002    # or 007 to have files not readable by others

6
+1 - Дуже ретельна відповідь. Я ніколи не знав, що можна перераховувати / на ходу. Добре знати.
boehj

1
Команда setficl -d не працює для мене, оскільки файли, що містяться в цьому каталозі, мають маску r--, яка заперечує будь-які дозволи на запис. Дуже хотів би допомогти. Дивіться unix.stackexchange.com/questions/71743/…
Бен Макканн

2
@its_me Q1: Я показую mountкоманду з remountопцією, тому вона не використовується fstab. Втричі aclдвічі означає, що файлова система вже була змонтована з aclопцією, і вона нешкідлива. до речі, за acl промовчанням ext4 в останніх ядрах, до речі, патч був ще зовсім новим, коли я писав цю відповідь. Q2: Ви можете запускати команди в будь-якому порядку.
Жиль

1
@its_me Так, ваше розуміння правильне, це просто неважливо, в якому порядку ви додасте записи
Gilles

8
ви повинні вдосконалити відповідь, а потім використовувати GROUPNAMEзамість G, щоб зробити це більш зрозумілим
knocte

24

Це питання добре підходить для Linux acl. Оскільки ви не заявляєте свою ОС, я припускаю Linux у наступному. Ось приклад сесії.

Я не знаю дійсно хорошого aclпідручника, але ви можете зробити гірше, ніж http://www.vanemery.com/Linux/ACL/linux-acl.html

Зауважте, що за замовчуванням aclповодиться як локальний umask. Оскільки принаймні в Linux умаски застосовуються в усьому світі, це єдиний спосіб, який я знаю, щоб отримати ефект локальної умаски. Чомусь це маловідома особливість. Мережа заповнена людьми, які запитують про перебір місцевого умаску, але майже ніхто не думає використовувати acl.

Також зауважте, що вам потрібно змонтувати розділ, в якому ви працюєте, з aclпідтримкою, наприклад.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Сесія наступна:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Встановіть групу , fooщоб бути staff, і встановити ACL групи і користувача fooдо rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Установіть також типи acls користувача та групи rwx. Це визначає дозволи, від яких успадковують файли та каталоги foo. Таким чином, всі файли та каталоги, створені під foo, матимуть групові дозволи rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Тепер створіть деякі файли fooяк користувачі faheemта john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Список файлів. Зауважте, що як файли, що належать, так faheemі файли, які належать john, створюються з груповими дозволами rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.