curl是利用​​URL​​​语法在命令行方式下工作的开源文件传输工具。它被广泛应用在​​Unix​​​、多种​​Linux​​​发行版中,并且有​​DOS​​​和​​Win32​​、Win64下的移植版本。


中文名 curl 外文名 curl(CommandLine Uniform Resource Locator) 类    别 用URL语法 作    用 ​​文件传输​​ ​ 适用范围 计算机




目录



  1. 1 ​​设计方法​
  2. ▪ ​​获得页面​
  3. ▪ ​​获取表单​
  4. ▪ ​​使用PUT​
  5. ▪ ​​有关认证​

  6. ▪ ​​引用​
  7. ▪ ​​指定用户端​
  8. ▪ ​​COOKIES​
  9. ▪ ​​加密HTTP​
  10. ▪ ​​http认证​

  11. ▪ ​​注意事项​
  12. 2 ​​命令​
  13. 3 ​​相关函数​




设计方法

编辑



获得页面


使用命令:curl http://curl.haxx.se


这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了​​断点续传​​,可以使用-r参数来指定传输范围。




获取表单


在WEB页面设计中,form是很重要的元素。Form通常用来收集并向网站提交信息。提交信息的方法有两种,GET方法和POST方法。先讨论GET方法,例如在页面中有这样一段:




那么浏览器上会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,​​表单​​就用GET方法向服务器提交文本框的数据。


例如原始页面是在 www.hotmail.com/when/birth.html看到的,然后您在文本框中输入1905,然后按OK按钮,那么浏览器的URL现在应该是:“www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”


对于这种网页,curl可以直接处理,例如想获取上面的网页,只要输入:


curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"


就可以了。


​表单​​用来提交信息的第二种方法叫做POST方法,POST方法和GET方法的区别在于GET方法使用的时候,浏览器中会产生目标URL,而POST不会。类似GET,这里有一个网页:




浏览器上也会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,​​表单​​用POST方法向服务器提交数据。


这时的URL是看不到的,因此需要使用特殊的方法来抓取这个页面:


curl -d "birthyear=1905&press=OK"www.hotmail. com/when/junk.cgi


这个命令就可以做到。


1995年年末,RFC1867定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:




对于这种页面,curl的用法不同:


curl -F upload=@localfilename -F press=OKURL


这个命令的实质是将本地的文件用POST上传到服务器。


有关POST还有不少用法,用户可以自己摸索。




使用PUT


​HTTP协议​​文件上传的标准方法是使用PUT,此时curl命令使用-T参数:


curl -T uploadfile www.uploadhttp.com/receive.cgi




有关认证


curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):


curl -u name:password www.secrets. com


如果网络是通过http​​代理服务器​​出去的,而代理服务器需要用户名和密码,那么输入:


curl -U proxyuser:proxypassword http://curl.haxx.se


任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。




引用


有些网络资源访问的时候必须经过另外一个网络地址跳转过去,这用术语来说是:referer,引用。


对于这种地址的资源,curl也可以下载:


curl -e http://curl.haxx. se daniel.haxx.se




指定用户端


有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。


此时curl可以把自己“伪装”成任何其他浏览器:


curl -A "Mozilla/4.0 (compatible; MSIE 5.01;Windows NT 5.0)" URL


这个指令表示curl伪装成了IE5.0,用户平台是Windows2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。


使用:


curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15i686)" URL


此时curl变成了Netscape,运行在PIII平台的Linux上了。




COOKIES


Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:


curl -b stored_cookies_in_file www.cookiesite.com


curl可以根据旧的cookie写出新cookie并发送到网站:


curl -b cookies.txt -c newcookies.txtwww.cookiesite. com




加密HTTP


如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:


curl https://that.secure.server. com




http认证


如果是采用证书认证的http地址,证书在本地,那么curl这样使用:


curl -E mycert.pem https://that.secure.server.com




注意事项


curl非常博大,用户要想使用好这个工具,除了详细学习参数之外,还需要深刻理解http的各种协议与URL的各个语法。


这里推荐几个读物:


RFC 2616 HTTP协议语法的定义。


RFC 2396 URL语法的定义。


RFC 2109 Cookie是怎样工作的。


RFC 1867 HTTP如何POST,以及POST的格式。




命令

编辑

linux curl命令


-a/--append 上传文件时,附加到目标文件


-A/--user-agent 设置用户代理发送给服务器


- anyauth 可以使用“任何”身份验证方法


-b/--cookie cookie字符串或文件读取位置


- basic 使用HTTP基本验证


-B/--use-ascii 使用ASCII /文本传输


-c/--cookie-jar 操作结束后把cookie写入到这个文件中


-C/--continue-at 断点续转


-d/--data HTTP POST方式传送数据


--data-ascii 以ascii的方式post数据


--data-binary 以二进制的方式post数据


--negotiate 使用HTTP身份验证


--digest 使用数字身份验证


--disable-eprt 禁止使用EPRT或LPRT


--disable-epsv 禁止使用EPSV


-D/--dump-header 把header信息写入到该文件中


--egd-file 为随机数据(SSL)设置EGD socket路径


--tcp-nodelay 使用TCP_NODELAY选项


-e/--referer 来源网址


-E/--cert 客户端证书文件和密码 (SSL)


--cert-type 证书文件类型 (DER/PEM/ENG) (SSL)


--key 私钥文件名 (SSL)


--key-type 私钥文件类型 (DER/PEM/ENG) (SSL)


--pass 私钥密码 (SSL)


--engine 加密引擎使用 (SSL). "--engine list" forlist


--cacert CA证书 (SSL)


--capath CA目录 (made using c_rehash) to verifypeer against (SSL)


--ciphers SSL密码


--compressed 要求返回是压缩的形势 (using deflate orgzip)


--connect-timeout 设置最大请求时间


--create-dirs 建立本地目录的目录层次结构


--crlf 上传是把LF转变成CRLF


-f/--fail 连接失败时不显示http错误


--ftp-create-dirs 如果远程目录不存在,创建远程目录


--ftp-method [multicwd/nocwd/singlecwd]控制CWD的使用


--ftp-pasv 使用 PASV/EPSV 代替端口


--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址


--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输


--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输


-F/--form 模拟http表单提交数据


-form-string 模拟http表单提交数据


-g/--globoff 禁用网址序列和范围使用{}和[]


-G/--get 以get的方式来发送数据


-h/--help 帮助


-H/--header 自定义头信息传递给服务器


--ignore-content-length 忽略的HTTP头信息的长度


-i/--include 输出时包括protocol头信息


-I/--head 只显示文档信息


从文件中读取-j/--junk-session-cookies忽略会话Cookie


- 界面指定网络接口/地址使用


- krb4 <级别>启用与指定的安全级别krb4


-j/--junk-session-cookies 读取文件进忽略sessioncookie


--interface 使用指定网络接口/地址


--krb4 使用指定安全级别的krb4


-k/--insecure 允许不使用证书到SSL站点


-K/--config 指定的配置文件读取


-l/--list-only 列出ftp目录下的文件名称


--limit-rate 设置传输速度


--local-port 强制使用本地端口号


-m/--max-time 设置最大传输时间


--max-redirs 设置最大读取的目录数


--max-filesize 设置最大下载的文件总量


-M/--manual 显示全手动


-n/--netrc 从netrc文件中读取用户名和密码


--netrc-optional 使用 .netrc 或者 URL来覆盖-n


--ntlm 使用 HTTP NTLM 身份验证


-N/--no-buffer 禁用缓冲输出


-o/--output 把输出写到该文件中


-O/--remote-name 把输出写到该文件中,保留远程文件的文件名


-p/--proxytunnel 使用HTTP代理


--proxy-anyauth 选择任一代理身份验证方法


--proxy-basic 在代理上使用基本身份验证


--proxy-digest 在代理上使用数字身份验证


--proxy-ntlm 在代理上使用ntlm身份验证


-P/--ftp-port 使用端口地址,而不是使用PASV


-Q/--quote 文件传输前,发送命令到服务器


-r/--range 检索来自HTTP/1.1或FTP服务器字节范围


--range-file 读取(SSL)的随机文件


-R/--remote-time 在本地生成文件时,保留远程文件时间


--retry 传输出现问题时,重试的次数


--retry-delay 传输出现问题时,设置重试间隔时间


--retry-max-time 传输出现问题时,设置最大重试时间


-s/--silent静音模式。不输出任何东西


-S/--show-error 显示错误


--socks4 用socks4代理给定主机和端口


--socks5 用socks5代理给定主机和端口


--stderr


-t/--telnet-option Telnet选项设置


--trace 对指定文件进行debug


--trace-ascii Like --跟踪但没有hex输出


--trace-time 跟踪/详细输出时,添加时间戳


-T/--upload-file 上传文件


--url Spet URL to work with


-u/--user 设置服务器的用户和密码


-U/--proxy-user 设置代理用户名和密码


-v/--verbose


-V/--version 显示版本信息


-w/--write-out [format]什么输出完成后


-x/--proxy 在给定的端口上使用HTTP代理


-X/--request 指定什么命令


-y/--speed-time 放弃限速所要的时间。默认为30


-Y/--speed-limit 停止传输速度的限制,速度时间'秒


-z/--time-cond 传送时间设置


-0/--http1.0 使用HTTP 1.0


-1/--tlsv1 使用TLSv1(SSL)


-2/--sslv2 使用SSLv2的(SSL)


-3/--sslv3 使用的SSLv3(SSL)


--3p-quote like -Q for the source URL for 3rdparty transfer


--3p-url 使用url,进行第三方传送


--3p-user 使用用户名和密码,进行第三方传送


-4/--ipv4 使用IP4


-6/--ipv6 使用IP6


-#/--progress-bar 用进度条显示当前的传送状态




相关函数

编辑

PHP cURL 函数


PHP[1]  支持的由DanielStenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。


libcurl支持​​http​​​、​​https​​​、​​ftp​​​、​​gopher​​​、​​telnet​​​、dict、​​file​​​和​​ldap​​协议。libcurl同时也支持HTTPS认证、HTTPPOST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。


PHP中使用cURL实现Get和Post请求的方法


这些函数在PHP 4.0.2中被引入。


以下包含了PHP cURL函数列表:


curl_close()

关闭一个cURL会话。

curl_copy_handle()

复制一个cURL句柄和它的所有选项。

curl_errno()

返回最后一次的错误号。

curl_error()

返回一个保护当前会话最近一次错误的字符串。

curl_escape()

返回转义字符串,对给定的字符串进行URL编码。

curl_exec()

执行一个cURL会话。

curl_file_create()

创建一个CURLFile对象。

curl_getinfo()

获取一个cURL连接资源句柄的信息。

curl_init()

初始化一个cURL会话。

curl_multi_add_handle()

向curl批处理会话中添加单独的curl句柄。

curl_multi_close()

关闭一组cURL句柄。

curl_multi_exec()

运行当前cURL句柄的子连接

curl_multi_getcontent()

如果设置了CURLOPT_RETURNTRANSFER,



则返回获取的输出的文本流。

curl_multi_info_read()

获取当前解析的cURL的相关传输信息。

curl_multi_init()

返回一个新cURL批处理句柄。

curl_multi_remove_handle()

移除curl批处理句柄资源中的某个句柄资源。

curl_multi_select()

等待所有cURL批处理中的活动连接。

curl_multi_setopt()

设置一个批处理cURL传输选项。

curl_multi_strerror()

返回描述错误码的字符串文本。

curl_pause()

暂停及恢复连接。

curl_reset()

重置libcurl的会话句柄的所有选项。

curl_setopt_array()

为cURL传输会话批量设置选项。

curl_setopt()

设置一个cURL传输选项。

curl_share_close()

关闭cURL共享句柄。

curl_share_init()

初始化cURL共享句柄。

curl_share_setopt()

设置一个共享句柄的cURL传输选项。

curl_strerror()

返回错误代码的字符串描述。

curl_()

解码URL编码后的字符串。

curl_version()

获取cURL版本信息。


下载管理程式




非学,无以致疑;非问,无以广识