想讓 VPS 下載檔案,再搬到自己的雲端硬碟,可以把工作拆成兩段:Aria2 負責下載,Rclone 負責傳到雲端。中間再加一個驗證步驟,確認資料一致,才刪掉本地暫存。
這篇以 Ubuntu 的 Bash 環境為例,先跑通手動指令,再整理成腳本。下載來源限於你有權取得的 HTTP/HTTPS 單一檔案;BT、多檔任務與長期排程,不套用這份範例的假設。
先分清楚工具各自做什麼
Aria2 是下載工具,也能透過 RPC 接受其他程式的指令。AriaNg 是其中一種圖形介面,但使用 aria2c 指令本身不需要先架設 AriaNg。Aria2 手冊(在新分頁開啟)
Rclone 則透過已設定的 remote 存取雲端儲存空間。本文示範 copy 與 check,不需要先把雲端掛載成磁碟機,也不需要把其他工具改名為 Rclone。
原稿引用的 P3TERX/aria2.sh(在新分頁開啟) 已封存。下面改用一般套件與明確指令,避免把舊腳本的安裝路徑、服務名稱當成每台主機都一樣的設定。
安裝工具並確認版本
在 Ubuntu 終端機執行:
sudo apt updatesudo apt install aria2 rclonearia2c --versionrclone version套件庫提供的版本依 Ubuntu 發行版而異。若需要較新的 Rclone,可以依官方安裝文件(在新分頁開啟)安裝,再記下實際版本,方便之後排錯。
這些指令用在 Linux 終端機,不能直接貼進 Windows PowerShell。若要使用 WSL,也要先進入 Ubuntu,確認執行環境。
設定自己的雲端連線
執行:
rclone config建立一個名稱為 gdrive、類型為 Google Drive 的 remote,填入自己的 OAuth client_id 與 client_secret,再選擇可上傳檔案的授權範圍,登入自己的帳號。Rclone 官方已說明共用 client 正在退役,不能沿用舊教學一律留空的做法;建立流程可先看站內的 Google Drive 授權設定。remote 名稱可以自訂,後面的範例則統一使用 gdrive:。
有瀏覽器的電腦可以依提示完成授權。VPS 沒有瀏覽器時,依 Rclone 當下顯示的 rclone authorize 指令,到有瀏覽器的電腦操作,再把授權結果貼回原本的設定流程。具體欄位以目前的 Google Drive backend 文件(在新分頁開啟)為準。
完成後先列出目錄:
rclone listremotesrclone lsd gdrive:能看到 gdrive:,只代表設定存在;能成功列出雲端目錄,才表示這次連線與授權可以使用。空的硬碟可能沒有目錄輸出,可再搭配指令退出狀態與錯誤訊息確認。
手動完成一次下載、上傳與比對
先建立專門放測試檔案的資料夾,下載一份小型 HTML 文件:
mkdir -p "$HOME/aria2-practice"aria2c --dir="$HOME/aria2-practice" --out="example.html" --allow-overwrite=false --auto-file-renaming=false "https://www.example.com/"這裡指定固定檔名,並關閉覆寫與自動改名。如果已存在同名檔案,先檢查它的用途,或換一個測試檔名,不要直接清掉整個資料夾。
再把資料夾內的檔案上傳到自己的雲端測試目錄:
rclone copy "$HOME/aria2-practice" "gdrive:aria2-practice" --immutable --progress這裡以整個測試資料夾為 copy 來源,不會因為來源少了檔案,就刪除目的地的其他檔案;搭配 --immutable,遇到內容不同的既有檔案會報錯,保留目的地內容。請維持資料夾來源的寫法,不要直接換成單一檔案來源。它仍是複製操作,不是完整備份策略。copy 文件(在新分頁開啟)、immutable 說明(在新分頁開啟)
上傳後再比對:
rclone check "$HOME/aria2-practice" "gdrive:aria2-practice" --one-way --download--one-way 只要求來源的檔案在目的地都有一致內容,不把目的地多出來的檔案當成錯誤。--download 會讀取實際資料進行比對,因此會增加雲端讀取與網路流量;大檔案使用前要把這段成本算進去。check 文件(在新分頁開啟)
手動測試先保留本地檔案,確認雲端上的內容也能正常開啟。自動清理放到下一段腳本處理。
腳本:每次使用獨立暫存目錄
把下面內容存成 download-and-upload.sh。它只接受三個參數:下載網址、輸出檔名、雲端目的目錄。
#!/usr/bin/env bashset -euo pipefail
if [[ $# -ne 3 ]]; then printf 'Usage: %s URL FILENAME REMOTE_DIR\n' "$0" >&2 exit 64fi
download_url=$1filename=$2remote_dir=$3
case "$download_url" in http://*|https://*) ;; *) printf 'URL must use HTTP or HTTPS.\n' >&2; exit 64 ;;esac
case "$filename" in ""|.|..|*/*|*\\*) printf 'FILENAME must be a single file name.\n' >&2 exit 64 ;;esac
if [[ ! "$remote_dir" =~ ^[A-Za-z0-9_-]+: ]]; then printf 'REMOTE_DIR must start with a configured remote name.\n' >&2 exit 64fi
for required_program in aria2c rclone; do if ! command -v "$required_program" >/dev/null 2>&1; then printf 'Missing command: %s\n' "$required_program" >&2 exit 69 fidone
work_dir=$(mktemp -d "${TMPDIR:-/tmp}/aria2-upload.XXXXXX")local_file="$work_dir/$filename"remote_file="${remote_dir%/}/$filename"printf 'Working directory: %s\n' "$work_dir"
aria2c --dir="$work_dir" --out="$filename" \ --allow-overwrite=false --auto-file-renaming=false "$download_url"
rclone copy "$work_dir" "$remote_dir" \ --immutable --progress --retries 3
rclone check "$work_dir" "$remote_dir" --one-way --download
rm -- "$local_file"rmdir -- "$work_dir"printf 'Upload verified: %s\n' "$remote_file"在檔案所在目錄執行:
bash ./download-and-upload.sh "https://www.example.com/" "example.html" "gdrive:blog-downloads"這裡的 gdrive:blog-downloads 必須換成自己有權寫入的 remote 與目錄。copy 的來源是整個暫存目錄,目的地也是目錄,下載檔案的名稱保持不變。後面的比對則使用同一組目錄。
腳本會印出這次的暫存位置。下載、上傳或比對任何一步失敗,set -e 就會中止後續指令,因此不會走到最後的清理。成功時只刪除該次下載的檔案,再移除已空的暫存資料夾。
它不會自動清除失敗任務,也不會把失敗任務接回下一次下載。若要續傳,請先依印出的路徑檢查殘留檔案與 Aria2 控制檔,再針對同一任務操作;重新跑這份腳本會建立新的暫存目錄。
為什麼不用「上傳後直接刪資料夾」?
指令沒有印出錯誤,不一定代表整段工作都成功。流程可能在錯誤的帳號、錯誤的路徑上執行,也可能因為檔案衝突而沒有得到預期結果。
這份腳本先用單獨的工作目錄限定處理範圍,再以內容比對確認目的檔案,最後只刪除已知檔名。即使如此,第一次使用仍應先拿小型測試檔練習,檢查真正寫入的雲端位置。
不建議把這個範例改成 rclone sync 或對任意下載根目錄執行遞迴刪除。那會改變檔案刪除的範圍,已經是另一套需要重新驗證的流程。
VPS 長期使用還要考慮什麼?
VPS 的本地磁碟、下載流量、上傳流量與雲端讀回驗證,都可能影響成本。下載一份檔案後上傳,再讀回比對,流量不只發生一次;請按自己的主機與儲存方案估算。
多個任務同時跑,也會增加暫存空間需求。先限制並行數,保留執行紀錄,再考慮排程,較容易知道失敗發生在哪一個步驟。
如果之後使用 AriaNg,RPC 位址、連線方式與驗證也要另外設定。不要因為前端連不上,就把沒有適當保護的下載服務直接開到公網。
常見問題
| 狀況 | 檢查方向 |
|---|---|
找不到 gdrive: | 設定 remote 的 Linux 帳號,是否與執行腳本的帳號相同? |
| 授權在電腦成功、VPS 卻失敗 | VPS 是否完成自己的設定流程,且使用正確設定檔? |
| immutable 錯誤 | 目的地已有同名但不同內容的檔案,請換名稱或人工確認。 |
| 下載後沒有清掉暫存 | 先看上傳與比對是否成功;失敗保留檔案是預期行為。 |
| 比對特別久 | --download 會讀取檔案內容,大檔案需要額外時間與流量。 |
