讲解
命令行里访问网络有两大神器,定位不同:wget 专注「下载」,递归整站抓取、断点续传是它的强项;curl 是「HTTP 瑞士军刀」,支持各种协议和请求细节,调试 API 几乎离不开它。macOS 自带 curl 不带 wget,Linux 发行版大多两者都有。
wget 的日常用法:wget URL 下载到当前目录;-c 断点续传(大文件下了一半网络断了,加 -c 接着下);-O 文件名 指定保存名;wget -r 递归抓取整站(慎用,别把别人服务器爬挂了)。
curl 的高频选项:curl URL 把响应打印到终端;-o 文件名 保存;-O 用远端文件名保存;-I 只发 HEAD 请求看响应头(检查状态码、Content-Type 很方便);-L 跟随重定向(很多短链接不加 -L 拿到的只是 302);-s 静默模式(脚本里用);-X POST -d '数据' 发 POST;-H 'Header: 值' 加请求头。调试 API 的组合拳是 curl -s URL | python3 -m json.tool 或配合 jq 美化 JSON。
示例
先看看本机有哪些网络工具可用:
# curl 几乎是所有系统的标配
curl --version | sed -n '1p'
# wget 在 macOS 上默认没有,需要 brew install wget
command -v wget || echo "wget 未安装:macOS 默认不带,可用 curl 或 brew install wget"
实际的网络请求需要联网环境,以下仅作演示:
# 仅示意:下载文件(-c 断点续传,-O 指定文件名)
wget -c https://example.com/big-file.tar.gz
curl -L -o big-file.tar.gz https://example.com/big-file.tar.gz
# 仅示意:只看响应头,检查链接是否有效
curl -I https://ohmygp.com
# 仅示意:调 API 并美化 JSON 输出
curl -s "https://api.example.com/users?page=1" | python3 -m json.tool
# 仅示意:POST 提交 JSON
curl -s -X POST -H "Content-Type: application/json" -d '{"name":"小明"}' https://api.example.com/users
常见坑
- URL 里的 & 没加引号:& 在 shell 里是「后台运行」,URL 含参数必须整体加引号。
- 忘记 -L 跟随重定向:短链接和 http 跳 https 的场景,不加 -L 下载到的是一页跳转提示。
- curl 大文件直接打到终端:二进制内容刷屏甚至搞乱终端显示,记得 -o 存文件。
- 乱用 -k 跳过证书校验:-k/--insecure 会放过中间人攻击,只在确认是内网自签证书时才用,别当成万能修复。
小结
wget 管下载(-c 续传),curl 管一切 HTTP(-I 看头、-L 跟随、-o 保存、-s 静默)。URL 记得加引号。下一节看看软件是怎么装到系统里的:包管理。