Página 1 de 1

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

NotaPublicado: 2015-07-23 17:43 @780
por jero2528
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.003 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.002 segundos, usando GeSHi 1.0.8.4

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


Gracias.

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

NotaPublicado: 2015-07-23 18:14 @802
por explorer
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().

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

NotaPublicado: 2015-07-24 14:52 @661
por jero2528
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 :(

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

NotaPublicado: 2015-07-24 15:55 @705
por explorer
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?

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

NotaPublicado: 2015-07-24 17:23 @766
por jero2528
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

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

NotaPublicado: 2015-07-24 18:29 @812
por explorer
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.001 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.

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

NotaPublicado: 2015-07-27 10:33 @481
por jero2528
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.001 segundos, usando GeSHi 1.0.8.4

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

NotaPublicado: 2015-07-27 11:26 @518
por explorer
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.