Git post-receive hook用于更新不同用户拥有的本地克隆

时间:2009-12-23 07:06:06

标签: git hook setuid

我正在尝试设置git post-receive挂钩,这样当收到提交时,计算机上另一个存储库的克隆会更新(即git pull origin master)。我正在使用gitosis服务于存储库,因此我相信post-receive挂钩将作为gitosis用户运行,而我想要在接收上更新的存储库由www-data拥有。我应该怎么做呢?

我听说过setuid脚本,但我不确定这是否存在安全风险?如果这不是安全风险,我将如何做到这一点?我猜我会做一些像www-data所拥有的脚本并使其成为世界可执行的并启用setuid位的东西?我想这个脚本几乎无害,因为它只是更新存储库,但我想确定。谢谢!

编辑:有没有办法使用sudo执行此操作?这会比setuid更安全吗?我的意思是,如果用户不是root用户,我不认为setuid存在很多问题,但是看起来好像我必须通过一些箍来获得setuid要运行的脚本。

第二次修改:似乎可能能够使用某些/etc/sudoers魔法和sudo -u执行此操作。也许我应该在ServerFault上发布这个,但至少我从这一努力中学到了一点。

2 个答案:

答案 0 :(得分:14)

恕我直言这应该是服务器故障,但不过这是答案;

添加:

gitosis ALL=(www-data) NOPASSWD: /path/to/git

到/ etc / sudoers

并以sudo -u www-data <whatever the command is>

运行命令

答案 1 :(得分:4)

请注意,我使用的是 git 用户名,因此,如果您使用 gitosis 或任何其他用户名,请填写您的用户名!

在使用 root 的控制台中,用户执行以下命令:

visudo

将打开“vi”编辑器。添加以下行:

Defaults:git    !authenticate
git ALL=(www-data) ALL

结果文件(通过调用“visudo”在“vi”编辑器中打开)应该如下所示:

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults    env_reset
Defaults:git    !authenticate

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL
git ALL=(www-data) ALL


# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d

然后按CTRL + O保存文件,然后按Enter接受文件名(bla bla bla),然后按CTRL + X关闭“vi”编辑器。

瞧!现在 git 用户可以 www-data 用户执行命令:

sudo -u www-data git pull origin master