Linux URL 数据传输

LinuxBeginner
立即练习

介绍

欢迎来到 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

这个命令:

  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) 以获取更多信息。