Как изменить разрешения Unix, если я не являюсь владельцем файла, но у меня есть разрешение на запись в каталог? - PullRequest
18 голосов
/ 11 февраля 2011

Я делюсь репозиторием git с коллегой, и поскольку git не распространяет полный набор прав доступа к файлам Unix, у нас есть «ловушка», которая запускается при обновлении, которая устанавливает «другие» разрешения так, как они должны быть. задавать. Эта проблема? Хук использует chmod, и получается, что когда мой коллега фиксирует файл, он владеет им, поэтому я не могу запустить chmod на нем, и наоборот. Все каталоги доступны для записи в группах, поэтому я считаю, что любой из нас имеет право удалить любой файл и заменить его одним и тем же именем, тем же содержимым, но другим владельцем. Предположительно, тогда мы могли бы это сделать. Но это похоже на ужасно большой молот, и я немного опасаюсь его испортить. Итак, два вопроса:

  1. Кто-нибудь может придумать другой способ сделать это?

  2. Если нет, то каков лучший дизайн для пуленепробиваемого сценария оболочки, который реализует «сделать этот файл принадлежащим мне»? Никаких кросс-файловых движений и т. Д. И т. Д ...

Для тех, кто, возможно, не понял, разрешение на запись не дает разрешение 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.


Примечания:

  1. Мы используем git не только для координации изменений, но и для публикации репо в качестве веб-сайта курса. Публикация веб-сайта является основной целью репо. Сценарий полномочий запускается при каждом обновлении с использованием git-хука и гарантирует, что учащиеся не имеют разрешения на чтение решений, которые еще не были представлены.

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

  3. ОБНОВЛЕНИЕ : Я только что узнал, что в нашей среде root отменен до nobody на всех машинах, к которым у нас есть доступ, так что решение, основанное на привилегиях root, выиграло ' т работы.

Ответы [ 8 ]

8 голосов
/ 21 февраля 2011

Существует по крайней мере один Unix, в котором я видел способ дать кому-то права chmod и chown на все файлы, принадлежащие определенной группе. Это иногда называют «групповым суперпользователем» или чем-то подобным.

Единственный Unix, в котором я уверен, что я видел это, была версия Unix, на которой работал Encore Multimax .

Я немного искал, и хотя я помню несколько расплывчатых ссылок на такие возможности в Linux, я не смог их найти. Так что это может быть не вариант. К счастью, его можно симулировать, хотя симуляция немного опасна.

Способ смоделировать это состоит в том, чтобы создать очень специфическую suid-программу, которая будет выполнять chmod как root после проверки того, что вы являетесь членом той же группы, к которой принадлежит файл, и вашего имени пользователя указан как имеющий это разрешение в специальном файле /etc/chmod_group, который должен принадлежать root и доступен для чтения и записи только root .

3 голосов
/ 11 февраля 2011

Самый простой способ сделать это состоит в том, чтобы сделать вашего партнера и вас членами новой группы (скажем, «devel»), и использовать это в качестве группы файла. Таким образом, он может принадлежать любому из вас, и пока группа права, вы оба можете работать с ним.

Если это не работает с вами, «sudo» можно настроить так, чтобы только эти два пользователя могли запускать команду chmod для файлов в этом конкретном каталоге как root без пароля.

2 голосов
/ 21 февраля 2011

Если вы правильно установите 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
0 голосов
/ 26 февраля 2011

Хорошо, смесь вещей, основанных на предыдущих ответах:

  • вы можете установить umask для папки, если вы смонтируете ее в fstab. Если бы вы могли договориться с людьми о работе над этим монтированием, вы могли бы применить g + w

  • Если вы установите бит идентификатора группы для этой папки (g + s), все файлы будут принадлежать группе, к которой принадлежит папка, поэтому владение группой для файла распространяется

Это выполнимо? Конечно, обеспечение этой точки монтирования - непростая задача. Есть какие-нибудь лучшие идеи вокруг этого кого-нибудь?

0 голосов
/ 26 февраля 2011

Это может сработать:

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

Это просто вариант вашей оригинальной идеи

0 голосов
/ 25 февраля 2011

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

Немного приятнее, но требуется некоторая инфраструктура, которая, как я полагаю, отсутствует, будет означать, что скрипт развертывания будет работать только под одним пользователем. Вы можете сделать это с помощью sudo, если ваши системные администраторы разрешают это, или установив службу git-сервера, например, gerrit, или даже запуская задание cron каждые пять минут, которое проверяет наличие обновлений и при необходимости развертывает.

0 голосов
/ 21 февраля 2011

Вероятно, не самый элегантный способ, но он , кажется, работает

$ umask 0002
$ mv value.c value.c.tmp
$ cat value.c.tmp > value.c
$ rm value.c.tmp

Можно утверждать, что это можно сделать пуленепробиваемым, но тогда кто-то принесет RPG ...

Если вам обоим нужно chmod, я не могу придумать другого пути - если все нормально, то ВЫ можете chmod, но нет другого парня,вы можете chmod 6770 . или chmod g+s,u+s . в каталоге (например, установить биты SUID и GUID), чтобы владелец файлов всегда был владельцем каталога.К сожалению, некоторые (если не большинство), а именно EXT2 / 3/4 игнорируют бит SUID.

Конечно, установка umask на 0002 решит проблему, не делая ее обязательной.

0 голосов
/ 21 февраля 2011

Я делаю шаг назад.Дайте мне знать, если я нарушаю какое-то ограничение в вашей системе, я не читал.

Исходя из вашего вопроса, я предполагаю, что вы пытаетесь открыть общий доступ к репозиторию 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

...