как запускать команды Mercurial как другой пользователь с sudoers - PullRequest
1 голос
/ 07 октября 2011

Все наши разработчики могут войти на наш промежуточный сервер через ssh.

Когда они запускают любую команду hg на промежуточных серверах, она делает их владельцем обновленных / новых файлов.Мне нужно, чтобы эти файлы принадлежали пользователю / группе www-data.

Я попытался отредактировать файлы sudoers для этого

Cmnd_Alias WWW_DATA_CMDS = /usr/bin/svn, /usr/bin/hg

%developers  ALL=(www-data) NOPASSWD: WWW_DATA_CMDS

Как вы можете видеть, у нас есть SVN на сервере какхорошо (мы переходим от SVN к HG), и эта настройка прекрасно работает для SVN, если мы запускаем команду SVN, она создает файлы как www-data

Как заставить то же самое работать для Mercurial?

1 Ответ

2 голосов
/ 07 октября 2011

Сначала поймите, что здесь нет магии .Mercurial всегда создает файлы как пользователь, с которым он работает, конец истории.Он не пытается (и даже не имеет разрешения) делать что-либо еще.

Это означает, что если вы запускаете hg только через sudo и права существующих файлов правильные, он БУДЕТ делать то, чтоВы хотите здесь.

Но это также означает, что если пользователи запускают hg без sudo и у них есть необходимые разрешения, они БУДУТ запутаться.Mercurial позволяет вам делать то, что разрешено моделью разрешений Unix.

Существует три подхода к решению этой проблемы:

  • хлопать костяшками рулетки до тех пор, пока люди не будут последовательно использовать sudo
  • использует оболочку типа mercurial-server, которая объединяет всех пользователей в одну учетную запись
  • правильно настраивает группу, umask, владения и разрешения, чтобы на самом деле можно было обмениваться

Последнее работает следующим образом:

  • убедитесь, что у каждого пользователя X есть соответствующая группа по умолчанию X (большинство современных систем уже делают это)
  • добавьте всех (и wwwdata) в дополнительныйgroup project-foo
  • убедитесь, что для всех пользователей установлен umask при входе в систему НЕ маскировать чтение / запись группы (umask 007, а не 077)
  • установить все файлы в проекте для включения в групповой проект foo(chgrp -R project-foo foo /)
  • сделать все файлы доступными для чтения / записи этой группой (chmod -R g + rw foo /)
  • сделать все каталоги доступными и setgid (найти еoo / -типа d |xargs chmod g + sx)

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

...