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命令无法正确运行的主要内容,如果未能解决你的问题,请参考以下文章