Json 如何安全地运行带有|(pipe)字符的jq命令?

Json 如何安全地运行带有|(pipe)字符的jq命令?,json,linux,bash,go,jq,Json,Linux,Bash,Go,Jq,我有一个程序,允许用户用jq解析JSON数据。我去jq,而不是使用图书馆,因为我发现那些图书馆有奇怪和不一致的行为。我的问题是jq通常有|(管道)字符,这可能会让用户运行非jq命令。e、 g: jq.|rm file.txt 我如何安全地让用户运行这个 现在,我在Go中调用它(其中file.txt包含原始json): 谢谢 编辑: 正如多次指出的,这个问题不是关于将命令管道化。它是关于如何安全地执行包含管道的jq命令。我不希望用户这样做:curl'api.icndb.com/crooks/ran

我有一个程序,允许用户用jq解析JSON数据。我去jq,而不是使用图书馆,因为我发现那些图书馆有奇怪和不一致的行为。我的问题是jq通常有
|
(管道)字符,这可能会让用户运行非jq命令。e、 g:

jq.|rm file.txt

我如何安全地让用户运行这个

现在,我在Go中调用它(其中file.txt包含原始json):

谢谢

编辑: 正如多次指出的,这个问题不是关于将命令管道化。它是关于如何安全地执行包含管道的jq命令。我不希望用户这样做:curl'api.icndb.com/crooks/random/3'|jq-r'.value[]|.crook | rm file.txt'。请重新打开。

您可以使用io.Pipe(),它基本上创建了一个同步内存管道,可以用来连接需要io.Reader的代码和需要io.Writer的代码。例如,如果您有如下json内容:

{
  "fruits": [
    "apples",
    "oranges",
    "pears"
  ]
}
[
  "apples",
  "oranges"
]
您可以尝试以下方法:

{
  "fruits": [
    "apples",
    "oranges",
    "pears"
  ]
}
[
  "apples",
  "oranges"
]
主程序包
进口(
“字节”
“io”
“操作系统”
“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
变量b2字节。缓冲区
c2.标准输出=&b2
c1.开始()
c2.开始()
c1.等等
w、 关闭()
c2.等等
io.Copy(os.Stdout和b2)
}
它会给你这样的东西:

{
  "fruits": [
    "apples",
    "oranges",
    "pears"
  ]
}
[
  "apples",
  "oranges"
]

尽管您可以通过管道发送几个类似的命令,但我强烈建议您使用标准库中的包来封送和解封JSON。

您需要正确引用传递给jq的任何内容。您如何准确地调用
jq
?如何处理用户字符串?细节很重要。哦,好的。我已经编辑过,但如果有更好的方法,请建议!好啊在这种情况下,反勾号可以用双引号替换。我没有标记为Go,因为答案不必是Go…我感兴趣的部分是我应该运行的命令行命令。为什么你不能使用Go标准库中的包?我猜你是在使用它作为占位符,但是如果你可以避免调用shell,你可以大大简化这个问题,问题是如何安全地进行。这可能会导致问题:curl'|jq-r'.value[]|.joke | rm file.txt'@user_78361084,不,它不能(*),因为上面的代码中没有shell。jq的参数仅由jq本身解释,没有其他解释。*这是假设您不让客户端控制文件名。