什么是 cURL 命令以及如何使用它(带有示例)
本文通过基于最佳实践的示例解释了 Linux 中的curl 命令以及如何使用它。
什么是卷曲?
cURL 是“客户端 URL”的缩写,是一种使用各种协议传输数据的命令行工具。它是一个重要的 Linux 工具,经常用于连接故障排除。
最基本的是,cURL 允许您通过以 URL 形式定义位置和要传输的数据来与服务器进行通信。您可以从终端调用 curl
命令,而无需考虑如何安装它,因为它已预安装在大多数基于 Linux 的操作系统上。
cURL 有大量用例,例如:
- FTP上传
- 代理支持
- SSL 连接
- HTTP 发布
cURL 还支持使用以下所有协议:DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP 、SMTPS、TELNET 和 TFTP。
下载单个文件
以下命令将获取 URL 的内容并将其显示在 STDOUT 中(即在您的终端上)。
curl https://www.gnu.org
要将输出存储在文件中,您可以重定向它,如下所示。这还将显示一些额外的下载统计信息。
curl https://www.gnu.org > gnu-org.html
将 cURL 输出保存到文件
我们可以使用 -o
/-O
选项将 cURL 命令的结果保存到文件中。
-o
(小写o):结果将保存在命令行中提供的文件名中-O
(大写O):将获取URL中的文件名,并将其用作存储结果的文件名
curl -o my-gettext.html https://www.gnu.org/software/gettext/manual/gettext.html
结果,页面 gettext.html
将保存在名为 my-gettext.html
的文件中。此外,您还可以注意到,使用 -o
选项运行 curl
会显示下载进度表,如下所示。
当您使用 cURL -O
时,它会将内容保存在本地计算机中名为“gettext.html”的文件本身中。
curl -O http://www.gnu.org/software/gettext/manual/gettext.html
注意:当curl
必须将数据写入终端时,它会禁用进度表以避免打印混乱。我们可以使用 >
、-o
、-O
选项将结果移动到文件中。
隐藏进度条
默认情况下,cURL 显示进度条。要隐藏它,可以使用-s
(--silent
)选项。
curl -s -O http://www.gnu.org/software/gettext/manual/gettext.html
如果由于某种原因,这在您的平台上不起作用,您可以随时将 stderr 重定向到 /dev/null
:
curl -O http://www.gnu.org/software/gettext/manual/gettext.html 2>/dev/null
一次获取多个文件
当然,我们可以通过在命令行上指定 URL 来一次下载多个文件。
curl -O https://www.gnu.org/software/gettext/manual/html_node/index.html -O https://www.gnu.org/software/gettext/manual/gettext.html
使用 -L 选项跟随 HTTP 位置标头
但是,默认情况下,cURL 不遵循 HTTP 位置标头(也称为重定向)。当请求的网页移动到另一个地方时,将发送一个 HTTP 位置标头作为响应,其中包含实际网页所在的位置。
我们可以使用 -L
选项坚持 cURL 遵循重定向,如下所示。
curl -L https://www.google.com
继续/恢复先前的下载
使用 cURL -C
选项,您可以继续由于某种原因而停止的下载。当您下载大文件并且下载被中断时,这将很有帮助。
如果我们说-C -
,那么cURL将找到从哪里开始恢复下载。我们还可以给出一个偏移量-C
。将从源文件的开头跳过给定的偏移字节。
使用 curl
开始大下载,并在下载之间按 Ctrl-C
停止下载。
curl -O https://www.gnu.org/software/gettext/manual/gettext.html
使用curl -C -
,我们可以从之前离开的地方继续下载。
curl -C - -O https://www.gnu.org/software/gettext/manual/gettext.html
使用带或不带身份验证的代理
如果您位于 proxy.yourdomain.com 上侦听端口 8080 的代理服务器后面,请执行以下操作:
curl -x proxy.yourdomain.com:8080 -U user:password -O https://www.gnu.org/software/gettext/manual/gettext.html
如果您的代理不需要身份验证,您可以跳过 -U user:password
。
查询 HTTP 标头
HTTP 标头允许远程 Web 服务器发送有关其自身和实际请求的附加信息。此外,这还为客户端提供了有关如何处理请求的详细信息。
要从网站查询 HTTP 标头,请执行以下操作:
curl -I https://www.gnu.org
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 21:22:32 GMT
Server: Apache/2.4.7
Content-Location: home.html
Vary: negotiate,accept-language,Accept-Encoding
TCN: choice
Strict-Transport-Security: max-age=63072000
Access-Control-Allow-Origin: (null)
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Mon, 13 Jul 2020 21:22:32 GMT
Content-Type: text/html
Content-Language: en
上传文件到FTP服务器
cURL还可以使用-T
选项将文件上传到FTP服务器。
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.server.com
结果,上述命令会将名为 myfile.txt
的文件上传到 FTP 服务器。您还可以使用范围操作同时上传多个文件。
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.server.com
我们可以选择使用 .
从 STDIN 获取输入并将其传输到远程。
curl -u ftpuser:ftppass -T - ftp://ftp.server.com/mynewfile.txt
上面的命令将从标准输入中获取用户的输入,并将内容以 mynewfile.txt
的名称保存在 ftp 服务器中。
您可以为每个 URL 提供一个 -T
,该对指定上传位置。
从 FTP 服务器下载文件
cURL 还可用于从 FTP 服务器下载文件。但是,如果给定的 FTP 路径是一个目录,cURL 将列出指定目录下的文件。
curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/mysql.php
上面的命令将从ftp服务器下载mysql.php
文件并将其保存在本地目录中。
curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
这里,给定的 URL 指的是一个目录。因此 cURL 将列出给定 URL 下的所有文件和目录。
使用范围列出/下载
cURL 支持在 URL 中指定范围。当给定范围时,将下载该范围内匹配的文件。从 FTP 镜像站点下载软件包会很有帮助。
curl http://ftp.us.debian.org/debian/pool/main/[a-z]/
上面的命令将列出终端中 a-z
范围内的所有包。
使用详细和跟踪选项的更多信息
您可以使用 -v
选项了解发生了什么。此选项启用详细模式,并且它将打印详细信息。
curl -v https://www.gnu.org
about 命令将输出以下内容:
* Trying 209.51.188.148:443...
* Connected to www.gnu.org (209.51.188.148) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: CN=emacs.org
* start date: Jun 17 09:07:40 2020 GMT
* expire date: Sep 15 09:07:40 2020 GMT
* subjectAltName: host "www.gnu.org" matched cert's "www.gnu.org"
* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
* SSL certificate verify ok.
> GET / HTTP/1.1
> Host: www.gnu.org
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 13 Jul 2020 21:56:04 GMT
< Server: Apache/2.4.7
< Content-Location: home.html
< Vary: negotiate,accept-language,Accept-Encoding
< TCN: choice
< Strict-Transport-Security: max-age=63072000
< Access-Control-Allow-Origin: (null)
< Accept-Ranges: bytes
< Cache-Control: max-age=0
< Expires: Mon, 13 Jul 2020 21:56:04 GMT
< Transfer-Encoding: chunked
< Content-Type: text/html
< Content-Language: en
<
...
使用 SMTP 协议发送邮件
cURL 还可用于使用 SMTP 协议发送邮件。如下所示,您应该指定发件人地址、收件人地址和邮件服务器 IP 地址。
curl --mail-from [email --mail-rcpt [email smtp://mailserver.com
一旦输入上述命令,它将等待用户提供数据到邮件。因此,当您撰写邮件后,请输入“.
”(句点)作为最后一行,这将立即发送电子邮件。
HTTP/2 支持检查
如果您有最新的 cURL 版本,则可以使用 --http2
选项来检查特定网址是否支持新的 HTTP/2 协议。因此,如果网站支持 HTTP/2,您将在标头中看到 HTTP/2.0 200
,而不是 HTTP/1.1 200
。
curl -I --http2 https://www.opensource.com
模拟 HTTP 方法
GET
方法用于从特定 URL 检索资源。例如,简单的 curl https://www.gnu.org/
命令将使用 GET
作为默认 HTTP 方法。但是,也可以使用 --request GET
或 -X GET
指定。
curl --request GET https://www.gnu.org
POST
方法将信息发布到网络服务器(例如,论坛上的评论)。这可以使用--request POST
或-X POST
来指定。
curl --request POST https://yourwebsite.com
DELETE 方法从 Web 服务器中删除与特定 URL 关联的资源。这可以使用--request DELETE
或-X DELETE
指定。
curl --request DELETE https://yourwebsite.com
PUT
方法根据客户端提交给网络服务器的数据创建或替换资源。 (例如,创建新网页或更新现有网页)。这可以使用--request PUT
或-X PUT
来指定。
curl --request PUT https://yourwebsite.com
发出带参数的 POST 请求
以下命令会将 animal1
和 animal2
参数及其相应的值发送至 https://yourdomain.com/animals.php
curl --request POST --data "animal1=cat&animal2=dog" https://yourdomain.com/animals.php
您可以使用此技巧来模拟常规 HTML 表单的行为。
结论
我们解释了 curl
命令是什么。本文中的示例很简单,但它们展示了最常用的 cURL 用例,旨在帮助您了解 curl
命令在 Linux 上的工作原理。
要了解有关 cURL 的更多信息,您可以访问该项目的网站。