问题描述
遇到这样的情况,即curl请求在命令行中可以正常工作,但不适用于出现奇怪错误的脚本。这是脚本的一部分:
#we already got the $token
#vars defining curl parameters
dc="NA EU AU SEA JP"
curl_url='https://example.com/api/config/v1/'
curl_request='alertingProfiles?'
curl_properties='tenant=all&stage=prd&cluster='
curl_auth='"Authorization: Bearer '"$token"'"'
for k in $dc; do
# Download the json for each DC using the curl request
curl_combined=\""$curl_url$curl_request$curl_properties$k"\"; echo "$curl_combined"
curlCMD=( -vv --location --request GET "$curl_combined" -H "$curl_auth" -o \""$k.json"\")
echo "${curlCMD[@]}"
curl "${curlCMD[@]}"
done
在脚本中运行此命令时,将看到以下输出: 首先,第一个echo命令的输出
"https://example.com/api/config/v1/alertingProfiles?tenant=all&stage=prd&cluster=NA"
然后,第二个echo命令的输出(curl应该将其作为参数),我已经跳过了承载令牌,但是请相信我,这不是问题。
-vv --location --request GET "https://example.com/api/config/v1/alertingProfiles?tenant=all&stage=prd&cluster=NA" -H "Authorization: Bearer " -o "NA.json"
我正在关注以下输出
Note: Unnecessary use of -X or --request,GET is already inferred.
* Protocol ""https" not supported or disabled in libcurl
* Closing connection -1
curl: (1) Protocol ""https" not supported or disabled in libcurl
请注意以上https前面消息中的两个双引号。
如果我只是在curl并执行后立即在命令行中复制/粘贴上面的第二个echo输出,它将按预期工作并在文件中下载JSON。
如果我从curl_combined
变量中删除了“,则发送的请求没有双引号,现在我从脚本中收到消息curl: (56) Unexpected EOF
。
如果我复制/粘贴第二个回显输出(不带双引号),将其提供给curl,然后从命令行执行,则我将收到403消息,直到在https请求周围加上双引号或单引号。
简而言之-似乎必须在https请求周围用双引号引起来,但由于某些原因,curl并不能使用它。
那么这里出了什么问题?我什至不介意将构造的URL写入文件中并从中读取,或者在有帮助的情况下使用herestring,但我想知道这里到底出了什么问题。
谢谢。
P.S。删除--location
或--request GET
或两者都不会改变结果。
解决方法
脚本正在使用将"${curlCMD[@]}"
数组作为参数传递给curl
。这种方法将处理url的正确扩展,而不考虑其中的任何特殊字符。无需使用\"
构造将curl_combined与其他引号引起来。
建议将设置curl_combined替换为:
curl_combined="$curl_url$curl_request$curl_properties$k"
echo "$curl_combined"
,
此解决方案可将带有数组的curl请求替换为以下内容
curl -vv \
--location \
--request GET \
"$curl_combined" \
--header "Authorization: Bearer ${token}" \
-o "$k.json"
但这很丑,礼貌地说...