Foros del Web » Programación para mayores de 30 ;) » Programación General »

ejecutar comandos de linux y postgres en html con cgi

Estas en el tema de ejecutar comandos de linux y postgres en html con cgi en el foro de Programación General en Foros del Web. Triste, estoy desesperada, no se como ejecutar por ejemplo pg_dump desde la web, ejecuto el cgi, pero no lo hace, tampoco da ningun error, sin ...
  #1 (permalink)  
Antiguo 15/07/2003, 10:49
 
Fecha de Ingreso: julio-2003
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
ejecutar comandos de linux y postgres en html con cgi

Triste, estoy desesperada, no se como ejecutar por ejemplo pg_dump desde la web, ejecuto el cgi, pero no lo hace, tampoco da ningun error, sin embargo ejecuto ese mismo cgi desde linea de comandos y lo hace perfectamente.
Lo mismo me ocurre con comandos de linux, me han dicho que puede ser un problema de permisos pero no doy con ello, Por favor necesito ayuda
  #2 (permalink)  
Antiguo 15/07/2003, 16:16
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola.

Tu problema luce interesante, y no creo que sea nada complejo de resolver, si, como dices, la aplicación se ejecuta normalmente desde la línea de comandos y el fallo está cuando quieres ejecutarla a través de CGI.

Lamentablemente no logro interpretar completamente la situación que describes. Te pediría que por favor dieras más detalle de lo que acontece.

* ¿Sobre qué sistema operativo trabajas y qué servidor web usas? Me llevo la impresión de que trabajas bajo GNU/Linux y usas el servidor Apache, ¿es eso correcto?

* ¿Cómo luce tu aplicación CGI? ¿Qué esperas que haga? ¿Te basta con que ejecute el comando pg_dump en el fondo? ¿Necesitas que la salida del comando pg_dump sea desplegada en una página web?

* ¿En qué lenguaje está escrito este programa? Si es lo suficientemente corto, ayudaría mucho si publicaras su código fuente para estudiarlo en busca de su posible fallo.

* Con el propósito de descartar posibles causas, ¿tienes la seguridad de que el servidor web tiene la capacidad de ejecutar aplicaciones CGI correctamente? ¿has probado con otro tipo de programas orientados a CGI?

Cualquier información adicional a lo que ya has dicho podría ser muy útil para encontrar la causa y la solución del problema. Un cordial saludo.
  #3 (permalink)  
Antiguo 16/07/2003, 08:49
 
Fecha de Ingreso: julio-2003
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
Voy a intentar responder a todas tus preguntas:
Yo ejecuto desde la linea de comandos el cgi y lo hace bien, pero si ejecuto ese cgi desde la web no lo hace, no da error ni nada.

Uso Red Hut 8.0, apache, postgres, el lenguaje de programación es perl.

El servidor web si lo soporta pues todo el proyecto esta compuesto por .pl y .html, utilizamos la extensión pl en vez de cgi, espero no tenga nada que ver.

El codigo es el siguiente:

#!/usr/bin/perl

use Shell;
#use CGI::Carp qw(fatalsToBrowser);

chdir("/usr/local/pgsql/data");
#system("pg_dump vacunas2 > vacunas2.pgdump") || die("Mensaje de error pecadorr: $!");
system("pg_dump -u vacunas4 > vacunas4.pgdump");

print "Content-type: text/html\n\n";

print << "HTML";
<HTML><HEAD><TITLE></TITLE></HEAD>
<BODY>
<H2 align=center>LA BASE DE DATOS HA SIDO SALVADA CORRECTAMENTE</H2>
<BR><BR><BR><BR><A href="javascript:close()">Cerrar ventana</A><BR>
<A HREF="javascript:history.back()"> Volver atr� </A><BR>
<A HREF="http://10.170.136.111/primera.htm"> Salir </A>
<BR><A HREF="http://10.170.136.111/secret/admin2.htm"> Volver al menu de administrador</A>
</BODY>
</HTML>
HTML

Espero lo puedas entender. Ejecuta supuestamente el pg_dump y luego visualiza la pagina de que lo ha hecho bien, pero no lo hace bien.
  #4 (permalink)  
Antiguo 16/07/2003, 09:43
Avatar de Saga  
Fecha de Ingreso: febrero-2002
Ubicación: Monterrey
Mensajes: 32
Antigüedad: 22 años, 2 meses
Puntos: 0
Hola jo555su, yo utilizo en ocasiones en lugar de la funcion system las comas inversas, funcionan exactamente igual, los comandos que escribas ahi seran invocados directametne en la consola del SO y puedes obtener el resultado de lo que normalmente se desplegaria en pantalla en un array.

Esto me ha funcionado en perl bajo solaris, linux y windows 2000.

Te mando un ejemplo, espero te sirva.

@result_ = `pg_dump -u vacunas4 > vacunas4.pgdump`;
foreach $i (@result_) {
print "$i<br>\n";
}



Saludos
  #5 (permalink)  
Antiguo 16/07/2003, 15:33
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola de nuevo,

Creo que ya entiendo cuál es tu problema. Sucede que el comando pg_dump al ser llamado con la bandera `-u' convierte la aplicación en un programa "interactivo", es decir, que espera la respuesta del usuario desde la sesión de terminal.

Cuando ejecutas tu programa Perl en la línea de comandos, seguramente recibirás una respuesta como:

Código:
$ ./pg_cgi.pl 
User name: mi_usuario
Password:
En donde tu escribes manualmente los valores de nombre de usuario y contraseña. Cuando transladas eso al entorno CGI, las cosas ya no van a funcionar de igual modo. El programa Perl no tiene en este punto un modo de transmitirle al proceso pg_dump esa información que tu ingresas manualmente en la línea de comandos.

Este es un problema un poco complejo, ya que tratar de emular o automatizar la entrada estándar de un proceso separado desde Perl tiene una serie de inconvenientes. Los búferes de Unix suelen arruinarlo todo cuando se intentan soluciones simples, y por lo general tener que recurrir a tanto complique para algo tan "simple" es señal de que deben haber otras formas de resolver el problema.

Así que te puedo dar dos recomendaciones, primero, intenta evitar el parámetro `-u' del comando pg_dump. No sé qué versión de postgresql tienes, y tengo entendido que el comando pg_dump ha modificado un poco el comportamiento de sus banderas (cosa que depende de la versión que tengas). Es posible que en tu caso el comando acepte la bandera `-U' (en mayúscula), la cual sirve para especificar directamente el nombre del usuario para acceder a la base de datos (al menos en la versión 7.3.2 de postgres, que yo tengo). En ese caso, es posible que te sirva algo como esto:

Código:
    system("pg_dump -U mi_usuario vacunas4 > vacunas4.pgdump");
Si esto no funciona, otro camino podría ser buscar medios para automatizar este programa interactivo. Existe una aplicación popular que hace exactamente eso. Se llama `Expect':

http://expect.nist.gov/

Muy posiblemente si tienes los CDs de RedHat, o dispones de cualquier otro recurso de instalación del sistema, encuentres allí rpms para este paquete y puedas instalarlo de forma simple. Una vez tengas instalado el programa expect, puedes usarlo directamente como intérprete para tu aplicación orientada a CGI, la cual hará de intermediario entre el servidor web y el comando pg_dump. El comando `expect' básicamente tiene la capacidad de ejecutar comandos que son una combinación del lenguaje Tk y la sintaxis propia de comandos Expect. En la documentación de expect encontrarás más información.

Por ejemplo, podrías escribir un script con este aspecto:

Código:
#! /usr/bin/expect -f

# No direccionar el resultado de las interacciones a stdout
log_user 0

# Iniciar el proceso externo. Notese que la redireccion a un archivo
# de salida se realiza mas adelante
spawn pg_dump -u vacunas4

# Se emula el ingreso normal de los datos de nombre de usuario y
# contrasenya
expect "User name: "
send "mi_usuario\r"
expect "Password: "
send "mi_contrasenya\r"

# Se define el archivo de salida del comando pg_dump
set salida [open "/usr/local/pgsql/data/vacunas4.pgdump" w]

# Se define un tiempo de espera comodo
set timeout 30

# Leer la salida del comando pg_dump y almacenarla en el archivo de
# salida
expect {
    -re "(.*)\n" {
        puts $salida "$expect_out(buffer)\n"
        exp_continue
    }
}

# Imprimir las cabeceras HTTP y el contenido de la pagina web
puts "Content-type: text/html\n\n";

puts "<HTML><HEAD><TITLE></TITLE></HEAD>\n\
<BODY>\n\
<H2 align=center>LA BASE DE DATOS HA SIDO SALVADA CORRECTAMENTE</H2>\n\
<BR><BR><BR><BR><A href=\"javascript:close()\">Cerrar ventana</A><BR>\n\
<A HREF=\"javascript:history.back()\"> Volver atr\x{FFFD} </A><BR>\n\
<A HREF=\"http://10.170.136.111/primera.htm\"> Salir </A>\n\
<BR><A HREF=\"http://10.170.136.111/secret/admin2.htm\">\n\
Volver al menu de administrador</A>\n\
</BODY>\n\
</HTML>\n"
El previo script, como cualquier otra aplicación para CGI, debe tener permisos de ejecución y una extensión válida para que el servidor web reconozca que es CGI.

Si no deseas o no puedes instalar este paquete, hay otra opción y es mediante una librería de Perl que se llama precisamente Expect.pm. El propósito de esta librería es muy similar al paquete con el mismo nombre, y es 100% perl. Puedes encontrarla en CPAN, el repositorio más famoso de librerías de Perl que se conoce. Si tienes experiencia instalando nuevas librerías desde CPAN, quizás quieras probar este método.

Espero que encuentres la solución definitiva a tu problema. Un saludo.
  #6 (permalink)  
Antiguo 21/07/2003, 09:53
 
Fecha de Ingreso: julio-2003
Mensajes: 3
Antigüedad: 20 años, 9 meses
Puntos: 0
Hemos estado mirando lo que nos dijiste y seguimos con el mismo problema, con el expect lo hace en modo comando pero en html nos sale el error 500, y tiene bien puestos todos los permisos, asi que no sabemos porque puede ser.

La otra opcion la de - U tampoco me funciona, esa ni sikiera en linea de comando.

Gracias por todo de todas formas.
Un saludo.
  #7 (permalink)  
Antiguo 21/07/2003, 13:24
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Bueno, al menos se percibe cierto progreso ¿no es así? :)

Al parecer ya has encontrado una solución no-interactiva a tu problema, que funciona al menos desde la línea de comandos. Así que regresamos prácticamente a la situación inicial en la que mi opinión fue algo como "no creo que sea nada complejo de resolver, si la aplicación por lo menos se ejecuta normalmente desde la línea de comandos".

Tengo algo que quisiera preguntarte ahora, antes que nada: ¿qué escribes en la línea de comandos para ejecutar tu aplicación expect?

Estoy dudando que alguna de las siguientes sea la causa, pero aun así creo que no se pierde mucho intentando.

(a) Puede que sea la extensión del archivo que contiene el programa. Aunque ciertamente es improbable ya que parece que tu servidor web sí lo reconoce como una aplicación que debe ejecutar y por eso envía como respuesta un error 500. En todo caso, intenta colocándole diferentes extensiones: .cgi o .pl (aunque no seo un programa de Perl.) En últimas, si esta es la causa, puedes configurar después tu servidor para que reconozca la extensión que quieras como aplicación para CGI.
(b) ¿Cuál es la ubicación del comando `expect' en tu sistema? Si no es /usr/bin/expect, es posible que puedas consultarlo mediante el comando ``which expect''. Después simplemente modificas la primera línea del programa acordemente para que funcione. Pero si llamas tu programa desde la línea de comandos con algo como `./script.cgi' o algo parecido (es decir, sin llamar al intérprete expect explicitamente) y funciona, entonces esta no debe ser la causa.

Es curioso, y la verdad me intriga mucho que no funcione, de modo que con gusto quisiera ayudarte con cualquier cosa hasta que llegues a la solución del problema. Puede ser un ejercicio educativo para todos :). Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:20.