Назад | Перейти на главную страницу

Сценарий SSH для маршрутизатора, «включить» и запустить команды

У меня есть сценарий, который будет ssh в список маршрутизаторов и запускать команды из commands.txt. я бы хотел enable после подключения к роутеру через ssh прежде чем я выполню остальные свои команды в commands.txt У меня два вопроса. Первый, как передать команду включения? Кажется, что он ничего не делает, когда я помещаю его в первую строчку в commands.txt.Во-вторых, Как только я выясню enable часть подсказки, как мне передать свои учетные данные, чтобы сценарий был полностью автоматическим?

Сценарий

Commands.txt

Когда я запускаю этот текущий сценарий, я ввожу свой пароль, когда он предлагает мне подключиться к маршрутизатору. Тогда он просто отображает % Type "show ?" for a list of subcommands а затем подключается к следующему маршрутизатору и запрашивает мои учетные данные.

Рассмотрите возможность взглянуть на ПРОТИВНИК. Он в первую очередь предназначен как инструмент резервного копирования конфигурации для Cisco и других сетевых устройств, но один из его компонентов, засорять, по сути, является сценарием Expect, который делает именно то, что вы просите. Используя списки команд и файлов маршрутизатора в вашем примере, вы можете выполнять команды на всех маршрутизаторах следующим образом:

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

Он может читать Файл конфигурации в котором вы можете хранить имена входа и пароли, чтобы избежать их передачи в командной строке. У него есть несколько вариантов входа в систему, поэтому он может работать в тех случаях, когда вы не используете aaa new-model и просто иметь пароли на VTY, и ящики со старым оборудованием, которое запрашивает имя пользователя в ответ на enable команда.

Единственный реальный недостаток в том, что он не особенно тихий. Например, если вам нужен вывод show version, вы получите это, но вы также получите все баннеры для входа в систему, приглашения для входа в систему / пароли и командные строки в вашем выводе.

Я использую этот Perl-скрипт около года. это эволюция нескольких фрагментов Perl-скриптов, которые я нашел на различных форумах, плюс немного проб и ошибок, но он работает хорошо. Вам нужно будет установить модуль Time :: HiRes для usleep, но я обнаружил, что он помогает при выполнении команд на удаленных коммутаторах и маршрутизаторах, где время отклика на команду немного больше. Он пропустит устройства, которые не отвечают или не прошли аутентификацию, и продолжит работу со следующим устройством в списке и предоставит файл журнала для каждого устройства, названного с его IP-адресом.

Надеюсь, это кому-то поможет.

#
# 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: $!";
}

Я бы посмотрел на использование чего-то вроде expect вместо того, чтобы просто пытаться перенаправить из файла. expect будет обрабатывать запросы пароля и тому подобное и отвечать нужной информацией на основе выходных данных.

http://expect.sourceforge.net/

Под rhel6 пакет будет называться expect. Существует также модуль python, который выполняет то же самое, что и pexpect, доступный в репозитории обновлений rhel6. Модуль perl, который делает то же самое, называется perl-Expect.

Это, вероятно, даст вам лучшие результаты.

Эти страницы http://nixcraft.com/showthread.php/15060-script-to-auto-login-to-cisco-router-(-telnet-and-SSH) дает несколько примеров того, что вы пытаетесь сделать.

edit: Просто нашел еще одну ссылку от cisco, также описывающую это:

https://supportforums.cisco.com/discussion/11553001/script-automate-tasks