2009-09-02 18 views
5

Tengo un repositorio git que necesita ejecutar un gancho post-receive como sudo. El binario que he realizado para probar esto parece:ejecutando git 'post-receive' gancho con setuid falla

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

la geteuid() recupera el ID de propietario post-receive, luego trata de setuid. Al ejecutar esto con cualquier usuario (incluido el superusuario) ejecuta el script correctamente como root. Sin embargo, cuando se activa por el gancho git, los sistemas no pueden configurar el uid. He intentado ejecutar chmod u+s post-receive También probé algunas otras configuraciones, pero me estoy quedando sin ideas. ¿Alguna razón por la que funcionaría en todos los casos, excepto cuando git lo active?

por cierto, la plataforma de servidor de Ubuntu 9.04 (2.6.28-15), git1.6.0.4, gcc versión 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

+0

¿Alguna vez resolvió esto? – Ibrahim

+0

Un problema es que imprime un mensaje de error pero luego continúa ejecutando la llamada al sistema(). También ignora el resultado de la llamada al sistema() y luego sale con un estado de éxito (0). –

+0

@Blake: el bit "-como el-con cualquier usuario" no está claro - ¿el programa se ejecuta correctamente cuando se ejecuta como el usuario al que está presionando? Creo que la forma más cercana de duplicar el entorno en el que git correrá sería: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel

Respuesta

0

intente ejecutar el programa desde la línea de comandos

+0

Funciona bien cuando no está activado a través de git. –

1
  1. el sistema de archivos donde se almacena puede ser montado con la opción nosuid
  2. Si usted está empujando a través de ssh la capacidad SUID puede ser desactivada para los comandos invocados con ssh (sin capacidad CAP_SETUID)
el repositorio git 0

En cualquier caso, lo que estás tratando de hacer es muy desaconsejable.

1
  1. ejecutar el programa como un demonio.
  2. Espere la entrada en un socket/named pipe/msgq.
  3. En el gancho, envíe un mensaje a su daemon con la información que necesite para realizar la operación.
  4. Si es necesario, envíe un mensaje de nuevo al enganche con el estado.

Esto probablemente será más fácil de administrar y asegurar correctamente.

0

Intenta escribir un script de arranque. es decir

#/usr/bin/sh 
./your_program 

a continuación, hacer que el guión del gancho.

Cuestiones relacionadas