curl 打印它的 pid 然后在后台运行

curl 打印它的 pid 然后在后台运行

我通过一个简单的curl请求体验到了一些新的东西。

该命令是对curl 的简单调用,如下所示:

curl http://example.com/endpoint/?arg1=val1&arg2=val2

该调用应该返回一个 500+ MB 的 XML 文件(准备好后,我会将-O其保存到文件中),但实际上并没有什么奇怪的。

奇怪的是,curl 只是打印它的 pid,然后进入后台:

[1] 31562

一段时间后,远程文件开始出现在控制台中,并且在后台,我无法使用Ctrl+C.

我从来没有经历过这样的事情。如果我尝试下载 1.9 GB 文件:

curl -O https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso

可以正常使用!

任何想法?

常规下载的标头:

curl -v -s https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso 1> /dev/null
*   Trying 92.123.112.141:443...
* TCP_NODELAY set
* Connected to download.microsoft.com (92.123.112.141) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
... more HTTPS stuff ...
} [5 bytes data]
> GET /download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso HTTP/1.1
> Host: download.microsoft.com
> User-Agent: curl/7.65.3
> Accept: */*
> 
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/octet-stream
< Accept-Ranges: bytes
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-blob-content-md5: mw6jWIuMir1+rZG9/mzj+A==
< Last-Modified: Sat, 13 Oct 2018 00:34:54 GMT
< ETag: "0x8D630A3B1CF6138"
< Content-Length: 2048196608
< Date: Mon, 10 Feb 2020 21:11:55 GMT
< Connection: keep-alive
< 
{ [16038 bytes data]
^C

我的电话:

*   Trying 192.168.0.200:80...
* TCP_NODELAY set
* Connected to example.com port 80 (#0)
> GET /endpoint/?arg1=val1&arg2=val2 HTTP/1.1
> Host: example.com
> User-Agent: curl/7.65.3
> Accept: */*
> 
^C

答案1

该 URL 包含不带引号的&字符。这意味着您的命令将启动

curl http://example.com/endpoint/?arg1=val1

在后台,然后将 shell 变量设置arg2为 value val2,因为这就是 shell 解析该行时 URL 的下一位的含义。

在 URL 两边使用引号:

curl 'http://example.com/endpoint/?arg1=val1&arg2=val2'

即使 URL 不包含&,该?字符也是一个通配字符(与文件名通配模式中的任何单个字符匹配)。因此,不加引号的 URL 会导致zsh具有默认设置的 shell 抱怨no matches found.如果设置了 shell 选项,它也会导致bashshell 抱怨。同样,如果任何 shell 配置为删除不匹配的模式(如in 中),则 URL 将被完全删除。no matchfailglobshopt -s nullglobbash


奖金:

我可能会将该curl命令写为

curl --silent \
    --url-query arg1=val1 \
    --url-query arg2=val2 \
    'http://example.com/endpoint/'

使用--url-query将使curl数据进行 URL 编码,并且还可以让您从文件加载数据(请参阅手册中的选项curl,并查看其中的描述--data-urlencode,因为它负责语义)。它还避免将 shell 变量的值直接注入 URL 字符串(如果这些值是从 shell 变量获取的值)。

另请参阅--variable了解哪些内容也可能有用。

答案2

只需将 & 替换为 %2,对 url 进行编码

这将起作用-curl 'http://example.com/endpoint/?arg1=val1%2arg2=val2'

最好始终使用带有编码 url 的curl -https://www.urlencoder.org/

相关内容