• Publicidad

Problema ejecutar script en Linux

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Problema ejecutar script en Linux

Notapor yazo » 2007-07-05 17:58 @790

Hola a todos,

Tengo un pequeño problemilla para ejecutar un script para un TPV.

Consta de los archivos:
- Firmas.html, un pequeño formulario con los datos a firmar:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <html> 
  2. <body bgcolor="#808080"> 
  3.  
  4. <form name="formulario" method="get" action="salida.php"> 
  5. <br>Importe <input type="text" name="importe" value="793"> 
  6. <br>Moneda <input type="text" name="moneda" value="978"> 
  7. <br>NumPedido <input type="text" name="numpedido" value="1413:35:27"> 
  8. <br>Fuc <input type="text" name="fuc" value="133220004"> 
  9. <br>idTerminal <input type="text" name="idterminal" value="001"> 
  10. <br>Idioma <input type="text" name="idioma" value="0"> 
  11. <br>Fecha <input type="text" name="fecha" value="040914013527"> 
  12. <br>CIP <input type="text" name="cip" value="111111"> 
  13. <br><input type="submit" value="Pulse Aqui"> 
  14. </form> 
  15. </body> 
  16. </html> 
- Salida.php, que procesa los datos recibidos del formulario y devuelve una firma:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <html>  
  2. <body>  
  3. <?  
  4. $aaa=$HTTP_GET_VARS;  
  5. $comando="./Firmar ". $aaa['numpedido'] ." ".$aaa['importe']." ".$aaa['fecha']." ".$aaa['moneda']." ".$aaa['cip']." ";  
  6. $Afirma=exec($comando,$resultado);  
  7. $firma= $resultado[0];  
  8. ?>  
  9.  
  10. <br>  
  11.  
  12. <?  
  13. echo "La firma vale: \"$firma\" <br>";  
  14. ?> .  
  15. <br><a href="javascript:history.go(-1)">Volver</a>  
  16. </body>  
  17. </html> 

Además de estos archivos en el servidor se han compilado los archivos que han pasado los del TPV y se ha generado un archivo llamado "Firmar" y otros tanto necesarios para el TPV.

El servicio técnico del servidor me ha comentado que ellos han ejecutado el script y han obtenido la respuesta esperada.
También me han dicho que el archivo "salida.php" del cual hace uso la página "firmas.html" utiliza la función de PHP exec() para ejecutar los archivos compilados. Esta función está deshabilitada en nuestros servidores por motivos de seguridad, pero puede crear un script CGI en Perl para ejecutar dichos archivos y recuperar la información para su posterior procesamiento. Me han comentado que es posible la ejecución del fichero desde PHP, haciendo uso de las librerías CURL.

¿Alguno sabe como se podría hacer el script en Perl para que ejecutase Firmar y me devolviera el valor de la firma?

¿Y si es posible también saber cómo puedo conectarle para que me devuelva los valores a un archivo PHP?

Muchas Gracias por vuestra ayuda.
yazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-07-05 17:55 @788

Publicidad

Notapor explorer » 2007-07-05 19:10 @840

Bienvenido a los foros de Perl en Español.

Así que el problema es que tenéis cortado la ejecución de exec() por motivos de seguridad y en su lugar queréis sustituirlo por la ejecución de un CGI, que es un proceso que sí se que ejecutará en el servidor. Bueno...

Lo de las librerías curl se refiere a que en el código PHP se puede hacer una petición HTTP a un CGI que ejecute el binario Firmar. Naturalmente, esto quiere decir que también podemos quitar la parte de PHP y quedarnos sólo con el CGI. Es decir, el formulario HTML, en lugar de llamar a salida.php, puede llamar al CGI salida.cgi y obtener el mismo resultado, pero nos ahorramos algunos pasos intermedios.

Para la creación del CGI salida.cgi se supone que lo habéis instalado en la carpeta o directorio indicado por el servidor web para la ejecución de CGI. En el formulario HTML, en el atributo action, quizás se ponga como "/cgi-bin/salida.cgi". Tendrá un aspecto como este (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
# salida.cgi
#
# Ejecución del binario Firmar con los parámetros indicados por el usuario
#
# Yazo, 2007.
#

use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);

# Leemos los parámetros del usuario y hacemos un comando
$comando
    = '/usr/bin/Firmar'
    . ' ' . param('numpedido')
    . ' ' . param('importe')
    . ' ' . param('fecha')
    . ' ' . param('moneda')
    . ' ' . param('cip')
    ;

# Ejecutamos el comando y leemos el resultado
@resultado = qx( $comando );
$firma     = $resultado[0];         # Nos quedamos con la primera línea

# Salida del resultado en pantalla
print
    header,
    start_html('Firma'),
    br,
    "La firma vale: $firma\n", br,
    br,
    a( { href => 'javascript&#058;history.go(-1)' }, 'Volver' ),
    end_html
    ;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Este CGI debería dar la misma funcionalidad que el PHP salida.php mostrado antes.

Nota: en el código aquí mostrado, sustituir &amp;#058; por el carácter ':'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor yazo » 2007-07-06 03:33 @190

Explorer ¡eres un hacha!

Muchas gracias por responder tan pronto y por públicar el código de ejemplo.

Una cosilla, por lo que puedo entender de Perl este script recibe los datos del formulario y hace un printf para mostrar por pantalla la firma.

Mi intención es llamar al script mediante las librerías CURL de PHP, ¿cómo podría hacer para que el script reciba los datos de PHP y los devuelva otra vez a PHP?

¿Serviría de esta forma?

Muchas Gracias por todo.
yazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-07-05 17:55 @788

Notapor explorer » 2007-07-06 05:19 @263

Quizás esté ya respondido en este hilo:
viewtopic.php?p=8453
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor yazo » 2007-07-08 06:30 @312

Muchas Gracias por tu respuesta explorer.

Creo que no se me ha entendido lo que necesito, el script perl lo que necesito que haga es que devuelva el valor de la firma, y éste script quiero ejecutarle y que me devuelva a un archivo en php dicho valor, para poder trabajar con ese valor de firma.

Muchas Gracias por vuestra ayuda.
yazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-07-05 17:55 @788

Notapor explorer » 2007-07-08 08:12 @383

Entonces hay que transformar el script para que devuelva el valor de $firma y el PHP debe ser capaz de entender lo que se le devuelve. Quizás sea mejor decir que en el header se va a devolver un plain/text, luego hacer un simple print $firma; y ver con qué línea quedarnos del texto que se le devuelve al PHP.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor yazo » 2007-07-08 17:58 @790

Hola explorer,
He probado el código del scrip que me pasaste y no funciona.
Solo me pone:
"La firma vale:

Volver"

He intentado revisar el código y le he modificado según mis conocimientos de programación (que en perl son muy nulos) pero no he conseguido na.
¿Cual puede ser el error?

La variable $comando no debería empezar con:
$comando = "./Firma" . "....

Por otro lado para que devuelva la firma valdría con "return $firma;" ¿no?

Muchas Gracias por todo
yazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-07-05 17:55 @788

Notapor explorer » 2007-07-08 18:51 @827

Pero, ¿has ejecutado el script Perl directamente? ¿Y con argumentos correctos?

La forma de devolver valores desde el código Perl debería ser exit() en lugar de return, y aún así, sólo devolvería un valor numérico.

Mírate este hilo donde pone la forma correcta de intercambiar información entre PHP y Perl:
viewtopic.php?p=7932#7932

De todas formas, lo tuyo es ligeramente distinto: estás ejecutando el script Perl con una petición curl, por lo que deberás usar el retorno de una de esas funciones para leer lo que el script Perl te haya devuelto (con un print, no con el return).

El comienzo de $comando debe indicar la ruta completa o relativa a donde se encuentre el ejecutable Firma, desde luego.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor yazo » 2007-07-09 03:08 @172

Actualmente para probar el funcionamiento del script he llamado directamente al script desde un formulario en HTML:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <html>  
  2. <body bgcolor="#ffffff">  
  3.  
  4. <form name="formulario" method="get" action="/cgi-bin/salida.cgi">  
  5. <br>Importe <input type="text" name="importe" value="793">  
  6. <br>Moneda <input type="text" name="moneda" value="978">  
  7. <br>NumPedido <input type="text" name="numpedido" value="1413:35:27">  
  8. <br>Fuc <input type="text" name="fuc" value="133220004">  
  9. <br>idTerminal <input type="text" name="idterminal" value="001">  
  10. <br>Idioma <input type="text" name="idioma" value="0">  
  11. <br>Fecha <input type="text" name="fecha" value="040914013527">  
  12. <br>CIP <input type="text" name="cip" value="111111">  
  13. <br><input type="submit" value="Pulse Aqui">  
  14. </form>  
  15. </body>  
  16. </html> 


¿Estaría así bien para probar el funcionamiento?

He comprobado también llamando al archivo "cgi-bin/salida.cgi" y no me da salida por pantalla, solo muestra:
Código: Seleccionar todo
Comando: /usr/bin/Firmar     
La firma vale:


He comprobado el script y creo que el error es porque no ejecuta el script Firmar. ¿Tiene alguna diferencia entre poner la ruta de Firmar o poner como en el ejemplo de PHP que ponía './Firmar'
¿qué quiere decir esto último de './'?

Muchas Gracias por vuestra ayuda
yazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-07-05 17:55 @788

Notapor explorer » 2007-07-09 13:40 @611

Yo el formulario lo veo bien. Sólo hay que tener cuidado de que salida.cgi esté en el sitio correcto y con los permisos adecuados. Cuando lo ejecutes, mira el error.log del servidor web, pues ahí saldrán los errores más graves.

Si lo ejecutas directamente, no le estás pasando ningún argumento al salida.cgi, por lo que Firmar no recibe ningún argumento, por lo que es correcta la salida del $comando: sólo contiene a /usr/bin/Firmar.

Para probar un cgi ejecutándolo directamente, hay que pasarle los argumentos en la línea de comandos. En tu caso, sería:

Código: Seleccionar todo
salida.cgi importe="793" moneda="978" numpedido="1413:35:27" fuc="133220004" idterminal="001" idioma="0" fecha="040914013527" cip="111111"


Del salida.cgi, lo más importante es indicar dónde está realmente puesta el ejecutable Firmar. En el ejemplo anterior yo he puesto de ejemplo que está en el directorio /usr/bin, pero eso me lo he inventado. Ahí debes indicar el camino completo al ejecutable.

El significado de './' quiere decir en Unix que es un camino relativo al directorio de trabajo donde estamos, en ese momento. Así, '.' se refiere al directorio actual, y '/' se refiere a un nivel de subdirectorio. La combinación './Firmar' quiere decir que queremos ejecutar el Firmar que está en el mismo subdirectorio en donde nos encontramos ahora mismo. (Vamos, es el mismo significado que '.\' en DOS)

El problema es que siendo un cgi, ese directorio será lo más probable /usr/lib/cgi-bin (depende de la distribución Linux). Entonces, si ponemos que ejecute './Firmar', realmente estará intentando ejecutar Firmar dentro de /usr/lib/cgi-bin. ¿Está Firmar ahí? Si no está, tenemos tres opciones: o colocamos el ejecutable Firmar ahí o indicamos un camino completo a Firmar en lugar del './' o antes de ejecutar Firmar de esa manera hacemos un chdir dentro del script para colocarnos en el subdirectorio donde resida (y de esa manera lo encuentre). En el ejemplo del PHP tendríamos el mismo problema, pues la pregunta que haríamos sería ¿dónde se está ejecutando el PHP? Si aparece './Firmar' creo recordar que se refiere a que Firmar debe estar en el mismo directorio que salida.php (no lo sé, hace años que ya no uso PHP).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados

cron