У меня есть 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)
Вы когда-нибудь это выясняли? – Ibrahim
Одна из проблем заключается в том, что вы печатаете сообщение об ошибке, а затем продолжаете выполнение вызова system(). Вы также игнорируете результат вызова system(), а затем выходите с успехом (0). –
@Blake: бит «-а-с-любого пользователя» неясен - правильно ли программа работает при запуске в качестве пользователя, которого вы нажимаете? Я думаю, что самый близкий способ дублировать среду, в которой он запускается git, будет: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel