Назад | Перейти на главную страницу

Linux: потеря группового владения файлами

У меня есть проект с несколькими файлами, которые я создал в Linux.

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

Типичный файл теперь имеет следующие разрешения:

-rw-rw-r--  1 phil dev   5617 Jul 14 15:45 profile.html

Однако, когда я редактирую файл profile.html, он возвращается ко мне вот так, и мой коллега теряет возможность редактировать.

-rw-rw-r--  1 phil phil  5617 Jul 14 15:45 profile.html

Как мне избежать такого возврата? Смена владельца - неправильный поступок? Или это было сделано с неправильными вариантами? Или это связано с конфигурацией моего редактора (emacs)?

В содержащей папке вы хотите изменить группу на dev, а затем использовать отметку set-gid.

chgrp dev <containing-folder>
chmod g+ws <containing-folder>

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

Вы можете использовать бит setgid в каталоге для сохранения групповой собственности детей.

chown :dev directory/
chmod g+s directory/

Вы также можете смонтировать файловую систему (при условии, что ext2 / 3) с параметром монтирования grpid, который сделает так, что всякий раз, когда вы создаете новый файл в каталоге, владелец группы будет таким же, как и родительский каталог. Тогда вы просто сделаете так, чтобы каталог, в котором существуют эти файлы, принадлежал группе «dev».

Чтобы перемонтировать его, если это корневой раздел (пример):

sudo mount -o remount,grpid,rw,relatime,errors=remount-ro /

Из "man Mount 8":

grpid or bsdgroups / nogrpid or sysvgroups
These options define what group id a newly created file gets.

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

По умолчанию emacs создает файл резервной копии путем переименования. Из руководства emacs:

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

Есть несколько способов изменить это.

  • Установите группу и липкую часть, как описывают другие.
  • Запустите newgrp dev перед редактированием файла, чтобы ваша группа по умолчанию была dev.

Или специфичные для emacs:

  • Установите флаг файла в emacs, который изменяет поведение для сохранения группы, но имеет другие побочные эффекты.
  • Установите резервное копирование путем копирования при несоответствии в emacs, который использует копирование, а не переименование, когда это может привести к смене владельца или группы.

Итак, добавьте в свой .emacs:

(setq backup-by-copying-when-mismatch 't)

На самом деле я предпочитаю 'newgrp dev', поскольку это явный переход из «личного» режима (файлы, которые я редактирую, принадлежат только мне), в режим группового разработчика (файлы, которые я сейчас редактирую, совместно используются группой).