第 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=PATH | CA 证书包路径 | 自动检测 |
--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 后端对比
| 后端 | 许可证 | 特点 | 适用场景 |
|---|---|---|---|
| OpenSSL | Apache 2.0 | 功能最全,支持最广 | Linux 服务器默认选择 |
| LibreSSL | ISC | OpenBSD 分支,代码更清洁 | macOS(Homebrew)、部分 BSD |
| BoringSSL | BSD-style | Google 维护,不提供稳定 API | 嵌入式(Android、Chrome) |
| GnuTLS | LGPL | GNU 项目 | 发行版自由软件要求 |
| wolfSSL | GPLv2/commercial | 小型嵌入式 TLS | IoT、嵌入式设备 |
| mbedTLS | Apache 2.0 | ARM 维护,轻量级 | 资源受限环境 |
| BearSSL | MIT | 极小体积 | 微控制器 |
| SecureTransport | Apple 专有 | macOS/iOS 原生 | macOS 自带 curl |
| Schannel | Microsoft 专有 | Windows 原生 | Windows 自带 curl |
| Rustls | Apache 2.0/ISC | Rust 实现,内存安全 | 新一代应用 |
查看当前 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 |
注意事项
- 不要混用 TLS 后端:编译时的 TLS 后端和系统其他程序的后端不一致可能导致证书路径问题
- CA 证书包:自定义编译时确保指定正确的 CA 证书包路径(
--with-ca-bundle) - macOS SecureTransport:系统自带 curl 使用 SecureTransport,不支持部分高级 TLS 特性
- 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、请求头、响应头和输出控制。