2010-07-02 23 views
39

Tengo un archivo que es un script bash que requiere que SUDO funcione.Cómo llamar al script de shell desde php que requiere SUDO?

Puedo ejecutarlo desde la línea de comando usando SUDO pero se me pedirá que ingrese la contraseña de SUDO.

Quiero ejecutar este script desde php a través de shell_exec pero si llamo a SUDO, no es como una línea de comando donde se me puede pedir la contraseña. ¿Hay alguna manera de pasar la contraseña para sudo con la llamada sudo?

¿Cómo puedo hacer esto?

+0

Por cierto estoy corriendo por mi cuenta Ubunto 10.04 máquina con apache2 php5 y –

+0

Debe tener en cuenta el cambio de los permisos de la secuencia. Por ejemplo, podría cambiar el grupo al usuario apache (www-data) y otorgar al grupo permisos de ejecución: 'chgrp www-data script.sh && chmod g + x script.sh'. –

+0

@danilo no es el archivo en sí que requiere el SUDO es lo que los archivos llaman, que es 'svn commit' pero primero I' cd/var/www' para llamar a svn commit desde la copia de trabajo. ¿Hay alguna manera de que pueda agregar permisos para hacer eso para el usuario de apache, www-admin? –

Respuesta

41

Edite el archivo sudoers (con visudo) y agregue una regla que permita al usuario del servidor web ejecutar el comando sin una contraseña. Por ejemplo:

www-data ALL=NOPASSWD: /path/to/script 
+0

¿Esto funciona para nginx también? –

5

Usted puede añadir algo como esto a su archivo sudoers:

username ALL=NOPASSWD: /path/to/script 

Esto permitirá que el usuario particular para llamar sudo en ese script en particular sin que se le pida una contraseña.

+1

Esto tiene sentido, pero una parte me confunde ... ¿Dónde coloco exactamente la línea 'username ALL = NOPASSWD:/path/to/script' ¿Cuál es mi archivo sudoers? –

+1

En '/ etc/sudoers', aunque normalmente usa el comando' visudo' para editar ese archivo. –

8

Existen varias soluciones para este problema.

  • En primer lugar, tenga en cuenta el cambio de los permisos de escritura, si la razón por qué quiere sudo es simplemente un problema de permisos (ver el comentario añadí a la pregunta anterior).

  • Otro enfoque sería usar el setuid bit. [Editar: parece que setuid no funciona bien con los scripts. Para explicaciones, vea this link.]

  • Un tercer método, pero muy inseguro, es leer la contraseña de un archivo de contraseña. Advertencia: Esto es muy inseguro, si hay alguna otra posibilidad, no lo haga. Y si lo hace, intente ocultar el archivo de contraseña en algún lugar de la jerarquía de su carpeta.

    <?php 
    shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile'); 
    ?> 
    
  • Y una cuarta posibilidad es utilizar el NOPASSWD tag en el archivo sudoers. Debe limitar este poder a los comandos específicos que necesita.

+0

Cambiar el permiso del script no lo ejecutará como root, y setuid no funciona en los scripts – Brian

+0

No, no lo ejecutará como root, pero resolvería el problema si el motivo del uso del sudo es simplemente el script no ser ejecutable. Y sobre lo setuid, parece que tienes razón. En ese caso, disculpe mi desinformación. Encontré un enlace útil sobre este tema: http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html –

+1

omg. ¡NUNCA GUARDE UNA CONTRASEÑA QUE TIENE ACCESO A LA RAÍZ! Esto nunca ha sido buena forma. La respuesta de @ Brian es mucho mejor: no se usan contraseñas. – cmroanirgo

Cuestiones relacionadas