2010-07-03 17 views
36

No sé cuál es el trato aquí ...sudo en php exec()

por lo que quiero ejecutar un AppleScript: sudo osascript myscript.scpt

Esto funciona bien en el terminal, pero no cuando se ejecuta a través de PHP exec(); no pasa nada. La consola dice

no tty present and no askpass program specified ; TTY=unknown ; … 

hice mi investigación, y parece que me falta la contraseña para el comando sudo. He intentado un par de maneras diferentes de evitar esto, incluyendo:

  • escribir %admin ALL=(ALL) ALL en /etc/sudoers
  • y proc_open() en lugar de exec()

ninguno de los cuales parece estar funcionando, por lo tanto volviendo loco!

Entonces, básicamente, ¿hay una forma clara de que PHP ejecute un comando de terminal simple?

EDIT: para aclarar, myscript.scpt es un AppleScript simple que cambia la interfaz de usuario en pantalla (para un proyecto más grande). En teoría, simplemente osascript myscript.scpt debería ser suficiente, sin embargo, el sudo es por alguna razón necesaria para invocar alguna respuesta del sistema. Si el sudo pudiera eliminarse de alguna manera, no creo que tenga este problema de permisos.

+5

Hay formas de solucionar esto, pero la mejor manera es hacer que 'myscript.script' se ejecute sin privilegios de root. – Stephen

+6

Cualquier forma en que pueda hacer esto es técnicamente una mala idea. O le da acceso a PHP a sudo sin necesidad de una contraseña, o usa un script de ayuda setuid que siempre se ejecuta con privilegios de administrador. Ninguno de los dos está completamente cuerdo cuando se trata de una interfaz PHP. ¿Puede actualizar su pregunta para decirnos qué 'myscript.scpt' realmente está logrando? –

+0

Pregunta actualizada – pop850

Respuesta

-1

¿Qué le parece si ejecuta el script PHP con sudo y lo omite en el script? Eso podría encargarse de los permisos para procesos secundarios, también.

+0

desafortunadamente, el programa está basado en la web, por lo que PHP se ejecuta mediante un comando de un usuario remoto – pop850

+4

@ pop850 - Mmkay. En ese caso, ejecutar el script PHP con 'sudo' significaría ejecutar Apache con' sudo', o simplemente otorgar las capacidades de la raíz de Apache. Parece peligroso, pero, de nuevo, permitir que Apache invoque 'sudo' sin una contraseña es * exactamente * como peligroso. Realmente, probablemente no deberías estar haciendo lo que sea que estés haciendo como lo estás haciendo. ¿Puedes darle a Apache el permiso adecuado para realizar la acción sin necesidad de acceso a la raíz? Eso definitivamente debería ser posible a menos que Apache esté alterando el sistema de alguna manera, lo cual * no debería hacer *. – Matchu

+0

¿exactamente cómo otorgaría las capacidades de raíz de Apache? He intentado '% apache ALL = (ALL) NOPASSWD: ALL' – pop850

14

Parece que necesita configurar sudo sin contraseña. Proveedores:

%admin ALL=(ALL) NOPASSWD: ALL 

También comente la siguiente línea (en/etc/sudoers vía visudo), si está allí:

Defaults requiretty 
+0

He intentado agregar esto a etc/sudoers, pero no hay dados. Sigo recibiendo "no hay presente presente y no se especificó ningún programa" – pop850

+0

He actualizado mi respuesta. – tomit

+0

¿Tuviste algo de suerte al comentar la línea requiretty? – tomit

18

Si alguien todavía lo requiere. Puede escribir un archivo de texto sin formato, digamos ~ ./. Sudopass/sudopass.secret, con la contraseña de root allí. Digamos que la contraseña de root es '12345'. Se crea ~ ./ sudopass/sudopass.secret sólo con '12345' como su contenido:.

12345 

Y después de hacer lo siguiente:

exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret'); 

Recuerde usar esto sólo en ambientes controlados.

+0

Nota: no incluya el {{&&}} –

+6

omg. ¡NO DEJE LAS CONTRASEÑAS RAÍCES QUE CUELGAN ALREDEDOR! La respuesta de @tomits es mucho más segura. Ver también http://stackoverflow.com/a/3166174/125525 – cmroanirgo

4

php: se crea la consola bash, y ejecuta primero guión, que llaman sudo para la segunda, ver más abajo:

$dev = $_GET['device']; 
$cmd = '/bin/bash /home/www/start.bash '.$dev; 
echo $cmd; 
shell_exec($cmd); 
  1. /home/www/start.fiesta

    #!/bin/bash 
    /usr/bin/sudo /home/www/myMount.bash $1 
    
  2. myMount.bash:

    #!/bin/bash 
    function error_exit 
    { 
        echo "Wrong parameter" 1>&2 
        exit 1 
    } 
    .......... 
    

OC, que desea ejecutar secuencias de comandos desde el nivel de la raíz sin privilegios de root, para hacer que crean y modifique el archivo /etc/sudoers.d/mount:

www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash 

No se olvide de chmod:

sudo chmod 0440 /etc/sudoers.d/mount 
3

Creo que se puede lograr un acceso específico para el usuario y comandos con visudo algo como esto:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt 

y con php:

@exec("sudo /path/to/osascript myscript.scpt "); 

suponiendo que nobody el usuario está ejecutando apache.

+0

Probé muchas soluciones, esta funciona mejor para mí: +1: – MitchellK

0

Recientemente publiqué un proyecto que permite a PHP obtener e interactuar con un shell Bash real. Obténgalo aquí: https://github.com/merlinthemagic/MTS El shell tiene un pty (dispositivo pseudo terminal, igual que lo que tendría en una sesión ssh), y puede obtener el shell como root si lo desea. No estoy seguro de que necesite root para ejecutar su script, pero dado que menciona sudo es probable.

Después de descargar sólo tendría que utilizar el siguiente código:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd('/path/to/osascript myscript.scpt'); 
3

Run sudo visudo comando a continuación, establecer -%sudo ALL=(ALL:ALL)-%sudo ALL=(ALL:ALL) NOPASSWD: ALL que va a funcionar.