如何用curl或wget从Backblaze B2下载需登录的快照至远程服务器
方法一:通过B2 API生成可直接下载的签名URL(推荐,稳定无会话依赖)
这种方法利用Backblaze官方API生成带签名的临时下载链接,无需依赖web登录会话,适合批量处理大量小文件。
1. 获取认证凭证
在Backblaze控制台生成Application Key(优先使用受限密钥,避免主密钥泄露),记录你的ACCOUNT_ID和APPLICATION_KEY。
执行curl获取授权令牌和API端点:
curl -u "ACCOUNT_ID:APPLICATION_KEY" https://api.backblazeb2.com/b2api/v2/b2_authorize_account
从返回结果中提取authorizationToken和apiUrl两个值,后续步骤会用到。
2. 定位目标Bucket ID
如果已知Bucket名称,用API查询Bucket详情获取bucketId:
curl -H "Authorization: AUTHORIZATION_TOKEN" "${API_URL}/b2api/v2/b2_list_buckets"
在返回的JSON数据中找到目标Bucket对应的bucketId。
3. 列出快照中的所有小文件
如果快照文件有统一前缀(比如snapshot_2024/),用API批量拉取文件列表:
curl -H "Authorization: AUTHORIZATION_TOKEN" "${API_URL}/b2api/v2/b2_list_file_names" \ -d '{"bucketId": "BUCKET_ID", "prefix": "SNAPSHOT_FILE_PREFIX"}'
将SNAPSHOT_FILE_PREFIX替换为你的快照文件前缀,返回的files数组包含每个文件的fileId和fileName。
4. 批量下载脚本
将以下脚本保存为b2_download.sh,替换占位符后执行,自动批量下载所有文件:
#!/bin/bash # 配置参数 ACCOUNT_ID="你的账号ID" APPLICATION_KEY="你的应用密钥" BUCKET_ID="目标Bucket ID" PREFIX="快照文件前缀" DOWNLOAD_DIR="/path/to/your/download/folder" # 创建下载目录 mkdir -p "$DOWNLOAD_DIR" # 获取认证信息 AUTH_RESPONSE=$(curl -s -u "$ACCOUNT_ID:$APPLICATION_KEY" https://api.backblazeb2.com/b2api/v2/b2_authorize_account) AUTH_TOKEN=$(echo "$AUTH_RESPONSE" | grep -o '"authorizationToken":"[^"]*"' | cut -d'"' -f4) API_URL=$(echo "$AUTH_RESPONSE" | grep -o '"apiUrl":"[^"]*"' | cut -d'"' -f4) # 获取文件列表 FILES_RESPONSE=$(curl -s -H "Authorization: $AUTH_TOKEN" "$API_URL/b2api/v2/b2_list_file_names" -d '{"bucketId": "'"$BUCKET_ID"'", "prefix": "'"$PREFIX"'"}') FILE_IDS=$(echo "$FILES_RESPONSE" | grep -o '"fileId":"[^"]*"' | cut -d'"' -f4) FILE_NAMES=$(echo "$FILES_RESPONSE" | grep -o '"fileName":"[^"]*"' | cut -d'"' -f4) # 循环下载每个文件 paste <(echo "$FILE_IDS") <(echo "$FILE_NAMES") | while read -r FILE_ID FILE_NAME; do # 生成临时下载URL(有效期默认24小时) DOWNLOAD_URL=$(curl -s -H "Authorization: $AUTH_TOKEN" "$API_URL/b2api/v2/b2_get_download_url_by_file_id" -d '{"fileId": "'"$FILE_ID"'"}' | grep -o '"downloadUrl":"[^"]*"' | cut -d'"' -f4) echo "正在下载: $FILE_NAME" # 用wget下载,如需curl替换为:curl -o "$DOWNLOAD_DIR/$FILE_NAME" "$DOWNLOAD_URL" wget -q -P "$DOWNLOAD_DIR" "$DOWNLOAD_URL" done
执行前赋予脚本权限:chmod +x b2_download.sh,然后运行./b2_download.sh。
方法二:利用web会话Cookie下载(适合已有web端下载链接的场景)
如果已经通过Backblaze web界面获取了文件的下载链接,但需要登录态才能访问,可以通过cookie维持会话批量下载。
1. 获取登录Cookie
用curl模拟登录Backblaze,生成会话cookie文件:
curl -c b2_cookies.txt -d "email=你的登录邮箱&password=你的登录密码" https://secure.backblaze.com/user_signin.htm
注意:该方法可能因Backblaze的验证码机制、登录策略变化失效,仅作备选。
2. 批量下载
将所有待下载URL存入download_urls.txt(每行一个URL),用wget批量下载:
wget --load-cookies b2_cookies.txt -i download_urls.txt -P /path/to/save/files
或用curl循环下载:
while read -r URL; do curl -b b2_cookies.txt -o "/path/to/save/files/$(basename "$URL")" "$URL" done < download_urls.txt
注意事项
- API生成的下载URL有效期最长为86400秒(24小时),过期需重新生成。
- 批量下载时建议加入重试机制(比如wget的
--tries=3),应对网络波动。 - 优先使用API方法,稳定性和安全性远高于cookie会话方式。
内容的提问来源于stack exchange,提问作者DaWe

