未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适用于 Linux 基础 HTTP 请求、SSH 文件传输、目录同步和端口检查练习,不是生产级无人值守传输方案。示例域名、服务器别名、目录及凭据需按实际环境替换,并具备相应访问权限。同步脚本已处理 rsync 与日志管道的失败状态,但成功退出和粗略目录条目数量比较不构成文件内容一致性或业务数据验收;使用 --delete 的镜像会传播删除,不能替代历史版本备份。curl -k 与 wget --no-check-certificate 仅限受控测试,不应用于携带凭据或敏感数据的生产请求。远程到远程 scp 的传输路径取决于实现和选项;rsync的增量传输收益须结合文件变化模式、网络及选项评估,而非普遍性能保证。本次仅作结构审阅,未执行命令或核验外部接口及链接。

网络与数据传输 - curl/wget/scp/rsync 实战

abstract 本文概要

  • curl:HTTP 请求,调 API、下载数据
  • wget:批量下载文件
  • scp:在服务器之间传文件
  • rsync:增量同步,适合许多大量文件重复同步的场景
  • netstat/ss:查看端口和网络连接

curl - 万能 HTTP 客户端

curl(Client URL)支持各种协议,最常用的是 HTTP。数据工程师用它调 API、下载数据、测试接口。

基本请求

# 发送 GET 请求(最基本用法)
curl https://api.example.com/data

# 带参数的 GET 请求
curl "https://api.example.com/orders?date=2026-03-18&limit=100"

# 把响应保存到文件(-o 指定文件名)
curl -o data.json https://api.example.com/data

# 下载文件(-O 保留原文件名)
curl -O https://example.com/dataset.csv

# 断点续传(-C - 从断点继续)
curl -C - -O https://example.com/large_dataset.tar.gz

# 显示下载进度
curl --progress-bar -O https://example.com/dataset.csv

POST 请求(调 API)

# 发送 JSON 数据
curl -X POST \
    -H "Content-Type: application/json" \
    -d '{"user_id": 123, "action": "purchase"}' \
    https://api.example.com/events

# 发送表单数据
curl -X POST \
    -d "username=alice&password=secret" \
    https://example.com/login

# 带认证 token 的请求
curl -X GET \
    -H "Authorization: Bearer your_token_here" \
    https://api.example.com/private/data

# 把 POST body 从文件读取(body 很长时用)
curl -X POST \
    -H "Content-Type: application/json" \
    -d @request_body.json \
    https://api.example.com/batch

实用选项

# -v 查看详细请求/响应信息(调试时用)
curl -v https://api.example.com/data

# -s 静默模式(不显示进度和错误,脚本中用)
curl -s https://api.example.com/data

# -L 跟随重定向
curl -L https://example.com/redirect_url

# -k 忽略 SSL 证书验证(测试自签名证书时用)
curl -k https://internal-api.company.com/data

# --connect-timeout 设置连接超时(秒)
curl --connect-timeout 10 https://api.example.com/data

# -w 输出响应信息(HTTP 状态码等)
curl -s -o /dev/null -w "%{http_code}" https://api.example.com/health
# 输出:200 (状态码)

数据工作场景

# 场景 1:调用数据平台 API 获取数据
response=$(curl -s \
    -H "Authorization: Bearer ${API_TOKEN}" \
    "https://data-platform.company.com/api/v1/reports?date=${today}")

echo "$response" | python3 -m json.tool   # 格式化 JSON 查看

# 场景 2:检查数据接口是否正常(健康检查脚本)
status=$(curl -s -o /dev/null -w "%{http_code}" \
    --connect-timeout 5 \
    https://data-api.company.com/health)

if [ "$status" != "200" ]; then
    echo "告警:数据API不可用,状态码:$status"
fi

# 场景 3:触发数据管道(通过 Webhook)
curl -X POST \
    -H "Content-Type: application/json" \
    -d "{\"date\": \"${today}\", \"pipeline\": \"daily_etl\"}" \
    https://pipeline.company.com/trigger

wget - 批量下载文件

wget 专门用于下载文件,支持断点续传和批量下载。

# 下载文件
wget https://example.com/dataset.csv

# 下载并重命名
wget -O my_data.csv https://example.com/dataset.csv

# 断点续传(-c 参数)
wget -c https://example.com/large_file.tar.gz

# 后台下载(适合大文件)
wget -b https://example.com/large_dataset.tar.gz
# 进度保存在 wget-log 文件中

# 限速下载(避免占满带宽)
wget --limit-rate=5m https://example.com/big_data.csv

# 批量下载(从文件读取 URL 列表)
# urls.txt 每行一个 URL
wget -i urls.txt -P /data/downloads/

# 下载整个目录(简单的网站镜像)
wget -r -np -nH --cut-dirs=2 https://data.example.com/datasets/2026/

# 不检查 TLS 证书(仅限受控测试;可能遭受中间人攻击,不用于生产敏感数据传输)
wget --no-check-certificate https://internal.company.com/data.csv

scp - 服务器间传文件

scp(Secure Copy)基于 SSH,用法直观。适合偶尔传文件,不适合同步大量文件。

# 上传:本地 → 服务器
scp 本地文件 用户名@服务器:目标路径
scp data.csv alice@192.168.1.100:/home/alice/data/
scp data.csv dev-server:/data/input/    # 使用 SSH 配置别名

# 下载:服务器 → 本地
scp 用户名@服务器:远程文件 本地路径
scp alice@192.168.1.100:/data/result.csv ./
scp dev-server:/data/report.csv /local/reports/

# 传整个目录(-r 递归)
scp -r /local/scripts/ alice@192.168.1.100:/home/alice/scripts/
scp -r alice@192.168.1.100:/data/output/ ./output/

# 指定端口
scp -P 2222 data.csv alice@192.168.1.100:/data/

# 显示进度(-v 详细模式)
scp -v large_file.tar.gz alice@192.168.1.100:/data/

# 服务器之间传文件(是否经本地中转取决于 OpenSSH 版本、协议模式及选项)
scp alice@server1:/data/file.csv alice@server2:/data/

warning scp 的局限

  • 不支持断点续传,传大文件中断后要从头开始
  • 不支持增量同步,每次传整个文件
  • 大量文件时效率低

以上场景用 rsync 代替。


rsync - 增量同步利器

rsync 是常用的文件同步工具:支持增量传输、保留部分传输文件以便重试,以及压缩;实际效果取决于文件变化模式、网络和选项。

# 基本语法
rsync [选项] 源 目标

# 本地同步(把 src/ 同步到 dst/)
rsync -av /data/src/ /data/dst/
# -a:归档模式(保留权限、时间戳、软链接等),等于 -rlptgoD
# -v:详细输出

# 同步到远程服务器
rsync -av /local/data/ alice@192.168.1.100:/remote/data/

# 从远程服务器同步到本地
rsync -av alice@192.168.1.100:/remote/data/ /local/data/

# 压缩传输(网络带宽有限时用)
rsync -avz /data/ alice@192.168.1.100:/data/
# -z:传输时压缩

# 保留部分传输文件以便重试(大文件传输时可按需使用)
rsync -av --partial /large_file.tar.gz alice@192.168.1.100:/data/
# --partial:保留部分传输的文件,中断后可继续

# 删除目标中源不存在的文件(真正的同步)
rsync -av --delete /data/src/ alice@192.168.1.100:/data/dst/

# 显示传输进度
rsync -av --progress /data/ alice@192.168.1.100:/data/

# 试运行(不实际传输,只显示会做什么)
rsync -avn /data/src/ /data/dst/
# -n 或 --dry-run

# 排除特定文件或目录
rsync -av --exclude="*.tmp" --exclude=".git" /data/ /backup/

# 使用 SSH 配置别名
rsync -avz /data/ dev-server:/data/

tip rsync 的神级用法:增量备份

# 每天更新镜像,传输变化的文件;--delete 会传播删除,不保留历史版本
rsync -avz --delete \
    /data/warehouse/ \
    backup-server:/backup/warehouse/ \
    >> /var/log/rsync/backup_$(date +%Y%m%d).log 2>&1

# 加上 --link-dest 可以做硬链接增量备份(节省空间)
rsync -av --delete \
    --link-dest=/backup/2026-03-17/ \
    /data/warehouse/ \
    /backup/2026-03-18/

网络连接检查

netstat - 查看网络连接和端口

# 查看所有监听的端口(服务是否启动)
netstat -tlnp
# -t:TCP 连接
# -l:只显示监听状态
# -n:显示数字形式(不解析主机名和服务名)
# -p:显示进程 PID 和程序名(需要 root 权限)

# 查看所有 TCP 连接
netstat -tn

# 检查特定端口是否在监听
netstat -tlnp | grep :8080
netstat -tlnp | grep :3306   # MySQL 是否在监听

# 查看所有网络连接(包括 UDP)
netstat -anlp

ss - 比 netstat 更快的替代品

# ss 是 netstat 的现代替代品,速度更快
# 常用参数和 netstat 类似

# 查看所有监听端口
ss -tlnp

# 查看特定端口
ss -tlnp | grep :9092   # Kafka 是否在监听

# 查看所有 TCP 连接
ss -tn

# 查看 ESTABLISHED 状态的连接
ss -tn state established

其他网络命令

# ping:测试网络连通性
ping 192.168.1.100
ping -c 4 google.com    # 只 ping 4 次

# traceroute:路由追踪
traceroute 192.168.1.100

# nslookup / dig:域名解析
nslookup api.example.com
dig api.example.com

# telnet:测试端口连通性(简单好用)
telnet 192.168.1.100 3306   # 测试 MySQL 端口是否可达

# nc(netcat):更强大的端口测试
nc -zv 192.168.1.100 8080   # 测试端口

实战:数据文件批量传输脚本

#!/bin/bash
# 场景:每天把处理好的数据文件同步到数据服务器

set -eo pipefail

DATE=$(date +%Y-%m-%d)
SOURCE_DIR="/data/processed/${DATE}/"
TARGET_SERVER="data-server"
TARGET_DIR="/data/shared/${DATE}/"
LOG_FILE="/var/log/sync/sync_${DATE}.log"

mkdir -p "$(dirname $LOG_FILE)"

echo "$(date '+%Y-%m-%d %H:%M:%S') 开始同步数据到 ${TARGET_SERVER}..." | tee -a "$LOG_FILE"

# 确保目标目录存在
ssh "${TARGET_SERVER}" "mkdir -p ${TARGET_DIR}"

# 同步文件(断点续传 + 压缩 + 进度)
if rsync -avz --partial --progress \
    "${SOURCE_DIR}" \
    "${TARGET_SERVER}:${TARGET_DIR}" \
    2>&1 | tee -a "$LOG_FILE"; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') 同步成功" | tee -a "$LOG_FILE"

    # 粗略比较目录条目数量(不验证文件内容完整性或一致性)
    local_count=$(ls "${SOURCE_DIR}" | wc -l)
    remote_count=$(ssh "${TARGET_SERVER}" "ls ${TARGET_DIR} | wc -l")

    echo "本地文件数:${local_count},远程文件数:${remote_count}" | tee -a "$LOG_FILE"

    if [ "$local_count" != "$remote_count" ]; then
        echo "警告:文件数量不一致!" | tee -a "$LOG_FILE"
        exit 1
    fi
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') 同步失败!" | tee -a "$LOG_FILE"
    exit 1
fi

快速参考

命令 用途 常用参数
curl -o file URL 下载文件 -H 请求头,-d 请求体,-X 方法
wget URL 下载文件 -c 断点续传,-b 后台,-i 批量
scp file server:/path 上传文件 -r 目录,-P 端口
rsync -avz src/ dst/ 增量同步 --delete 删除多余,--partial 断点
ss -tlnp 查看监听端口 grep :端口号 过滤
ping host 测试连通性 -c 4 只 ping 4 次
nc -zv host port 测试端口 -

下一步


info 前置知识


掌握检查

  • [ ] 能区分 curl 和 wget 的适用场景:curl 适合调 API 和需要自定义请求头,wget 适合批量下载文件
  • [ ] 能用 curl -H "Authorization: Bearer token" -o result.json https://api.example.com/data 调用带认证的接口
  • [ ] 能用 rsync -avz --progress 在两台服务器之间同步目录,并知道 --delete 参数的风险
  • [ ] 能用 ss -tlnp | grep :端口 检查服务是否在指定端口监听
  • [ ] 知道scp与rsync的区别:rsync支持增量同步;传输量和效率取决于文件变化模式、网络及选项,不能保证大目录总是更快

实践练习

基础题:用 curl 下载一个公开的 JSON 接口数据(如 https://httpbin.org/json),保存到本地文件,再用 wc -c 查看文件大小,用 cat 验证内容正确。

进阶题:用 rsync 把本地目录 /tmp/data_backup/ 同步到服务器(或反向同步),要求:使用 SSH 配置的别名、显示传输进度、对比两次同步(第一次全量,第二次无变化时应显示几乎无传输量)。


下一步

#Linux #网络 #curl #rsync #数据传输 #数据工程