Linux Shell学习--curl命令详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Shell学习--curl命令详解相关的知识,希望对你有一定的参考价值。

curl命令详解

(1)curl介绍

作为一款强力工具,curl支持包括HTTPHTTPSFTP在内的众多协议。它还支持POSTcookie、认证、从指定偏移处下载部分文件、参照页(referer)、用户代理字符串、扩展头部、限速、文件大小限制、进度条等特性。如果要和网页访问序列(web page usagesequence)以及数据检索自动化打交道,那么curl定能助你一臂之力。


(2)curlhelp

curl --help
Usage: curl [options...] <url>
Options: (H) means HTTP/HTTPS only, (F) means FTP only
    --anyauth       Pick "any" authentication method (H)
 -a/--append        Append to target file when uploading (F/SFTP)
    --basic         Use HTTP Basic Authentication (H)
    --cacert <file> CA certificate to verify peer against (SSL)
    --capath <directory> CA directory to verify peer against (SSL)
 -E/--cert <cert[:passwd]> Client certificate file and password (SSL)
    --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)
    --ciphers <list> SSL ciphers to use (SSL)
    --compressed    Request compressed response (using deflate or gzip)
 -K/--config <file> Specify which config file to read
    --connect-timeout <seconds> Maximum time allowed for connection
 -C/--continue-at <offset> Resumed transfer offset
 -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)
 -c/--cookie-jar <file> Write cookies to this file after operation (H)
    --create-dirs   Create necessary local directory hierarchy
    --crlf          Convert LF to CRLF in upload
    --crlfile <file> Get a CRL list in PEM format from the given file
 -d/--data <data>   HTTP POST data (H)
    --data-ascii <data>  HTTP POST ASCII data (H)
    --data-binary <data> HTTP POST binary data (H)
    --data-urlencode <name=data/[email protected]> HTTP POST data url encoded (H)
    --delegation STRING GSS-API delegation permission
    --digest        Use HTTP Digest Authentication (H)
    --disable-eprt  Inhibit using EPRT or LPRT (F)
    --disable-epsv  Inhibit using EPSV (F)
 -D/--dump-header <file> Write the headers to this file
    --egd-file <file> EGD socket path for random data (SSL)
    --engine <eng>  Crypto engine to use (SSL). "--engine list" for list
 -f/--fail          Fail silently (no output at all) on HTTP errors (H)
 -F/--form <name=content> Specify HTTP multipart POST data (H)
    --form-string <name=string> Specify HTTP multipart POST data (H)
    --ftp-account <data> Account data to send when requested by server (F)
    --ftp-alternative-to-user <cmd> String to replace "USER [name]" (F)
    --ftp-create-dirs Create the remote dirs if not present (F)
    --ftp-method [multicwd/nocwd/singlecwd] Control CWD usage (F)
    --ftp-pasv      Use PASV/EPSV instead of PORT (F)
 -P/--ftp-port <address> Use PORT with address instead of PASV (F)
    --ftp-skip-pasv-ip Skip the IP address for PASV (F)
    --ftp-ssl       Try SSL/TLS for ftp transfer (F)
    --ftp-ssl-ccc   Send CCC after authenticating (F)
    --ftp-ssl-ccc-mode [active/passive] Set CCC mode (F)
    --ftp-ssl-control Require SSL/TLS for ftp login, clear for transfer (F)
    --ftp-ssl-reqd  Require SSL/TLS for ftp transfer (F)
 -G/--get           Send the -d data with a HTTP GET (H)
 -g/--globoff       Disable URL sequences and ranges using {} and []
 -H/--header <line> Custom header to pass to server (H)
 -I/--head          Show document info only
 -h/--help          This help text
    --hostpubmd5 <md5> Hex encoded MD5 string of the host public key. (SSH)
 -0/--http1.0       Use HTTP 1.0 (H)
    --ignore-content-length  Ignore the HTTP Content-Length header
 -i/--include       Include protocol headers in the output (H/F)
 -k/--insecure      Allow connections to SSL sites without certs (H)
    --interface <interface> Specify network interface/address to use
 -4/--ipv4          Resolve name to IPv4 address
 -6/--ipv6          Resolve name to IPv6 address
 -j/--junk-session-cookies Ignore session cookies read from file (H)
    --keepalive-time <seconds> Interval between keepalive probes
    --key <key>     Private key file name (SSL/SSH)
    --key-type <type> Private key file type (DER/PEM/ENG) (SSL)
    --krb <level>   Enable Kerberos with specified security level (F)
    --libcurl <file> Dump libcurl equivalent code of this command line
    --limit-rate <rate> Limit transfer speed to this rate
 -l/--list-only     List only names of an FTP directory (F)
    --local-port <num>[-num] Force use of these local port numbers
 -L/--location      Follow Location: hints (H)
    --location-trusted Follow Location: and send auth to other hosts (H)
 -M/--manual        Display the full manual
    --max-filesize <bytes> Maximum file size to download (H/F)
    --max-redirs <num> Maximum number of redirects allowed (H)
 -m/--max-time <seconds> Maximum time allowed for the transfer
    --negotiate     Use HTTP Negotiate Authentication (H)
 -n/--netrc         Must read .netrc for user name and password
    --netrc-optional Use either .netrc or URL; overrides -n
 -N/--no-buffer     Disable buffering of the output stream
    --no-keepalive  Disable keepalive use on the connection
    --no-sessionid  Disable SSL session-ID reusing (SSL)
    --noproxy       Comma-separated list of hosts which do not use proxy
    --ntlm          Use HTTP NTLM authentication (H)
 -o/--output <file> Write output to <file> instead of stdout
    --pass  <pass>  Pass phrase for the private key (SSL/SSH)
    --post301       Do not switch to GET after following a 301 redirect (H)
    --post302       Do not switch to GET after following a 302 redirect (H)
 -#/--progress-bar  Display transfer progress as a progress bar
 -x/--proxy <host[:port]> Use HTTP proxy on given port
    --proxy-anyauth Pick "any" proxy authentication method (H)
    --proxy-basic   Use Basic authentication on the proxy (H)
    --proxy-digest  Use Digest authentication on the proxy (H)
    --proxy-negotiate Use Negotiate authentication on the proxy (H)
    --proxy-ntlm    Use NTLM authentication on the proxy (H)
 -U/--proxy-user <user[:password]> Set proxy user and password
    --proxy1.0 <host[:port]> Use HTTP/1.0 proxy on given port
 -p/--proxytunnel   Operate through a HTTP proxy tunnel (using CONNECT)
    --pubkey <key>  Public key file name (SSH)
 -Q/--quote <cmd>   Send command(s) to server before file transfer (F/SFTP)
    --random-file <file> File for reading random data from (SSL)
 -r/--range <range> Retrieve only the bytes within a range
    --raw           Pass HTTP "raw", without any transfer decoding (H)
 -e/--referer       Referer URL (H)
 -O/--remote-name   Write output to a file named as the remote file
    --remote-name-all Use the remote file name for all URLs
 -R/--remote-time   Set the remote file‘s time on the local output
 -X/--request <command> Specify request command to use
    --retry <num>   Retry request <num> times if transient problems occur
    --retry-delay <seconds> When retrying, wait this many seconds between each
    --retry-max-time <seconds> Retry only within this period
 -S/--show-error    Show error. With -s, make curl show errors when they occur
 -s/--silent        Silent mode. Don‘t output anything
    --socks4 <host[:port]> SOCKS4 proxy on given host + port
    --socks4a <host[:port]> SOCKS4a proxy on given host + port
    --socks5 <host[:port]> SOCKS5 proxy on given host + port
    --socks5-hostname <host[:port]> SOCKS5 proxy, pass host name to proxy
    --socks5-gssapi-service <name> SOCKS5 proxy service name for gssapi
    --socks5-gssapi-nec  Compatibility with NEC SOCKS5 server
 -Y/--speed-limit   Stop transfer if below speed-limit for ‘speed-time‘ secs
 -y/--speed-time    Time needed to trig speed-limit abort. Defaults to 30
 -2/--sslv2         Use SSLv2 (SSL)
 -3/--sslv3         Use SSLv3 (SSL)
    --stderr <file> Where to redirect stderr. - means stdout
    --tcp-nodelay   Use the TCP_NODELAY option
 -t/--telnet-option <OPT=val> Set telnet option
 -z/--time-cond <time> Transfer based on a time condition
 -1/--tlsv1         Use => TLSv1 (SSL)
    --tlsv1.0       Use TLSv1.0 (SSL)
    --tlsv1.1       Use TLSv1.1 (SSL)
    --tlsv1.2       Use TLSv1.2 (SSL)
    --trace <file>  Write a debug trace to the given file
    --trace-ascii <file> Like --trace but without the hex output
    --trace-time    Add time stamps to trace/verbose output
 -T/--upload-file <file> Transfer <file> to remote site
    --url <URL>     Set URL to work with
 -B/--use-ascii     Use ASCII/text transfer
 -u/--user <user[:password]> Set server user and password
 -A/--user-agent <string> User-Agent to send to server (H)
 -v/--verbose       Make the operation more talkative
 -V/--version       Show version number and quit
 -w/--write-out <format> What to output after completion
 -q                 If used as the first parameter disables .curlrc
 
 


(3)curl实战

示例1:不带参数的curl

$ curl URL

不带任何参数,curl会将下载文件输出到stdout,将进度信息输出到stderr


示例2:避免curl命令显示进度信息

可以使用--silent选项。

$ curl --silent URL

[[email protected]_01 curl]# curl http://10.72.10.5:10010 >a.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5346  100  5346    0     0  2931k      0 --:--:-- --:--:-- --:--:-- 5220k
[[email protected]_01 curl]#
[[email protected]_01 curl]#
[[email protected]_01 curl]#
[[email protected]_01 curl]# curl http://10.72.10.5:10010 --silent>a.html
[[email protected]_01 curl]# ll
总用量 8
-rw-r--r--. 1 root root 5346 9月  10 19:36 a.html
[[email protected]_01 curl]#


示例3-O-o选项

-o/--output<file> Write output to <file> instead of stdout

-O/--remote-name   Write output to a file named as the remotefile

选项o表明将下载数据写入文件,而非标准输出中。文件名由自己手工指定,是必要参数。

选项-O表示将下载数据写入文件,不过不需要指定文件名,该文件采用的是从URL中解析出的文件名

如果在URL中找不到文件名,则会产生错误。因此要确保URL指向的是远程文件。Curl http://10.72.10.5:10010/ -O --silent就会显示错误信息,这是因为无法从URL中解析出文件名。

$ curl URL --silent –o filename
$ curl URL --silent -O

[[email protected]_01 curl]# ll
总用量 0
[[email protected]_01 curl]# curl  --silent -O   http://10.72.10.5:10010/index.html
[[email protected]_01 curl]# ll
总用量 8
-rw-r--r--. 1 root root 5346 9月  10 19:45 index.html
[[email protected]_01 curl]# curl  --silent -o a.html   http://10.72.10.5:10010/index.html
[[email protected]_01 curl]# ll
总用量 16
-rw-r--r--. 1 root root 5346 9月  10 19:45 a.html
-rw-r--r--. 1 root root 5346 9月  10 19:45 index.html
[[email protected]_01 curl]#


示例4:显示进度条

如果需要在下载过程中显示形如 # 的进度条,用 --progress代替 --silent

$ curl  --progress -O   http://10.72.10.5:10010/index.html
######################################################################## 100.0%


示例5:断点续传

curl能够从特定的文件偏移处继续下载。可以通过指定一个偏移量来下载部分文件。

$ curl URL/file -C offset

偏移量是以字节为单位的整数。如果只是想断点续传,那么curl不需要指定准确的字节偏移。要是你希望curl推断出正确的续传位置,请使用选项 -C -,就像这样:

$ curl -C - URL

curl会自动计算出应该从哪里开始续传。


示例6:用curl设置参照页字符串

参照页(referer)是位于HTTP头部中的一个字符串,用来标识用户是从哪个页面到达当前页面的。如果用户点击了网页A中的某个链接,那么用户就会转到网页B,网页B头部的参照页字符串会包含网页AURL

一些动态网页会在返回HTML页面前检测参照页字符串。例如,如果用户是通过Google搜索来到了当前网页,网页上会附带显示一个Googlelogo;如果用户是通过手动输入URL来到当前网页,则显示另一个不同的页面。

网站的作者可以根据条件进行判断:如果参照页是www.google.com,那么就返回一个Google页面,否则返回其他页面。

可以用curl命令的 --referer选项指定参照页字符串:

$ curl --referer Referer_URL target_URL

例如:

$ curl --referer http://google.com http://slynux.org


示例7:用curl设置cookie

我们可以用curl来指定并存储HTTP操作过程中使用到的cookie

要指定cookie,使用 --cookie"COOKIES"选项。

cookies需要以name=value的形式来给出。多个cookie之间使用分号分隔。例如:

$ curl http://example.com --cookie "user=slynux;pass=hack"

如果要将cookie另存为一个文件,使用 --cookie-jar选项。例如:

$ curl URL --cookie-jar cookie_file


示例8:用curl设置用户代理字符串

如果不指定用户代理(user agent),一些需要检验用户代理的网页就无法显示。你肯定碰到过有些陈旧的网站只能在InternetExplorerIE)下正常工作。如果使用其他浏览器,这些网站就会提示说它只能用IE访问。这是因为这些网站检查了用户代理。你可以用curl来设置用户代理。

curl --user-agent -A选项用于设置用户代理:

$ curl URL --user-agent "Mozilla/5.0"

其他HTTP头部信息也可以通过curl来发送。用-H"头部信息"传递多个头部信息。例如:

$ curl -H "Host: www.slynux.org" -H "Accept-language: en" URL


示例9:限定curl可占用的带宽

如果带宽有限,又有多个用户共享,为了平稳流畅地分享带宽,我们可以用--limit-rate限制curl的下载速度:

$ curl URL --limit-rate 20k

在命令中用k(千字节)和m(兆字节)指定下载速度限制。


示例10:指定最大下载量

可以用--max-filesize选项指定可下载的最大文件大小:

$ curl URL --max-filesize bytes

如果文件大小超出限制,命令返回一个非0的退出码。如果命令正常运行,返回0


示例11:用curl进行认证

可以用curl的选项 -u完成HTTPFTP认证。

-uusername:password可用来指定用户名和密码。它也可以不指定密码,而在后续的执行过程中按照提示输入密码。例如:

$ curl -u user:pass http://test_auth.com

如果你喜欢经提示后输入密码,只需要使用 -u username即可。例如:

$ curl -u user http://test_auth.com


示例12:只打印响应头部信息(不包括数据部分)

-I/--head          Show document info only

只打印响应头部(response header)有助于进行各种检查或统计。例如,如果要检查某个页面是否能够打开,并不需要下载整个页面内容。只用读取HTTP响应头部就能够知道这个页面是否可用。

检查HTTP头部的一个用法就是在下载之前先获知文件大小。我们可以在下载之前,通过检查HTTP头部中的 Content-Length 参数来得知文件的长度。同样还可以从头部检索出其他一些有用的参数。Last-Modified参数能告诉我们远程文件最后的改动时间。

通过 -I--head 就可以只打印HTTP头部信息,而无须下载远程文件。例如:

[[email protected]_01 curl]# curl -I http://10.72.10.5:10010/index.html
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 10 Sep 2017 12:25:22 GMT
Content-Type: text/html
Content-Length: 5346
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Fri, 18 Aug 2017 09:41:43 GMT
Vary: Accept-Encoding
ETag: "5996b657-14e2"
Accept-Ranges: bytes


示例13-w选项,输出指定格式的内容到标准输出

-w/--write-out<format> What to output after completion

顾名思义,write-out的作用就是输出点什么。curl-w参数用于在一次完整且成功的操作后输出指定格式的内容到标准输出。

输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{variable_name}的格式,如果需要输出%double一下即可,即%%,同时,\n是换行,\r是回车,\tTABcurl会用合适的值来替代输出格式中的变量,所有可用变量如下:

  • url_effective

最终获取的url地址,尤其是当你指定给curl的地址存在301跳转,且通过-L继续追踪的情形。

  • http_code

http状态码,如200成功,301转向,404未找到,500服务器错误等。(The numerical response code that was found in the lastretrieved HTTP(S) or FTP(s) transfer. In 7.18.2 the alias response_code wasadded to show the same info.)

$ curl -I -s -o /dev/null -w %{http_code}"\n"   http://10.72.10.5:10010/index.html
200

  • http_connect

The numericalcode that was found in the last response (from a proxy) to a curl CONNECTrequest. (Added in 7.12.4)

  • time_total

总时间,按秒计。精确到小数点后三位。The total time,in seconds, that the full operation lasted. The time will be displayed withmillisecond resolution.

  • time_namelookup

DNS解析时间,从请求开始到DNS解析完毕所用时间。(The time, in seconds, it took from the start until thename resolving was completed.)

  • time_connect

连接时间,从开始到建立TCP连接完成所用时间,包括前边DNS解析时间,如果需要单纯的得到连接时间,用这个time_connect时间减去前边time_namelookup时间。以下同理,不再赘述。(The time, inseconds, it took from the start until the TCP connect to the remote host (orproxy) was completed.)

  • time_appconnect

连接建立完成时间,如SSL/SSH等建立连接或者完成三次握手时间。(The time, inseconds, it took from the start until the SSL/SSH/etc connect/handshake to theremote host was completed. (Added in 7.19.0))

  • time_pretransfer

开始到准备传输的时间。(The time, in seconds, it took from the start until thefile transfer was just about to begin. This includes all pre-transfer commandsand negotiations that are specific to the particular protocol(s) involved.)

  • time_redirect

重定向时间,包括到最后一次传输前的几次重定向的DNS解析,连接,预传输,传输时间。(The time, inseconds, it took for all redirection steps include name lookup, connect,pretransfer and transfer before the final transaction was started.time_redirect shows the complete execution time for multiple redirections.(Added in 7.12.3))

  • time_starttransfer

开始传输时间。在发出请求之后,Web 服务器返回数据的第一个字节所用的时间(The time, inseconds, it took from the start until the first byte was just about to betransferred. This includes time_pretransfer and also the time the server neededto calculate the result.)

  • size_download

下载大小。(The total amount of bytes that were downloaded.)

  • size_upload

上传大小。(The total amount of bytes that were uploaded.)

  • size_header 

下载的header的大小(The totalamount of bytes of the downloaded headers.)

  • size_request

请求的大小。(The total amount of bytes that were sent in the HTTPrequest.)

  • speed_download

下载速度,单位-字节每秒。(The averagedownload speed that curl measured for the complete download. Bytes per second.)

  • speed_upload

上传速度,单位-字节每秒。(The average upload speed that curl measured for thecomplete upload. Bytes per second.)

  • content_type

就是content-Type (text/html;charset=UTF-8)(TheContent-Type of the requested document, if there was any.)

  • num_connects

Number of newconnects made in the recent transfer. (Added in 7.12.3)

  • num_redirects

Number ofredirects that were followed in the request. (Added in 7.12.3)

  • redirect_url

When a HTTPrequest was made without -L to follow redirects, this variable will show theactual URL a redirect would take you to. (Added in 7.18.2)

  • ftp_entry_path

The initial pathlibcurl ended up in when logging on to the remote FTP server. (Added in 7.15.4)

  • ssl_verify_result

ssl认证结果,返回0表示认证成功。( The result ofthe SSL peer certificate verification that was requested. 0 means theverification was successful. (Added in 7.19.0))

 

 

 

 

 

 


本文出自 “微小信的运维之道” 博客,请务必保留此出处http://weixiaoxin.blog.51cto.com/13270051/1964182

以上是关于Linux Shell学习--curl命令详解的主要内容,如果未能解决你的问题,请参考以下文章

linux shell执行curl提示继续输入无法执行的问题学习与处理

linux shell执行curl提示继续输入无法执行的问题学习与处理

linux中shell curl命令获取http状态码

Linux疑难杂症解决方案100篇-带你学习提速增效的几个常用 shell 命令

Linux curl命令详解

Linux Shell学习--wget命令详解