强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 02 章:安装与编译

第 02 章:安装与编译

大多数 Linux 和 macOS 系统预装了 curl,但预装版本往往不是最新的。了解如何安装和编译最新版本,是掌握 curl 高级特性的第一步。


2.1 检查当前安装

在安装之前,先检查系统中是否已有 curl 以及它的编译信息:

# 查看版本
curl --version

# 典型输出:
# curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.1.4 zlib/1.3
# Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ...
# Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN ...

# 查看编译选项和特性
curl --version | head -3

# 查看环境变量中 curl 的位置
which curl

# 查看完整路径和版本信息
type -a curl

⚠️ 注意:macOS 自带的 curl 版本通常较旧(7.64 或 7.77),且不支持部分新特性。建议通过 Homebrew 安装更新版本。


2.2 各平台安装方式

Linux — 基于 Debian/Ubuntu

# 使用 APT 安装
sudo apt update
sudo apt install curl

# 查看可用版本
apt list -a curl

# 安装指定版本(如需)
sudo apt install curl=8.5.0-1ubuntu1

# 如果需要最新版本,可使用第三方 PPA 或 Snap
sudo snap install curl

Linux — 基于 RHEL/CentOS/Fedora

# Fedora
sudo dnf install curl

# CentOS/RHEL 8+
sudo dnf install curl

# CentOS/RHEL 7
sudo yum install curl

# 查看版本
rpm -q curl

Linux — 基于 Arch

# Arch Linux(通常已是最新版)
sudo pacman -S curl

# 查看版本信息
pacman -Qi curl

Linux — Alpine(Docker 常用)

# Alpine Linux
apk add curl

# 静态编译版本(适合最小化容器)
apk add --no-cache curl

macOS

# Homebrew 安装(推荐)
brew install curl

# macOS 自带的 curl 在 /usr/bin/curl
# Homebrew 安装的在 /opt/homebrew/bin/curl(Apple Silicon)
# 或 /usr/local/bin/curl(Intel)

# 配置 PATH 优先使用 Homebrew 版本
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

# 验证
which curl
curl --version

💡 提示:macOS 自带的 curl 与 SecureTransport 绑定,Homebrew 版本默认使用 OpenSSL 或 LibreSSL,功能更完整。

Windows

# Windows 10 1803+ 自带 curl(通常是 WinSSL 后端)
curl --version

# 使用 winget 安装
winget install curl.curl

# 使用 Chocolatey 安装
choco install curl

# 使用 Scoop 安装
scoop install curl

# 下载预编译版本
# https://curl.se/windows/ (官方提供 Win64/Win32/ARM64 版本)

多版本管理

# 使用 curl-for-win 构建特定版本
# 项目地址:https://github.com/curl/curl-for-win

# 手动安装到自定义路径
cd /tmp
curl -LO https://curl.se/download/curl-8.7.1.tar.gz
tar xzf curl-8.7.1.tar.gz
cd curl-8.7.1
./configure --prefix=$HOME/.local
make -j$(nproc)
make install

# 验证
~/.local/bin/curl --version

2.3 从源码编译

从源码编译 curl 是获得最新特性和自定义功能的最佳方式。

编译步骤

# 1. 安装编译依赖
# Debian/Ubuntu
sudo apt install build-essential libssl-dev libcurl4-openssl-dev \
  zlib1g-dev libbrotli-dev libnghttp2-dev

# 2. 下载源码
cd /tmp
curl -LO https://curl.se/download/curl-8.7.1.tar.gz
tar xzf curl-8.7.1.tar.gz
cd curl-8.7.1

# 3. 配置编译选项
./configure \
  --prefix=/usr/local \
  --with-openssl \
  --with-nghttp2 \
  --with-brotli \
  --enable-ares \
  --with-libidn2

# 4. 编译
make -j$(nproc)

# 5. 测试(可选,需要较长时间)
make test

# 6. 安装
sudo make install
sudo ldconfig

# 7. 验证
/usr/local/bin/curl --version

常用编译选项

选项说明默认值
--prefix=PATH安装路径前缀/usr/local
--with-openssl使用 OpenSSL 作为 TLS 后端视系统而定
--with-gnutls使用 GnuTLS 作为 TLS 后端
--with-wolfssl使用 wolfSSL 作为 TLS 后端
--with-bearssl使用 BearSSL 作为 TLS 后端
--with-mbedtls使用 mbedTLS 作为 TLS 后端
--with-nghttp2启用 HTTP/2 支持
--enable-ares使用 c-ares 进行异步 DNS
--with-brotli启用 Brotli 压缩
--with-zstd启用 Zstandard 压缩
--with-libssh2启用 SCP/SFTP(基于 libssh2)
--with-libssh启用 SCP/SFTP(基于 libssh)
--with-libidn2启用 IDN(国际化域名)
--disable-shared仅编译静态库
--enable-static同时编译静态库
--with-ca-bundle=PATHCA 证书包路径自动检测
--without-ssl禁用 SSL/TLS 支持

查看当前编译特性

# 查看所有编译时的配置
curl -V

# 输出中的 Features: 行列出了编译时启用的特性
# Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy
#           IDN IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB
#           PSL SPNEGO SSL TLS-SRP UnixSockets zstd

# 查看支持的协议
curl --protocols

# 查看支持的特性
curl --features

2.4 TLS 后端选择

curl 的一个独特之处是它支持多种 TLS 后端,这是安全性与兼容性的重要考量。

TLS 后端对比

后端许可证特点适用场景
OpenSSLApache 2.0功能最全,支持最广Linux 服务器默认选择
LibreSSLISCOpenBSD 分支,代码更清洁macOS(Homebrew)、部分 BSD
BoringSSLBSD-styleGoogle 维护,不提供稳定 API嵌入式(Android、Chrome)
GnuTLSLGPLGNU 项目发行版自由软件要求
wolfSSLGPLv2/commercial小型嵌入式 TLSIoT、嵌入式设备
mbedTLSApache 2.0ARM 维护,轻量级资源受限环境
BearSSLMIT极小体积微控制器
SecureTransportApple 专有macOS/iOS 原生macOS 自带 curl
SchannelMicrosoft 专有Windows 原生Windows 自带 curl
RustlsApache 2.0/ISCRust 实现,内存安全新一代应用

查看当前 TLS 后端

# 查看 TLS 后端
curl --version | head -1
# 输出示例:curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.1.4 ...

# 查看详细的 SSL 信息
curl -v https://example.com 2>&1 | grep -E "SSL|TLS|certificate"

编译时切换 TLS 后端

# 使用 GnuTLS
./configure --with-gnutls

# 使用 wolfSSL
./configure --with-wolfssl=/path/to/wolfssl

# 使用 mbedTLS
./configure --with-mbedtls=/path/to/mbedtls

# 使用 Rustls(需要 curl 7.82+)
./configure --with-rustls=/path/to/rustls

2.5 libcurl:curl 的核心

libcurl 是 curl 命令行工具背后的 C 语言库。理解 libcurl 有助于理解 curl 的工作原理。

libcurl 与 curl 的关系

你的应用程序
├── curl 命令行工具  ←  用户接口
│   └── libcurl       ←  核心库(处理所有网络操作)
├── pycurl (Python)
├── PHP ext-curl
├── node-libcurl
└── 其他绑定          ←  都使用同一个 libcurl

使用 libcurl 的 C 示例

/* 最简单的 libcurl 示例 */
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "curl failed: %s\n",
                    curl_easy_strerror(res));
        }

        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

编译并运行:

gcc -o simple simple.c -lcurl
./simple

libcurl 版本检查

# 查看系统中的 libcurl 版本
pkg-config --modversion libcurl

# 查看 libcurl 头文件位置
pkg-config --cflags libcurl

# 查看 libcurl 链接库位置
pkg-config --libs libcurl

# 查看 libcurl 共享库
ldconfig -p | grep curl

2.6 容器环境安装

在 Docker 容器中安装 curl 时,需要考虑镜像大小和安全:

多发行版 Dockerfile

# Alpine(推荐,最小镜像)
FROM alpine:3.19
RUN apk add --no-cache curl

# Debian slim
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Ubuntu
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Distroless(没有 shell,需要 curl 静态二进制)
FROM gcr.io/distroless/base-debian12
COPY --from=curlimages/curl:latest /usr/bin/curl /usr/bin/curl

最小化安装大小

基础镜像+ curl 后大小增量
alpine:3.19~12 MB+4 MB
debian:bookworm-slim~95 MB+15 MB
ubuntu:22.04~85 MB+18 MB
distroless~25 MB+3 MB

注意事项

  1. 不要混用 TLS 后端:编译时的 TLS 后端和系统其他程序的后端不一致可能导致证书路径问题
  2. CA 证书包:自定义编译时确保指定正确的 CA 证书包路径(--with-ca-bundle
  3. macOS SecureTransport:系统自带 curl 使用 SecureTransport,不支持部分高级 TLS 特性
  4. Windows 路径冲突:Windows 可能同时存在多个 curl(系统自带 + 包管理器安装),注意 PATH 顺序
# 检查 CA 证书包位置
curl -v https://example.com 2>&1 | grep "CAfile"
# 输出示例:* CAfile: /etc/ssl/certs/ca-certificates.crt

# 指定自定义 CA 证书包
curl --cacert /path/to/ca-bundle.crt https://example.com

# 在编译时指定
./configure --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt

扩展阅读


📖 下一章第 03 章:基本用法 — 掌握 curl 的基本操作:GET、POST、请求头、响应头和输出控制。