【问题标题】:Git post-receive hook fails : operation not allowedGit post-receive hook失败:不允许操作
【发布时间】:2012-12-06 21:34:45
【问题描述】:

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

这是 post-receive 挂钩的所有者信息:

-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 用于停止实例。)

为什么他们有这个错误,脚本应该以cyril而不是用户身份运行,因此他们应该有权杀死这个实例,对吧?

我做错了什么?

【问题讨论】:

    标签: git bash githooks


    【解决方案1】:

    显然大多数 Linux 发行版对 shell 脚本禁用 setuid,因为它可能导致大量安全漏洞。更多信息here 和来自setuid 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 脚本并不是很安全,而且发行版 当他们中的许多人禁用它时,设计师们对他们在做什么有一个很好的想法。

    【讨论】:

    • 从 Tuxation 添加了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2013-06-19
    • 2014-06-02
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多