【问题标题】:Pass a indicator from Bash back to Perl over SSH via STDIN通过 STDIN 通过 SSH 将 Bash 中的指示符传回 Perl
【发布时间】:2019-05-14 19:42:50
【问题描述】:

我们有一个 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 attr,但注释在uuencoding 中不存在
  2. 目前认为我最好的办法是使用上面的伪代码,创建一个新文件进行编码和发送,并更新 Perl 脚本以在每次新传输时检查它,直到找到特殊文件。

【问题讨论】:

  • 我们需要查看更多代码。
  • 我只是在询问如何发送指标,与其余逻辑无关(这很重要)。你还想看什么?
  • this guide to good questions 的一个要点是创建一个example of what you've tried 供我们提出改进建议。如果没有它,人们可能会倾向于反对no codeno research,当然还有no MCVE。给我们上下文。 :)
  • 您的 perl 命令调用 report.sh 脚本并 uudecode 整个输出。现在您希望报告脚本打印 uuencoded 数据一些纯文本?
  • 我认为这一切都必须是 uuencoded 数据,因为网络是如何工作的。我会更新我的问题。

标签: linux bash perl unix


【解决方案1】:

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

尚不清楚如何从 Perl 脚本运行 shell 脚本,但有一些方法可以让调用者返回打印的单独“行”,无论是在它们发出时还是在运行完成后完全打印.

然后您可以在 shell 脚本中添加所需的额外打印到STDOUT,并在调用者中检查每行 shell 输出以查看它是否符合某些“协议”;例如,它是 special-file-found 字符串还是以 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)   // 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::SimpleCapture::TinyIPC::Run3IPC::Run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2017-03-15
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多