Drollery Medieval drollery of a knight on a horse

🏆 欢迎来到本站: https://xuchangwei.com/希望这里有你感兴趣的内容

flowery border with man falling
flowery border with man falling

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 用进度条显示当前的传送状态