Как изменить разрешения Unix, когда я не владею файлом, но у меня есть разрешение на запись в каталог?
Я использую репозиторий git с коллегой, и поскольку git не распространяет полную полноту разрешений на файлы Unix, у нас есть "hook", который выполняется при обновлении, которое устанавливает "другие" разрешения как они должны быть установлены. Проблема? Крючок использует chmod
, и получается, что когда мой коллега совершает файл, он владеет им, поэтому я не могу запустить chmod
на нем и наоборот. Каталоги все записываются на группы, липкие, поэтому я считаю, что любой из нас имеет право удалить любой файл и заменить его одним и тем же именем, одним и тем же содержимым, но с другим правом собственности. Предположительно тогда мы могли бы chmod
его. Но это похоже на ужасно большой молот, и я немного нагло накручиваю его. Итак, два вопроса:
-
Кто-нибудь может подумать о другом способе сделать это?
-
Если нет, то какой лучший дизайн для пуленепробиваемой оболочки script, которая реализует "сделать этот файл принадлежащим мне"? Нет перекрестной файловой системы и т.д. И т.д.
Для тех, кто, возможно, не понял, разрешение на запись не дает разрешения chmod
:
% ls -l value.c
-rw-rw---- 1 agallant ta105 133 Feb 10 13:37 value.c
% [ -w value.c ] && echo writeable
writeable
% chmod o+r value.c
chmod: changing permissions of `value.c': Operation not permitted
Мы находимся в группе ta105
.
Примечания:
-
Мы используем git
не только для координации изменений, но и для публикации репо в качестве веб-сайта курса. Публикация веб-сайта является основной целью репо. Разрешения script запускаются при каждом обновлении с помощью git hook, и это гарантирует, что у студентов нет разрешения на чтение решений, которые еще не были представлены.
-
Пожалуйста, не предлагайте, чтобы у меня был неправильный umask. Не все файлы в репо должны иметь одинаковые разрешения, и независимо от выбранного umask, необходимо будет изменить разрешения для некоторых файлов. Не говоря уже о том, что мне было бы неудобно налагать мои предпочтения umask на моих коллег.
-
ОБНОВЛЕНИЕ. Я только что узнал, что в нашей среде root отключен до nobody
на всех машинах, к которым у нас есть доступ, так что решение, основанное на привилегиях root, выиграно работа.
Ответы
Ответ 1
Существует, по крайней мере, один Unix, в котором я видел способ предоставить кому-то разрешения chmod
и chown
для всех файлов, принадлежащих определенной группе. Это иногда называют "суперпользователем группы" или чем-то подобным.
Единственный Unix, я уверен, что я видел это, была версия Unix, в которой побежал
Ответ 2
Самый простой способ сделать это - сделать вашего партнера и членов вашей новой группы (скажем, "devel" ), и иметь это как группу файла. Таким образом, он может принадлежать любому из вас, и пока группа права, вы можете работать с ней.
Если это не сработает с вами, "sudo" можно настроить так, чтобы только эти два пользователя могли запускать команду chmod для файлов в этом конкретном каталоге с правами root без пароля.
Ответ 3
Если вы правильно установите umask
, файлы могут быть созданы с правильными разрешениями в первую очередь:
$ umask 0022
$ touch foo
$ ls -l foo
-rw-r--r-- 1 sarnold sarnold 0 2011-02-20 21:17 foo
$ rm foo
$ umask 0002
$ touch foo
$ ls -l foo
-rw-rw-r-- 1 sarnold sarnold 0 2011-02-20 21:17 foo
Ответ 4
Я делаю шаг назад. Дайте мне знать, если я нарушу некоторые ограничения в вашей системе, которые я не читал.
Из вашего вопроса, я полагаю, вы пытаетесь предоставить репозиторий git, используя file://
URL-адреса, и полагаться на разрешения файловой системы UNIX, чтобы заботиться о авторизации и т.д. Почему бы вам не рассмотреть другой способ поделиться своим репозитории, которые не связаны с этой проблемой?
Я могу думать о двух путях.
- Вы можете создать голый репозиторий на любом из ваших компьютеров, добавить его в качестве удаленного рабочего стола и использовать его для совместной работы. Обслуживать это можно с помощью встроенной команды
git daemon
. Detais здесь. Однако это не даст вам никакого контроля доступа.
- Вы можете установить gitosis локально и использовать это для обслуживания своего репозитория. Это позволяет простую систему управления доступом, чтобы вы могли ограничить/разрешить определенным пользователям.
Возник какой-то связанный с этим вопрос, который может показаться актуальным. git daemon
работал для него - Администрирование репозитория git без прав root
Я также нашел что-то на ошибке сервера, которая может иметь отношение к вашей проблеме - https://serverfault.com/questions/21126/git-daemon-and-access-control-for-multiple-repos
Ответ 5
Возможно, это не самый элегантный способ, но он работает
$ umask 0002
$ mv value.c value.c.tmp
$ cat value.c.tmp > value.c
$ rm value.c.tmp
можно утверждать, что это можно сделать пуленепробиваемым, но тогда кто-то приносит RPG...
Если вам обоим понадобится chmod, я не могу думать иначе: если это нормально, YOU может chmod
, но нет другого парня, вы можете chmod 6770 .
или chmod g+s,u+s .
в каталоге (например, установить SUID и GUID биты), так что тот, который владеет каталогом, всегда будет владельцем файлов. К сожалению, некоторые (если не большинство), а именно EXT2/3/4, игнорируют бит SUID.
Конечно, установка umask на 0002 решит проблему, не сделав ее обязательной.
Ответ 6
Предполагая, что ваш купон публикации фактически развертывает файлы, а не просто устанавливает разрешения в рабочей копии, вы можете развернуть его во временное место, а затем использовать rsync, чтобы убедиться, что содержимое и разрешения файлов верны.
Чуть лучше, но требуя некоторой инфраструктуры, которая, как я предполагаю, не на месте, будет гарантировать, что развертывание script работает только под одним пользователем. Вы можете сделать это с помощью sudo, если ваши системные администраторы разрешают, или путем настройки службы сервера git, например, gerrit, или даже путем запуска задания cron каждые пять минут, которое проверяет наличие обновлений и при необходимости развертывает.
Ответ 7
Это может сработать:
touch $name.tmp
chmod 660 $name.tmp
cp $name $name.tmp
if cmp $name $name.tmp 2>/dev/null; then
rm $name && \
cp $name.tmp $name && \
rm $name.tmp
fi
Это просто вариация вашей оригинальной идеи
Ответ 8
Хорошо, смесь вещей, которые основываются на предыдущих ответах:
-
вы можете установить umask в папку, если вы установите его на fstab. Если вы могли бы согласиться с людьми работать на этом монтировании, вы могли бы применить g + w
-
Если вы установите бит группы в этой папке (g + s), все файлы будут принадлежать группе, к которой принадлежит папка, поэтому групповое владение файлом распространяется
Это выполнимо? Разумеется, применение этой точки монтирования - непростая задача. Любые лучшие идеи вокруг этого человека?