• Publicidad

Problema con Net::OpenSSH a Cisco

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

Problema con Net::OpenSSH a Cisco

Notapor jero2528 » 2014-05-14 17:11 @758

Buenas tardes, colegas.

Estoy trabajando en un script que se ha vuelto bastante engorroso, contaré la historia corta y luego expondré mi problema.

Actualmente uso Perl para conectarme y extraer información de equipos de red (switches y routers) por ahora Juniper y Cisco, la conexión a estos equipos se hace vía Telnet, lo ideal sería que se hiciera la conexión por SSH, y pues bien es aquí donde está mi problema.

Aproximadamente manejo unos 70 scripts hechos en Perl que se encargan de realizar diferentes actividades sobre los equipos de red. Entre estas actividades, por nombrarles algunas, están: ejecutar comandos para actualizar ancho de banda, cambios de vlan, cambios de interfaces, cambio de descripción del servicio en una interfaz específica, backups de los equipos de red, etc.

Como pueden observar son bastantes actividades, ahora bien, estas actividades las realiza conectándose por medio de los módulos Net::Telnet y Net::Telnet::Cisco. En principio resolví que tal vez solo era necesario cambiar la forma en que se conecta a los equipos y el resto funcionaría normal pero no ha sido así.

El problema radica en que decidí usar el módulo Net::OpenSSH el cual corresponde a realizar acciones usando SSH. Luego de leer bastante este foro decidí usarlo porque me pareció más sencillo de aplicar. La solución la apliqué a los equipos Juniper y algunos de los scripts corren sin problemas ya que no he terminado de probar los demás, pero con los Cisco estoy teniendo inconvenientes. La verdad quiero ahorrarme el trabajo de editar uno a uno los scripts, ya que me tardaría bastante tiempo y no es la idea.

A continuación los ejemplos de lo que estoy usando para realizar esta actividad y el problema que se me presenta:
(Por cierto este script es muy cortito y solo quiero realizar la prueba de conectarme y ejecutar los comandos; por ello no es tan extenso como los demás).

Primero, una librería hecha por mi para realizar la conexión por SSH. (En realidad tiene más funciones pero me enfocaré en explicar únicamente la que tiene mi problema):

Para conexión por SSH se usa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub conectar_ssh{
  2.         ## ---------------------------------------------------------------
  3.         ## Inicialización de variables
  4.         ## ---------------------------------------------------------------
  5.         my $ip   = $_[0];
  6.         my ($stderr) = ('');
  7.         $ssh = Net::OpenSSH->new($ip, user => $userbackupsdefault, passwd => $passbackupsdefault);
  8.         # $ssh = Net::OpenSSH->new($ip, user => $userbackupsdefault, passwd => 'prueba');
  9.         if ($ssh->error) {
  10.                 $stderr=$ssh->error;
  11.                 warn "imposible conectar con servidor remoto $ip: ". $ssh->error;
  12.                 return $stderr, $ssh;
  13.         }
  14.         $stderr=$ssh->error;
  15.         return $stderr, $ssh;
  16. }
  17.  
  18. sub cerrar_ssh {
  19.         my $ssh = $_[0];
  20.         $ssh->close();
  21.         my $err = $ssh->error;
  22.         return $err
  23. }
  24.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bien, ese script solo tiene un problema con los Juniper de lo que he probado, y es que no existe un método close para cerrar la conexión usando el módulo Net::OpenSSH, pero igual la cierra automáticamente al terminar de ejecutar un comando. Es un problema pequeño, imagino yo. Luego está el script que estoy usando para ejecutar comandos sobre los equipos; para este caso lo hago sobre un equipo Cisco:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use Net::OpenSSH;
  4. require '/usr/local/library/procedimientos_ifx.pl'; #funciones reutilizables
  5.  
  6. #my $cmd = 'show version'; # El comando a ejecutar
  7. my $host = 'X.X.X.X'; # IP a la que me quiero conectar
  8.  
  9. my @conn1 = conectar_ssh($host); # Esta función está en procedimientos.pl
  10. #Verifico si me devuelve un error, en caso de serlo genero el mensaje de error recibido y lo muestro en pantalla.
  11. if (($conn1[0])) {
  12.         $mensajeerror="Equipo=CiscoN1, IP=$host, Descripcion=$conn1[0]\n<br>";
  13.         print "$mensajeerror\n";
  14. }else
  15. {
  16.         #Se conecta sin problemas, entonces ejecuto los comandos a continuación
  17.         @out=$conn1[1]->capture("enable\n"); # Modo Configuración en Router Cisco.
  18.         @out=$conn1[1]->capture("show configuration class-of-service | display set | match interface | no-more\n");
  19.         # Por cada Línea que se haya generado asigno su correspondiente respuesta a la variable $salida
  20.         foreach $line1 (@out) {
  21.                 $salida .= "$line1\n";
  22.         }
  23.         #################################################################
  24.         ## Esto está comentado porque así funciona para los Juniper    ##
  25.         ## Es decir que si uso solo "capture" el programa falla porque ##
  26.         ## no va a generar el resultado esperado.                      ##
  27.         #################################################################
  28.         #@out=$conn1[1]->system("quit\n");
  29.         #@out=$conn1[1]->capture("quit\n");
  30.        
  31.         print "----- $host -----\noutput:\n$salida]\nerror:\n$mensajeerror\n";
  32. }
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y bien, al ejecutar este script la respuesta que obtengo es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@miServer ~]# /home/user/scripts_pruebas/sshprueba.pl
  2. channel_by_id: 0: bad id: channel free
  3. client_input_channel_req: channel 0: unknown channel
  4. Connection to 10.x.x.x closed by remote host.
  5. Use of uninitialized value in concatenation (.) or string at /home/eherrera/scripts_pruebas/sshprueba.pl line 31.
  6. ----- 10.16.124.3 -----
  7. output:
  8. ]
  9. error:
  10. 0
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y no he encontrado manera de quitarle ese problema. Se ha vuelto caótico. Llevo dos días en esto. Espero puedan, por favor, ayudarme en algo que se acomode a esta misma estructura, es decir, una forma de usar este módulo para resolverlo o en dado caso hacer uso de otro módulo que haga ese mismo proceso pero que permita hacer más fácil la modificación masiva de los scripts.

Quedo atento a sus comentarios e inquietudes.

Saludos,


Jero2528
Bogotá, Colombia
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 con Net::OpenSSH a Cisco

Notapor explorer » 2014-05-14 17:47 @782

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

Entiendo que lo que diferencia a unos scripts de otros es el valor del host, ¿no?

Puedes cambiar los programas para que admitan el nombre del host como argumento al programa, y así solo necesitas un programa para varios hosts.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $host = shift @ARGV;         # leemos el primer argumento
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo ejecutas desde la línea de comandos, o desde otro script, indicando el nombre del host o su IP, como primer argumento:

/home/user/scripts_pruebas/sshprueba.pl 10.16.124.3
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con Net::OpenSSH a Cisco

Notapor jero2528 » 2014-05-15 09:16 @428

Hola, explorer, gracias por la bienvenida.

De hecho eso ya lo tengo definido. El problema está en la respuesta que me da al ejecutar el script que indiqué como ejemplo, porque lo del host, por facilidad lo estoy sacando de una base de datos donde tengo los host, que por cierto, olvidé mencionar que son aproximadamente 400 equipos de red :) Entonces mi problema está en el uso de OpenSSH.

Saludos,

Jero2528
Bogotá, Colombia
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 con Net::OpenSSH a Cisco

Notapor explorer » 2014-05-15 09:41 @445

El error que sale, realmente no es un error: es un aviso de que se está realizando una concatenación con una variable que no contiene nada (en este caso, $salida).

Eso quiere decir que $salida no ha sido inicializada en la línea 21, debido a que @out no contiene nada, debido a que en la línea 18 no se ha recibido ninguna respuesta desde el último capture().

Te recomiendo que lo pongas de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @out = $conn1[1]->capture("show configuration class-of-service | display set | match interface | no-more");
  2. $conn1[1]->error and die "ERROR: fallo en la obtención de la configuración: " . $conn1[1]->error;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y así sabremos qué pasa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con Net::OpenSSH a Cisco

Notapor jero2528 » 2014-05-15 10:18 @471

Obtuve el siguiente resultado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# /home/user/scripts_pruebas/sshprueba.pl
  2. muxclient: master returned too much data (8 > 4)
  3. Connection to 10.16.1.3 closed by remote host.
  4. Can't call method "error" without a package or object reference at /home/user/scripts_pruebas/sshprueba.pl line 40.
  5. You have mail in /var/spool/mail/root
  6.  
Coloreado en 0.001 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 con Net::OpenSSH a Cisco

Notapor explorer » 2014-05-15 12:25 @559

¡Huy! Eso quiere decir que ¡no tenemos un objeto Net::OpenSSH en $conn1[1]! Algo extraño ha pasado. Quizás tenga que ver el mensaje de que se ha cerrado la conexión.

Cambia el método conectar_ssh por este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub conectar_ssh {
  2.     my $ip = $_[0];
  3.  
  4.     $ssh = Net::OpenSSH->new( $ip, user => $userbackupsdefault, passwd => $passbackupsdefault );
  5.     my $ssh_error = $ssh->error;
  6.  
  7.     if ( $ssh->error ) {
  8.         warn "AVISO: Imposible conectar con servidor remoto $ip: $ssh_error\n";
  9.     }
  10.  
  11.     return $ssh_error, $ssh;
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es más corto, pero hace lo mismo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con Net::OpenSSH a Cisco

Notapor jero2528 » 2014-05-15 14:18 @637

Obtuve un error muy parecido:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
channel_by_id: 0: bad id: channel free
client_input_channel_req: channel 0: unknown channel
Connection to 10.16.124.3 closed by remote host.
Password:
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Fíjate que me pide el Password. Si yo lo introduzco logra extraer la información, pero ¿no sé supone que yo ya envié esos datos previamente en la función anterior? Puse el código que me enviaste y pues en realidad ese pertenece a la función del script procedimientos.pl. Ese está perfecto, el problema es en el script de prueba que es el segundo trozo de código que relacioné al principio del tema. Aún así he modificado y sigue pasando algo como el error anterior :(


Jero2528
Colombia
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 con Net::OpenSSH a Cisco

Notapor explorer » 2014-05-15 16:10 @715

Pues eso es nuevo... si pregunta Password, ¿en qué momento lo hace?

Según la sección TROUBLESHOOTING, apartado 3, de la página de manual, hay que hacer antes una prueba con el ssh de la línea de comandos, para ver si se conecta sin problemas. Y unas cuantas comprobaciones más.

Yo supongo que sí has hecho esas comprobaciones.

De momento, mete esta línea en el programa para que nos diga lo qué está haciendo:

$Net::OpenSSH::debug = -1; # activar todo el sistema de trazado

(sacada del hilo A vueltas con Net::OpenSSH)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con Net::OpenSSH a Cisco

Notapor jero2528 » 2014-05-16 09:17 @428

Lo hace apenas ejecuto el script. Como puedes ver en los hilos anteriores cada vez que lo ejecuto genera ese error :(

Sí, ya he comprobado ingresando al equipo de red usando el servidor desde donde se ejecuta el script, haciendo ssh IP. Así puedo ingresar con el usuario y las credenciales normal y ejecutar los comandos que necesite. Este mensaje de Password:

[root@server~]# /home/miuser/scripts_pruebas/sshprueba.pl
channel_by_id: 0: bad id: channel free
client_input_channel_req: channel 0: unknown channel
Connection to 10.16.124.3 closed by remote host.
Password:

Traté de enviarle como comando la contraseña y sigue con problemas, lo raro es que además cierra la sesión: Connection to 10.16.124.3 closed by remote host, antes de pedir nuevamente la contraseña.

¿En qué parte debo poner esa línea de debug que me indicaste?
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 con Net::OpenSSH a Cisco

Notapor explorer » 2014-05-16 09:44 @447

Se puede colocar en cualquier sitio, pero lo mejor es antes del momento que queremos analizar, así que, si quieres analizarlo todo, puedes hacerlo al principio del programa (mejor dicho, después de la carga del módulo Net::OpenSSH).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Administración

¿Quién está conectado?

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

cron