在 CURL GET 中传递变量 [英] Passing Variables in CURL GET

查看:36
本文介绍了在 CURL GET 中传递变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个从 JSON 读取数据的 sh 脚本,并通过解析将数据作为变量传递给 curl 请求 (GET)

I'm trying to write a sh script that reads data from a JSON, and by parsing, pass the data as variables for a curl request (GET)

解析正确,但 CURL 请求继续出现问题.

The parsing is done correctly but the CURL request continues to give problems.

我在JQ的帮助下打开JSON后解析变量:

I parse the variables, after opening the JSON, with the help of JQ:

ruleId=$($JSON | jq '.[].ruleId')
alert=$($JSON | jq '.[].alertName')
...

我以这种方式传递变量:

I'm passing the variables in this way:

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 使用错误/非法格式或缺少 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}\&parameter=${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";作为它自己的命令/函数,而不是将文件的内容传送到 jq.

I think the error was occurring because shell was trying & failing to execute "whitelist_tmp.json" as its own command/function instead of piping the contents of the file to jq.

您还想在要传递给 curl 的变量中为 jq 添加 -r 选项,如下所示:

You also want to add the -r option to jq in the variables you are going to pass in curl, like so:

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 输出不带任何引号的原始字符串数据.

Without the -r option, any strings that jq outputs will be quoted, which could be escaping your script's quotation in the curl command. The -r option tells jq to output the raw string data without any quotation.

这篇关于在 CURL GET 中传递变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆