Download Server
最近终于有空,把之前想了很久的下载机配置了一下
这次配置的是下载机,可以实现远程挂机下载,下载完成后再用固定的 本地 - Server
的线路把下载好的文件取回
实现效果
以下是目前实现的效果,之后遇到问题还会不断更新:
- 通过
https://<files.domain>
访问存储在/var/www/files
文件夹内的下载好的文件,供本地用 aria2、wget 等方式下载 - 普通下载任务:
- Server:通过
https://<ariang.domain>
访问 AriaNg 网页,登录账号,添加任务,文件下载到/disk/aria2Downloads
,下载完成后自动创建链接到/var/www/files
- 本地使用 aria2 开启 16 线程从 Nginx 文件服务器下载文件,一般可以跑满网络带宽,下载完成后自动运行脚本删除 Server 中存储的文件
- Server:通过
- BT 下载任务:
- Server:通过
https://<qbit.domain>
打开 qBittorrent 网页,登录账号,添加任务,文件下载到/disk/qBitDownloads
,下载完成后自动创建链接到/var/www/files
- 因为 BT 下载多为文件夹,无法使用 aria2 下载,因此根据情况判断:
- 若下载内容为文件集合,即没有目录结构,使用脚本获取所有文件链接,使用 aria2 和普通任务一样下载
- 若下载内容有复杂的目录结构,使用 wget 下载
- 下载完成后前往
https://<qbit.domain>
手动删除任务及文件,删除前保持做种
- Server:通过
- 脚本每分钟自动检查源文件,如源文件被删除则删除对应
/var/www/files
文件夹中的链接
存在不足
- 本地下载 BT 文件不够优雅:
- 不含目录结构的 BT 文件需要手动执行脚本获取所有文件列表后使用 aria2 下载
- 包含目录结构的 BT 文件需要手动使用 wget 下载、手动多开 wget 实现多线程,以及下载完成后需要手动删除 Server 上的文件
以下内容都会按照上面提到的 URL 和路径来配置,当然你也可以修改为其他 URL 和路径
前期准备
- (如果需要用域名访问或开启 HTTPS)一个域名,并且会配置 DNS
- 一台 Server,有容量足够大的硬盘
Server 选择
用 VPS 下载文件很容易遇到版权问题,如果用一些普通机器,尤其是美国地区的,稍不小心就会导致 VPS 被停机
因此,如果是需要下载,最好选择 抗 DMCA 投诉
的机器,多分布于欧洲,如卢森堡、摩尔多瓦等
比较推荐的是 BuyVM 家的卢森堡机器,抗 DMCA 投诉
- 最低配 1C512M,10GB 硬盘,1 Gbps 无限流量,$2/mo.
可以额外加购存储块,最低 256GB 存储块为 $1.25/mo.
其他还有低价的抗 DMCA VPS 如 Alexhost 和 AvenaCloud 等,最低配年付都在 $10 左右,但是硬盘比较小,只适合作为中转使用,或是挂载远程硬盘,操作比较麻烦
配置 VPS
Nginx 搭建文件服务器
首先用 Nginx 搭建一个文件服务器,供本地下载已经下载到 VPS 上的文件
前期准备
- 添加 DNS,将
<files.domain>
指向 VPS IP
- 添加 DNS,将
安装 Nginx
apt install nginx
配置 Nginx
创建存放文件的目录
mkdir -p /var/www/files
允许 80 端口经过防火墙
ufw allow 80
编辑
<files.domain>
配置将以下内容写入到 `<files.domainvim /etc/nginx/sites-available/<files.domain>
`
server { listen 80; server_name <files.domain>; location / { root /var/www/files; autoindex on; autoindex_exact_size off; autoindex_localtime on; } }
为
<files.domain>
创建链接ln -s /etc/nginx/sites-available/<files.domain> /etc/nginx/sites-enabled/
检查 Nginx 配置
如果得到以下结果,即包含关键字 `successful` 即可nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok : configuration file /etc/nginx/nginx.conf test is successful
重新启动 Nginx 以应用配置文件
systemctl restart nginx
此时可以通过
http://<file.domain>
访问文件服务器
(可选,建议)启用 HTTPS
安装 certbot
apt install certbot python3-certbot-nginx
允许 443 端口通过防火墙
ufw allow 443
获取证书
certbot --nginx -d <files.domain>
编辑配置文件
vim /etc/nginx/sites-available/<files.domain>
Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:
server { server_name <files.domain>; location / { root /var/www/files; autoindex on; autoindex_exact_size off; autoindex_localtime on; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/<files.domain>/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/<files.domain>/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
重新启动 Nginx
systemctl restart nginx
此时可以通过
https://<files.domain>
访问文件服务器
编辑自动检查链接脚本
写入以下内容:vim /root/.sh/check_links.sh
#!/bin/bash # 要检查的目录路径 DIRECTORY="/var/www/files" LOG_FILE="/root/.sh/check_links.log" # 查找目录中的所有符号链接 find "$DIRECTORY" -type l | while read -r symlink; do # 获取符号链接指向的目标文件 target=$(readlink "$symlink") echo "$(date): Checking link: $symlink > $target" >> "$LOG_FILE" # 如果目标文件不存在,则删除该符号链接 if [ ! -e "$target" ]; then echo "$(date): Deleting broken link: $symlink > $target" >> "$LOG_FILE" rm "$symlink" fi done echo "$(date): Checking finished" >> "$LOG_FILE"
在文件末尾加入:chmod +x /root/.sh/check_links.sh crontab -e
* * * * * /bin/bash /root/.sh/check_links.sh
配置 aria2
安装 aria2
apt install aria2
配置 aria2
创建 aria2 相关文件目录
mkdir -p /root/.aria2
创建 aria2 配置文件目录
mkdir -p /etc/aria2
创建 aria2 下载目录
mkdir -p /<disk>/aria2Downloads
编辑 aria2 配置
输入以下内容:vim /etc/aria2/aria2.conf
# Enable RPC enable-rpc=true # Listen on all network interfaces rpc-listen-all=true # Allow all origins (for web frontends) rpc-allow-origin-all=true # Set RPC listening port rpc-listen-port=6800 # Set the maximum number of concurrent downloads max-concurrent-downloads=5 max-connection-per-server=16 # Log file log-level=notice log=/root/.aria2/aria2.log # Download path dir=/<disk>/aria2Downloads # Check Integrity check-integrity=true # Resume Download continue=true # Move file when complete on-download-complete=/root/.aria2/link_completed.sh # Seed time seed-time=600
允许 6800 端口通过防火墙
ufw allow 6800
创建下载完成时运行脚本
link_completed.sh
写入以下内容:vim /root/.aria2/link_completed.sh
#!/bin/bash ln -s "$3" "/var/www/files/"
为脚本添加执行权限:
chmod +x /root/.aria2/link_completed.sh
启动 aria2 并设置开机自启动
编辑服务文件
写入以下内容:vim /etc/systemd/system/aria2.service
[Unit] Description=Aria2 RPC Service After=network.target [Service] ExecStart=/usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf Restart=always User=root Environment="HOME=/root" [Install] WantedBy=multi-user.target
将 aria2 服务设置为开机自启动
systemctl enable aria2
启动 aria2 服务
systemctl start aria2
查看 aria2 状态
systemctl status aria2
配置 AriaNg
- 前期准备
- 添加 DNS,将
<ariang.domain>
指向 VPS IP
- 添加 DNS,将
配置 AriaNg
安装 AriaNg
wget https://github.com/mayswind/AriaNg/releases/download/1.3.7/AriaNg-1.3.7-AllInOne.zip
前往 Releases · mayswind/AriaNg 查看最新版本
All In One 版本拥有所有需要的内容,可以直接用浏览器访问,普通版本根据需要手动安装
创建网站目录
mkdir -p /var/www/ariang
解压 AriaNg 到网站目录
如果没有 unzip 需先安装unzip AriaNg-1.3.7-AllInOne.zip -d /var/www/ariang
apt install unzip
添加 Nginx 配置
输入以下内容:vim /etc/nginx/sites-available/<ariang.domain>
server { listen 80; server_name <ariang.domain>; location / { root /var/www/ariang; index index.html; } }
为
<ariang.domain>
创建链接ln -s /etc/nginx/sites-available/<ariang.domain> /etc/nginx/sites-enabled/
检查 Nginx 配置
nginx -t
重新启动 Nginx
systemctl restart nginx
此时可以通过
http://<ariang.domain>
访问 AriaNg
(可选,建议)启用 HTTPS
安装 certbot
apt install certbot python3-certbot-nginx
获取证书
certbot --nginx -d <ariang.domain>
编辑配置文件
vim /etc/nginx/sites-available/<ariang.domain>
Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:
server { server_name <ariang.domain>; location / { root /var/www/ariang; index index.html; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/<ariang.domain>/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/<ariang.domain>/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
重新启动 Nginx
systemctl restart nginx
配置 aria2
写入以下内容:vim /etc/aria2/aria2.conf
rpc-secure=true rpc-certificate=/etc/letsencrypt/live/<ariang.domain>/fullchain.pem rpc-private-key=/etc/letsencrypt/live/<ariang.domain>/privkey.pem
此时可以通过
https://<ariang.domain>
访问 AriaNg。
配置 qBittorrent
前期准备
- 添加 DNS,将
<qbit.domain>
指向 VPS IP
- 添加 DNS,将
安装 qBittorrent
wget https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases/download/release-4.6.5.10/qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip
- 前往 Releases · c0re100/qBittorrent-Enhanced-Edition 查看最新版本
这里选择的是 c0re100 在原版 qBittorrent 基础上修改的加强版,加入了屏蔽迅雷这类吸血客户端等功能:GitHub - c0re100/qBittorrent-Enhanced-Edition
当然也可以选择原版 qBittorrent:GitHub - qbittorrent/qBittorrent
将 qBittorrent 解压到安装目录
unzip qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip -d /usr/local/bin/
添加可执行权限
chmod +x /usr/local/bin/qbittorrent-nox
添加 qBittorrent 服务
vim /etc/systemd/system/qbittorrent.service
写入以下内容:
[Unit] Description=qBittorrent-nox service After=network.target [Service] User=<username> ExecStart=/usr/local/bin/qbittorrent-nox Restart=on-failure [Install] WantedBy=multi-user.target
- <\username>:系统用户名
重新加载 daemon
systemctl daemon-reload
将 qBittorrent 设置为开机自启动
systemctl enable qbittorrent
允许 8080 端口通过防火墙
ufw allow 8080
启动 qBittorrent
systemctl start qbittorrent
现在可通过
http://<vps-ip>:8080
打开 qBittorrent- 首次访问会在 Terminal 给出初始账号密码,进入系统后修改
(可选)绑定域名
添加 Nginx 配置
写入以下内容:vim /etc/nginx/sites-available/<qbit.domain>
server { listen 80; server_name <qbit.domain>; location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
为
<qbit.domain>
创建链接ln -s /etc/nginx/sites-available/<qbit.domain> /etc/nginx/sites-enabled/
检查 Nginx 配置
nginx -t
重新启动 Nginx
systemctl restart nginx
此时可以通过
http://<qbit.domain>
访问 qBittorrent
(可选,建议)启用 HTTPS
安装 certbot:
apt install certbot python3-certbot-nginx
获取证书
certbot --nginx -d <qbit.domain>
编辑配置文件
vim /etc/nginx/sites-available/<qbit.domain>
Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:
server { listen 443 ssl; server_name <qbit.domain>; location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ssl_certificate /etc/letsencrypt/live/<qbit.domain>/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/<qbit.domain>/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
重新启动 Nginx
systemctl restart nginx
此时可以通过
https://<qbit.domain>
访问 qBittorrent
配置 qBittorrent
打开 qBittorrent 网页后前往
工具
,选项
- 下载
- (可选)勾选
为所有文件预分配磁盘空间
- (可选)勾选
为不完整的文件添加扩展名 .!qB
- 编辑保存路径为
disk/qBitDownloads
- 勾选
torrent 完成时运行外部程序
,输入/root/.qBittorrent/link_completed.sh "%F"
- (可选)勾选
- 连接
- 记住
用于传入连接的端口
<port>
- 记住
高级
(建议)勾选
Auto Ban Unknown Client From China
屏蔽迅雷这类的吸血客户端
- 下载
防火墙允许端口
ufw allow <port>
编辑完成后运行脚本
输入以下内容vim /root/.qBittorrent/link_completed.sh
#!/bin/bash FILE_PATH=$1 TARGET_DIR="/var/www/files" LOG_FILE="/root/.qBittorrent/link_completed.log" DOWNLOAD_PATH="/disk/qBitDownloads" # 记录日志的函数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 检查目标目录是否存在,不存在则创建 if [ ! -d "$TARGET_DIR" ]; then mkdir -p "$TARGET_DIR" fi echo "$FILE_PATH" >> "$LOG_FILE" # 移动文件并记录日志 while true; do NEW_PATH=$FILE_PATH NEW_PATH="${NEW_PATH%/*}" echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE" echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE" if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then break fi FILE_PATH=$NEW_PATH done echo "处理文件:$FILE_PATH" >> "$LOG_FILE" if ln -s "$FILE_PATH" "$TARGET_DIR/"; then log_message "Created symlink for $FILE_PATH in $TARGET_DIR/" else log_message "Failed to create symlink for $FILE_PATH" fi
- 自动找到最顶层的目录然后创建链接
``bash chmod +x /root/.qBittorrent/link_completed.sh ```
配置本地下载
aira2
下载的普通文件用 aria2 下载到本地
安装过程与 VPS 类似,需要在下载完成时运行脚本 delete_remote.sh
#!/bin/bash
# 获取下载的文件路径
FILE_PATH=$3
LOG_FILE="/Users/<Local Username>/.aria2/delete_remote.log"
echo "[$(date)] Starting remote file deletion for $FILE_PATH" >> $LOG_FILE
# 定义服务器信息
SERVER="<VPS Username>@<VPS IP>"
PASSWORD="<VPS Password>"
REMOTE_SOURCE_DIR="/mnt/slab/aria2Downloads"
# 获取下载的文件名
FILE_NAME=$(basename "$FILE_PATH")
echo "Deleting link $REMOTE_LINK_DIR/$FILE_NAME and source file $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE
# 删除服务器上的文件
sshpass -p "$PASSWORD" ssh $SERVER <<EOF
rm -f "$REMOTE_LINK_DIR/$FILE_NAME"
rm -f "$REMOTE_SOURCE_DIR/$FILE_NAME"
EOF
# 检查删除操作是否成功
if [ $? -eq 0 ]; then
echo "[$(date)] Successfully deleted $REMOTE_LINK_DIR/$FILE_NAME and $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE
else
echo "[$(date)] Failed to delete $REMOTE_LINK_DIR/$FILE_NAME and/or $REMOTE_SOURCE_DIR/$FILE_NAME" >> $LOG_FILE
fi
# 记录操作完成时间
echo "[$(date)] Finished remote file deletion" >> $LOG_FILE
自动删除 aria2 下载的普通文件
此外,还可以用 aria2 下载没有目录结构的 BT 文件,用以下脚本获取所有文件的 URL 列表:
#!/bin/bash
# 检查是否提供了参数
if [ $# -eq 0 ]; then
echo "Usage: $0 <URL>"
exit 1
fi
# 获取传入的URL
BASE_URL="$1"
# 结果文件
RESULT_FILE="file_urls.txt"
# 函数:解码 URL
decode_url() {
printf '%b' "$(echo "$1" | sed 's/%/\\x/g')"
}
# 函数:处理 URL 并递归
process_url() {
local URL="$1"
# 获取网页内容,并提取所有的 URL
curl -s "$URL" | sed -n 's/.*href="\([^"]*\).*/\1/p' | grep -v '^../' | while read -r line; do
# 处理相对路径,拼接成完整的 URL
FULL_URL="${URL%/}/${line}"
# 处理文件夹 URL 递归
DECODED_URL=$(decode_url "$FULL_URL")
if [[ "$FULL_URL" == */ ]]; then
echo "Processing directory: $DECODED_URL"
process_url "$FULL_URL"
else
# 解码 URL 并写入文件
printf '%s\n' "$DECODED_URL" >> "$RESULT_FILE"
fi
done
}
# 清空结果文件
> "$RESULT_FILE"
# 开始处理初始 URL
process_url "$BASE_URL"
echo "All file URLs have been saved to $RESULT_FILE"
sh get_urls.sh <FolderURL>
然后把 file_urls.txt
中的内容粘贴到 aria2 中下载
wget
下载的包含目录结构的 BT 文件用 wget 下载到本地
但是 wget 是单线程下载,因此可以手动对目录中的各个文件夹分别使用 wget 下载
无需担心下载下来以后的目录结构问题,wget 会自动创建并管理从 URL 开始的目录结构,只需对文件夹运行以下命令:
wget -r -N -c -np -R "index.html*" <URL>
下载完成后前往 http://<qbit.domain>
手动删除任务及文件
更新历史
0.4
做种的时候发现经常有迅雷客户端,明明对他上传的速度不低,他却一直保持进度为 0%,从而保持最高的优先级获取下载,而且只下载不上传
因此我得想办法把迅雷这类的吸血客户端给屏蔽了
但是 aria2 的功能有限,无法实现,于是找到了 qBittorrent 的增强版
从此将普通任务和 BT 任务分离,分别由 aria2 和 qBittorrent 下载,还使得运行脚本极大程度简化,aria2 的下载完成运行脚本只剩
#!/bin/bash
ln -s "$3" "/var/www/files/"
而 qBittorrent 的脚本也只需找到最顶层创建链接
#!/bin/bash
FILE_PATH=$1
TARGET_DIR="/var/www/files"
LOG_FILE="/root/.qBitTorrent/link_completed.log"
DOWNLOAD_PATH="/disk/qBitDownloads"
# 记录日志的函数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查目标目录是否存在,不存在则创建
if [ ! -d "$TARGET_DIR" ]; then
mkdir -p "$TARGET_DIR"
fi
echo "$FILE_PATH" >> "$LOG_FILE"
# 移动文件并记录日志
while true; do
NEW_PATH=$FILE_PATH
NEW_PATH="${NEW_PATH%/*}"
echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE"
echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE"
if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then
break
fi
FILE_PATH=$NEW_PATH
done
echo "处理文件:$FILE_PATH" >> "$LOG_FILE"
if ln -s "$FILE_PATH" "$TARGET_DIR/"; then
log_message "Created symlink for $FILE_PATH in $TARGET_DIR/"
else
log_message "Failed to create symlink for $FILE_PATH"
fi
下载完成后的做种,我决定不固定分享率或是做种时间,而是在我手动删除原文件前一直保持做种
在我本地完成原文件的下载后,或是下一次需要进行新的下载而腾出空间时,再手动删除原文件
至于能做多少时间的种或是能上传多少数据,就都随缘了,一般都能达到 2 以上
0.3
突然意识到文件被移动后就无法继续做种,而如果使用拷贝则会占用双份空间
如果使用了挂载的硬盘,这两种方式都无法利用硬盘空间
因此将移动改为了创建软连接,把下载好的文件软链接到 var/www/files
ln -s "$FILE_PATH" "$TARGET_DIR/"
0.2
因为 BT 和普通文件都用 aria2 下载,部分 BT 文件可能包含多个文件,甚至有复杂的目录结构,因此需要遍历每个文件,并找到最上层的文件夹,将整个文件夹移动
此外,还需要区分 BT 任务下载完成 on_bt_download_complete.sh
和普通文件下载完成 on_download_complete.sh
,因为在 BT 任务中,on_download_complete.sh
需要等到做种结束才会执行
因此我需要在文件下载完成以后,做种之前执行,也就是 on_bt_download_complete.sh
,把文件移动到 Nginx 文件夹以便可以下载
所以这里非常复杂,不仅是 on_download_complete.sh
需要判断类型,避免 BT 任务执行过 on_bt_download_complete.sh
后重复执行,还有 move_completed.sh
需要根据 GID
获取当前任务的所有文件列表,并遍历文件、找到最顶层文件夹移动等
on_download_complete.sh
```bash!/bin/bash
GID=2 FILES_LIST=$3
LOG_FILE="/root/.aria2/on_download_complete.log" ARIA2_RPC_URL="https://<ariang.domain>:6800/jsonrpc"
记录日志的函数
log_message() { echo "1" >> "$LOG_FILE" }
获取下载类型并记录日志
log_message "Downloaded GID: $GID"
检查 NUM_FILES 是否等于 0
if [ "$NUM_FILES" -eq 0 ]; then log_message "NUM_FILES = 0, exit" exit 1 fi
Function to get the info hash of a download
get_info_hash() { local gid=1 curl -s -X POST -d '{"jsonrpc":"2.0","method":"aria2.tellStatus","id":"1","params":["'"gid"'"]}' "$ARIA2_RPC_URL" | jq -r '.result.infoHash' }
Check if the completed download is a BitTorrent download
info_hash={GID}")
log_message "infoHash: $info_hash"
if [ "{gid} is not a BitTorrent download." >> "{gid} is a BitTorrent download, exit" >> "$LOG_FILE" exit 1 fi
调用 move_complete.sh 并记录日志
log_message "Calling move_completed.sh with GID=NUM_FILES, FILES_LIST=GID" "FILES_LIST"
if [ $? -eq 0 ]; then log_message "move_completed.sh completed successfully" else log_message "move_completed.sh failed" fi ```
on_bt_download_completed.sh
#!/bin/bash GID=$1 NUM_FILES=$2 FILES_LIST=$3 LOG_FILE="/root/.aria2/on_bt_download_complete.log" # 记录日志的函数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 调用 move_completed.sh 并记录日志 log_message "Starting move_completed.sh with GID=$GID, NUM_FILES=$NUM_FILES, FILES_LIST=$FILES_LIST" /root/.aria2/move_completed.sh "$1" "$2" "$3" if [ $? -eq 0 ]; then log_message "move_completed.sh completed successfully" else log_message "move_completed.sh failed" fi
move_completed.sh
#!/bin/bash GID=$1 NUM_FILES=$2 TARGET_DIR="/var/www/files" LOG_FILE="/root/.aria2/move_completed.log" ARIA2_RPC_URL="https://<ariang.domain>:6800/jsonrpc" DOWNLOAD_PATH="/root/.aria2/Downloading" # 记录日志的函数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 检查目标目录是否存在,不存在则创建 if [ ! -d "$TARGET_DIR" ]; then mkdir -p "$TARGET_DIR" fi # 获取文件列表的函数 get_file_list() { local gid=$1 local rpc_url=$2 curl -s -X POST -d '{"jsonrpc":"2.0","method":"aria2.getFiles","id":"1","params":["'"$gid"'"]}' "$rpc_url" | jq -r '.result[] | .path' } # 获取文件列表 FILES_LIST=$(get_file_list "$GID" "$ARIA2_RPC_URL") echo "$FILES_LIST" >> "$LOG_FILE" # 移动文件并记录日志 while IFS= read -r FILE_PATH; do while true; do NEW_PATH=$FILE_PATH NEW_PATH="${NEW_PATH%/*}" echo "FILE_PATH: $FILE_PATH" >> "$LOG_FILE" echo "NEW_PATH: $NEW_PATH" >> "$LOG_FILE" if [ "$NEW_PATH" = "$DOWNLOAD_PATH" ]; then break fi done echo "处理文件:$FILE_PATH" >> "$LOG_FILE" if mv "$FILE_PATH" "$TARGET_DIR/"; then log_message "Created symlink for $FILE_PATH in $TARGET_DIR/" else log_message "Failed to create symlink for $FILE_PATH" fi done <<< "$FILES_LIST"
0.1
我将 aria2 的下载目录直接指定为 Nginx 文件夹,即 /var/www/files
但是 aria2 下载中的文件和已下载完成的文件不好区分,只是还未下载完的文件会额外多一个 .aria2
文件
于是我将下载文件夹改成 /root/aria2Downloads
,下载完成后用脚本移动到 /var/www/files
#!/bin/bash
mv "$3" "/var/www/files/"