有人能解释一下为什么通过STDIN传递bash脚本数据会导致脚本中的命令不能起作用吗?
脚本:
#!/bin/bash
ausearch -i -a 1221217
如果我运行以下命令,它将输出预期的ausearch结果:
./au.sh
但是,如果我这样做:
echo "blah" | ./au.sh
然后输出:
<no matches>
两个执行方法都应返回相同的结果(因为ausearch是硬编码的),但stdin似乎将其破坏了。
我不询问如何在bash脚本中读取stdin数据。
答案 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或脚本的任何其他部分。