jq生成的Shell命令无法正确运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jq生成的Shell命令无法正确运行相关的知识,希望对你有一定的参考价值。

我正在尝试在bash脚本中执行postgres命令,但我不知道为什么它不起作用。

问题是我需要从JSON文件读取数据。为此,我使用jq库并创建了该语句,但psql仅给出错误。

file.json


  "databases": [
    "db1",
    "db2"
  ],
  "logins": [
    
      "username": "user1",
      "password": "pwd1"
    ,
    
      "username": "user2",
      "password": "pwd2"
    
  ],
  "rights": [
    
      "username": "user1",
      "database": "db1",
      "grant": "ALL PRIVILEGES"
    ,
    
      "username": "user2",
      "database": "db2",
      "grant": "ALL PRIVILEGES"
    
  ]

init.sh

# rights

mapfile -t arr < <(jq -M -r '.rights[] | "psql -d 'template1' -U 'postgres' -c GRANT \"" +  .grant + "\" ON DATABASE \"" + .database + "\" TO \"" + .username + "\";"' $CONFIG_PATH)

for a in "$arr[@]"; $a; done

错误

psql: warning: extra command-line argument ""ALL" ignored
psql: warning: extra command-line argument "PRIVILEGES"" ignored
psql: warning: extra command-line argument "ON" ignored
psql: warning: extra command-line argument "DATABASE" ignored
psql: warning: extra command-line argument ""db1"" ignored
psql: warning: extra command-line argument "TO" ignored
psql: warning: extra command-line argument ""user1";" ignored
ERROR:  syntax error at end of input
LINE 1: GRANT
             ^

我用不同的方式尝试过,但是都失败了:(

有人知道该怎么做吗?非常感谢!

答案

原始代码具有严重的安全漏洞。经过以下调整,我们仅容易受到SQL注入的攻击,而不再受到shell注入的攻击;并且不再尝试将data作为代码在shell中运行:

sql=$(jq -r '
  .rights[] |
  "GRANT \"\(.grant)\" ON DATABASE \"\(.database)\" TO \"\(.username)\";"' \
  <"$config_path"
)
psql -d template1 -U postgres -c "$sql"

如果您确实要使用jq生成Shell命令,则可以执行此操作,但是要安全地这样做,需要使用jq原语@sh;然后将结果解析为代码而不是数据需要eval

eval "$(jq -r '
  .rights[] |
  [ "psql", "-d", "template1", "-U", "postgres",
    "GRANT \"\(.grant)\" ON DATABASE \"\(.database)\" TO \"\(.username)\";"
  ] | @sh' \
  <"$config_path"
)"
psql -d template1 -U postgres -c "$sql"

以上是关于jq生成的Shell命令无法正确运行的主要内容,如果未能解决你的问题,请参考以下文章

Linux 命令详解Shell 解析 json命令jq详解

Emacs shell 无法识别 python 命令

如何在python中运行shell命令

jq --- shell命令模式下JSON格式化利器

求问 BAT脚本如何自动执行 adb shell 以后的命令

MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令