如何使用sudoers作为另一个用户运行mercurial命令



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

首先要理解这里没有魔法。Mercurial总是以它运行时的用户身份创建文件,仅此而已。它不会尝试(甚至没有权限)做任何其他事情。

这意味着如果您只通过sudo运行hg,并且现有文件的权限是正确的,它将在这里执行您想要的操作。

但是这也意味着如果用户在没有sudo的情况下运行hg,并且他们有正确的权限,他们将会弄得一团糟。Mercurial满足于让您执行Unix权限模型允许的任何操作。

有三种方法来处理这个问题:

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

最后的工作方式如下:

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

这将确保每次用户在项目中创建文件时,该组中的其他所有人都可以读/写。

最新更新