【发布时间】:2021-01-25 17:49:08
【问题描述】:
我有一个程序可以让用户使用 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[] | .笑话 | rm 文件.txt'。请重新打开。
【问题讨论】:
-
您需要正确引用传递给 jq 的任何内容。您究竟是如何调用
jq的?您如何处理用户字符串?细节很重要。 -
哦,好的。我已经编辑了,但如果有更好的方法请提出建议!
-
好的。在这种情况下,反引号可以用双引号代替。我没有标记为 Go,因为答案不一定是 Go...我感兴趣的部分是我应该运行的命令行命令。
-
为什么不能使用 go 标准库中的 golang.org/pkg/encoding/json 包?
-
catis useless. 我猜你是用它作为占位符,但如果你能完全避免调用 shell,你可以大大简化问题。