Итак, раз в неделю или месяц мы проводим обновление на многих серверных машинах.Иногда достаточно Git pull, иногда обновление SVN, иногда происходят изменения в базе данных.Или сочетание тех.Также есть этот проект, который имеет много маленьких серверов, которые имеют очень упрощенную версию нашей системы и очень ненадежный интернет.Иногда это может быть сделано с одного из серверов, иногда с локальных рабочих компьютеров.
Я бы хотел немного упростить нашу работу, пройдя все наши серверы и выполнив соответствующие действия.Я нашел несколько полезных пакетов Perl: Net :: SSH :: Perl и Net :: SSH :: Expect;Net :: SSH :: Perl подводит меня.Также я не узнал, как использовать команду cmd
подряд.Например:
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd('cd web/scripts && ls -la ');
warn Dumper $stdout;
my($stdout, $stderr, $exit) = $ssh->cmd('ls -la');
warn Dumper $stdout;
Команды 2 ls -la
возвращают разные результаты.Насколько я понимаю (и это объясняется в документации), ssh выполняет команду и затем завершает работу.Говорят, что я мог бы использовать версию SSH 2 протокола SSH (или что-то подобное), и у меня не должно быть этой проблемы, но она сохраняется (или я не понимаю, как ее использовать).
Такжеесли у меня спрашивают пароль (например, если я запускаю mysql -u user -p
), я не могу его предоставить.Я пробовал это с $ssh->cmd($cmd, [ $stdin ])
, второй вариант, но безрезультатно.MySQL является лишь примером.Возможно, я захочу добавить IP-адрес к /etc/hosts
и получить запрос на ввод пароля su
или svn update
файла и запросить пароль SVN.Я знаю, что большинство этих процессов можно настроить так, чтобы они не запрашивали пароли, но мы хотим, чтобы они запрашивали пароль.
Опция $ssh->shell
, похоже, поможет, но когда я делаю что-то вроде этого:
$ssh->shell();`ls -la`;
команда с обратной косой чертой не отправляется в ssh-shell.На самом деле я понятия не имею, куда он идет или делает ли что-нибудь.
Net :: SSH :: Expect дает сбой при плохом интернет-соединении.
Для целей MySQL я создал скрипт Perl, который устанавливает соединения с каждым другим хостом и вносит измененияЯ хочу.Но было бы замечательно, если бы я мог сделать все это в одном сценарии.
Я был бы очень признателен, чтобы получить некоторое понимание этой темы.