• Publicidad

SSH 2 con CISCO

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

SSH 2 con CISCO

Notapor aramallal » 2007-07-26 06:20 @305

Buenos días. Estoy utilizando Net::SSH::Perl para conectarme a un cisco y enviar una seri de comandos y recibirlos. Pero no lo consigo se os ocurre alguna manera.he estado mirando y la gente tiene los mismos problemas que yo aunque tampoco hay mucha información al respecto. El problema inicial es este: Channel open failure: 1: reason 4: y he buscado en una página que decía que tenía que modificar el fichero ssh2.pm y lo he hecho. Parece que ese problema desaparece pero sigue sin funcionar.

Gracias y un saludo.
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Publicidad

Notapor explorer » 2007-07-26 06:39 @319

En este foro hay algunos hilos referentes a Cisco. Entra en el enlace Busca y busca por CISCO.

Lo que tengo más dudas es con el protocolo SSH. Activa el modo de depurado para ver la actividad y diálogo entre las máquinas para ver si consigues más pistas.
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 aramallal » 2007-07-26 07:19 @346

Esto es el código:

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

use Net::SSH::Perl;
$host = '192.168.1.1';
$username = "cisco";
$login_password= "cisco";
$enable_password= "cisco";
$ssh = Net::SSH::Perl->new($host,debug=>"1",protocol=>2);
$ssh->login($username,$login_password);
$ssh->cmd('enable cisco');

my($stdout, $stderr, $exit) = $ssh->cmd('show run');
print "output: $stdout\n";
print "Error: $stderr\n";
print "status: $exit\n";

$ssh->cmd('exit');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Esto es lo que hace el script, al llegar a la última línea termina y no me muestra nada:

Código: Seleccionar todo
srv001:~/proyect # perl pix.pl
srv001: Reading configuration data /root/.ssh/config
srv001: Reading configuration data /etc/ssh_config
srv001: Allocated local port 1022.
srv001: Connecting to 192.168.1.1, port 22.
srv001: Remote version string: SSH-1.99-Cisco-1.25

srv001: Remote protocol version 1.99, remote software version Cisco-1.25
srv001: Net::SSH::Perl Version 1.30, protocol version 2.0.
srv001: No compat match: Cisco-1.25.
srv001: Connection established.
srv001: Sent key-exchange init (KEXINIT), wait response.
srv001: Algorithms, c->s: 3des-cbc hmac-sha1 none
srv001: Algorithms, s->c: 3des-cbc hmac-sha1 none
srv001: Entering Diffie-Hellman Group 1 key exchange.
srv001: Sent DH public key, waiting for reply.
srv001: Received host key, type 'ssh-rsa'.
srv001: Host '192.168.1.1' is known and matches the host key.
srv001: Computing shared secret key.
srv001: Verifying server signature.
srv001: Waiting for NEWKEYS message.
srv001: Enabling incoming encryption/MAC/compression.
srv001: Send NEWKEYS, enable outgoing encryption/MAC/compression.
srv001: Sending request for user-authentication service.
srv001: Service accepted: ssh-userauth.
srv001: Trying empty user-authentication request.
srv001: Authentication methods that can continue: password.
srv001: Next method to try is password.
srv001: Trying password authentication.
srv001: channel 0: new [client-session]
srv001: Requesting channel_open for channel 0.
srv001: Entering interactive session.
srv001: Sending command: enable cisco
srv001: Requesting service exec on channel 0.
srv001: channel 0: open confirm rwindow 1024 rmax 4096
srv001: channel 1: new [client-session]
srv001: Requesting channel_open for channel 1.


A ver si alguien me ayuda para que se pueda conectar y mandar comandos y recoger la salida. Gracias y un saludo.
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Notapor explorer » 2007-07-26 08:08 @380

O sea... sí que se valida la entrada del usuario y contraseña... pero falla en la ejecución del comando... lo que es curioso es que se ve como crea dos canales de comunicación ssh, pero el segundo no llega a terminar de abrirlo. ¿El Cisco sólo admitirá un única canal de comunicaciones? La documentación del módulo dice que por defecto, al hacer el login, se crea un canal de comunicaciones con un shell, que es lo que normalmente se necesita, pero que puede obviarse si se va a actualizar otro protocolo sobre el SSH. En tu caso, yo creo que sí necesitas tener una shell abierta, para ejecutar los comandos (lo que pone de Entering interactive session), pero no acabo de entender por qué abre un segundo canal.

Te recomiendo que mires el módulo Net::Appliance::Session, que es un poco más moderno.
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 aramallal » 2007-07-31 03:00 @166

Gracias explorer, ya he conseguido hacer algo. El problema que veo ahora es que no sé cómo controlar los errores. En el caso de que no haya error necesito grabar la configuración en el firewall pero en el caso de que un comando haya dado error o no lo haya cogido por cualquier cosa no lo quiero grabar ¿cómo controlo esos errores? Este es mi código , Muchas gracias :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings FATAL => 'all';
use Net::Appliance::Session;

my $host = '192.168.1.1';
my $s = Net::Appliance::Session->new($host);
$s->input_log(*STDOUT); # echo all I/O
eval {
    $s->connect(
        Name     => 'cisco',
        Password => 'cisco',
        SHKC     => 0, # SSH Strict Host Key Checking disabled
    );
    $s->begin_privileged ('cisco'); # use same pass as login
    $s->begin_configure;
    $s->cmd("sh ip");
 #   $s->cmd("show run");
    $s->cmd('int eth1');
    $s->cmd('ip address 192.168.3.1 255.255.255.0');
    $s->cmd("sh ip");
    $s->cmd('disable');
    $s->cmd('exit');
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Notapor explorer » 2007-07-31 03:20 @180

Pues si la ejecución de cmd() no devuelve un código de error si no la ejecución del comando, deberás interpretarlo para actuar en consecuencia.

Vamos, supongo que tendrás que reaccionar igual que si estuvieras delante del aparato. Según lo que te responda deberás actuar de un modo o de otro.

Otra cosa son los errores debidos a timeouts, que no aparezca el prompt, etc. Entonces Net::Appliance::Session hace un die, directamente. Por eso tienes la ejecución de los comandos con un eval, para capturar esos posibles errores.

En la sección Diagnostics del módulo, hay un ejemplo de cómo cazar esos errores, interrogando el contenido de la variable $@, que almacena los posibles errores dentro del eval. Échale un vistazo. Según el error, habrá que reaccionar de una manera o de otra.
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 aramallal » 2007-07-31 03:36 @192

Vale, muchas gracias, explorer. Voy a ver si lo entiendo. Ahora te digo algo. Muchísimas gracias.
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Notapor explorer » 2007-07-31 04:13 @217

Es que una cosa es lo que te devuelve el comando
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@respuesta = $s->cmd('sh ip');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y otra cosa es que ocurra algo en la ejecución del comando (corte de transmisión, cuelgue del aparato, etc. ). En ese caso Net::Appliance::Session muere (con die). Lo capturamos con eval:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
eval {
    $s->cmd('...');
};
if ( $@ ) {
    print "Hubo errores...";
    # arreglamos el posible fallo... o no
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2007-08-02 05:46 @282, 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 aramallal » 2007-08-01 06:39 @319

Gracias explorer.

¿Sabéis cómo puedo mandar un "enter" (retorno de carro) a la consola? Es decir, yo mando un comando que se ejecuta en el firewall pero ese comando necesita confirmación dándole al enter. ¿Cómo se lo envío?

He probado así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$s->cmd('copy startup-config running-config');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y a continuación me pide la confirmación y lo que yo puse después de la línea de arriba es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$s->cmd(' ');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es decir blanco, pero no funciona, se queda en la confirmación. Yo creo que tendría que enviarlo en la misma instrucción pero no sé hacerlo.

¿Alguna idea?

Gracias.
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Notapor explorer » 2007-08-01 08:14 @384

cmd() es un método derivado de Net::Telnet. Debes leer su página de manual. En concreto, la solución sería escribir algo como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$s->cmd( Match => ['Pulse enter para continuar:'] );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esa forma, el módulo sabe que tiene que esperar a esa frase para continuar.

Mira el primer ejemplo de Examples, del Net::Telnet, para ver cómo se manda un Enter.
Última edición por explorer el 2007-08-02 05:48 @283, editado 2 veces 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

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados