4

我试图通过 pssh 向 linux shell 上的 osquery 发送一个 sql select 语句来拉取安装在一组主机上的所有 jdk 包。

这是查询:

pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'

但是“%”的使用给了我以下错误。

Error: near line 1: near "%": syntax error

我试图逃避 % ,但错误仍然相同。任何想法如何克服这个错误?

4

2 回答 2

4

您不是从您的外壳程序而是从查询解析器中收到此错误的,而且它实际上不是由%字符引起的,而是由'紧接在它之前的那个字符引起的。看看你在哪里引用:

'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'
^----------------------------------------------------^     ^-------------------^

shell 在解析参数时会使用这些引号。单引号告诉外壳程序忽略内部的任何其他特殊字符,并将引号的内容视为参数的一部分——但不是引号本身。

在 shell 解析完成后,发送到的实际逐字参数pssh如下所示:

echo "SELECT name FROM rpm_packages where name like %jdk%;"| osqueryi --json

请注意,所有单引号都已被删除。结果是您的查询工具%在一个它不期望的地方看到了(可能是模数)运算符 - 就在另一个运算符 ( like) 之后,这对解析器和name like * jdk. 解析器不明白有两个连续的二元运算符意味着什么,所以它抱怨第二个:%.

为了在那里获得文字',您需要跳过这个圈:

'\''
^^^^- start quoting again
|||
|\+-- literal '
|
\---- stop quoting

因此,要解决此问题,请将'字符串中的所有实例替换为'\''

pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '\''%jdk%'\'';"| osqueryi --json'
于 2020-05-16T04:49:25.583 回答
0

osqueryi 接受命令行上的单个语句。消除回声可以使引用更简单:

osqueryi --json "SELECT * FROM users where username like '%jdk%'"

但是,您将需要引号才能通过pssh命令行。

虽然osqueryi对于简短的事情非常有用,但如果您正在构建一个频繁的轮询服务,那么osqueryd使用预定查询通常更简单。

于 2020-05-16T13:28:08.500 回答