Linux URL 数据传输

LinuxBeginner
立即练习

介绍

欢迎来到 Linux URL 数据传输实验。在这个实验中,你将学习如何在 Linux 系统中使用 URL 传输数据。这对于系统管理员、开发人员和安全专家来说是一项基本技能。

我们将学习的主要工具是 curl,它是一个强大的命令行工具,用于使用 URL 语法传输数据。你将学习如何从网站检索数据、将内容保存到文件、使用不同的 HTTP 方法,以及通过各种选项自定义你的请求。

在本实验结束时,你将获得在实际场景中常用的基本数据传输技术的实践经验。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 95%。获得了学习者 100% 的好评率。

理解 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

这个命令:

  1. 使用详细模式 (-v)
  2. 跟随重定向 (-L)
  3. 将输出保存到 data/redirect_example.txt
  4. 请求 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.jpgdata 目录中。

验证文件是否已下载:

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.jpgimage2.png

验证两个文件是否都已下载:

ls -l data/image1.jpg data/image2.png

总结

在这个实验中,你学习了如何使用 curl 这个强大的命令行工具来通过 URL 传输数据。你现在已经具备以下方面的实践经验:

  1. 使用 curl 检索网页内容的基本用法
  2. 使用重定向和 -o 选项将 curl 的输出保存到文件
  3. 使用高级 curl 选项,如详细模式 (-v)、自定义请求头 (-H) 和跟随重定向 (-L)
  4. 使用不同的 HTTP 方法(GET、POST、PUT、DELETE)并发送数据
  5. 下载文件并监控下载进度

这些技能对于系统管理、Web 开发、API 测试和自动化脚本等许多任务来说都是必不可少的。curl 命令在各个技术领域都被广泛使用,并且几乎在所有的 Linux 发行版、macOS 甚至 Windows 上都可以使用。

当你继续在 Linux 和网络领域探索时,请记住,curl 还有比本实验中所涵盖的更多的选项和功能。你随时可以参考 curl 手册 (man curl) 以获取更多信息。