Надеюсь, здесь кто-нибудь поможет мне. Хотите переделать мой сценарий 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
команда просто сделает то, что вы хотите.