July 2, 2024

Download Server

Download Server

最近终于有空,把之前想了很久的下载机配置了一下

这次配置的是下载机,可以实现远程挂机下载,下载完成后再用固定的 本地 - Server 的线路把下载好的文件取回

实现效果

以下是目前实现的效果,之后遇到问题还会不断更新:

存在不足

以下内容都会按照上面提到的 URL 和路径来配置,当然你也可以修改为其他 URL 和路径

前期准备

Server 选择

用 VPS 下载文件很容易遇到版权问题,如果用一些普通机器,尤其是美国地区的,稍不小心就会导致 VPS 被停机

因此,如果是需要下载,最好选择 抗 DMCA 投诉 的机器,多分布于欧洲,如卢森堡、摩尔多瓦等

比较推荐的是 BuyVM 家的卢森堡机器,抗 DMCA 投诉

可以额外加购存储块,最低 256GB 存储块为 $1.25/mo.

其他还有低价的抗 DMCA VPS 如 Alexhost 和 AvenaCloud 等,最低配年付都在 $10 左右,但是硬盘比较小,只适合作为中转使用,或是挂载远程硬盘,操作比较麻烦

配置 VPS

Nginx 搭建文件服务器

首先用 Nginx 搭建一个文件服务器,供本地下载已经下载到 VPS 上的文件

  1. 前期准备

    • 添加 DNS,将 <files.domain> 指向 VPS IP
  2. 安装 Nginx

    1
    apt install nginx
  3. 配置 Nginx

    1. 创建存放文件的目录

      1
      mkdir -p /var/www/files
    2. 允许 80 端口经过防火墙

      1
      ufw allow 80
    3. 编辑 <files.domain> 配置

      1
      vim /etc/nginx/sites-available/<files.domain>

      将以下内容写入到 <files.domain>

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      server {
      listen 80;
      server_name <files.domain>;

      location / {
      root /var/www/files;
      autoindex on;
      autoindex_exact_size off;
      autoindex_localtime on;
      }
      }
    4. <files.domain> 创建链接

      1
      ln -s /etc/nginx/sites-available/<files.domain> /etc/nginx/sites-enabled/
    5. 检查 Nginx 配置

      1
      nginx -t

      如果得到以下结果,即包含关键字 successful 即可

      1
      2
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      : configuration file /etc/nginx/nginx.conf test is successful
    6. 重新启动 Nginx 以应用配置文件

      1
      systemctl restart nginx
    7. 此时可以通过 http://<file.domain> 访问文件服务器

  4. (可选,建议)启用 HTTPS

    1. 安装 certbot

      1
      apt install certbot python3-certbot-nginx
    2. 允许 443 端口通过防火墙

      1
      ufw allow 443
    3. 获取证书

      1
      certbot --nginx -d <files.domain>
    4. 编辑配置文件

      1
      vim /etc/nginx/sites-available/<files.domain>
      • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        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
        }
    5. 重新启动 Nginx

      1
      systemctl restart nginx
    6. 此时可以通过 https://<files.domain> 访问文件服务器

  5. 编辑自动检查链接脚本

    1
    vim /root/.sh/check_links.sh

    写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/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"
    1
    2
    chmod +x /root/.sh/check_links.sh
    crontab -e

    在文件末尾加入:

    1
    * * * * * /bin/bash /root/.sh/check_links.sh

配置 aria2

  1. 安装 aria2

    1
    apt install aria2
  2. 配置 aria2

    1. 创建 aria2 相关文件目录

      1
      mkdir -p /root/.aria2
    2. 创建 aria2 配置文件目录

      1
      mkdir -p /etc/aria2
    3. 创建 aria2 下载目录

      1
      mkdir -p /<disk>/aria2Downloads
    4. 编辑 aria2 配置

      1
      vim /etc/aria2/aria2.conf

      输入以下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      # 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

      # 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
    5. 允许 6800 端口通过防火墙

      1
      ufw allow 6800
    6. 创建下载完成时运行脚本 link_completed.sh

      1
      vim /root/.aria2/link_completed.sh

      写入以下内容:

      1
      2
      3
      #!/bin/bash

      ln -s "$3" "/var/www/files/"
    7. 为脚本添加执行权限:

      1
      chmod +x /root/.aria2/link_completed.sh
  3. 启动 aria2 并设置开机自启动

    1. 编辑服务文件

      1
      vim /etc/systemd/system/aria2.service

      写入以下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [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
    2. 将 aria2 服务设置为开机自启动

      1
      systemctl enable aria2
    3. 启动 aria2 服务

      1
      systemctl start aria2
    4. 查看 aria2 状态

      1
      systemctl status aria2

配置 AriaNg

  1. 前期准备

    • 添加 DNS,将 <ariang.domain> 指向 VPS IP
  2. 配置 AriaNg

    1. 安装 AriaNg

      1
      wget https://github.com/mayswind/AriaNg/releases/download/1.3.7/AriaNg-1.3.7-AllInOne.zip
      • 前往 Releases · mayswind/AriaNg 查看最新版本

      • All In One 版本拥有所有需要的内容,可以直接用浏览器访问,普通版本根据需要手动安装

    2. 创建网站目录

      1
      mkdir -p /var/www/ariang
    3. 解压 AriaNg 到网站目录

      1
      unzip AriaNg-1.3.7-AllInOne.zip -d /var/www/ariang

      如果没有 unzip 需先安装

      1
      apt install unzip
    4. 添加 Nginx 配置

      1
      vim /etc/nginx/sites-available/<ariang.domain>

      输入以下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      server {
      listen 80;
      server_name <ariang.domain>;

      location / {
      root /var/www/ariang;
      index index.html;
      }
      }
    5. <ariang.domain> 创建链接

      1
      ln -s /etc/nginx/sites-available/<ariang.domain> /etc/nginx/sites-enabled/
    6. 检查 Nginx 配置

      1
      nginx -t
    7. 重新启动 Nginx

      1
      systemctl restart nginx
    8. 此时可以通过 http://<ariang.domain> 访问 AriaNg

  3. (可选,建议)启用 HTTPS

    1. 安装 certbot

      1
      apt install certbot python3-certbot-nginx
    2. 获取证书

    1
    certbot --nginx -d <ariang.domain>
    1. 编辑配置文件
    1
    vim /etc/nginx/sites-available/<ariang.domain>
    • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      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
      }
    1. 重新启动 Nginx

      1
      systemctl restart nginx
    2. 配置 aria2

      1
      vim /etc/aria2/aria2.conf

      写入以下内容:

      1
      2
      3
      rpc-secure=true
      rpc-certificate=/etc/letsencrypt/live/<ariang.domain>/fullchain.pem
      rpc-private-key=/etc/letsencrypt/live/<ariang.domain>/privkey.pem
    3. 此时可以通过 https://<ariang.domain> 访问 AriaNg。

配置 qBittorrent

  1. 前期准备
  1. 安装 qBittorrent
1
wget https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases/download/release-4.6.5.10/qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip
  1. 将 qBittorrent 解压到安装目录
1
unzip qBittorrent-enhanced-nox_x86_64-linux-musl_static.zip -d /usr/local/bin/

添加可执行权限

1
chmod +x /usr/local/bin/qbittorrent-nox
  1. 添加 qBittorrent 服务
1
vim /etc/systemd/system/qbittorrent.service

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
[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
  1. 重新加载 daemon
1
systemctl daemon-reload
  1. 将 qBittorrent 设置为开机自启动
1
systemctl enable qbittorrent
  1. 允许 8080 端口通过防火墙
1
ufw allow 8080
  1. 启动 qBittorrent
1
systemctl start qbittorrent
  1. 现在可通过 http://<vps-ip>:8080 打开 qBittorrent

    • 首次访问会在 Terminal 给出初始账号密码,进入系统后修改
  2. (可选)绑定域名

    1. 添加 Nginx 配置

      1
      vim /etc/nginx/sites-available/<qbit.domain>

      写入以下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      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;
      }
      }
    2. <qbit.domain> 创建链接

      1
      ln -s /etc/nginx/sites-available/<qbit.domain> /etc/nginx/sites-enabled/
    3. 检查 Nginx 配置

      1
      nginx -t
    4. 重新启动 Nginx

      1
      systemctl restart nginx
    5. 此时可以通过 http://<qbit.domain> 访问 qBittorrent

  3. (可选,建议)启用 HTTPS

    1. 安装 certbot:

      1
      apt install certbot python3-certbot-nginx
    2. 获取证书

      1
      certbot --nginx -d <qbit.domain>
    3. 编辑配置文件

      1
      vim /etc/nginx/sites-available/<qbit.domain>
      • Certbot 应该会自动将配置文件改成以下内容,否则手动编辑:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        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
        }
    4. 重新启动 Nginx

      1
      systemctl restart nginx
    5. 此时可以通过 https://<qbit.domain> 访问 qBittorrent

  4. 配置 qBittorrent

    打开 qBittorrent 网页后前往 工具选项

    • 下载
      • (可选)勾选 为所有文件预分配磁盘空间
      • (可选)勾选 为不完整的文件添加扩展名 .!qB
      • 编辑保存路径为 disk/qBitDownloads
      • 勾选 torrent 完成时运行外部程序,输入 /root/.qBittorrent/link_completed.sh "%F"
    • 连接
      • 记住 用于传入连接的端口 <port>
    • 高级
      • (建议)勾选 Auto Ban Unknown Client From China

        屏蔽迅雷这类的吸血客户端

  5. 防火墙允许端口

    1
    ufw allow <port>
  6. 编辑完成后运行脚本

    1
    vim /root/.qBittorrent/link_completed.sh

    输入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/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
    • 自动找到最顶层的目录然后创建链接
    1
    chmod +x /root/.qBittorrent/link_completed.sh

配置本地下载

aira2

下载的普通文件用 aria2 下载到本地

安装过程与 VPS 类似,需要在下载完成时运行脚本 delete_remote.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/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 列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/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"
1
sh get_urls.sh <FolderURL>

然后把 file_urls.txt 中的内容粘贴到 aria2 中下载

wget

下载的包含目录结构的 BT 文件用 wget 下载到本地

但是 wget 是单线程下载,因此可以手动对目录中的各个文件夹分别使用 wget 下载

无需担心下载下来以后的目录结构问题,wget 会自动创建并管理从 URL 开始的目录结构,只需对文件夹运行以下命令:

1
wget -r -N -c -np -R "index.html*" <URL>

下载完成后前往 http://<qbit.domain> 手动删除任务及文件

更新历史

0.4

做种的时候发现经常有迅雷客户端,明明对他上传的速度不低,他却一直保持进度为 0%,从而保持最高的优先级获取下载,而且只下载不上传

因此我得想办法把迅雷这类的吸血客户端给屏蔽了

但是 aria2 的功能有限,无法实现,于是找到了 qBittorrent 的增强版

从此将普通任务和 BT 任务分离,分别由 aria2 和 qBittorrent 下载,还使得运行脚本极大程度简化,aria2 的下载完成运行脚本只剩

1
2
3
#!/bin/bash

ln -s "$3" "/var/www/files/"

而 qBittorrent 的脚本也只需找到最顶层创建链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/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

1
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 获取当前任务的所有文件列表,并遍历文件、找到最顶层文件夹移动等

0.1

我将 aria2 的下载目录直接指定为 Nginx 文件夹,即 /var/www/files

但是 aria2 下载中的文件和已下载完成的文件不好区分,只是还未下载完的文件会额外多一个 .aria2 文件

于是我将下载文件夹改成 /root/aria2Downloads,下载完成后用脚本移动到 /var/www/files

1
2
3
#!/bin/bash

mv "$3" "/var/www/files/"

About this Post

This post is written by OwlllOvO, licensed under CC BY-NC 4.0.

#Server#aria2#qBittorrent