Linux 通过STDIN通过SSH将指示符从Bash传递回Perl
我们有一个Linux服务器,它可以运行诊断脚本,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
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编码后不存在我认为目标是修改一个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;