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 显示错误
另一个工具: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":"bbf79631a4de0836c1b2a796b1280c1474a604da420cc4aa5e200349cf9992c2c14318e75e06b64f4a91b97887359a50"}' -H "Content-Type: application/json" http://10.200.41.37:10435/api/v1/sw_decode_passwd
curl 参数详解
-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 用进度条显示当前的传送状态