2011-09-21 25 views
5

Tengo un servidor de repositorio SVN que se ejecuta bajo el usuario del repositorio. Quiero ejecutar un script después de cada acción posterior a la confirmación. Escribí una secuencia de comandos de shell que se ejecuta desde el gancho después de cada confirmación. Necesita ser ejecutado como root. Es por eso que utilicé sudo en el script, pero no funcionó. ¿Hay alguna forma de ejecutar el script como root?¿Cómo ejecuto un script de shell como root (sudo)?

sudo su 
echo "password" 
svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/ 
chmod -R 777 /home/memarexweb/public_html/devel/ 
+0

mejor mover la cuestión a superuser.com – Yousf

+0

Una opción podría ser la de desactivar la contraseña, pero no es realmente una solución buena http:. // maestric .com/doc/unix/ubuntu_sudo_without_password – FUD

+0

Puede que no sea una buena idea crear archivos en el modo 777, serán editables en todo el mundo. – eckes

Respuesta

6

que estaba buscando y encontramos esta solución útil:

editar el archivo sudoers para permitir ejecutar ciertos comandos sin una contraseña.

Lo mejor es dividir su script post-commit en dos partes, una de las cuales se ejecutará a través de sudo.

  • entrada en /etc/sudoers:

    loqman ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export 
    
  • Su gancho post-commit:

    #!/bin/sh 
    sudo /usr/local/bin/svn-postcommit-export 
    
  • Guión /usr/local/bin/svn-postcommit-export:

    #!/bin/sh 
    svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/ 
    chmod -R 777 /home/memarexweb/public_html/devel/ 
    

    (Yo Puedes elegir cualquier nombre y colocar el script en cualquier lugar; Acabo de sugerir svn-postcommit-export como un ejemplo, y /usr/local/bin como un lugar común)

0

Esto no funcionará, lo mejor es poner sólo el requiere comandos de la shell script. Y luego setuid el propio guión, como esto (usando la raíz):

chmod u+s myscript.sh 

De esta manera, la ejecución de este script le dará los permisos del propietario del script (raíz).

EDITAR: Como se menciona en los comentarios, stuid no está permitido para el script de shell. Esta solución funciona solo para archivos ejecutables.

+0

Establecer las banderas 'suid' en el script de shell es ** PELIGROSO ** en la extensión, que Linux lo ignorará. Vea el artículo de Wikipedia vinculado en la respuesta para más detalles. –

+0

lo siento, A.H., no te entendí del todo. ¿Quieres decir que Linux ignorará a setuid? ¿Y por qué es PELIGROSO? – Yousf

+2

Linux ignorará 'suid' ** en scripts **, los ejecutables son correctos. Muchos derivados de UNIX lo hacen en estos días. Algunas razones se explican [aquí] (http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html) –

1

En la última línea del script, está cambiando el modo de /home/memarexweb/public_html/devel/ a 777, por lo que el "repositorio" del usuario debería poder copiar archivos en ese directorio sin privilegios de administrador. En ese caso, no necesita usar sudo o su.

Sin embargo, cambiar los permisos del directorio a 777 es peligroso, ya que permite a cualquier persona escribir en ese directorio y crear o eliminar archivos. Sería mejor cambiar la propiedad del directorio al "repositorio" del usuario y cambiar el modo a 755. Si eso no es factible, es posible que pueda agregar una ACL POSIX que permita que el "repositorio" escriba en el directorio. Puede buscar en Google "POSIX ACL" para obtener más información o leer las páginas de manual para getfacl y setfacl.

3
sudo su 

inicia un nuevo proceso, propiedad del usuario raíz. Después de que el proceso finaliza o se detiene, se ejecuta la siguiente línea, nuevamente como el usuario que ejecuta el script.

Una posible solución es ejecutar todo el script usando sudo, y dar ese uso a los derechos de sudo para ejecutar los scripts. Para hacer eso, necesita editar el archivo /etc/sudoers usando el comando visudo.

Cuestiones relacionadas