2009-09-02 12 views
5

Ho un repository git che deve eseguire un hook post-receive come sudo. Il binario che ho compilato per testare questo appare come:l'hook git 'post-receive' fallisce con setuid

#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; 
} 

Il geteuid() richiama l'ID proprietario di post-receive, poi cerca di setuid. Quando viene eseguito con qualsiasi utente (incluso l'utente super) esegue correttamente lo script come root. Tuttavia, quando viene attivato da git hook, i sistemi non riescono a impostare l'uid. Ho provato a eseguire chmod u+s post-receive Ho anche provato alcune altre configurazioni, ma sono a corto di idee. Qualche ragione per cui dovrebbe funzionare in tutti i casi tranne quando lo fa git?

btw, piattaforma Ubuntu Server 9.04 (2.6.28-15), git1.6.0.4, gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

+0

Lo hai mai capito? – Ibrahim

+0

Un problema è che si stampa un messaggio di errore, ma poi si continua a eseguire la chiamata di sistema(). Inoltre, ignori il risultato della chiamata di sistema() e quindi esci con uno stato di successo (0). –

+0

@ Blake: il bit "-come il- con qualsiasi utente" non è chiaro - il programma viene eseguito correttamente quando viene eseguito come utente che si sta spingendo come? Penso che il modo più vicino per duplicare l'ambiente in cui gira sia: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel

risposta

0

provare a eseguire il programma dal prompt dei comandi

+0

Funziona bene quando non attivato attraverso git. –

1
  1. il file system in cui è memorizzato può essere montato con l'opzione nosuid
  2. Se si sta spingendo tramite ssh la capacità suid può essere disabilitata per i comandi invocati con ssh (senza CAP_SETUID)
il repo git 0

In ogni caso, quello che stai cercando di fare è molto inopportuno.

1
  1. Eseguire il programma come daemon.
  2. Attendere input su un socket/named pipe/msgq.
  3. Nel gancio, invia un messaggio al demone con qualsiasi informazione necessaria per eseguire l'operazione.
  4. Se necessario, inviare di nuovo un messaggio al gancio con stato.

Questo sarà probabilmente più facile da gestire e sicuro.

0

Provare a scrivere uno script di bootstrap. ie

#/usr/bin/sh 
./your_program 

Quindi fare in modo che la sceneggiatura sia l'aggancio.

Problemi correlati