摘要:本文介绍了Linux curl命令行工具的主要参数,如-A设置User-Agent,-b和-c处理Cookie,-d和--data-urlencode用于POST请求,-H添加HTTP标头,-L跟随重定向,-u设置认证,-x指定代理等,可用于日常HTTP请求操作,甚至替代图形界面工具如Postman。

简介

  在网络通信和API调用中,Linux curl命令是一个功能强大且广泛使用的工具。它可以与各种协议进行通信,如HTTP、HTTPS、FTP等,并支持各种操作,如下载文件、发送请求、测试API等。它功能非常强大,拥有很多参数,能够实现各种诉求,可以这么说,postman能做到的,curl也能做到。本文将从基础开始,介绍curl命令的基本用法,然后深入探讨其高级功能和实用技巧。

  curl的基本语法如下:

curl [options] [URL...]

其中,options代表一系列可选的参数,用于更详细地配置curl的各种特性,URL是请求的资源地址。

  常见的 options 如下:

-A/--user-agent <string>             设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把header信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示http错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent 静音模式。不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
-#/--progress-bar 进度条显示当前的传送状态

  为节约篇幅,案例分析时只贴出部分运行时的输出。

发送get请求

  发送GET请求是获取数据的常用方式。curl命令可以轻松发送GET请求并接收服务器返回的数据。不带有任何参数时,curl 就是发出 GET 请求:

curl https://www.example.com

  上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。

显示通信过程-v

  在调试过程中,-v 选项可以显示一次http通信的详细过程,更容易看到自己设置的的参数是否已生效,包括端口连接和http request头信息,实际使用时,不必每次都添加 -v

curl -v https://www.cnblogs.com/east7

  如果你觉得上面的信息还不够,那么用选项--trace可以查看更详细的通信过程,输出的是原始二进制数据。

curl --trace output.txt https://www.example.com

此命令是把详细的调试信息记录到文件中,便于后期分析。

模仿浏览器 -A

  可以使用选项-A或者-H指定客户端的用户代理标头User-Agent。有些网站需要使用特定的浏览器才能访问,有些还需要使用某些特定的版本;服务器有时会根据这个字段针对不同设备,返回不同格式的网页,比如手机版和桌面版。

  选项-A用来设置客户端的设备信息,即User-Agent,示例如下:

curl -v -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.cnblogs.com/east7

上面的命令将User-Agent改成Chrome浏览器,从下述执行结果截图看,已经成功设置User-Agent:

curl -v -A '' https://www.example.com

  上面命令会移除User-Agent请求头。如果需要在http request请求头中增加一个头信息,就可以使用-H,案例如下:

curl —H "Content-Type:application/json" http://example.com
curl -H 'User-Agent: php/1.0' https://example.com

发送 Cookie -b

  -b参数用来向服务器发送 Cookie。

curl -b 'foo=bar' https://www.example.com

  上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。

curl -b 'foo1=bar;foo2=bar2' https://www.example.com

  上面命令发送两个 Cookie。

curl -b cookies.txt https://www.google.com

  上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

获取cookie -c

  使用-c选项可以将服务器发送的 Cookie 写入一个文件,例如:

curl -c cookies.txt https://www.google.com

  执行上述命令后,将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

伪造来源页面 -e

  -e参数用来设置 HTTP 的请求头 referer,表示请求的来源。很多服务器会检查http访问的referer从而来控制访问权限。比如:你是先访问首页,然后再访问首页中的邮箱页面,这里访问邮箱的referer地址就是访问首页成功后的页面地址,如果服务器发现对邮箱页面访问的referer地址不是首页的地址,就断定那是个盗链了。

curl -v -e 'https://www.cnblogs.com/east7/p/18328518' https://www.example.com

上面命令把请求头referer设为https://www.cnblogs.com/east7/p/18328518

  还可以通过-H选项直接添加请求头信息Referer,达到同样效果:

curl -H 'Referer: https://www.cnblogs.com/east7/p/18328518' https://www.example.com

让服务器其识别到你是从https://www.cnblogs.com/east7/p/18328518过来的。

构造GET请求查询字符串 -G

  -G参数用来构造GET请求 URL 的查询字符串。

curl -G -d 'q=kitties' -d 'count=20' https://www.example.com/search

  上面命令会发出一个 GET 请求,实际请求的 URL 为https://www.example.com/search?q=kitties&count=20。如果省略-G选项,会发出一个 POST 请求。如果数据需要 URL 编码,可以结合--data--urlencode参数。

curl -G --data-urlencode 'comment=hello world' https://www.example.com

添加HTTP请求头 -H

首先,我们来了解一下-H选项的基本功能。它允许用户自定义HTTP头部信息,这些信息可以在发送HTTP请求时附加到请求中。通过添加自定义的头部信息,用户可以实现一些特定的功能,如设置请求头、自定义响应状态码等。这对于网络开发和调试非常有用,而且保证请求的专业性和准确性。

  当您使用-H选项自定义头部信息时,头部信息的语法格式要求较为严格。每一个请求头信息必须以英文冒号(:)开头,后跟key-value pairs,多个key-value 对之间用逗号(,)分隔。

curl -v -H 'token:楼兰胡杨' https://www.example.com

  上面命令添加 HTTP 请求头token:楼兰胡杨,效果如下:

curl -H 'token:楼兰胡杨' -H 'traceId:east7' https://www.example.com

  上面命令添加两个 HTTP 请求头。

curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://www.example.com/login

  上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

显示头信息-i

  -i参数打印出服务器回应的 HTTP 标头和内容。

curl -i https://www.example.com

  上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。-I参数只获取网页的头部信息,而不获取正文内容。这对于查看网页的状态码、服务器类型、响应时间等信息非常有用。

curl -I https://www.example.com

  上面命令输出服务器对 HEAD 请求的回应。

跳过 SSL 检测 -k

  -k 选项指定跳过 SSL 检测。

curl -k https://www.example.com

上面命令不会检查服务器的 SSL 证书是否正确。

跟随重定向 -L

  有时候,服务器会返回重定向 HTTP 状态码 3xx,curl 默认情况下不会自动跟随重定向。可以使用-L 或者 --location 选项会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。

curl -L https://www.example.com/redirected_page

模拟限速 -limit-rate

  -limit-rate 用来限制 HTTP 请求和响应的带宽,模拟慢网速的环境。

curl -limit-rate 20k https://www.example.com

  上面命令将带宽限制在每秒 20k 字节。

设置连接超时

为了避免长时间等待无响应的服务器请求,可以使用选项 --connect-timeout 来设置连接超时时间(以秒为单位)。例如:

curl --connect-timeout 5 https://www.example.com

如果在 5 秒内无法建立连接,curl 将终止请求并返回错误。

文件传送门 -F

  在日常的技术工作中,文件的上传和下载是常见的需求。curl命令作为一个强大的网络工具,可以方便地实现文件的上传和下载功能,而无需依赖其它复杂的工具或服务。本节将结合案例分析简要解读与分析如何使用curl命令进行文件的上传。

  -F参数指定文件路径,以POST请求方式向服务器上传文件。

curl -F "file=@/path/to/file.txt" http://example.com/upload

  上面命令会给 HTTP 请求加上请求头 Content-Type: multipart/form-data,然后将文件file.txt作为file字段上传。-F参数可以指定 MIME 类型,例如:

curl -F 'file=@photo.png;type=image/png' http://example.com/upload

  上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。-F参数也可以指定文件名,例如:

curl -F 'file=@photo.png;filename=me.png' http://example.com/upload

  上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

文件下载 -o

  选项-o(小写)将服务器的响应内容保存到指定文件名的文件,这就等同于使用wget命令了。

curl -o myFile.zip http://example.com/file-to-download.zip

上面命令将下载http://example.com/file-to-download.zip并保存为myFile.zip,重命名了文件名。

文件下载 -O

  -O(大写)参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。通过HTTPS下载文件时,curl会自动处理SSL/TLS连接。

curl -O https://www.example.com/foo/file-to-download.zip

  上面命令将从服务器下载名为file-to-download.zip的文件到当前目录,文件名为file-to-download.zip。温馨提示,这里的目标URL需要具体到某个文件,不然抓不下来。

断点续传 -C

  curl命令支持断点续传,即在下载中断后可以从上次中断的地方继续下载。这对于大文件的下载非常有用。要启用断点续传,可以使用-C -选项。例如:

curl -C - -O http://example.com/large-file.zip

简化输出 -s

  -s参数将不输出错误和进度信息。

curl -s https://www.example.com

  上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。如果想让 curl 不产生任何输出,可以使用下面的命令。

curl -s -o /dev/null https://www.example.com

模拟用户名密码鉴权 -u

  -u参数用来设置服务器认证的用户名和密码。

curl -u 'username:password' https://www.example.com/login

  上面命令设置用户名为username,密码为password。

  curl 能够识别 URL 里面的用户名和密码。

curl https://bob:12345@example.com/login

  上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。

curl -u 'bob' https://www.example.com/login

  上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

设置代理服务器及其端口 -x

  很多场景上网需要用到代理服务器(比如是使用代理服务器上网或者因为使用 curl 别人网站而被别人屏蔽IP地址的时候),我们可以通过使用curl内置option:-x 来支持设置代理,如下所示:

curl -x 192.168.100.100:1080 http://www.baidu.com

  上面命令中,请求的代理使用 HTTP 协议。

指定HTTP请求方式-X

  -X参数指定 HTTP 请求类型(POST/GET/HEAD/DELETE/PUT/PATCH)。例如,用 -X POST 来申明发起POST请求,用 -d 代表传输什么数据。

curl -X POST https://www.example.com

  上面命令对https://www.example.com发出 POST 请求。同样地,我们可以用 -X PUT 和 -X DELETE 来指定其它的请求方法。如果需要发送JSON格式的数据,可以使用-d选项,并指定值为application/json的content-type头。例如:

curl -d '{"key1":"value1", "key2":"value2"}' -H "content-type: application/json" -X POST https://example.com/submitJson

发送 POST 请求-d

  -d参数用于发送 POST 请求的数据体,示例如下:

curl-d "login=楼兰胡杨&password=商丘" -X POST https://www.example.com

  上述命令会发送一个包含表单数据的POST请求。使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。-d参数也可以读取本地文本文件的数据,然后发送到服务器:

curl -d "@data.txt" https://www.example.com/login

  上面命令读取data.txt文件的内容,作为数据体向服务器发送。

  在网络通信和API调用中,发送GET和POST请求是常见的操作。Linux curl命令作为一个功能强大的工具,不仅可以用于文件传输,还可以方便地发送各种类型的HTTP请求。希望本教程能够为您提供一些实用的技巧和示例,让您能够快速上手并熟练运用这个强悍的Linux工具。不断实践和探索 curl 的更多功能,将有助于您更好地理解和处理网络请求与响应,提升在网络编程领域的技能水平。你如果需要进一步的帮助,请随时告诉我!希望你有个美好的一天!

Refference

从基础到高级,带你结合案例深入学习curl命令的更多相关文章

  1. SQL语法基础之高级应用

    SQL语法基础之高级应用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.存储过程与函数 1>.CREATE PROCEDURE 用来创建存储过程 mysql> ? ...

  2. redis的使用和安装,redis基础和高级部分

    redis的使用和安装,redis基础和高级部分 在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数 ...

  3. Redis 宝典 | 基础、高级特性与性能调优

    转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长.     作者:kelgon ...

  4. 最新整理的spring面试题从基础到高级,干货满满

    最新整理的spring面试题从基础到高级,干货满满 前言: 收藏了一些关于Spring的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的理论知识. spring ...

  5. Java并发编程--基础进阶高级(完结)

    Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...

  6. 总结:ARM逻辑和高级C(朱老师物联网学习)

    开始学习朱老师物联网的视频是国庆节的那几天开始的,刚刚开始的时候是想自己在网上找一些嵌入式方面的视频资料,也找了很多的资料臂如“国嵌视频”“达内的视频”,之后也化了十几块钱在淘宝上面买了几十个G的视频 ...

  7. 《SAS编程与数据挖掘商业案例》学习笔记之十六

    <SAS编程与数据挖掘商业案例>学习笔记,本次重点:sas宏变量 内容包含:宏变量.宏函数.宏參数.通配函数.字符函数.计算函数.引用函数.宏语句.宏应用 1.宏触发器: %name-to ...

  8. 《SAS编程和数据挖掘商业案例》学习笔记# 19

    继续<SAS编程与数据挖掘商业案例>学习笔记,本文側重数据处理实践.包含:HASH对象.自己定义format.以及功能强大的正則表達式 一:HASH对象 Hash对象又称散列表,是依据关键 ...

  9. Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马

    Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...

  10. git bash 使用自带 curl 命令出现乱码解决方法

    前言 使用过 git  的小伙伴应该都不会陌生,git 自带一个终端 git bash      类似于 window 自带的 dos git 官网下载:https://git-scm.com/dow ...

随机推荐

  1. Redis集群(cluster模式)搭建(三主三从)

    上一篇搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用.仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理 ...

  2. Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String 解决办法

    使用MyBatis 更新数据库数据的时候 遇到了这个错误: Caused by: java.lang.IllegalArgumentException: invalid comparison: jav ...

  3. 一些Qt样式设计的小积累

    QRadioButton 的设计 QRadioButton分有两个部分,由按钮和背景文字组成. QRadioButton::indicator { ...; // 设置你想要的属性 } QRadioB ...

  4. js回忆录(5),终章

    无论走到哪里,都应该记住,过去都是假的,回忆是一条没有尽头的路,一切以往的春天都不复存在,就连那最坚韧而又狂乱的爱情归根结底也不过是一种转瞬即逝的现实. --马尔克斯 <百年孤独> 人生就 ...

  5. go mod 安装使用 beego

    go module基本使用 // 创建目录,初始化新项目 mkdir beemod cd beemod go mod init beemod 创建 server.go 文件 package main ...

  6. PDF转换:从Word到Excel

    一.引言 在数字化的浪潮中,PDF文件格式以其稳定性和兼容性成为了信息交流的宠儿.然而,当我们需要编辑这些PDF文件时,往往会遇到各种难题.今天,我要和大家分享的,是如何将PDF文件轻松转换成Word ...

  7. StringBuilder的介绍、构造方法及成员方法

    1.StringBuilder的介绍 1.StringBuilder是字符串缓冲区,可以认为是一种容器,能装任何类型的数据,但被装入的数据都会变为字符串 如图 无论是什么类型的数据,被装入字符串缓冲区 ...

  8. study python3【3】前人高度总结出来的不仅仅Pathon的语言习方法

    这是前人写的学习python的经验体会.不单单python,all语言都是如此. 转自https://www.cnblogs.com/nokiaguy/p/9557996.html 感谢分享 下面正文 ...

  9. Java并发并发编程实战-并发容器和同步工具类

    并发容器 ConcurrentHashMap 设计原理 分段锁(JDK 7) :将数据分成多个段(Segment),每个段独立加锁,不同段的操作可并行执行. CAS + synchronized(JD ...

  10. MySQL 中的 MVCC 是什么?

    MySQL 中的 MVCC 是什么? MVCC(Multi-Version Concurrency Control) 是 MySQL 数据库用来处理并发访问的技术,特别是在 InnoDB 存储引擎中, ...