代码之家  ›  专栏  ›  技术社区  ›  Blake Chambers

使用setuid运行git“post receive”钩子失败

  •  5
  • Blake Chambers  · 技术社区  · 16 年前

    我有一个git存储库,需要像sudo一样运行post-receive挂钩。我编译用来测试的二进制文件如下:

    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
       int ret;
       ret = setuid(geteuid());
       if(!ret) {
          fprintf(stderr, "error setting uid %d \n", ret);
       }       
       system("[...command only sudo can access...]");
    
       return 0;
    }
    

    这个 geteuid() 检索的所有者ID post-receive ,然后尝试设置uid。当对任何用户(包括超级用户)运行此脚本时,它会以根用户身份正确运行脚本。但是,当git钩子触发时,系统无法设置uid。我试过跑步 chmod u+s post-receive 我也尝试了一些其他的配置,但是我已经没有主意了。除了git触发它之外,它在所有情况下都能工作的原因是什么?

    顺便说一句,平台ubuntu服务器9.04(2.6.28-15),git1.6.0.4,gcc版本4.3.3(ubuntu 4.3.3-5ubuntu4)

    4 回复  |  直到 15 年前
        1
  •  1
  •   Neil Mayhew    15 年前
    1. 存储git repo的文件系统可以使用nosuid选项装载
    2. 如果您正在推送ssh,那么suid功能可能会被禁用,用于使用ssh调用的命令(没有cap\u setuid)

    无论如何,你所做的是非常不可取的。

        2
  •  1
  •   bstpierre Edgar Aviles    15 年前
    1. 作为守护进程运行程序。
    2. 等待socket/named pipe/msgq上的输入。
    3. 在钩子中,向守护进程发送一条消息,其中包含执行操作所需的任何信息。
    4. 如果需要,请将消息发送回具有状态的挂钩。

    这可能会更容易管理和妥善保护。

        3
  •  0
  •   yan bellavance    16 年前

    尝试从命令提示符运行程序

        4
  •  0
  •   dan_waterworth    15 年前

    尝试编写引导脚本。工业工程

    #/usr/bin/sh
    ./your_program
    

    然后让脚本成为钩子。

    推荐文章