如何使用 | 安全地运行 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[] | .笑话 | rm 文件.txt'。请重新打开。


qq_遁去的一_1
浏览 150回答 1
1回答

达令说

您可以使用 io.Pipe() ,它基本上创建了一个同步的内存管道,它可用于将期望 io.Reader 的代码与期望 io.Writer 的代码连接起来。例如,如果您有这样的 json 内容:{  "fruits": [    "apples",    "oranges",    "pears"  ]}你可以尝试这样的事情:package mainimport (    "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包到 Marshal 和 Unmarshal JSON。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go