curl命令详解
curl简介
curl命令 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。
curl常用方法
将远程文件下载到本地-o并指定名称
# 下载远程文件
## curl -o 本地路径/文件名 远程url
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo --progress
指定请求方式-X
# -X post 指定post请求方式
curl -X post http://www.baidu.com/api
# -X get 指定get请求方式
curl -X get http://www.baidu.com/api
显示响应结果-v
# -v 显示响应结果
## https://请求https
curl -v https://xx.com
## 不加https默认请求http过程
curl -v baidu.com
静默模式 -s
#不产生任何输出
curl -s -o /dev/null https://example.com
携带用户名/密码 -u / --user
# -u 输入账号密码
curl -u 用户名:密码 baidu.com/login
携带请求头-H / --header
# -H 指定自定义请求头
curl -H "请求头" baidu.com
# 采用-H参数设置http头中需要访问的域名,目标地址为ip地址
[root@kubenode1 ~]# curl -H 'Host:nginx-svc.me' http://172.30.200.22
查看服务端响应头 -i
# -i 查看服务端响应头
curl - i ip地址:端口号
# 示例
curl -i baidu.com
只显示http response的头信息 -I
显示更信息的通信过程 --trace
curl --trace output.txt www.sina.com
自动跳转 -L
## -L 请求跟随服务器的重定向
curl -L www.sina.com
模拟dns解析 –-resolve
# 或者采用--resolve参数模拟dns解析,目标地址为域名
curl --resolve nginx-svc.me:80:172.30.200.21 http://nginx-svc.me
# 或者采用-H参数设置http头中需要访问的域名,目标地址为ip地址
curl -H 'Host:nginx-svc.me' http://172.30.200.22
## -s/--silent 静默模式。不输出任何东西
## -k/--insecure 允许不使用证书到SSL站点
## –resolve 模拟dns解析
curl -sk --resolve translate.googleapis.com:443:142.250.0.90
curl http://www.example.com --resolve www.example.com:80:127.0.0.1 --resolve www.example.com:443:127.0.0.1
如服务器转移时,域名仍解析到原服务器,需通过域名指定到新服务器进行相关测试。将WEB请求直接发送到特定IP地址而不使用公共DNS记录(类似修改/etc/hosts文件)。
超时时间
使用curl时,有两个超时时间:一个是连接超时时间
,另一个是数据传输的最大允许时间
。
连接超时时间
用--connect-timeout
参数来指定;数据传输的最大允许时间
用-m
参数来指定。
# 连接超时时间为10秒,最大允许传输时间为20秒
curl --connect-timeout 10 -m 20 "http://XXXXXXX"
curl测网站打开速度
curl -o /dev/null -s -w \
time_namelookup:"\t"%{time_namelookup}"\n"time_connect:"\t\t"%{time_connect}"\n"time_appconnect:"\t"%{time_appconnect}"\n"time_redirect:"\t\t"%{time_redirect}"\n"time_pretransfer:"\t"%{time_pretransfer}"\n"time_starttransfer:"\t"%{time_starttransfer}"\n"time_total:"\t\t"%{time_total}"\n" \
https://www.google.com/
- time_namelookup: DNS 域名解析的时候,就是把 https://zhihu.com 转换成 ip 地址的过程
- time_connect: TCP 连接建立的时间,就是三次握手的时间
- time_appconnect: SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
- time_redirect: 从开始到最后一个请求事务的时间
- time_pretransfer: 从请求开始到响应开始传输的时间
- time_starttransfer: 从请求开始到第一个字节将要传输的时间
- time_total: 这次请求花费的全部时间
发送表单信息
#get
curl example.com/form.cgi?data=xxx
#data
curl -X POST --data "data=xxx" example.com/form.cgi
#使用curl编码
curl -X POST --data-urlencode "data=xxx" example.com/form.cgi #--data-urlencode 同 -d
#JSON 格式的 POST 请求
curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13888888888","password":"test"}' http://example.com/apis/users.json
#发送本地文件中的文字
curl -d '@data.txt' https://example.com/upload # 读取data.txt文件的内容,作为数据体向服务器发送。
文件上传
#假定文件上传表单为:
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
#可通过curl上传
curl --form upload=@localfilename --form press=OK [URL]
#-F 参数用来向服务器上传二进制文件
curl -F 'file=@photo.png' https://example.com/profile
# 上面命令会给 HTTP 请求加上标头 Content-Type: multipart/form-data ,然后将文件photo.png作为file字段上传。
curl -F 'file=@photo.png;type=image/png' https://example.com/profile
# 上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为 application/octet-stream。
curl -F 'file=@photo.png;filename=me.png' https://example.com/profile
# 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。
Referer字段
#在http request头信息中,提供referer字段
curl --referer http://www.example.com http://www.example.com
User Agent字段 --user-agent / -A
#服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。
curl --user-agent "[User Agent]" [URL]
cookie
#向服务器发送 Cookie
curl --cookie "name=xxx" www.example.com
#将cookie另存为一个文件
curl URL --cookie-jar cookie_file
#Cookie 写入一个文件
curl -c cookies.txt https://www.example.com
带宽控制和下载配额
#控制下载速度
curl URL --limit-rate 50k
#控制最大下载文件
curl URL --max-filesize bytes
跳过SSL检测
curl -k https://www.example.com
获取本机外网IP
curl ipecho.net/plain
curl选项
-a --append # 上传文件时,附加到目标文件
-A --user-agent # 设置用户代理发送给服务器
-anyauth # 可以使用“任何”身份验证方法
-b --cookie # cookie字符串或文件读取位置
--basic # 使用HTTP基本验证
-B --use-ascii # 使用ASCII /文本传输
-c --cookie-jar # 操作结束后把cookie写入到这个文件中
-C --continue-at # 断点续传
-d --data # HTTP POST方式传送数据
--data-ascii # 以ascii的方式post数据
--data-binary # 以二进制的方式post数据
--negotiate # 使用HTTP身份验证
--digest # 使用数字身份验证
--disable-eprt # 禁止使用EPRT或LPRT
--disable-epsv # 禁止使用EPSV
-D --dump-header # 把header信息写入到该文件中
--egd-file # 为随机数据(SSL)设置EGD socket路径
--tcp-nodelay # 使用TCP\_NODELAY选项
-e --referer # 来源网址
-E --cert # 客户端证书文件和密码 (SSL)
--cert-type # 证书文件类型 (DER/PEM/ENG) (SSL)
--key # 私钥文件名 (SSL)
--key-type # 私钥文件类型 (DER/PEM/ENG) (SSL)
--pass # 私钥密码 (SSL)
--engine # 加密引擎使用 (SSL). "--engine list" for list
--cacert # CA证书 (SSL)
--capath # CA目录 (made using c\_rehash) to verify peer against (SSL)
--ciphers # SSL密码
--compressed # 要求返回是压缩的形势 (using deflate or gzip)
--connect-timeout # 设置最大请求时间
--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 # 模拟http表单提交数据
--form-string # 模拟http表单提交数据
-g --globoff # 禁用网址序列和范围使用{}和\[]
-G --get # 以get的方式来发送数据
-H --header # 自定义头信息传递给服务器
--ignore-content-length # 忽略的HTTP头信息的长度
-i --include # 输出时包括protocol头信息
-I --head # 只显示请求头信息
-j --junk-session-cookies # 读取文件进忽略session cookie
--interface # 使用指定网络接口/地址
--krb4 # 使用指定安全级别的krb4
-k --insecure # 允许不使用证书到SSL站点
-K --config # 指定的配置文件读取
-l --list-only # 列出ftp目录下的文件名称
--limit-rate # 设置传输速度
--local-port # 强制使用本地端口号
-m --max-time # 设置最大传输时间
--max-redirs # 设置最大读取的目录数
--max-filesize # 设置最大下载的文件总量
-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 # 使用端口地址,而不是使用PASV
-q # 作为第一个参数,关闭 .curlrc
-Q --quote # 文件传输前,发送命令到服务器
-r --range # 检索来自HTTP/1.1或FTP服务器字节范围
--range-file # 读取(SSL)的随机文件
-R --remote-time # 在本地生成文件时,保留远程文件时间
--retry # 传输出现问题时,重试的次数
--retry-delay # 传输出现问题时,设置重试间隔时间
--retry-max-time # 传输出现问题时,设置最大重试时间
-s --silent # 静默模式。不输出任何东西
-S --show-error # 显示错误
--socks4 # 用socks4代理给定主机和端口
--socks5 # 用socks5代理给定主机和端口
--stderr #
-t --telnet-option # Telnet选项设置
--trace # 对指定文件进行debug
--trace-ascii # Like --跟踪但没有hex输出
--trace-time # 跟踪/详细输出时,添加时间戳
-T --upload-file # 上传文件
--url <url> # 要使用的 URL
-u --user # 设置服务器的用户和密码
-U --proxy-user # 设置代理用户名和密码
-w --write-out \[format] # 什么输出完成后
-x --proxy # 在给定的端口上使用HTTP代理
-X --request # 指定什么命令
-y --speed-time # 放弃限速所要的时间,默认为30
-Y --speed-limit # 停止传输速度的限制,速度时间