Página 1 de 1

Net::SSH::Perl

NotaPublicado: 2009-10-01 07:22 @349
por situ
Estimados, tengo el siguiente script el cual tiene como objetivo mediante el módulo en cuestión recaudar información de mis servidores.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. BEGIN {
  3.  
  4.     eval "use Net::SSH::Perl";
  5.  
  6.     if ( $@ ) {
  7.  
  8.         warn  "No se puede cargar el modulo: Net::SSH::Perl\n"
  9.  
  10.         . "Instalar modulo:\n"      
  11.  
  12.         . "\t\t~# perl -MCPAN -e 'install Net::SSH::Perl'l\n";
  13.  
  14. exit ();
  15.  
  16.  }
  17.  
  18. }
  19.  
  20. if ( @ARGV != 2 ) {
  21.  
  22.     die "\nUso: $0 <hosts> <reporte>\n\n"
  23.  
  24.       . "   <hosts>   Hosts donde nos vamos a conectar [ej -> hosts.txt]\n"
  25.       . "   <reporte> Reporte [ej -> reporte.txt]\n\n"
  26.       ;
  27.  
  28. }
  29.  
  30. use Net::SSH::Perl ;
  31.  
  32. $file = $ARGV[0];
  33. chomp $file;
  34. open  $FILE, '<', $file or die $!;
  35. @hosts = <$FILE>;
  36. close $FILE;
  37.  
  38. $reporte = $ARGV[1];
  39. close $reporte;
  40.  
  41. open (F,">> $reporte");
  42. print F "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN''htp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n";
  43. print F "<html xmlns=http://www.w3.org/1999/xhtml>\n<head>\n";
  44. print F "<meta http-equiv=Content-Type content='text/html;charset=iso-8859-1' />\n";
  45. print F "<title>Reporte de Datos</title>\n";
  46. print F "</head>\n";
  47. print F "<body>\n";
  48. print F " <table border='0' align=center width=700 cellpadding='0' cellspacing='0' bgcolor=#ffffff>\n";
  49. print "[+] Hosts:$file\n[+] Reporte:$reporte\n\n";
  50.  
  51. for  $archivo(@hosts){
  52.     chomp $archivo;
  53. $scon = Net::SSH::Perl->new ("$archivo");
  54. $scon->login("situ","mipassword");
  55. ($output,$errors,$exit) = $scon->cmd("echo '<tr>\n<td bgcolor=#f2f2f2>\n<font color=#ff0000>-Hosts:<br></font>\n';hostname;echo '</td></tr>\n<tr>\n<td bgcolor=#f2f2f2>\n<font color=#666600>-Passwd:<br></font>';cat /etc/passwd;echo '</td></tr>\n<tr>\n<td bgcolor=#f2f2f2>\n<font color=#666600>-Kernel:<br></font>';uname -a;echo '</td></tr>\n<tr>\n<td bgcolor=#f2f2f2>\n<font color=#666600>-Red:</font>';/sbin/ifconfig -a;echo'</td></tr>\n'");
  56. print F "$output\n";
  57.     }
  58. print F " </table>\n";
  59. close (F)
  60.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El problema que tengo es que solo se ejecuta en un host; cuando pasa al segundo obtengo lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Net::SSH: Can't bind socket to port 1023: Dirección ya está en uso at test1.pl line 53
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Alguien me puede ayudar? Por otro lado quería ver si había alguna posibilidad de cambiar el formato de la creación del HTML porque por ejemplo al traerme la información de la red está todo junto y no como me lo muestra cuando hago el comando por consola.

¡Saludos y Gracias!

Re: Net::SSH::Perl

NotaPublicado: 2009-10-01 07:58 @374
por explorer
Yo cambiaría la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $scon = Net::SSH::Perl->new ("$archivo");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $scon = Net::SSH::Perl->new ("$archivo");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así, el objeto $scon será liberado en cada vuelta. Bueno, al menos es lo que debería de pasar.

En cuanto al HTML, podrías usar cualquiera de los módulos existentes para generarlo, y te ahorrarías más de la mitad de código. El propio CGI se puede usar para eso.

Y en cuanto a lo de enviar el código HTML al servidor remoto, para luego recogerlo, me parece un poco excesivo. Yo mandaría los comandos a ejecutar y recibiría la salida todo en formato texto. Solo tendría que interpretarla y colocarla dentro de marcas HTML. O ejecutar un comando cada vez.

Re: Net::SSH::Perl

NotaPublicado: 2009-10-01 08:54 @412
por situ
Me da el mismo error.
Por otro lado quería consultarte cómo puedo hacer para que se genere un reporte por cada host. Te dejo el script nuevamente pero para formato plano.

Saludos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. BEGIN {
  3.  
  4.     eval "use Net::SSH::Perl";
  5.  
  6.     if ( $@ ) {
  7.  
  8.         warn  "No se puede cargar el modulo: Net::SSH::Perl\n"
  9.  
  10.         . "Instalar modulo:\n"      
  11.  
  12.         . "\t\t~# perl -MCPAN -e 'install Net::SSH::Perl'l\n";
  13.  
  14. exit ();
  15.  
  16.  }
  17.  
  18. }
  19.  
  20. if ( @ARGV != 2 ) {
  21.  
  22.     die "\nUso: $0 <hosts> <reporte>\n\n"
  23.  
  24.       . "   <hosts>   Hosts donde nos vamos a conectar [ej -> hosts.txt]\n"
  25.       . "   <reporte> Reporte [ej -> reporte.txt]\n\n"
  26.       ;
  27.  
  28. }
  29.  
  30. use Net::SSH::Perl ;
  31.  
  32. $file = $ARGV[0];
  33. chomp $file;
  34. open  $FILE, '<', $file or die $!;
  35. @hosts = <$FILE>;
  36. close $FILE;
  37.  
  38. $reporte = $ARGV[1];
  39. close $reporte;
  40.  
  41. open (F,">> $reporte");
  42.  
  43. for  $archivo(@hosts){
  44.     chomp $archivo;
  45. my $scon = Net::SSH::Perl->new ("$archivo");
  46. $scon->login("situ","passwd");
  47.  
  48. ($output,$errors,$exit) = $scon->cmd("echo '-Host:';hostname;echo '-passwd:';cat /etc/shadow;echo '-Kernel:';uname -a;echo '-Red:';/sbin/ifconfig -a");
  49. print F "$output\n";
  50.     }
  51. close (F);
  52.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Net::SSH::Perl

NotaPublicado: 2009-10-01 10:11 @466
por explorer
Ahora probaría con lo siguiente: al final del bucle, en la línea 50, insertaría la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. close $scon->sock();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

para intentar cerrar la conexión.

Y en cuanto al reporte por cada conexión, pues es fácil: crear la cabecera, hacer la conexión, obtener los resultados, formatearlos y sacarlos, poner el pie y grabar el resultado. Como ya estás dentro de un bucle, pues eso lo estás haciendo por cada servidor.

Otra cosa es cómo quieres que salgan los reportes. ¿Una página HTML por cada uno? ¿Un solo HTML con todos los reportes? ¿Otra cosa?

Re: Net::SSH::Perl

NotaPublicado: 2009-10-01 10:32 @480
por situ
Lo del close() no me funcionó. ¿Conoces otro módulo que me deje conectar por SSH usando password?

Sobre el reporte, la idea es hacer un HTML por cada host.

Gracias

Re: Net::SSH::Perl

NotaPublicado: 2009-10-02 00:24 @058
por explorer
Cambia

close $scon->sock();

por

shutdown($scon->sock(), 2);

Hay más módulos para SSH, como Net::SSH, pero el funcionamiento es algo distinto.

Re: Net::SSH::Perl

NotaPublicado: 2009-10-02 04:28 @227
por salva
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Net::SSH: Can't bind socket to port 1023: Dirección ya está en uso at test1.pl line 53
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Creo que lo que te pasa es que tienes en la configuración de ssh (en ~/.ssh/config o en /etc/ssh/ssh_config) la opción UsePrivilegedPort activada. ¡Desactívala y tu script funcionará!

De todas formas el paquete Net::SSH::Perl está un poco abandonado. Hoy en día es mejor utilizar Net::SSH2 o Net::OpenSSH (¡qué además es mío! :mrgreen: ).