Подтвердить что ты не робот

Как изменить разрешения 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, выиграно работа.

4b9b3361

Ответ 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), все файлы будут принадлежать группе, к которой принадлежит папка, поэтому групповое владение файлом распространяется

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