如何安全地运行带有|(竖线)字符的JQ命令? [英] How do I safely run a jq command with a | (pipe) character?

查看:9
本文介绍了如何安全地运行带有|(竖线)字符的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆