sudo en php ejecutivo()
No sé cuál es el trato aquí...
Entonces quiero ejecutar un AppleScript:sudo osascript myscript.scpt
Esto funciona bien en la terminal, pero no cuando lo ejecuto a través de PHP exec()
; no pasa nada. La consola dice
no tty present and no askpass program specified ; TTY=unknown ; …
Investigué y parece que me falta la contraseña del sudo
comando. Probé un par de formas diferentes de solucionar este problema, que incluyen:
- escribiendo
%admin ALL=(ALL) ALL
en/etc/sudoers
- y
proc_open()
en lugar deexec()
Ninguno de los cuales parece estar funcionando, ¡lo que me vuelve loco!
Básicamente, ¿existe una manera clara de hacer que PHP ejecute un comando de terminal simple?
EDITAR: 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, sudo
por alguna razón es necesario invocar alguna respuesta del sistema. Si sudo
pudiera eliminarse de alguna manera, no creo que tuviera este problema de permisos.
Parece que necesitas configurar sudo sin contraseña. Intentar:
%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt
También comente la siguiente línea (en /etc/sudoers vía visudo), si está allí:
Defaults requiretty
Creo que puedes brindar acceso específico al usuario y al comando 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.
php: se crea la consola bash y ejecuta el primer script, que llama sudo al segundo, ver a continuación:
$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);
/home/www/start.bash
#!/bin/bash /usr/bin/sudo /home/www/myMount.bash $1
miMonte.bash:
#!/bin/bash function error_exit { echo "Wrong parameter" 1>&2 exit 1 } ..........
oc, desea ejecutar el script desde el nivel raíz sin privilegios de raíz, para ello cree y modifique el archivo /etc/sudoers.d/mount:
www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash
no olvides hacer chmod:
sudo chmod 0440 /etc/sudoers.d/mount
Recientemente publiqué un proyecto que permite a PHP obtener e interactuar con un shell Bash real. Consíguelo aquí: https://github.com/merlinthemagic/MTS El shell tiene un pty (pseudo dispositivo terminal, el mismo que tendrías, por ejemplo, en una sesión ssh), y puedes obtener el shell como root si lo deseas. No estoy seguro de que necesites root para ejecutar tu script, pero si mencionas sudo, es probable.
Después de la descarga, simplemente usará el siguiente código:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('/path/to/osascript myscript.scpt');