如何将mercurial命令作为另一个具有sudoers的用户运行

时间:2011-10-07 11:33:46

标签: svn mercurial sudoers

我们所有的开发人员都可以通过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 个答案:

答案 0 :(得分:2)

首先要明白这里没有魔法。 Mercurial始终以其运行的用户创建文件,故事结束。它不会尝试(甚至没有许可)做任何其他事情。

这意味着如果你只通过sudo运行hg,并且现有文件的权限是正确的,那么它将在这里做你想做的事。

但这也意味着如果用户在没有sudo的情况下运行hg,并且他们拥有正确的权限,他们就会搞得一团糟。 Mercurial满足于让你做任何Unix权限模型允许的事情。

有三种方法可以解决这个问题:

  • 用尺子打击指关节直到人们始终使用sudo
  • 使用像mercurial-server这样的包装器,将所有用户汇集到一个帐户中
  • 正确配置组,umask,所有权和权限,以便实际分享内容

这最后的工作原理如下:

  • 确保每个用户X都有一个匹配的默认组X(大多数现代系统已经这样做了)
  • 将所有人(和wwwdata)添加到辅助组项目-foo
  • 确保每个人的umask在登录时设置为NOT mask group read / write(umask 007,而不是077)
  • 将项目中的所有文件设置为组项目foo(chgrp -R project-foo foo /)
  • 使该组读取/写入所有文件(chmod -R g + rw foo /)
  • 使所有目录都可以遍历 setgid (找到foo / -type d | xargs chmod g + sx)

这将确保用户每次在项目中创建文件时,都会对组中的其他人进行读/写。