• Publicidad

Problema ejecución de comandos con Net::Telnet::Cisco

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema ejecución de comandos con Net::Telnet::Cisco

Notapor jero2528 » 2015-07-23 17:43 @780

Saludos perleros.

Tengo inconvenientes con mi script. Básicamente quiero ejecutar unos comandos cuya salida se va enlazando a medida que se ejecutan. Este es el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @conn1 =
  2.   conectar_telnet_cisco( $IPDEVICE, $userbackupsdefault, $passbackupsdefault );
  3. if ( ( $conn1[0] ) ) {
  4.     $mensajeerror .=
  5.       "Equipo=$DEVICE, IP=$IPDEVICE, Descripcion=$conn1[0]\n<br>";
  6.     $conteoerrores++;
  7. }
  8. else {
  9.     # @out=$conn1[1]->cmd("terminal length 0\n");
  10.     # sleep(5);
  11.     # @out=$conn1[1]->cmd("show interfaces description | include $SERVICEID\n");
  12.     @out = $conn1[1]->cmd( String => "terminal length 0", Timeout => 5 );
  13.     @out = $conn1[1]->cmd(
  14.         String  => "show interfaces description | include $SERVICEID\n",
  15.         Timeout => 5
  16.     );
  17.     foreach $line (@out) {
  18.         $salida1 .= "$line\n";
  19.     }
  20.     if ( ( $salida1 !~ /^(\s+)?$|.*error.*|^$/is ) || ( $salida1 ne '' ) ) {
  21.         ($ifaceCisco) = $salida1 =~ /^(.+?)(?:\.0)?\s+up/is;
  22.         $salida1 = "";
  23.         print "Iface: $ifaceCisco\n";
  24.         @out = $conn1[1]->cmd(
  25.             String  => "show running-config interface $ifaceCisco\n",
  26.             Timeout => 5
  27.         );    ##### Este comando no da salida
  28.         foreach $line3 (@out) {
  29.             print "Line: $line3\n";
  30.             $salida1 .= "$line3\n";
  31.         }
  32.         print "Salida 2: $salida1\n";
  33.         sleep(10);
  34.     }
  35. }
  36. cerrar_telnet_cisco( $conn1[1] );
  37. $conteointerfaces++;
  38.  
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4


He intentado todo con el comando que no da salida, y solo funciona cuando lo dejo fuera de la sentencia if y siendo el primer comando que ejecuta.

Esta es la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Iface: Vl183
  2. Line:
  3. Salida 2:
  4.  
  5.  
  6.  
  7.  
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4

De ahí en adelante no funciona. Quien pueda darme unas observaciones le estaría bastante agradecido.


Gracias.
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Publicidad

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor explorer » 2015-07-23 18:14 @802

Yo no veo nada raro. Quiero decir que no sé qué diferencia podría haber de ejecutar esa línea dentro o fuera del if().

Es claro que el if() se ejecuta porque en la salida aparece Iface, Line y Salida 2. Entonces, esa línea sí que se ejecuta.

Yo probaría a sacar a pantalla el contenido de @out, nada más ejecutarla. Por ejemplo:

print '[', join('|', @out), ']', "\n";
print 'Número: ', scalar(@out), "\n";

Si dice que no sale nada, es que el comando falló. Lo que no sé es que puede tener de diferente de estar ahí a estar fuera del if(), salvo que le afecten llamadas previas a cmd().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor jero2528 » 2015-07-24 14:52 @661

Hola, explorer. Gracias por tus observaciones.

Lo mismo digo yo: no entiendo en qué se diferencia al estar dentro del if() o estar fuera, acabo de ejecutar la prueba y ahora esta es la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Iface: Vl183
  2. []
  3. N▒mero: 1
  4. Line:
  5. Salida 2:
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué más podría hacer? :S Con esa salida no devuelve nada. Es como si no se ejecutara el comando :(
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor explorer » 2015-07-24 15:55 @705

El número 1 indique que sí ha habido una respuesta. Pero no la vemos (no hay nada entre los corchetes), así que sospecho que se trata de un 'undef'.

Para confirmarlo, habría que usar el Data::Dumper de @out.

Suponiendo que, en efecto, es un 'undef', supongo que ha ocurrido algún error en la ejecución del cmd().

Otra pregunta. Cuando dices "dejo fuera de la sentencia if()", ¿a qué te refieres? ¿Cómo queda el código?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor jero2528 » 2015-07-24 17:23 @766

Hola, explorer.

Sí, al parecer está vacío. Funciona si lo pongo en este orden:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @conn1 = conectar_telnet_cisco( $IPDEVICE, $userbackupsdefault, $passbackupsdefault );
  2. if ( ( $conn1[0] ) ) {
  3.     $mensajeerror .= "Equipo=$DEVICE, IP=$IPDEVICE, Descripcion=$conn1[0]\n<br>";
  4.     $conteoerrores++;
  5. }
  6. else {
  7.     @out = $conn1[1]->cmd( String => "show running-config interface Vl183\n", Timeout => 35 );
  8.     print '[', join( '-', @out ), ']', "\n";
  9.     print 'Numero: ', scalar(@out), "\n";
  10.     foreach $line3 (@out) {
  11.         print "Line: $line3\n";
  12.         $salida1 .= "$line3\n";
  13.     }
  14.     print "Salida 2: $salida1\n";
  15.     sleep(10);
  16.  
  17.     # @out=$conn1[1]->cmd("terminal length 0\n");
  18.     # sleep(5);
  19.     # @out=$conn1[1]->cmd("show interfaces description | include $SERVICEID\n");
  20.     @out = $conn1[1]->cmd( String => "terminal length 0", Timeout => 5 );
  21.     @out = $conn1[1]->cmd(
  22.         String  => "show interfaces description | include $SERVICEID\n",
  23.         Timeout => 5
  24.     );
  25.     foreach $line (@out) {
  26.         $salida1 .= "$line\n";
  27.     }
  28.     if ( ( $salida1 !~ /^(\s+)?$|.*error.*|^$/is ) || ( $salida1 ne '' ) ) {
  29.         ($ifaceCisco) = $salida1 =~ /^(.+?)(?:\.0)?\s+up/is;
  30.         $salida1 = "";
  31.         print "Iface: $ifaceCisco\n";
  32.     }
  33. }
  34.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Adjuntos
DepuraciónScriptPerl.docx
Es poner el mismo command antes del if(), o sea donde estan los comandos comentariados
(79.85 KiB) 158 veces
Última edición por explorer el 2015-07-24 18:08 @797, editado 2 veces en total
Razón: Formateado de código con Perltidy; Sintáxis;
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor explorer » 2015-07-24 18:29 @812

Pues no veo nada raro. Salvo que el interfaz lo pones de forma directa en la línea 7, en lugar de capturarlo con la expresión regular de la línea 28.

O sea, que el orden que funciona es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
show running-config interface Vl183
terminal length 0
show interfaces description | include $SERVICEID
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

mientras que el que no funciona es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
terminal length 0
show interfaces description | include $SERVICEID
show running-config interface $ifaceCisco
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Tú deberías saber en qué orden deben ir las acciones en el aparato Cisco...

Otro detalle que es diferente: en el código que funciona tienes puesto un timeout de 35, mientras que en el que no funciona está puesto a 5. ¿Podría ser esto?

No sé... lo único que se me ocurre probar es ver si $ifaceCisco contiene realmente lo que queremos. Modificaría el print() de la línea 31 por esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Iface: [$ifaceCisco]\n";
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

De esa manera nos aseguramos que no estamos pillando algún carácter en blanco o extraño.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor jero2528 » 2015-07-27 10:33 @481

Hola, explorer,

En orden respondo a las inquietudes, jejeje.

Si, el orden es exactamente el que especificaste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. terminal length 0
  2. show interfaces description | include $SERVICEID
  3. show running-config interface $ifaceCisco
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Este orden es el que no funciona y en el que se deberían ejecutar los comandos sobre el equipo Cisco.

En el que funciona puse directamente el valor ya que si lo ejecuto de inicio no sé cuál es el valor de $ifaceCisco.

en el código que funciona tienes puesto un timeout de 35, mientras que en el que no funciona está puesto a 5. ¿Podría ser esto?

Es una prueba que hice mientras recibía respuesta en el foro, he aumentado, disminuido, etc., pero no funciona.


En cuanto al cambio del print() este es el resultado que obtuve:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Iface: [Vl183]
  2. []
  3. Numero: 1
  4. Line:
  5. Salida 2:
  6.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
Saludos,

Jero2528
Avatar de Usuario
jero2528
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2014-05-14 15:43 @697
Ubicación: Bogota, Colombia

Re: Problema ejecución de comandos con Net::Telnet::Cisco

Notapor explorer » 2015-07-27 11:26 @518

Pues entonces, no sé qué será.

Lo único raro que veo... es que a la cadena "terminal length 0" le falta un "\n" al final.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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

cron