Script SSH para roteador e “ativar” e executar comandos

2

Eu tenho um script que irá ssh para uma lista de roteadores e execute comandos de commands.txt . Eu quero enable depois de me conectar ao roteador através de ssh antes de executar o resto dos meus comandos em commands.txt Eu tenho duas perguntas. Primeiro, como faço para passar o comando enable? Ele não parece estar fazendo nada quando eu o coloco como minha primeira linha em commands.txt. Segundo, Depois de descobrir a parte do prompt enable , como eu passaria minhas credenciais para o script ser totalmente automático?

Script

Comandos.txt

Quando executo este script atual, insiro minha senha quando ela solicita a conexão com o roteador. Em seguida, ele exibe apenas % Type "show ?" for a list of subcommands e, em seguida, continua e se conecta ao próximo roteador e solicita minhas credenciais.

    
por runcmd 17.06.2014 / 20:17

3 respostas

3

Considere olhar para RANCID . Sua intenção principal é como uma ferramenta de backup de configuração para a Cisco e outros dispositivos de rede, mas um de seus componentes, clogin , é essencialmente um script Expect que faz exatamente o que você está pedindo. Usando o comando e as listagens de arquivos do roteador em seu exemplo, você pode executar os comandos em todos os roteadores da seguinte forma:

clogin -u user -p pass -e enablepass -x commands.txt $(cat routers.txt)

Ele pode ler um arquivo de configuração no qual você pode armazenar nomes de login e senhas, então você pode evitar passá-los na linha de comando. Ele tem várias opções de login, portanto, ele pode lidar com casos em que você não está usando aaa new-model e apenas tem senhas nos VTYs e casos com equipamentos mais antigos que solicitam o nome de usuário em resposta ao comando enable .

A única desvantagem real é que não é especialmente silencioso. Por exemplo, se você quiser a saída de show version , obterá isso, mas também obterá todos os banners de login, prompts de login / senha e prompts de comando em sua saída.

    
por 17.06.2014 / 21:23
2

Eu tenho usado este script perl há cerca de um ano. é uma evolução de vários trechos de scripts perl que eu encontrei em vários fóruns, além de um pouco de tentativa e erro, mas funciona bem. Você precisará instalar o módulo Time :: HiRes para o uso, mas descobri que isso ajuda na execução de comandos em switches remotos e roteadores, onde o tempo de resposta para um comando é um pouco mais longo. Ele ignorará dispositivos que não respondem ou falham na autenticação e continuam com o próximo dispositivo na lista e fornece um arquivo de log para cada dispositivo chamado com seu endereço IP.

Espero que seja útil para alguém.

#
# usage: perl cisco.pl (target_hostfile) (ssl_password) (enable_password)
#
use Net::SSH2;
use warnings;
use strict;
use Time::HiRes qw(usleep);
use File::Slurp;
print "\nEnter switch list filenane: ";
my $input = <STDIN>;                        ### target hosts file from STDIN
chomp($input);
my @hostfile = read_file($input,chomp => 1);        ### read target host file
my $arrSize = @hostfile;
my $user = "username"; ### your username
print "\nEnter ssh password: ";
my $password = <STDIN>;        ### ssh password from STDIN
chomp($password);
print "\nEnter enable password: ";
my $secret = <STDIN>;        ### enable password from STDIN
chomp($secret);
print "\nEnter command delay in miliseconds: ";
my $delay = <STDIN>;
chomp($delay);
my $delaytime = $delay/1000;
print "\nCopmmand delay confirmed: $delaytime Seconds\n";
print "\nEnter command list filename: ";
my $commandlist = <STDIN>;
chomp($commandlist);
my @commandfile = read_file($commandlist,chomp => 1);
my $commandsize = @commandfile;
my $i = 0;
my $j = 0;
$delay*=1000;  ### convert delay into microseconds for usleep command
for ($i = 0; $i < $arrSize; $i++){
my $ssh = Net::SSH2->new();
if(!$ssh->connect($hostfile[$i])){
        print("Connection Failed ($hostfile[$i]\n");
     next;
}
usleep($delay);  ### time in microsecond
if(!$ssh->auth_password($user,$password)){
        print("Authentication Failed ($hostfile[$i]\n");
        next;
}
usleep($delay);  ### time in microsecond
my $channel = $ssh->channel();
$channel->blocking(0);
$channel->shell();
print $channel "enable\n";
usleep($delay);  ### time in microsecond
print $channel "$secret\n";     ### enable password from input string3
usleep($delay);  ### time in microsecond
print $channel "term len 0\n";
usleep($delay);  ### time in microsecond
for ($j = 0; $j < $commandsize; $j++){
print $channel "$commandfile[$j]\n";
    usleep($delay);  ### time in microsecond so 1 millisecond == 1000 microseconds
}
open (my $OUTPUTFILE, ">$hostfile[$i].log") or die "Can't open $hostfile[$i].log: $!";   ### target host as filename
while (<$channel>) {
chomp;
print $OUTPUTFILE "$_";
}  

close $OUTPUTFILE or die "$OUTPUTFILE: $!";
}
close $OUTPUTFILE or die "$OUTPUTFILE: $!";
}
    
por 04.08.2015 / 12:31
1

Eu procuraria usar algo como esperar, em vez de apenas tentar redirecionar de um arquivo. O expect irá lidar com prompts de senha e similares e responder com as informações desejadas, com base na saída.

link

Sob rhel6 o pacote seria chamado de esperar. Existe também um módulo python que faz a mesma coisa chamada pexpect, disponível no repositório de atualizações rhel6. Um módulo perl que faz o mesmo é chamado perl-Expect.

Isso provavelmente lhe daria melhores resultados.

Estas páginas link dá alguns exemplos do que você está tentando fazer.

edit: Acabei de encontrar outro link da Cisco descrevendo isso também:

link

    
por 17.06.2014 / 20:49