ChatGPT解决这个技术问题 Extra ChatGPT

将带括号的 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'

有趣的是,我使用反斜杠仅转义第一个括号,它以错误代码 20497 静默失败:

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

我的问题是如何在一般情况下解决这个问题?是否有一个参数会自动转义 URL,或者在传递给 curl 之前需要转义的字符的描述?


m
moveson

没关系,我在文档中找到了它:

-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 them being interpreted by  curl
              itself.  Note  that  these  letters  are not normal legal URL contents but they should be
              encoded according to the URI standard.

对我来说,它没有用。我必须在每个方括号之前添加一个 \
@jesusperaltac 对我来说也一样,使用 macOS
对我来说,它在 OS X High Sierr、curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 上有效。
@Jean @jesusperaltac 对我来说,如果命令是 curl -L -o <local_file_name> -g <url>,它可以在 Windows 上运行
为我工作 CentOS 7.1。卷曲版本 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0)
R
Rich

Globbing 使用括号,因此需要用斜杠 \ 转义它们。或者,以下命令行开关将禁用通配:

--globoff(或空头期权版本:-g

前任:

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

D
Dashrath Mundkar

以上答案都不适合我,我必须用 %5B%5D 替换所有开/关括号。

[ ---> %5B

] ---> %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


这是唯一适用于 MacOS 的解决方案。
l
lancepants

尽管我的 URL 中没有(明显的)括号,但我收到了这个错误,在我的情况下,--globoff 命令不会解决这个问题。

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

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[colour\codes] 转换为预期的无特殊字符 URL,但在幕后,颜色代码在传递给 curl 的 URL 中发送,导致URL 中的括号。

解决方案是不使用匹配突出显示。