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

Json jq生成的Shell命令无法正确运行,json,bash,postgresql,shell,Json,Bash,Postgresql,Shell,我试图在bash脚本中执行postgres命令,但我不知道为什么它不起作用 问题是我需要从JSON文件中读取数据。为此,我使用jq库创建了这个句子,但psql只给出了错误 file.json { "databases": [ "db1", "db2" ], "logins": [ { "username": "user1", "password": "pwd1" }, { "username": "user2

我试图在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

权利
mapfile-t arr<原始代码存在严重的安全漏洞。正如下面所调整的,我们只易受SQL注入的攻击,不再易受shell注入的攻击;并且不再尝试在shell中以代码形式运行数据:

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

应该引用整个查询,以便将其作为一个参数传递给-c。也可以告诉jq生成shell转义输出并立即以脚本形式运行结果,不过,这遇到了中所述的误解。如果使用不同的语言,这将容易得多,已经有JSON和PostgreSQL库的,当然更安全。由于可以在PostgreSQL中以管理员身份运行任意代码的人可以告诉数据库服务器在其自身权限范围内编写任意文件并运行任意可执行文件,因此使用bash生成SQL通常是个坏主意。
sql=$(jq -r '
  .rights[] |
  "GRANT \"\(.grant)\" ON DATABASE \"\(.database)\" TO \"\(.username)\";"' \
  <"$config_path"
)
psql -d template1 -U postgres -c "$sql"
eval "$(jq -r '
  .rights[] |
  [ "psql", "-d", "template1", "-U", "postgres",
    "-c", "GRANT \"\(.grant)\" ON DATABASE \"\(.database)\" TO \"\(.username)\";"
  ] | @sh' \
  <"$config_path"
)"