examples - PHP exec() no ejecutará el comando de shell cuando se ejecute a través del navegador
php exec return value (9)
¿Has considerado los permisos de archivos? En el navegador, php se ejecuta bajo un usuario, pero cuando lo ejecuta en bash, es probable que se ejecute con sus permisos de usuario.
Es lo primero que verificaría.
Amy
Tengo un determinado script PHP que llama a exec () para ejecutar un comando para convertir un PDF a JPG. Este comando funciona bien en bash.
Para adelantarse a sus conjeturas iniciales de solución de problemas, tenga en cuenta lo siguiente:
- safe_mode = Off
- El permiso en el directorio que contiene el PDF y el script se establece en 777, y este directorio es también donde se está escribiendo el JPG.
- El comando que estoy pasando a exec () apunta explícitamente al binario que se está utilizando (por ejemplo, / usr / local / bin / convert).
- display_errors = Encendido
- error_reporting = E_ALL
- disable_functions = [blank]
- Me estoy haciendo eco de la salida de exec () y no devuelve nada. El comando que se ejecuta de forma predeterminada no devuelve nada.
Cuando llamo a este script PHP desde el navegador (visitando http://www.example.com/script.php ), exec () no ejecuta su argumento.
IMPORTANTE : Sé que no hay problemas con mi script o la forma en que he construido el comando bash, porque desde bash, puedo ejecutar el script con ''php'' y funciona (por ejemplo, ''php script.php'' convierte el archivo)
También intenté desconectar exec () con system ().
Por último, he tenido este problema una vez en el pasado pero no puedo recordar cómo lo arreglé.
Sé que me falta algo, así que espero que alguien más haya experimentado esto como lo he hecho y recuerde cómo solucionarlo.
Gracias de antemano por cualquier ayuda que pueda brindar.
Alex
¿Su usuario de Apache / servidor web tiene los derechos necesarios para ejecutar el comando de shell?
Cuando se ejecuta desde el cl, es probable que se ejecute como un usuario diferente, lo que puede explicar qué cl funciona pero a través del navegador no.
Dado que funciona desde la línea de comandos (que estaría bajo su propia cuenta de usuario), me parece que la cuenta con la que se ejecuta el servidor web (a menudo "www-data") no tiene permisos de ejecución en el programa de conversión. .
El dispositivo de salida predeterminado se cambia.
iniciar sesión como www (después de habilitar) da salida a través de shell, pero no a través de php.
El usuario de Apache www-data
necesita privilegios para ejecutar ciertas aplicaciones usando sudo
.
- Ejecute el comando
sudo visudo
. En realidad, queremos editar el archivo enetc/sudoers
. Para hacer eso, al usarsudo visudo
en la terminal, duplicar (temp) el archivosudoers
para editar. - Al final del archivo, agregue el siguiente ejemplo: -si queremos usar el comando para reiniciar smokeping y montar el comando para otra acción,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(Esto supone que desea ejecutar restart
y mount
comandos utilizando privilegios de superusuario (raíz).)
Sin embargo, si desea ejecutar cada aplicación utilizando privilegios de superusuario, agregue lo siguiente en lugar de lo que está arriba. Puede que no desee hacer eso, no para ALL
comandos, muy peligroso.
www-data ALL=NOPASSWD: ALL
3. Después de editar el archivo sudoers (mediante visudo
editamos el archivo temporal de sudoers
así que guarde y salga del archivo temporal (visudo) para escribir en el archivo sudoers
. ( wq!
)
4. Eso es todo, ahora usa exec()
de la siguiente manera dentro de tu script xxx.php
. recuerde usar sudo
antes de usar el comando en el script php.
ex:-
exec ("sudo /etc/init.d/smokeping restart 2>&1");
Entonces, en su problema, agregue los comandos que desea usar en el step no (2.)
medida que agrego y cambio su script php como lo desee.
He determinado que esto es un problema con ImageMagick, no con PHP. Estoy intentando algunas correcciones, y si no funcionan, voy a terminar usando alguna biblioteca compartida de PHP (probablemente imagick) para hacer el trabajo.
Puede ser debido a los diferentes usuarios que ejecutan el script a través del servidor web y el script a través de bash.
Normalmente los scripts / exec invocados a través del servidor como con el usuario ''www'' y este usuario no tienen ningún acceso de escritura a su área. pero cuando ejecuta el script en bash, entonces tiene permisos de escritura.
Solo supongo que es posible que el usuario del proceso del servidor web no tenga privilegios para hacerlo.
Agregue 2>&1
al final de su comando para redirigir los errores de stderr a stdout. Esto debería dejar en claro qué está mal.