网站搜索

什么是 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 请求

以下命令会将 animal1animal2 参数及其相应的值发送至 https://yourdomain.com/animals.php

curl --request POST --data "animal1=cat&animal2=dog" https://yourdomain.com/animals.php

您可以使用此技巧来模拟常规 HTML 表单的行为。

结论

我们解释了 curl 命令是什么。本文中的示例很简单,但它们展示了最常用的 cURL 用例,旨在帮助您了解 curl 命令在 Linux 上的工作原理。

要了解有关 cURL 的更多信息,您可以访问该项目的网站。

相关文章: