You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:17