【服务器】上传百度网盘数据至服务器:BaiduPCS-Go(开源命令行工具) + bypy(官方授权)
【服务器】上传百度网盘数据至服务器:BaiduPCS-Go(开源命令行工具) + bypy(官方授权)
目录
方法一:使用开源命令行工具 BaiduPCS-Go (最推荐)
这是目前在 Linux/Windows 服务器上最流行的第三方工具,它模拟了百度网盘的客户端,支持多线程下载,速度非常快。
- 下载工具:
# 示例:下载适合 Linux 64位的版本(请检查最新版本号)
wget https://github.com/qjfoidnh/BaiduPCS-Go/releases/download/v3.9.5/BaiduPCS-Go-v3.9.5-linux-amd64.zip
unzip BaiduPCS-Go-v3.9.5-linux-amd64.zip
cd BaiduPCS-Go-v3.9.5-linux-amd64
chmod +x BaiduPCS-Go
- 登录账号:
运行程序:
进入交互界面后,使用./BaiduPCS-Gologin命令。由于服务器通常没有浏览器,推荐使用 BDUSS 登录(Cookie登录)。- 如何获取 BDUSS?
方法一:使用快捷键(F12)
在本地浏览器登录百度网盘,按 F12 打开开发者工具 -> Application (或 Storage) -> Cookies -> 找到 BDUSS 的值并复制。
方法二:使用浏览器地址栏代码(最快捷,无需 F12)
这种方法通过在地址栏输入一段 JavaScript 代码来直接弹出 BDUSS,适用于大多数电脑浏览器。
-
在浏览器中打开 百度首页 (baidu.com) 并确保已经登录账号。
-
在浏览器的地址栏中,手动输入
javascript:(注意:直接复制粘贴整段代码时,浏览器为了安全通常会自动删掉开头的javascript:,所以必须手动打这几个字)。 -
紧接着粘贴以下代码:
alert(document.cookie.match(/BDUSS=(.*?)(;|$)/)[1]) -
按回车键。
-
浏览器会弹出一个窗口,里面的一长串字符就是你的
BDUSS。- 在服务器输入:
login -bduss=<你的BDUSS>
- 在服务器输入:

3. 下载文件:
登录成功后,使用类似 Linux 的命令操作:
* ls:列出文件
* cd:切换目录
* d <文件名>:下载文件 (例如 d movie.mp4)
优点: 免费、开源、支持多线程、无需图形界面。
缺点: 百度有时会针对非官方客户端限速(账号可能被暂时拉黑导致速度变慢,需要会员解封)。
实例:下载网盘数据
cd /geogfs1/home/wanzhougeo/Packages/BaiduPCS-Go-v3.9.5-linux-amd64/
# 确保先进入正确的下载目录
./BaiduPCS-Go config set -savedir /geogfs1/groups/scl/Data/
# 设置最大并发下载任务数为 50 (根据服务器性能可适当调整,一般 50-100 都可以)
./BaiduPCS-Go config set -max_parallel 50
# 设置下载缓存大小为 256KB (有助于减少磁盘碎片)
./BaiduPCS-Go config set -cache_size 262144
案例1:下载数据
# 下载地温数据
./run_downloadLST.sh
nohup ./run_downloadLST.sh > downloadLST.log 2>&1 &
# 下载气温数据
nohup ./run_downloadTa.sh &
nohup ./run_downloadTa.sh > downloadTa.log 2>&1 &
nohup ./run_downloadCode.sh > downloadB0.log 2>&1 &
用以下命令在 Linux 或 macOS 终端中查看该文件夹的大小:
du -sh /geogfs1/groups/scl/Data/2860562008_ww_for/
裁剪文件:
mv /geogfs1/groups/scl/Data/2860562008_ww_for/Africa_Ta_SVCMsp_2021TMIN_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Africa2021/
mv /geogfs1/groups/scl/Data/2860562008_ww_for/Australia_Ta_SVCMsp_2021TMAX_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Australia2021/
mv /geogfs1/groups/scl/Data/2860562008_ww_for/Australia_Ta_SVCMsp_2021TMIN_*.tif /geogfs1/groups/scl/Data/2860562008_ww_for/Australia2021/
mv /geogfs1/groups/scl/Data/2860562008_ww_for/ /geogfs1/groups/scl/Data/Global_Ta/
案例2:下载数据
实例:上传服务器数据至百度网盘(失败,BaiduPCS-Go被禁用)
cd /geogfs1/home/wanzhougeo/Packages/BaiduPCS-Go-v3.9.5-linux-amd64/
# 下载气温数据
nohup ./run_uploadTa.sh &
run_uploadTa.sh 脚本完整内容如下:
#!/bin/bash
# ================= 配置区域 =================
PCS_CMD="./BaiduPCS-Go"
LOCAL_ROOT="/geogfs1/groups/scl/Data/Global_Ta"
REMOTE_ROOT="/Ta"
LOG_DIR="./upload_logs"
CONTINENTS=("EuropeanAsia")
START_YEAR=2021
END_YEAR=2024
# ===========================================
echo "=========================================="
echo "=== Start Robust Upload Ta (${START_YEAR} -> ${END_YEAR}) ==="
echo "=========================================="
date
mkdir -p "$LOG_DIR"
$PCS_CMD mkdir "$REMOTE_ROOT" > /dev/null 2>&1
for year in $(seq ${START_YEAR} ${END_YEAR}); do
for continent in "${CONTINENTS[@]}"; do
FOLDER_NAME="${continent}${year}"
LOCAL_FOLDER="${LOCAL_ROOT}/${FOLDER_NAME}"
LOG_FILE="${LOG_DIR}/${FOLDER_NAME}_upload.log"
echo "----------------------------------------" | tee -a "$LOG_FILE"
echo "Processing Folder: ${FOLDER_NAME}" | tee -a "$LOG_FILE"
if [ ! -d "$LOCAL_FOLDER" ]; then
echo "[$(date +'%H:%M:%S')] SKIP: Local folder ${LOCAL_FOLDER} does not exist." | tee -a "$LOG_FILE"
continue
fi
# 1. 在网盘创建对应的目标文件夹
REMOTE_FOLDER="${REMOTE_ROOT}/${FOLDER_NAME}"
$PCS_CMD mkdir "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
# 2. 核心修改:遍历本地文件夹中的 tif 文件,逐个上传
# 这样彻底避免了 BaiduPCS-Go 内部并发获取列表导致的 31023 错误
echo "[$(date +'%H:%M:%S')] Start uploading files one by one to ${REMOTE_FOLDER} ..." | tee -a "$LOG_FILE"
# 统计文件总数用于显示进度
TOTAL_FILES=$(ls -1 "$LOCAL_FOLDER"/*.tif 2>/dev/null | wc -l)
CURRENT_FILE=0
for file in "$LOCAL_FOLDER"/*.tif; do
# 如果没有匹配到文件,跳过
[ -e "$file" ] || continue
((CURRENT_FILE++))
FILENAME=$(basename "$file")
echo "[$(date +'%H:%M:%S')] ($CURRENT_FILE/$TOTAL_FILES) Uploading: $FILENAME" | tee -a "$LOG_FILE"
# 逐个文件上传到指定的远端目录
$PCS_CMD upload "$file" "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
done
echo "[$(date +'%H:%M:%S')] FINISHED: Folder ${FOLDER_NAME} processed." | tee -a "$LOG_FILE"
done
done
echo "========================================"
echo "=== All Ta data has been uploaded ==="
echo "========================================"
date
设置 最大并发上传数 如下:
./BaiduPCS-Go config set -max_upload_parallel 5
(将最大并发上传数设置为 2 或 1,虽然上传速度会稍微变慢,但会极其稳定,不再报错)
单个文件测试上传
测试单个文件的上传:
./BaiduPCS-Go upload /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/EuropeanAsia_Ta_SVCMsp_2021TMAX_001.tif /Ta/EuropeanAsia2021/
如果单文件测试依然报 31023 错误,请按以下步骤修复:
第一步:验证是否全局 API 都失效了
请在终端直接运行查看文件列表的命令:
./BaiduPCS-Go ls
如果这个命令也报错 31023,说明确实是全局的 API 通信问题。
方法一:修改 AppID(最常见的有效解决方法)
很多时候是因为默认的 AppID 接口被百度限制了。可以尝试修改为一个官方常用的 AppID(例如 266719 或 265486)。
依次执行以下命令:
# 将 AppID 修改为常用的 266719 (或者尝试 778750)
./BaiduPCS-Go config set -appid=266719
./BaiduPCS-Go config set -appid=778750
# 再次尝试列出网盘目录,看看是否恢复正常
./BaiduPCS-Go ls
# 退出当前账号并重新登录(修改 AppID 后通常需要重新登录才能生效)
./BaiduPCS-Go logout
./BaiduPCS-Go login
./BaiduPCS-Go login -bduss=这里替换成你刚刚复制的BDUSS字符串
第四步:再次测试单文件上传
当 ./BaiduPCS-Go ls 能够正常打印出网盘里的文件列表,不再报错时,请再次运行之前的测试命令:
./BaiduPCS-Go upload /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/EuropeanAsia_Ta_SVCMsp_2021TMAX_001.tif /Ta/EuropeanAsia2021
方法二:使用官方授权的 bypy
与 BaiduPCS-Go 的“破解/模拟”路线不同,bypy 走的是百度官方的开发者 API 接口,因此极其稳定,几乎永远不会报 31023 这种风控错误。
-
安装 bypy(HPC 通常都自带 Python 环境):
pip install bypy(如果提示权限不足,可以加
--user:pip install bypy --user)
-
进行官方授权登录:
在终端输入:bypy info终端会输出一个链接。复制这个链接,在您登录了百度网盘的电脑浏览器里打开。
网页会显示一串授权码。将这串授权码复制,粘贴回 Linux 终端并回车。就登录成功了! -
使用限制与方法(重要):
因为走的是官方接口,为了安全,百度限制bypy只能访问网盘里的一个特定文件夹,路径是:我的网盘 / 我的应用数据 / bypy(或者apps/bypy)- 下载文件:需要先在电脑或手机上,把想下载的数据移动到网盘的
我的应用数据/bypy文件夹里。然后在终端运行:bypy down 文件名 - 上传文件:在终端运行:
文件会被上传到网盘的bypy upload 本地文件名我的应用数据/bypy目录下。
- 下载文件:需要先在电脑或手机上,把想下载的数据移动到网盘的
# 下载气温数据
nohup ./run_uploadTa.sh &
run_uploadTa.sh 脚本内容如下:
#!/bin/bash
# ================= 配置区域 =================
# 将原来的 BaiduPCS-Go 替换为 bypy
BYPY_CMD="bypy"
LOCAL_ROOT="/geogfs1/groups/scl/Data/Global_Ta"
REMOTE_ROOT="Ta"
LOG_DIR="./upload_logs"
CONTINENTS=("EuropeanAsia")
START_YEAR=2021
END_YEAR=2022
# ===========================================
echo "=========================================="
echo "=== Start Robust Upload Ta (${START_YEAR} -> ${END_YEAR}) ==="
echo "=========================================="
date
mkdir -p "$LOG_DIR"
# 使用 bypy 创建远端根目录
$BYPY_CMD mkdir "$REMOTE_ROOT" > /dev/null 2>&1
for year in $(seq ${START_YEAR} ${END_YEAR}); do
for continent in "${CONTINENTS[@]}"; do
FOLDER_NAME="${continent}${year}"
LOCAL_FOLDER="${LOCAL_ROOT}/${FOLDER_NAME}"
LOG_FILE="${LOG_DIR}/${FOLDER_NAME}_upload.log"
echo "----------------------------------------" | tee -a "$LOG_FILE"
echo "Processing Folder: ${FOLDER_NAME}" | tee -a "$LOG_FILE"
if [ ! -d "$LOCAL_FOLDER" ]; then
echo "[$(date +'%H:%M:%S')] SKIP: Local folder ${LOCAL_FOLDER} does not exist." | tee -a "$LOG_FILE"
continue
fi
# 1. 在网盘创建对应的目标文件夹
REMOTE_FOLDER="${REMOTE_ROOT}/${FOLDER_NAME}"
$BYPY_CMD mkdir "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
# 2. 遍历本地文件夹中的 tif 文件,逐个上传
echo "[$(date +'%H:%M:%S')] Start uploading files one by one to ${REMOTE_FOLDER} ..." | tee -a "$LOG_FILE"
# 统计文件总数用于显示进度
TOTAL_FILES=$(ls -1 "$LOCAL_FOLDER"/*.tif 2>/dev/null | wc -l)
CURRENT_FILE=0
for file in "$LOCAL_FOLDER"/*.tif; do
# 如果没有匹配到文件,跳过
[ -e "$file" ] || continue
((CURRENT_FILE++))
FILENAME=$(basename "$file")
echo "[$(date +'%H:%M:%S')] ($CURRENT_FILE/$TOTAL_FILES) Uploading: $FILENAME" | tee -a "$LOG_FILE"
# 逐个文件上传到指定的远端目录
# bypy upload <本地路径> <远端路径>
$BYPY_CMD upload "$file" "$REMOTE_FOLDER" >> "$LOG_FILE" 2>&1
done
echo "[$(date +'%H:%M:%S')] FINISHED: Folder ${FOLDER_NAME} processed." | tee -a "$LOG_FILE"
done
done
echo "========================================"
echo "=== All Ta data has been uploaded ==="
echo "========================================"
date
服务器中批量裁剪文件
cp /geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta2021/EuropeanAsia2021/ /geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia2021/
/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta2021/EuropeanAsia2021rep/
cd /geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/
chmod +x copy_ta_data.sh
dos2unix copy_ta_data.sh
./copy_ta_data.sh 2022
./copy_ta_data.sh 2020 2021 2022
copy_ta_data.sh 脚本内容如下:
#!/bin/bash
# 检查是否提供了年份参数
if [ "$#" -eq 0 ]; then
echo "使用方法: $0 <年份1> [年份2] [年份3] ..."
echo "示例: $0 2021 2022 2023"
exit 1
fi
# 遍历所有传入的年份参数
for YEAR in "$@"; do
echo "========================================"
echo "正在处理年份: ${YEAR} ..."
# 定义对应年份的文件夹路径
SRC_DIR="/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta${YEAR}/EuropeanAsia${YEAR}"
REP_DIR="/geogfs1/groups/scl/Data/Ta_SVCMsp_global_V2026/2_output/Ta${YEAR}/EuropeanAsia${YEAR}rep"
TARGET_DIR="/geogfs1/groups/scl/Data/Global_Ta/EuropeanAsia${YEAR}"
# 1. 创建目标文件夹(如果不存在的话,-p 参数会自动创建父目录且不会报错)
mkdir -p "${TARGET_DIR}"
echo "已确保目标文件夹存在: ${TARGET_DIR}"
# 2. 拷贝原始数据
if [ -d "${SRC_DIR}" ]; then
echo "正在拷贝原始数据: ${SRC_DIR} -> ${TARGET_DIR}"
# 拷贝所有 tif 文件。2>/dev/null 用于隐藏找不到文件时的系统报错,由后面的 echo 提供友好提示
cp "${SRC_DIR}"/*.tif "${TARGET_DIR}/" 2>/dev/null || echo " [警告] ${SRC_DIR} 中没有找到 .tif 文件。"
else
echo " [错误] 原始数据文件夹不存在: ${SRC_DIR}"
fi
# 3. 拷贝替换数据 (使用 -f 强制覆盖同名文件)
if [ -d "${REP_DIR}" ]; then
echo "正在拷贝并替换数据: ${REP_DIR} -> ${TARGET_DIR}"
cp -f "${REP_DIR}"/*.tif "${TARGET_DIR}/" 2>/dev/null || echo " [提示] ${REP_DIR} 中没有找到需要替换的 .tif 文件。"
else
echo " [提示] 替换文件夹不存在,跳过替换步骤: ${REP_DIR}"
fi
echo "年份 ${YEAR} 处理完成!"
done
echo "========================================"
echo "所有指定年份的数据拷贝与替换任务已全部执行完毕!"
参考
更多推荐
所有评论(0)