curl(Command Line URL Viewer),一种常用的命令行工具,用来请求Web服务器,发送网络请求。它支持多种传输协议,包括HTTP、HTTPS、SCP、FTP、TELNET等,可以使用其进行发送请求,上传/下载文件,且支持aksk身份验证,代理支持等。
curl [options] [URL]
-A用来指定客户端的用户代理标头,即User-Agent。有时候server会阻止curl的下载请求,这时可以通过修改User-Agent来模拟正常使用者发出的请求。
curl -A "user-agent-string" [URL]
其中
示例:模拟谷歌浏览器发送请求
curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://www.baidu.com
-b参数用来向服务器发送Cookie。Cookie 是服务器在客户端存储的小段数据,用于跟踪用户的会话状态或记录其他有关用户的信息。
curl -b "" [URL]
curl -b cookie_file [URL]
示例:
向Google发送一个token为abcdef,session_360681199812141356为123456的cookie
curl -b "user_token=abcdef; session_id=123456" https://www.baidu.com
读取本地文件发送到服务器
curl -b cookies.txt https://www.baidu.com
-c参数是将服务器设置的cookie写入一个文件。
curl -c cookies.txt https://www.baidu.com
-b和-c可以配合使用。
-d参数用来发送POST请求的数据体。
curl -X POST https://www.baidu.com -d '{"user_name":"minh", "password":"123456"}'
使用-d参数,HTTP请求会自动加上标头Content-Type : application/x-www-form-urlencoded,并且会自动将请求转为POST方式,因此可以省略-X POST。
-d参数也可以读取本地文本文件的数据作为数据体向服务器发送。示例:
curl -d '@local_file.txt' https://www.baidu.com
注:-d是发送post请求,-F是发送form-data数据,两者不能同时使用,否则会报错。
-data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。示例:发送的字符串中间有个空格,此时需要对其进行URL编码。
curl --data-urlencode 'content=hello world' https://www.baidu.com
-e参数用来设置HTTP的标头Referer,表示请求来源。部分server为了避免盗链问题会确认引用源是否来自同一个网站,此时就要欺骗服务器的检查机制来取得相关资源。
curl -e "www.google.com" https://www.baidu.com
curl -L -v -e ";auto" https://www.baidu.com # 某些连接必须通过301或302跳转过去时,用auto参数来让访问更加真实
-H参数也可以通过直接添加标头Referer达到和-e同样的效果。示例:
curl -H 'Referer: www.google.com' https://www.baidu.com
-F参数用于通过 POST 请求以表单形式发送数据。这个选项主要用于模拟 HTML 表单的文件上传,但也可以用于普通表单字段。
示例:发送username和password两个表单字段。
curl -F "username=minh" -F "password=******" https://www.baidu.com/login
也可以指定文件名,使用 @
符号指定文件路径
curl -F "file=@/path/to/file.txt" https://www.baidu.com/upload
-G参数用于将请求参数附加到URL中,以进行GET请求。该选项会将所有数据作为查询参数附加到URL的末尾,而不是将其放在请求体中。
示例:
curl -G "https://www.baidu.com/search" -d "name=WeThree" -d "category=books"
该请求实际的URL为:https://google.com/search?category=books&name=WeThree
其中,如果需要URL编码,-d可以替换成–data–urlencode
-H参数用于添加HTTP请求的标头。
curl -H 'Content-Type: application/json' https://www.baidu.com/login
curl -H 'Accept-Language: en-US' https://www.baidu.com
-i参数用于打印出服务器回应的HTTP标头。标头和源码都会输出。
curl -i https://www.baidu.com
上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。
-I参数用于向服务器发送HEAD请求,将服务器返回的HTTP标头打印出来。只打印标头
curl -I https://www.baidu.com
等价于
curl -head https://www.baidu.com
-k参数用于忽略SSL证书验证。在默认情况下,curl会验证服务器的SSL证书,确保通信的安全性。然而,有时候你可能连接到一个使用自签名证书或无效证书的服务器,此时你可能会遇到SSL验证失败的问题。
curl -k https://baidu.com
-L参数会让HTTP请求跟随服务器的重定向。curl默认不跟随重定向。比如我们在访问谷歌或百度时,URL
没有加上www
前缀,会自动触发301或302跳转
curl -L https://baidu.com
等价于
curl https://www.baidu.com
–limit-rate参数用来限制HTTP请求和回应的带宽,模拟慢网速的环境。示例:将带宽限制在每秒 200K 字节
curl --limit-rate 200k https://www.baidu.com
-m参数用于设置请求的最大执行时间,即超时时间。如果一个请求在指定的时间内没有完成,curl 将会中止该请求。
curl -m 10 https://www.baidu.com # 单位:s
在实际应用中,设置适当的超时时间是很重要的。如果你的应用程序依赖于远程服务,而这个服务在一定时间内没有响应,你可能希望在超时后采取某些处理措施,例如记录错误、重试请求等。
-o/-O参数将服务器的回应保存成文件,等同于wget命令。区别在于-O会将URL的最后部分当作文件名。
curl -o example.html https://www.example.com # 文件名为example.html
curl -O https://www.example.com/minh/secret.html # 文件名为secret.html
-r参数用于指定一个范围,仅请求文件的一部分而非整个文件。通常用于下载文件的一部分,支持 HTTP、FTP 协议。
curl -r <start>-<end> [URL]
示例:
curl -r 100-500 https://example.com/largefile.zip -o partialfile.zip
指定下载 https://example.com/largefile.zip
文件的第101到501字节的范围,并将其保存为 partialfile.zip
。
需要注意的是,不是所有的服务器都支持范围请求,因此使用 -r
参数时要确保服务器支持这个特性。
如果服务器支持范围请求,它会在响应的 Content-Range
头中返回当前范围的信息。否则,curl
将会下载整个文件。
-s/-S参数用于不输出/只输出错误和进度信息。
curl -s https://www.example.com
如果想让curl不产生任何输出,可以使用:
curl -s -o /dev/null https://www.example.com
-T参数用于向服务器上传文件。它支持多种协议,包括 HTTP、HTTPS、FTP、FTPS 等。
# 上传指定文件到server,并指定上传后的文件名为myfile
curl -T uploadfile -u user:passwd https://www.example.com/upload/myfile
# 上传指定文件到server,并沿用本地文件名
curl -T uploadfile -u user:passwd https://www.example.com/upload/
# -a:使用追加的方式上传文件
curl -T uploadfile -a https://www.example.com/upload/myfile
-u参数用来设置用户名和密码。
curl -u 'username:password' https://www.example.com/login
curl -u 'username' https://www.example.com/login # 只指定用户名
-v参数用于输出一次http通信的完整过程。
curl -v https://www.example.com
–trace参数也用于调试,用于输出请求详细的信息,还会输出原始的二进制数据。
curl --trace - https://www.example.com
curl --trace trace.txt https://www.example.com # 将详细信息输出到指定文件
-w参数用于定义输出格式,允许用户自定义curl命令的输出信息。可以通过指定一系列变量来定义输出格式,这些变量将在请求完成后替换为实际的数据。示例:
curl -w "HTTP status: %{http_code}\nTotal time: %{time_total}\n" https://www.example.com
curl会在请求完成后将http_code和time_total替换成实际数值,并输出到标准输出。常见的输出变量包括:
%{http_code}: 显示HTTP响应状态码;
%{time_total}: 显示请求的总时间;
%{url_effective}: 有效的请求URL;
%{time_namelookup}: DNS解析所花费的时间;
%{time_connect}: 建立连接所花费的时间;
%{time_pretransfer}: 从发起请求到开始传输之间所花费的时间。
完整的输出变量列表参考:curl -w, --write-out documentation
-x参数用于指定HTTP请求的代理,使用代理服务器。
curl -x 111.222.33.4:8888 http://www.baidu.com
# 如果代理服务器需要账号密码,可以使用 -U 或 --proxy-user 来指定
curl -u username:password -x 111.222.33.4:8888 http://www.baidu.com
# 不使用代理访问
curl --noproxy localhost,get.this http://www.baidu.com
-X参数用于指定HTTP请求的方法。
curl -X GET https://www.baidu.com
curl -X PUT https://www.baidu.com/upload?key=minh\&value=golden
curl -X POST https://www.baidu.com/login -d '{"name":"minh", "password":"******"}'
-y/-Y参数用于限制下载速度。
# 限制curl的下载速度在每秒3000字节以内,保持60秒
curl -Y 3000 -y 60 www.example.com
–local-port参数用于强制使用本地端口号
curl --local-port 8888 https://www.example.com
user='minh:123456'
header='Content-Type: application/json'
book_param='{"category":"books", "type":"literature"}'
book_name='name=We Three'
curl -s -G -X GET -u ${user} -H ${header} https://www.example.com -d ${book_param} --data-urlencode ${book_name} -kv
参考:
curl官网文档:https://curl.se/docs/manpage.html