在Linux中有没有一种方法可以将终端/SSH流作为另一个程序的输入。
我可以让以下内容正常工作:
#!/bin/bash
FIFO="$1"
ps auwx | grep "[m]rLogger 192.168.10.10"
if [ $? -eq 0 ]; then
exit
fi
while [ 1 ]
do
/usr/bin/sshpass -p MrLoggertemp /usr/bin/ssh -t -t -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -l mrlogger 192.168.10.10 >> "$FIFO"
echo "sshpass failed. restarting"
sleep 1
done
..然后它会流到一个文件中
但是我想把这个流到一个Perl脚本中,我想做一些处理,然后加载到一个数据集中。
有没有办法在perl脚本中做如下像:
my $fifo_fh;
my $fifo_file = <The output of the stream above>
open($fifo_fh, "+< $fifo_file") or die
谢谢你
2条答案
按热度按时间ih99xse11#
我不知道你的命令“stream“是什么,也不知道你到底需要它做什么。
但是,Perl脚本可以通过多种方式充当过滤器。
如果你想将一个流通过管道传输到scirpt中,那么从
STDIN
(fd 0的perl句柄)读取它。现在使用命令
ls -l .
的输出行在script.pl
中处理(仅在上面打印)。所以用你的例子代替
cmd >> "$FIFO"
有cmd | script.pl
并在脚本中写入(追加)到文件中,经过适当的处理。如果您更愿意在脚本内部完成所有这些操作,一种基本方法是使用“pipe-open”
当命令以列表(
@cmd
)的形式传递时,假设@cmd
的第一个元素是要运行的程序,它被直接调用,而@cmd
的其余部分则作为参数传递给它。这样就完全避免了shell,即使命令中有shell元字符。但是如果命令是要使用shell的话,那么就把它写成一个字符串,或者把它当作
"@cmd"
来传递,其中引号将@cmd
插入到一个字符串中,元素之间有空格。然后,有一些库可以促进和改进这一点。它是最复杂的一种,但也是迄今为止功能最强大的一种,几乎可以让你的程序运行一个迷你shell。†
让我知道这是如何配合(或不)与您的用途,以便我们可以调整它,如果需要的话。
当一个循环条件被写为
while (<$fh>)
时,它通过<>
操作符从文件句柄$fh
读取的一行被赋值给一个无所不在的默认变量$_
(如果我们显式地赋值给一个变量,就像我上面为了清楚起见所做的那样,那么交易就失败了,$_
是未定义的)。变量
$_
是许多其他运算符的默认值,包括chomp
和say
。那么上面的例子可以写成
如果使用得当,这会导致代码非常精简和可读。但是如果我们最终需要在循环体中大量显式使用
$_
(不是所有的东西都默认使用它!),或者最终得到晦涩难懂的代码,那么请务必引入并使用一个好的词法变量。†基本用途很简单。
vzgqcmou2#
另一种框架方法使用Linux命名管道。
通过远程服务器进行真实的通信。
https://en.wikipedia.org/wiki/Named_pipe