Git post-receive hook失败:不允许操作

时间:2012-12-19 13:58:19

标签: git bash githooks

我有一个post-receive钩子,它调用我的bash脚本(它会拉动本地仓库并重新启动Java服务器)。

这是收件后挂钩的所有者信息:

-rwsr-x--x 1 cyril devs   676 19 dec.  14:45 post-receive

正如您所看到的,我在此脚本上设置了setuid bit,以便其他用户也可以cyril/devs运行。

此脚本的内容非常简单:

echo "Running post-receive hook"
echo "Server will be up and running in about 1 minute"
/home/project/start_dev restart &

我的脚本start_dev拥有这些权利:

-rwsr-x---  1 cyril devs 1515 19 dec.  14:41 start_dev

注意:setuid.

如果我使用帐户cyril向服务器推送内容,则效果非常好。

如果其他人使用其他帐户推送到服务器,他们会:

remote: /home/project/start_dev: line 52: kill: (11490) - Operation not allowed

(kill用于停止实例。)

为什么他们有这个错误,脚本应该以{{1​​}}而不是用户运行,因此他们应该有权杀死这个实例,对吗?

我做错了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

显然,大多数Linux发行版都会为shell脚本禁用setuid,因为它可能导致大量安全漏洞。更多信息heresetuid Wikipedia page

  

虽然setuid功能在许多情况下非常有用,但它的不当使用可能会带来安全性   如果将setuid属性分配给不仔细的可执行程序,则存在风险   设计的。由于潜在的安全问题,许多操作系统忽略了setuid   应用于可执行shell脚本时的属性。

Tuxation页面的一个可能解决方案是执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}

然后setuid生成的C程序并将其用作钩子。之后在Tuxation页面上也有这个评论:

  

尽管如此,使用setuid运行shell脚本并不是非常安全,而且发行版也是如此   当很多人禁用它时,设计师非常清楚他们在做什么。