为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 | 安全地运行 jq 命令 (管道)字符?

如何使用 | 安全地运行 jq 命令 (管道)字符?

Go
qq_遁去的一_1 2022-07-11 10:33:17
我有一个程序可以让用户用 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'。请重新打开。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

您可以使用 io.Pipe() ,它基本上创建了一个同步的内存管道,它可用于将期望 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包到 Marshal 和 Unmarshal JSON。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

OSZAR »