对于一个新的Web开发项目,我已经配置了一个带有更新后挂钩的共享仓库,它会自动将更新提取到Web服务器虚拟根目录中。
#!/bin/sh
cd /srv/www/siteA/ || exit
unset GIT_DIR
git pull hub master
exec git-update-server-info
但是,Web服务器运行suphp,强制每个文件由用户'www-run'拥有。但是,由于更新后的脚本在启动git push的用户的上下文中运行,因此更新的文件由用户拥有,而不是www-run。我认为最好的解决方案是启动git pull作为使用sudo的www-run用户,所以我用以下行更新了sodoers('webmaster'是所有git用户所属的组):
Defaults:%webmaster !requiretty
%webmaster ALL=(www-run) NOPASSWD: /usr/bin/git
在更新后的脚本中,我将 git pull 行更改为
sudo -u www-run /usr/bin/git pull hub master
但是我在执行git push的客户端上收到以下错误
remote: sudo: no tty present and no askpass program specified
由于我已经指定在默认情况下不需要tty并且不需要密码我无法弄清楚为什么这不起作用。
答案 0 :(得分:2)
问题在于sudoers文件中用户规范的排序。从手册页
当多个条目与用户匹配时,它们将按顺序应用。 如果有多个匹配项,则使用最后一个匹配项(不是 必然是最具体的匹配)。
我将下面的一行移到了最后,然后才有效。
%webmaster ALL=(www-run) NOPASSWD: /usr/bin/git