• Publicidad

Net::SSH::Perl

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Net::SSH::Perl

Notapor situ » 2009-10-01 07:22 @349

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!
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Net::SSH::Perl

Notapor explorer » 2009-10-01 07:58 @374

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.
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: Net::SSH::Perl

Notapor situ » 2009-10-01 08:54 @412

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
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Net::SSH::Perl

Notapor explorer » 2009-10-01 10:11 @466

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?
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: Net::SSH::Perl

Notapor situ » 2009-10-01 10:32 @480

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
Última edición por explorer el 2009-10-01 10:46 @490, editado 1 vez en total
Razón: Ortografía, anglicismos
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Net::SSH::Perl

Notapor explorer » 2009-10-02 00:24 @058

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.
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: Net::SSH::Perl

Notapor salva » 2009-10-02 04:28 @227

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: ).
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680


Volver a Módulos

¿Quién está conectado?

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