侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux curl命令教程:如何传输数据、发送HTTP API请求、获取网页源码(附实例详解和注意事项)

Linux curl命令介绍

curl是一个用来传输数据的命令行工具,它支持多种协议,如HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, POP3, IMAP, SMTP, RTMP, RTSP等。curl可以用来发送或接收文件,执行API请求,测试网站性能,模拟用户行为等。curl的全称是Client URL,意思是客户端的统一资源定位符。

Linux curl命令适用的Linux版本

curl命令在大多数Linux发行版中都是默认安装的,你可以用curl --version命令来查看你的系统中的curl版本和支持的协议。如果你的系统中没有curl命令,你可以用以下命令来安装:

  • 在基于Debian的系统中,如Ubuntu,你可以用sudo apt install curl命令来安装。
  • 在基于Red Hat的系统中,如CentOS,你可以用sudo yum install curl命令来安装。注意,如果你的系统是CentOS 8,你需要用sudo dnf install curl命令来安装,因为CentOS 8使用了新的包管理工具dnf。
  • 在基于Arch的系统中,如Manjaro,你可以用sudo pacman -S curl命令来安装。

安装完成后,你可以用curl --help命令来查看curl的用法和选项。

Linux curl命令的基本语法

curl命令的基本语法是:

curl [options] [URL...]

其中,options是可选的参数,用来指定curl的行为和输出。URL是要传输数据的网址,可以是一个或多个。如果没有指定URL,curl会从标准输入中读取数据。

Linux curl命令的常用选项或参数说明

curl命令有很多选项,可以用来控制curl的行为和输出。以下是一些常用的选项:

选项说明
-A, --user-agent 设置用户代理字符串,用来模拟不同的浏览器或设备
-b, --cookie <name=data>发送cookie数据,可以是一个或多个,用分号分隔
-c, --cookie-jar 保存接收到的cookie数据到指定的文件中
-d, --data 发送POST请求,附带指定的数据,可以是一个或多个,用&分隔
-F, --form <name=content>发送multipart/form-data类型的POST请求,附带指定的表单数据,可以是一个或多个
-G, --get将数据附加到URL后面,发送GET请求
-H, --header 设置请求头,可以是一个或多个
-I, --head只显示响应头,不显示响应体
-i, --include在输出中包含响应头
-L, --location如果服务器返回3xx状态码,自动跟随重定向的URL
-o, --output 将输出保存到指定的文件中,而不是显示在屏幕上
-O, --remote-name将输出保存到一个文件中,文件名由URL的最后一部分决定
-s, --silent不显示错误和进度信息
-u, --user user:password设置用户名和密码,用来进行身份验证
-v, --verbose显示详细的信息,包括请求和响应的头和体
-X, --request 设置请求的方法,如GET, POST, PUT, DELETE等

Linux curl命令的实例

以下是一些使用curl命令的实例,你可以根据你的需要来修改和尝试。

实例1:获取网页的源代码

如果你只输入一个URL,curl会默认发送GET请求,并显示网页的源代码。例如:

[linux@bashcommandnotfound.cn ~]$ curl https://www.bing.com
<!DOCTYPE html>
<html lang="zh" dir="ltr" data-bm="200">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="referrer" content="origin-when-cross-origin" />
    <meta name="robots" content="NOODP" />
    <meta name="msapplication-config" content="/a/sa/sa_config-nine.xml" /><meta name="theme-color" content="#4F4F4F" />
    <meta name="description" content="使用 Microsoft Bing 搜索引擎,即可获得最佳搜索结果和搜索体验。" />
    ...
    
</html>

实例2:下载文件

你可以用curl命令来下载文件,只需要指定文件的URL即可。例如,你可以用以下命令来下载一个图片文件:

[linux@bashcommandnotfound.cn ~]$ curl -O https://www.bing.com/th?id=OGL.9c7f3b6e0f3d4f7c9c9a1f8f0f9c0f7c&rf=LaDigue_1920x1080.jpg&pid=hp

这个命令会将图片文件保存到当前目录中,文件名由URL的最后一部分决定。如果你想指定文件名,你可以用-o选项,如下:

[linux@bashcommandnotfound.cn ~]$ curl -o bing.jpg https://www.bing.com/th?id=OGL.9c7f3b6e0f3d4f7c9c9a1f8f0f9c0f7c&rf=LaDigue_1920x1080.jpg&pid=hp

这个命令会将图片文件保存为bing.jpg。

实例3:上传文件

你可以用curl命令来上传文件,只需要指定文件的路径和目标的URL即可。例如,你可以用以下命令来上传一个文本文件到一个FTP服务器:

[linux@bashcommandnotfound.cn ~]$ curl -u user:password -T file.txt ftp://example.com

这个命令会将file.txt文件上传到example.com的根目录中,-u选项用来设置用户名和密码,-T选项用来指定要上传的文件。如果你想指定上传的目录和文件名,你可以在URL中加上,如下:

[linux@bashcommandnotfound.cn ~]$ curl -u user:password -T file.txt ftp://example.com/upload/new.txt

这个命令会将file.txt文件上传到example.com的upload目录中,并重命名为new.txt。

实例4:发送API请求

你可以用curl命令来发送API请求,只需要指定请求的方法,数据,头部和URL即可。例如,你可以用以下命令来发送一个GET请求,获取一个JSON格式的天气数据:

[linux@bashcommandnotfound.cn ~]$ curl -X GET -H "Content-Type: application/json" https://api.openweathermap.org/data/2.5/weather?q=Hong%20Kong&appid=your_api_key

这个命令会返回一个类似于以下的JSON数据:

{"coord":{"lon":114.1577,"lat":22.2855},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":296.15,"feels_like":296.67,"temp_min":295.15,"temp_max":297.15,"pressure":1018,"humidity":73},"visibility":10000,"wind":{"speed":5.14,"deg":80},"clouds":{"all":75},"dt":1642502400,"sys":{"type":1,"id":9154,"country":"HK","sunrise":1642472408,"sunset":1642511439},"timezone":28800,"id":1819729,"name":"Hong Kong","cod":200}

你可以用-d选项来发送POST请求,附带指定的数据,如下:

[linux@bashcommandnotfound.cn ~]$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice","age":25}' https://example.com/api/users

这个命令会发送一个包含name和age字段的JSON数据到example.com的api/users接口。

实例5:测试网站性能

你可以用curl命令来测试网站的性能,只需要指定-w选项,用来显示指定的信息,如下:

[linux@bashcommandnotfound.cn ~]$ curl -w "@curl-format.txt" -o /dev/null -s https://www.bing.com

这个命令会将网页的输出重定向到/dev/null,即不显示在屏幕上,-s选项用来隐藏错误和进度信息,-w选项用来指定一个文件,该文件中包含了要显示的信息的格式。例如,curl-format.txt文件的内容如下:

time_namelookup:  %{time_namelookup}\n
time_connect:  %{time_connect}\n
time_appconnect:  %{time_appconnect}\n
time_pretransfer:  %{time_pretransfer}\n
time_redirect:  %{time_redirect}\n
time_starttransfer:  %{time_starttransfer}\n
----------\n
time_total:  %{time_total}\n

这个文件中的变量都是curl命令提供的,用来表示不同的时间,如域名解析时间,连接时间,传输时间等。你可以在这里查看所有的变量和含义。运行上面的命令后,你会得到类似于以下的输出:

time_namelookup:  0.004
time_connect:  0.028
time_appconnect:  0.000
time_pretransfer:  0.028
time_redirect:  0.000
time_starttransfer:  0.103
----------
time_total:  0.103

这些信息可以帮助你分析网站的性能和瓶颈。

实例6:显示HTTP状态码

你可以用curl命令来显示HTTP状态码,只需要指定-w选项,用来显示指定的信息,如下:

[linux@bashcommandnotfound.cn ~]$ curl -w "%{http_code}" -o /dev/null -s https://www.bing.com

这个命令会将网页的输出重定向到/dev/null,即不显示在屏幕上,-s选项用来隐藏错误和进度信息,-w选项用来指定要显示的信息,这里是HTTP状态码。运行上面的命令后,你会得到类似于以下的输出:

200

这个输出表示网页的HTTP状态码是200,意味着请求成功。你可以在这里查看所有的HTTP状态码和含义。

实例7:显示HTTP头部

你可以用curl命令来显示HTTP头部,只需要指定-I选项,用来只显示响应头,不显示响应体,如下:

[linux@bashcommandnotfound.cn ~]$ curl -I https://www.bing.com

这个命令会显示网页的HTTP头部信息,如下:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 487
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: _EDGE_S=F=1&SID=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; httponly; domain=bing.com
Set-Cookie: _EDGE_V=1; path=/; httponly; expires=Wed, 17-Jan-2024 06:28:38 GMT; domain=bing.com
Set-Cookie: MUID=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; expires=Wed, 17-Jan-2024 06:28:38 GMT; domain=bing.com
Set-Cookie: MUIDB=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; httponly; expires=Wed, 17-Jan-2024 06:28:38 GMT
X-MSEdge-Ref: Ref A: 9C7F3B6E0F3D4F7C9C9A1F8F0F9C0F7C Ref B: HK2EDGE0915 Ref C: 2023-12-18T06:28:38Z
Date: Mon, 18 Dec 2023 06:28:38 GMT

这些信息可以帮助你了解网页的元数据,如缓存控制,内容类型,内容长度,cookie,日期等。

实例8:显示HTTP体

你可以用curl命令来显示HTTP体,只需要指定-i选项,用来在输出中包含响应头,如下:

[linux@bashcommandnotfound.cn ~]$ curl -i https://www.bing.com

这个命令会显示网页的HTTP头部和HTTP体信息,如下:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 487
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: _EDGE_S=F=1&SID=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; httponly; domain=bing.com
Set-Cookie: _EDGE_V=1; path=/; httponly; expires=Wed, 17-Jan-2024 06:28:38 GMT; domain=bing.com
Set-Cookie: MUID=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; expires=Wed, 17-Jan-2024 06:28:38 GMT; domain=bing.com
Set-Cookie: MUIDB=0F7E3BC9BEC9A1E9B3F1F2C9BFE7F7E9; path=/; httponly; expires=Wed, 17-Jan-2024 06:28:38 GMT
X-MSEdge-Ref: Ref A: 9C7F3B6E0F3D4F7C9C9A1F8F0F9C0F7C Ref B: HK2EDGE0915 Ref C: 2023-12-18T06:28:38Z
Date: Mon, 18 Dec 2023 06:28:38 GMT

<!DOCTYPE html>
<html lang="zh" dir="ltr" data-bm="200">
<head><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1" /><meta name="referrer" content="origin-when-cross-origin" /><meta name="robots" content="NOODP" /><meta name="msapplication-config" content="/a/sa/sa_config-nine.xml" /><meta name="theme-color" content="#4F4F4F" /><meta name="description" content="使用 Microsoft Bing 搜索引擎,即可获得最佳搜索结果和搜索体验。" /><meta name="title" content="Bing" />
    ···
</html>

实例9:模拟用户行为

你可以用curl命令来模拟用户行为,只需要指定-A选项,用来设置用户代理字符串,如下:

[linux@bashcommandnotfound.cn ~]$ curl -A "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1" https://www.bing.com

这个命令会模拟一个iPhone用户访问Bing网站,-A选项用来设置用户代理字符串,这里是一个iPhone的用户代理字符串。你可以在这里查看和选择不同的用户代理字符串,用来模拟不同的浏览器或设备。

实例10:发送cookie数据

你可以用curl命令来发送cookie数据,只需要指定-b选项,用来附带指定的cookie数据,如下:

[linux@bashcommandnotfound.cn ~]$ curl -b "name=alice;age=25" https://bashcommandnotfound.cn

这个命令会发送两个cookie数据,name和age,到bashcommandnotfound.cn网站,-b选项用来附带指定的cookie数据,可以是一个或多个,用分号分隔。你也可以用-c选项,用来保存接收到的cookie数据到指定的文件中,如下:

[linux@bashcommandnotfound.cn ~]$ curl -c cookies.txt https://bashcommandnotfound.cn

这个命令会将接收到的cookie数据保存到cookies.txt文件中,-c选项用来指定要保存的文件名。你也可以用-b选项,用来读取文件中的cookie数据,如下:

[linux@bashcommandnotfound.cn ~]$ curl -b cookies.txt https://bashcommandnotfound.cn

这个命令会读取cookies.txt文件中的cookie数据,并发送到bashcommandnotfound.cn网站,-b选项用来指定要读取的文件名。

实例11:发送表单数据

你可以用curl命令来发送表单数据,只需要指定-F选项,用来附带指定的表单数据,如下:

[linux@bashcommandnotfound.cn ~]$ curl -F "name=alice" -F "age=25" https://example.com/form

这个命令会发送两个表单数据,name和age,到example.com的form接口,-F选项用来附带指定的表单数据,可以是一个或多个。你也可以用@符号,用来指定一个文件作为表单数据的内容,如下:

[linux@bashcommandnotfound.cn ~]$ curl -F "file=@file.txt" https://example.com/form

这个命令会将file.txt文件的内容作为表单数据,发送到example.com的form接口,-F选项用来指定文件的路径和名称。

实例12:跟随重定向

你可以用curl命令来跟随重定向,只需要指定-L选项,用来自动跟随服务器返回的3xx状态码的URL,如下:

[linux@bashcommandnotfound.cn ~]$ curl -L https://example.com/redirect

这个命令会访问example.com的redirect接口,如果服务器返回一个3xx状态码,如301,302,307等,表示重定向到另一个URL,curl会自动跟随该URL,直到得到一个非3xx状态码的响应,-L选项用来开启自动跟随重定向的功能。

实例13:设置请求头

你可以用curl命令来设置请求头,只需要指定-H选项,用来设置指定的请求头,如下:

[linux@bashcommandnotfound.cn ~]$ curl -H "Accept: application/json" -H "Authorization: Bearer your_token" https://example.com/api

这个命令会设置两个请求头,Accept和Authorization,到example.com的api接口,-H选项用来设置指定的请求头,可以是一个或多个。你可以在这里查看所有的请求头和含义。

实例14:设置身份验证

你可以用curl命令来设置身份验证,只需要指定-u选项,用来设置用户名和密码,如下:

[linux@bashcommandnotfound.cn ~]$ curl -u user:password https://example.com/secure

这个命令会设置用户名和密码,user和password,到example.com的secure接口,-u选项用来设置用户名和密码,用冒号分隔。这种方式是使用基本认证(Basic Authentication)的方法,你也可以使用其他的认证方法,如摘要认证(Digest Authentication),OAuth认证等,你可以在这里查看更多的认证方法和选项。

Linux curl命令的注意事项

以下是一些使用curl命令时需要注意的事项:

  • 如果你的URL中包含特殊字符,如空格,引号,问号等,你需要用百分号编码来替换它们,否则curl可能无法正确解析URL。例如,你可以用%20来替换空格,用%22来替换引号,用%3F来替换问号等。你可以在这里查看和转换百分号编码。
  • 如果你的URL中包含变量,如$HOME,你需要用双引号来包裹URL,否则curl可能无法正确解析变量。例如,你可以用以下命令来下载一个文件到你的家目录中:
[linux@bashcommandnotfound.cn ~]$ curl -o "$HOME/file.txt" https://example.com/file.txt
  • 如果你的系统中没有curl命令,你可能会看到以下的错误信息:
[linux@bashcommandnotfound.cn ~]$ curl https://bashcommandnotfound.cn
bash: curl: command not found

这时,你需要根据你的系统类型来安装curl命令,参考上面的Linux curl命令适用的Linux版本一节。

0

评论区