curl
是一个功能强大的命令,可让您将数据传输到服务器或从服务器传输数据。
它支持多种协议,并且无需用户交互即可处理各种与网络相关的任务。
安装卷曲
curl
是一种广泛使用的工具,大多数 Linux 发行版都将其包含在其存储库中。根据您的操作系统,安装命令可能会有所不同。
基于 Debian/Ubuntu 的发行版
安装curl
在 Debian、Ubuntu 或任何其他基于 Debian 的系统上:
$ sudo apt update
$ sudo apt install curl
红帽/Fedora/CentOS
对于红帽及其衍生产品:
$ sudo yum install curl
如果您使用的系统dnf
:
$ sudo dnf install curl
支持的协议
With curl
,您可以使用多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP、LDAPS 等。
$ curl --version
Output:
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
您会注意到输出开头列出的已安装的curl版本支持的协议。
了解您的协议非常重要curl
安装支持,特别是当您处理许多服务器和服务时。
URL 通配符
URL 通配curl
允许您通过在大括号中指定 URL 的一部分来使用单个命令获取多个 URL{}
顺序。
在处理具有可预测 URL 结构的站点或服务器时,这可以节省时间并实现流程自动化。
获取连续的 URL
如果您知道 URL 是按数字顺序排列的,则可以使用 URL 通配符来获取所有 URL:
$ curl http://example.com/file[1-5].zip
该命令获取file1.zip
, file2.zip
, … 取决于file5.zip
.
根据特定模式获取
您可以在大括号内指定多个模式:
$ curl http://example.com/file_{A,B,C}.zip
这获取file_A.zip
, file_B.zip
, and file_C.zip
.
组合多种模式
URL 通配允许在单个 URL 中使用多个模式序列:
$ curl http://example.com/{year2022,year2023}/event_{A,B,C}.html
该命令将获取六个 URL:http://example.com/year2022/event_A.html
to http://example.com/year2023/event_C.html
.
负责任地使用 globbing 以避免无意的 DoS 攻击或受到速率限制。
使用变量的动态 URL
从8.3.0版本开始,curl
引入了对命令行变量的支持。这些变量可以使用设置--variable name=content
or --variable name@file
syntax.
后者允许您从文件设置变量的内容,如果文件设置为单个破折号 (-),则它从标准输入读取。
要扩展选项参数中这些变量的内容,可以使用{{name}}
语法,前提是选项名称前缀为--expand-
.
例如,如果您有一个名为“username”的变量,则可以在 URL 中使用它,如下所示:--expand-url "https://example.com/{{username}}/details"
.
基本变量扩展:
设置名为“username”的变量并在 URL 中使用它。
$ curl --variable username=JohnDoe --expand-url "https://example.com/profile/{{username}}"
使用环境变量:
Use the USER
URL 中的环境变量。
$ curl --variable %USER --expand-url "https://example.com/api/{{USER}}/details"
使用文件中的变量:
如果你有一个名为token.txt
包含身份验证令牌,您可以在 URL 中使用其内容。
$ curl --variable token@token.txt --expand-url "https://api.example.com/data?auth={{token}}"
使用多个变量:
将多个变量合并到一个 URL 中。
$ curl --variable user=JohnDoe --variable action=edit --expand-url "https://example.com/{{user}}/{{action}}"
通过利用变量,您可以使您的curl
命令更加动态,适应不同场景。
下载文件
使用以下命令下载文件curl
,您只需提供资源的 URL:
$ curl http://example.com/file.txt -o localfile.txt
使用此命令,您可以从“example.com”下载“file.txt”并将其保存为本地计算机上的“localfile.txt”。这-o
flag 允许您指定保存文件的名称。
始终确保使用-o
标志来定义本地文件名,确保您不会覆盖其他文件。
阅读更多关于如何使用curl命令下载文件.
上传文件
您可以使用 HTTP PUT 或 POST 方法将文件上传到服务器。
对于 PUT 方法:
$ curl -T localfile.txt http://example.com/upload/
在这里,您使用 HTTP PUT 方法将“localfile.txt”上传到指定的 URL。
对于 POST 方法:
$ curl -F "data=@localfile.txt" http://example.com/upload/
此命令使用 HTTP POST 方法上传“localfile.txt”。-F
将curl 信号发送为multipart/form-data 形式的POST 数据。
字符串“data=@localfile.txt”表示将文件的内容作为“data”参数的值发布。
上传时,请确保您拥有适当的权限并了解服务器期望的方法(PUT 或 POST)。
使用 POST 提交表单
提交表格是一项常见任务。和curl
,您可以轻松模拟表单提交。
$ curl -d "username=john&password=12345" http://example.com/login
此命令向“example.com/login”提交 POST 请求,提供的数据为“application/x-www-form-urlencoded”
The -d
旗帜告诉curl
在 POST 请求正文中发送数据。
确保正确编码传输数据,特别是当数据包含特殊字符时。
使用其他 HTTP 方法
curl
可以利用各种 HTTP 方法,而不仅仅是 GET 和 POST。
$ curl -X HEAD http://example.com
此命令使用 HEAD 方法从“example.com”获取标头。这-X
flag 指定 HTTP 方法。
对于删除方法:
$ curl -X DELETE http://example.com/resource/1
此命令发送 DELETE 请求以删除“example.com”上的资源。
使用 cURL 进行身份验证
有时,资源受到保护并需要身份验证。
$ curl -u username:password http://example.com/protected
此命令使用提供的用户名和密码通过基本身份验证向“example.com/protected”发送请求。这-u
标志后跟凭据是允许此身份验证的。
使用此方法时请务必小心。以明文形式传输凭据可能存在安全风险,尤其是在未加密的连接上。
阅读更多关于使用 Linux curl 命令处理身份验证方法.
制作自定义标头和用户代理
您可能需要发送自定义标头或更改用户代理。
$ curl -H "X-Custom-Header: customvalue" -A "MyUserAgent/1.0" http://example.com
这将使用自定义标头和自定义用户代理向“example.com”发送请求。
The -H
标志设置自定义标头,并且-A
标志设置用户代理。
自定义标头对于需要特定信息的 API 或服务非常有用,而更改用户代理可以帮助模拟不同的设备或浏览器。
有时,当发送负载较大的 POST 请求时,curl
发送“期望:100-继续”标头。要显式控制此行为:
$ curl -H "Expect:" -d "large_data_payload" http://example.com/upload
通过将“Expect:”标头设置为空,您可以有效地禁用默认行为,从而允许立即传输数据而无需等待服务器确认。
当处理不能优雅地处理“Expect: 100-continue”的服务器时,这种操作可能至关重要。
处理压缩响应
许多服务器压缩其响应以节省带宽。curl
可以自动为您解压这些回复。
$ curl --compressed http://example.com/resource
通过使用--compressed
选项,如果服务器响应包含使用 gzip 或 deflate 编码的内容,curl
会自动解压。
此选项可确保您收到的数据立即可读和可用。
以下重定向
服务器可以将请求重定向到其他 URL。使curl
请遵循以下重定向:
$ curl -L http://example.com/redirect
使用-L
or --location
标志指示curl
遵循服务器发送的任何重定向。
使用此选项时请务必注意,因为盲目地遵循重定向可能会导致您到达意想不到的目的地。
使用 cookie 和会话
Cookie 对于维持会话或保留跨请求的某些首选项至关重要。
$ curl -c cookies.txt -b cookies.txt http://example.com/login
Here, -c cookies.txt
tells curl
将 cookie 保存到文件“cookies.txt”。这-b cookies.txt
指示curl
从同一文件中读取和发送 cookie 以用于后续请求。
正确管理 cookie 可确保与需要会话持久性的站点进行无缝交互。
阅读更多内容使用 Linux curl 命令管理 cookie.
cURL 和 API
API 通常需要特定的标头、方法或数据格式。curl
是与他们互动的宝贵工具。
$ curl -H "Authorization: Bearer YOUR_API_TOKEN" -H "Content-Type: application/json" -d '{"key":"value"}' http://api.example.com/data
这会向 API 端点发送一个 POST 请求,其中包含授权标头和 JSON 负载。
多重-H
标志允许设置所需的标头。
使用 API 时,请确保使用 API 所需的正确标头、方法和数据格式。
阅读更多关于使用 Curl 命令的 RESTful API 交互.
SSL/TLS 和证书验证
默认情况下,curl
验证服务器的 SSL 证书。
$ curl https://secured-example.com
如果服务器的证书有问题,curl
会产生错误。
但是,在某些情况下,例如测试或内部网络,您可能会遇到自签名证书。绕过验证:
$ curl -k https://internal-server
The -k
or --insecure
选项禁用 SSL 证书验证。请谨慎使用此选项,并且仅在受信任的环境中使用。
阅读更多关于使用curl命令的SSL/TLS.
在代理后面使用curl
如果您在代理后面操作,curl
可以配置使用它:
$ curl -x http://proxyserver:port https://example.com
The -x
标志后跟代理详细信息通知curl
通过指定的代理路由其请求。
设置自定义 DNS 服务器
如果您想要的话curl
使用特定的解析主机名DNS服务器:
$ curl --resolve example.com:80:1.2.3.4 http://example.com
Here, curl
将在端口 80 上使用“example.com”的 IP 地址“1.2.3.4”。这对于测试或绕过 DNS 相关问题很有用。
确保您信任指定的 DNS 服务器,以防止潜在的重定向攻击。
为多个请求重用连接
当多次访问同一服务器时,您可以重用连接:
$ curl -H "Connection: keep-alive" http://example.com/page1 -o page1.html
$ curl -H "Connection: keep-alive" http://example.com/page2 -o page2.html
“Connection: keep-alive”标头发出信号,使 TCP 连接保持开放状态以供将来的请求,从而减少开销。
保持活动状态对于与同一服务器重复交互的脚本或自动化任务特别有用。
限制下载/上传速度
限制使用的带宽curl
:
$ curl --limit-rate 100K -O http://example.com/largefile.zip
这将下载速率限制为每秒 100 KB。这--limit-rate
选项后跟速度(如 100K 或 500K)设置限制。
当需要网络带宽时,限制速度可能很有用。
使用curl进行FTP传输
curl
支持FTP并允许您上传和下载文件。
$ curl -u ftpuser:ftppass -O ftp://ftp.example.com/file.zip
此命令从以下位置下载“file.zip”FTP服务器使用提供的凭据。
用于上传:
$ curl -u ftpuser:ftppass -T localfile.zip ftp://ftp.example.com/
这会将“localfile.zip”上传到 FTP 服务器。
查看服务器返回的标头:
$ curl -I http://example.com
The -I
选项仅获取标头。检查元数据、cookie 或其他标头相关信息很有用。
此方法可帮助您了解服务器响应,而无需获取整个内容。
IPv6 和卷曲
curl
全面支持IPv6。通过 IPv6 发出请求:
$ curl http://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]/
括号用于封装 URL 中的 IPv6 地址。
发出此类请求时,请确保您的网络基础设施支持 IPv6。
使用curl流式传输数据
curl
可以流式传输数据,对于查看日志或持续的数据源很有用:
$ curl -N http://example.com/streaming-data
The -N
flag 关闭缓冲,允许数据直接流式传输到您的控制台。
进行流式传输时,请始终监控接收到的数据量,以确保它不会淹没您的系统或网络。
使用 .curlrc 作为默认设置
对于经常使用的选项,您可以在中设置默认值.curlrc
您的主目录中的文件:
示例 .curlrc 内容:
--compressed
--user-agent "MyUserAgent/1.0"
有了这个文件,curl
将始终使用--compressed
选项并默认设置指定的 User-Agent。
定制.curlrc
可以节省时间并保证重复操作的一致性。
电信危机中 Curl 的魔力
我接到一家顶级电信运营商发来的求救电话。
他们的系统遇到了重大问题:大部分预付费客户无法为他们的账户充值,导致广泛的不满。
问题?他们用来与支付网关通信的应用程序出现故障,他们需要一种快速的方法来验证问题是来自他们的一端还是网关的一端。
该公司当前的工具链需要登录系统、运行多个脚本、等待批处理、然后获取日志的复杂过程。
仅提取一名用户的数据大约需要 20 分钟。鉴于他们想要验证 500 个用户的数据作为样本,我们考虑了大约 166 小时的连续工作。在这种情况下这是一项不切实际的任务。
熟悉公司的API后,我建议使用curl命令绕过有问题的应用程序,直接与支付网关通信。
通过在 bash 中编写循环脚本并使用curl,我可以以编程方式发送 HTTP 请求并立即获得响应反馈。
这是我所做的简化版本:
#!/bin/bash
for user in $(cat user_list.txt); do
curl -X POST https://gateway.example.com/topup -d "userid=$user&amount=50" >> results.txt
done
实施curl解决方案后:
每个用户的整个过程大约需要 30 秒,比最初的 20 分钟有了显着的改进。 4 小时内,我们获得了所有 500 位用户的结果。时间缩短了 97.6%!
分析results.txt
显示网关正确响应了我们的请求,表明问题确实存在于公司的应用程序中。
资源
https://curl.se/docs/manpage.html