Mam repozytorium git, które musi uruchomić hak po otrzymaniu jako sudo. Binarny, że skompilowany do testowania to wygląda:uruchamianie haka git 'post-receive' z setuidem kończy się niepowodzeniem
#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()
pobiera identyfikator właściciela post-receive
, a następnie próbuje setuid. Podczas uruchamiania tego z dowolnym użytkownikiem (w tym superużytkownikiem) uruchamia skrypt poprawnie jako root. Jednakże, po uruchomieniu przez hak git, systemy nie ustawiają uid. Próbowałem już uruchomić chmod u+s post-receive
Próbowałem także innych konfiguracji, ale brakuje mi pomysłów. Jakiś powód, dla którego to zadziałałoby we wszystkich przypadkach, z wyjątkiem sytuacji, gdy git go uruchomi?
btw, platforma Ubuntu Server 9.04 (2.6.28-15), git1.6.0.4, gcc w wersji 4.3.3 (4.3.3-5ubuntu4 Ubuntu)
Czy kiedykolwiek to rozgryzłeś? – Ibrahim
Jedną z kwestii jest drukowanie komunikatu o błędzie, a następnie kontynuowanie wykonywania wywołania system(). Ignorujesz także wynik wywołania system(), a następnie kończysz pracę ze statusem sukcesu (0). –
@Blake: Bit "-as the- with any user" jest niejasny - czy program działa poprawnie, gdy jest uruchamiany jako użytkownik, który naciskasz jako? Myślę, że najbliższym sposobem na zduplikowanie środowiska, w którym działa git, byłoby: 'ssh nazwa_hosta 'cd/ścieżka/do/repo; .git/hooks/post-receive'' – Cascabel