通过SSH将Bash中的指示器通过STDIN传递回Perl

3
我们有一台 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.使用 "setattr" 在 tar.gz 上设置 "user.comment" 属性,但是注释在 uuencoding 后无法保留。 2.目前认为最好的办法是使用上面的伪代码,创建一个新文件进行编码和发送,并更新 Perl 脚本以检查每个新传输是否找到了特殊文件。

1
我们需要看到更多的代码。 - Paul Hodges
我只是在询问如何发送指标,与其他逻辑(这是实质性的)无关。您还想看到什么? - Ben Quigley
你的perl命令调用report.sh脚本并解码整个输出。现在你想让报告脚本打印uuencoded数据一些纯文本? - glenn jackman
我认为所有数据都必须是 uuencode 编码的,因为网络的工作方式。我会更新我的问题。 - Ben Quigley
我不确定是否理解了...如果您需要更改由Perl脚本调用的shell脚本以便发送更多信息,那么您不能只是在shell脚本中添加一个打印到STDOUT的语句吗?我不知道您如何运行shell脚本,但您可以这样做以获取每个“行”打印。然后,您可以检查每一行是否符合某些“协议”(例如,它是否是或以special-file-found字符串开头),并相应地采取行动--为进一步调用设置标志或编写控制文件以进行以下运行等。如果不是,则是编码文件。 - zdim
显示剩余3条评论
1个回答

3
我理解的目标是修改一个返回编码文件给调用者的shell脚本,以便发送更多信息,具体来说是一个用作调用者标志的字符串。
不清楚如何从Perl脚本中运行shell脚本,但有办法使调用者得到分开打印的“行”,可以在运行完成后直接全部打印。
然后,您只需将所需的额外打印添加到shell脚本的STDOUT,并在调用者检查每个shell输出行是否符合某些“协议”时使用它;例如,它是否为特殊文件发现字符串或以其开头。然后,您可以为进一步的调用设置标志或编写控制文件以进行后续运行等操作。否则,该行就是编码文件。
下面是一个使用{{link1: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)   // 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',...)
另一种方法是使用反引号(qx)并将其返回赋值给一个数组,在这种情况下,每个元素都接收一行输出。
还有一种更好的方法是使用一个管理外部命令的模块。例如,从简单到更强大:IPC::System::Simple, Capture::Tiny, IPC::Run3, IPC::Run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接