介绍
欢迎来到 Linux URL 数据传输实验。在这个实验中,你将学习如何在 Linux 系统中使用 URL 传输数据。这对于系统管理员、开发人员和安全专家来说是一项基本技能。
我们将学习的主要工具是 curl,它是一个强大的命令行工具,用于使用 URL 语法传输数据。你将学习如何从网站检索数据、将内容保存到文件、使用不同的 HTTP 方法,以及通过各种选项自定义你的请求。
在本实验结束时,你将获得在实际场景中常用的基本数据传输技术的实践经验。
理解 curl 基础
curl 是一个使用 URL 语法传输数据的命令行工具。它支持众多协议,包括 HTTP、HTTPS、FTP 等等。在这一步,你将学习使用 curl 检索网页内容的基本用法。
让我们从打开终端开始。终端应该已经位于 /home/labex/project 目录。如果不是,你可以使用以下命令切换到该目录:
cd ~/project
你的第一个 curl 命令
让我们开始使用 curl 从网站检索内容。输入以下命令:
curl http://example.com
运行此命令后,你应该会在终端中看到 example.com 的 HTML 内容。这个输出包含 HTML 标签和网页的所有内容。输出应该类似于以下内容:
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents...</p>
...
</div>
</body>
</html>
这展示了 curl 最基本的用法——检索 URL 的内容并直接在终端中显示。
理解输出
你看到的输出是服务器返回的原始 HTML 响应。当你使用浏览器访问网站时,浏览器会解释这个 HTML 并将其渲染为格式化的网页。然而,curl 只是向你展示原始内容。
让我们尝试另一个示例,看看不同的内容。运行:
curl https://httpbin.org/json
这次,你应该会看到一个 JSON 响应。输出应该如下所示:
{
"slideshow": {
"author": "Yours Truly",
"date": "date of publication",
"slides": [
{
"title": "Wake up to WonderWidgets!",
"type": "all"
},
{
"items": [
"Why <em>WonderWidgets</em> are great",
"Who <em>buys</em> WonderWidgets"
],
"title": "Overview",
"type": "all"
}
],
"title": "Sample Slide Show"
}
}
如你所见,curl 可以根据服务器提供的内容检索不同类型的数据。
将输出保存到文件
在很多情况下,你可能希望保存检索到的内容,而不仅仅是在终端中查看。在这一步,你将学习如何将 curl 的输出保存到文件中。
使用输出重定向进行保存
保存 curl 命令输出最简单的方法是使用 > 操作符进行重定向。运行以下命令:
curl http://example.com > example.html
此命令从 example.com 检索内容,并将其保存到当前目录下名为 example.html 的文件中。要验证文件是否已创建,请运行:
ls -l example.html
你应该会看到列出的文件及其大小和其他详细信息。
要查看文件的内容,你可以使用 cat 命令:
cat example.html
你应该会看到与之前在终端中显示的相同的 HTML 内容。
使用 curl 的 -o 选项
curl 提供了一个特定的选项 -o(或 --output),用于将检索到的内容保存到文件中。当输出重定向可能会导致问题时,这个选项特别有用。让我们试试看:
curl -o httpbin_data.json https://httpbin.org/json
此命令将来自 httpbin.org 的 JSON 数据保存到名为 httpbin_data.json 的文件中。使用以下命令验证文件是否已创建:
ls -l httpbin_data.json
并使用以下命令查看其内容:
cat httpbin_data.json
创建数据目录
整理文件是个好习惯。让我们创建一个专用的数据目录(如果它还不存在),并将一些内容保存到那里:
mkdir -p data
curl -o data/google_data.txt http://www.google.com
mkdir -p 命令会在 data 目录不存在时创建它。-p 标志确保如果目录已经存在,不会报告错误。
现在,验证文件是否已在数据目录中创建:
ls -l data/google_data.txt
你应该会看到列出的文件及其详细信息。
curl 高级选项
curl 提供了许多选项,让你可以自定义请求。在这一步,你将了解一些最有用的选项。
详细模式
-v(或 --verbose)选项会让 curl 显示关于请求和响应的详细信息。这在调试时特别有用。运行以下命令:
curl -v http://example.com
你应该会看到很多信息,包括:
- curl 发送的请求头
- 连接详情
- 服务器返回的响应头
- 响应的实际内容
输出会类似于以下内容(尽管有些细节会有所不同):
* Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Age: 578793
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Tue, 26 Dec 2023 13:45:32 GMT
< Etag: "3147526947+ident"
< Expires: Tue, 02 Jan 2024 13:45:32 GMT
< Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
< Server: ECS (dcb/7F83)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1256
<
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...
以 * 开头的行是 curl 自身的信息性消息。
以 > 开头的行是请求头。
以 < 开头的行是响应头。
实际内容紧跟在响应头之后。
自定义请求头
有时你需要在请求中发送特定的请求头。你可以使用 -H(或 --header)选项来实现。让我们尝试设置一个自定义的 User-Agent:
curl -H "User-Agent: MyCustomClient/1.0" https://httpbin.org/user-agent
这个命令会向 httpbin.org 发送一个带有自定义 User-Agent 请求头的请求。响应应该会确认接收到了你的自定义 User-Agent:
{
"user-agent": "MyCustomClient/1.0"
}
跟随重定向
默认情况下,curl 不会跟随 HTTP 重定向。你可以使用 -L(或 --location)选项让它跟随重定向。让我们试试看:
curl -L http://github.com
如果没有 -L 选项,你只会得到一个重定向响应。使用 -L 选项后,curl 会跟随重定向并显示最终目标的内容。
让我们在数据目录中创建一个文件,来练习使用这些选项:
curl -v -L -o data/redirect_example.txt http://github.com
这个命令:
- 使用详细模式 (
-v) - 跟随重定向 (
-L) - 将输出保存到
data/redirect_example.txt - 请求 github.com 的内容
验证文件是否已创建:
ls -l data/redirect_example.txt
你应该会看到列出的文件及其详细信息。
HTTP 方法与数据发送
curl 除了默认的 GET 方法外,还支持各种 HTTP 方法。在这一步,你将学习如何使用不同的 HTTP 方法,并在请求中发送数据。
使用 POST 方法
POST 方法通常用于向服务器提交数据。你可以使用 -X 选项指定 HTTP 方法,使用 -d 选项提供数据。让我们试试看:
curl -X POST -d "name=John&age=25" https://httpbin.org/post
这个命令会向 httpbin.org 发送一个包含表单数据的 POST 请求。响应应该会回显你发送的数据:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "25",
"name": "John"
},
"headers": {
"Accept": "*/*",
"Content-Length": "16",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0",
"X-Amzn-Trace-Id": "Root=1-65b..."
},
"json": null,
"origin": "your-ip-address",
"url": "https://httpbin.org/post"
}
发送 JSON 数据
要发送 JSON 数据,你需要指定 Content-Type 请求头。运行以下命令:
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","age":25}' https://httpbin.org/post
响应应该会包含你发送的 JSON 数据:
{
"args": {},
"data": "{\"name\":\"John\",\"age\":25}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "24",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0",
"X-Amzn-Trace-Id": "Root=1-65b..."
},
"json": {
"age": 25,
"name": "John"
},
"origin": "your-ip-address",
"url": "https://httpbin.org/post"
}
使用其他 HTTP 方法
curl 支持所有标准的 HTTP 方法。让我们尝试一个 PUT 请求:
curl -X PUT -d "data=example" https://httpbin.org/put
你也可以尝试一个 DELETE 请求:
curl -X DELETE https://httpbin.org/delete
这些命令中的每一个都会返回一个显示请求详细信息的响应。
让我们将一个 POST 请求的输出保存到一个文件中:
curl -X POST -d "name=John&age=25" -o data/post_response.json https://httpbin.org/post
验证文件是否已创建:
ls -l data/post_response.json
并查看其内容:
cat data/post_response.json
你应该会看到来自 httpbin.org 的 JSON 响应,类似于前面展示的内容。
文件下载与进度监控
curl 非常适合从互联网下载文件。在这一步,你将学习如何下载文件并监控下载进度。
基本文件下载
要下载文件,你可以使用之前学过的 -o 选项。让我们下载一张示例图片:
curl -o data/sample.jpg https://httpbin.org/image/jpeg
这个命令从 httpbin.org 下载一张 JPEG 图片,并将其保存为 sample.jpg 到 data 目录中。
验证文件是否已下载:
ls -l data/sample.jpg
带进度条下载
对于较大的文件下载,查看下载进度很有用。你可以使用 -# 选项来显示进度条:
curl -## -o data/sample_with_progress.jpg https://httpbin.org/image/jpeg
你应该会看到类似这样的进度条:
######################################################################### 100.0%
使用自动命名的输出文件选项
如果你想使用与远程文件相同的文件名,可以使用 -O(大写的 O)选项:
cd data
curl -O https://httpbin.org/image/jpeg
cd ..
这会下载文件并将其保存为 jpeg(URL 的最后一部分)到 data 目录中。
验证文件是否已下载:
ls -l data/jpeg
恢复中断的下载
如果下载中断,你可以使用 -C - 选项来恢复下载:
curl -C - -o data/resume_example.jpg https://httpbin.org/image/jpeg
这会告诉 curl 自动确定从哪里恢复下载。
限制下载速度
你可以使用 --limit-rate 选项来限制下载速度:
curl --limit-rate 100K -o data/rate_limited.jpg https://httpbin.org/image/jpeg
这会将下载速度限制为 100 KB/s。
下载多个文件
你可以使用一条命令下载多个文件:
curl -o data/image1.jpg https://httpbin.org/image/jpeg -o data/image2.png https://httpbin.org/image/png
这会下载一张 JPEG 图片和一张 PNG 图片,并分别将它们保存为 image1.jpg 和 image2.png。
验证两个文件是否都已下载:
ls -l data/image1.jpg data/image2.png
总结
在这个实验中,你学习了如何使用 curl 这个强大的命令行工具来通过 URL 传输数据。你现在已经具备以下方面的实践经验:
- 使用
curl检索网页内容的基本用法 - 使用重定向和
-o选项将curl的输出保存到文件 - 使用高级
curl选项,如详细模式 (-v)、自定义请求头 (-H) 和跟随重定向 (-L) - 使用不同的 HTTP 方法(GET、POST、PUT、DELETE)并发送数据
- 下载文件并监控下载进度
这些技能对于系统管理、Web 开发、API 测试和自动化脚本等许多任务来说都是必不可少的。curl 命令在各个技术领域都被广泛使用,并且几乎在所有的 Linux 发行版、macOS 甚至 Windows 上都可以使用。
当你继续在 Linux 和网络领域探索时,请记住,curl 还有比本实验中所涵盖的更多的选项和功能。你随时可以参考 curl 手册 (man curl) 以获取更多信息。



