• Publicidad

Net::Telnet

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

Net::Telnet

Notapor galinderooo » 2008-09-12 04:31 @230

¡¡ Buenas !!

Antes de nada, comentaros que soy algo novato y creo que estoy tratando con algo grande... xD pero la verdad, es que sí necesito algo en Perl, es todo relacionado con Net::Telnet y esos temas...

Trato de hacer un script que conecte (en un principio) a un host y lance un "show ip interface brief" y me guarde el resultado en un array (cada interfaz en una línea)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Net::Telnet;
$host = 'a.b.c.d';
$telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Prompt => '/#/');
$telnet->open($host);

if ($telnet->waitfor(String => "Username:"))
{
        $telnet->print ("user");
        $telnet->waitfor(String => "Password:");
        $telnet->print ("pass");
}

#$telnet->print (" ");
@nombre= $telnet->waitfor(String => "#");
$nemonico=$nombre[0];

$telnet->waitfor(String => "#");
$telnet->print ('show ip interface brief');
@showip = $telnet->waitfor(String => "#");
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Esto debería hacerlo en teoría, ¿no? Me sale este error:
Código: Seleccionar todo
pattern match timed-out at ./prueba.pl line 19


Otra cosa, ¿cómo podría hacer para que se mostrará TODO por pantalla (o que lo guarde en un fichero)? por que así es más fácil de ver dónde falla o por qué no lanza algún comando y tal ¿sabéis?

Gracias de antemano
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Publicidad

Notapor explorer » 2008-09-12 05:08 @255

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

Creo que falla porque tienes dos sentencias de espera waitfor() consecutivas. Es decir, esperas por un "#", del que estraes el $nombre, y luego vuelves a esperar antes de enviar el comando. Pero falla porque no has ejecutado ningún comando y por lo tanto no se recibe un nuevo "#".

Quita el segundo waitfor() (el de la línea 19).
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

Notapor galinderooo » 2008-09-12 05:23 @266

Eres el amo ;) ¡¡ Gracias por la rapidez y eficiencia !!

Ya funciona y he conseguido guardar todo lo que va haciendo en un log :P

Para el que lo quiera saber:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Input_log=>"input3.log", Prompt => '/#/');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En esta línea le he añadido Input_log=>"fichero" y me lo guarda todo, lo he sacado de este foro también (buscando un poquito).

Ahora otra duda, me salen todas las interfaces, y las he guardado en un array, pero necesito sacar ahora una en concreto, y a eso ya no llego xD

De todas las interfaces que salen necesito buscar una que ponga ATM o Serial, depende del router hay una o otra, y el slot en la que está, Ejemplo:

Código: Seleccionar todo
Interface                  IP-Address      OK? Method Status                Protocol
ATM0/0                     unassigned      YES NVRAM  up                    up     
ATM0/0.1                   xxx      YES NVRAM  up                    up     
FastEthernet0/0            unassigned      YES NVRAM  up                    up     
FastEthernet0/0.1          xxx    YES NVRAM  up                    up     
FastEthernet0/0.3          xxx    YES NVRAM  up                    up     
BRI0/0                     unassigned      YES NVRAM  up                    up     
BRI0/0:1                   unassigned      YES unset  down                  down   
BRI0/0:2                   unassigned      YES unset  down                  down   
FastEthernet0/1            unassigned      YES NVRAM  administratively down down   
Serial1/0                  unassigned      YES NVRAM  down                  down   
Serial1/1                  unassigned      YES NVRAM  down                  down   
Serial1/2                  unassigned      YES NVRAM  administratively down down   
Serial1/3                  unassigned      YES NVRAM  administratively down down   
Dialer1                    unassigned      YES IPCP   standby mode          down   
Loopback0                  xxx   YES NVRAM  up                    up     
Loopback600               xxx YES NVRAM  up                    up     
Tunnel1                    xxx   YES NVRAM  up                    down


Este caso, aparte, es chungo; como veis hay varias tarjetas Seriales y una ATM, la que está configurada es la ATM, el único esquema que siguen todos es que la ATM es: ATM (slot) .1 (p.ej.: ATM0/0.1 o ATM 0/1/0.1) y las Seriales: Serial (slot) .260 (p.ej.: Serial0/0.260 o Serial 0/0/0.260, entre otras xD)

¿ Alguien podría ayudarme o algo a cómo hacerlo ? :S
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor explorer » 2008-09-12 07:08 @339

(No probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for (@showip) {
    if (/(ATM.+?\.1)\s/ or /(Serial.+?\.260)\s/) {
        print "Encontrada interface $1\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2008-09-12 07:52 @370, editado 1 vez en total
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

Notapor galinderooo » 2008-09-12 07:22 @348

mmm parece que funciona. Lo que saca la interfaz sin el .1 o el .260, pero eso me lo miro yo ahora mismo, así aprendo :P

MUCHAS GRACIAS ;)
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor galinderooo » 2008-09-25 02:27 @143

Me rindo, gente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($interfaz == "/(Serial)/") {

        print "2";
        $interfaz = $interfaz.".260";

}
elsif ($interfaz == "/(ATM)/") {

        print "1";
        $interfaz = $interfaz.".1";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He estado probando, me he mirado mucho de expresiones regulares y nada. Decir que yo antes programaba bastante en PHP y esto de las regexp nunca se me han dado bien XD ¿Cómo puedo hacer que añada .1 si es ATM o .260 si es Serial?
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor galinderooo » 2008-09-25 02:39 @152

Mirando por ahí he dado con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($interfaz =~ "/\BSerial/") {

        print "2";
        $interfaz = $interfaz.".260";

}
elsif ($interfaz =~ "/\BATM/") {

        print "1";
        $interfaz = $interfaz.".1";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


\B según he leído es para cuando CONTIENE esa palabra: ejemplo: perezoso contiene "zoso" pues.. más o menos lo mismo y luego el =~ (contiene) pero sigue sin funcionar XD De hecho ahora no me entra a ningún if por que no imprime ni 1 ni 2 xD
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor galinderooo » 2008-09-25 02:44 @155

Ya está... error tonto, puse comillas dobles ^^

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($interfaz =~ /Serial/) {

        $interfaz = $interfaz.".260";

}
elsif ($interfaz =~ /ATM/) {

        $interfaz = $interfaz.".1";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con esto parece que funciona XD
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor galinderooo » 2008-09-25 03:36 @191

Otra preguntita ^^ ahora estoy lanzando comandos sobre el router, todo ok, pero uno de esos comandos es un ping, entonces lo que hago es, cuando encuentre '!' que pare el ping y lance otros comandos, pero claro, yo cuando lo paro de forma manual uso: control+shift+6, pero eso ¿cómo lo pongo yo en Perl? XD
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Notapor explorer » 2008-09-25 05:02 @252

galinderooo escribiste:mmm parece que funciona. Lo que saca la interfaz sin el .1 o el .260, pero eso me lo miro yo ahora mismo, así aprendo :P

MUCHAS GRACIAS ;)


Yo que tú, volvería a probar la expresión regular que te he mandado. Fíjate que mi mensaje fue editado después de que dijeras que faltaba por capturar el sufijo. Entré y moví los paréntesis de captura para contemplar ese caso.

P.D. Recuerda que puedes editar tus mensajes enviados, así que si ves que has metido la pata en uno de ellos, lo puedes cambiar cuando quieras.
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 1 invitado

cron