如何安全地运行带有|(竖线)字符的JQ命令? [英] How do I safely run a jq command with a | (pipe) character?
本文介绍了如何安全地运行带有|(竖线)字符的JQ命令?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个程序,可以让用户用JQ解析JSON数据。我选择了JQ,而不是使用一个库,因为我发现的那些库有奇怪的和不一致的行为。我的问题是JQ通常有|
(管道)字符,这可能会让用户运行非JQ命令。例如:
jq . | rm file.txt
如何安全地让用户运行此操作?
现在,我在go(其中file.txt包含原始json)中调用它:
cmd = exec.Command("bash", "-c", fmt.Sprintf("cat file.txt | %s", cmd))
谢谢!
编辑: 正如多次指出的那样,这个问题不是关于通过管道将命令组合在一起。它是关于如何安全地执行其中包含管道的JQ命令。我不希望用户这样做:curl‘api.icndb.com/jokes/Random/3’|jq-r‘.value[]|.joke|rm file.txt’。请重新打开。
推荐答案
您可以使用io.Tube(),它基本上创建了一个同步内存管道,并且可以用来连接期望io.Reader的代码和期望io.Writer的代码。例如,如果您有如下json内容:
{
"fruits": [
"apples",
"oranges",
"pears"
]
}
您可以尝试这样的操作:
package main
import (
"bytes"
"io"
"os"
"os/exec"
)
func main() {
c1 := exec.Command("cat", "/home/fruits.json")
c2 := exec.Command("jq", ".fruits[0:2]")
r, w := io.Pipe()
c1.Stdout = w
c2.Stdin = r
var b2 bytes.Buffer
c2.Stdout = &b2
c1.Start()
c2.Start()
c1.Wait()
w.Close()
c2.Wait()
io.Copy(os.Stdout, &b2)
}
它将显示如下内容:
[
"apples",
"oranges"
]
尽管您可以通过管道传输几个这样的命令,但我强烈建议您使用标准库中的json包来封送和解封JSON。
这篇关于如何安全地运行带有|(竖线)字符的JQ命令?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文