Página 1 de 2

Restricciones de system

NotaPublicado: 2008-08-22 17:57 @789
por timon
Buenos días a todos. Mi nombre es Jorge.

Estoy integrando el TPV de La Caixa en una ONG y tengo una duda.

Desde PHP he llamado a través de Curl a un script en Perl para poder ejecutar una aplicación del sistema que devuelve una URL (que es a la que tengo que enviar el formulario de pago).

El caso es que en el pequeño script en Perl, ejecuto un comando cualquiera como ls -l, funciona perfectamente y lo veo por pantalla, pero al ejecutar la aplicación (la cual se ejecuta perfectamente por consola) no se ve nada.

¿Existe alguna restricción? El ejecutable (un .sh), tiene los permisos 777.

Un saludo y gracias por adelantado.

NotaPublicado: 2008-08-22 22:17 @970
por explorer
Bienvenido a los foros de Perl en Español, timon.

Pero, ¿la aplicación debería devolver algo?

En estos foros hay algunos hilos al respecto del intercambio de información entre PHP y Perl. Usa el sistema de búsqueda (si no te funciona, usa Google sobre este sitio).

NotaPublicado: 2008-08-23 05:53 @287
por timon
Muchas gracias por responder Explorer.

La verdad es que muchos tenemos que agradecer las prontas respuestas que das.

Respecto al tema, sí, la aplicación devuelve una URL. El caso es que la aplicación funciona en consola, y también funciona en web pero en la máquina que tengo de demo es una Ubuntu (yo ataco desde otra distinta). En producción está sobre una CentOS, y es ahí donde no va.

¿Existe algún tipo especial de parámetro? Te muestro los dos ficheros:

tpv.php //este php mira tpv.cgi para que le devuelva la url
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <?php 
  2. $ch = curl_init(); 
  3. curl_setopt($ch, CURLOPT_URL, 'http://www.midominio.es/cgi-bin/test/tpv.cgi'); 
  4. curl_setopt($ch, CURLOPT_HEADER, false); 
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
  6. $resultado = curl_exec($ch); 
  7. $error = curl_error($ch); 
  8. curl_close($ch); 
  9. echo $resultado; 
  10. ?> 


tpv.cgi //este es el fichero que me debería de devolver el resultado de la consulta al sistema
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
my $sentencia = `/usr/local/tpv/CrURLtpv.sh`;
print "Content-type: text/html \n\n";
print("<html>\n");
print("<head>\n");
print("<title>\"TPV\"</title>\n");
print("</head>\n");
print("<body>\n");
print "<h1>$sentencia</h1> \n";
print("</body>\n");
print("</html>\n");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El tema de comunicación entre PHP y Perl no me preocupa, está resuelto, el tema es que la orden de Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $sentencia = `/usr/local/tpv/CrURLtpv.sh`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
no funciona; sin embargo sí lo hace si lo sustituyo por un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $sentencia = `ls -l`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Curioso, ¿no? (ya dije antes que por consola sí funciona y en la máquina de pruebas también, solo es en producción con un CentOS donde no va).

Un saludo.

NotaPublicado: 2008-08-23 06:40 @319
por explorer
Es muy importante que veas los ficheros log de actividad del CentOS, sobre todo el de errores. Cuéntanos si ves algo raro.

Yo sospecho que puede tratarse de un problema de enjaulado (chroot). O quizás, el usuario que ejecuta el servidor web no tiene permiso para entrar en la carpeta /usr/local/tpv/.

Repasa: las carpetas que llevan hasta CrURLtpv.sh deben tener permisos de lectura y ejecución para el usuario que ejecuta el servidor web. En caso extremo y fácil, ponle 755 de permisos. Y para el ejecutable, también te vale un 755.

NotaPublicado: 2008-08-23 12:34 @565
por timon
Muchas Gracias por responder.

Pues lo de los permisos fue lo primero que revisé y tiene permisos tanto los ficheros como la carpeta de 755.

He pensado en el tema del CHROOT y he instalado la aplicación dentro del directorio de trabajo del usuario Apache, es más, dentro del directorio protegido del usuario: /var/www/vhost/midominio.com/tpv,
y sigue igual: por consola funciona y también en la máquina de demo (no es una máquina con virtual host), pero si intento ejecutarlo en la de producción, nada de nada, en los logs del Apache no dice nada, y en los de /var/log/messages tampoco dice nada, es más, he hecho dentro de /var/log la siguiente búsqueda: find . -type f | xargs grep "tpv.sh" para buscar en todos los logs algo referente al tema, y no ofrece ningún resultado.

¿Dónde puedo ver los errores de Perl cuando se ejecuta como CGI? o, ¿qué orden puedo pasar dentro del CGI para que me informe de errores durante su ejecución en formato HTML?

Un saludo y muchas gracias de nuevo.

NotaPublicado: 2008-08-23 13:06 @587
por explorer
En los logs debería salir, al menos, la petición CGI que hace el php. Si no sale, malo.

En cuanto a la forma de presentar los fallos en la página HTML, usa el módulo CGI::Carp, como verás en mi CGI mínimo.

NotaPublicado: 2008-08-24 05:57 @289
por timon
Bueno ya voy encaminando el tema.
En efecto, al colocar el tpv.cgi en el vhost default, o sea, en /var/www/vhost/default/cgi-bin/ y haciendo la llamada a http://123.123.123.123/cgi-bin/tpv.cgi, consigo un error en el /etc/log/httpd/error_log. Es un error de Java, debe ser por cuestiones del PATH... pero vamos, que no tiene nada que ver con Perl... es cosa ya de configuración del Java... (es casi peor... le tengo mucha manía al Java).

Muchas gracias por las respuestas, en cuanto dé con la solución la publico para el saber general.

NotaPublicado: 2008-08-24 06:20 @305
por explorer
Un momento...

¿Tenemos un PHP, que llama a un Perl, que llama a un sh, que llama a un Java?

¿A quién se le ha ocurrido semejante engendro?

NotaPublicado: 2008-08-24 11:28 @519
por timon
¡¡¡JAJAJAJA!!!, ¡¡pues sí!!, se les ha ocurrido en parte a los del banco, por hacer el TPV en Java accesible desde el sistema, pasándole parámetros a un .sh.

El caso es que para poder pasar parámetros al .sh, no se puede hacer directamente a través de PHP, por restricciones de seguridad, entonces lo que se hace es invocar a un .cgi hecho en Perl a través de CURL... un engendro, sí... y además sigo sin saber cómo arreglar el tema del PATH. De java, no sé cómo indicarle al interprete de Perl qué PATH debe de tener cuando se ejecuta el CGI.

NotaPublicado: 2008-08-24 11:52 @536
por explorer
Bien, pues entonces, a ese engendro, me sobra el PHP y el sh. Quiero decir que se puede hacer una llamada al cgi y éste, llamar al java.

En cuanto a lo del PATH, puedes cambiar el trabajo del programa, con chdir().