2009-02-11 20 views
32

tengo una cierta script PHP que llama a exec() para ejecutar un comando para convertir un PDF a JPG. Este comando funciona bien en bash.ejecutivo de PHP() no se ejecutará comando shell cuando se ejecuta a través del navegador

para adelantarse a sus estimaciones iniciales de solución de problemas, tenga en cuenta lo siguiente:

  • safe_mode = Off
  • permiso en el directorio que contiene el PDF y el guión se establece en 777, y este directorio es también donde el JPG está siendo escrito.
  • El comando que estoy pasando a exec() apunta explícitamente al binario que se está utilizando (por ejemplo,/usr/local/bin/convert).
  • display_errors = On
  • error_reporting = E_ALL
  • disable_functions = [en blanco]
  • Me hago eco de exec() 's de salida 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: Yo sé que no hay problemas con mi script o la forma que he construido el comando bash, porque a partir de fiesta, puedo ejecutar la secuencia de comandos con 'php' y funciona (por ejemplo, 'script php. php' convierte el archivo)

también he intentado cambiar a cabo exec() con el sistema().

pasado, he tenido este problema una vez antes en el pasado, pero no puede recordar cómo lo arreglé.

Sé que hay algo que me falta, así que espero que alguien más ha experimentado esto como lo he hecho y recuerda cómo solucionarlo!

Gracias de antemano por cualquier ayuda que pueda proporcionar.

Alex

+0

En PHP 5, asegúrese de utilizar E_ALL | E_STRICT para informes completos de errores. – Ross

+0

* ACTUALIZACIÓN - IMPORTANTE *: descubrí que esto era un problema con ImageMagick y logré la conversión de PDF a JPEG con GhostScript (con un comando mucho más largo) en lugar de usar ImageMagick como intermediario. No hubo problemas con PHP, mis permisos o exec(). ¡Gracias por toda su contribución! – Alex

+0

¿Cuáles son los argumentos que se pasan para convertir? ¿Incluyen la ruta completa al archivo? – Powerlord

Respuesta

6

Sólo un poco de conjetura, podría ser que el usuario proceso de servidor web no tiene privilegios para hacerlo.

+0

¡Excelente! Este es un muy buen punto. Si llama a un script bash con exec (a través de php), entonces asegúrese de que Apache también pueda leer el script bash. –

5

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.

+1

¿Cómo alguien puede otorgar permisos? – glarkou

2

¿Su/usuario del servidor web Apache tiene los derechos necesarios para ejecutar el comando shell?

Cuando se ejecuta desde la CL es probable que se ejecuta como un usuario diferente, lo que puede explicar el que las obras cl, pero a través del navegador no lo hace.

+0

cómo comprobar está perrmiss? –

3

¿Ha 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 comprobaría.

Amy

64

Añadir 2>&1 al final de su comando para redirigir los errores de stderr a stdout. Esto debería dejar en claro qué está mal.

+0

Sí, estoy recibiendo un error de ImageMagick extraño: converso: falta una imagen de nombre de archivo 'test.jpg' @ convert.c/ConvertImageCommand/2766. Después de buscar un poco con Google, parece que podría ser una versión con errores. Estoy reconstruyendo la última revisión y prueba estables en unos minutos. – Alex

+3

que es un excelente consejo! – bzx

+1

omg !!!!!!!!!!!!!!!!!!! – Tebe

0

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.

1

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.

0

El dispositivo de salida predeterminado ha cambiado.

iniciar sesión como www (después de habilitarla) da salida a través de shell, pero no a través de php.

1

del usuario Apache www-data es necesario conceder privilegios para ejecutar ciertas aplicaciones utilizando sudo.

  1. Ejecute el comando sudo visudo. En realidad, queremos editar el archivo en etc/sudoers. Para hacer eso, al usar sudo visudo en la terminal, se duplica (temp) sudoers archivo para editar.
  2. Al final del archivo, agregue el siguiente ejemplo: -si queremos usar comandos para smokeping reinicio y montar comandos para otra acción,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(Esto es suponiendo que desea para funcionar restart y mount comandos usando privilegios (raíz) de superusuario.)

Sin embargo, si se desea ejecutar todas las aplicaciones utilizando privilegios de superusuario, a continuación, añadir t él sigue en lugar de lo que está arriba. Puede que no quieras hacer eso, no para los comandos ALL, muy peligroso.

www-data ALL=NOPASSWD: ALL 

3. Después de editar el archivo sudoers (por visudo editamos el archivo temporal de sudoers por lo guardado y archivo temporal (visudo) para escribir en el archivo de sudoers. (wq!)

4 .que es todo, ahora utilizan exec() de la siguiente manera dentro del guión de xxx.php. torreón recuerda utilizar sudo antes del uso de comandos en el script php.

por ejemplo: -

exec ("sudo /etc/init.d/smokeping restart 2>&1"); 

Así que en su problema, agregue los comandos que desea utilizar en la step no (2.) como agrego y cambiar su script PHP como lo desea.

Cuestiones relacionadas