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

Perl - SSH и запуск резервного копирования при сохранении сеанса

Надеюсь, здесь кто-нибудь поможет мне. Хотите переделать мой сценарий bash ssh для устройств cisco и добавить к нему. По сути, моя идея состоит в том, чтобы иметь SSH для регистрации меня на устройстве в режиме включения (чтобы я мог выполнять обычные административные операции, как обычно) и запускать в тихом режиме резервную копию устройства (где txt файл - это имя хоста устройств. ).

Лучшее, что я сделал до сих пор и не тестировал на живом оборудовании:

#!/usr/bin/perl
use warnings;
use strict;
use Expect;
use Data::Dumper;

my $user = $ARGV[0];
my $pw = $ARGV[1];
my $host = $ARGV[2];
my $cmd = 'sh run';

my $exp = new Expect;
$exp->log_file("SSHLOGFILE.txt");#How do i make this to be the hostname of the device though
$exp->log_stdout(0);
$exp->raw_pty(1);


my $cli = "/usr/bin/ssh $user\@$host -o StrictHostKeyChecking=no -q $cmd";
#not sure about this 
$exp->spawn($cli) or die "Cannot spawn $cli: $!\n";

$exp->expect(5,
 [ qr /ssword:*/ => sub { my $exph = shift;
                          $exph->send("$pw\n");
                          exp_continue; }] );

my $read = $exp->exp_before();
chomp $read;
print Dumper($read);

$exp->soft_close();

Я могу установить RANCID, так как у меня нет root на хосте перехода, я могу запускать сценарии вне хоста jumphost, а Perl - мой единственный вариант, поскольку я могу иметь модули в локальной библиотеке.

Разница между быстро написанным сценарием и гибкой надежной автоматизацией заключается в большом количестве строк кода и большом количестве тестов. Вместо того, чтобы повторно реализовывать, рассмотрите возможность использования или расширения существующих модулей, которые уже делают это. Я нашел несколько всего за несколько минут поиска.

В Perl, ciscodump (github) и полученный Сеть :: SSH2 :: Cisco.

Если вы можете установить Python на любом хосте, Ansible ios_config может выполнять резервное копирование в файл с помощью одной задачи. При применении конфига из шаблона.

С помощью StrictHostKeyChecking=no это очень плохая идея. Вместо этого используйте опцию UserKnownHostsFile с файлом hosts, который содержит ключ вашего целевого сервера (ов). Просто подключитесь один раз вручную с включенной опцией, чтобы создать его, и ключ сервера будет заблокирован навсегда.

Похоже, вы пытаетесь использовать команду expect для передачи пароля команде SSH. Опять же, это очень плохая идея. Вместо этого используйте аутентификацию с закрытым ключом, и проблема с паролем просто исчезнет. Или, по крайней мере, это больше не проблема вашего скрипта, поскольку загрузкой закрытых ключей можно управлять с помощью агента SSH.

Если вы используете аутентификацию с закрытым ключом, мне интересно, понадобится ли вам вообще этот скрипт как голый ssh $user@$host sh run команда просто сделает то, что вы хотите.