Передайте индикатор из Bash обратно в Perl через SSH через STDIN - PullRequest
0 голосов
/ 13 декабря 2018

У нас есть сервер Linux, который может запускать диагностический сценарий diag.pl, который координирует отчеты по другим серверам.

diag.pl перебирает дочерние серверы, и для каждого из них SSH в изапускает скрипт bash, который передает информацию обратно:

my $cmd=sprintf("ssh %s sudo /usr/lib/support/report.sh -e %s | uudecode -o \"%s-outfile.tgz\") 2>%1 |", $server, $specialparam, $servername)

Строка кода в report.sh, которая отправляет данные обратно:

 uuencode --base64 ${REPORT}.tar.gz /dev/stdout

Я хочу обновить report.sh чтобы отправить дополнительную строку информации, что-то вроде:

 echo "special-file-found=${SFF}" > /tmp/sff.cfg
 uuencode --base64 /tmp/sff.cfg > /dev/stdout

Как только специальный файл будет найден, скрипт Perl обновится, так что он больше не отправляет specialparam к последующему report.sh звонки.

Есть ли хороший способ отправить этот ввод, чтобы Perl мог легко его перехватить?

Что я пробовал

  1. Установка атрибута user.comment на tar.gz с использованием setattr, но комментарий не сохраняется при uuencoding
  2. В настоящее время я думаю, что лучше всего использовать приведенный выше псевдокод, создаваяновый файл для кодирования и отправки, а также обновления PeСкрипт rl проверяет его при каждой новой передаче, пока не найдет специальный файл.

1 Ответ

0 голосов
/ 14 декабря 2018

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

Неясно, как скрипт оболочки запускается из скрипта Perl, но есть способы сделать это так, чтобы вызывающая сторона возвращала отдельные «строки», которые выводятся на печать, либо по мере того, как они испускаются, либо вообще после завершения запуска.

Затем вы можете просто добавить в сценарий оболочки необходимую дополнительную печать к STDOUT и в вызывающей программе проверить каждую строку вывода оболочки, чтобы увидеть, соответствует ли она какому-либо «протоколу»;например, является ли она или начинается со строки special-file-found .Затем вы можете установить флаги для дальнейших вызовов или записать контрольный файл для последующих запусков и т. Д. В противном случае строка представляет собой закодированный файл.

Придуманный базовый пример с использованием pipe-open (см. в конце страницы)

use warnings;
use strict;
use feature 'say';

my @cmd = qw(ls -l ./);

my $file_found = quotemeta 'special-file-found';

my ($flag, $binfile);

my $pid = open my $out, '-|', @cmd   or die "Can't open @cmd: $!";

while (<$out>) {
    chomp;
    if (/^$file_found/) { 
        $flag = 1;
    }
    else {
        $binfile = $_;
        # whatever else need be done, or perhaps  last;
    }
}
close $out;

В этом примере запускается команда ls -l ./, но вместо нее вы можете запустить любой исполняемый файл, например @cmd = ('report.sh', 'arg1', 'arg2',...).

Другой способ заключается виспользуйте backticks ( qx * ​​1022 *) и присвойте его возврат массиву, и в этом случае каждый элемент получает строку вывода.

Еще один, лучший способ - использовать модуль, который управляет внешними командами.Например, от простого к более способному: IPC :: System :: Simple , Capture :: Tiny , IPC :: Run3 , IPC::. Run 1033 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...