【问题标题】:Is it possible to output multiple values to different files from a single jq invocation?是否可以从单个 jq 调用将多个值输出到不同的文件?
【发布时间】:2019-11-01 16:32:55
【问题描述】:

我有一个 curl,我想将两个文本提取到两个不同的文件 file1.crt 和 file2.key。目前是通过重复 curl 来配置的。

curl -X GET -H "X-Vault-Token:{{ vault_token }}" https://fopp.com/v1/ACME/data/SSL/fopp.com | jq -r .data.data.crt > /files/nginx/ssl/file1.crt && 
curl -X GET -H "X-Vault-Token:{{ vault_token }}" https://fopp.com/v1/ACME/data/SSL/fopp.com | jq -r .data.data.key > /files/nginx/ssl/file2.key

我想知道 jq 是否可以在一个命令中处理提取。

【问题讨论】:

  • 可以输出多个值,但不能写入不同的文件。
  • 那么你根本不需要它们“在一条线上”;您想将第一个输出重定向到一个文件,将第二个输出重定向到另一个文件,但您没有任何理由关心这些输出是否在同一行。
  • @oguzismail,我非常希望它没有,至少没有应用明确的“不安全”切换。限制语言可以减少允许不受信任的用户提供查询的潜在安全影响。
  • 如果查询可以进行文件 I/O,并且您让不受信任的用户提供查询(例如,作为让某人跨服务器池 map/reduce 样式查询一堆文件的一种方式),那么您让不受信任的用户执行文件 I/O。我的意思是,那时的影响应该是非常明显的。至少在过去,过去恶意 jq 查询唯一能做的就是消耗资源,你可以通过设置一个进程允许的 CPU 数量来限制它在被杀之前吃掉。
  • @oguzismail, ...我有过这样的设置,大量的历史数据分布在一堆服务器上,开发人员可以在多个雇主处查询但不能修改过去。让某人使用支持此类基础架构更改的工具突然允许查询执行修改而不是仅收集数据并非没有影响。

标签: shell jq


【解决方案1】:

不仅与jq 本身结合,而且与一些shell 结合起来很容易。如果您的值不能包含文字换行符,这可以很简单:

curl -X GET -H "X-Vault-Token:{{ vault_token }}" https://fopp.com/v1/ACME/data/SSL/fopp.com \
| jq -r '.data.data.crt, .data.data.key' \
| { IFS= read -r crt && printf '%s\n' "$crt" > /files/nginx/ssl/file1.crt;
    IFS= read -r key && printf '%s\n' "$key" > /files/nginx/ssl/file2.key; }

如果值可以包含换行符,那么您需要使用不同的分隔符。考虑:

curl -X GET -H "X-Vault-Token:{{ vault_token }}" https://fopp.com/v1/ACME/data/SSL/fopp.com \
| jq -j '.data.data.crt, "\u0000", .data.data.key, "\u0000"' \
| { IFS= read -r -d '' crt && printf '%s\n' "$crt" > /files/nginx/ssl/file1.crt;
    IFS= read -r -d '' key && printf '%s\n' "$key" > /files/nginx/ssl/file2.key; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多