Linux: curl
curl命令使用
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl [options] [URL...]
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器- –basic 使用HTTP基本认证
- –tcp-nodelay 使用TCP_NODELAY选项
- -e/–referer <URL> 来源网址
- –cacert <file> CA证书 (SSL)
- –compressed 要求返回是压缩的格式
- -H/–header <line>自定义首部信息传递给服务器
- -I/–head 只显示响应报文首部信息
- –limit-rate <rate> 设置传输速度
- -u/–user <user[:password]>设置服务器的用户和密码
- -0/–http1.0 使用HTTP 1.0
- -o/–output 把输出写到该文件中
-L : 参数,curl就会跳转到新的网址。有的网址是自动跳转的。使用- -f/–fail 连接失败时不显示http错误
- -s/–silent静音模式。不输出任何东西
- -S/–show-error 显示错误
-k/–insecure 允许不使用证书到SSL站点
另一个工具:elinks
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
Curl 的使用主要分为两大类。
- 网站服务的分析
- 查看网站返回状态如何
- 显示HTTP 通信过程
- 特定场景 IPV6 站点模拟检测
- …
- 功能性用途
- 文件上传/下载文件。如做断点续传
- 多种 HTTP 的请求
- 代理模式
网站服务的分析
http/https服务状态
整个网站服务的故障排查思路
- 进程和 web服务状态
- 查看进程是不是启动的?是不是存在的?
- 进程存在状态是否正常,是 running 的状态还是进入了死锁的状态?
- 网络状态
- 网络是不可达? ping
- TCP 建连是否正常? telnet, tcpdump 等方式抓包
- http/https 服务状态
模拟业务作 http 请求判断返回状态
判断服务端返回的头信息和 body 信息是不是符合我们的预期
工具: curl
- http/https 服务状态(curl)
- 显示返回过程
- 查看 http 通信过程
- 记录 http 通信过程
- 查看返回状态
- http 状态码: 500,404,403 等
- 内容返回: 返回的 body 的内容是不是符合预期
- 显示返回过程
查看网站返回状态如何
一般使用:
curl http://xxx.com #不加选项情况下,默认看到请求体 curl -I www.xxx.com #查看返回头信息 curl -o o.txt xxx.com #支持输出到文件
过滤内容:
[root@y ~]# curl -I www.baidu.com|grep Server
Server: BWS/1.1 想得到这样的过滤内容怎么解决?
法1
curl -I baidu.com -s|grep Server
法2
curl -I www.baidu.com > 1.txt
grep Server 1.txt
Server: BWS/1.1
法3
curl -I baidu.com 2>/dev/null|sed -n '3p'
1)测试:telnet 命令测试http2.2持久连接
telnet WEB_SERVER_IP PORT GET /URL HTTP/1.1 Host:WEB_SERVER_IP 连续回车2次
演示:telnet命令测试持久连接
测试1关闭KeepAlive Off:
[root@centos7 ~]# telnet 172.16.39.200 80 Trying 172.16.39.200... Connected to 172.16.39.200. Escape character is '^]'. GET /index.html HTTP/1.1 Host: 172.16.39.200 #注意从这里按2下回车 HTTP/1.1 200 OK Date: Thu, 14 Jan 2016 03:14:15 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Thu, 14 Jan 2016 03:12:18 GMT ETag: "60101-c-52942a78a0916" Accept-Ranges: bytes Content-Length: 12 Connection: close Content-Type: text/html; charset=UTF-8 <h1>hi</h1> Connection closed by foreign host.
测试2开启长连接KeepAlive On:有限时间内可以添加内容;
[root@centos7 ~]# telnet 172.16.39.200 80 Trying 172.16.39.200... Connected to 172.16.39.200. Escape character is '^]'. GET /VZy2014/vwork HTTP/1.1 Host: handler.cici.com HTTP/1.1 200 OK Date: Thu, 14 Jan 2016 03:17:45 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Thu, 14 Jan 2016 03:12:18 GMT ETag: "60101-c-52942a78a0916" Accept-Ranges: bytes Content-Length: 12 Content-Type: text/html; charset=UTF-8 <h1>hi</h1>
显示HTTP 通信过程
-v 详情
可以看到请求服务端是不是已经发送出去了?并可以看到客户端发送的请求内 容是什么,另外是看到服务端返回的情况。
- 请求头部信息
- 返回头部信息:
- 返回状态码: 100-199 信息响应,但没有完全建立起一次完整 HTTP 请求响应
- 返回状态码: 200-299 成功响应
- 返回状态码: 300-399 重定向,301、302 常见的重定向的状态码
- 返回状态码: 400-499 客户端错误,客户端的请求方式得不到正常响应,需要具体去分析它的状态码
- 返回状态码: 500-599 服务端错误,服务端的程序或者逻辑相关的一些服务响应出现问题
- 返回 body 信息
- L 重定向跳转到新地址
- -e/–referer 提供访问来源
范例:
curl -v -L baidu.com
curl -e 'https://www.baidu.com' -I baidu.com
curl --trave ascii v2.txt http://baidu.com
- -E/–cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
- -A/–user-agent <string> 指定 User-Agent 用户端代理头部
- -H/–header <line>自定义首部信息传递给服务器
范例:
curl -E mycert.pem https://baidu.com #指定本地证书 curl -A 'Mozilla/5.0' -v baidu.com curl -H 'Content-Type:application/json' baidu.com
特定场景 IPV6 站点模拟检测
IPv6 用来解决 IPv4 的 IP 地址不足的问题。
很多网站强制使用 IPv6 ,很多基站或者是自己家的 IP 地址,可以分配到一个 IPv6 的地址。如果你的本地有 IPv6 的地址,而且服务端支持 IPv6 服务,那很有可能你的 DNS 解析就会优先解析 IPv6。
- –resolve 表示做的是域名和 IP 的解析。可以把域名的请求地址手动指定解析到 IPv6 上
curl -6 -vo /dev/null --resolve "static.meituan.net:80:[240e:ff:e02c:1:21::]" "http://baidu.com" # -o /dev/null 表示把请求返回的 body 数据放到本地空设备
功能性用途
代理模式
- -x/–proxy <host[:port]>在给定的端口上使用HTTP代理
curl -x 128.0.0.1:1080 google.com
文件上传/下载文件
文件下载:
curl -O -u 用户名:密码 ftp://baidu.com/a.txt curl -O https://baidu.com/a.txt curl -C https://xxx.com/a.txt #开启自动断点续传
文件上传:
通过 mutipart/form-data, application/x-www-form-urlencoded 等方式发送 POST 请求
多种 HTTP 的请求
#get: curl -v xx.com #post: curl -v -X POST xx.com/test -d 'arg1=11&arg2=22' #put: curl -v -XPUT -d 'arg1=11&arg2=22' xxx.com/test #delete: curl -v -X DELETE xxx.com/test
urlencode 编码
其实我们经常用的 curl 的 –data-urlencode 选项即可实现 urlencode 编码:
curl -v -L -G --data-urlencode 'wd=手机' "http://www.baidu.com/s"
传输限制
还可以这样用: curl -o x.log IP" –speed-time 5 –speed-limit 1
是说将url内容保存到x.log中, 如果传输速度小于1字节/秒的状态持续5秒,该连接就会终止.
指定域名析 IP
curl请求指定host ip(指定域名解析的内网某ip)
curl -H "Host:www.freebuf.com" http://127.0.0.1 s= curl -v --resolve $s:443:127.0.0.1 https://$s/ wget --header="host:y0.xxx.com" https://222.999.999.19/css/yxf.min_cf822c5ae0.css -S -O /dev/null --no-check-certificate curl -XPOST -d '{"pass_key":"bbf79631a4de0836c1b2a796b0"}' -H "Content-Type: application/json" http://10.200.41.37:10435/api/v1/sw_decode_passwd
curl 参数详解
https://curl.se/docs/manpage.html
-a/--append 上传文件时,附加到目标文件
-A/--user-agent <string> 设置用户代理发送给服务器
- anyauth 可以使用“任何”身份验证方法
-b/--cookie <name=string/file> cookie字符串或文件读取位置
- basic 使用HTTP基本验证
-B/--use-ascii 使用ASCII /文本传输
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-d/--data <data> HTTP POST方式传送数据
--data-ascii <data> 以ascii的方式post数据
--data-binary <data> 以二进制的方式post数据
--negotiate 使用HTTP身份验证
--digest 使用数字身份验证
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
-D/--dump-header <file> 把header信息写入到该文件中
--egd-file <file> 为随机数据(SSL)设置EGD socket路径
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer 来源网址
-E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
--cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
--key <key> 私钥文件名 (SSL)
--key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
--pass <pass> 私钥密码 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA证书 (SSL)
--capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密码
--compressed 要求返回是压缩的形势 (using deflate or gzip)
--connect-timeout <seconds> 设置最大请求时间
--create-dirs 建立本地目录的目录层次结构
--crlf 上传是把LF转变成CRLF
-f/--fail 连接失败时不显示http错误
--ftp-create-dirs 如果远程目录不存在,创建远程目录
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F/--form <name=content> 模拟http表单提交数据
-form-string <name=string> 模拟http表单提交数据
-g/--globoff 禁用网址序列和范围使用{}和[]
-G/--get 以get的方式来发送数据
-h/--help 帮助
-H/--header <line>自定义头信息传递给服务器
--ignore-content-length 忽略的HTTP头信息的长度
-i/--include 输出时包括protocol头信息
-I/--head 只显示文档信息
从文件中读取-j/--junk-session-cookies忽略会话Cookie
- 界面<interface>指定网络接口/地址使用
- krb4 <级别>启用与指定的安全级别krb4
-j/--junk-session-cookies 读取文件进忽略session cookie
--interface <interface> 使用指定网络接口/地址
--krb4 <level> 使用指定安全级别的krb4
-k/--insecure 允许不使用证书到SSL站点
-K/--config 指定的配置文件读取
-l/--list-only 列出ftp目录下的文件名称
--limit-rate <rate> 设置传输速度
--local-port<NUM> 强制使用本地端口号
-m/--max-time <seconds> 指定处理的最大时长
--max-redirs <num> 设置最大读取的目录数
--max-filesize <bytes> 设置最大下载的文件总量
-M/--manual 显示全手动
-n/--netrc 从netrc文件中读取用户名和密码
--netrc-optional 使用 .netrc 或者 URL来覆盖-n
--ntlm 使用 HTTP NTLM 身份验证
-N/--no-buffer 禁用缓冲输出
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 选择任一代理身份验证方法
--proxy-basic 在代理上使用基本身份验证
--proxy-digest 在代理上使用数字身份验证
--proxy-ntlm 在代理上使用ntlm身份验证
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-Q/--quote <cmd>文件传输前,发送命令到服务器
-r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围
--range-file 读取(SSL)的随机文件
-R/--remote-time 在本地生成文件时,保留远程文件时间
--retry <num> 传输出现问题时,重试的次数
--retry-delay <seconds> 传输出现问题时,设置重试间隔时间
--retry-max-time <seconds> 传输出现问题时,设置最大重试时间
-s/--silent静音模式。不输出任何东西
-S/--show-error 显示错误
--socks4 <host[:port]> 用socks4代理给定主机和端口
--socks5 <host[:port]> 用socks5代理给定主机和端口
--stderr <file>
-t/--telnet-option <OPT=val> Telnet选项设置
--trace <file> 对指定文件进行debug
--trace-ascii <file> Like --跟踪但没有hex输出
--trace-time 跟踪/详细输出时,添加时间戳
-T/--upload-file <file> 上传文件
--url <URL> Spet URL to work with
-u/--user <user[:password]>设置服务器的用户和密码
-U/--proxy-user <user[:password]>设置代理用户名和密码
-v/--verbose
-V/--version 显示版本信息
-w/--write-out [format]什么输出完成后
-x/--proxy <host[:port]>在给定的端口上使用HTTP代理
-X/--request <command>指定什么命令
-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
-#/--progress-bar 用进度条显示当前的传送状态
-w 输出格式
格式是一个字符串,可以包含纯文本和任意数量的变量。
- “@filename”让 curl 从文件中读取格式,并使用“@-”指示 curl 从标准输入 (stdin) 读取格式。
- 所有变量均以 %{variable_name} 的形式指定
变量
- certs 输出证书链及其详细信息
- content_type 所请求文档的 Content-Type(如果有
- header{name} 传输的最新服务器响应中标头“name”的值
- header_json 包含最近传输的所有 HTTP 响应标头的 JSON 对象。
- http_code 响应代码
- method 最近一次 HTTP 请求中使用的 http 方法
- remote_ip 最近建立的连接的远程 IP 地址 - 可以是 IPv4 或 IPv6
- response_code 上次传输中发现的数字响应代码(以前称为“http_code”)
- size_download 已下载的总字节数。这是已传输的主体/数据的大小,不包括标头。
- size_upload 已上传的总字节数。这是已传输的主体/数据的大小,不包括标头。
- speed_download curl 测量的完整下载过程的平均下载速度。单位为每秒字节数。
- speed_upload curl 测量的完整上传过程的平均上传速度。单位为每秒字节数
- ssl_verify_result 请求的 SSL 对等证书验证的结果。0 表示验证成功。
- time_appconnect SSL握手时间。从开始到 SSL/SSH/等与远程主机连接/握手完成所花费的时间(以秒为单位)。
- time_connect TCP连接时间:从开始直到 TCP 连接到远程主机(或代理)完成所花费的时间(以秒为单位)
- time_namelookup DNS解析时间。从开始到名称解析完成所花费的时间(以秒为单位)。
- time_pretransfer 准备传输时间。从文件传输开始到即将开始所用的时间(以秒为单位)。这包括所有传输前的命令以及与特定协议相关的协商。
- time_starttransfer 首字节时间。从启动到收到第一个字节所需的时间(以秒为单位)。这包括 time_pretransfer 以及服务器计算结果所需的时间。
- time_total 整个操作持续的总时间(以秒为单位)。
范例:
curl -o /dev/null -s -w " DNS解析:%{time_namelookup}s\n\ TCP连接:%{time_connect}s\n\ 9SSL握手:%{time_appconnect}s\n\ 准备传输:%{time_pretransfer}s\n\ 首字节时间(TTFB):%{time_starttransfer}s\n\ 总耗时:%{time_total}s\n\ 下载速度:%{speed_download} bytes/s\n" \ -H "Host: wwww.baidu.com" \ --compressed \ 'https://www.baidu.com/s?wd=curl'