从基础到高级,带你结合案例深入学习curl命令
摘要:本文介绍了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 请求:
上面命令向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 默认不跟随重定向。
模拟限速 -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连接。
上面命令将从服务器下载名为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 里面的用户名和密码。
上面命令能够识别 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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南