使用 curl 命令:直接输出结果,逐行解析 – wiki基地

使用 curl 命令:直接输出结果,逐行解析

curl 是一个强大的命令行工具,用于从服务器传输数据或向服务器发送数据。它支持众多协议,包括 HTTP、HTTPS、FTP、SCP、SFTP、TFTP、DICT、TELNET、LDAP 和 FILE。curl 尤其擅长通过 HTTP 协议进行网络请求,并提供各种选项来定制请求的行为。本文将深入探讨如何使用 curl 命令,并逐行解析其输出结果,帮助你更好地理解其运作方式和返回的信息。

curl 命令的基本结构:

curl 命令的基本结构如下:

bash
curl [options] [URL]

  • curl: 调用 curl 工具的命令。
  • [options]: 控制 curl 行为的各种选项,例如指定请求方法、设置头部、传递数据等等。
  • [URL]: 目标 URL,即你想要获取数据的网络地址。

直接输出结果:最简单的用法

最简单的使用方式是直接输入 URL,curl 将尝试获取该 URL 对应的资源并将其输出到标准输出 (通常是你的终端)。

bash
curl https://www.example.com

这个命令会向 https://www.example.com 发送一个 GET 请求,并将服务器返回的 HTML 源码直接打印在你的终端上。 如果你不希望看到这么多 HTML 代码,可以使用 -s (silent) 选项来抑制进度条和错误信息:

bash
curl -s https://www.example.com

逐行解析 curl 输出:理解 HTML 结构

为了更好地理解 curl 输出,我们需要了解 HTML 的基本结构。HTML 是一种标记语言,使用标签来描述网页的结构和内容。

以下是一个简单的 HTML 例子,我们将使用 curl 获取并逐行分析:

“`html






Example Page

Hello, World!

This is a simple example page.

  • Item 1
  • Item 2
  • Item 3


“`

假设我们将此 HTML 保存为 example.html 文件,然后在本地启动一个简单的 HTTP 服务器(例如使用 Python 的 python3 -m http.server)。 现在,我们可以使用 curl 获取该文件:

bash
curl http://localhost:8000/example.html

让我们逐行分析可能出现的输出:

  1. <!DOCTYPE html>: 这是一个文档类型声明 (DOCTYPE),告诉浏览器文档遵循哪个 HTML 标准。 不同的标准会导致浏览器以不同的方式解析和渲染 HTML。

  2. <html lang="en">: 这是 HTML 文档的根元素。 lang="en" 属性指定文档的语言为英语。

  3. <head>: head 标签包含关于 HTML 文档的元数据,例如标题、字符集、视口设置等等。 这些信息不会直接显示在网页上,但对浏览器的行为至关重要。

  4. <meta charset="UTF-8">: 指定文档的字符集为 UTF-8。 UTF-8 是一种广泛使用的字符编码,可以支持各种语言的字符。

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">: 设置视口。 视口是指网页在浏览器窗口中可见的区域。 这个 meta 标签配置了视口的宽度等于设备宽度,并且初始缩放比例为 1.0,确保网页在不同设备上都能正确显示。

  6. <title>Example Page</title>: 定义网页的标题。 标题会显示在浏览器的标签页或窗口的标题栏中。

  7. </head>: 结束 head 标签。

  8. <body>: body 标签包含 HTML 文档的主要内容,即在网页上显示的内容。

  9. <h1>Hello, World!</h1>: 定义一个一级标题。 <h1><h6> 标签用于定义不同级别的标题。

  10. <p>This is a simple example page.</p>: 定义一个段落。

  11. <ul>: 定义一个无序列表。

  12. <li>Item 1</li>: 定义列表中的一个项目。 <li> 标签必须位于 <ul><ol> 标签内。

  13. <li>Item 2</li>: 定义列表中的另一个项目。

  14. <li>Item 3</li>: 定义列表中的第三个项目。

  15. </ul>: 结束 ul 标签。

  16. </body>: 结束 body 标签。

  17. </html>: 结束 html 标签。

通过分析 curl 的输出,你可以了解网页的结构,并确定哪些标签和内容是重要的。 这对于理解网页的布局、提取数据或进行网页抓取非常有用。

处理 HTTP 头部信息: -i 选项

除了 HTML 内容之外,服务器还会返回 HTTP 头部信息,其中包含关于响应的元数据,例如服务器类型、内容类型、状态码等等。 可以使用 -i (include) 选项来查看 HTTP 头部信息。

bash
curl -i https://www.example.com

输出结果类似如下:

“`
HTTP/1.1 200 OK
Age: 248651
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 16 May 2023 10:00:00 GMT
Etag: “3147526947”
Expires: Tue, 23 May 2023 10:00:00 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (phx/5A2F)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256




Example Domain
… (HTML 内容) …


… (HTML 内容) …

“`

让我们逐行分析 HTTP 头部信息:

  1. HTTP/1.1 200 OK: HTTP 状态行。 HTTP/1.1 表示使用的 HTTP 协议版本。 200 OK 表示请求成功。 常见的状态码还包括:

    • 301 Moved Permanently: 请求的资源已永久移动到新的 URL。
    • 404 Not Found: 请求的资源不存在。
    • 500 Internal Server Error: 服务器内部发生错误。
  2. Age: 248651: 表示响应在 CDN 或缓存服务器中缓存了多久(以秒为单位)。

  3. Cache-Control: max-age=604800: 指示浏览器或缓存服务器可以缓存响应的最大时间(以秒为单位)。

  4. Content-Type: text/html; charset=UTF-8: 指定响应的内容类型为 HTML,并且字符集为 UTF-8。

  5. Date: Tue, 16 May 2023 10:00:00 GMT: 服务器生成响应的日期和时间。

  6. Etag: "3147526947": 资源的实体标签(ETag)。 ETag 用于缓存验证,浏览器可以使用 ETag 来判断缓存的资源是否仍然有效。

  7. Expires: Tue, 23 May 2023 10:00:00 GMT: 指定响应过期的日期和时间。

  8. Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT: 资源的最后修改时间。

  9. Server: ECS (phx/5A2F): 提供服务的服务器软件名称和版本。

  10. Vary: Accept-Encoding: 指示服务器根据 Accept-Encoding 请求头的值返回不同的响应。 Accept-Encoding 请求头通常用于指示客户端支持的压缩算法,例如 gzip 或 deflate。

  11. X-Cache: HIT: 指示响应来自缓存服务器,并且缓存命中。

  12. Content-Length: 1256: 响应体的长度(以字节为单位)。

通过分析 HTTP 头部信息,你可以了解服务器的配置、缓存策略、内容类型以及请求的状态。 这对于调试网络问题、优化性能以及理解服务器的行为非常有用。

使用 -v 选项进行详细输出:调试利器

-v (verbose) 选项可以提供更详细的输出,包括请求和响应的头部信息,以及 curl 执行过程中的详细信息。 这对于调试网络问题非常有用。

bash
curl -v https://www.example.com

输出结果类似如下:

“`
* Trying 93.184.216.34:443…
* Connected to www.example.com (93.184.216.34) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=www.example.com
* start date: Oct 12 12:52:18 2022 GMT
* expire date: Oct 11 12:52:18 2023 GMT
* subjectAltName: host “www.example.com” matched cert’s “www.example.com”
* using HTTP/2
* [HTTP/2 (128 bytes)][5]
* [HTTP/2 (128 bytes)][HEADERS]

GET / HTTP/2
Host: www.example.com
User-Agent: curl/7.81.0
Accept: /

  • [HTTP/2 (0 bytes)][13]
  • [HTTP/2 (128 bytes)][HEADERS]
    < HTTP/2 200
    < age: 250000
    < cache-control: max-age=604800
    < content-type: text/html; charset=UTF-8
    < date: Tue, 16 May 2023 10:23:00 GMT
    < etag: “3147526947”
    < expires: Tue, 23 May 2023 10:23:00 GMT
    < last-modified: Thu, 17 Oct 2019 07:18:26 GMT
    < server: ECS (phx/5A2F)
    < vary: Accept-Encoding
    < x-cache: HIT
    < content-length: 1256
    <




Example Domain
… (HTML 内容) …


… (HTML 内容) …

  • Connection #0 to host www.example.com left intact
    “`

让我们逐行分析关键信息:

  • Trying 93.184.216.34:443...: curl 尝试连接到 www.example.com 的 IP 地址和端口。
  • Connected to www.example.com (93.184.216.34) port 443 (#0): curl 成功建立连接。
  • ALPN, offering h2ALPN, offering http/1.1: curl 使用应用层协议协商 (ALPN) 来协商使用的 HTTP 协议版本。 它支持 HTTP/2 和 HTTP/1.1。
  • CAfile: /etc/ssl/certs/ca-certificates.crtCApath: none: 指定用于验证服务器证书的证书颁发机构 (CA) 文件和目录。
  • TLSv1.3 ...: 显示 TLS 握手过程的详细信息。
  • SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256: 显示使用的 TLS 协议版本和加密算法。
  • Server certificate:: 显示服务器的证书信息,包括主题、有效期和备用名称。
  • > GET / HTTP/2: 显示发送的 HTTP 请求。 > 符号表示发送的头部信息。
  • < HTTP/2 200: 显示接收到的 HTTP 响应。 < 符号表示接收到的头部信息。
  • ... (HTML 内容) ...: 显示服务器返回的 HTML 内容。

通过 -v 选项,你可以深入了解 curl 的执行过程,包括连接建立、TLS 握手、HTTP 请求和响应的详细信息。 这对于诊断连接问题、验证 SSL 证书以及调试网络协议非常有用。

总结

curl 是一个强大的命令行工具,可以用于各种网络任务。 理解 curl 命令的输出结果对于调试网络问题、优化性能以及理解服务器的行为非常重要。 通过使用 -i-v 等选项,你可以获取更详细的信息,并深入了解 curl 的运作方式。 通过逐行分析 curl 的输出,你可以更好地掌握网络协议的细节,并成为更熟练的网络开发人员。 掌握 curl 命令及其输出的含义,将极大地提升你处理网络相关问题的能力。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部