• Publicidad

Problemas con Net::SSH::Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problemas con Net::SSH::Perl

Notapor mortenol » 2012-10-29 06:57 @331

Buenas a todos.

Estoy pasando un script hecho en Bash a Perl. Bueno, lo que hace este script es ejecutar comandos en máquinas remotas y pintarlo en HTML los resultados con PHP.

Bueno, me estoy encontrando con un montón de problemas al utilizar el módulo Net:SSH::Perl. No consigo que me ejecute un simple script que me haga un ls de un directorio remoto. A parte de la que he tenido que liar para instalar el módulo, vamos, al final lo he tenido que hacer con el force.

¿Alguna sugerencia?
mortenol
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-03-26 05:24 @267

Publicidad

Re: Problemas con Net::SSH::Perl

Notapor explorer » 2012-10-29 17:21 @765

Sin ver el código es difícil decirlo.

Por aquí hay varios hilos hablando de ese módulo.

Usa el sistema de búsqueda para buscar por ese módulo.
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

Re: Problemas con Net::SSH::Perl

Notapor mortenol » 2012-10-30 08:43 @405

Al final me he decidido por utilizar Net::SSH2.

Con este módulo me ha sido más fácil ejecutar comandos en máquinas remotas, pero al final para lanzar el comando tengo que acudir a Bash. Por ejemplo, si quiero saber cuánto espacio tiene disponible un disco quitando las cuotas asignadas, tengo que utilizar el comando df para el espacio y el repquota para las cuotas de disco.

¿Lo estoy haciendo correcto?
¿Se puede hacer todo desde módulos de Perl sin acudir a ningún exec ejecutando un comando de Bash?

Gracias.
mortenol
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-03-26 05:24 @267

Re: Problemas con Net::SSH::Perl

Notapor explorer » 2012-10-30 10:43 @488

Debes entender cómo estás haciendo la conexión: cuando estableces la conexión SSH, se abre un puerto de comunicaciones entre tu máquina y la máquina a donde te conectas. Esa conexión permite la ejecución de comandos que se van a ejecutar en la máquina destino. Pero no significa que los programas y procesos de tu máquina se puedan ejecutar en la máquina destino. Solo los que residan en ella.

Entonces, para saber el espacio libre en disco, necesitas acceder al sistema de archivos y conocer su estado. La forma más cómoda es ejecutando df de la propia máquina destino. Y solo se puede hacer en la propia máquina destino, así que sí: si que tienes que ejecutar un Bash, que lance y recoja el resultado de la ejecución.

No vale con lanzar un system() en tu programa Perl, porque solo se refiere a los comandos y programas de tu propia máquina. No vale con usar módulos de Perl, porque se están ejecutando en tu máquina, no en la de destino.

Otra cosa es que en la máquina destino instales un programa Perl que use esos módulos. Y otra cosa es que ejecutes un comando en la máquina destino, obtengas un resultado, y lo trates en tu programa, con esos módulos. Pero ya es el resultado.

Si la máquina destino no tiene el comando df, entonces debes obtener los datos desde la información que te devuelva el sistema gestor del sistema de archivos.

El resultado puede ser un texto que salga en pantalla, o un archivo que queda residente en la máquina destino y que luego recogerás, o abrir otro puerto (por el mismo SSH, por ejemplo), y transferir el resultado a algún programa que esté escuchando en tu máquina (que puede ser el mismo programa Perl que usa Net::SSH2, pero ahora no sé cómo se podría hacer. Tendrás que consultar su manual).
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

Re: Problemas con Net::SSH::Perl

Notapor mortenol » 2012-10-30 11:43 @530

¡¡¡Perfecto!!!

Cuando decía hacerlo todo con Perl me refería a utilizar módulos como File::Remote.

Creo que puede ser más fácil hacerlo con comandos de Bash y el retorno tratarlo con Perl.

Gracias.
mortenol
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-03-26 05:24 @267

Re: Problemas con Net::SSH::Perl

Notapor explorer » 2012-10-30 14:37 @650

Con File::Remote sí que lo puedes hacer, porque lo que hace es abrir un canal SSH, y ejecuta comandos en el shell del sistema remoto, igual que si entras como ahora y los ejecutas con el Bash del remoto.
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

Re: Problemas con Net::SSH::Perl

Notapor mortenol » 2012-11-02 06:52 @328

Lo estoy haciendo todo con NET::SSH2 y abriendo un canal para utilizarlo con shell().

Tengo que ejecutar bastantes comandos en la máquina remota y me está ocurriendo que algunos comandos tardan en ejecutarse y cuando pinto el HTML todavía no tengo el resultado del comando.

Por ejemplo, quiero ver la cuota que tiene un grupo, lanzo el comando y en la siguiente línea hago un split() para sacar lo que tiene ocupado, a continuación pinto el valor, pero el comando todavía se está ejecutando en la máquina remota, con lo cual no me pinta nada. He probado a tener esos datos en un fichero primero y me funciona bien.

¿Cómo puedo controlar eso? He pensado en un mensaje de "Se está generando..." y cuando tenga todos los valores, pintarlos en HTML.

Actualmente lo hago todo en Bash y tengo un script que se lanza cada hora, pero eso es una de las cosas que quiero quitar al pasar mi programa a Perl. Quiero que los datos se actualicen cada vez que se hace una petición a la URL.
mortenol
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-03-26 05:24 @267

Re: Problemas con Net::SSH::Perl

Notapor explorer » 2012-11-02 11:55 @538

Lo normal es que si lanzas un proceso mediante system() o qx(), el programa Perl no continúa hasta que el programa lanzado termine (otra cosa es abrirlo con un open() y un proceso entubado). Así que no entiendo eso de que "el proceso no ha terminado" y el cgi sigue.

Es cierto que los servidores web imponen un tiempo máximo de ejecución (por motivos de seguridad). Ese tiempo es configurable, pero no debería ser más de un minuto. Si tu proceso tarda menos de eso, no deberías tener problemas.

Hay opciones para los casos de procesos que lleven mucho tiempo. Antiguamente se resolvían mediante la técnica push, pero hoy en día eso se resuelve más con la técnica Ajax o mediante un refresh automática de la página o de un marco iframe. O lo más moderno: websockets.

Así, se hace como lo comentas: un cgi lanza el proceso largo, y termina, y devuelve al usuario una página web que lo único que hace es conectarse de forma periódica al servidor (otro cgi) que comprueba el término de la primera ejecución. Si no ha terminado, redibuja una barra de progreso o algo así, y queda esperando para la siguiente vuelta. Si ha terminado, saca la página final o directamente lo redirige a otra página distinta.

Este es un tema importante. En Google puedes encontrar más referencias, buscando por las palabras 'perl cgi long process'.

Creo que en CGI::Ajax había un ejemplo. O en CPAN, creo que había un módulo CGI::xxx que facilitaba hacer esto.
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

Re: Problemas con Net::SSH::Perl

Notapor mortenol » 2012-11-05 06:51 @327

Este es el trozo de código que estoy ejecutando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $chan3 = $ssh3->channel();
  2. $chan3->shell();
  3. #print $chan3 "repquota -g /opt/data1 | grep gc_\n";
  4. print $chan3 "cat /tmp/test\n";
  5. while (<$chan3>){
  6.        my @cuotas = split(' ', $_);
  7.        $sumatorio = $sumatorio+$cuotas[2];
  8.        $totalcuotas = $totalcuotas+$cuotas[3];
  9. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si descomento la primera línea del print() y comento la segunda, cuando hago la llamada a este script que lanza el comando en una máquina remota, $chan3 es 0. Sin embargo, si comento el primer print() y descomento el segundo y ya tengo en la máquina remota el resultado del comando en el fichero test, $chan3 tiene los valores correctos.

¿Cómo puedo hacer para que el while() no se ejecute hasta que $chan3 tenga el resultado del comando repquota?
mortenol
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-03-26 05:24 @267

Re: Problemas con Net::SSH::Perl

Notapor explorer » 2012-11-05 14:34 @648

Yo no haría eso, lo de ejecutar un proceso y leer lo que me llega.

Preferiría mandar ejecutar un proceso y que el módulo supiese qué es lo que devuelve. Usar el método exec(), según veo en los ejemplos.

Por ejemplo, puedes hacer algo así (no probado);

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $chan3 = $ssh2->channel;
  2. $chan3->exec('repquota -g /opt/data1 > /tmp/quota_data1.txt; cat /tmp/quota_data1.txt') or die;
  3.  
  4. my $sumatorio   = 0;
  5. my $totalcuotas = 0;
  6.  
  7. while (<$chan3>) {
  8.     next if not /gc_/;              # filtro
  9.     chomp;
  10.     my @cuotas = split " ";
  11.  
  12.     $sumatorio   += $cuotas[2];
  13.     $totalcuotas += $cuotas[3];
  14. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Varias cosas:
  • el filtrado de 'gc_' lo hago dentro del while(). Prefiero tener yo el control del filtrado, que no ejecutar un grep externo
  • importante: según la documentación, solo se puede ejecutar un exec() por canal abierto. En caso de querer lanzar más de un comando, es mejor lanzar shell()
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 Básico

¿Quién está conectado?

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