在stdin上通过管道传输数据时,调用ausearch的脚本的行为有所不同

时间:2019-01-29 17:47:25

标签: linux bash shell

有人能解释一下为什么通过STDIN传递bash脚本数据会导致脚本中的命令不能起作用吗?

脚本:

#!/bin/bash
ausearch -i -a 1221217

如果我运行以下命令,它将输出预期的ausearch结果:

./au.sh

但是,如果我这样做:

echo "blah" | ./au.sh

然后输出:

<no matches>

两个执行方法都应返回相同的结果(因为ausearch是硬编码的),但stdin似乎将其破坏了。

询问如何在bash脚本中读取stdin数据。

2 个答案:

答案 0 :(得分:2)

ausearch如果stdin是管道,则更改其行为。如果是,它将通过stdin搜索而不是通过审计守护程序日志搜索。您可以使用--input-logs强制其从日志中读取。

echo "blah" | ausearch -i -a 1221217 --input-logs

重定向stdin将达到相同的目的。

#!/bin/bash
ausearch -i -a 1221217 < /dev/null

答案 1 :(得分:0)

bash,stdin或脚本没有问题。 ausearch的行为是原因。

  

ausearch实用程序可以   只要输入是原始日志数据,也可以从stdin中获取输入。

请参见ausearch手册页:http://man7.org/linux/man-pages/man8/ausearch.8.html

您的脚本将按原样传递args,但由于管道ausearch仅从stdin中读取“ blah”,而不是默认日志文件,因此不提供匹配项。

如果您不希望发生这种情况,请使用SOMEVAR = $(cat / dev / stdin)捕获bash中的stdin并将其作为$ SOMEVAR传递给ausearch或脚本的任何其他部分。