【问题标题】:Passing Variables in CURL GET在 CURL GET 中传递变量
【发布时间】:2021-10-13 03:38:01
【问题描述】:

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

解析已正确完成,但 CURL 请求仍然出现问题。

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

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}\&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"

【问题讨论】:

  • 我无法重现此错误。你能告诉我们你在curl命令行中使用的所有变量的值吗?
  • @larsks:json 看起来像这样: [{"url":[ ],"reason":"Incomplete or No Cache-control and Pragma HTTP Header Set","ruleId":"10055 ","evidence":" ","newLevel":-1,"alertName":"Incomplete or No Cache-control and Pragma HTTP Header Set","parameter":" "}
  • 仍然无法重现问题。 Here is my test。请更新您的问题以包含一个可运行示例,该示例重现您所询问的错误。
  • 对不起,here you go
  • “更新你的问题”是指“将相关代码放入你的问题”。我现在已经为你解决了,但通常你的问题应该包含诊断问题所需的所有材料。

标签: bash shell curl jq url-parameters


【解决方案1】:
  1. jq 接受文件名参数,最好使用它而不是更改 whitelist 以包含对 cat 的调用:
    jq -r 'MYFILTER' "$whitelist"
  1. 使用诸如.[].evidence' 之类的过滤器会使您的脚本非常脆弱,因为它假定顶级数组总是只有一个条目。如果您只想要数组中的第一个条目,您可以指定它,尽管使用 first 可能会更加健壮:
    first(.[].evidence)
  1. 虽然 jq 是相当轻量级的,但值得注意的是,所有对 jq 的调用都可以减少到一个,当然你的 shell 脚本也必须修改。参见例如

【讨论】:

  • 非常感谢您的建议!是的,实际上这个想法是,一旦我有了一个工作脚本,就可以使用循环来遍历 JSON。这会使脚本更加脆弱。我会看看另一个主题,thx ;)
【解决方案2】:

尝试改变

whitelist=whitelist_tmp.json

whitelist="cat whitelist_tmp.json"

我认为错误的发生是因为 shell 试图将“whitelist_tmp.json”作为自己的命令/函数执行,而不是将文件的内容通过管道传输到 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 输出不带任何引号的原始字符串数据。

【讨论】:

  • 好一个!真的是好点,谢谢。通过测试这一点,我仍然遇到了一些麻烦。我认为与“url”参数实际上是一个数组这一事实有关,这会导致一些问题。
  • 我通过使用解决了这个问题: url=$($whitelist | jq -r '.[].url | .[]') 不幸的是我仍然遇到同样的错误(curl bad 非法格式)
  • 如果数组有多个元素,则需要指定数组的索引(例如 '.[0].url' ),因为 curl 不能接受具有多行参数的值。跨度>
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多