Хороший и простой способ обмениваться файлами на локальном компьютере

13

Я хотел бы иметь каталог, который имеет следующие свойства:

  • Многие пользователи могут копировать файлы в него
  • Эти файлы могут быть удалены / изменены этими пользователями (пользователь А может удалить / изменить файл, который был скопирован в этот каталог)

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

Вот что я нашел в сети:

Некоторые варианты использования:

  • Обмен музыкой на локальной машине
  • Простое совместное использование репозитория git (просто сделайте пустой репозиторий доступным для записи для многих людей) --- я знаю, что есть решения, такие как gitosis
  • Разрешить многим разработчикам изменять тестовый экземпляр приложения php без предоставления им прав root (я полагаю, они будут копировать файлы) - я возглавляю команду некоммерческих младших разработчиков, и мне нужно сделать это простым!

РЕДАКТИРОВАТЬ

AFAIK установка SGID бит не достаточно, он влияет только на вновь созданные файлы --- и основной рабочий процесс для этих случаев использования ivnolves копирование и другие операции (которые удаляют gid файла без изменений)

ДБ.
источник

Ответы:

9

Списки контроля доступа

Прямой ответ - списки контроля доступа (ACL) . Да, вы можете найти контрпример, но они достаточно хороши на практике (в отличие от простой записи в группе, которая требует, чтобы пользователи постоянно об этом думали). Они требуют, чтобы системный администратор (root) определил группы, если вы хотите, чтобы файлы были доступны только именованной группе (root может делегировать, например, принимая группы из LDAP, но это другая история).

Вам необходимо, чтобы участвующие пользователи имели umask 022. Если они регулярно создают файлы, не предназначенные для чтения, эта схема не будет работать. Но если у них есть ограничительный umask, вероятно, потому что они не хотят делиться файлами в любом случае.

Включение ACL

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

UUID=5e1ec7ed-face-dead-beef-c011ec7ab1e5  /  ext4  errors=remount-ro,acl  0 1

Чтобы опция вступила в силу в первый раз, используйте команду, подобную следующей (для каждой файловой системы):

sudo mount -o remount,acl /

Установите инструменты ACL из aclпакета.

Настройка общего каталога

Чтобы файлы были доступны группе mygroup:

setfacl -m group:mygroup:rwx /path/to/shared/root
setfacl -d -m group:mygroup:rwx /path/to/shared/root

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

Если у вас нет группы Unix, вы можете добавлять пользователей по одному:

setfacl -m user:bob:rwx /path/to/shared/root
setfacl -d -m user:bob:rwx /path/to/shared/root

Контроль версий

Если вы хотите, чтобы люди могли редактировать файлы на месте, вам также нужно что-то предотвратить конфликты редактирования. Это контроль версий.

Вам не нужно ничего из этого, чтобы поделиться репозиторием git. Вы знаете, что есть решения, такие как Gitosis, так что используйте их.

Жиль "ТАК - прекрати быть злым"
источник
ACL работал бы отлично, если бы автоматическое наследование не было нарушено cp (и mv?), Который отбрасывает (игнорирует) набор acl по умолчанию, установленный на уровне целевого каталога.
полезно
2

Просто сделайте это:

mkdir /src/teamA
addgroup teamA
chgrp teamA /src/teamA
chmod g+rws /src/teamA

Теперь каждый в teamAгруппе может сделать все внутри/src/teamA

Магия - это бит sgid (set group id) в каталоге.

shellholic
источник
AFAIK это не будет работать, смотрите обновленный пост
JB.
1

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

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

Вкратце, вы бежите

sudo bindfs -o perms=0700,mirror-only=user1:user2:user3 /home/shared /home/shared

сделать / home / shared доступным для user1, user2 и user3.

инструкции

См. Bindfs-SharedDirectoryLocalUsers (документация по Ubuntu) для получения подробных инструкций, включая постоянную настройку (каждый раз, когда вы включаете компьютер). Я использую это на своей собственной машине для нескольких каталогов, каждая из которых имеет разные группы общего доступа (одна папка доступна для всех учетных записей, другая - только для рабочих учетных записей, другая - только для личных учетных записей).

Из поста:

bindfs - это файловая система FUSE для монтирования каталога в другое место (точку монтирования) с настройками разрешений. Это позволяет вам указать владельца и права доступа к файлам внутри точки монтирования.

...

Основное преимущество заключается в том, что новые файлы, созданные в общей папке, будут наследовать права владения и разрешения.

Списки контроля доступа (ACL)

Примечания к документации:

Если вы хотите установить более расширенные разрешения для разных пользователей и / или групп, попробуйте Списки контроля доступа .

См. Ответ Жиля для более подробной информации.

david.libremone
источник
если у вас возникают проблемы с добавлением bindfs в oneiric, вы можете получить созданные пользователем пакеты здесь bugs.launchpad.net/ubuntu/+source/bindfs/+bug/851600
david.libremone
-3

Вы можете объединить решение Shellholic с заданием cron, которое обновляет gid для всех файлов в этой папке каждые 15 секунд или что-то подобное.

Дэвид Онеилл
источник