5

我有一个 git 存储库,需要将接收后挂钩作为 sudo 运行。我为测试它而编译的二进制文件如下所示:

#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,然后尝试 setuid。使用任何用户(包括超级用户)运行此脚本时,它会以 root 身份正确运行脚本。但是,当被 git 钩子触发时,系统无法设置 uid。我试过跑步chmod u+s post-receive 我也试过其他一些配置,但我的想法已经不多了。除了 git 触发它之外,它在所有情况下都能正常工作的任何原因?

顺便说一句,平台 Ubuntu Server 9.04(2.6.28-15),git1.6.0.4,gcc 版本 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

4

4 回答 4

1
  1. 将您的程序作为守护程序运行。
  2. 等待套接字/命名管道/msgq 上的输入。
  3. 在钩子中,向您的守护程序发送一条消息,其中包含执行操作所需的任何信息。
  4. 如果需要,将带有状态的消息发送回钩子。

这可能更容易正确管理和保护。

于 2010-07-29T03:50:05.030 回答
1
  1. 存储 git repo 的文件系统可以使用 nosuid 选项挂载
  2. 如果您正在推送 ssh,则可能会禁用 ssh 调用的命令的 suid 功能(无 CAP_SETUID)

无论如何,您尝试做的事情是非常不可取的。

于 2010-07-02T04:35:57.757 回答
0

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

于 2010-02-16T06:33:58.893 回答
0

尝试编写引导脚本。IE

#/usr/bin/sh
./your_program

然后使脚本成为钩子。

于 2010-08-29T07:15:20.283 回答