2009-09-02 1 views
5

У меня есть git-репозиторий, которому нужно запустить post-receive hook как sudo. Двоичный файл, который я составил, чтобы проверить это выглядит следующим образом:Запуск git 'post-receive' hook with setuid failed

#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() извлекает идентификатор владельца post-receive, затем пытается УИП. При выполнении этого с любым пользователем (включая суперпользователя) он корректно запускает скрипт с правами 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)

+0

Вы когда-нибудь это выясняли? – Ibrahim

+0

Одна из проблем заключается в том, что вы печатаете сообщение об ошибке, а затем продолжаете выполнение вызова system(). Вы также игнорируете результат вызова system(), а затем выходите с успехом (0). –

+0

@Blake: бит «-а-с-любого пользователя» неясен - правильно ли программа работает при запуске в качестве пользователя, которого вы нажимаете? Я думаю, что самый близкий способ дублировать среду, в которой он запускается git, будет: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel

ответ

0

попробовать запустить программу из командной строки

+0

Работает нормально, когда не активируется через git. –

1
  1. Файловая система, где мерзавец репо хранится может быть установлен с nosuid опцией
  2. Если вы толкая через SSH SUID возможность может быть отключена для команд, вызываемых с SSH (без разрешения CAP_SETUID)

В любом случае, то, что вы пытаетесь сделать, очень нецелесообразно.

1
  1. Запустите свою программу в качестве демона.
  2. Ждите ввода на разъем/именованный канал/msgq.
  3. На крючке отправьте сообщение своему демона с любой информацией, необходимой для выполнения операции.
  4. При необходимости отправьте сообщение обратно на крючок со статусом.

Это, вероятно, будет проще в управлении и безопасности.

0

Попробуйте написать сценарий начальной загрузки. т.е.

#/usr/bin/sh 
./your_program 

Затем сделайте скрипт крючком.