传递一个带括号的URL给curl

如果我试图传递一个包含括号的URL给curl,它会失败并报错:

$ curl 'http://www.google.com/?TEST[]=1'
curl: (3) [globbing] illegal character in range specification at pos 29

然而,如果我转义两个括号,它似乎工作:

$ curl 'http://www.google.com/?TEST\[\]=1'

我怎么解决这个问题?是否有自动转义url的参数,或在传递到curl之前需要转义的字符的描述?

166018 次浏览

在命令中添加-g:

-g, --globoff
This option switches off the "URL globbing parser". When you set this option, you can
specify URLs that contain the letters {}[] without having curl itself interpret them.
Note that these letters are not normal legal URL contents but they should be encoded
according to the URI standard.


Example:
curl -g "https://example.com/{[]}}}}"

curl.se/docs/manpage.html#-g .html#

Globbing使用括号,因此需要用斜杠\来转义。或者,下面的命令行开关将禁用globbing:

--globoff(或短选项版本:-g)

例:

curl --globoff https://www.google.com?test[]=1

我得到这个错误,虽然没有(明显的)括号在我的URL,在我的情况下——globoff命令不会解决这个问题。

例如(在mac上的iTerm2中执行此操作):

for endpoint in $(grep some_string output.txt); do curl "http://1.2.3.4/api/v1/${endpoint}" ; done

我有grep别名为“grep -color=always”。结果,上面的命令会导致这个错误,some_string会以你设置的grep的颜色高亮显示:

curl: (3) bad range in URL position 31:
http://1.2.3.4/api/v1/lalalasome_stringlalala

终端透明地将[color \codes]some_string[color \codes]转换为在终端中查看时预期的无特殊字符URL,但在幕后,颜色代码被发送在URL中传递给curl,导致URL中出现括号。

解决方案是不使用匹配高亮显示。

上面的答案都不适合我,我必须用%5B%5D替换所有的开始/结束括号。

[ ---> %5B和for

] ---> %5D

我最初的curl url是这样的

https://test.com/computer/agent1/api/json?pretty=true&tree=executors[currentExecutable[url]]

现在我这样用

https://test.com/computer/agent1/api/json?pretty=true&tree=executors%5BcurrentExecutable%5Burl%5D%5D