通过Bash脚本执行curl命令报"URL rejected"错误,直接运行正常
Bash脚本执行curl报错,直接运行却正常的解决办法
我写了段Bash脚本执行curl命令:
mycommand="curl $mycommand --url '${requestURL}'" echo "Search Command $mycommand" myresponse="$(${mycommand})"
执行后报错,输出如下:
Search Command curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s ' https://my-rest-services:443/mypath/someparameters' * URL rejected: Bad hostname * Closing connection * URL rejected: Port number was not a decimal number between 0 and 65535 * Closing connection
但把这条curl命令直接复制到命令行运行,却能正常返回JSON响应:
curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s ' https://my-rest-services:443/mypath/someparameters' {myjson response}
问题原因
核心问题是把命令拼接成字符串执行的方式错误。当你把requestURL用单引号包起来存入变量时,Bash会把单引号当成URL的一部分,而不是用来界定字符串的语法符号。从输出能看到URL被拆成了两行,末尾的单引号加换行让curl误以为主机名和端口格式非法,所以报错。
解决办法
方法1:用数组存储命令参数(推荐)
Bash处理带特殊字符、空格的命令,最稳妥的方式是用数组,能完美保留每个参数的边界:
# 初始化数组,先放curl命令 mycommand=(curl) # 追加之前的命令参数(如果$mycommand原本就是参数集合) mycommand+=($mycommand) # 添加URL参数,不用额外加引号 mycommand+=(--url "${requestURL}") # 打印完整命令(用[@]展开数组,保留参数结构) echo "Search Command" "${mycommand[@]}" # 执行命令 myresponse="$("${mycommand[@]}")"
方法2:清理URL并修正字符串拼接
如果一定要用字符串执行,先处理掉URL里的换行符,并且不要给URL加多余的单引号:
# 清除requestURL中的换行和多余空格 requestURL=$(echo "$requestURL" | tr -d '\n' | xargs) # 拼接命令时直接用变量,不用加单引号 mycommand="curl $mycommand --url ${requestURL}" echo "Search Command $mycommand" myresponse="$(${mycommand})"
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

