在 CURL GET 中传递变量
Passing Variables in CURL GET
我正在尝试编写一个从 JSON 读取数据的 sh 脚本,并通过解析将数据作为变量传递给 curl 请求 (GET)
解析正确,但 CURL 请求继续出现问题。
我解析变量,打开JSON后,借助JQ:
ruleId=$($JSON | jq '.[].ruleId')
alert=$($JSON | jq '.[].alertName')
...
我以这种方式传递变量:
curl --data-urlencode "ruleId=$ruleId" --data-urlencode "newLevel=$newLevel" --data-urlencode "url=$url" --data-urlencode "urlIsRegex=$urlIsRegex" --data-urlencode "enabled=$enabled" --data-urlencode "parameter=$parameter" --data-urlencode "evidence=$evidence" "http://localhost:8090/JSON/alertFilter/action/addGlobalAlertFilter"
我返回的错误是:
curl: (3) URL using bad/illegal format or missing URL
你能帮帮我吗?
这是我的测试脚本:
!/bin/sh
#set -e
# Info to test this script
# 1. Start docker
# 2. Run this command from terminal: docker run -u zap -p 8080:8090 -i owasp/zap2docker-stable zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.disablekey=true -config api.addrs.addr.name=.* -config api.addrs.addr.regex=true
# 2. Get the JSON from api (test for now)
# 3. bash filter.sh
# 4. Check for filter to be set with browser http://localhost:8080/UI/alertFilter/ => view global filter
#open example JSON file (API) and check for alert filter list
curl -s 'https://api.npoint.io/c29e3a68be632f73fc22' > whitelist_tmp.json
whitelist=whitelist_tmp.json
#Parser WITOUT loop
ruleId=$($whitelist | jq '.[].ruleId')
alert=$($whitelist | jq '.[].alertName')
newLevel=$($whitelist | jq '.[].newLevel')
url=$($whitelist | jq '.[].url')
urlIsRegex=$($whitelist | jq '.[].urlIsRegex')
enabled=$($whitelist | jq '.[].enabled')
parameter=$($whitelist | jq '.[].parameter')
evidence=$($whitelist | jq '.[].evidence')
#Fist test-query WITHOUT url-encoding => not working
#curl -X -4 --retry 2 --retry-connrefused --retry-delay 3 "http://localhost:8080/JSON/alertFilter/action/addGlobalAlertFilter/?ruleId=${ruleId}\&newLevel=${newLevel}\&url=${url}\&urlIsRegex=${urlIsRegex}\¶meter=${parameter}\&enabled=${enabled}\&evidence=${evidence}"
#Second test-query WITH url-encoding
curl --data-urlencode "ruleId=$ruleId" --data-urlencode "newLevel=$newLevel" --data-urlencode "url=$url" --data-urlencode "urlIsRegex=$urlIsRegex" --data-urlencode "enabled=$enabled" --data-urlencode "parameter=$parameter" --data-urlencode "evidence=$evidence" "http://localhost:8080/JSON/alertFilter/action/addGlobalAlertFilter"
尝试改变
whitelist=whitelist_tmp.json
到
whitelist="cat whitelist_tmp.json"
我认为错误的发生是因为 shell 试图将“whitelist_tmp.json”作为它自己的 command/function 执行但未能成功,而不是将文件内容通过管道传输到 jq。
您还想在要传递给 curl 的变量中为 jq 添加 -r 选项,如下所示:
ruleId=$($whitelist | jq -r '.[].ruleId')
alert=$($whitelist | jq -r '.[].alertName')
newLevel=$($whitelist | jq -r '.[].newLevel')
url=$($whitelist | jq -r '.[].url')
urlIsRegex=$($whitelist | jq -r '.[].urlIsRegex')
enabled=$($whitelist | jq -r '.[].enabled')
parameter=$($whitelist | jq -r '.[].parameter')
evidence=$($whitelist | jq -r '.[].evidence')
如果没有 -r 选项,jq 输出的任何字符串都将被引用,这可能会在 curl 命令中转义脚本的引号。 -r 选项告诉 jq 输出没有任何引号的原始字符串数据。
- jq 接受文件名参数,使用它比更改
whitelist
以包含对 cat
: 的调用更好
jq -r 'MYFILTER' "$whitelist"
- 使用诸如
.[].evidence'
之类的过滤器会使您的脚本非常脆弱,因为它假定顶级数组始终只有一个条目。如果你只想要数组中的第一个条目,你可以指定它,尽管使用 first
可能会更健壮:
first(.[].evidence)
- 尽管 jq 相当轻量级,但值得注意的是,所有对 jq 的调用都可以减少为一次,当然您的 shell 脚本也必须进行修改。参见示例
我正在尝试编写一个从 JSON 读取数据的 sh 脚本,并通过解析将数据作为变量传递给 curl 请求 (GET)
解析正确,但 CURL 请求继续出现问题。
我解析变量,打开JSON后,借助JQ:
ruleId=$($JSON | jq '.[].ruleId')
alert=$($JSON | jq '.[].alertName')
...
我以这种方式传递变量:
curl --data-urlencode "ruleId=$ruleId" --data-urlencode "newLevel=$newLevel" --data-urlencode "url=$url" --data-urlencode "urlIsRegex=$urlIsRegex" --data-urlencode "enabled=$enabled" --data-urlencode "parameter=$parameter" --data-urlencode "evidence=$evidence" "http://localhost:8090/JSON/alertFilter/action/addGlobalAlertFilter"
我返回的错误是:
curl: (3) URL using bad/illegal format or missing URL
你能帮帮我吗?
这是我的测试脚本:
!/bin/sh
#set -e
# Info to test this script
# 1. Start docker
# 2. Run this command from terminal: docker run -u zap -p 8080:8090 -i owasp/zap2docker-stable zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.disablekey=true -config api.addrs.addr.name=.* -config api.addrs.addr.regex=true
# 2. Get the JSON from api (test for now)
# 3. bash filter.sh
# 4. Check for filter to be set with browser http://localhost:8080/UI/alertFilter/ => view global filter
#open example JSON file (API) and check for alert filter list
curl -s 'https://api.npoint.io/c29e3a68be632f73fc22' > whitelist_tmp.json
whitelist=whitelist_tmp.json
#Parser WITOUT loop
ruleId=$($whitelist | jq '.[].ruleId')
alert=$($whitelist | jq '.[].alertName')
newLevel=$($whitelist | jq '.[].newLevel')
url=$($whitelist | jq '.[].url')
urlIsRegex=$($whitelist | jq '.[].urlIsRegex')
enabled=$($whitelist | jq '.[].enabled')
parameter=$($whitelist | jq '.[].parameter')
evidence=$($whitelist | jq '.[].evidence')
#Fist test-query WITHOUT url-encoding => not working
#curl -X -4 --retry 2 --retry-connrefused --retry-delay 3 "http://localhost:8080/JSON/alertFilter/action/addGlobalAlertFilter/?ruleId=${ruleId}\&newLevel=${newLevel}\&url=${url}\&urlIsRegex=${urlIsRegex}\¶meter=${parameter}\&enabled=${enabled}\&evidence=${evidence}"
#Second test-query WITH url-encoding
curl --data-urlencode "ruleId=$ruleId" --data-urlencode "newLevel=$newLevel" --data-urlencode "url=$url" --data-urlencode "urlIsRegex=$urlIsRegex" --data-urlencode "enabled=$enabled" --data-urlencode "parameter=$parameter" --data-urlencode "evidence=$evidence" "http://localhost:8080/JSON/alertFilter/action/addGlobalAlertFilter"
尝试改变
whitelist=whitelist_tmp.json
到
whitelist="cat whitelist_tmp.json"
我认为错误的发生是因为 shell 试图将“whitelist_tmp.json”作为它自己的 command/function 执行但未能成功,而不是将文件内容通过管道传输到 jq。
您还想在要传递给 curl 的变量中为 jq 添加 -r 选项,如下所示:
ruleId=$($whitelist | jq -r '.[].ruleId')
alert=$($whitelist | jq -r '.[].alertName')
newLevel=$($whitelist | jq -r '.[].newLevel')
url=$($whitelist | jq -r '.[].url')
urlIsRegex=$($whitelist | jq -r '.[].urlIsRegex')
enabled=$($whitelist | jq -r '.[].enabled')
parameter=$($whitelist | jq -r '.[].parameter')
evidence=$($whitelist | jq -r '.[].evidence')
如果没有 -r 选项,jq 输出的任何字符串都将被引用,这可能会在 curl 命令中转义脚本的引号。 -r 选项告诉 jq 输出没有任何引号的原始字符串数据。
- jq 接受文件名参数,使用它比更改
whitelist
以包含对cat
: 的调用更好
jq -r 'MYFILTER' "$whitelist"
- 使用诸如
.[].evidence'
之类的过滤器会使您的脚本非常脆弱,因为它假定顶级数组始终只有一个条目。如果你只想要数组中的第一个条目,你可以指定它,尽管使用first
可能会更健壮:
first(.[].evidence)
- 尽管 jq 相当轻量级,但值得注意的是,所有对 jq 的调用都可以减少为一次,当然您的 shell 脚本也必须进行修改。参见示例