描述
curl 是一种使用 URL 从服务器传输数据或向服务器传输数据的工具。它支持以下协议:DICT、FILE、FTP、FTPS、GOPHER、GOPHERS、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET、TFTP、WS 和 WSS。
curl参数
- -o/--output:指定输出文件的名称,用于下载文件时保存到指定位置。
- -O/--remote-name:根据URL中的文件名部分来保存文件,这在下载时特别有用。
- -T/--upload-file:上传文件时使用,指定要上传的本地文件。
- -e/--referer:设置HTTP Referer头部,用于伪造来源页面或进行盗链。
- -A/--user-agent:设置User-Agent字符串,模仿浏览器或其他客户端。
- -X/--request:指定HTTP请求方法,如GET、POST等。
- -d/--data:发送HTTP POST请求时,附带的数据。
- -b/--cookie:设置Cookie字符串,用于处理会话。
- -s/--silent:静默模式,不显示进度和错误信息。
- -S/--show-error:显示错误信息,即使使用了-s选项。
- -L/--location:跟随重定向,如果请求的页面被移动了,这个选项会让curl重新定向到新的地址。
- -i/--include:在输出中包含HTTP响应头。
- -v/--verbose:详细模式,显示所有通信过程。
- -H/--header:自定义HTTP头部信息。
- --trace:跟踪请求的所有步骤,用于调试。
- --limit-rate:限制数据传输速率。
- --connect-timeout:设置连接超时时间。
RESTful风格
传参方式
-
URL路径参数:在URL中指定路径参数,例如:
curl http://example.com/resource/123
-
paramter传参:使用
-G
参数发送GET请求,并使用-d
或--data
参数传递参数,例如:curl -G -d "param1=value1¶m2=value2" http://example.com/resource
-
请求体(body)中发送数据:使用
-d
或--data
参数发送POST请求,并在请求体中传递数据,例如:curl -X POST -d "param1=value1¶m2=value2" http://example.com/resource
-
请求头传参:使用
-H
参数设置HTTP头部信息,例如:curl -H "Content-Type: application/json" -H "Authorization: Bearer token" http://example.com/resource
-
Basic传参:
curl -X POST -u "admin:admin" -H "Content-Type: application/json" -d '{"username":"admin","password":"admin"}' http://127.0.0.1:8099/test/v1/login
或者
Authorization: Basic 为固定格式 ,dGVzdDp0ZXN0为test:test的base64编码,test:test代表用户名密码
curl -X GET -H "Authorization: Basic dGVzdDp0ZXN0" -H "client:aa" http://ip:端口/test
JWT传参
curl -X POST -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' https://example.com/api
- Apikey 传参
curl -X POST -H "Authorization: Bearer my_api_key" -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' https://example.com/api
- AKSK传参
要使用curl传入AK/SK参数,可以使用以下格式:
curl -X [请求方法] -H "Authorization: AWS4-HMAC-SHA256 Credential=[AccessKeyId]/[Date]/[Region]/[ServiceName]/aws4_request, SignedHeaders=[SignedHeaders], Signature=[Signature]" -H "Content-Type: application/json" -d '[参数数据]' [URL]
其中,[请求方法]可以是GET、POST等HTTP请求方法;[AccessKeyId]是AWS访问密钥ID;[Date]是请求的日期和时间;[Region]是AWS区域;[ServiceName]是AWS服务名称;[SignedHeaders]是签名头部列表;[Signature]是签名值;[参数数据]是传递给服务器的参数,通常以JSON格式表示;[URL]是请求的目标网址。
例如,要向https://example.com/api发送一个POST请求,并使用AK/SK认证和传递JSON格式的参数,可以使用以下命令:
curl -X POST -H "Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130810/us-east-1/servicename/aws4_request, SignedHeaders=host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7" -H "Content-Type: application/json" -d '{"key1": "value1", "key2": "value2"}' https://example.com/api
请求方式
GET
curl -X GET http://example.com/resource
POST
curl -X POST -d "data=value" http://example.com/resource
JSON格式
curl -X POST -H "Content-Type: application/json" -d '{"email":"web@myfreax.com","website":"myfreax.com"}' http://127.0.0.1:3000/site
请求头多个参数
curl -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_ACCESS_TOKEN" http://example.com/resource
PUT
curl -X PUT -T /path/to/file http://example.com/resourc
DELETE
curl -X DELETE http://example.com/resource
简单易用
从 Web 服务器获取主页:
curl https://www.example.com/
从 FTP 服务器获取 README 文件:
curl ftp://ftp.example.com/README
使用端口 8000 从服务器获取网页:
curl http://www.example.com:8000/
获取 FTP 站点的目录列表:
curl ftp://ftp.example.com/
从字典中获取所有匹配的术语 curl:
curl dict://dict.example.com/m:curl
从字典中获取 curl 的定义:
curl dict://dict.example.com/d:curl
一次获取两个文档:
curl ftp://ftp.example.com/ http://www.example.com:8000/
从FTPS服务器获取文件:
curl ftps://files.are.example.com/secrets.txt
或使用更合适的FTPS方式获取相同的文件:
curl --ftp-ssl ftp://files.are.example.com/secrets.txt
使用 SFTP 从 SSH 服务器获取文件:
curl -u username sftp://example.com/etc/issue
使用 SCP 从 SSH 服务器获取文件,使用私钥(不受密码保护)进行身份验证:
curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt
使用 SCP 从 SSH 服务器获取文件,使用私钥(受密码保护)进行身份验证:
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password
scp://example.com/~/file.txt
从 IPv6 Web 服务器获取主页:
curl "http://[2001:1890:1112:1::20]/"
从 SMB 服务器获取文件:
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
下载到文件
获取网页并存储在具有特定名称的本地文件中:
curl -o thatpage.html http://www.example.com/
获取网页并存储在本地文件中,使本地文件获取远程文档的名称(如果 URL 中未指定文件名部分,则此操作失败):
curl -O http://www.example.com/index.html
获取两个文件并使用其远程名称存储它们:
curl -O www.haxx.se/index.html -O curl.se/download.html
使用密码
FTP系统
要使用名称和密码的 ftp 文件,请将它们包含在 URL 中,例如:
curl ftp://name:passwd@ftp.server.example:port/full/path/to/file
或使用如下标志指定它们-u
curl -u name:passwd ftp://ftp.server.example:port/full/path/to/file
FTPS的
它就像FTP一样,但您可能还希望为证书等指定和使用特定于SSL的选项。
请注意,使用 as 前缀是标准中描述的隐式方式,而推荐的显式方式是通过 using 和 option 完成的。FTPS://
FTP://
--ssl-reqd
SFTP / SCP系列
这类似于 FTP,但您可以使用该选项来指定要使用的私钥而不是密码。请注意,私钥本身可能受到与远程系统登录密码无关的密码的保护;此密码是使用 Option 指定的。通常,curl 会自动从私钥文件中提取公钥,但在 curl 没有适当的库支持的情况下,必须使用该选项指定匹配的公钥文件。--key
--pass
--pubkey
HTTP的
Curl 还支持 HTTP URL 中的用户和密码,因此您可以选择如下文件:
curl http://name:passwd@http.server.example/full/path/to/file
或分别指定用户和密码,如
curl -u name:passwd http://http.server.example/full/path/to/file
HTTP 提供了许多不同的身份验证方法,curl 支持多种身份验证方法:Basic、Digest、NTLM 和 Negotiate (SPNEGO)。在不告诉使用哪种方法的情况下,curl 默认为 Basic。您还可以要求 curl 从服务器为给定 URL 接受的 URL 中挑选最安全的 URL,方法是使用 .--anyauth
注意!根据 URL 规范,HTTP URL 不能包含用户和密码,因此在通过代理使用 curl 时,即使 curl 在其他时候允许它,该样式也不起作用。使用代理时,必须使用用户和密码的样式。-u
HTTPS的
可能最常与私有证书一起使用,如下所述。
代理
curl 支持 HTTP 和 SOCKS 代理服务器,并提供可选身份验证。它没有对FTP代理服务器的特殊支持,因为没有这些标准,但它仍然可以与其中许多服务器一起使用。您还可以使用 HTTP 和 SOCKS 代理将文件传输到 FTP 服务器或从 FTP 服务器传输文件。
使用使用端口 888 的名为 my-proxy 的 HTTP 代理获取 ftp 文件:
curl -x my-proxy:888 ftp://ftp.example.com/README
使用与上述相同的代理从需要用户和密码的 HTTP 服务器获取文件:
curl -u user:passwd -x my-proxy:888 http://www.example.com/
某些代理需要特殊身份验证。使用 -U 指定,如上所述:
curl -U user:passwd -x my-proxy:888 http://www.example.com/
不使用代理的主机和域的逗号分隔列表可以指定为:
curl --noproxy example.com -x my-proxy:888 http://www.example.com/
如果代理指定为 instead of or ,则 curl 使用 HTTP/1.0 而不是 HTTP/1.1 进行任何尝试。--proxy1.0
--proxy
-x
CONNECT
curl 还支持带有 和 的 SOCKS4 和 SOCKS5 代理。--socks4
--socks5
另请参阅 Curl 支持的环境变量,这些变量提供了进一步的代理控制。
大多数 FTP 代理服务器都设置为从客户端的角度显示为普通 FTP 服务器,并使用特殊命令来选择远程 FTP 服务器。curl 支持 和 选项,可用于通过许多 FTP 代理设置传输。例如,可以使用Blue Coat FTP代理将文件上传到远程FTP服务器,并带有以下选项:-u
-Q
--ftp-account
curl -u "username@ftp.server.example Proxy-Username:Remote-Pass"
--ftp-account Proxy-Password --upload-file local-file
ftp://my-ftp.proxy.example:21/remote/upload/path/
请参阅 FTP 代理的手册,以确定它希望设置传输的形式,以及 curl 的选项,以准确查看 curl 发送的内容。-v
管道
获取密钥文件并添加它(在用于包管理的系统上时):apt-key
apt
curl -L https://apt.example.org/llvm-snapshot.gpg.key | sudo apt-key add -
“|”通过管道将输出传递到 STDIN。 告知应从 STDIN 读取密钥文件。-
apt-key
范围
HTTP 1.1 引入了字节范围。使用此功能,客户端可以请求仅获取指定文档的一个或多个子部分。Curl 用标志支持这一点。-r
获取文档的前 100 个字节:
curl -r 0-99 http://www.example.com/
获取文档的最后 500 个字节:
curl -r -500 http://www.example.com/
Curl 还支持 FTP 文件的简单范围。然后,您只能指定开始和停止位置。
使用 FTP 获取文档的前 100 个字节:
curl -r 0-99 ftp://www.example.com/README
上传
FTP / FTPS / SFTP / SCP
将 stdin 上的所有数据上传到指定的服务器:
curl -T - ftp://ftp.example.com/myfile
从指定文件上传数据,使用用户和密码登录:
curl -T uploadfile -u user:passwd ftp://ftp.example.com/myfile
将本地文件上传到远程站点,并在远程站点上使用本地文件名:
curl -T uploadfile -u user:passwd ftp://ftp.example.com/
上传本地文件以附加到远程文件:
curl -T localfile -a ftp://ftp.example.com/remotefile
Curl 还支持通过代理进行 ftp 上传,但前提是代理配置为允许这种隧道。如果是这样,您可以以类似于以下方式运行 curl:
curl --proxytunnel -x proxy:port -T localfile ftp.example.com
中小型企业/中小型企业
curl -T file.txt -u "domain\username:passwd"
smb://server.example.com/share/
HTTP的
将 stdin 上的所有数据上传到指定的 HTTP 站点:
curl -T - http://www.example.com/myfile
请注意,必须先将 HTTP 服务器配置为接受 PUT,然后才能成功执行此操作。
有关执行 HTTP 数据上传的其他方法,请参阅下面的 POST 部分。
详细/调试
如果 curl 在不应该出现的地方失败,如果服务器不让你进入,如果你无法理解响应:使用标志来获取详细内容。Curl 输出大量信息以及它发送和接收的内容,以便让用户看到所有客户端与服务器的交互(但它不会显示实际数据)。-v
curl -v ftp://ftp.example.com/
要获取有关 curl 功能的更多详细信息和信息,请尝试使用具有给定文件名的 or 选项进行登录,如下所示:--trace
--trace-ascii
curl --trace trace.txt www.haxx.se
详细信息
不同的协议提供了获取有关特定文件/文档的详细信息的不同方法。要让 curl 显示有关单个文件的详细信息,您应该使用 / 选项。它显示 HTTP 和 FTP 单个文件上的所有可用信息。HTTP信息要广泛得多。-I
--head
对于 HTTP,您可以使用 / 获取数据之前显示的标头信息(与显示的信息相同)。Curl 在从 FTP 和 HTTP 获取文件时理解 / 选项,然后将标头存储在指定的文件中。-I
-i
--include
-D
--dump-header
将 HTTP 标头存储在单独的文件中(headers.txt示例中):
curl --dump-header headers.txt curl.se
请注意,如果您希望 curl 使用服务器发送的 cookie,则存储在单独文件中的标头在以后可能很有用。有关此内容的更多信息,请参阅 cookie 部分。
开机自检 (HTTP)
使用 curl 发布数据很容易。这是使用选项完成的。帖子数据必须经过紧急编码。-d <data>
发布一个简单的留言簿。name
phone
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.example.com/guest.cgi
或者自动对数据进行 URL 编码。
curl --data-urlencode "name=Rafael Sagula&phone=3320780" http://www.example.com/guest.cgi
如何使用 curl 发布表单,课程 #1:
挖出要填写的表单中的所有标签。<input>
如果有正常的帖子,您习惯于发帖。 采用完整的帖子字符串,其格式为-d
-d
<variable1>=<data1>&<variable2>=<data2>&...
变量名称是在标记中设置的名称,数据是要为输入填写的内容。数据必须正确进行 URL 编码。这意味着你用 + 替换空格,并且你用奇怪的字母替换奇怪的字母,其中字母的 ASCII 代码的十六进制表示形式。"name="
<input>
%XX
XX
例:
(说如果有以下 HTML)http://example.com
<span style="color:#000000"><span style="background-color:#ffffff"><span style="background-color:#093754"><span style="color:#ffffff"><code><form action="post.cgi" method="post">
<input name=user size=10>
<input name=pass type=password size=10>
<input name=id type=hidden value="blablabla">
<input name=ding value="submit">
</form></code></span></span></span></span>
我们想输入带有密码的用户。foobar
12345
要发布到此内容,您需要输入一个 curl 命令行,例如:
curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" http://example.com/post.cgi
虽然使用 application/x-www-form-urlencoded mime 类型(通常由 CGI 和类似机构理解),但 curl 还支持功能更强大的 multipart/form-data 类型。后一种类型支持文件上传等功能。-d
-F
接受 .如果要从文件中读取内容,请用作内容。指定文件时,还可以通过追加到文件名来指定文件内容类型。您还可以在一个字段中发布多个文件的内容。例如,字段名称用于发送三个文件,这些文件具有不同的内容类型,使用以下语法:-F "name=contents"
@filename
;type=<mime type>
coolfiles
curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html"
http://www.example.com/postit.cgi
如果未指定 content-type,curl 会尝试从文件扩展名中猜测(它只知道几个),或者使用以前指定的类型(如果在列表中指定了多个文件,则从较早的文件中猜测),或者使用默认类型。application/octet-stream
使用 模拟填写表单。假设您在表单中填写了三个字段。一个字段是要发布的文件名,一个字段是您的姓名,一个字段是文件描述。我们想发布我们编写的名为 .要让 curl 而不是您最喜欢的浏览器发布此数据,您必须阅读表单页面的 HTML 源代码并找到输入字段的名称。在我们的示例中,输入字段名称为 和 。-F
cooltext.txt
file
yourname
filedescription
curl -F "file=@cooltext.txt" -F "yourname=Daniel"
-F "filedescription=Cool text file with cool text inside"
http://www.example.com/postit.cgi
要在一个帖子中发送两个文件,您可以通过两种方式进行:
使用单个字段名称在单个字段中发送多个文件:
curl -F "pictures=@dog.gif,cat.gif" $URL
发送两个具有两个字段名称的字段
curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL
要从字面上发送字段值而不解释前导 或 ,或嵌入式 ,请使用 代替 。当从用户或其他不可预测的来源获取值时,建议这样做。在这些情况下,使用 instead of 可能会允许用户欺骗 curl 上传文件。@
<
;type=
--form-string
-F
-F
--form-string
引荐
HTTP 请求可以选择包含有关哪个地址将其引用到实际页面的信息。curl 允许您指定要在命令行上使用的反向链接。愚弄或欺骗愚蠢的服务器或 CGI 脚本特别有用,这些服务器或 CGI 脚本依赖于该信息可用或包含某些数据。
curl -e www.example.org http://www.example.com/
用户代理
HTTP 请求可以选择包含有关生成请求的浏览器的信息。Curl 允许在命令行上指定它。愚弄或欺骗愚蠢的服务器或只接受某些浏览器的 CGI 脚本特别有用。
例:
curl -A 'Mozilla/3.0 (Win95; I)' http://www.bank.example.com/
Other common strings:
Mozilla/3.0 (Win95; I)
- Netscape Version 3 for Windows 95Mozilla/3.04 (Win95; U)
- Netscape Version 3 for Windows 95Mozilla/2.02 (OS/2; U)
- Netscape Version 2 for OS/2Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)
- Netscape for AIXMozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)
- Netscape for Linux
Note that Internet Explorer tries hard to be compatible in every way:
Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)
- MSIE for W95
Mozilla is not the only possible User-Agent name:
Konqueror/1.0
- KDE File Manager desktop clientLynx/2.7.1 libwww-FM/2.14
- Lynx command line browser
饼干
Cookie通常由Web服务器用于将状态信息保存在客户端。服务器通过在标头中发送响应行来设置 cookie,该响应行类似于数据部分通常包含一组对(用分号分隔,如 )。服务器还可以指定 cookie 应该用于哪个路径(通过指定 )、cookie 何时过期 ()、用于哪个域 () 以及它是否应该只用于安全连接 ()。Set-Cookie: <data>
NAME=VALUE
;
NAME1=VALUE1; NAME2=VALUE2;
path=value
expire=DATE
domain=NAME
secure
如果您从服务器收到包含标题的页面,例如:
<span style="color:#000000"><span style="background-color:#ffffff"><span style="background-color:#093754"><span style="color:#ffffff"><code>Set-Cookie: sessionid=boo123; path="/foo";
</code></span></span></span></span>
这意味着当我们在以 开头的路径中获得任何内容时,服务器希望传递第一对。/foo
例如,获取一个希望在 cookie 中传递我的名字的页面:
curl -b "name=Daniel" www.example.com
Curl 还能够在后续会话中使用之前收到的 cookie。如果您从服务器获取 Cookie 并以类似于以下方式将其存储在文件中:
curl --dump-header headers www.example.com
...然后,您可以在第二个连接到该(或其他)站点时,使用文件中的 cookie,例如:headers.txt
curl -b headers.txt www.example.com
虽然将标头保存到文件是存储 cookie 的一种有效方法,但它容易出错,并且不是执行此操作的首选方法。相反,使用众所周知的 Netscape cookie 格式使 curl 保存传入的 cookie,如下所示:
curl -c cookies.txt www.example.com
请注意,通过指定,您可以启用 cookie 引擎,并且可以使 curl 遵循 a(通常与 cookie 结合使用)。如果网站发送 Cookie 和位置字段,您可以使用不存在的文件来触发 Cookie 感知,例如:-b
-L
location:
curl -L -b empty.txt www.example.com
要从中读取 cookie 的文件必须使用纯 HTTP 标头或作为 Netscape 的 cookie 文件进行格式化。Curl 根据文件内容确定它的类型。在上面的命令中,curl 解析标头并存储从 www.example.com 接收的 cookie。curl 将与请求匹配的存储 cookie 发送到服务器,因为它遵循该位置。该文件可能是不存在的文件。empty.txt
要从 Netscape Cookie 文件中读取和写入 Cookie,您可以同时设置并使用同一文件:-b
-c
curl -b cookies.txt -c cookies.txt www.example.com
进度表
进度计的存在是为了向用户显示某些事情确实正在发生。输出中的不同字段具有以下含义:
% Total % Received % Xferd Average Speed Time Curr.
Dload Upload Total Current Left Speed
0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287
从左到右:
%
- 整个转移完成的百分比Total
- 整个预期转移的总规模%
- 下载完成的百分比Received
- 当前下载的字节数%
- 上传完成的百分比Xferd
- 当前上传的字节数Average Speed Dload
- 下载的平均传输速度Average Speed Upload
- 上传的平均传输速度Time Total
- 完成手术的预期时间Time Current
- 自调用以来经过的时间Time Left
- 预计完成时间Curr.Speed
- 最后 5 秒的平均传输速度(当然,传输的前 5 秒是基于更短的时间。
该选项显示一个完全不同的进度条,不需要太多解释!-#
速度限制
Curl 允许用户设置传输速度条件,这些条件必须满足才能让传输继续进行。通过使用交换机,如果传输速度在指定时间内低于指定的最低限制,则可以进行 curl 中止传输。-y
-Y
要让 curl 在速度低于 3000 字节/秒 1 分钟时中止下载,请运行:
curl -Y 3000 -y 60 www.far-away.example.com
这可以与整体时间限制结合使用,因此上述操作必须在 30 分钟内全部完成:
curl -m 1800 -Y 3000 -y 60 www.far-away.example.com
强制 curl 传输数据的速度不超过给定速率也是可能的,如果您使用的是有限的带宽连接,并且不希望传输使用所有带宽连接(有时称为带宽限制),这可能很有用。
使 curl 传输数据速度不超过每秒 10 KB:
curl --limit-rate 10K www.far-away.example.com
或
curl --limit-rate 10240 www.far-away.example.com
或者防止 curl 上传数据的速度超过每秒 1 兆字节:
curl -T upload --limit-rate 1M ftp://uploads.example.com
使用该选项时,传输速率按秒调节,这会导致总传输速度低于给定数字。当然,如果您的转移在月经期间停滞不前,有时当然会大大降低。--limit-rate
配置文件
Curl 会在启动时自动尝试从用户的主目录中读取文件(或 Microsoft Windows 系统上的文件)。.curlrc
_curlrc
配置文件可以使用普通的命令行开关组成,但您也可以指定不带破折号的长选项,以使其更具可读性。您可以用空格分隔选项和参数,也可以用 或 分隔。可以在文件中使用注释。如果一行的第一个字母是 -symbol,则该行的其余部分将被视为注释。=
:
#
如果希望参数包含空格,则必须将整个参数括在双引号 () 中。在这些引号中,将引号指定为 。"
\"
注意:您必须在同一行上指定选项及其参数。
示例,在配置文件中设置默认超时和代理:
# We want a 30 minute timeout:
-m 1800
#. .. and we use a proxy for all accesses:
proxy = proxy.our.domain.com:8080
行尾的空格很重要,但每行第一个字符之前的所有空格都将被忽略。
通过使用 -q 作为第一个命令行参数来防止 curl 读取默认文件,例如:
curl -q www.example.org
强制 curl 获取并显示本地帮助页面,以防在没有 URL 的情况下调用它,方法是制作类似于以下内容的配置文件:
# default url to get
url = "http://help.with.curl.example.com/curlhelp.html"
您可以使用 / 标志指定要读取的另一个配置文件。如果将 config filename 设置为它,则会从 stdin 读取配置,如果您想隐藏选项在进程表等中不可见,这会很方便:-K
--config
-
echo "user = user:passwd" | curl -K - http://that.secret.example.com
额外的标头
在您自己的程序中使用 curl 时,您最终可能需要在获取网页时传递自己的自定义标头。您可以使用标志来执行此操作。-H
示例,在获取页面时将标头发送到服务器:X-you-and-me: yes
curl -H "X-you-and-me: yes" love.example.com
如果您希望 curl 在标题中发送与平时不同的文本,这也很有用。然后,您指定的标头将替换通常发送的标头 curl。如果将内部标头替换为空标头,则会阻止发送该标头。要防止使用标头,请执行以下操作:-H
Host:
curl -H "Host:" server.example.com
FTP 和路径名
请注意,在获取带有 URL 的文件时,给定的路径是相对于您输入的目录的。要从 ftp 站点的主目录中获取文件,请执行以下操作:ftp://
README
curl ftp://user:passwd@my.example.com/README
如果需要同一站点的根目录中的自述文件,则需要指定绝对文件名:
curl ftp://user:passwd@my.example.com//README
(即在文件名前面加一个斜杠。
SFTP 和 SCP 以及路径名
使用 sftp: 和 scp: URL,给定的路径名是服务器上的绝对名称。要访问相对于远程用户主目录的文件,请在文件前加上 的前缀,例如:/~/
curl -u $USER sftp://home.example.com/~/.bashrc
FTP 和防火墙
FTP 协议要求相关方之一在数据即将传输时立即打开第二个连接。有两种方法可以做到这一点。
curl 的默认方式是发出 PASV 命令,这会导致服务器打开另一个端口并等待客户端执行的另一个连接。如果客户端位于不允许传入连接的防火墙后面,这很好。
curl ftp.example.com
例如,如果服务器位于防火墙后面,该防火墙不允许在 21 以外的端口上进行连接(或者如果它不支持该命令),则另一种方法是使用该命令并指示服务器连接到给定 IP 号和端口上的客户端(作为 PORT 命令的参数)。PASV
PORT
curl 的标志支持几个不同的选项。您的机器可能有多个 IP 地址和/或网络接口,curl 允许您选择要使用的 IP 地址和/或网络接口。也可以使用默认地址:-P
curl -P - ftp.example.com
使用我们接口的 IP 地址下载但使用(这在 Windows 上不起作用):PORT
le0
curl -P le0 ftp.example.com
下载时,请使用 192.168.0.10 作为我们的 IP 地址以使用:PORT
curl -P 192.168.0.10 ftp.example.com
网络接口
使用接口的指定端口从服务器获取网页:
curl --interface eth0:1 http://www.example.com/
或
curl --interface 192.168.1.10 http://www.example.com/
HTTPS的
安全 HTTP 要求在构建 curl 时安装和使用 TLS 库。如果这样做,curl 就能够使用 HTTPS 协议检索和发布文档。
例:
curl https://secure.example.com
curl 还能够使用客户端证书从需要有效证书的站点获取/发布文件。唯一的缺点是证书需要采用 PEM 格式。PEM 是一种用于存储证书的标准开放格式,但最常用的浏览器不使用它。如果你想让 curl 使用你喜欢的浏览器使用的证书,你可能需要下载/编译一个转换器,可以将浏览器的格式化证书转换为 PEM 格式的证书。
有关如何使用带有个人密码的证书自动检索文档的示例:
curl -E /path/to/cert.pem:password https://secure.example.com/
如果忽略在命令行上指定密码,则在接收任何数据之前,系统会提示您输入正确的密码。
许多较旧的HTTPS服务器在特定的SSL或TLS版本上存在问题,而较新版本的OpenSSL等使用这些版本,因此有时指定TLS版本curl应该使用什么是有用的。
curl --tlv1.0 https://secure.example.com/
否则,curl 会尝试使用合理的 TLS 默认版本。
恢复文件传输
为了在之前中止的地方继续文件传输,curl 支持在 HTTP(S) 下载以及 FTP 上传和下载时恢复。
继续下载文档:
curl -C - -o file ftp://ftp.example.com/path/file
继续上传文档:
curl -C - -T file ftp://ftp.example.com/path/file
继续从 Web 服务器下载文档
curl -C - -o file http://www.example.com/
时间条件
HTTP 允许客户端为其请求的文档指定时间条件。它是 或 .curl 允许您使用 / 标志指定它们。If-Modified-Since
If-Unmodified-Since
-z
--time-cond
例如,您可以轻松地进行下载,仅当远程文件比本地副本新时才执行。它的制作方式如下:
curl -z local.html http://remote.example.com/remote.html
或者,仅当本地文件比远程文件新时,才能下载文件。为此,在日期字符串前面加上 ,如下所示:-
curl -z -local.html http://remote.example.com/remote.html
您可以指定纯文本日期作为条件。告诉 curl 仅下载自 2012 年 1 月 12 日以来更新的文件:
curl -z "Jan 12 2012" http://remote.example.com/remote.html
curl 接受多种日期格式。您总是通过在日期前面加上破折号 () 来检查日期。-
词典
为了好玩,试试
curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:gcide
are 和 的别名以及 are 和 的别名。例如m
match
find
d
define
lookup
curl dict://dict.org/find:curl
破坏 RFC(但不是 DICT 协议)的 URL 描述的命令是
curl dict://dict.org/show:db
curl dict://dict.org/show:strat
仍然缺少身份验证支持
LDAP的
如果您已经安装了 OpenLDAP 库,curl 可以利用它并提供支持。在 Windows 上,curl 默认使用平台 SDK 中的 WinLDAP。ldap://
curl 使用的默认协议版本是 LDAP 版本 3。版本 2 用作版本 3 无法连接时的回退机制。
LDAP是一件复杂的事情,编写LDAP查询并非易事。熟悉其他地方的确切语法描述。其中一个地方可能是:RFC 2255,LDAP URL 格式
举个例子,这是如何从电子邮件地址中具有特定子域的LDAP服务器获取所有人的方法:
curl -B "ldap://ldap.example.com/o=frontec??sub?mail=*sth.example.com"
您还可以在访问 LDAP 目录时使用身份验证:
curl -u user:passwd "ldap://ldap.example.com/o=frontec??sub?mail=*"
curl "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
默认情况下,如果提供了用户和密码,则 OpenLDAP/WinLDAP 使用基本身份验证。在 Windows 上,您可以通过在 curl 命令行中提供 或 选项之一来控制此行为--basic
--ntlm
--digest
curl --ntlm "ldap://user:passwd@ldap.example.com/o=frontec??sub?mail=*"
在 Windows 上,如果未指定用户/密码,那么自动协商机制将用于当前登录凭证 (SSPI/SPNEGO)。
环境变量
Curl 读取并理解以下环境变量:
http_proxy, HTTPS_PROXY, FTP_PROXY
应为特定于协议的代理设置它们。一般代理应设置为
ALL_PROXY
设置了不应通过任何代理的逗号分隔主机名列表(仅使用星号,匹配所有主机)*
NO_PROXY
如果主机名与其中一个字符串匹配,或者主机位于其中一个字符串的域中,则不会通过代理与该节点进行事务处理。使用域时,它需要以句点开头。用户可以通过设置为 来指定 www.example.com 和 foo.example.com 都不应使用代理。通过包含全名,您可以排除特定的主机名,因此要不使用代理,但仍要这样做,请设置为 。NO_PROXY
.example.com
www.example.com
foo.example.com
NO_PROXY
www.example.com
使用 / 标志会覆盖环境变量。-x
--proxy
网络rc
Unix很久以前就引入了这个概念。这是用户在文件中为经常访问的 FTP 站点指定名称和密码的一种方式,这样您就不必在每次访问这些站点时都键入它们。你意识到,如果别人掌握了你的密码,这是一个很大的安全风险,因此大多数Unix程序不会读取这个文件,除非它只有你自己可以读(curl不在乎)。.netrc
如果被告知,Curl 支持文件(使用 / 和 选项)。这不仅限于 FTP,因此 curl 可以将其用于使用身份验证的所有协议。.netrc
-n
--netrc
--netrc-optional
一个简单的文件可能如下所示:.netrc
machine curl.se login iamdaniel password mysecret
自定义输出
为了让脚本程序员更好地了解 curl 的进度,引入了 / 选项。使用它,您可以指定要从上一次传输中提取哪些信息。-w
--write-out
要显示下载的字节数以及一些文本和结束换行符,请执行以下操作:
curl -w 'We downloaded %{size_download} bytes\n' www.example.com
Kerberos FTP 传输
Curl 支持 kerberos4 和 kerberos5/GSSAPI 进行 FTP 传输。您需要在 curl 构建时安装并使用 kerberos 包才能使用它。
首先,以正常方式获取 krb-ticket,就像使用 / 工具一样。然后以类似于以下方式使用 curl:kinit
kauth
curl --krb private ftp://krb4site.example.com -u username:fakepwd
交换机上的密码没有用处,但空白的密码会使 curl 要求输入密码,并且您已经在 / 中输入了真实密码。-u
kinit
kauth
TELNET网络
curl telnet 支持是基本且易于使用的。Curl 将 stdin 上传递给它的所有数据传递到远程服务器。使用类似于以下内容的命令行连接到远程 telnet 服务器:
curl telnet://remote.example.com
输入要传递给 stdin 上的服务器的数据。结果将发送到 stdout 或您指定的文件。-o
您可能希望 / 选项关闭慢速连接或类似连接的缓冲输出。-N
--no-buffer
使用选项将选项传递给 telnet 协议协商。要告诉服务器我们使用 vt100 终端,请尝试以下操作:-t
curl -tTTYPE=vt100 telnet://remote.example.com
其他有趣的选项包括:-t
XDISPLOC=<X display>
设置 X 显示位置。NEW_ENV=<var,val>
设置环境变量。
注意:telnet 协议没有指定使用指定用户和密码登录的任何方式,因此 curl 无法自动执行此操作。为此,您需要跟踪何时收到登录提示并相应地发送用户名和密码。
持久连接
在单个命令行上指定多个文件,使 curl 按指定顺序一个接一个地传输所有文件。
libcurl 尝试使用持久连接进行传输,以便第二次传输到同一主机时可以使用已启动且在上一次传输中保持打开状态的相同连接。这大大减少了除第一次传输之外的所有传输的连接时间,并且可以更好地利用网络。
请注意,curl 不能将持久连接用于后续 curl 调用中使用的传输。如果它们使用同一主机,请尝试在同一命令行上填充尽可能多的 URL,因为这会使传输更快。如果使用 HTTP 代理进行文件传输,则几乎所有传输都是持久的。
使用单个命令行进行多次传输
如上所述,您只需添加更多 URL,即可使用一个命令行下载多个文件。如果您希望这些内容保存到本地文件,而不仅仅是打印到 stdout,则需要为指定的每个 URL 添加一个保存选项。请注意,这也适用于该选项(但不是)。-O
--remote-name-all
例如:获取两个文件并用于第一个文件,第二个文件使用自定义文件名:-O
curl -O http://example.com/file.txt ftp://example.com/moo.exe -o moo.jpg
您还可以以类似的方式上传多个文件:
curl -T local1 ftp://example.com/moo.exe -T local2 ftp://example.com/moo2.txt
IPv6的
当主机查找返回 IPv6 地址时,curl 连接到具有 IPv6 的服务器,如果连接失败,则回退到 IPv4。和 选项可以指定当两者都可用时要使用的地址。IPv6 地址也可以使用以下语法直接在 URL 中指定:--ipv4
--ipv6
http://[2001:1890:1112:1::20]/overview.html
使用此样式时,必须提供该选项以阻止 curl 将方括号解释为特殊的通配字符。也可以使用链接本地和站点本地地址(包括范围标识符,如 ),但范围部分必须是数字或与 Linux 上的现有网络接口匹配,并且百分比字符必须是 URL 转义。SFTP URL 中的上一个示例可能如下所示:-g
fe80::1234%1
sftp://[fe80::1234%251]/
在 URL 中提供的 IPv6 地址(例如,到 或选项)不应进行 URL 编码。--proxy
--interface
--ftp-port
邮件列表
为了方便起见,我们有几个开放的邮件列表来讨论 curl、它的发展以及与此相关的内容。在 curl - Mailing lists 获取所有信息。
请将卷曲问题、功能请求和故障报告直接发送到这些邮件列表之一,而不是邮寄给任何个人。
可用列表包括:
curl-users
命令行工具的用户。如何使用它,什么不起作用,新功能,相关工具,问题,新闻,安装,编译,运行,移植等。
curl-library
使用或开发 libcurl 的开发人员。错误、扩展、改进。
curl-announce
低流量。仅接收新公共版本的公告。在最坏的情况下,每月大约会收到一到两封邮件,但通常每两个月只有一封邮件。
curl-and-php
在 PHP 中使用 curl 函数。一切都以 PHP 角度卷曲。或具有卷曲角度的 PHP。
curl-and-python
Python 黑客使用带有或不带有 python 绑定 pycurl 的 curl。