首页  >  文章  >  运维  >  linux curl是什么

linux curl是什么

青灯夜游
青灯夜游原创
2023-04-20 17:05:463398浏览

在linux中,curl是一个非常实用的、用来与服务器之间传输数据的工具,是一个利用URL规则在命令行下工作的文件传输工具;它支持文件的上传和下载,是综合传输工具。curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传等等。

linux curl是什么

本教程操作环境:linux7.3系统、Dell G3电脑。

在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。

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命令

1、发送GET请求

curl URL
curl URL?a=1&b=nihao

2、发送POST请求

curl -X POST -d 'a=1&b=nihao' URL

3、发送json格式请求:

curl -H "Content-Type: application/json" -X POST -d '{"abc":123,"bcd":"nihao"}' URL
curl -H "Content-Type: application/json" -X POST -d @test.json URL

其中,-H代表header头,-X是指定什么类型请求(POST/GET/HEAD/DELETE/PUT/PATCH),-d代表传输什么数据。这几个是最常用的。

查看所有curl命令: man curl或者curl -h
请求头:H,A,e
响应头:I,i,D
cookie:b,c,j
传输:F(POST),G(GET),T(PUT),X
输出:o,O,w
断点续传:r
调试:v,--trace,--trace-ascii,--trace-time

二、curl命令语法与curl命令参数详解

1、curl命令语法

curl [options] [URL...]

2、curl命令参数详解

由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。

参数组 参数 描述
url url 需要抓取的一到多个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 258c40d94d8689854ad79c4076dd5f96
--referer 258c40d94d8689854ad79c4076dd5f96
(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 28897b20adb25fbae118a3f80f538dec
--dump-header 28897b20adb25fbae118a3f80f538dec
(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 aa3755fb6675d042aec4e88952ca7a83
--socks4a aa3755fb6675d042aec4e88952ca7a83
--socks5 aa3755fb6675d042aec4e88952ca7a83
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U a0cdbb1e98c0a7f7bc41394907e02e8d
--proxy-user a0cdbb1e98c0a7f7bc41394907e02e8d
设置代理的用户名和密码;
数据
传输
-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=7448fe677320a9704d259af971db48db
(HTTP)类似于“--form”,但是“@”、“499a5e52fa6281cdfd8fd53aed747e01
--continue-at ab76cfca1a1dc7ff1291dcdf873f72ec
断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
-r 01fbef2219010f55027ff7800552222a
--range 01fbef2219010f55027ff7800552222a
(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 53d6003ac82c7593b012767b01dcd15b
--cert 53d6003ac82c7593b012767b01dcd15b
(SSL)指定“PEM”格式的证书文件和证书密码;
--cert-type 7674b22ef33c73b930516fd6bc30b7a3 (SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;
--cacert 1ca3a98782c2d192f1f9b2f9adb24027 (SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;
--capath 119c37cf0e2d42e55711098f46ac9745 (SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;
--crlfile 28897b20adb25fbae118a3f80f538dec (HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;
-k
--insecure
(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。
SSL
其他
--ciphers e8f064f971a27002865e16550000e50d (SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine 8a11bc632ea32a57b3e3693c7987c420 设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;
--random-file (SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;
--egd-file 28897b20adb25fbae118a3f80f538dec (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 42538adbdb6240b2b083a000a615d5bd (SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type 7674b22ef33c73b930516fd6bc30b7a3 (SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;
--pass b6cb73fae0efbdb0e9a26fd2eaddb3bb (SSL/SSH)指定私钥文件的密码;
--pubkey 42538adbdb6240b2b083a000a615d5bd (SSH)使用指定文件提供的您公钥;
FTP -P
--ftp-port 75f8295c98efd3b295f307b1dd6770d9
(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 0525e6a15abb94ecba5807e114b60ce6 限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;
-y
--speed-time 46dd80ba616c57a652514755c74c4211
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 0525e6a15abb94ecba5807e114b60ce6
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 8a11bc632ea32a57b3e3693c7987c420 使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X e2b9f03cad787b9644e1f51fd23b7dac
--request e2b9f03cad787b9644e1f51fd23b7dac
(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;
--keepalive-time 0e72eeb93e8222d25f37582edca0e1bc 设置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 0e72eeb93e8222d25f37582edca0e1bc 指定最大连接超时,单位“秒”;
-m seconds
--max-time seconds
限制整个curl操作的最长时间,单位为秒;
-s
--silent
安静模式。不要显示进度表或错误消息;
-#
--progress-bar
显示进度条;
错误
选项
-f
--fail
(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
--retry d2c1e15f2758ae4ead444247148d09ea
--retry-delay 0e72eeb93e8222d25f37582edca0e1bc
--retry-max-time 0e72eeb93e8222d25f37582edca0e1bc
失败重试次数;
重试间隔时间;
最大重试时间;
-S
--show-error
安静模式下显示错误信息;
--stderr 28897b20adb25fbae118a3f80f538dec 错误信息保存文件;
输出 -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 28897b20adb25fbae118a3f80f538dec 转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。
--trace-ascii file 转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;
--trace-time 转储文件中添加时间信息;
-K
--config f6e9e3a277d0a30df37c6f516833faa0
从配置文件中读取参数,参考:http://curl.haxx.se/docs/
-v
--verbose
显示更详细的信息,调试时使用;
帮助 -M
--manual
显示完整的帮助手册;
-h
--help
linux curl用法帮助;

curl -h 的完整参数解释:

-a/--append                             上传文件时,附加到目标文件
--anyauth                               可以使用“任何”身份验证方法
--basic                                 使用HTTP基本验证
-B/--use-ascii                          使用ASCII文本传输
-d/--data 1d029f6197b5a3eb8a3fdf0a088ddf55                        HTTP POST方式传送数据
--data-ascii 1d029f6197b5a3eb8a3fdf0a088ddf55                     以ascii的方式post数据
--data-binary 1d029f6197b5a3eb8a3fdf0a088ddf55                    以二进制的方式post数据
--negotiate                             使用HTTP身份验证
--digest                                使用数字身份验证
--disable-eprt                          禁止使用EPRT或LPRT
--disable-epsv                          禁止使用EPSV
--egd-file 28897b20adb25fbae118a3f80f538dec                       为随机数据(SSL)设置EGD socket路径
--tcp-nodelay                           使用TCP_NODELAY选项
-E/--cert ab8deabf4cd45eca11aef014c6d6b8a0               客户端证书文件和密码 (SSL)
--cert-type 7674b22ef33c73b930516fd6bc30b7a3                      证书文件类型 (DER/PEM/ENG) (SSL)
--key 42538adbdb6240b2b083a000a615d5bd                             私钥文件名 (SSL)
--key-type 7674b22ef33c73b930516fd6bc30b7a3                       私钥文件类型 (DER/PEM/ENG) (SSL)
--pass  49975435ade3d9601b2c4bf28a4fad80                          私钥密码 (SSL)
--engine db20373c7b261c625fd6775baa65beba                          加密引擎使用 (SSL). "--engine list" for list
--cacert 28897b20adb25fbae118a3f80f538dec                         CA证书 (SSL)
--capath 6f655ecf17a4459bb2d05758ed836e3d                    CA目   (made using c_rehash) to verify peer against (SSL)
--ciphers 4309a73696dbaeac0ddd115cebb6f9b7                        SSL密码
--compressed                            要求返回是压缩的形势 (using deflate or gzip)
--connect-timeout 0e72eeb93e8222d25f37582edca0e1bc             设置最大请求时间
--create-dirs                           建立本地目录的目录层次结构
--crlf                                  上传是把LF转变成CRLF
--ftp-create-dirs                       如果远程目录不存在,创建远程目录
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv                              使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip                      使用PASV的时候,忽略该IP地址
--ftp-ssl                               尝试用 SSL/TLS 来进行ftp数据传输
--ftp-ssl-reqd                          要求用 SSL/TLS 来进行ftp数据传输
-F/--form 6ba18088e2b918c3ef0f6dd868ccb2bf                模拟http表单提交数据
-form-string b238fe4bcc80f65141b735e425d51c6a              模拟http表单提交数据
-g/--globoff                            禁用网址序列和范围使用{}和[]
-G/--get                                以get的方式来发送数据
-h/--help                               帮助
-H/--header 15a73cc5312745b1b00671f6e690e36a                      自定义头信息传递给服务器
--ignore-content-length                 忽略的HTTP头信息的长度
-i/--include                            输出时包括protocol头信息
-I/--head                               只显示文档信息
-j/--junk-session-cookies               读取文件时忽略session cookie
--interface a52621469e99ee74f37135d71648579c                 使用指定网络接口/地址
--krb4 d01d6777fee22c1abcc265b0d6170d56                          使用指定安全级别的krb4
-k/--insecure                           允许不使用证书到SSL站点
-K/--config                             指定的配置文件读取
-l/--list-only                          列出ftp目录下的文件名称
--limit-rate 21be5e790c6fad2fa01c2c0c9e771ba6                     设置传输速度
--local-port7a16b29f015c60d23685bc81cbbd96c2                       强制使用本地端口号
-m/--max-time 0e72eeb93e8222d25f37582edca0e1bc                 设置最大传输时间
--max-redirs d2c1e15f2758ae4ead444247148d09ea                      设置最大读取的目录数
--max-filesize 4d5e782727adce28d9e975bcb1fbc12c                  设置最大下载的文件总量
-M/--manual                             显示全手动
-n/--netrc                              从netrc文件中读取用户名和密码
--netrc-optional                        使用 .netrc 或者 URL来覆盖-n
--ntlm                                  使用 HTTP NTLM 身份验证
-N/--no-buffer                          禁用缓冲输出
-p/--proxytunnel                        使用HTTP代理
--proxy-anyauth                         选择任一代理身份验证方法
--proxy-basic                           在代理上使用基本身份验证
--proxy-digest                          在代理上使用数字身份验证
--proxy-ntlm                            在代理上使用ntlm身份验证
-P/--ftp-port 208700f394e4cf40a7aa505373e0130b                 使用端口地址,而不是使用PASV
-Q/--quote 50d4d6a8af5bf45485b99ee0b073768a                        文件传输前,发送命令到服务器
--range-file                            读取(SSL)的随机文件
-R/--remote-time                        在本地生成文件时,保留远程文件时间
--retry d2c1e15f2758ae4ead444247148d09ea                           传输出现问题时,重试的次数
--retry-delay 0e72eeb93e8222d25f37582edca0e1bc                 传输出现问题时,设置重试间隔时间
--retry-max-time 0e72eeb93e8222d25f37582edca0e1bc              传输出现问题时,设置最大重试时间
-S/--show-error                         显示错误
--socks4 aa3755fb6675d042aec4e88952ca7a83                  用socks4代理给定主机和端口
--socks5 aa3755fb6675d042aec4e88952ca7a83                  用socks5代理给定主机和端口
-t/--telnet-option 67aea6ab925e1fd5e2ee4553bfe0973c            Telnet选项设置
--trace 28897b20adb25fbae118a3f80f538dec                          对指定文件进行debug
--trace-ascii 28897b20adb25fbae118a3f80f538dec                    Like --跟踪但没有hex输出
--trace-time                            跟踪/详细输出时,添加时间戳
--url 258c40d94d8689854ad79c4076dd5f96                             Spet URL to work with
-U/--proxy-user 251924df0d6d19e84c42ee228692f6a3       设置代理用户名和密码
-V/--version                    显示版本信息
-X/--request e2b9f03cad787b9644e1f51fd23b7dac          指定什么命令
-y/--speed-time                 放弃限速所要的时间。默认为30
-Y/--speed-limit                停止传输速度的限制,速度时间'秒
-z/--time-cond                  传送时间设置
-0/--http1.0                    使用HTTP 1.0
-1/--tlsv1                      使用TLSv1(SSL)
-2/--sslv2                      使用SSLv2的(SSL)
-3/--sslv3                      使用的SSLv3(SSL)
--3p-quote                      like -Q for the source URL for 3rd party transfer
--3p-url                        使用url,进行第三方传送
--3p-user                       使用用户名和密码,进行第三方传送
-4/--ipv4                       使用IP4
-6/--ipv6                       使用IP6

三、Linux curl命令退出码

下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。

退出码 错误描​​述
1 不支持的协议。此版本的curl不支持此协议。
2 初始化失败。
3 网址格式错误。语法不正确。
5 无法解析代理。无法解析给定的代理主机。
6 无法解析主机。给定的远程主机未解析。
7 无法连接到主机。
8 FTP 奇怪的服务器回复。服务器发送的数据curl无法解析。
9 FTP访问被拒绝。服务器拒绝登录或拒绝访问您想要访问的特定资源或目录。大多数情况下,您尝试更改到服务器上不存在的目录。
11 FTP 奇怪的 PASS 回复。 Curl 无法解析发送到 PASS 请求的回复。
13 FTP 奇怪的 PASV 回复,Curl 无法解析发送到 PASV 请求的回复。
14 FTP 奇怪的 227 格式。 Curl 无法解析服务器发送的 227 行。
15 FTP 无法获取主机。无法解析我们在 227 行中获取的主机 IP。
17 FTP 无法设置二进制。无法将传输方法更改为二进制。
18 部分文件。仅传输了文件的一部分。
19 FTP 无法下载/访问给定文件,RETR(或类似)命令失败。
21 FTP 报价错误。引用命令从服务器返回错误。
22 未检索到 HTTP 页面。未找到请求的 url 或返回另一个错误,HTTP 错误代码为 400 或以上。此返回代码仅在使用 -f/--fail 时出现。
23 写入错误。 Curl 无法将数据写入本地文件系统或类似文件系统。
25 FTP 无法存储文件。服务器拒绝 STOR 操作,用于 FTP 上传。
26 读取错误。各种阅读问题。
27 内存不足。内存分配请求失败。
28 操作超时。根据条件已达到指定的超时时间。
30 FTP 端口失败。 PORT 命令失败。并非所有 FTP 服务器都支持 PORT 命令,请尝试使用 PASV 进行传输!
31 FTP 无法使用 REST。 REST 命令失败。此命令用于恢复 FTP 传输。
33 HTTP 范围错误。范围“命令”不起作用。
34 HTTP 发布错误。内部请求后生成错误。
35 SSL 连接错误。 SSL 握手失败。
36 FTP 下载恢复错误。无法继续先前中止的下载。
37 FILE 无法读取文件。无法打开文件。权限?
38 LDAP 无法绑定。 LDAP 绑定操作失败。
39 LDAP 搜索失败。
41 找不到函数。未找到所需的 LDAP 函数。
42 由回调中止。应用程序告诉curl 中止操作。
43 内部错误。使用错误参数调用函数。
45 接口错误。无法使用指定的传出接口。
47 重定向次数过多。遵循重定向时,curl 达到最大数量。
48 指定了未知的 TELNET 选项。
49 telnet 选项格式错误。
51 对等方的 SSL 证书或 SSH MD5 指纹不正确。
52 服务器没有回复任何内容,这里被认为是一个错误。
53 找不到 SSL 加密引擎。
54 无法将 SSL 加密引擎设置为默认。
55 发送网络数据失败。
56 接收网络数据失败。
58 本地证书有问题。
59 无法使用指定的 SSL 密码。
60 无法使用对等证书进行身份验证已知的 CA 证书。
61 无法识别的传输编码。
62 无效的 LDAP URL。
63 超出最大文件大小。
64 请求的 FTP SSL 级别失败。
65 发送数据需要倒带,但失败。
66 初始化 SSL 失败引擎。
67 用户名、密码或类似内容未被接受,curl 登录失败。
68 在 TFTP 服务器上找不到文件。
69 TFTP 服务器上的权限问题。
70 TFTP 服务器磁盘空间不足。
71 非法 TFTP 操作。
72 未知的 TFTP 传输 ID。
73 文件已存在 (TFTP)。
74 没有这样的用户(TFTP)。
75 字符转换失败。
76 需要字符转换函数。
77 读取 SSL CA 证书时出现问题(路径?访问权限? ).
78 URL 中引用的资源不存在。
79 SSH 会话期间发生未指定的错误。
80 无法关闭 SSL 连接。
82 无法加载 CRL 文件、丢失或格式错误(在 7.19.0 中添加)。
83 颁发者检查失败(在 7.19.0 中添加)。 0).
XX 未来版本中将出现更多错误代码。现有的永远不会改变。

四、常见用法

1、下载(option:-o或者option:-O)

1.1、下载页面:

curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
#要注意-O这里后面的url要具体到某个文件,不然抓不下来
curl -O http://www.linux.com/dodo1.JPG

1.2:循环下载
有时候下载图片可以能是前面的部分名称是一样的,就最后的尾椎名不一样。这样就会把dodo1,dodo2,dodo3,dodo4,dodo5全部保存下来
curl -O http://www.linux.com/dodo[1-5].JPG

1.3:下载重命名
在hello/dodo1.JPG的文件下载下来就会变成hello_dodo1.JPG,其他文件依此类推,从而有效的避免了文件被覆盖
curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG

由于下载的hello与bb中的文件名都是dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下载的会把第一次下载的覆盖,这样就需要对文件进行重命名。
curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG

1.4:分块下载(option:-r)
curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG
curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG
curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG  #这样就可以查看dodo1.JPG的内容了

1.5:通过ftp下载文件(option:-u)
curl可以通过ftp下载文件,curl提供两种从ftp中下载的语法
curl -O -u 用户名:密码 ftp://www.linux.com/dodo1.JPG
curl -O ftp://用户名:密码@www.linux.com/dodo1.JPG

1.6:下载,显示进度条(option:-#)或不显示进度条(option:-s)
curl -# -O http://www.linux.com/dodo1.JPG  
curl -s -O http://www.linux.com/dodo1.JPG

1.7、下载,断点续传(-C ab76cfca1a1dc7ff1291dcdf873f72ec)
断点续转,从文件头的指定位置开始继续下载/上传;offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
curl -C -O http://www.linux.com/dodo1.JPG

2、上传文件(option:-T)

curl -T dodo1.JPG -u 用户名:密码 ftp://www.linux.com/img/

3、伪造来源页面|伪造referer|盗链 (option:-e)

很多服务器会检查http访问的referer从而来控制访问。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的referer地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗连了
#这样就会让服务器其以为你是从www.linux.com点击某个链接过来的
curl -e "www.linux.com" http://mail.linux.com
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

4、伪造代理设备(模仿浏览器)

有些网站需要使用特定的浏览器去访问他们,有些还需要使用某些特定的版本。curl内置option:-A可以让我们指定浏览器去访问网站
curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
#告诉爱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

5、设置http请求

5.1、设置http请求头(或option:-H或option:--head)
curl -H "Cache-Control:no-cache"  http://aiezu.com

5.2、指定proxy服务器以及其端口(option::-x)
#很多时候上网需要用到代理服务器(比如是使用代理服务器上网或者因为使用curl别人网站而被别人屏蔽IP地址的时候),幸运的是curl通过使用内置option:-x来支持设置代理
curl -x 192.168.100.100:1080 http://www.linux.com

6、http响应头

6.1、查看http响应头(option:-I)
# 看看本站的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.2、保存http的response里面的header信息(option:-D)
curl -D cookied.txt http://www.linux.com
执行后cookie信息就被存到了cookied.txt里面了
注意:-c(小写)产生的cookie和-D里面的cookie是不一样的。

7、发送表单数据

curl -F "pic=@logo.png" -F "site=aiezu"  http://aiezu.com/

8、cookie

8.1、发送cookie(option:-b)
#有些网站是使用cookie来记录session信息。对于chrome这样的浏览器,可以轻易处理cookie信息,但在curl中只要增加相关参数也是可以很容易的处理cookie
curl -b "domain=aiezu.com"  http://aiezu.com
#很多网站都是通过监视你的cookie信息来判断你是否按规矩访问他们的网站的,因此我们需要使用保存的cookie信息。内置option: -b
curl -b cookiec.txt http://www.linux.com

8.2、保存http的response里面的cookie信息(option:-c)
执行后http的response里面的cookie信息就被存到了cookiec.txt里面了
curl -c cookiec.txt  http://www.linux.com

9、测试一个网址

9.1、测试一个网址是否可达
curl -v http://www.linux.com

9.2、测试网页返回值(option:-w [format])
curl -o /dev/null -s -w %{http_code} www.linux.com

10、保存访问的网页(>>)

2.1:使用linux的重定向功能保存
curl http://www.linux.com >> linux.html

11、请求方式

curl -i -v -H '' -X POST -d '' http:www.test.com/a/b
其中,-X POST -d, -X GET -d, -X PUT -d 分别等价于-F, -G -d, -P

以post请求为例:
11.1、 -X POST -d
(11.1.1)、POST application/x-www-form-urlencoded
application/x-www-form-urlencoded是默认的
curl -X POST -d "param1=value1¶m2=value2" http://localhost:3000/data
等价于
curl -H "Content-Type:application/x-www-form-urlencoded" -X POST -d "param1=value1¶m2=value2" http://localhost:3000/data
使用数据文件
curl -X POST -d "@data.txt" http://localhost:3000/data
其中data.txt内容如下:param1=value1¶m2=value2

(11.1.2)、POST application/json
curl -H "Content-Type:application/json" -X POST -d '{"key1":"value1","key2":"value2"}' http://localhost:3000/data
使用数据文件的话:
curl -X POST -d "@data.json" http://localhost:3000/data
其中data.json内容如下:{"key1":"value1","key2":"value2"}
再举个例子:
curl -H "Content-type:application/json" -X POST -d "{"app_key":"$appKey","time_stamp":"$time"}" http://www.test.com.cn/a/b

11.2、-F
curl  -v -H "token: 222" -F "file=@/Users/fungleo/Downloads/401.png" localhost:8000/api/v1/upimg 

curl -f http://www.linux.com/error

11.3、其它举例

(11.3.1)、

curl  -X POST "http://www.test.com/e/f" -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8"
-d "a=b"
-d "c=d"
-d "e=f"
-d "g=h"

(11.3.2)、错误:curl -i -G -d "a=b#1&c=d" http://www.test.com/e/f
正确:要把参数值是特殊符号的用urlencode转换过来
curl -i -G -d "a=b#1&c=d" http://www.test.com/e/f

12、调试

curl -v可以显示一次http通信的整个过程,包括端口连接和http request头信息。
如果觉得还不够,那么下面的命令可以查看更详细的通信过程:
curl --trace output.txt www.baidu.com 或者 curl --trace-ascii output.txt www.baidu.com 
运行后,请打开output.txt文件查看。
curl --trace output.txt  http://www.baidu.com
curl --trace-ascii output2.txt  http://www.baidu.com
curl --trace output3.txt --trace-time http://www.baidu.com
curl --trace-ascii output4.txt --trace-time http://www.baidu.com 

举例:有需求每5分钟请求一次http://www.test.com/a/b生成一个日志文件。希望一月的日志(正确的和错误的)能写入一个日志文件
day=`date +%F`
logfile='/var/logs/www.test.com_'`date +%Y%m`'.log'
/usr/bin/echo -e "\n\n[${day}] Start request \n " >> ${logfile}
/bin/curl -v "http://www.test.com/a/b" -d "ccccc" 1>> ${logfile} 2>> ${logfile} --trace-time
/usr/bin/echo -e "\n\n[${day}] End request\n" >> ${logfile}

13、显示抓取错误

curl -f http://www.linux.com/error

相关推荐:《Linux视频教程

以上是linux curl是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn