我正在尝试设置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上发布这个,但至少我从这一努力中学到了一点。
答案 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