curl

curl

PHP curl curl_setopt()函数选项合集

PHPllslx520 发表了文章 • 0 个评论 • 735 次浏览 • 2017-06-05 20:04 • 来自相关话题

组选项名称值类型描述网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。重

向CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。请

头CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')cook
iesCURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。CURLOPT_PROXYPORTstring指定代理服务器端口。CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。POST
/
PUTCURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。CURLOPT_POSTFIELDSarray
string【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))   CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。SSL
选项CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)SSH
选项CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。断点
续传CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。速率
限制CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)连接
选项CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。响应
选项CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。响

头CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。响应
BODYCURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。调试
选项CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    网络
选项CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3. 参考页面:php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php 查看全部
选项名称值类型描述
网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。
CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)
CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。
CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  
CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。
CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)
CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。


CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。
CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。
CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。
CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。
CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。


CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。
CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。
CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。
CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。
CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。
CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')
cook
ies
CURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。
CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。
CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。
CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。
代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。
CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。
CURLOPT_PROXYPORTstring指定代理服务器端口。
CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。
CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。
CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。
CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。
CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。
POST
/
PUT
CURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。
CURLOPT_POSTFIELDSarray
string
【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))
   
CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)
CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;
CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;
CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;
CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。
认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。
CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。
CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。
CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。
CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。
CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。
CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。
CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。
证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;
CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;
CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)
CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。
CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。
CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 
密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。
CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)
CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。
CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。
CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。
CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。
CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。
CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。
SSL
选项
CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) 
CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)
CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 
CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。
CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)
SSH
选项
CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)
CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)
CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)
FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 
CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。
CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。
CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。
CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。
CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。
CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。
CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。
CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 
CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。
CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) 
CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    
CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。
断点
续传
CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。
CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。
速率
限制
CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。
CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    
CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)
CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)
连接
选项
CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。
CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。
CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。
CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。
CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)
CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。
CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。
响应
选项
CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。
CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 
CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。


CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。
CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;
CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。
响应
BODY
CURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;
CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;
CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。
CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。
调试
选项
CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。
CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。
CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)
CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    
CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)
CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    
网络
选项
CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。
CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)
CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)
CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    
CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。
CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  
CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)
CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)
CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 
杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。
CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)
CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。
CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.
CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3.
 

参考页面:

php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php

PHP curl简单用法举例和相关函数介绍

PHPllslx520 发表了文章 • 0 个评论 • 617 次浏览 • 2017-06-04 22:24 • 来自相关话题

一、PHP curl抓取代码编写流程:使用PHP curl执行抓取请求分为下面基本四步:使用 curl_init() 函数创建一个curl句柄;使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;使用 curl_exec() 函数执行抓取请求;使用 curl_close() 函数关闭curl句柄,释放内存;  二、PHP curl最基本用法:  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);运行结果:96161 三、PHP curl GET请求和POST请求:1、php curl get请求:<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
) 
2、php curl post 提交数据:<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
) 四、PHP curl组件相关函数:  PHP curl组件相关函数功能介绍: 函数名函数介绍基


数curl_init【常用】初始化一个curl会话,返回一个curl句柄;curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;curl_setopt_array【常用】使用数组的方式批量设置curl选项;curl_copy_handle克隆一个curl句柄和它的所有选项;curl_exec【常用】执行curl会话;curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;curl_errno返回curl会话最后一次的数字错误代码;curl_error返回curl会话最后一次的字符串错误描述;curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);curl_close【常用】关闭curl会话;curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);curl_version以数组的形式返回php curl版本信息;批

理curl_multi_init创建一个curl批处理句柄(并发请求);curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;curl_multi_setopt为curl批处理句柄设置选项;curl_multi_exec执行curl批处理句柄;curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;curl_multi_close关闭curl批处理句柄;curl_multi_select 等待所有curl批处理中的活动连接;curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);共


柄curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);curl_share_close关闭curl共享句柄(PHP 5.5以上版本);其
他curl_file_create创建一个curlfile对象(PHP 5.5以上版本); 五、参考资料:php官网关于curl组件介绍:http://php.net/curlphp curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.phpphp curl选项爱E族整理:https://aiezu.com/article/php_curl_curl_setopt_sets.html 查看全部

一、PHP curl抓取代码编写流程:

使用PHP curl执行抓取请求分为下面基本四步:
  1. 使用 curl_init() 函数创建一个curl句柄;
  2. 使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;
  3. 使用 curl_exec() 函数执行抓取请求;
  4. 使用 curl_close() 函数关闭curl句柄,释放内存;
  

二、PHP curl最基本用法:

  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。
<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);
运行结果:
96161
 

三、PHP curl GET请求和POST请求:

1、php curl get请求:

<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
)
 
2、php curl post 提交数据:
<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
)
 

四、PHP curl组件相关函数:

  PHP curl组件相关函数功能介绍:
 函数名函数介绍



curl_init【常用】初始化一个curl会话,返回一个curl句柄;
curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;
curl_setopt_array【常用】使用数组的方式批量设置curl选项;
curl_copy_handle克隆一个curl句柄和它的所有选项;
curl_exec【常用】执行curl会话;
curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);
curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);
curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;
curl_errno返回curl会话最后一次的数字错误代码;
curl_error返回curl会话最后一次的字符串错误描述;
curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);
curl_close【常用】关闭curl会话;
curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);
curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);
curl_version以数组的形式返回php curl版本信息;


curl_multi_init创建一个curl批处理句柄(并发请求);
curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;
curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;
curl_multi_setopt为curl批处理句柄设置选项;
curl_multi_exec执行curl批处理句柄;
curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;
curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;
curl_multi_close关闭curl批处理句柄;
curl_multi_select 等待所有curl批处理中的活动连接;
curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);



curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);
curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);
curl_share_close关闭curl共享句柄(PHP 5.5以上版本);

curl_file_create创建一个curlfile对象(PHP 5.5以上版本);
 

五、参考资料:

Linux curl命令使用代理、以及代理种类介绍

Linuxliuliangsong 发表了文章 • 0 个评论 • 6604 次浏览 • 2016-12-07 11:40 • 来自相关话题

  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  一、代理服务器分类:  我们比较常用、支持http(s)协议代理主要分为两大类:http代理和socks代理,见下表:大类小类子类描述http代理http代理
https代理透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议只支持TCP应用;SOCKS4A支持TCP应用;支持服务器端域名解析;SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6; 二、Linux curl命令代理设置参数:  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:参数用法-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;
 三、Linux curl命令设置代理举例:1、linux curl命令设置http代理:# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php 2、Linux curl命令设置socks代理:#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php 四、测试代理的隐匿度:1、测试前准备:  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  2、测试使用不同代理输出结果:  ①.  通过linux curl不使用代理访问:[root@aiezu.com ~]# curl http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.112.104.126
)  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理。

  ④. 通过linux curl命令使用http高匿名代理访问:[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.232.1.13
)  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理。
  
  ④. 通过linux curl命令使用socks5代理访问:[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 180.96.54.198
)  可以看出此SOCKS5代理也是高匿名代理。
  五、附录:Linux curl命令详解 查看全部
  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  

一、代理服务器分类:

  我们比较常用、支持http(s)协议代理主要分为两大类:http代理socks代理,见下表:
大类小类子类描述
http代理http代理
https代理
透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;
匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;
高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;
SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议
只支持TCP应用;
SOCKS4A支持TCP应用;支持服务器端域名解析;
SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6;
 

二、Linux curl命令代理设置参数:

  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:
参数用法
-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;

 

三、Linux curl命令设置代理举例:

1、linux curl命令设置http代理:

# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
 

2、Linux curl命令设置socks代理:

#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php
 

四、测试代理的隐匿度:

1、测试前准备:

  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:
<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);
  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  

2、测试使用不同代理输出结果:

  ①.  通过linux curl不使用代理访问:
[root@aiezu.com ~]# curl http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.112.104.126
)
  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:
[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php 
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)
  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:
[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php 
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)
  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理

  ④. 通过linux curl命令使用http高匿名代理访问:
[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.232.1.13
)
  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理
  
  ④. 通过linux curl命令使用socks5代理访问:
[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 180.96.54.198
)
  可以看出此SOCKS5代理也是高匿名代理。
  

五、附录:

Linux curl命令http cookie详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 1154 次浏览 • 2016-12-07 08:35 • 来自相关话题

  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 一、Linux curl命令Cookie的接收:1、cookie接收原理:  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:


  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 2、linux curl命令接收cookie(-c):  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98 二、Linux curl命令发送Cookie:1、cookie发送原理和从cookie文件中发送:  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:<?php print_r($_COOKIE);  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 3、linux curl命令使用"-H"参数发送cookie:  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 三、附录:Linux curl命令详解
  查看全部
  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 

一、Linux curl命令Cookie的接收:

1、cookie接收原理:

  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:
<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');
  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:
linux_curl_http_header_cookie.png
  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 

2、linux curl命令接收cookie(-c):

  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。
[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98
 

二、Linux curl命令发送Cookie:

1、cookie发送原理和从cookie文件中发送:

  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:
<?php print_r($_COOKIE);
  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:
[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact
  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 

2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:

  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:
[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

3、linux curl命令使用"-H"参数发送cookie:

  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:
[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

三、附录:


 

Linux curl命令get/post提交数据、json和上传文件全攻略

Linuxliuliangsong 发表了文章 • 0 个评论 • 7157 次浏览 • 2016-12-03 13:43 • 来自相关话题

  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。
 一、测试前准备:  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
} 二、GET请求方式:  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族

2、使用"-G"参数配合"-d"参数:[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php 
3、带特殊字符数据使用“--data-urlencode”:[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?

4、从文件中获取数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
) 三、POST基本类型请求方式(-d):  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded对、正是相当于html的如下表单:<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form> 
1、直接设置POST数据:[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?

2、从文件中获取POST数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
) 四、POST多类型表单数据请求方式(-F):  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722
相当于HTML的如下表单:<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form、-F):[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
2、使用"@"、"<"失去特殊意义的"--form-string":[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)
3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

) 五、POST上传文件(-F "@"字符的妙用):  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)


2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

) 六、POST提交JSON数据:  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)接收JSON的代码段:<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}  提示:除了Content-Type为multipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 七、附录:参考页面:Linux curl命令详解linux curl命令来路伪装(referer)和浏览器伪装(user-agent) 查看全部
  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。
 

一、测试前准备:

  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:
<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
 

二、GET请求方式:

  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:
[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 
2、使用"-G"参数配合"-d"参数:
[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:
curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php
 
3、带特殊字符数据使用“--data-urlencode”:
[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?
)
 
4、从文件中获取数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

三、POST基本类型请求方式(-d):

  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
对、正是相当于html的如下表单:
<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form>
 
1、直接设置POST数据:
[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?
)
 
2、从文件中获取POST数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

四、POST多类型表单数据请求方式(-F):

  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722

相当于HTML的如下表单:
<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form-F):
[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)

2、使用"@"、"<"失去特殊意义的"--form-string":
[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)

3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

)
 

五、POST上传文件(-F "@"字符的妙用):

  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:
[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)

)
 
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:
<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

)
 

六、POST提交JSON数据:

  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:
[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}'  http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
接收JSON的代码段:
<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
  提示:除了Content-Typemultipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 

七、附录:

参考页面:

linux curl命令来路伪装(referer)和浏览器伪装(user-agent)

Linuxliuliangsong 发表了文章 • 0 个评论 • 3070 次浏览 • 2016-12-02 11:05 • 来自相关话题

  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:<?php
print_r($_SERVER);测试返回:[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125

二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu 
2、“-H”参数的方式:# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
2、“-H”参数方式:# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
七、附录:
参考页面:Linux curl命令详解Linux curl命令get/post提交数据、json和文件全攻略 查看全部
  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:
[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/  
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact
  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:
<?php
print_r($_SERVER);
测试返回:
[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125
)
 
二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:
# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu
 
2、“-H”参数的方式:
# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com
 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:
# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36

2、“-H”参数方式:
# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

七、附录:
参考页面:

Linux curl命令详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 4941 次浏览 • 2016-11-23 17:57 • 来自相关话题

  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:curl [options] [URL...] 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。参数组参数描述urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt请

头-H "name: value"
--header "name: value"(HTTP)添加一个http header(http请求头);-H "name:"
--header "name:"(HTTP)移除一个http header(http请求头);-A "string"
--user-agent "string"
【参考】(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;-e <URL>
--referer <URL>
【参考】(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;响

头-I
--head(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)-i
--include(HTTP)输出HTTP头和返回内容;-D <file>
--dump-header <file>(HTTP)转储http响应头到指定文件;cookie-b name=data
--cookie name=data
【参考】(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;-c filename
--cookie-jar file name
【参考】(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;-j
--junk-session-cookies(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"-p
--proxytunnel将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlmhttp代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;数据
传输-G
--get
【参考】如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; -d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;-T file
--upload-file file通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com断点
续传-C <offset>
--continue-at <offset>断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;-r <range>
--range <range>(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;


认证--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;-u user:password
--user user:password使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;证书-E <证书[:密码]>
--cert <证书[:密码]>(SSL)指定“PEM”格式的证书文件和证书密码;--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;-k
--insecure(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。SSL
其他--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;私钥
公钥--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;--pass <phrase>(SSL/SSH)指定私钥文件的密码;--pubkey <key>(SSH)使用指定文件提供的您公钥;FTP-P
--ftp-port <接口>(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);--ftp-account [data](FTP)ftp帐号信息;--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;--ftp-create-dirs(FTP)上传时自动创建远程目录;-l
--list-only(FTP)列出ftp文件列表;-B
--use-ascii(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;-y
--speed-time <time>If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.-Y
--speed-limit <speed>If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.其他
选项-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com-X <command>
--request <command>(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;--keepalive-time <seconds>设置keepalive时间--no-keepalive关闭keepalive功能;--no-buffer禁用对输出流缓冲;--buffer启用输出流缓冲;-L
--location(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;--connect-timeout <seconds>指定最大连接超时,单位“秒”;-m seconds
--max-time seconds限制整个curl操作的最长时间,单位为秒;-s
--silent安静模式。不要显示进度表或错误消息;-#
--progress-bar显示进度条;错误
选项-f
--fail(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>失败重试次数;
重试间隔时间;
最大重试时间;-S
--show-error安静模式下显示错误信息;--stderr <file>错误信息保存文件;输出-o file
--output file将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; -O
--remote-name将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构-w
--write-out format操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;--trace-time转储文件中添加时间信息;-K
--config <config file>从配置文件中读取参数,参考:http://curl.haxx.se/docs/-v
--verbose显示更详细的信息,调试时使用;帮助-M
--manual显示完整的帮助手册;-h
--helplinux curl用法帮助; 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。退出码错误描述1Unsupported protocol. This build of curl has no support for this protocol.2Failed to initialize.3URL malformed. The syntax was not correct.5Couldn't resolve proxy. The given proxy host could not be resolved.6Couldn't resolve host. The given remote host was not resolved.7Failed to connect to host.8FTP weird server reply. The server sent data curl couldn't parse.9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.17FTP couldn't set binary. Couldn't change transfer method to binary.18Partial file. Only a part of the file was transferred.19FTP couldn't download/access the given file, the RETR (or similar) command failed.21FTP quote error. A quote command returned error from the server.22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.23Write error. Curl couldn't write data to a local filesystem or similar.25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.26Read error. Various reading problems.27Out of memory. A memory allocation request failed.28Operation timeout. The specified time-out period was reached according to the conditions.30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.33HTTP range error. The range "command" didn't work.34HTTP post error. Internal post-request generation error.35SSL connect error. The SSL handshaking failed.36FTP bad download resume. Couldn't continue an earlier aborted download.37FILE couldn't read file. Failed to open the file. Permissions?38LDAP cannot bind. LDAP bind operation failed.39LDAP search failed.41Function not found. A required LDAP function was not found.42Aborted by callback. An application told curl to abort the operation.43Internal error. A function was called with a bad parameter.45Interface error. A specified outgoing interface could not be used.47Too many redirects. When following redirects, curl hit the maximum amount.48Unknown TELNET option specified.49Malformed telnet option.51The peer's SSL certificate or SSH MD5 fingerprint was not ok.52The server didn't reply anything, which here is considered an error.53SSL crypto engine not found.54Cannot set SSL crypto engine as default.55Failed sending network data.56Failure in receiving network data.58Problem with the local certificate.59Couldn't use specified SSL cipher.60Peer certificate cannot be authenticated with known CA certificates.61Unrecognized transfer encoding.62Invalid LDAP URL.63Maximum file size exceeded.64Requested FTP SSL level failed.65Sending the data requires a rewind that failed.66Failed to initialize SSL Engine.67The user name, password, or similar was not accepted and curl failed to log in.68File not found on TFTP server.69Permission problem on TFTP server.70Out of disk space on TFTP server.71Illegal TFTP operation.72Unknown TFTP transfer ID.73File already exists (TFTP).74No such user (TFTP).75Character conversion failed.76Character conversion functions required.77Problem with reading the SSL CA cert (path? access rights?).78The resource referenced in the URL does not exist.79An unspecified error occurred during the SSH session.80Failed to shut down the SSL connection.82Could not load CRL file, missing or wrong format (added in 7.19.0).83Issuer check failed (added in 7.19.0).XXMore error codes will appear here in future releases. The existing ones are meant to never change.
四、用法演示:
1、下载页面:curl -o index.html http://aiezu.com 
2、下载文件并显示简单进度条:curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso 
3、断点续传:#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com
 5、伪造代理设备:#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令)
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com 
6、http头:# 看看本站的http头是怎么样的
curl -I http://aiezu.com输出:HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8 
6、设置http请求头:curl -H "Cache-Control:no-cache" http://aiezu.com
7、发送表单数据:curl -F "pic=@logo.png" -F "site=aiezu" http://aiezu.com/
8、发送cookie:curl -b "domain=aiezu.com" http://aiezu.com 查看全部
  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:
curl [options] [URL...]
 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。
参数组参数描述
urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt


-H "name: value"
--header "name: value"
(HTTP)添加一个http header(http请求头);
-H "name:"
--header "name:"
(HTTP)移除一个http header(http请求头);
-A "string"
--user-agent "string"
【参考】
(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;
-e <URL>
--referer <URL>
【参考】
(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;


-I
--head
(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)
-i
--include
(HTTP)输出HTTP头和返回内容;
-D <file>
--dump-header <file>
(HTTP)转储http响应头到指定文件;
cookie-b name=data
--cookie name=data
【参考】
(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;
-c filename
--cookie-jar file name
【参考】
(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;
-j
--junk-session-cookies
(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;
代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
-p
--proxytunnel
将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;
数据
传输
-G
--get
【参考】
如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; 
-d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】
(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;
-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】
(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;
--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;
-T file
--upload-file file
通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com
断点
续传
-C <offset>
--continue-at <offset>
断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
-r <range>
--range <range>
(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;



认证
--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;
--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;
--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;
--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;
--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;
-u user:password
--user user:password
使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;
证书-E <证书[:密码]>
--cert <证书[:密码]>
(SSL)指定“PEM”格式的证书文件和证书密码;
--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;
--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;
--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;
--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;
-k
--insecure
(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。
SSL
其他
--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;
--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;
--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;
-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3
(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;
私钥
公钥
--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;
--pass <phrase>(SSL/SSH)指定私钥文件的密码;
--pubkey <key>(SSH)使用指定文件提供的您公钥;
FTP-P
--ftp-port <接口>
(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;
--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);
--ftp-account [data](FTP)ftp帐号信息;
--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;
--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;
--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;
--ftp-create-dirs(FTP)上传时自动创建远程目录;
-l
--list-only
(FTP)列出ftp文件列表;
-B
--use-ascii
(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。
--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;
--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;
限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;
-y
--speed-time <time>
If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.
-Y
--speed-limit <speed>
If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.
其他
选项
-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;
--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X <command>
--request <command>
(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;
--keepalive-time <seconds>设置keepalive时间
--no-keepalive关闭keepalive功能;
--no-buffer禁用对输出流缓冲;
--buffer启用输出流缓冲;
-L
--location
(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)
--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;
--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;
--connect-timeout <seconds>指定最大连接超时,单位“秒”;
-m seconds
--max-time seconds
限制整个curl操作的最长时间,单位为秒;
-s
--silent
安静模式。不要显示进度表或错误消息;
-#
--progress-bar
显示进度条;
错误
选项
-f
--fail
(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>
失败重试次数;
重试间隔时间;
最大重试时间;
-S
--show-error
安静模式下显示错误信息;
--stderr <file>错误信息保存文件;
输出-o file
--output file
将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; 
-O
--remote-name
将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);
--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构
-w
--write-out format
操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;
调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。
--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;
--trace-time转储文件中添加时间信息;
-K
--config <config file>
从配置文件中读取参数,参考:http://curl.haxx.se/docs/
-v
--verbose
显示更详细的信息,调试时使用;
帮助-M
--manual
显示完整的帮助手册;
-h
--help
linux curl用法帮助;
 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。
退出码错误描述
1Unsupported protocol. This build of curl has no support for this protocol.
2Failed to initialize.
3URL malformed. The syntax was not correct.
5Couldn't resolve proxy. The given proxy host could not be resolved.
6Couldn't resolve host. The given remote host was not resolved.
7Failed to connect to host.
8FTP weird server reply. The server sent data curl couldn't parse.
9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.
11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
17FTP couldn't set binary. Couldn't change transfer method to binary.
18Partial file. Only a part of the file was transferred.
19FTP couldn't download/access the given file, the RETR (or similar) command failed.
21FTP quote error. A quote command returned error from the server.
22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.
23Write error. Curl couldn't write data to a local filesystem or similar.
25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.
26Read error. Various reading problems.
27Out of memory. A memory allocation request failed.
28Operation timeout. The specified time-out period was reached according to the conditions.
30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!
31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.
33HTTP range error. The range "command" didn't work.
34HTTP post error. Internal post-request generation error.
35SSL connect error. The SSL handshaking failed.
36FTP bad download resume. Couldn't continue an earlier aborted download.
37FILE couldn't read file. Failed to open the file. Permissions?
38LDAP cannot bind. LDAP bind operation failed.
39LDAP search failed.
41Function not found. A required LDAP function was not found.
42Aborted by callback. An application told curl to abort the operation.
43Internal error. A function was called with a bad parameter.
45Interface error. A specified outgoing interface could not be used.
47Too many redirects. When following redirects, curl hit the maximum amount.
48Unknown TELNET option specified.
49Malformed telnet option.
51The peer's SSL certificate or SSH MD5 fingerprint was not ok.
52The server didn't reply anything, which here is considered an error.
53SSL crypto engine not found.
54Cannot set SSL crypto engine as default.
55Failed sending network data.
56Failure in receiving network data.
58Problem with the local certificate.
59Couldn't use specified SSL cipher.
60Peer certificate cannot be authenticated with known CA certificates.
61Unrecognized transfer encoding.
62Invalid LDAP URL.
63Maximum file size exceeded.
64Requested FTP SSL level failed.
65Sending the data requires a rewind that failed.
66Failed to initialize SSL Engine.
67The user name, password, or similar was not accepted and curl failed to log in.
68File not found on TFTP server.
69Permission problem on TFTP server.
70Out of disk space on TFTP server.
71Illegal TFTP operation.
72Unknown TFTP transfer ID.
73File already exists (TFTP).
74No such user (TFTP).
75Character conversion failed.
76Character conversion functions required.
77Problem with reading the SSL CA cert (path? access rights?).
78The resource referenced in the URL does not exist.
79An unspecified error occurred during the SSH session.
80Failed to shut down the SSL connection.
82Could not load CRL file, missing or wrong format (added in 7.19.0).
83Issuer check failed (added in 7.19.0).
XXMore error codes will appear here in future releases. The existing ones are meant to never change.

四、用法演示:
1、下载页面:
curl -o index.html http://aiezu.com
 
2、下载文件并显示简单进度条:
curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
 
3、断点续传:
#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso

4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

 5、伪造代理设备:
#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令) 
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com
 
6、http头:
# 看看本站的http头是怎么样的
curl -I http://aiezu.com
输出:
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
 
6、设置http请求头:
curl -H "Cache-Control:no-cache"  http://aiezu.com

7、发送表单数据:
curl -F "pic=@logo.png" -F "site=aiezu"  http://aiezu.com/

8、发送cookie:
curl -b "domain=aiezu.com"  http://aiezu.com

Linux curl命令详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 4941 次浏览 • 2016-11-23 17:57 • 来自相关话题

  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:curl [options] [URL...] 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。参数组参数描述urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt请

头-H "name: value"
--header "name: value"(HTTP)添加一个http header(http请求头);-H "name:"
--header "name:"(HTTP)移除一个http header(http请求头);-A "string"
--user-agent "string"
【参考】(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;-e <URL>
--referer <URL>
【参考】(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;响

头-I
--head(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)-i
--include(HTTP)输出HTTP头和返回内容;-D <file>
--dump-header <file>(HTTP)转储http响应头到指定文件;cookie-b name=data
--cookie name=data
【参考】(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;-c filename
--cookie-jar file name
【参考】(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;-j
--junk-session-cookies(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"-p
--proxytunnel将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlmhttp代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;数据
传输-G
--get
【参考】如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; -d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;-T file
--upload-file file通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com断点
续传-C <offset>
--continue-at <offset>断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;-r <range>
--range <range>(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;


认证--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;-u user:password
--user user:password使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;证书-E <证书[:密码]>
--cert <证书[:密码]>(SSL)指定“PEM”格式的证书文件和证书密码;--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;-k
--insecure(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。SSL
其他--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;私钥
公钥--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;--pass <phrase>(SSL/SSH)指定私钥文件的密码;--pubkey <key>(SSH)使用指定文件提供的您公钥;FTP-P
--ftp-port <接口>(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);--ftp-account [data](FTP)ftp帐号信息;--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;--ftp-create-dirs(FTP)上传时自动创建远程目录;-l
--list-only(FTP)列出ftp文件列表;-B
--use-ascii(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;-y
--speed-time <time>If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.-Y
--speed-limit <speed>If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.其他
选项-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com-X <command>
--request <command>(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;--keepalive-time <seconds>设置keepalive时间--no-keepalive关闭keepalive功能;--no-buffer禁用对输出流缓冲;--buffer启用输出流缓冲;-L
--location(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;--connect-timeout <seconds>指定最大连接超时,单位“秒”;-m seconds
--max-time seconds限制整个curl操作的最长时间,单位为秒;-s
--silent安静模式。不要显示进度表或错误消息;-#
--progress-bar显示进度条;错误
选项-f
--fail(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>失败重试次数;
重试间隔时间;
最大重试时间;-S
--show-error安静模式下显示错误信息;--stderr <file>错误信息保存文件;输出-o file
--output file将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; -O
--remote-name将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构-w
--write-out format操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;--trace-time转储文件中添加时间信息;-K
--config <config file>从配置文件中读取参数,参考:http://curl.haxx.se/docs/-v
--verbose显示更详细的信息,调试时使用;帮助-M
--manual显示完整的帮助手册;-h
--helplinux curl用法帮助; 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。退出码错误描述1Unsupported protocol. This build of curl has no support for this protocol.2Failed to initialize.3URL malformed. The syntax was not correct.5Couldn't resolve proxy. The given proxy host could not be resolved.6Couldn't resolve host. The given remote host was not resolved.7Failed to connect to host.8FTP weird server reply. The server sent data curl couldn't parse.9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.17FTP couldn't set binary. Couldn't change transfer method to binary.18Partial file. Only a part of the file was transferred.19FTP couldn't download/access the given file, the RETR (or similar) command failed.21FTP quote error. A quote command returned error from the server.22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.23Write error. Curl couldn't write data to a local filesystem or similar.25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.26Read error. Various reading problems.27Out of memory. A memory allocation request failed.28Operation timeout. The specified time-out period was reached according to the conditions.30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.33HTTP range error. The range "command" didn't work.34HTTP post error. Internal post-request generation error.35SSL connect error. The SSL handshaking failed.36FTP bad download resume. Couldn't continue an earlier aborted download.37FILE couldn't read file. Failed to open the file. Permissions?38LDAP cannot bind. LDAP bind operation failed.39LDAP search failed.41Function not found. A required LDAP function was not found.42Aborted by callback. An application told curl to abort the operation.43Internal error. A function was called with a bad parameter.45Interface error. A specified outgoing interface could not be used.47Too many redirects. When following redirects, curl hit the maximum amount.48Unknown TELNET option specified.49Malformed telnet option.51The peer's SSL certificate or SSH MD5 fingerprint was not ok.52The server didn't reply anything, which here is considered an error.53SSL crypto engine not found.54Cannot set SSL crypto engine as default.55Failed sending network data.56Failure in receiving network data.58Problem with the local certificate.59Couldn't use specified SSL cipher.60Peer certificate cannot be authenticated with known CA certificates.61Unrecognized transfer encoding.62Invalid LDAP URL.63Maximum file size exceeded.64Requested FTP SSL level failed.65Sending the data requires a rewind that failed.66Failed to initialize SSL Engine.67The user name, password, or similar was not accepted and curl failed to log in.68File not found on TFTP server.69Permission problem on TFTP server.70Out of disk space on TFTP server.71Illegal TFTP operation.72Unknown TFTP transfer ID.73File already exists (TFTP).74No such user (TFTP).75Character conversion failed.76Character conversion functions required.77Problem with reading the SSL CA cert (path? access rights?).78The resource referenced in the URL does not exist.79An unspecified error occurred during the SSH session.80Failed to shut down the SSL connection.82Could not load CRL file, missing or wrong format (added in 7.19.0).83Issuer check failed (added in 7.19.0).XXMore error codes will appear here in future releases. The existing ones are meant to never change.
四、用法演示:
1、下载页面:curl -o index.html http://aiezu.com 
2、下载文件并显示简单进度条:curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso 
3、断点续传:#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com
 5、伪造代理设备:#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令)
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com 
6、http头:# 看看本站的http头是怎么样的
curl -I http://aiezu.com输出:HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8 
6、设置http请求头:curl -H "Cache-Control:no-cache" http://aiezu.com
7、发送表单数据:curl -F "pic=@logo.png" -F "site=aiezu" http://aiezu.com/
8、发送cookie:curl -b "domain=aiezu.com" http://aiezu.com 查看全部
  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:
curl [options] [URL...]
 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。
参数组参数描述
urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt


-H "name: value"
--header "name: value"
(HTTP)添加一个http header(http请求头);
-H "name:"
--header "name:"
(HTTP)移除一个http header(http请求头);
-A "string"
--user-agent "string"
【参考】
(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;
-e <URL>
--referer <URL>
【参考】
(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;


-I
--head
(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)
-i
--include
(HTTP)输出HTTP头和返回内容;
-D <file>
--dump-header <file>
(HTTP)转储http响应头到指定文件;
cookie-b name=data
--cookie name=data
【参考】
(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;
-c filename
--cookie-jar file name
【参考】
(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;
-j
--junk-session-cookies
(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;
代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
-p
--proxytunnel
将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;
数据
传输
-G
--get
【参考】
如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; 
-d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】
(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;
-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】
(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;
--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;
-T file
--upload-file file
通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com
断点
续传
-C <offset>
--continue-at <offset>
断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
-r <range>
--range <range>
(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;



认证
--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;
--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;
--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;
--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;
--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;
-u user:password
--user user:password
使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;
证书-E <证书[:密码]>
--cert <证书[:密码]>
(SSL)指定“PEM”格式的证书文件和证书密码;
--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;
--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;
--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;
--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;
-k
--insecure
(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。
SSL
其他
--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;
--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;
--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;
-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3
(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;
私钥
公钥
--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;
--pass <phrase>(SSL/SSH)指定私钥文件的密码;
--pubkey <key>(SSH)使用指定文件提供的您公钥;
FTP-P
--ftp-port <接口>
(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;
--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);
--ftp-account [data](FTP)ftp帐号信息;
--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;
--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;
--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;
--ftp-create-dirs(FTP)上传时自动创建远程目录;
-l
--list-only
(FTP)列出ftp文件列表;
-B
--use-ascii
(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。
--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;
--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;
限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;
-y
--speed-time <time>
If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.
-Y
--speed-limit <speed>
If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.
其他
选项
-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;
--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X <command>
--request <command>
(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;
--keepalive-time <seconds>设置keepalive时间
--no-keepalive关闭keepalive功能;
--no-buffer禁用对输出流缓冲;
--buffer启用输出流缓冲;
-L
--location
(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)
--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;
--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;
--connect-timeout <seconds>指定最大连接超时,单位“秒”;
-m seconds
--max-time seconds
限制整个curl操作的最长时间,单位为秒;
-s
--silent
安静模式。不要显示进度表或错误消息;
-#
--progress-bar
显示进度条;
错误
选项
-f
--fail
(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>
失败重试次数;
重试间隔时间;
最大重试时间;
-S
--show-error
安静模式下显示错误信息;
--stderr <file>错误信息保存文件;
输出-o file
--output file
将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; 
-O
--remote-name
将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);
--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构
-w
--write-out format
操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;
调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。
--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;
--trace-time转储文件中添加时间信息;
-K
--config <config file>
从配置文件中读取参数,参考:http://curl.haxx.se/docs/
-v
--verbose
显示更详细的信息,调试时使用;
帮助-M
--manual
显示完整的帮助手册;
-h
--help
linux curl用法帮助;
 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。
退出码错误描述
1Unsupported protocol. This build of curl has no support for this protocol.
2Failed to initialize.
3URL malformed. The syntax was not correct.
5Couldn't resolve proxy. The given proxy host could not be resolved.
6Couldn't resolve host. The given remote host was not resolved.
7Failed to connect to host.
8FTP weird server reply. The server sent data curl couldn't parse.
9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.
11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
17FTP couldn't set binary. Couldn't change transfer method to binary.
18Partial file. Only a part of the file was transferred.
19FTP couldn't download/access the given file, the RETR (or similar) command failed.
21FTP quote error. A quote command returned error from the server.
22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.
23Write error. Curl couldn't write data to a local filesystem or similar.
25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.
26Read error. Various reading problems.
27Out of memory. A memory allocation request failed.
28Operation timeout. The specified time-out period was reached according to the conditions.
30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!
31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.
33HTTP range error. The range "command" didn't work.
34HTTP post error. Internal post-request generation error.
35SSL connect error. The SSL handshaking failed.
36FTP bad download resume. Couldn't continue an earlier aborted download.
37FILE couldn't read file. Failed to open the file. Permissions?
38LDAP cannot bind. LDAP bind operation failed.
39LDAP search failed.
41Function not found. A required LDAP function was not found.
42Aborted by callback. An application told curl to abort the operation.
43Internal error. A function was called with a bad parameter.
45Interface error. A specified outgoing interface could not be used.
47Too many redirects. When following redirects, curl hit the maximum amount.
48Unknown TELNET option specified.
49Malformed telnet option.
51The peer's SSL certificate or SSH MD5 fingerprint was not ok.
52The server didn't reply anything, which here is considered an error.
53SSL crypto engine not found.
54Cannot set SSL crypto engine as default.
55Failed sending network data.
56Failure in receiving network data.
58Problem with the local certificate.
59Couldn't use specified SSL cipher.
60Peer certificate cannot be authenticated with known CA certificates.
61Unrecognized transfer encoding.
62Invalid LDAP URL.
63Maximum file size exceeded.
64Requested FTP SSL level failed.
65Sending the data requires a rewind that failed.
66Failed to initialize SSL Engine.
67The user name, password, or similar was not accepted and curl failed to log in.
68File not found on TFTP server.
69Permission problem on TFTP server.
70Out of disk space on TFTP server.
71Illegal TFTP operation.
72Unknown TFTP transfer ID.
73File already exists (TFTP).
74No such user (TFTP).
75Character conversion failed.
76Character conversion functions required.
77Problem with reading the SSL CA cert (path? access rights?).
78The resource referenced in the URL does not exist.
79An unspecified error occurred during the SSH session.
80Failed to shut down the SSL connection.
82Could not load CRL file, missing or wrong format (added in 7.19.0).
83Issuer check failed (added in 7.19.0).
XXMore error codes will appear here in future releases. The existing ones are meant to never change.

四、用法演示:
1、下载页面:
curl -o index.html http://aiezu.com
 
2、下载文件并显示简单进度条:
curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
 
3、断点续传:
#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso

4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

 5、伪造代理设备:
#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令) 
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com
 
6、http头:
# 看看本站的http头是怎么样的
curl -I http://aiezu.com
输出:
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
 
6、设置http请求头:
curl -H "Cache-Control:no-cache"  http://aiezu.com

7、发送表单数据:
curl -F "pic=@logo.png" -F "site=aiezu"  http://aiezu.com/

8、发送cookie:
curl -b "domain=aiezu.com"  http://aiezu.com

PHP curl curl_setopt()函数选项合集

PHPllslx520 发表了文章 • 0 个评论 • 735 次浏览 • 2017-06-05 20:04 • 来自相关话题

组选项名称值类型描述网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。重

向CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。请

头CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')cook
iesCURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。CURLOPT_PROXYPORTstring指定代理服务器端口。CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。POST
/
PUTCURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。CURLOPT_POSTFIELDSarray
string【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))   CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。SSL
选项CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)SSH
选项CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。断点
续传CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。速率
限制CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)连接
选项CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。响应
选项CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。响

头CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。响应
BODYCURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。调试
选项CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    网络
选项CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3. 参考页面:php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php 查看全部
选项名称值类型描述
网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。
CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)
CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。
CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  
CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。
CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)
CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。


CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。
CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。
CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。
CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。
CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。


CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。
CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。
CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。
CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。
CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。
CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')
cook
ies
CURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。
CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。
CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。
CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。
代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。
CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。
CURLOPT_PROXYPORTstring指定代理服务器端口。
CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。
CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。
CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。
CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。
CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。
POST
/
PUT
CURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。
CURLOPT_POSTFIELDSarray
string
【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))
   
CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)
CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;
CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;
CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;
CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。
认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。
CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。
CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。
CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。
CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。
CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。
CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。
CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。
证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;
CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;
CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)
CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。
CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。
CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 
密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。
CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)
CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。
CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。
CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。
CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。
CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。
CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。
SSL
选项
CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) 
CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)
CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 
CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。
CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)
SSH
选项
CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)
CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)
CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)
FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 
CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。
CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。
CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。
CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。
CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。
CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。
CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。
CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 
CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。
CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) 
CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    
CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。
断点
续传
CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。
CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。
速率
限制
CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。
CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    
CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)
CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)
连接
选项
CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。
CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。
CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。
CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。
CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)
CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。
CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。
响应
选项
CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。
CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 
CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。


CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。
CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;
CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。
响应
BODY
CURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;
CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;
CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。
CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。
调试
选项
CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。
CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。
CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)
CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    
CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)
CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    
网络
选项
CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。
CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)
CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)
CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    
CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。
CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  
CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)
CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)
CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 
杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。
CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)
CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。
CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.
CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3.
 

参考页面:

php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php

PHP curl简单用法举例和相关函数介绍

PHPllslx520 发表了文章 • 0 个评论 • 617 次浏览 • 2017-06-04 22:24 • 来自相关话题

一、PHP curl抓取代码编写流程:使用PHP curl执行抓取请求分为下面基本四步:使用 curl_init() 函数创建一个curl句柄;使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;使用 curl_exec() 函数执行抓取请求;使用 curl_close() 函数关闭curl句柄,释放内存;  二、PHP curl最基本用法:  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);运行结果:96161 三、PHP curl GET请求和POST请求:1、php curl get请求:<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
) 
2、php curl post 提交数据:<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
) 四、PHP curl组件相关函数:  PHP curl组件相关函数功能介绍: 函数名函数介绍基


数curl_init【常用】初始化一个curl会话,返回一个curl句柄;curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;curl_setopt_array【常用】使用数组的方式批量设置curl选项;curl_copy_handle克隆一个curl句柄和它的所有选项;curl_exec【常用】执行curl会话;curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;curl_errno返回curl会话最后一次的数字错误代码;curl_error返回curl会话最后一次的字符串错误描述;curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);curl_close【常用】关闭curl会话;curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);curl_version以数组的形式返回php curl版本信息;批

理curl_multi_init创建一个curl批处理句柄(并发请求);curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;curl_multi_setopt为curl批处理句柄设置选项;curl_multi_exec执行curl批处理句柄;curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;curl_multi_close关闭curl批处理句柄;curl_multi_select 等待所有curl批处理中的活动连接;curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);共


柄curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);curl_share_close关闭curl共享句柄(PHP 5.5以上版本);其
他curl_file_create创建一个curlfile对象(PHP 5.5以上版本); 五、参考资料:php官网关于curl组件介绍:http://php.net/curlphp curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.phpphp curl选项爱E族整理:https://aiezu.com/article/php_curl_curl_setopt_sets.html 查看全部

一、PHP curl抓取代码编写流程:

使用PHP curl执行抓取请求分为下面基本四步:
  1. 使用 curl_init() 函数创建一个curl句柄;
  2. 使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;
  3. 使用 curl_exec() 函数执行抓取请求;
  4. 使用 curl_close() 函数关闭curl句柄,释放内存;
  

二、PHP curl最基本用法:

  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。
<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);
运行结果:
96161
 

三、PHP curl GET请求和POST请求:

1、php curl get请求:

<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
)
 
2、php curl post 提交数据:
<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
)
 

四、PHP curl组件相关函数:

  PHP curl组件相关函数功能介绍:
 函数名函数介绍



curl_init【常用】初始化一个curl会话,返回一个curl句柄;
curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;
curl_setopt_array【常用】使用数组的方式批量设置curl选项;
curl_copy_handle克隆一个curl句柄和它的所有选项;
curl_exec【常用】执行curl会话;
curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);
curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);
curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;
curl_errno返回curl会话最后一次的数字错误代码;
curl_error返回curl会话最后一次的字符串错误描述;
curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);
curl_close【常用】关闭curl会话;
curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);
curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);
curl_version以数组的形式返回php curl版本信息;


curl_multi_init创建一个curl批处理句柄(并发请求);
curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;
curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;
curl_multi_setopt为curl批处理句柄设置选项;
curl_multi_exec执行curl批处理句柄;
curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;
curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;
curl_multi_close关闭curl批处理句柄;
curl_multi_select 等待所有curl批处理中的活动连接;
curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);



curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);
curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);
curl_share_close关闭curl共享句柄(PHP 5.5以上版本);

curl_file_create创建一个curlfile对象(PHP 5.5以上版本);
 

五、参考资料:

Linux curl命令使用代理、以及代理种类介绍

Linuxliuliangsong 发表了文章 • 0 个评论 • 6604 次浏览 • 2016-12-07 11:40 • 来自相关话题

  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  一、代理服务器分类:  我们比较常用、支持http(s)协议代理主要分为两大类:http代理和socks代理,见下表:大类小类子类描述http代理http代理
https代理透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议只支持TCP应用;SOCKS4A支持TCP应用;支持服务器端域名解析;SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6; 二、Linux curl命令代理设置参数:  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:参数用法-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;
 三、Linux curl命令设置代理举例:1、linux curl命令设置http代理:# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php 2、Linux curl命令设置socks代理:#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php 四、测试代理的隐匿度:1、测试前准备:  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  2、测试使用不同代理输出结果:  ①.  通过linux curl不使用代理访问:[root@aiezu.com ~]# curl http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.112.104.126
)  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理。

  ④. 通过linux curl命令使用http高匿名代理访问:[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.232.1.13
)  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理。
  
  ④. 通过linux curl命令使用socks5代理访问:[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 180.96.54.198
)  可以看出此SOCKS5代理也是高匿名代理。
  五、附录:Linux curl命令详解 查看全部
  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  

一、代理服务器分类:

  我们比较常用、支持http(s)协议代理主要分为两大类:http代理socks代理,见下表:
大类小类子类描述
http代理http代理
https代理
透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;
匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;
高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;
SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议
只支持TCP应用;
SOCKS4A支持TCP应用;支持服务器端域名解析;
SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6;
 

二、Linux curl命令代理设置参数:

  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:
参数用法
-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;

 

三、Linux curl命令设置代理举例:

1、linux curl命令设置http代理:

# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
 

2、Linux curl命令设置socks代理:

#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php
 

四、测试代理的隐匿度:

1、测试前准备:

  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:
<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);
  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  

2、测试使用不同代理输出结果:

  ①.  通过linux curl不使用代理访问:
[root@aiezu.com ~]# curl http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.112.104.126
)
  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:
[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php 
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)
  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:
[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php 
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)
  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理

  ④. 通过linux curl命令使用http高匿名代理访问:
[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.232.1.13
)
  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理
  
  ④. 通过linux curl命令使用socks5代理访问:
[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 180.96.54.198
)
  可以看出此SOCKS5代理也是高匿名代理。
  

五、附录:

Linux curl命令http cookie详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 1154 次浏览 • 2016-12-07 08:35 • 来自相关话题

  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 一、Linux curl命令Cookie的接收:1、cookie接收原理:  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:


  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 2、linux curl命令接收cookie(-c):  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98 二、Linux curl命令发送Cookie:1、cookie发送原理和从cookie文件中发送:  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:<?php print_r($_COOKIE);  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 3、linux curl命令使用"-H"参数发送cookie:  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 三、附录:Linux curl命令详解
  查看全部
  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 

一、Linux curl命令Cookie的接收:

1、cookie接收原理:

  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:
<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');
  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:
linux_curl_http_header_cookie.png
  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 

2、linux curl命令接收cookie(-c):

  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。
[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98
 

二、Linux curl命令发送Cookie:

1、cookie发送原理和从cookie文件中发送:

  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:
<?php print_r($_COOKIE);
  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:
[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact
  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 

2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:

  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:
[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

3、linux curl命令使用"-H"参数发送cookie:

  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:
[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

三、附录:


 

Linux curl命令get/post提交数据、json和上传文件全攻略

Linuxliuliangsong 发表了文章 • 0 个评论 • 7157 次浏览 • 2016-12-03 13:43 • 来自相关话题

  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。
 一、测试前准备:  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
} 二、GET请求方式:  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族

2、使用"-G"参数配合"-d"参数:[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php 
3、带特殊字符数据使用“--data-urlencode”:[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?

4、从文件中获取数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
) 三、POST基本类型请求方式(-d):  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded对、正是相当于html的如下表单:<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form> 
1、直接设置POST数据:[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?

2、从文件中获取POST数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
) 四、POST多类型表单数据请求方式(-F):  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722
相当于HTML的如下表单:<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form、-F):[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
2、使用"@"、"<"失去特殊意义的"--form-string":[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)
3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

) 五、POST上传文件(-F "@"字符的妙用):  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)


2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

) 六、POST提交JSON数据:  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)接收JSON的代码段:<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}  提示:除了Content-Type为multipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 七、附录:参考页面:Linux curl命令详解linux curl命令来路伪装(referer)和浏览器伪装(user-agent) 查看全部
  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。
 

一、测试前准备:

  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:
<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
 

二、GET请求方式:

  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:
[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 
2、使用"-G"参数配合"-d"参数:
[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:
curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php
 
3、带特殊字符数据使用“--data-urlencode”:
[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?
)
 
4、从文件中获取数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

三、POST基本类型请求方式(-d):

  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
对、正是相当于html的如下表单:
<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form>
 
1、直接设置POST数据:
[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?
)
 
2、从文件中获取POST数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

四、POST多类型表单数据请求方式(-F):

  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722

相当于HTML的如下表单:
<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form-F):
[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)

2、使用"@"、"<"失去特殊意义的"--form-string":
[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)

3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

)
 

五、POST上传文件(-F "@"字符的妙用):

  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:
[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)

)
 
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:
<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

)
 

六、POST提交JSON数据:

  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:
[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}'  http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
接收JSON的代码段:
<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
  提示:除了Content-Typemultipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 

七、附录:

参考页面:

linux curl命令来路伪装(referer)和浏览器伪装(user-agent)

Linuxliuliangsong 发表了文章 • 0 个评论 • 3070 次浏览 • 2016-12-02 11:05 • 来自相关话题

  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:<?php
print_r($_SERVER);测试返回:[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125

二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu 
2、“-H”参数的方式:# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
2、“-H”参数方式:# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
七、附录:
参考页面:Linux curl命令详解Linux curl命令get/post提交数据、json和文件全攻略 查看全部
  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:
[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/  
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact
  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:
<?php
print_r($_SERVER);
测试返回:
[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125
)
 
二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:
# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu
 
2、“-H”参数的方式:
# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com
 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:
# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36

2、“-H”参数方式:
# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

七、附录:
参考页面:

Linux curl命令详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 4941 次浏览 • 2016-11-23 17:57 • 来自相关话题

  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:curl [options] [URL...] 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。参数组参数描述urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt请

头-H "name: value"
--header "name: value"(HTTP)添加一个http header(http请求头);-H "name:"
--header "name:"(HTTP)移除一个http header(http请求头);-A "string"
--user-agent "string"
【参考】(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;-e <URL>
--referer <URL>
【参考】(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;响

头-I
--head(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)-i
--include(HTTP)输出HTTP头和返回内容;-D <file>
--dump-header <file>(HTTP)转储http响应头到指定文件;cookie-b name=data
--cookie name=data
【参考】(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;-c filename
--cookie-jar file name
【参考】(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;-j
--junk-session-cookies(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"-p
--proxytunnel将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlmhttp代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;数据
传输-G
--get
【参考】如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; -d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;-T file
--upload-file file通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com断点
续传-C <offset>
--continue-at <offset>断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;-r <range>
--range <range>(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;


认证--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;-u user:password
--user user:password使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;证书-E <证书[:密码]>
--cert <证书[:密码]>(SSL)指定“PEM”格式的证书文件和证书密码;--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;-k
--insecure(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。SSL
其他--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;私钥
公钥--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;--pass <phrase>(SSL/SSH)指定私钥文件的密码;--pubkey <key>(SSH)使用指定文件提供的您公钥;FTP-P
--ftp-port <接口>(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);--ftp-account [data](FTP)ftp帐号信息;--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;--ftp-create-dirs(FTP)上传时自动创建远程目录;-l
--list-only(FTP)列出ftp文件列表;-B
--use-ascii(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;-y
--speed-time <time>If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.-Y
--speed-limit <speed>If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.其他
选项-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com-X <command>
--request <command>(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;--keepalive-time <seconds>设置keepalive时间--no-keepalive关闭keepalive功能;--no-buffer禁用对输出流缓冲;--buffer启用输出流缓冲;-L
--location(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;--connect-timeout <seconds>指定最大连接超时,单位“秒”;-m seconds
--max-time seconds限制整个curl操作的最长时间,单位为秒;-s
--silent安静模式。不要显示进度表或错误消息;-#
--progress-bar显示进度条;错误
选项-f
--fail(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>失败重试次数;
重试间隔时间;
最大重试时间;-S
--show-error安静模式下显示错误信息;--stderr <file>错误信息保存文件;输出-o file
--output file将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; -O
--remote-name将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构-w
--write-out format操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;--trace-time转储文件中添加时间信息;-K
--config <config file>从配置文件中读取参数,参考:http://curl.haxx.se/docs/-v
--verbose显示更详细的信息,调试时使用;帮助-M
--manual显示完整的帮助手册;-h
--helplinux curl用法帮助; 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。退出码错误描述1Unsupported protocol. This build of curl has no support for this protocol.2Failed to initialize.3URL malformed. The syntax was not correct.5Couldn't resolve proxy. The given proxy host could not be resolved.6Couldn't resolve host. The given remote host was not resolved.7Failed to connect to host.8FTP weird server reply. The server sent data curl couldn't parse.9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.17FTP couldn't set binary. Couldn't change transfer method to binary.18Partial file. Only a part of the file was transferred.19FTP couldn't download/access the given file, the RETR (or similar) command failed.21FTP quote error. A quote command returned error from the server.22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.23Write error. Curl couldn't write data to a local filesystem or similar.25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.26Read error. Various reading problems.27Out of memory. A memory allocation request failed.28Operation timeout. The specified time-out period was reached according to the conditions.30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.33HTTP range error. The range "command" didn't work.34HTTP post error. Internal post-request generation error.35SSL connect error. The SSL handshaking failed.36FTP bad download resume. Couldn't continue an earlier aborted download.37FILE couldn't read file. Failed to open the file. Permissions?38LDAP cannot bind. LDAP bind operation failed.39LDAP search failed.41Function not found. A required LDAP function was not found.42Aborted by callback. An application told curl to abort the operation.43Internal error. A function was called with a bad parameter.45Interface error. A specified outgoing interface could not be used.47Too many redirects. When following redirects, curl hit the maximum amount.48Unknown TELNET option specified.49Malformed telnet option.51The peer's SSL certificate or SSH MD5 fingerprint was not ok.52The server didn't reply anything, which here is considered an error.53SSL crypto engine not found.54Cannot set SSL crypto engine as default.55Failed sending network data.56Failure in receiving network data.58Problem with the local certificate.59Couldn't use specified SSL cipher.60Peer certificate cannot be authenticated with known CA certificates.61Unrecognized transfer encoding.62Invalid LDAP URL.63Maximum file size exceeded.64Requested FTP SSL level failed.65Sending the data requires a rewind that failed.66Failed to initialize SSL Engine.67The user name, password, or similar was not accepted and curl failed to log in.68File not found on TFTP server.69Permission problem on TFTP server.70Out of disk space on TFTP server.71Illegal TFTP operation.72Unknown TFTP transfer ID.73File already exists (TFTP).74No such user (TFTP).75Character conversion failed.76Character conversion functions required.77Problem with reading the SSL CA cert (path? access rights?).78The resource referenced in the URL does not exist.79An unspecified error occurred during the SSH session.80Failed to shut down the SSL connection.82Could not load CRL file, missing or wrong format (added in 7.19.0).83Issuer check failed (added in 7.19.0).XXMore error codes will appear here in future releases. The existing ones are meant to never change.
四、用法演示:
1、下载页面:curl -o index.html http://aiezu.com 
2、下载文件并显示简单进度条:curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso 
3、断点续传:#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com
 5、伪造代理设备:#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令)
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com 
6、http头:# 看看本站的http头是怎么样的
curl -I http://aiezu.com输出:HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8 
6、设置http请求头:curl -H "Cache-Control:no-cache" http://aiezu.com
7、发送表单数据:curl -F "pic=@logo.png" -F "site=aiezu" http://aiezu.com/
8、发送cookie:curl -b "domain=aiezu.com" http://aiezu.com 查看全部
  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:
curl [options] [URL...]
 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。
参数组参数描述
urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt


-H "name: value"
--header "name: value"
(HTTP)添加一个http header(http请求头);
-H "name:"
--header "name:"
(HTTP)移除一个http header(http请求头);
-A "string"
--user-agent "string"
【参考】
(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;
-e <URL>
--referer <URL>
【参考】
(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;


-I
--head
(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)
-i
--include
(HTTP)输出HTTP头和返回内容;
-D <file>
--dump-header <file>
(HTTP)转储http响应头到指定文件;
cookie-b name=data
--cookie name=data
【参考】
(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;
-c filename
--cookie-jar file name
【参考】
(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;
-j
--junk-session-cookies
(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;
代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
-p
--proxytunnel
将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;
数据
传输
-G
--get
【参考】
如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; 
-d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】
(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;
-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】
(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;
--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;
-T file
--upload-file file
通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com
断点
续传
-C <offset>
--continue-at <offset>
断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
-r <range>
--range <range>
(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;



认证
--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;
--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;
--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;
--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;
--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;
-u user:password
--user user:password
使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;
证书-E <证书[:密码]>
--cert <证书[:密码]>
(SSL)指定“PEM”格式的证书文件和证书密码;
--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;
--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;
--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;
--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;
-k
--insecure
(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。
SSL
其他
--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;
--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;
--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;
-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3
(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;
私钥
公钥
--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;
--pass <phrase>(SSL/SSH)指定私钥文件的密码;
--pubkey <key>(SSH)使用指定文件提供的您公钥;
FTP-P
--ftp-port <接口>
(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;
--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);
--ftp-account [data](FTP)ftp帐号信息;
--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;
--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;
--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;
--ftp-create-dirs(FTP)上传时自动创建远程目录;
-l
--list-only
(FTP)列出ftp文件列表;
-B
--use-ascii
(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。
--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;
--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;
限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;
-y
--speed-time <time>
If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.
-Y
--speed-limit <speed>
If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.
其他
选项
-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;
--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X <command>
--request <command>
(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;
--keepalive-time <seconds>设置keepalive时间
--no-keepalive关闭keepalive功能;
--no-buffer禁用对输出流缓冲;
--buffer启用输出流缓冲;
-L
--location
(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)
--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;
--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;
--connect-timeout <seconds>指定最大连接超时,单位“秒”;
-m seconds
--max-time seconds
限制整个curl操作的最长时间,单位为秒;
-s
--silent
安静模式。不要显示进度表或错误消息;
-#
--progress-bar
显示进度条;
错误
选项
-f
--fail
(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>
失败重试次数;
重试间隔时间;
最大重试时间;
-S
--show-error
安静模式下显示错误信息;
--stderr <file>错误信息保存文件;
输出-o file
--output file
将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; 
-O
--remote-name
将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);
--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构
-w
--write-out format
操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;
调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。
--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;
--trace-time转储文件中添加时间信息;
-K
--config <config file>
从配置文件中读取参数,参考:http://curl.haxx.se/docs/
-v
--verbose
显示更详细的信息,调试时使用;
帮助-M
--manual
显示完整的帮助手册;
-h
--help
linux curl用法帮助;
 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。
退出码错误描述
1Unsupported protocol. This build of curl has no support for this protocol.
2Failed to initialize.
3URL malformed. The syntax was not correct.
5Couldn't resolve proxy. The given proxy host could not be resolved.
6Couldn't resolve host. The given remote host was not resolved.
7Failed to connect to host.
8FTP weird server reply. The server sent data curl couldn't parse.
9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.
11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
17FTP couldn't set binary. Couldn't change transfer method to binary.
18Partial file. Only a part of the file was transferred.
19FTP couldn't download/access the given file, the RETR (or similar) command failed.
21FTP quote error. A quote command returned error from the server.
22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.
23Write error. Curl couldn't write data to a local filesystem or similar.
25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.
26Read error. Various reading problems.
27Out of memory. A memory allocation request failed.
28Operation timeout. The specified time-out period was reached according to the conditions.
30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!
31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.
33HTTP range error. The range "command" didn't work.
34HTTP post error. Internal post-request generation error.
35SSL connect error. The SSL handshaking failed.
36FTP bad download resume. Couldn't continue an earlier aborted download.
37FILE couldn't read file. Failed to open the file. Permissions?
38LDAP cannot bind. LDAP bind operation failed.
39LDAP search failed.
41Function not found. A required LDAP function was not found.
42Aborted by callback. An application told curl to abort the operation.
43Internal error. A function was called with a bad parameter.
45Interface error. A specified outgoing interface could not be used.
47Too many redirects. When following redirects, curl hit the maximum amount.
48Unknown TELNET option specified.
49Malformed telnet option.
51The peer's SSL certificate or SSH MD5 fingerprint was not ok.
52The server didn't reply anything, which here is considered an error.
53SSL crypto engine not found.
54Cannot set SSL crypto engine as default.
55Failed sending network data.
56Failure in receiving network data.
58Problem with the local certificate.
59Couldn't use specified SSL cipher.
60Peer certificate cannot be authenticated with known CA certificates.
61Unrecognized transfer encoding.
62Invalid LDAP URL.
63Maximum file size exceeded.
64Requested FTP SSL level failed.
65Sending the data requires a rewind that failed.
66Failed to initialize SSL Engine.
67The user name, password, or similar was not accepted and curl failed to log in.
68File not found on TFTP server.
69Permission problem on TFTP server.
70Out of disk space on TFTP server.
71Illegal TFTP operation.
72Unknown TFTP transfer ID.
73File already exists (TFTP).
74No such user (TFTP).
75Character conversion failed.
76Character conversion functions required.
77Problem with reading the SSL CA cert (path? access rights?).
78The resource referenced in the URL does not exist.
79An unspecified error occurred during the SSH session.
80Failed to shut down the SSL connection.
82Could not load CRL file, missing or wrong format (added in 7.19.0).
83Issuer check failed (added in 7.19.0).
XXMore error codes will appear here in future releases. The existing ones are meant to never change.

四、用法演示:
1、下载页面:
curl -o index.html http://aiezu.com
 
2、下载文件并显示简单进度条:
curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
 
3、断点续传:
#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso

4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

 5、伪造代理设备:
#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令) 
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com
 
6、http头:
# 看看本站的http头是怎么样的
curl -I http://aiezu.com
输出:
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
 
6、设置http请求头:
curl -H "Cache-Control:no-cache"  http://aiezu.com

7、发送表单数据:
curl -F "pic=@logo.png" -F "site=aiezu"  http://aiezu.com/

8、发送cookie:
curl -b "domain=aiezu.com"  http://aiezu.com