Linux 通过STDIN通过SSH将指示符从Bash传递回Perl

Linux 通过STDIN通过SSH将指示符从Bash传递回Perl,linux,bash,perl,unix,Linux,Bash,Perl,Unix,我们有一个Linux服务器,它可以运行诊断脚本,diag.pl,该脚本通过其他服务器协调报告 diag.pl在子服务器上迭代,对于每个子服务器,SSHs进入并运行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

我们有一个Linux服务器,它可以运行诊断脚本,
diag.pl
,该脚本通过其他服务器协调报告

diag.pl
在子服务器上迭代,对于每个子服务器,SSHs进入并运行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能够轻松捕获它

我试过什么

  • 使用
    setattr
    在tar.gz上设置
    user.comment
    attr,但该注释在UU编码后不存在
  • 目前认为我的最佳选择是使用上面的伪代码,创建一个新文件进行编码和发送,并更新Perl脚本,以便在每次新传输时检查它,直到找到特殊文件为止

  • 我认为目标是修改一个shell脚本,该脚本向调用者返回一个编码文件,以便它发送更多信息,特别是一个字符串作为调用者中的标志

    目前尚不清楚shell脚本是如何从Perl脚本运行的,但有一些方法可以做到这一点,以便调用方在发出shell脚本时或在运行完成后返回打印的单独“行”

    然后,您只需将所需的额外打印添加到shell脚本中的STDOUT,并在调用者中检查shell输出的每一行,以查看它是否符合某些“协议”;例如,它是否是或以特殊文件查找字符串开头。然后,您可以为进一步调用设置标志,或为后续运行写入控制文件等。否则,该行就是编码文件

    使用(见本页末尾)编写的基本示例

    使用警告;
    严格使用;
    使用特征“说”;
    my@cmd=qw(ls-l./);
    my$file_found=quotemeta‘找到特殊文件’;
    我的($flag,$binfile);
    my$pid=open(my$out,'-|',@cmd)//die“无法打开@cmd:$!”;
    而(){
    咀嚼;
    如果(/^$file_found/){
    $flag=1;
    }
    否则{
    $binfile=$\ux;
    #任何其他需要做的事情,或者可能是最后一次;
    }
    }
    收尾美元;
    
    本例运行命令
    ls-l./
    ,但您可以运行任何可执行文件,如
    @cmd=('report.sh','arg1','arg2',…)

    另一种方法是使用backticks()并将其返回值分配给数组,在这种情况下,每个元素接收一行输出


    另一个更好的方法是使用管理外部命令的模块。例如,从简单到更强大:,,。

    我们需要看到更多的代码。我只是问如何发送指示符,而不是其他逻辑(这是实质性的)。您还想看到什么?的一个要点是为我们创建一个改进建议。没有它,人们可能会倾向于投反对票,或者,当然。给我们讲讲上下文perl命令调用report.sh脚本并对整个输出进行解码。现在你想让报告脚本打印uuencoded数据和一些纯文本吗?我认为这一切都必须是uuencoded数据,因为网络是如何工作的。我会更新我的问题。
    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;