• Publicidad

Usar una variable de archivo.pl en archivo2.pl

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Usar una variable de archivo.pl en archivo2.pl

Notapor gravity » 2014-07-07 01:21 @097

Estimados,

Necesito de su ayuda y sabiduría :) Estoy recién interactuando con Perl, y necesito solucionar lo siguiente:

Tengo esta topología:

Imagen

Donde uso Net::Telnet::Cisco para conectarme remotamente a los enrutadores y saco la información que necesito. La información que recojo de los equipos, la guardo en un archivo .txt y la envío a un ftp con Net::FTP. Cuando guardo el archivo .txt, el $nombre de este archivo lo recojo con STDIN con la interacción del usuario. Mi problema es que, tengo que enviar este archivo por FTP y al buscarlo no sé cómo recogerlo ya que tengo 2 archivos .pl.

¿Hay alguna forma de tomar la variable de $nombre y asociarla a Net::FTP?

Código para telnet.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. use Net::Telnet::Cisco;
  3.  
  4. my $session = Net::Telnet::Cisco->new(Host => '1.1.1.1');
  5. $session->login('admin', 'cisco');
  6.  
  7. # Execute a command
  8. my @output1 = $session->cmd('show running-config');
  9. my @output2 = $session->cmd('show ip interface brief');
  10. my @output3 = $session->cmd('show version');
  11. my @output4 = $session->cmd('show inventory');
  12. print "Ingrese el nombre de archivo:\n";
  13. $nombre = <STDIN>;
  14. open STDOUT, ">$nombre";
  15. print @output1;
  16. print @output2;
  17. print @output3;
  18. print @output4;
  19. close STDOUT;
  20. $session->close;
  21. my $outftp = system('/home/alumno/ftp.pl');
  22. open STDOUT;
  23.  
  24.  
  25.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Código para ftp.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. use Net::FTP;
  3. use strict;
  4.  
  5. my ($ftp, $host, $user, $pass, $archivo);
  6.  
  7. $host = "192.168.2.100";
  8. $user = "anon";
  9. $pass = "prueba";
  10.  
  11. $archivo = "config.txt"; //aquí quiero rescatar la variable de $nombre de telnet.pl//
  12.  
  13. $ftp = Net::FTP->new($host) or die "No se pudo conectar a FTP: $host\n";
  14. $ftp->login($user, $pass) or die "Autenticacion fallida\n";
  15. $ftp->put($archivo) or die "No se pudo subir el archivo";
  16. $ftp->quit;
  17. print "Archivo transferido...\n";
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Atento a sus comentarios.

¡ Saludos !
gravity
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2014-07-06 22:43 @988

Publicidad

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor explorer » 2014-07-07 08:15 @385

Bienvenido a los foros de Perl en Español, gravity.

No sé muy bien a qué te refieres con "asociar" una variable a un módulo, pero creo que lo que quieres es que al hacer el FTP, él ya sepa cuál es el nombre del archivo de configuración que debe recuperar. ¿Es así?

En ese caso, creo que lo mejor sería que el usuario entrara un nombre de archivo de configuración predecible (por ejemplo, 1.1.1.1_config.txt). Así, el programa que hace luego el FTP sabe deducir el archivo que quiere recuperar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor gravity » 2014-07-07 09:38 @443

Hola, explorer.

Mira, los nombres de archivos irían, por ej. con la nomenclatura config_hostname_ip = config_R1_1.1.1.1. Esto se almacena en la carpeta local root: home/alumno/config_R1_1.1.1.1.txt.

Entonces, necesito saber cómo decirle al programa ftp.pl que en el programa telnet.pl existe una variable que se llama $nombre, donde se almacena el nombre del archivo que ingresa el usuario.

ftp> put ($nombre)

Intenté haciendo un ls | que me muestra el último archivo que se guardó, y esto asociarlo a una variable para que el ftp.pl entienda que debe mandar el último archivo .txt que se creó, pero no me funciona.

Atento a sus comentarios.

¡ Saludos !
gravity
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2014-07-06 22:43 @988

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor explorer » 2014-07-07 12:25 @559

Con el operador -M <nombre del archivo> se puede sacar el último archivo creado en el directorio.

Por ejemplo:

my @lista_archivos_creados = sort { -M $a <=> -M $b } </home/alumno/config_R1_*.txt>;

En el array @lista_archivos_creados estará la lista de archivos ordenada por fecha de modificación/creación. Te basta con leer el primer valor para sacar el nombre completo del archivo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor gravity » 2014-07-17 09:30 @437

Estimados, ya resolví el problema que tenía.

Al final, ocupé en un mismo programa los dos módulos, es decir, Net::Telnet::Cisco y Net:FTP y esto permitió poder integrar las variables que usé en telnet.pl con ftp.pl. Finalmente deje todo el código en telnet.pl y ¡funciona!

Ahora mi siguiente paso es saber cómo puedo realizar una especie de "return", teniendo este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "    1.Ingrese la ip del host remoto:";
  2. $ip = <STDIN>;  
  3. my $session = Net::Telnet::Cisco->new(Host => $ip) or die "No hay conexión con el host remoto\n";
  4. print "    2.Ingresa tu username:" or die "Username incorrecto\n";
  5. $user = <STDIN>;
  6. chop ($user);
  7. print "    3.Ingresa tu password:" or die "Password incorrecto\n";
  8. $pass = <STDIN>;
  9. chop ($pass);
  10. $session->login($user, $pass);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La idea es que cuando el programa pregunte por la IP del host, el username y el password, si estos valores son incorrectos, vuelva a preguntar, para que el usuario lo intente de nuevo.

Saludos,

gravity
gravity
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2014-07-06 22:43 @988

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor explorer » 2014-07-17 12:00 @542

Puedes meter el código en un bucle, para que repita los pasos. Por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while(1) {      # bucle infinito
  2.     # aquí pedir los datos
  3.  
  4.     # ver si algún dato es incorrecto
  5.     next if $error;             # saltar al siguiente ciclo si hubo un error
  6.                                 # (volver a pedir los datos)
  7.  
  8.     # aquí hacer la conexión
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor gravity » 2014-07-17 14:43 @655

Este es el error que me devuelve cuando el usuario ingresa una IP que no está en la red:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    1.Ingrese la ip del host remoto:4.4.4.4
problem connecting to "4.4.4.4
", port 23: No hay ruta hacia el host at ./telnet.pl line 27
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Este es el error que me devuelve cuando el usuario ingresa un username o pass erróneo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    1.Ingrese la ip del host remoto:1.1.1.1
    2.Ingresa tu username:admin
    3.Ingresa tu password:asdasd
login failed: access denied or bad username at ./telnet.pl line 34
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿La variable $error entendería que esos son los log de un error?

Saludos,

gravity :)
gravity
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2014-07-06 22:43 @988

Re: Usar una variable de archivo.pl en archivo2.pl

Notapor explorer » 2014-07-17 16:07 @713

No, $error no se enteraría de los errores, salvo que le digamos cómo.

Lo que tienes que hacer es, que cada vez que ejecutas un comando de conexión, comprobar el valor que devuelve. Si alguno de ellos devuelve un error, pues rediriges el programa a que cierre la conexión, y le da un valor a $error (por ejemplo, un '1'). Y así, sabes que tienes que dejar de ejecutar más instrucciones y volver al principio del while() (con el next).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Administración

¿Quién está conectado?

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