├── .atmrc ├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.md │ └── feature_request.md └── PULL_REQUEST_TEMPLATE │ └── PULL_REQUEST_TEMPLATE.zh-CN.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── aria2.sh ├── bin ├── atm ├── dht.dat └── dht6.dat ├── conf ├── README.md ├── aria2.conf ├── auto-start-aria2 ├── clean.sh ├── core ├── delete.sh ├── dht.dat ├── dht6.dat ├── function.sh ├── move.sh ├── rclone.env ├── script.conf ├── update.sh └── upload.sh ├── core ├── auto-start-aria2 ├── restart-aria2.sh └── start-aria2.sh ├── install.sh └── script ├── function.sh ├── index.sh ├── strings.sh └── tracker.sh /.atmrc: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | # Version 4 | VER='2.0.1' 5 | REL='202207192259' 6 | 7 | # Available variables 8 | aria2c="$PREFIX/bin/aria2c" 9 | ATMDIR="${PREFIX}/etc/atm" 10 | ATMGIT="${ATMDIR}/main" 11 | WORKDIR="${HOME}/.aria2" 12 | DOWNLOADPATH="/sdcard/Download" 13 | ARIA2CONF="${WORKDIR}/aria2.conf" 14 | ARIA2LOG="${WORKDIR}/aria2.log" 15 | SAMPLEDIR="${HOME}/.config/atm/conf" 16 | ADDONSDIR="${ATMGIT}/script/addons" 17 | ATMLOG="$ATMDIR/logs" 18 | GITHOST="github.com" 19 | GITRES="RimuruW/Aria2-Termux" 20 | BRANCH="master" 21 | 22 | # Developer Mode 23 | DEVMODE= 24 | 25 | # Load custom variables 26 | [[ -f "$HOME/.atmrc" ]] && source "$HOME/.atmrc" 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Bug 反馈(中文) 4 | title: "[BUG REPORT]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | - [ ] 我已阅读项目 README 和 Wiki 11 | - [ ] 我已在 Issues 中搜索相关问题,但是并没有找到解决办法 12 | - [ ] 我使用的是最新版本 Termux 和 Aria2-Termux 13 | - [ ] 我尝试在脚本内更新脚本并在脚本内卸载重装 Aria2,问题并没有消失 14 | 15 | ### 该问题的复现步骤。(必填) 16 | 17 | 18 | 19 | ### 报错信息或截图或相应日志文件。(必填) 20 | 21 | 22 | 23 | ### 你的手机型号及 Android 版本号。如使用第三方自定义系统需说明项目名称(如 Lineage OS)。(选填) 24 | 25 | 26 | 27 | ### 额外补充内容。(选填) 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/PULL_REQUEST_TEMPLATE.zh-CN.md: -------------------------------------------------------------------------------- 1 | ### 相关的Issue 2 | 3 | 4 | ### 原因(目的、解决的问题等) 5 | 6 | 7 | ### 描述(做了什么,变更了什么) 8 | 9 | 10 | ### 测试用例 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at qingxu@qingxu.live. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue, 4 | 5 | email, or any other method with the owners of this repository before making a change. 6 | 7 | Please note we have a code of conduct, please follow it in all your interactions with the project. 8 | 9 | ## Pull Request Process 10 | 11 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a 12 | 13 | build. 14 | 15 | 2. Update the README.md with details of changes to the interface, this includes new environment 16 | 17 | variables, exposed ports, useful file locations and container parameters. 18 | 19 | 3. Increase the version numbers in any examples files and the README.md to the new version that this 20 | 21 | Pull Request would represent. 22 | 23 | ## Code of Conduct 24 | 25 | ### Our Pledge 26 | 27 | In the interest of fostering an open and welcoming environment, we as 28 | 29 | contributors and maintainers pledge to making participation in our project and 30 | 31 | our community a harassment-free experience for everyone, regardless of age, body 32 | 33 | size, disability, ethnicity, gender identity and expression, level of experience, 34 | 35 | nationality, personal appearance, race, religion, or sexual identity and 36 | 37 | orientation. 38 | 39 | ### Our Standards 40 | 41 | Examples of behavior that contributes to creating a positive environment 42 | 43 | include: 44 | 45 | * Using welcoming and inclusive language 46 | 47 | * Being respectful of differing viewpoints and experiences 48 | 49 | * Gracefully accepting constructive criticism 50 | 51 | * Focusing on what is best for the community 52 | 53 | * Showing empathy towards other community members 54 | 55 | Examples of unacceptable behavior by participants include: 56 | 57 | * The use of sexualized language or imagery and unwelcome sexual attention or 58 | 59 | advances 60 | 61 | * Trolling, insulting/derogatory comments, and personal or political attacks 62 | 63 | * Public or private harassment 64 | 65 | * Publishing others' private information, such as a physical or electronic 66 | 67 | address, without explicit permission 68 | 69 | * Other conduct which could reasonably be considered inappropriate in a 70 | 71 | professional setting 72 | 73 | ### Our Responsibilities 74 | 75 | Project maintainers are responsible for clarifying the standards of acceptable 76 | 77 | behavior and are expected to take appropriate and fair corrective action in 78 | 79 | response to any instances of unacceptable behavior. 80 | 81 | Project maintainers have the right and responsibility to remove, edit, or 82 | 83 | reject comments, commits, code, wiki edits, issues, and other contributions 84 | 85 | that are not aligned to this Code of Conduct, or to ban temporarily or 86 | 87 | permanently any contributor for other behaviors that they deem inappropriate, 88 | 89 | threatening, offensive, or harmful. 90 | 91 | ### Scope 92 | 93 | This Code of Conduct applies both within project spaces and in public spaces 94 | 95 | when an individual is representing the project or its community. Examples of 96 | 97 | representing a project or community include using an official project e-mail 98 | 99 | address, posting via an official social media account, or acting as an appointed 100 | 101 | representative at an online or offline event. Representation of a project may be 102 | 103 | further defined and clarified by project maintainers. 104 | 105 | ### Enforcement 106 | 107 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 108 | 109 | reported by contacting the project team at [INSERT EMAIL ADDRESS]. All 110 | 111 | complaints will be reviewed and investigated and will result in a response that 112 | 113 | is deemed necessary and appropriate to the circumstances. The project team is 114 | 115 | obligated to maintain confidentiality with regard to the reporter of an incident. 116 | 117 | Further details of specific enforcement policies may be posted separately. 118 | 119 | Project maintainers who do not follow or enforce the Code of Conduct in good 120 | 121 | faith may face temporary or permanent repercussions as determined by other 122 | 123 | members of the project's leadership. 124 | 125 | ### Attribution 126 | 127 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 128 | 129 | available at [http://contributor-covenant.org/version/1/4][version] 130 | 131 | [homepage]: http://contributor-covenant.org 132 | 133 | [version]: http://contributor-covenant.org/version/1/4/ 134 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Toyo 4 | Copyright (c) 2018 P3TERX 5 | Copyright (c) 2020 RimuruW 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aria2-Termux 2 | ```bash 3 | bash -c "$(curl -L https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/install.sh)" 4 | ``` 5 | > 化繁为简,让 Aria2 的乐趣触手可及。 6 | 7 | ## 简介 8 | 本项目基于 [aria2.sh](https://github.com/P3TERX/aria2.sh),在原项目的基础上二次修改,结合了 Android 设备上的实际情况,去除原脚本某些在 Android 无法实现或意义不大的功能,并借助 Termux 的优势,尽可能在 Android 实现更好的 Aria2 体验。 9 | 10 | 项目已整合了 Aria2 配置文件、附加功能脚本等文件。 11 | 关于配置文件的详细信息请点击[这里](https://github.com/RimuruW/Aria2-Termux/tree/master/conf)。 12 | 13 | ## 功能特性 14 | 15 | - 一键安装管理脚本,即使是终端新手也可以轻松上手 16 | - 简明易用的管理界面,所有管理操作可以在脚本一步完成 17 | - 完善的多功能支持,支持一键更新 BT Trackers、Aria2 开机自启动 18 | - 丰富的附加扩展功能,详见[配置文件说明](https://github.com/RimuruW/Aria2-Termux/tree/master/conf) 19 | 20 | ## 系统要求 21 | 22 | - Android 7.0 - 9.0 (Android 10 以上可能会有一些问题) 23 | - CPU 架构: AArch64, ARM, i686, x86_64. 24 | - 至少 200MB 的空闲存储空间 25 | 26 | **注意:Termux 不支持没有 NEON SIMD 的 ARM 设备,例如 Nvidia Tegra 2 CPUs.** 27 | 28 | *Aria2-Termux 本身无任何特殊系统要求,仅需要一个可正常工作的 Termux 环境,以上要求均为 Termux 正常工作要求。* 29 | 30 | ## 已知问题 31 | 32 | 目前[已知](https://github.com/RimuruW/Aria2-Termux/issues/4),某些情况下使用 Aria2 配置文件启动 Aria2 RPC 后,Aria2 命令行下载不能正常工作。详情请看 [Aria2 命令行下载问题](https://github.com/RimuruW/Aria2-Termux/wiki/Aira2-%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E8%BD%BD%E9%97%AE%E9%A2%98)。 33 | 34 | ## ToDo 35 | - [x] 适配 Termux 36 | - [x] 美观易用的 UI 37 | - [x] 完善的自检测系统 38 | - [ ] 远程控制配置 39 | - [ ] 完善的 README 和 Wiki 40 | 41 | ## 使用说明 42 | 43 | ### 详细使用文档 44 | 请参阅 [Android 一键安装配置 Aria2](https://blog.linioi.com/posts/aria2-for-termux/) 45 | 46 | ### 快速开始 47 | 48 | 1. 安装 Termux 49 | 50 | ~~请在 [Google Play Store](https://play.google.com/store/apps/details?id=com.termux) 下载并安装 Termux。~~ 51 | 52 | 由于[这些原因](https://github.com/termux/termux-app/issues/1072),Google Play Store 不再是推荐的下载地址,请在 [F-Droid](https://f-droid.org/packages/com.termux/) 下载 Termux。 53 | 54 | 2. 安装 Aria2-Termux 55 | 56 | 从 Aria2-Termux 2.0.0 版本开始,Aria2-Termux 提供一键安装脚本用以安装 Aria2-Termux,你可以在 Termux 中输入如下命令一键安装 Aria2-Termux。 57 | 58 | ```bash 59 | bash -c "$(curl -L https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/install.sh)" 60 | ``` 61 | 62 | 对于无法正常访问 GitHub 直链的地区,你也可以在 Termux 中输入如下命令执行安装脚本。 63 | 64 | ```bash 65 | bash -c "$(curl -L https://cdn.jsdelivr.net/gh/RimuruW/Aria2-Termux@master/install.sh)" 66 | ``` 67 | 68 | 69 | 3. 运行脚本 70 | 71 | 从 Aria2-Termux 2.0.0 开始,Aria2-Termux 提供全局启动器 `atm` 用以启动 Aria2-Termux。你可以直接在 Termux 输入如下命令启动 Aria2-Termux。 72 | 73 | ```bash 74 | atm 75 | ``` 76 | 77 | ## 旧版兼容问题 78 | 79 | Aria2-Termux 2.0+ 无法保证与 Aria2-Termux 1.0+ 的兼容性,你可能需要手动迁移至 2.0+ 版本。 80 | 81 | 你仍可以通过如下命令下载安装并运行旧版管理脚本。 82 | 83 | ```bash 84 | bash -c "$(curl -L https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/aria2.sh)" 85 | ``` 86 | 87 | ## 其他 88 | 89 | 默认配置文件路径:`$HOME/.aria2/aria2.conf` 90 | 91 | 默认下载目录:`/sdcard/Download` 92 | 93 | RPC 密钥:随机生成,可在脚本中自定义 94 | 95 | 支持项目请随手点个`star`,可以让更多的人发现、使用并受益。您的支持是我持续开发维护的动力。 96 | 97 | ## 更新日志 98 | 99 | > 因学业原因,本项目开发进度将放缓,见谅。 100 | 101 | ### 2022-07-12 v2.0.1 Beta 2 102 | 103 | - 修复本地 IP 无法获取的 bug 104 | - 增添「关于」界面 105 | - 完善脚本更新机制 106 | - 适配最新版本 Termux 对于镜像源的变更 107 | - 部分界面增添使用提示或者功能说明 108 | 109 | ### 2021-08-16 v2.0.0 Beta 1 110 | 111 | - UI 风格修改 112 | - 优化安装方式 113 | - 简化部分不必要的输出 114 | - 优化 Aria2 的配置管理 115 | 116 | ### 2021-07-26 v1.0.6 117 | 118 | - 完善镜像源检测 119 | - 完善 Aria2 的启动管理 120 | - 修复 Aria2 配置文件的某些错误 121 | 122 | ### 2020-11-23 v1.0.5 123 | 124 | - 整合配置文件至仓库 125 | - 更完善的自检测系统 126 | 127 | ### 2020-11-15 v1.0.4 128 | 129 | - UI 风格微修改 130 | - 代码结构优化 131 | - 添加 Aria2 开机自启动 [#2](https://github.com/RimuruW/Aria2-Termux/issues/2) 132 | 133 | ### 2020-10-23 v1.0.3 134 | 135 | - 细节优化 136 | - 支持 curl 直接执行脚本时自动下载脚本 137 | - 优化存储权限检测 138 | 139 | ### 2020-10-13 v1.0.2 140 | 141 | - 修复了一些影响体验的 bug 142 | - 优化代码结构,使之更符合 Android 实际体验 143 | - 去除某些无意义或作用不大的功能 144 | - 添加 AriaNg 地址自动获取(合并原仓库提交) 145 | - 解决 Aria2 日志无法获取问题 146 | 147 | ### 2020-06-27 v1.0.1 148 | 149 | - 移植适配 Termux 150 | - 解决了某些报错 151 | - 完善更新脚本时的备份机制 152 | 153 | 154 | ## License 155 | 项目使用 [MIT](https://github.com/RimuruW/Aria2-Termux/blob/master/LICENSE) 开源协议,用户使用本项目即代表用户已阅读并同意该开源协议。 156 | -------------------------------------------------------------------------------- /aria2.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | #============================================================= 3 | # https://github.com/RimuruW/Aria2-Termux 4 | # Doc: https://github.com/RimuruW/Aria2-Termux/blob/master/README.md 5 | # More detail: https://qingxu.live/index.php/archives/aria2-for-termux/ 6 | # Description: Aria2 One-click installation management script for Termux 7 | # Environment Required: Android with the latest Termux. (The latest Android version is recommended) 8 | # Author: RimuruW 9 | # Blog: https://qingxu.live 10 | #============================================================= 11 | if [ "$(uname -o)" != "Android" ]; then 12 | PREFIX=/data/data/com.termux/files/usr 13 | fi 14 | 15 | sh_ver="1.0.7" 16 | ver_code="20220719" 17 | export ver_code 18 | #PATH=/data/data/com.termux/files/usr/bin 19 | #export PATH 20 | aria2_conf_dir="$HOME/.aria2" 21 | download_path="/sdcard/Download" 22 | aria2_conf="${aria2_conf_dir}/aria2.conf" 23 | aria2_log="${aria2_conf_dir}/aria2.log" 24 | aria2c="$PREFIX/bin/aria2c" 25 | RED=$(printf '\033[31m') 26 | GREEN=$(printf '\033[32m') 27 | YELLOW=$(printf '\033[33m') 28 | BLUE=$(printf '\033[34m') 29 | LIGHT=$(printf '\033[1;96m') 30 | RESET=$(printf '\033[0m') 31 | 32 | red() { 33 | echo -e "${RED}$1${RESET}" 34 | } 35 | 36 | green() { 37 | echo -e "${GREEN}$1${RESET}" 38 | } 39 | 40 | yellow() { 41 | echo -e "${YELLOW}$1${RESET}" 42 | } 43 | 44 | blue() { 45 | echo -e "${BLUE}$1${RESET}" 46 | } 47 | 48 | light() { 49 | echo -e "${LIGHT}$1${RESET}" 50 | } 51 | 52 | ask() { 53 | # http://djm.me/ask 54 | while true; do 55 | 56 | if [ "${2:-}" = "Y" ]; then 57 | prompt="Y/n" 58 | default=Y 59 | elif [ "${2:-}" = "N" ]; then 60 | prompt="y/N" 61 | default=N 62 | else 63 | prompt="y/n" 64 | default= 65 | fi 66 | 67 | # Ask the question 68 | printf '%s\n' "${LIGHT}" 69 | echo -en "[?] $1 [$prompt] " 70 | 71 | read -r REPLY /dev/null 2>&1 139 | } 140 | 141 | replace_mirrors() { 142 | red "[!] Termux 镜像源不可用!" 143 | blue "对于国内用户,临时添加清华源作为镜像源可以有效增强 Termux 软件包下载速度" 144 | if ask "是否临时添加清华源用以下载脚本依赖?" "Y"; then 145 | cp "${PREFIX}"/etc/apt/sources.list "${PREFIX}"/etc/apt/sources.list.bak 146 | sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' "$PREFIX/etc/apt/sources.list" 147 | apt update && apt upgrade -y 148 | USE_MIRROR=1 149 | else 150 | blue "使用默认源进行安装" 151 | fi 152 | } 153 | 154 | check_mirrors() { 155 | blue "[*] 检查网络环境及镜像源..." 156 | local current_mirror 157 | current_mirror=$(grep -P "^\s*deb\s+" /data/data/com.termux/files/usr/etc/apt/sources.list | grep -oP 'https?://[a-z0-9/._-]+') 158 | 159 | if timeout_test "google.com"; then 160 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 161 | green "[√] 当前镜像源可用" 162 | else 163 | replace_mirrors 164 | fi 165 | elif [[ "$(hostname "$current_mirror")" == *".cn" ]]; then 166 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 167 | green "[√] 当前镜像源可用" 168 | else 169 | replace_mirrors 170 | 171 | fi 172 | else 173 | replace_mirrors 174 | fi 175 | } 176 | 177 | Download_aria2_conf() { 178 | PROFILE_URL1="https://cdn.jsdelivr.net/gh/RimuruW/Aria2-Termux@master/conf" 179 | PROFILE_URL2="https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/conf" 180 | PROFILE_LIST=" 181 | aria2.conf 182 | clean.sh 183 | core 184 | script.conf 185 | rclone.env 186 | upload.sh 187 | delete.sh 188 | dht.dat 189 | dht6.dat 190 | move.sh 191 | auto-start-aria2 192 | " 193 | mkdir -p "${aria2_conf_dir}" 194 | cd "${aria2_conf_dir}" || { red "[!] 目录跳转失败!" >&2; exit 1; } 195 | for PROFILE in ${PROFILE_LIST}; do 196 | [[ ! -f ${PROFILE} ]] && rm -rf "${PROFILE}" 197 | wget -N -t2 -T3 "${PROFILE_URL1}"/"${PROFILE}" || 198 | wget -N -t2 -T3 "${PROFILE_URL2}"/"${PROFILE}" 199 | [[ ! -s ${PROFILE} ]] && { 200 | red "[!] '${PROFILE}' 下载失败!清理残留文件..." 201 | rm -vrf "${aria2_conf_dir}" 202 | exit 1 203 | } 204 | done 205 | sed -i "s@^\(dir=\).*@\1${download_path}@" "${aria2_conf}" 206 | sed -i "s@^\(input-file=\).*@\1${aria2_conf_dir}/aria2.session@" "${aria2_conf}" 207 | sed -i "s@^\(save-session=\).*@\1${aria2_conf_dir}/aria2.session@" "${aria2_conf}" 208 | sed -i "s@/root/.aria2/@${aria2_conf_dir}/@" "${aria2_conf}" 209 | sed -i "s@^\(rpc-secret=\).*@\1$(date +%s%N | md5sum | head -c 20)@" "${aria2_conf}" 210 | sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${download_path}'@" "${aria2_conf_dir}/*.sh" 211 | sed -i "s@#log=@log=${aria2_log}@" "${aria2_conf}" 212 | touch aria2.session 213 | chmod +x ./*.sh 214 | green "[√] Aria2 配置文件下载完成!" 215 | } 216 | 217 | Installation_dependency() { 218 | blue "[*] 检查依赖中…" 219 | apt-get update -y &> /dev/null 220 | for i in nano ca-certificates findutils jq tar gzip dpkg curl; do 221 | if apt list --installed 2>/dev/null | grep "$i"; then 222 | echo " $i 已安装!" 223 | elif [ -e $PREFIX/bin/$i ]; then 224 | echo " $i 已安装!" 225 | else 226 | echo "${BLUE}[*]${RESET} Installing $i..." 227 | apt-get install -y $i || { 228 | red " 229 | [!] 依赖安装失败! 230 | [*] 退出中…… 231 | " 232 | exit 1 233 | } 234 | fi 235 | done 236 | apt-get upgrade -y 237 | } 238 | 239 | Install_aria2() { 240 | check_root 241 | [[ -e ${aria2c} ]] && red "[!] Aria2 已安装,如需重新安装请在脚本中卸载 Aria2!" && return 0 242 | check_sys 243 | check_mirrors 244 | blue "[*] 开始安装并配置依赖..." 245 | Installation_dependency 246 | blue "[*] 开始下载并安装主程序..." 247 | pkg in aria2 -y 2>/dev/null 248 | blue "[*] 开始下载 Aria2 配置文件..." 249 | Download_aria2_conf 250 | aria2_RPC_port=${aria2_port} 251 | blue "[*] 开始创建下载目录..." 252 | check_storage 253 | mkdir -p ${download_path} 254 | [[ -n "$USE_MIRROR" ]] && blue "[*] 正在还原镜像配置..." && mv "${PREFIX}"/etc/apt/sources.list.bak "${PREFIX}"/etc/apt/sources.list 255 | green "[√] 所有步骤执行完毕,开始启动..." 256 | Start_aria2 257 | } 258 | 259 | Start_aria2() { 260 | check_installed_status 261 | check_pid 262 | [[ -n ${PID} ]] && red "[!] Aria2 正在运行!" && return 1 263 | check_storage 264 | blue "[*] 尝试开启唤醒锁…" 265 | termux-wake-lock 266 | green "[√] 所有步骤执行完毕,开始启动..." 267 | $PREFIX/bin/aria2c --conf-path="${aria2_conf}" -D 268 | check_pid 269 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 270 | } 271 | Stop_aria2() { 272 | check_installed_status 273 | check_pid 274 | [[ -z ${PID} ]] && red "[!] Aria2 未启动,请检查日志 !" && return 0 275 | kill -9 "${PID}" 276 | blue "[*] 正在关闭唤醒锁…" 277 | termux-wake-unlock 278 | } 279 | Restart_aria2() { 280 | check_installed_status 281 | check_pid 282 | [[ -n ${PID} ]] && kill -9 "${PID}" 283 | check_storage 284 | blue "[*] 尝试开启唤醒锁……" 285 | termux-wake-lock 286 | green "[√] 所有步骤执行完毕,开始启动..." 287 | $PREFIX/bin/aria2c --conf-path="${aria2_conf}" -D 288 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 289 | } 290 | Set_aria2() { 291 | check_installed_status 292 | aria2_modify=null 293 | echo -e " 294 | ${GREEN}1.${RESET} 修改 Aria2 RPC 密钥 295 | ${GREEN}2.${RESET} 修改 Aria2 RPC 端口 296 | ${GREEN}3.${RESET} 修改 Aria2 下载目录 297 | ${GREEN}4.${RESET} 修改 Aria2 密钥 + 端口 + 下载目录 298 | ${GREEN}5.${RESET} 手动 打开配置文件修改 299 | ${GREEN}6.${RESET} 重置/更新 Aria2 配置文件 300 | ------------------- 301 | ${GREEN}0.${RESET} 退出脚本 302 | " 303 | echo -en " 请输入数字 [0-5]: " 304 | read -r aria2_modify 305 | if [[ ${aria2_modify} == "1" ]]; then 306 | Set_aria2_RPC_passwd 307 | elif [[ ${aria2_modify} == "2" ]]; then 308 | Set_aria2_RPC_port 309 | elif [[ ${aria2_modify} == "3" ]]; then 310 | Set_aria2_RPC_dir 311 | elif [[ ${aria2_modify} == "4" ]]; then 312 | Set_aria2_RPC_passwd_port_dir 313 | elif [[ ${aria2_modify} == "5" ]]; then 314 | Set_aria2_vim_conf 315 | elif [[ ${aria2_modify} == "6" ]]; then 316 | Reset_aria2_conf 317 | elif [[ ${aria2_modify} == "0" ]]; then 318 | return 0 319 | else 320 | echo 321 | echo "${RED}[!]${RESET} 请输入正确的数字" 322 | return 1 323 | fi 324 | } 325 | Set_aria2_RPC_passwd() { 326 | read_123=$1 327 | if [[ ${read_123} != "1" ]]; then 328 | Read_config 329 | fi 330 | if [[ -z "${aria2_passwd}" ]]; then 331 | aria2_passwd_1="空(没有检测到配置,可能手动删除或注释了)" 332 | else 333 | aria2_passwd_1=${aria2_passwd} 334 | fi 335 | echo -e " 336 | ${BLUE}[*]${RESET} Aria2 RPC 密钥不要包含等号(=)和井号(#),留空则随机生成。 337 | 338 | 当前 RPC 密钥为: ${GREEN}${aria2_passwd_1}${RESET} 339 | " 340 | echo -en " 请输入新的 RPC 密钥: " 341 | read -r aria2_RPC_passwd 342 | echo 343 | [[ -z "${aria2_RPC_passwd}" ]] && aria2_RPC_passwd=$(date +%s%N | md5sum | head -c 20) 344 | if [[ "${aria2_passwd}" != "${aria2_RPC_passwd}" ]]; then 345 | if [[ -z "${aria2_passwd}" ]]; then 346 | if echo -e "\nrpc-secret=${aria2_RPC_passwd}" >> "${aria2_conf}"; then 347 | echo -e " 348 | ${BLUE}[√]${RESET} RPC 密钥修改成功! 349 | 新密钥为:${GREEN}${aria2_RPC_passwd}${RESET}(配置文件中缺少相关选项参数,已自动加入配置文件底部)" 350 | if [[ ${read_123} != "1" ]]; then 351 | Restart_aria2 352 | fi 353 | else 354 | echo -e " 355 | ${RED}[!]${RESET} RPC 密钥修改失败! 356 | 旧密钥为:${RED}${aria2_passwd}${RESET} 357 | " 358 | fi 359 | else 360 | if sed -i 's/^rpc-secret='"${aria2_passwd}"'/rpc-secret='"${aria2_RPC_passwd}"'/g' "${aria2_conf}"; then 361 | echo -e " 362 | ${GREEN}[√]${RESET} RPC 密钥修改成功! 363 | 新密钥为:${GREEN}${aria2_RPC_passwd}${RESET}" 364 | if [[ ${read_123} != "1" ]]; then 365 | Restart_aria2 366 | fi 367 | else 368 | echo -e " 369 | ${RED}[!]${RESET} RPC 密钥修改失败! 370 | 旧密钥为:${GREEN}${aria2_passwd}${RESET} 371 | " 372 | fi 373 | fi 374 | else 375 | red "[!] 与旧配置一致,无需修改..." 376 | fi 377 | } 378 | 379 | Set_aria2_RPC_port() { 380 | read_123=$1 381 | if [[ ${read_123} != "1" ]]; then 382 | Read_config 383 | fi 384 | if [[ -z "${aria2_port}" ]]; then 385 | aria2_port_1="空(没有检测到配置,可能手动删除或注释了)" 386 | else 387 | aria2_port_1=${aria2_port} 388 | fi 389 | echo -e " 390 | 当前 RPC 端口为: ${GREEN}${aria2_port_1}${RESET} 391 | " 392 | echo -en " 请输入新的 RPC 端口(默认: 6800): " 393 | read -r aria2_RPC_port 394 | echo 395 | [[ -z "${aria2_RPC_port}" ]] && aria2_RPC_port="6800" 396 | if [[ "${aria2_port}" != "${aria2_RPC_port}" ]]; then 397 | if [[ -z "${aria2_port}" ]]; then 398 | if echo -e "\nrpc-listen-port=${aria2_RPC_port}" >> "${aria2_conf}"; then 399 | echo -e " 400 | ${GREEN}[*]${RESET} RPC 端口修改成功! 401 | 新端口为:${GREEN}${aria2_RPC_port}${RESET}(配置文件中缺少相关选项参数,已自动加入配置文件底部)" 402 | if [[ ${read_123} != "1" ]]; then 403 | Restart_aria2 404 | fi 405 | else 406 | echo -e " 407 | ${RED}[!]${RESET} RPC 端口修改失败! 408 | 旧端口为:${GREEN}${aria2_port}${RESET}" 409 | fi 410 | else 411 | if sed -i 's/^rpc-listen-port='"${aria2_port}"'/rpc-listen-port='"${aria2_RPC_port}"'/g' "${aria2_conf}"; then 412 | echo -e " 413 | ${GREEN}[√]${RESET} RPC 端口修改成功! 414 | 新端口为:${GREEN}${aria2_RPC_port}${RESET} 415 | " 416 | if [[ ${read_123} != "1" ]]; then 417 | Restart_aria2 418 | fi 419 | else 420 | echo -e " 421 | ${RED}[!]${RESET} RPC 端口修改失败! 422 | 旧端口为:${GREEN}${aria2_port}${RESET} 423 | " 424 | fi 425 | fi 426 | else 427 | echo -e "${YELLOW}[!]${RESET} 与旧配置一致,无需修改..." 428 | fi 429 | } 430 | Set_aria2_RPC_dir() { 431 | read_123=$1 432 | if [[ ${read_123} != "1" ]]; then 433 | Read_config 434 | fi 435 | if [[ -z "${aria2_dir}" ]]; then 436 | aria2_dir_1="空(没有检测到配置,可能手动删除或注释了)" 437 | else 438 | aria2_dir_1=${aria2_dir} 439 | fi 440 | echo -e " 441 | 当前下载目录为: ${GREEN}${aria2_dir_1}${RESET} 442 | " 443 | echo -en " 请输入新的下载目录(默认: ${download_path}): " 444 | read -r aria2_RPC_dir 445 | [[ -z "${aria2_RPC_dir}" ]] && aria2_RPC_dir="${download_path}" 446 | mkdir -p ${aria2_RPC_dir} 447 | echo 448 | if [[ "${aria2_dir}" != "${aria2_RPC_dir}" ]]; then 449 | if [[ -z "${aria2_dir}" ]]; then 450 | if echo -e "\ndir=${aria2_RPC_dir}" >> "${aria2_conf}"; then 451 | echo -e " 452 | ${GREEN}[√]${RESET} 下载目录修改成功! 453 | 新位置为:${GREEN}${aria2_RPC_dir}${RESET}(配置文件中缺少相关选项参数,已自动加入配置文件底部) 454 | " 455 | if [[ ${read_123} != "1" ]]; then 456 | Restart_aria2 457 | fi 458 | else 459 | echo -e " 460 | ${RED}[!]${RESET} 下载目录修改失败! 461 | 旧位置为:${GREEN}${aria2_dir}${RESET} 462 | " 463 | fi 464 | else 465 | aria2_dir_2=$(echo "${aria2_dir}" | sed 's/\//\\\//g') 466 | aria2_RPC_dir_2=$(echo "${aria2_RPC_dir}" | sed 's/\//\\\//g') 467 | if sed -i "s@^\(dir=\).*@\1${aria2_RPC_dir_2}@" "${aria2_conf}" && sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${aria2_RPC_dir_2}'@" "${aria2_conf_dir}/*.sh"; then 468 | echo -e " 469 | ${GREEN}[√]${RESET} 下载目录修改成功! 470 | 新位置为:${GREEN}${aria2_RPC_dir}${RESET} 471 | " 472 | if [[ ${read_123} != "1" ]]; then 473 | Restart_aria2 474 | fi 475 | else 476 | echo -e " 477 | ${RED}[!]${RESET} 下载目录修改失败! 478 | 旧位置为:${GREEN}${aria2_dir}${RESET}" 479 | fi 480 | fi 481 | else 482 | echo "${YELLOW}[!]${RESET} 与旧配置一致,无需修改..." 483 | fi 484 | } 485 | Set_aria2_RPC_passwd_port_dir() { 486 | Read_config 487 | Set_aria2_RPC_passwd "1" 488 | Set_aria2_RPC_port "1" 489 | Set_aria2_RPC_dir "1" 490 | Restart_aria2 491 | } 492 | Set_aria2_vim_conf() { 493 | Read_config 494 | aria2_port_old=${aria2_port} 495 | aria2_dir_old=${aria2_dir} 496 | echo -e " 497 | 配置文件位置:${GREEN}${aria2_conf}${RESET} 498 | 499 | ${GREEN}[*]${RESET} 手动修改配置文件须知: 500 | 501 | ${GREEN}1.${RESET} 默认使用 nano 文本编辑器打开 502 | ${GREEN}2.${RESET} 退出并保存文件:按 ${GREEN}Ctrl+X${RESET} 组合键,输入 ${GREEN}y${RESET} ,然后按 ${GREEN}Enter${RESET} 键 503 | ${GREEN}3.${RESET} 退出不保存文件:按 ${GREEN}Ctrl+X${RESET} 组合键,输入 ${GREEN}n${RESET} 504 | ${GREEN}4.${RESET} nano 详细使用教程: \033[4;34mhttps://wiki.archlinux.org/index.php/Nano_(简体中文)${RESET} 505 | " 506 | echo -en "按任意键继续,按 Ctrl+C 组合键取消" 507 | read -r -n 1 line 508 | nano "${aria2_conf}" 509 | Read_config 510 | if [[ ${aria2_port_old} != "${aria2_port}" ]]; then 511 | aria2_RPC_port=${aria2_port} 512 | aria2_port=${aria2_port_old} 513 | fi 514 | if [[ ${aria2_dir_old} != "${aria2_dir}" ]]; then 515 | mkdir -p "${aria2_dir}" 516 | aria2_dir_2=$(echo "${aria2_dir}" | sed 's/\//\\\//g') 517 | sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${aria2_dir_2}'@" "${aria2_conf_dir}/*.sh" 518 | fi 519 | Restart_aria2 520 | } 521 | Reset_aria2_conf() { 522 | Read_config 523 | aria2_port_old=${aria2_port} 524 | echo -e " 525 | ${RED}[!]${RESET} 此操作将重新下载 Aria2 配置文件,所有已设定的配置将丢失。 526 | 527 | 按任意键继续,按 Ctrl+C 组合键取消" 528 | read -r -n 1 line 529 | Download_aria2_conf 530 | Read_config 531 | if [[ ${aria2_port_old} != "${aria2_port}" ]]; then 532 | aria2_RPC_port=${aria2_port} 533 | aria2_port=${aria2_port_old} 534 | fi 535 | Restart_aria2 536 | } 537 | 538 | Read_config() { 539 | status_type=$1 540 | if [[ ! -e ${aria2_conf} ]]; then 541 | if [[ ${status_type} != "un" ]]; then 542 | echo -e "${RED}[!]${RESET} Aria2 配置文件不存在 !" && return 0 543 | fi 544 | else 545 | aria2_dir=$(grep "^dir=" "${aria2_conf}" | grep -v '#'| awk -F "=" '{print $NF}') 546 | aria2_port=$(grep "^rpc-listen-port=" "${aria2_conf}" | grep -v '#' | awk -F "=" '{print $NF}') 547 | aria2_passwd=$(grep "^rpc-secret=" "${aria2_conf}" | grep -v '#' | awk -F "=" '{print $NF}') 548 | fi 549 | } 550 | 551 | View_Aria2() { 552 | check_installed_status 553 | Read_config 554 | IPV4=$( 555 | wget -qO- -t1 -T2 -4 api.ip.sb/ip || 556 | wget -qO- -t1 -T2 -4 ifconfig.io/ip || 557 | wget -qO- -t1 -T2 -4 www.trackip.net/ip 558 | ) 559 | IPV6=$( 560 | wget -qO- -t1 -T2 -6 api.ip.sb/ip || 561 | wget -qO- -t1 -T2 -6 ifconfig.io/ip || 562 | wget -qO- -t1 -T2 -6 www.trackip.net/ip 563 | ) 564 | LocalIP=$( 565 | for LOCALIP in $(ip a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d "/" -f1) 566 | do 567 | unset "$TMPLOCALIP" 568 | TMPLOCALIP=$LOCALIP 569 | done 570 | echo "$TMPLOCALIP" 571 | ) 572 | [[ -z "${IPV4}" ]] && IPV4="IPv4 地址检测失败" 573 | [[ -z "${IPV6}" ]] && IPV6="IPv6 地址检测失败" 574 | [[ -z "${LocalIP}" ]] && LocalIP="本地 IP 获取失败" 575 | [[ -z "${aria2_dir}" ]] && aria2_dir="找不到配置参数" 576 | [[ -z "${aria2_port}" ]] && aria2_port="找不到配置参数" 577 | [[ -z "${aria2_passwd}" ]] && aria2_passwd="找不到配置参数(或无密钥)" 578 | if [[ -z "${IPV4}" || -z "${aria2_port}" ]]; then 579 | AriaNg_URL="null" 580 | else 581 | AriaNg_API="/#!/settings/rpc/set/ws/${LocalIP}/${aria2_port}/jsonrpc/$(echo -n ${aria2_passwd} | base64)" 582 | AriaNg_URL="http://ariang.linioi.com${AriaNg_API}" 583 | fi 584 | clear 585 | echo -e "\nAria2 简单配置信息:\n 586 | IPv4 地址\t: ${GREEN}${IPV4}${RESET} 587 | IPv6 地址\t: ${GREEN}${IPV6}${RESET} 588 | 内网 IP 地址\t: ${GREEN}${LocalIP}${RESET} 589 | RPC 端口\t: ${GREEN}${aria2_port}${RESET} 590 | RPC 密钥\t: ${GREEN}${aria2_passwd}${RESET} 591 | 下载目录\t: ${GREEN}${aria2_dir}${RESET} 592 | AriaNg 链接\t: ${GREEN}${AriaNg_URL}${RESET}\n" 593 | echo -en "\n\n请回车以继续" && read -r -n 1 line 594 | } 595 | 596 | View_Log() { 597 | [[ ! -e ${aria2_log} ]] && echo -e "${RED}[!]${RESET} Aria2 日志文件不存在 !" && return 0 598 | echo && echo -e " 599 | 600 | ${GREEN}[!]${RESET} 按 ${GREEN}Ctrl+C${RESET} 终止查看日志 601 | 如果需要查看完整日志内容,请用 ${GREEN}cat ${aria2_log}${RESET} 命令。 602 | 603 | " 604 | tail -f "${aria2_log}" 605 | } 606 | 607 | Clean_Log() { 608 | [[ ! -e ${aria2_log} ]] && echo -e "${RED}[!]${RESET} Aria2 日志文件不存在 !" && echo -en "\n\n请回车以继续" && read -r -n 1 line && return 0 609 | echo > "${aria2_log}" 610 | echo -e "${GREEN}[√]${RESET} Aria2 日志已清空 !" 611 | echo -en "\n\n请回车以继续" 612 | read -r -n 1 line 613 | } 614 | 615 | Update_bt_tracker() { 616 | check_installed_status 617 | check_pid 618 | if [ -z "$PID" ]; then 619 | bash <(wget -qO- cdn.jsdelivr.net/gh/RimuruW/Aria2-Termux@master/tracker.sh) "${aria2_conf}" 620 | else 621 | bash <(wget -qO- cdn.jsdelivr.net/gh/RimuruW/Aria2-Termux@master/tracker.sh) "${aria2_conf}" RPC 622 | fi 623 | echo -en "\n\n请回车以继续" 624 | read -r -n 1 line 625 | } 626 | 627 | Uninstall_aria2() { 628 | check_installed_status "un" 629 | if ask "确定要卸载 Aria2 ? " "N"; then 630 | apt purge -y aria2 631 | check_pid 632 | [[ -n $PID ]] && kill -9 "${PID}" 633 | Read_config "un" 634 | rm -rf "${aria2c}" 635 | rm -rf "${aria2_conf_dir}" 636 | rm -f "$HOME/.termux/boot/auto-start-aria2" 637 | echo -e "\n${GREEN}[√]${RESET} Aria2 卸载完成!\n" 638 | else 639 | echo && echo "${YELLOW}[*]${RESET} 卸载已取消..." && echo 640 | fi 641 | echo -en "\n\n请回车以继续" 642 | read -r -n 1 line 643 | } 644 | 645 | Update_Shell() { 646 | sh_new_ver=$(wget -qO- -t1 -T3 "https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/aria2.sh" | grep 'ver_code="' | awk -F "=" '{print $NF}' | sed 's/\"//g' | head -1) 647 | [[ -z ${sh_new_ver} ]] && echo -e "${RED}[!]${RESET} 无法链接到 GitHub !" && exit 1 648 | if [ -f "$PREFIX/etc/tiviw/aria2.sh.bak2" ]; then 649 | rm -f $PREFIX/etc/tiviw/aria2.sh.bak2 650 | fi 651 | if [ -f "$PREFIX/etc/tiviw/aria2.sh.bak" ]; then 652 | mv $PREFIX/etc/tiviw/aria2.sh.bak $PREFIX/etc/tiviw/aria2.sh.bak2 653 | fi 654 | if [[ -d $PREFIX/etc/tiviw ]]; then 655 | echo "${BLUE}[!]${RESET} 检测到 Tiviw! 启用 Tiviw 更新方案!" 656 | mkdir -p $PREFIX/etc/tiviw/aria2 657 | mv $PREFIX/etc/tiviw/aria2/aria2.sh $PREFIX/etc/tiviw/aria2/aria2.sh.bak 658 | wget -P $PREFIX/etc/tiviw/aria2 https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/aria2.sh && chmod +x $PREFIX/etc/tiviw/aria2/aria2.sh 659 | return 0 660 | else 661 | wget -N "https://raw.githubusercontent.com/RimuruW/Aria2-Termux/master/aria2.sh" && chmod +x aria2.sh 662 | fi 663 | echo -e " 664 | ${GREEN}[√]${RESET} 脚本已更新为最新版本[${GREEN} ${sh_new_ver} ${RESET}] 665 | ${GREEN}[!]${RESET} 注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可 666 | " 667 | exit 0 668 | } 669 | 670 | Auto_start() { 671 | echo -e "\n\n" 672 | echo -e " 673 | ${YELLOW}[!]${RESET} 受限于 Termux,Aria2 开机自启动需要 Termux 提供相应支持。 674 | ${YELLOW}[!]${RESET} 你需要先安装 ${GREEN}Termux:Boot${RESET} 才可以实现 Termux 675 | Termux:Boot 下载链接: ${GREEN}https://play.google.com/store/apps/details?id=com.termux.boot${RESET} 676 | 677 | ${RED}[!]${RESET} 注意,如果你未安装 ${GREEN}Termux:Boot${RESET},脚本中任何关于 Aria2 自启动的配置${RED}没有任何意义${RESET} 678 | " 679 | if [ -f "$HOME/.termux/boot/auto-start-aria2" ]; then 680 | if ask "你已开启 Aria2 自启动,是否关闭?" "N"; then 681 | if rm -f "$HOME/.termux/boot/auto-start-aria2"; then 682 | echo -e "${GREEN}[√]${RESET} 已关闭 Aria2 自启动" 683 | else 684 | echo -e "${RED}[!] ${RESET} Aria2 自启动关闭失败!" 685 | fi 686 | else 687 | echo "${BLUE}[*]${RESET} 已跳过…" 688 | fi 689 | else 690 | if ask "是否开启 Aria2 开机自启动?" "N"; then 691 | mkdir -p "$HOME/.termux/boot" 692 | if [ -f "$aria2_conf_dir/auto-start-aria2" ]; then 693 | if cp "$aria2_conf_dir/auto-start-aria2" "$HOME/.termux/boot/auto-start-aria2"; then 694 | echo -e "${GREEN}[√]${RESET} Aria2 开机自启动已开启!" 695 | else 696 | echo -e "${RED}[!]${RESET} Aria2 启动开启失败!" 697 | fi 698 | else 699 | echo -e " 700 | ${RED}[!]${RESET} 未找到自启动配置文件! 701 | ${RED}[!]${RESET} 这可能是因为你未通过本脚本完成 Aria2 安装或手动修改了相关目录。 702 | ${RED}[!]${RESET} 请通过脚本重新安装 Aria2 以避免绝大多数可避免的问题!" 703 | fi 704 | else 705 | echo -e "${BLUE}[*]${RESET} 不开启 Aria2 开机自启动…" 706 | fi 707 | fi 708 | } 709 | while true 710 | do 711 | check_script_download 712 | echo && echo -e " 713 | Aria2 一键管理脚本 ${YELLOW}[v${sh_ver}]${RESET} 714 | by ${LIGHT}Qingxu(RimuruW)${RESET} 715 | 716 | ${GREEN} 0.${RESET} 退出 717 | ——————————————————————— 718 | ${GREEN} 1.${RESET} 安装 Aria2 719 | ${GREEN} 2.${RESET} 卸载 Aria2 720 | ——————————————————————— 721 | ${GREEN} 3.${RESET} 启动 Aria2 722 | ${GREEN} 4.${RESET} 停止 Aria2 723 | ${GREEN} 5.${RESET} 重启 Aria2 724 | ——————————————————————— 725 | ${GREEN} 6.${RESET} 修改 配置 726 | ${GREEN} 7.${RESET} 查看 配置 727 | ${GREEN} 8.${RESET} 查看 日志 728 | ${GREEN} 9.${RESET} 清空 日志 729 | ——————————————————————— 730 | ${GREEN} 10.${RESET} 一键更新 BT-Tracker 731 | ${GREEN} 11.${RESET} 一键更新脚本 732 | ${GREEN} 12.${RESET} Aria2 开机自启动 733 | ———————————————————————" && echo 734 | if [[ -e ${aria2c} ]]; then 735 | check_pid 736 | if [[ -n "${PID}" ]]; then 737 | echo -e " Aria2 状态: ${GREEN}已安装${RESET} | ${GREEN}已启动${RESET}" 738 | else 739 | echo -e " Aria2 状态: ${GREEN}已安装${RESET} | ${RED}未启动${RESET}" 740 | fi 741 | else 742 | echo -e " Aria2 状态: ${RED}未安装${RESET}" 743 | fi 744 | if [[ -f "$HOME/.termux/boot/auto-start-aria2" ]]; then 745 | echo -e " Aria2 开机自启动: ${GREEN}已开启${RESET}" 746 | else 747 | echo -e " Aria2 开机自启动: ${RED}未开启${RESET}" 748 | fi 749 | num=null 750 | printf "\n 请输入数字 [0-12]: " 751 | read -r num 752 | case "$num" in 753 | 0) 754 | exit 0 755 | ;; 756 | 1) 757 | Install_aria2 758 | ;; 759 | 2) 760 | Uninstall_aria2 761 | ;; 762 | 3) 763 | Start_aria2 764 | ;; 765 | 4) 766 | Stop_aria2 767 | ;; 768 | 5) 769 | Restart_aria2 770 | ;; 771 | 6) 772 | Set_aria2 773 | ;; 774 | 7) 775 | View_Aria2 776 | ;; 777 | 8) 778 | View_Log 779 | ;; 780 | 9) 781 | Clean_Log 782 | ;; 783 | 10) 784 | Update_bt_tracker 785 | ;; 786 | 11) 787 | Update_Shell 788 | ;; 789 | 12) 790 | Auto_start 791 | ;; 792 | *) 793 | echo 794 | echo -e "${RED}[!]${RESET} 请输入正确的数字" 795 | ;; 796 | esac 797 | done 798 | export line 799 | clear 800 | -------------------------------------------------------------------------------- /bin/atm: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | # set -e 4 | 5 | if [ "$1" ]; then 6 | CMD="$1" 7 | shift 1 8 | else 9 | INDEXSTART=true 10 | fi 11 | 12 | if [ -n ${CMD} ]; then 13 | ARIA2VAR="$@" 14 | fi 15 | 16 | # Load vars 17 | source "$PREFIX/etc/atm/main/.atmrc" 18 | source "$ATMGIT/script/function.sh" 19 | 20 | # Handle git 21 | GITREMOTE="https://$GITHOST/$GITRES" 22 | if [ "$GITHOST" = "github.com" ]; then 23 | GITRAW="https://raw.githubusercontent.com/$GITRES/$BRANCH" 24 | fi 25 | 26 | # > Verbose output goes here 27 | VERLOG="$ATMLOG/atm-verbose.log" 28 | oldVERLOG="$ATMLOG/atm-verbose-old.log" 29 | _ATMLOG="$ATMLOG/atm-log.log" 30 | _oldATMLOG="$ATMLOG/atm-log.log" 31 | EXTRALOG="$ATMDIR/log" 32 | 33 | # Creat folders 34 | mkdir -p "$ATMDIR" 35 | mkdir -p "$ATMLOG" 36 | mkdir -p "$EXTRALOG" 37 | 38 | # Start Logging verbosely 39 | [[ -f $VERLOG ]] && mv -f "$VERLOG" "$oldVERLOG" 2>/dev/null 40 | [[ -f $_ATMLOG ]] && mv -f "$_ATMLOG" "$_oldATMLOG" 2>/dev/null 41 | # set -x 2>$VERLOG 42 | 43 | # Variables 44 | AUTHOR="RimuruW" 45 | MDLVAL="$((${#MDL} + 2))" 46 | 47 | # Check 48 | if [[ $EUID -eq 0 ]]; then 49 | yellow " 50 | [!] 检测到您正在尝试使用 ROOT 权限运行安装脚本 51 | [!] 这是不建议且不被允许的 52 | [!] 安装全过程不需要 ROOT 权限,且以 ROOT 权限运行可能会带来一些无法预料的问题 53 | [!] 为了您的设备安全,请避免在任何情况下以 ROOT 用户运行安装脚本 54 | " 55 | exit 1 56 | fi 57 | 58 | [[ -n "$INDEXSTART" ]] && . "$PREFIX/etc/atm/main/script/index.sh" && exit 0 59 | 60 | case "$CMD" in 61 | -up*) 62 | _PWD=$(pwd) 63 | cd "$PREFIX/etc/atm/main" || { 64 | red "目录跳转失败!" >&2 65 | exit 1 66 | } 67 | git pull -p 68 | cp "$PREFIX/etc/atm/main/bin/atm" "$PREFIX/bin/atm" 69 | cd "$_PWD" || { 70 | red "目录跳转失败!" >&2 71 | exit 1 72 | } 73 | ;; 74 | -rm* | -re*) 75 | if [ -d "$PREFIX/etc/atm" ]; then 76 | rm -rf $PREFIX/etc/atm 77 | green "Aria2-Termux 已移除" 78 | else 79 | "[!] 您并未安装 Aria2-Termux" 80 | fi 81 | ;; 82 | *) 83 | [[ ! -f "$PREFIX/bin/aria2c" ]] && red "请先安装 Aria2" >&2 84 | aria2c --no-conf --allow-overwrite=true "$ARIA2VAR" 85 | ;; 86 | esac 87 | -------------------------------------------------------------------------------- /bin/dht.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimuruW/Aria2-Termux/1bdf83bf972a0da104a9d5e8ee514be617f5ec1a/bin/dht.dat -------------------------------------------------------------------------------- /bin/dht6.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimuruW/Aria2-Termux/1bdf83bf972a0da104a9d5e8ee514be617f5ec1a/bin/dht6.dat -------------------------------------------------------------------------------- /conf/README.md: -------------------------------------------------------------------------------- 1 | ## 配置文件功能特性 2 | - BT 下载率高、速度快 3 | - 重启后不丢失任务进度、不重复下载 4 | - 删除正在下载的任务自动删除未完成的文件 5 | - 下载错误自动删除未完成的文件 6 | - 下载完成自动删除控制文件(.aria2后缀名文件) 7 | - 下载完成自动删除种子文件(.torrent后缀名文件) 8 | - 下载完成自动删除空目录 9 | - 下载完成后自动上传文件至网盘(需要 [Rclone](https://rclone.org) 支持) 10 | - BT 下载完成自动清除垃圾文件(文件类型过滤功能) 11 | - BT 下载完成自动清除小文件(文件大小过滤功能) 12 | 13 | ## License 14 | 部分配置文件整理自互联网,无法列出原作者,在此一并致谢。 15 | 16 | [MIT](https://github.com/RimuruW/Aria2-Termux/blob/master/LICENSE) © Toyo x P3TERX x Qingxu 17 | -------------------------------------------------------------------------------- /conf/aria2.conf: -------------------------------------------------------------------------------- 1 | ## '#'开头为注释内容, 选项都有相应的中文注释说明, 请根据需要进行修改。 2 | ## 本配置文件所有注释和参数均整理自互联网,因来源过多无法一一注明出处,见谅。 3 | ## 本配置文件所有配置项仅可保证脚本可以运行,并非适合 Aria2 的最佳配置文件,根据你个人需要和注释修改配置文件。 4 | ## 被注释的选项填写的是默认值,建议在需要修改时再取消注释(即删掉英文参数前'#')。 5 | 6 | ## 文件保存相关 ## 7 | 8 | # 文件的保存路径,即下载目录,(可使用绝对路径或相对路径), 默认: 当前启动位置 9 | dir=/sdcard/Download 10 | 11 | # 启用磁盘缓存, 0 为禁用缓存,需1.16以上版本, 默认:16M 12 | # 此功能将下载的数据缓存在内存中, 最多占用此选项设置的字节数. 缓存存储由 aria2 实例创建并对所有下载共享. 由于数据以较大的单位写入并按文件的偏移重新排序, 所以磁盘缓存的一个优点是减少磁盘的 I/O. 如果调用哈希检查时并且数据缓存在内存中时, 将不需要从磁盘中读取. 大小可以包含 K 或 M (1K = 1024, 1M = 1024K). 13 | # 路由器或 NAS 等本地设备建议在有足够的内存空闲情况下设置为适当的大小,以减少磁盘 I/O 延长硬盘寿命,但不要超过可用内存空间大小。 14 | disk-cache=16M 15 | 16 | ## 指定文件分配方法(文件预分配方式), 能有效降低磁盘碎片, 默认:prealloc 17 | # 预分配所需时间: none < falloc ? trunc < prealloc 18 | # falloc和trunc则需要文件系统和内核支持 19 | # "none" 不会预先分配文件空间;"prealloc"会在下载开始前预先分配空间, 这将会根据文件的大小需要一定的时间。 如果您使用的是较新的文件系统, 例如 ext4 (带扩展支持)、 btrfs、 xfs 或 NTFS (仅 MinGW 构建), "falloc" 是最好的选择。其几乎可以瞬间分配大文件(数 GiB)。 20 | #不要在旧的文件系统, 例如 ext3 和 FAT32 上使用 falloc, 因为该方式与 prealloc 花费的时间相同, 并且它还会在分配完成前阻塞 aria2。 21 | #当您的系统不支持 posix_fallocate(3) 函数时, falloc 可能无法使用。 "trunc" 使用 ftruncate(2) 系统调用或平台特定的实现将文件截取到特定的长度。在多文件的 BitTorrent 下载中, 若某文件与其相邻的文件共享相同的分片时。 则相邻的文件也会被分配. 22 | #windows(非管理员运行)请勿将选项值改为falloc 23 | file-allocation=prealloc 24 | 25 | # 断点续传:继续下载部分完成的文件. 启用此选项可以继续下载从浏览器或其他程序按顺序下载的文件. 此选项目前只支持 HTTP(S)/FTP 下载的文件。 26 | #continue=true 27 | 28 | 29 | # 始终尝试断点续传,无法断点续传则终止下载,默认:true 30 | #always-resume=false 31 | 32 | # 不支持断点续传的 URI 数值,当 always-resume=false 时生效。 33 | # 达到这个数值从将头开始下载,值为 0 时所有 URI 不支持断点续传时才从头开始下载。 34 | #max-resume-failure-tries=0 35 | 36 | # 获取服务器文件时间,默认:false 37 | #remote-time=true 38 | 39 | ## 下载连接相关 ## 40 | 41 | # 最大同时下载任务数, 运行时可修改, 默认:5 42 | max-concurrent-downloads=5 43 | 44 | # 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M。 45 | ## 简易说明:假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载。 46 | ##完整说明:aria2 不会分割小于 2*SIZE 字节的文件。例如, 文件大小为 20MiB, 如果 SIZE 为 10M, aria2 会把文件分成 2 段 [0-10MiB) 和 [10MiB-20MiB) , 并且使用 2 个源进行下载 (如果 --split >= 2)。如果 SIZE 为 15M, 由于 2*15M > 20MB, 因此 aria2 不会分割文件并使用 1 个源进行下载。 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K)。 47 | min-split-size=10M 48 | 49 | # 同一服务器连接数, 添加时可指定, 默认:1。 50 | # 原版可取最大值为16,自行编译的版本可以解除此限制。若出现兼容性问题,请调整该参数的值。 51 | max-connection-per-server=16 52 | 53 | ## 单个任务最大连接数, 默认:5 54 | # 下载时使用 N 个连接。 如果提供超过 N 个 URI 地址, 则使用前 N 个地址, 剩余的地址将作为备用。 如果提供的 URI 地址不足 N 个, 这些地址多次使用以保证同时建立 N 个连接。 同一服务器的连接数会被 --max-connection-per-server 选项限制。 55 | split=16 56 | 57 | ## 整体(全局)下载速度限制, 运行时可修改, 默认:0 58 | #设置全局最大下载速度 (字节/秒). 0 表示不限制. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 59 | max-overall-download-limit=0 60 | 61 | ## 单个任务下载速度限制, 默认:0 62 | #设置每个任务的最大下载速度 (字节/秒). 0 表示不限制. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 63 | max-download-limit=0 64 | 65 | ## 整体(全局)上传速度限制, 运行时可修改, 默认:0 66 | #设置全局最大上传速度 (字节/秒). 0 表示不限制. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 67 | max-overall-upload-limit=0 68 | 69 | ## 单个任务上传速度限制, 默认:0 70 | #设置每个任务的最大上传速度 (字节/秒). 0 表示不限制. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 71 | max-upload-limit=0 72 | 73 | # 禁用IPv6, 默认:false 74 | disable-ipv6=false 75 | 76 | # 连接超时时间, 默认:60。 77 | #timeout=60 78 | 79 | # 最大尝试(重试)次数, 设置为0表示不限制重试次数, 默认:5 80 | #max-tries=5 81 | 82 | ## 设置重试等待的秒数, 默认:0 83 | # 当此选项的值大于 0 时, aria2 在 HTTP 服务器返回 503 响应时将会重试. 84 | #retry-wait=0 85 | 86 | ## RPC 设置 ## 87 | 88 | # 启用 JSON-RPC/XML-RPC 服务器, 默认:false 89 | enable-rpc=true 90 | 91 | # 允许所有来源(接受所有远程请求), 默认:false 92 | #在 RPC 响应头增加 Access-Control-Allow-Origin 字段, 值为 * 93 | rpc-allow-origin-all=true 94 | 95 | ##在所有网卡上监听 96 | # 在所有网络适配器上监听 JSON-RPC/XML-RPC 的请求, 如果设置为"false", 仅监听本地网络的请求. 97 | rpc-listen-all=true 98 | 99 | # RPC监听端口, 端口被占用时可以修改, 默认:6800 100 | rpc-listen-port=6800 101 | 102 | # RPC 密钥 103 | rpc-secret=ef1f9f5cae8f5b23e6bb 104 | 105 | # RPC 最大请求大小 106 | #rpc-max-request-size=10M 107 | 108 | # RPC 服务 SSL/TLS 加密, 默认:false 109 | # 启用加密后必须使用 https 或者 wss 协议连接 110 | # 不推荐开启,建议使用 web server 反向代理,比如 Nginx、Caddy ,灵活性更强。 111 | #rpc-secure=false 112 | 113 | # 在 RPC 服务中启用 SSL/TLS 加密时的证书文件(.pem/.crt) 114 | #rpc-certificate=/data/data/com.termux/files/home/.aria2/xxx.pem 115 | 116 | # 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件(.key) 117 | #rpc-private-key=/data/data/com.termux/files/home/.aria2/xxx.key 118 | 119 | # 事件轮询方式, 可选:epoll, kqueue, port, poll, select, 不同系统默认值不同 120 | #event-poll=select 121 | 122 | ## SSL/TLS加密相关 ## 123 | 124 | # 是否启用 RPC 服务的 SSL/TLS 加密 125 | # 经测试无法使用自签名证书,若启用此选项,则建议您使用Let's Encrypt等组织签发的有效证书 126 | # 启用加密后 ,RPC 将通过 SSL/TLS 加密传输, RPC 服务需要使用 https 或者 wss 协议连接 127 | # RPC 客户端需要使用 https 协议连接服务器. 对于 WebSocket 客户端, 使用 wss 协议. 使用 --rpc-certificate 和 --rpc-private-key 选项设置服务器的证书和私钥. 128 | #rpc-secure=false 129 | 130 | # 在 RPC 服务中启用 SSL/TLS 加密时的证书文件, 131 | # 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥 132 | #rpc-certificate=./ca-certificates.pem 133 | 134 | # 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件 135 | #rpc-private-key=./ca-certificates.key 136 | 137 | 138 | ## 进度保存设置 ## 139 | 140 | # 从会话文件中读取下载任务 141 | input-file=/data/data/com.termux/files/home/.aria2/aria2.session 142 | 143 | # 在 Aria2 退出时保存`错误/未完成`的下载任务到会话文件 144 | save-session=/data/data/com.termux/files/home/.aria2/aria2.session 145 | 146 | ## HTTP下载 ## 147 | 148 | #支持 GZip 149 | #如果远程服务器的响应头中包含 Content-Encoding: gzip 或 Content-Encoding: deflate , 将发送包含 Accept: deflate, gzip 的请求头并解压缩响应. 150 | #http-accept-gzip=true 151 | 152 | #证书校验 153 | #check-certificate=false 154 | #ca-certificate=./ca-certificates.crt 155 | 156 | ## metalink相关 ## 157 | 158 | #首选使用协议 159 | #指定首选使用的协议. 可以设置为 "http", "https", "ftp" 或"none". 设置为"none"时禁用此选项. 160 | #metalink-preferred-protocol=https 161 | 162 | #仅使用唯一协议 163 | #如果一个 Metalink 文件可用多种协议, 并且此选项设置为"true", aria2 将只会使用其中一种. 使用 --metalink-preferred-protocol 参数指定首选的协议. 164 | #metalink-enable-unique-protocol=false 165 | 166 | ## BT/PT下载相关 ## 167 | 168 | # 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true 169 | #如果设置为"true"或"mem", 当后缀为 .torrent 或内容类型为 application/x-bittorrent 的文件下载完成时, aria2 将按种子文件读取并下载该文件中提到的文件. 如果设置为"mem"(仅内存), 该种子文件将不会写入到磁盘中, 而仅会存储在内存中. 如果设置为"false"(否), 则 .torrent 文件会下载到磁盘中, 但不会按种子文件读取并且其中的文件不会进行下载. 170 | follow-torrent=true 171 | 172 | # BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999 173 | listen-port=16881-16999 174 | 175 | # 单个种子最大连接节点数, 默认:55,0为无限制。 176 | bt-max-peers=0 177 | 178 | # 打开ipv4 DHT功能, PT需要禁用, BT建议启用, 默认:true 179 | #启用 IPv4 DHT 功能. 此选项同时会启用 UDP 服务器支持. 如果种子设置为私有, 即使此选项设置为"true", aria2 也不会启用 DHT. 180 | enable-dht=true 181 | 182 | ## 打开IPv6 DHT功能, PT需要禁用,默认:false 183 | # 启用 IPv6 DHT 功能. 如果种子设置为私有, 即使此选项设置为"true", aria2 也不会启用 DHT. 使用 --dht-listen-port 选项设置监听的端口. 184 | enable-dht6=true 185 | 186 | ## DHT网络监听端口, 默认:6881-6999 187 | # 设置 BT 下载的 TCP,UDP 端口. 多个端口可以使用逗号 "," 分隔, 例如: 6881,6885. 您还可以使用短横线 "-" 表示范围: 6881-6999, 或可以一起使用: 6881-6889, 6999 188 | dht-listen-port=6881-6999 189 | 190 | # 本地节点查找(LPD), PT需要禁用, 默认:false 191 | bt-enable-lpd=true 192 | 193 | ## 种子(节点)交换, PT需要禁用,BT建议启用,默认:true 194 | #启用节点交换扩展. 如果种子设置为私有, 即使此选项设置为"true", aria2 也不会启用此功能. 195 | enable-peer-exchange=true 196 | 197 | ## 期望下载速度(每个种子限速, 对少种的PT很有用), 默认:50K 198 | # 如果一个 BT 下载的整体下载速度低于此选项设置的值, aria2 会临时提高连接数以提高下载速度. 在某些情况下, 设置期望下载速度可以提高您的下载速度. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 199 | bt-request-peer-speed-limit=50K 200 | 201 | ## 客户端伪装 ## 202 | 203 | # 自定义 User Agent 204 | user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4160.0 Safari/537.36 Edg/85.0.537.0 205 | 206 | # BT 客户端伪装 207 | # PT 下载需要保持 user-agent 和 peer-agent 两个参数一致 208 | # 部分 PT 站对 Aria2 有特殊封禁机制,客户端伪装不一定有效,且有封禁账号的风险。 209 | #user-agent=qBittorrent/4.2.5 210 | peer-agent=qBittorrent/4.2.5 211 | peer-id-prefix=-qB4250- 212 | 213 | 214 | ## 需要加密 215 | # 如果设置为"true", aria 将不会接受以前的 BitTorrent 握手协议(\\19BitTorrent 协议)并建立连接. 因此 aria2 总是模糊握手. 216 | #bt-require-crypto=false 217 | 218 | ## 种子分享率 219 | # 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0 220 | # 如果您想不限制分享比率, 可以设置为 0.0 221 | # 如果同时设置了 --seed-time 选项, 当任意一个条件满足时将停止做种. 222 | # 指定更高的分享率意味着您将为P2P网络(生态)作出更大的贡献。 223 | seed-ratio=1.0 224 | 225 | #最小做种时间 226 | #此选项设置为 0 时, 将在 BT 任务下载完成后不进行做种. 227 | #seed-time= 228 | 229 | ## 强制保存会话, 即使任务已经完成, 默认:false 230 | # 较新的版本开启后会在任务完成后依然保留.aria2文件 231 | # 即使任务完成或删除时使用 --save-session 选项时也保存该任务. 此选项在这种情况下还会保存控制文件. 此选项可以保存被认为已经完成但正在做种的 BT 任务. 232 | force-save=true 233 | 234 | ## BT校验相关, 默认:true 235 | #做种前检查文件哈希 236 | #如果设置为"true", 当使用 --check-integrity 选项完成哈希检查及文件完成后才继续做种. 如果您希望仅当文件损坏或未完成时检查文件, 请设置为"false". 此选项仅对 BT 下载有效 237 | bt-hash-check-seed=true 238 | 239 | ## 继续之前的BT任务时, 无需再次校验, 默认:false 240 | #不检查之前下载文件中每个分片的哈希值. 241 | bt-seed-unverified=true 242 | 243 | ## 保存种子文件 244 | # 保存磁力链接元数据为种子文件(.torrent文件), 默认:false 245 | # 保存种子文件为 ".torrent" 文件. 此选项仅对磁链生效. 文件名为十六进制编码后的哈希值及 ".torrent"后缀. 保存的目录与下载文件的目录相同. 如果相同的文件已存在, 种子文件将不会保存. 246 | bt-save-metadata=true 247 | 248 | # 后台运行 249 | #daemon=false 250 | 251 | ## 其它配置参数 252 | 253 | #日志文件 254 | #日志文件的路径. 如果设置为 "-", 日志则写入到 stdout. 如果设置为空字符串(""), 日志将不会记录到磁盘上. 255 | #log= 256 | 257 | #检查完整性 258 | #通过对文件的每个分块或整个文件进行哈希验证来检查文件的完整性. 此选项仅对BT、Metalink及设置了 --checksum 选项的 HTTP(S)/FTP 链接生效. 259 | #check-integrity=false 260 | 261 | #代理服务器 262 | #设置所有协议的代理服务器地址. 如果覆盖之前设置的代理服务器, 使用 "" 即可. 您还可以针对特定的协议覆盖此选项, 即使用 --http-proxy, --https-proxy 和 --ftp-proxy 选项. 此设置将会影响所有下载. 代理服务器地址的格式为 [http://][USER:PASSWORD@]HOST[:PORT]. 263 | #all-proxy= 264 | 265 | #代理服务器用户名 266 | #all-proxy-user= 267 | 268 | #代理服务器密码 269 | #all-proxy-passwd= 270 | 271 | #连接超时时间 272 | #设置建立 HTTP/FTP/代理服务器 连接的超时时间(秒). 当连接建立后, 此选项不再生效, 请使用 --timeout 选项. 273 | #connect-timeout=60 274 | 275 | #模拟运行 276 | #如果设置为"true", aria2 将仅检查远程文件是否存在而不会下载文件内容. 此选项仅对 HTTP/FTP 下载生效. 如果设置为 true, BT 下载将会直接取消. 277 | #dry-run=false 278 | 279 | #最小速度限制 280 | #当下载速度低于此选项设置的值(B/s) 时将会关闭连接. 0 表示不设置最小速度限制. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 此选项不会影响 BT 下载. 281 | #lowest-speed-limit=0 282 | 283 | #文件未找到重试次数 284 | #如果 aria2 从远程 HTTP/FTP 服务器收到 "文件未找到" 的状态超过此选项设置的次数后下载将会失败. 设置为 0 将会禁用此选项. 此选项仅影响 HTTP/FTP 服务器. 重试时同时会记录重试次数, 所以也需要设置 --max-tries 这个选项. 285 | #max-file-not-found=0 286 | 287 | #.netrc 文件路径 288 | #netrc-path=$(HOME)/.netrc 289 | 290 | #禁用 netrc 291 | #no-netrc=false 292 | 293 | #不使用代理服务器列表 294 | #设置不使用代理服务器的主机名, 域名, 包含或不包含子网掩码的网络地址, 多个使用逗号分隔. 295 | #no-proxy= 296 | 297 | #文件名 298 | #下载文件的文件名. 其总是相对于 --dir 选项中设置的路径. 当使用 --force-sequential 参数时此选项无效. 299 | #out= 300 | 301 | #代理服务器请求方法 302 | #设置用来请求代理服务器的方法. 方法可设置为 GET 或 TUNNEL. HTTPS 下载将忽略此选项并总是使用 TUNNEL. 303 | #proxy-method=get 304 | 305 | #获取服务器文件时间 306 | #从 HTTP/FTP 服务获取远程文件的时间戳, 如果可用将设置到本地文件 307 | #remote-time=false 308 | 309 | #URI 复用 310 | #当所有给定的 URI 地址都已使用, 继续使用已经使用过的 URI 地址. 311 | #reuse-uri=true 312 | 313 | #服务器状态保存文件 314 | #指定用来保存服务器状态的文件名. 您可以使用 --server-stat-if 参数读取保存的数据. 315 | #server-stat-of= 316 | 317 | #服务器状态超时 318 | #指定服务器状态的过期时间 (单位为秒). 319 | #server-stat-timeout=86400 320 | 321 | #分片选择算法 322 | #指定 HTTP/FTP 下载使用的分片选择算法. 分片表示的是并行下载时固定长度的分隔段. 如果设置为"default"(默认), aria2 将会按减少建立连接数选择分片. 由于建立连接操作的成本较高, 因此这是合理的默认行为. 如果设置为"inorder"(顺序), aria2 将选择索引最小的分片. 索引为 0 时表示为文件的第一个分片. 这将有助于视频的边下边播. --enable-http-pipelining 选项有助于减少重连接的开销. 请注意, aria2 依赖于 --min-split-size 选项, 所以有必要对 --min-split-size 选项设置一个合理的值. 如果设置为"random"(随机), aria2 将随机选择一个分片. 就像"inorder"(顺序)一样, 依赖于 --min-split-size 选项. 如果设置为"geom"(几何), aria2 会先选择索引最小的分片, 然后会为之前选择的分片保留指数增长的空间. 这将减少建立连接的次数, 同时文件开始部分将会先行下载. 这也有助于视频的边下边播. 323 | #stream-piece-selector=default 324 | 325 | #URI 选择算法 326 | #指定 URI 选择的算法. 可选的值包括"inorder"(按顺序), "feedback"(反馈) 和 "adaptive"(自适应). 如果设置为"inorder", URI 将按列表中出现的顺序使用. 如果设置为"feedback", aria2 将根据之前的下载速度选择 URI 列表中下载速度最快的服务器. 同时也将有效跳过无效镜像. 之前统计的下载速度将作为服务器状态文件的一部分, 参见 --server-stat-of 和 --server-stat-if 选项. 如果设置为"adaptive", 将从最好的镜像和保留的连接里选择一项. 补充说明, 其返回的镜像没有被测试过, 同时如果每个镜像都已经被测试过时, 返回的镜像还会被重新测试. 否则, 其将不会选择其他镜像. 例如"feedback", 其使用服务器状态文件. 327 | #uri-selector=feedback 328 | 329 | #认证质询 330 | #仅当服务器需要时才发送 HTTP 认证请求头. 如果设置为"false", 每次都会发送认证请求头. 例外: 如果用户名和密码包含在 URI 中, 将忽略此选项并且每次都会发送认证请求头. 331 | #http-auth-challenge=false 332 | 333 | #禁用缓存 334 | #发送的请求头中将包含 Cache-Control: no-cache 和 Pragma: no-cache header 以避免内容被缓存. 如果设置为"false", 上述请求头将不会发送, 同时您也可以使用 --header 选项将 Cache-Control 请求头添加进去. 335 | #http-no-cache=false 336 | 337 | #HTTP 默认用户名 338 | #http-user= 339 | 340 | #HTTP 默认密码 341 | #http-passwd= 342 | 343 | #HTTP 代理服务器 344 | #http-proxy= 345 | 346 | #HTTP 代理服务器用户名 347 | #http-proxy-user= 348 | 349 | #HTTP 代理服务器密码 350 | #http-proxy-passwd= 351 | 352 | #HTTPS 代理服务器 353 | #https-proxy= 354 | 355 | #HTTPS 代理服务器用户名 356 | #https-proxy-user= 357 | 358 | #HTTPS 代理服务器密码 359 | #https-proxy-passwd= 360 | 361 | #请求来源 362 | #设置 HTTP 请求来源 (Referer). 此选项将影响所有 HTTP/HTTPS 下载. 如果设置为 *, 请求来源将设置为下载链接. 此选项可以配合 --parameterized-uri 选项使用. 363 | #referer= 364 | 365 | #启用持久连接 366 | #启用 HTTP/1.1 持久连接. 367 | #enable-http-keep-alive=true 368 | 369 | #启用 HTTP 管线化 370 | #启用 HTTP/1.1 管线化. 371 | #enable-http-pipelining=false 372 | 373 | #自定义请求头 374 | #增加 HTTP 请求头内容. 375 | #header= 376 | 377 | #Cookies 保存路径 378 | #以 Mozilla/Firefox(1.x/2.x)/Netscape 格式将 Cookies 保存到文件中. 如果文件已经存在, 将被覆盖. 会话过期的 Cookies 也将会保存, 其过期时间将会设置为 0. 379 | #save-cookies= 380 | 381 | #启用 HEAD 方法 382 | #第一次请求 HTTP 服务器时使用 HEAD 方法. 383 | #use-head=false 384 | 385 | #FTP 默认用户名 386 | #ftp-user=anonymous 387 | 388 | #FTP 默认密码 389 | #如果 URI 中包含用户名单不包含密码, aria2 首先会从 .netrc 文件中获取密码. 如果在 .netrc 文件中找到密码, 则使用该密码. 否则, 使用此选项设置的密码. 390 | #ftp-passwd=ARIA2USER@ 391 | 392 | #被动模式 393 | #在 FTP 中使用被动模式. 如果设置为"false", 则使用主动模式. 此选项不适用于 SFTP 传输. 394 | #ftp-pasv=true 395 | 396 | #FTP 代理服务器 397 | #ftp-proxy= 398 | 399 | #FTP 代理服务器用户名 400 | #ftp-proxy-user= 401 | 402 | #FTP 代理服务器密码 403 | #ftp-proxy-passwd= 404 | 405 | #传输类型 406 | #ftp-type=binary 407 | 408 | #连接复用 409 | #ftp-reuse-connection=true 410 | 411 | #SSH 公钥校验和 412 | #设置 SSH 主机公钥的校验和. TYPE 为哈希类型. 支持的哈希类型为 sha-1 和 md5. DIGEST 是十六进制摘要. 例如: sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3. 此选项可以在使用 SFTP 时用来验证服务器的公钥. 如果此选项不设置, 即保留默认, 不会进行任何验证。 413 | #ssh-host-key-md= 414 | 415 | #分离仅做种任务 416 | #统计当前活动下载任务(参见 -j 选项) 时排除仅做种的任务. 这意味着, 如果参数设置为 -j3, 此选项打开并且当前有 3 个正在活动的任务, 并且其中有 1 个进入做种模式, 那么其会从正在下载的数量中排除(即数量会变为 2), 在队列中等待的下一个任务将会开始执行. 但要知道, 在 RPC 方法中, 做种的任务仍然被认为是活动的下载任务. 417 | bt-detach-seed-only=false 418 | 419 | #启用哈希检查完成事件 420 | #允许 BT 下载哈希检查(参见 -V 选项) 完成后调用命令. 默认情况下, 当哈希检查成功后, 通过 --on-bt-download-complete 设置的命令将会被执行. 如果要禁用此行为, 请设置为"false". 421 | bt-enable-hook-after-hash-check=true 422 | 423 | #BT 排除服务器地址 424 | #逗号分隔的 BT 排除服务器地址. 您可以使用 * 匹配所有地址, 因此将排除所有服务器地址. 当在 shell 命令行使用 * 时, 需要使用转义符或引号. 425 | #bt-exclude-tracker= 426 | 427 | #外部 IP 地址 428 | #指定用在 BitTorrent 下载和 DHT 中的外部 IP 地址. 它可能被发送到 BitTorrent 服务器. 对于 DHT, 此选项将会报告本地节点正在下载特定的种子. 这对于在私有网络中使用 DHT 非常关键. 虽然这个方法叫外部, 但其可以接受各种类型的 IP 地址. 429 | #bt-external-ip= 430 | 431 | #强制加密 432 | #BT 消息中的内容需要使用 arc4 加密. 此选项是设置 --bt-require-crypto --bt-min-crypto-level=arc4 这两个选项的快捷方式. 此选项不会修改上述两个选项的内容. 如果设置为"true", 将拒绝以前的 BT 握手, 并仅使用模糊握手及加密消息. 433 | bt-force-encryption=false 434 | 435 | #加载已保存的元数据文件 436 | #当使用磁链下载时, 在从 DHT 获取种子元数据之前, 首先尝试加载使用 --bt-save-metadata 选项保存的文件. 如果文件加载成功, 则不会从 DHT 下载元数据. 437 | bt-load-saved-metadata=true 438 | 439 | #最多打开文件数 440 | #设置 BT/Metalink 下载全局打开的最大文件数. 441 | bt-max-open-files=100 442 | 443 | #仅下载种子文件 444 | #仅下载种子文件. 种子文件中描述的文件将不会下载. 此选项仅对磁链生效. 445 | bt-metadata-only=false 446 | 447 | #最低加密级别 448 | #设置加密方法的最小级别. 如果节点提供多种加密方法, aria2 将选择满足给定级别的最低级别. 449 | bt-min-crypto-level=plain 450 | 451 | #优先下载 452 | #尝试先下载每个文件开头或结尾的分片. 此选项有助于预览文件. 参数可以包括两个关键词: head 和 tail. 如果包含两个关键词, 需要使用逗号分隔. 每个关键词可以包含一个参数, SIZE. 例如, 如果指定 head=SIZE, 每个文件的最前 SIZE 数据将会获得更高的优先级. tail=SIZE 表示每个文件的最后 SIZE 数据. SIZE 可以包含 K 或 M (1K = 1024, 1M = 1024K). 453 | bt-prioritize-piece= 454 | 455 | #删除未选择的文件 456 | #当 BT 任务完成后删除未选择的文件. 要选择需要下载的文件, 请使用 --select-file 选项. 如果没有选择, 则所有文件都默认为需要下载. 此选项会从磁盘上直接删除文件, 请谨慎使用此选项. 457 | bt-remove-unselected-file=false 458 | 459 | #无速度时自动停止时间 460 | #当 BT 任务下载速度持续为 0, 达到此选项设置的时间后停止下载. 如果设置为 0, 此功能将禁用. 461 | bt-stop-timeout=0 462 | 463 | #BT 服务器连接超时时间 464 | #设置 BT 服务器的连接超时时间 (秒). 当连接建立后, 此选项不再生效, 请使用 --bt-tracker-timeout 选项. 465 | #bt-tracker-connect-timeout=60 466 | 467 | #BT 服务器连接间隔时间 468 | #设置请求 BT 服务器的间隔时间 (秒). 此选项将完全覆盖服务器返回的最小间隔时间和间隔时间, aria2 仅使用此选项的值.如果设置为 0, aria2 将根据服务器的响应情况和下载进程决定时间间隔. 469 | bt-tracker-interval=0 470 | 471 | #BT 服务器超时时间 472 | #bt-tracker-timeout=60 473 | 474 | #DHT (IPv4) 文件 475 | # IPv4 DHT 文件路径,默认:$HOME/.aria2/dht.dat 476 | dht-file-path=/data/data/com.termux/files/home/.aria2/dht.dat 477 | 478 | # IPv6 DHT 文件路径,默认:$HOME/.aria2/dht6.dat 479 | dht-file-path6=/data/data/com.termux/files/home/.aria2/dht6.dat 480 | 481 | #DHT 消息超时时间 482 | dht-message-timeout=10 483 | 484 | #下载 Metalink 中的文件 485 | #如果设置为"true"或"mem"(仅内存), 当后缀为 .meta4 或 .metalink 或内容类型为 application/metalink4+xml 或 application/metalink+xml 的文件下载完成时, aria2 将按 Metalink 文件读取并下载该文件中提到的文件. 如果设置为"mem", 该 Metalink 文件将不会写入到磁盘中, 而仅会存储在内存中. 如果设置为"false", 则 .metalink 文件会下载到磁盘中, 但不会按 Metalink 文件读取并且其中的文件不会进行下载. 486 | follow-metalink=true 487 | 488 | #基础 URI 489 | #指定基础 URI 以便解析本地磁盘中存储的 Metalink 文件里 metalink:url 和 metalink:metaurl 中的相对 URI 地址. 如果 URI 表示的为目录, 最后需要以 / 结尾. 490 | #metalink-base-uri= 491 | 492 | #语言 493 | #metalink-language= 494 | 495 | #首选服务器位置 496 | #首选服务器所在的位置. 可以使用逗号分隔的列表, 例如: jp,us. 497 | #metalink-location= 498 | 499 | #操作系统 500 | #下载文件的操作系统. 501 | #metalink-os= 502 | 503 | #版本号 504 | #下载文件的版本号. 505 | #metalink-version= 506 | 507 | #种子文件下载完后暂停 508 | #当种子文件下载完成后暂停后续的下载. 在 aria2 中有 3 种种子文件的下载类型: (1) 下载 .torrent 文件. (2) 通过磁链下载的种子文件. (3) 下载 Metalink 文件. 这些种子文件下载完后会根据文件内容继续进行下载. 此选项会暂停这些后续的下载. 此选项仅当 --enable-rpc 选项启用时生效. 509 | #pause-metadata=false 510 | 511 | #最大请求大小 512 | #设置 JSON-RPC/XML-RPC 最大的请求大小. 如果 aria2 检测到请求超过设定的字节数, 会直接取消连接. 513 | #rpc-max-request-size=2M 514 | 515 | #保存上传的种子文件 516 | #在 dir 选项设置的目录中保存上传的种子文件或 Metalink 文件. 文件名包括 SHA-1 哈希后的元数据和扩展名两部分. 对于种子文件, 扩展名为 '.torrent'. 对于 Metalink 为 '.meta4'. 如果此选项设置为"false", 通过 aria2.addTorrent() 或 aria2.addMetalink() 方法添加的下载将无法通过 --save-session 选项保存. 517 | #rpc-save-upload-metadata=true 518 | 519 | #允许覆盖 520 | #如果相应的控制文件不存在时从头重新下载文件. 参见 --auto-file-renaming 选项. 521 | allow-overwrite=true 522 | 523 | #允许分片大小变化 524 | #如果设置为"false", 当分片长度与控制文件中的不同时, aria2 将会中止下载. 如果设置为"true", 您可以继续, 但部分下载进度将会丢失. 525 | #allow-piece-length-change=false 526 | 527 | #异步 DNS 528 | #async-dns=true 529 | 530 | #文件自动重命名 531 | #重新命名已经存在的文件. 此选项仅对 HTTP(S)/FTP 下载有效. 新的文件名后会在文件名后、扩展名 (如果有) 前追加句点和数字(1..9999). 532 | #auto-file-renaming=true 533 | 534 | #自动保存间隔 535 | #每隔设置的秒数自动保存控制文件(*.aria2). 如果设置为 0, 下载期间控制文件不会自动保存. 不论设置的值为多少, aria2 会在任务结束时保存控制文件. 可以设置的值为 0 到 600. 536 | auto-save-interval=60 537 | 538 | #条件下载 539 | #仅当本地文件比远程文件旧时才进行下载. 此功能仅适用于 HTTP(S) 下载. 如果在 Metalink 中文件大小已经被指定则功能无法生效. 同时此功能还将忽略 Content-Disposition 响应头. 如果存在控制文件, 此选项将被忽略. 此功能通过 If-Modified-Since 请求头获取较新的文件. 当获取到本地文件的修改时间时, 此功能将使用用户提供的文件名 (参见 --out 选项), 如果没有指定 --out 选项则使用 URI 中的文件名. 为了覆盖已经存在的文件, 需要使用 --allow-overwrite 参数. 540 | #conditional-get=false 541 | 542 | #配置文件路径 543 | #默认为$HOME/.aria2/aria2.conf 544 | #conf-path=/data/data/com.termux/files/home/.aria2/aria2.conf 545 | 546 | #控制台日志级别 547 | console-log-level=notice 548 | 549 | #使用 UTF-8 处理 Content-Disposition 550 | #处理 "Content-Disposition" 头中的字符串时使用 UTF-8 字符集来代替 ISO-8859-1, 例如, 文件名参数, 但不是扩展版本的文件名. 551 | content-disposition-default-utf8=true 552 | 553 | #延迟加载 554 | #如果设置为"true", aria2 在启动时不会读取 --input-file 选项设置的文件中的所有 URI 地址, 而是会在之后需要时按需读取. 如果输入文件中包含大量要下载的 URI, 此选项可以减少内存的使用. 如果设置为"false", aria2 会在启动时读取所有的 URI. 当 -save-session 使用时将会禁用 --deferred-input 选项. 555 | #deferred-input=false 556 | 557 | #下载结果 558 | #此选项将修改下载结果的格式. 如果设置为"default"(默认), 将打印 GID, 状态, 平均下载速度和路径/URI. 如果涉及多个文件, 仅打印第一个请求文件的路径/URI, 其余的将被忽略. 如果设置为"full"(完整), 将打印 GID, 状态, 平均下载速度, 下载进度和路径/URI. 其中, 下载进度和路径/URI 将会每个文件打印一行. 如果设置为"hide"(隐藏), 下载结果将会隐藏. 559 | #download-result=default 560 | 561 | #DSCP 562 | #为 QoS 设置 BT 上行 IP 包的 DSCP 值. 此参数仅设置 IP 包中 TOS 字段的 DSCP 位, 而不是整个字段. 如果您从 /usr/include/netinet/ip.h 得到的值, 需要除以 4 (否则值将不正确, 例如您的 CS1 类将会转为 CS4). 如果您从 RFC, 网络供应商的文档, 维基百科或其他来源采取常用的值, 可以直接使用. 563 | #dscp= 564 | 565 | #最多打开的文件描述符 566 | #设置打开的文件描述符的软限制 (soft limit). 此选项仅当满足如下条件时开放: a. 系统支持它 (posix). b. 限制没有超过硬限制 (hard limit). c. 指定的限制比当前的软限制高. 这相当于设置 ulimit, 除了其不能降低限制. 此选项仅当系统支持 rlimit API 时有效. 567 | #rlimit-nofile= 568 | 569 | #终端输出使用颜色 570 | #enable-color=true 571 | 572 | #启用 MMap 573 | #内存中存放映射文件. 当文件空间没有预先分配时, 此选项无效. 参见 --file-allocation. 574 | #enable-mmap=false 575 | 576 | #保存未找到的文件 577 | #当使用 --save-session 选项时, 即使当任务中的文件不存在时也保存该下载任务. 此选项同时会将这种情况保存到控制文件中. 578 | #save-not-found=true 579 | 580 | #控制台可读输出 581 | #在控制台输出可读格式的大小和速度 (例如, 1.2Ki, 3.4Mi). 582 | #human-readable=true 583 | 584 | #保留未完成的任务 585 | #即使超过了 --max-download-result 选项设置的数量,仍保留所有未完成的下载结果. 这将有助于在会话文件中保存所有的未完成的下载 (参考 --save-session 选项). 需要注意的是, 未完成任务的数量没有上限. 如果不希望这样, 请关闭此选项. 586 | keep-unfinished-download-result=true 587 | 588 | #最多下载结果 589 | #设置内存中存储最多的下载结果数量. 下载结果包括已完成/错误/已删除的下载. 下载结果存储在一个先进先出的队列中, 因此其可以存储最多指定的下载结果的数量. 当队列已满且有新的下载结果创建时, 最早的下载结果将从队列的最前部移除, 新的将放在最后. 此选项设置较大的值后如果经过几千次的下载将导致较高的内存消耗. 设置为 0 表示不存储下载结果. 注意, 未完成的下载将始终保存在内存中, 不考虑该选项的设置. 参考 --keep-unfinished-download-result 选项. 590 | #max-download-result=1000 591 | 592 | #MMap 最大限制 593 | #设置启用 MMap (参见 --enable-mmap 选项) 最大的文件大小. 文件大小由一个下载任务中所有文件大小的和决定. 例如, 如果一个下载包含 5 个文件, 那么文件大小就是这些文件的总大小. 如果文件大小超过此选项设置的大小时, MMap 将会禁用. 594 | #max-mmap-limit=9223372036854775807 595 | 596 | #最大断点续传尝试次数 597 | #当 --always-resume 选项设置为"false"时, 如果 aria2 检测到有 N 个 URI 不支持断点续传时, 将从头开始下载文件. 如果 N 设置为 0, 当所有 URI 都不支持断点续传时才会从头下载文件. 参见 --always-resume 选项. 598 | #max-resume-failure-tries=0 599 | 600 | #最低 TLS 版本 601 | #指定启用的最低 SSL/TLS 版本. 602 | #min-tls-version=TLSv1.2 603 | 604 | #日志级别,可选值:debug, info, notice, warn , error. 默认: debug 605 | log-level=info 606 | 607 | #优化并发下载 608 | #根据可用带宽优化并发下载的数量. aria2 使用之前统计的下载速度通过规则 N = A + B Log10 (速度单位为 Mbps) 得到并发下载的数量. 其中系数 A 和 B 可以在参数中以冒号分隔自定义. 默认值 (A=5, B=25) 可以在 1Mbps 网络上使用通常 5 个并发下载, 在 100Mbps 网络上为 50 个. 并发下载的数量保持在 --max-concurrent-downloads 参数定义的最大之下. 609 | #optimize-concurrent-downloads=false 610 | 611 | #文件分片大小 612 | #设置 HTTP/FTP 下载的分配大小. aria2 根据这个边界分割文件. 所有的分割都是这个长度的倍数. 此选项不适用于 BitTorrent 下载. 如果 Metalink 文件中包含分片哈希的结果此选项也不适用. 613 | #piece-length=1M 614 | 615 | #显示控制台输出 616 | #show-console-readout=true 617 | 618 | #下载摘要输出间隔 619 | #设置下载进度摘要的输出间隔(秒). 设置为 0 禁止输出. 620 | #summary-interval=60 621 | 622 | #禁用配置文件 623 | #no-conf= 624 | 625 | #文件分配限制 626 | #不分配尺寸小于该参数值的文件. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K). 627 | #no-file-allocation-limit=5M 628 | 629 | #启用参数化 URI 支持 630 | #启用参数化 URI 支持. 您可以指定部分的集合: http://{sv1,sv2,sv3}/foo.iso. 同时您也可以使用步进计数器指定数字化的序列: http://host/image[000-100:2].img. 步进计数器可以省略. 如果所有 URI 地址不指向同样的文件, 例如上述第二个示例, 需要使用 -Z 选项. 631 | #parameterized-uri=false 632 | 633 | #禁用控制台输出 634 | quiet=false 635 | 636 | #实时数据块验证 637 | #如果提供了数据块的校验和, 将在下载过程中通过校验和验证数据块. 638 | realtime-chunk-checksum=true 639 | 640 | #删除控制文件 641 | #在下载前删除控制文件. 使用 --allow-overwrite=true 选项时, 总是从头开始下载文件. 此选项将有助于使用不支持断点续传代理服务器的用户. 642 | #remove-control-file= 643 | 644 | #Socket 接收缓冲区大小 645 | #设置 Socket 接收缓冲区最大的字节数. 指定为 0 时将禁用此选项. 当使用 SO_RCVBUF 选项调用 setsockopt() 时此选项的值将设置到 Socket 的文件描述符中. 646 | #socket-recv-buffer-size=0 647 | 648 | #自动关闭时间 649 | #在此选项设置的时间(秒)后关闭应用. 如果设置为 0, 此功能将禁用. 650 | #stop=0 651 | 652 | #缩短控制台输出内容 653 | #缩短控制台输出的内容在一行中. 654 | #truncate-console-readout=true 655 | 656 | ## 执行额外命令 ## 657 | 658 | # 下载停止后执行的命令 659 | # 从 正在下载 到 删除、错误、完成 时触发。暂停被标记为未开始下载,故与此项无关。 660 | on-download-stop=/data/data/com.termux/files/home/.aria2/delete.sh 661 | 662 | ## 下载完成后执行的命令 663 | # 您可以在下载完成后,执行特定脚本来实现高级功能。例如:配合第三方网盘的插件实现下载完成后自动上传的功能,或对下载完成后的文件进行自动分类。 664 | # 此项未定义则执行 下载停止后执行的命令 (on-download-stop) 665 | on-download-complete=/data/data/com.termux/files/home/.aria2/clean.sh 666 | 667 | # 下载错误后执行的命令 668 | # 此项未定义则执行 下载停止后执行的命令 (on-download-stop) 669 | #on-download-error= 670 | 671 | # 下载暂停后执行的命令 672 | #on-download-pause= 673 | 674 | # 下载开始后执行的命令 675 | #on-download-start= 676 | 677 | # BT 下载完成后执行的命令 678 | #on-bt-download-complete= 679 | 680 | ## BitTorrent trackers ## 681 | # 逗号分隔的 BT 服务器地址. 如果服务器地址在 --bt-exclude-tracker 选项中, 其将不会生效. 682 | # Wiki: BitTorrent tracker(中文可称:BT服务器、tracker服务器等)是帮助BitTorrent协议在节点与节点之间做连接的服务器。 683 | # BitTorrent客户端下载一开始就要连接到tracker,从tracker获得其他客户端IP地址后,才能连接到其他客户端下载。在传输过程中,也会一直与tracker通信,上传自己的信息,获取其它客户端的信息。 684 | # 一般BitTorrent客户端可以手动添加tracker。tracker也会提供很多端口。 685 | # 由于tracker对BT下载起到客户端协调和调控的重要作用,所以一旦被封锁会严重影响BT下载。 686 | 687 | bt-tracker= 688 | -------------------------------------------------------------------------------- /conf/auto-start-aria2: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | #============================================================= 3 | # Address: https://github.com/RimuruW/Aria2-Termux 4 | # Doc: https://github.com/RimuruW/Aria2-Termux/blob/master/README.md 5 | # Author: RimuruW 6 | #============================================================= 7 | if [ "$(uname -o)" != "Android" ]; then 8 | PREFIX=/data/data/com.termux/files/usr 9 | fi 10 | 11 | aria2_conf_dir="$HOME/.aria2" 12 | aria2_conf="${aria2_conf_dir}/aria2.conf" 13 | aria2c="$PREFIX/bin/aria2c" 14 | 15 | [[ -f "$PREFIX/etc/atm/main/.atmrc" ]] && source "$PREFIX/etc/atm/main/.atmrc" 16 | [[ -f "$HOME/.atmrc" ]] && source "$HOME/.atmrc" 17 | 18 | if [ -t 1 ]; then 19 | RED=$(printf '\033[31m') 20 | GREEN=$(printf '\033[32m') 21 | YELLOW=$(printf '\033[33m') 22 | BLUE=$(printf '\033[34m') 23 | LIGHT=$(printf '\033[1;96m') 24 | RESET=$(printf '\033[0m') 25 | else 26 | RED="" 27 | GREEN="" 28 | YELLOW="" 29 | BLUE="" 30 | LIGHT="" 31 | RESET="" 32 | fi 33 | 34 | red() { 35 | echo -e "${RED}$1${RESET}" 36 | } 37 | 38 | green() { 39 | echo -e "${GREEN}$1${RESET}" 40 | } 41 | 42 | yellow() { 43 | echo -e "${YELLOW}$1${RESET}" 44 | } 45 | 46 | blue() { 47 | echo -e "${BLUE}$1${RESET}" 48 | } 49 | 50 | light() { 51 | echo -e "${LIGHT}$1${RESET}" 52 | } 53 | 54 | check_installed_status() { 55 | [[ ! -e ${aria2c} ]] && red "[!] Aria2 未安装!" && return 0 56 | [[ ! -e ${aria2_conf} ]] && red " 57 | [!] Aria2 配置文件不存在! 58 | [*] 如果你不是通过本脚本安装 Aria2,请先在本脚本卸载 Aria2! 59 | " 60 | exit 1 61 | } 62 | 63 | check_pid() { 64 | PID=$(pgrep "aria2c" | grep -v grep | grep -v "aria2.sh" | grep -v "service" | awk '{print $1}') 65 | } 66 | 67 | check_storage() { 68 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 未获取存储权限,请回车确认后按指示授权存储权限!" && echo -en "\n请回车以确认" && read -r -n 1 line && termux-setup-storage 69 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 存储权限未获取!请在确保 Termux 已获取存储权限的情况重新启动脚本!" && exit 1 70 | } 71 | 72 | Start_aria2() { 73 | check_installed_status 74 | check_pid 75 | [[ -n ${PID} ]] && red "[!] Aria2 正在运行!" && return 1 76 | $PREFIX/bin/aria2c "$(grep -v '#' "$HOME/.aria2/aria2.conf" | sed '/^$/d' | sed "s/^/--&/g" | sed ':label;N;s/\n/ /;b label')" -D 77 | check_pid 78 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 79 | check_storage 80 | blue "[*] 尝试开启唤醒锁…" 81 | termux-wake-lock 82 | } 83 | 84 | Start_aria2 85 | -------------------------------------------------------------------------------- /conf/clean.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | # 3 | # Copyright (c) 2018-2020 P3TERX 4 | # 5 | # This is free software, licensed under the MIT License. 6 | # See /LICENSE for more information. 7 | # 8 | # https://github.com/P3TERX/aria2.conf 9 | # File name:clean.sh 10 | # Description: Remove redundant files after Aria2 download is complete 11 | # Version: 3.0 12 | # 13 | 14 | CHECK_CORE_FILE() { 15 | CORE_FILE="$(dirname "$0")/core" 16 | if [[ -f "${CORE_FILE}" ]]; then 17 | . "${CORE_FILE}" 18 | else 19 | echo "!!! core file does not exist !!!" 20 | exit 1 21 | fi 22 | } 23 | 24 | CHECK_CORE_FILE "$@" 25 | CHECK_PARAMETER "$@" 26 | CHECK_FILE_NUM 27 | CHECK_SCRIPT_CONF 28 | GET_TASK_INFO 29 | GET_DOWNLOAD_DIR 30 | CONVERSION_PATH 31 | CLEAN_UP 32 | exit 0 33 | -------------------------------------------------------------------------------- /conf/core: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2018-2020 P3TERX 3 | # 4 | # This is free software, licensed under the MIT License. 5 | # See /LICENSE for more information. 6 | # 7 | # https://github.com/P3TERX/aria2.conf 8 | # File name:core 9 | # Description: Aria2 additional function script core file 10 | # Version: 3.0 11 | # 12 | 13 | TASK_GID=$1 14 | FILE_NUM=$2 15 | FILE_PATH=$3 16 | ARIA2_CONF_DIR="$(dirname $0)" 17 | ARIA2_CONF="${ARIA2_CONF_DIR}/aria2.conf" 18 | ARIA2_SESSION="${ARIA2_CONF_DIR}/aria2.session" 19 | SCRIPT_CONF="${ARIA2_CONF_DIR}/script.conf" 20 | RED_FONT_PREFIX="\033[31m" 21 | LIGHT_GREEN_FONT_PREFIX="\033[1;32m" 22 | YELLOW_FONT_PREFIX="\033[1;33m" 23 | LIGHT_PURPLE_FONT_PREFIX="\033[1;35m" 24 | FONT_COLOR_SUFFIX="\033[0m" 25 | INFO="[${LIGHT_GREEN_FONT_PREFIX}INFO${FONT_COLOR_SUFFIX}]" 26 | ERROR="[${RED_FONT_PREFIX}ERROR${FONT_COLOR_SUFFIX}]" 27 | WARRING="[${YELLOW_FONT_PREFIX}WARRING${FONT_COLOR_SUFFIX}]" 28 | 29 | DATE_TIME() { 30 | date +"%m/%d %H:%M:%S" 31 | } 32 | 33 | CHECK_PARAMETER() { 34 | [[ $# -eq 0 ]] && { 35 | echo && echo -e "${ERROR} This script can only be used by passing parameters through Aria2." 36 | exit 1 37 | } 38 | } 39 | 40 | CHECK_FILE_NUM() { 41 | [[ ${FILE_NUM} -eq 0 ]] && { 42 | echo && echo -e "$(DATE_TIME) ${WARRING} Number of files is zero, maybe a Magnet Link." 43 | exit 0 44 | } 45 | } 46 | 47 | CHECK_SCRIPT_CONF() { 48 | if [[ -f "${SCRIPT_CONF}" ]]; then 49 | LOAD_SCRIPT_CONF 50 | else 51 | echo && echo "!!! '${SCRIPT_CONF}' does not exist !!!" 52 | exit 1 53 | fi 54 | } 55 | 56 | LOAD_SCRIPT_CONF() { 57 | DRIVE_NAME="$(grep ^drive-name "${SCRIPT_CONF}" | cut -d= -f2-)" 58 | DRIVE_DIR="$(grep ^drive-dir "${SCRIPT_CONF}" | cut -d= -f2-)" 59 | UPLOAD_LOG_PATH="$(grep ^upload-log "${SCRIPT_CONF}" | cut -d= -f2-)" 60 | DEST_DIR="$(grep ^dest-dir "${SCRIPT_CONF}" | cut -d= -f2-)" 61 | MOVE_LOG_PATH="$(grep ^move-log "${SCRIPT_CONF}" | cut -d= -f2-)" 62 | DELETE_ON_REMOVED="$(grep ^delete-on-removed "${SCRIPT_CONF}" | cut -d= -f2-)" 63 | DELETE_ON_ERROR="$(grep ^delete-on-error "${SCRIPT_CONF}" | cut -d= -f2-)" 64 | DELETE_ON_UNKNOWN="$(grep ^delete-on-unknown "${SCRIPT_CONF}" | cut -d= -f2-)" 65 | DELETE_DOT_ARIA2="$(grep ^delete-dot-aria2 "${SCRIPT_CONF}" | cut -d= -f2-)" 66 | DELETE_DOT_TORRENT="$(grep ^delete-dot-torrent "${SCRIPT_CONF}" | cut -d= -f2-)" 67 | DELETE_EMPTY_DIR="$(grep ^delete-empty-dir "${SCRIPT_CONF}" | cut -d= -f2-)" 68 | MIN_SIZE="$(grep ^min-size "${SCRIPT_CONF}" | cut -d= -f2-)" 69 | INCLUDE_FILE="$(grep ^include-file "${SCRIPT_CONF}" | cut -d= -f2-)" 70 | EXCLUDE_FILE="$(grep ^exclude-file "${SCRIPT_CONF}" | cut -d= -f2-)" 71 | } 72 | 73 | READ_ARIA2_CONF() { 74 | if [ ! -f "${ARIA2_CONF}" ]; then 75 | echo -e "$(DATE_TIME) ${ERROR} '${ARIA2_CONF}' does not exist." 76 | exit 1 77 | else 78 | ARIA2_DOWNLOAD_DIR=$(grep ^dir "${ARIA2_CONF}" | cut -d= -f2-) 79 | RPC_PORT=$(grep ^rpc-listen-port "${ARIA2_CONF}" | cut -d= -f2-) 80 | RPC_SECRET=$(grep ^rpc-secret "${ARIA2_CONF}" | cut -d= -f2-) 81 | SAVE_SESSION_INTERVAL=$(grep ^save-session-interval "${ARIA2_CONF}" | cut -d= -f2-) 82 | [[ ${ARIA2_DOWNLOAD_DIR} && ${RPC_PORT} && ${SAVE_SESSION_INTERVAL} ]] || { 83 | echo -e "$(DATE_TIME) ${ERROR} Aria2 configuration file incomplete." 84 | exit 1 85 | } 86 | RPC_ADDRESS="localhost:${RPC_PORT}/jsonrpc" 87 | fi 88 | } 89 | 90 | RPC_TASK_INFO() { 91 | if [[ "${RPC_SECRET}" ]]; then 92 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.tellStatus","id":"P3TERX","params":["token:'${RPC_SECRET}'","'${TASK_GID}'"]}' 93 | else 94 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.tellStatus","id":"P3TERX","params":["'${TASK_GID}'"]}' 95 | fi 96 | curl "${RPC_ADDRESS}" -fsSd "${RPC_PAYLOAD}" || curl "https://${RPC_ADDRESS}" -kfsSd "${RPC_PAYLOAD}" 97 | } 98 | 99 | GET_TASK_INFO() { 100 | READ_ARIA2_CONF 101 | RPC_RESULT="$(RPC_TASK_INFO)" 102 | } 103 | 104 | GET_DOWNLOAD_DIR() { 105 | [[ -z ${RPC_RESULT} ]] && { 106 | echo -e "$(DATE_TIME) ${ERROR} Aria2 RPC interface error!" 107 | exit 1 108 | } 109 | DOWNLOAD_DIR=$(echo "${RPC_RESULT}" | jq -r '.result.dir') 110 | [[ -z "${DOWNLOAD_DIR}" || "${DOWNLOAD_DIR}" = "null" ]] && { 111 | echo ${RPC_RESULT} | jq '.result' 112 | echo -e "$(DATE_TIME) ${ERROR} Failed to get download directory!" 113 | exit 1 114 | } 115 | } 116 | 117 | GET_TASK_STATUS() { 118 | TASK_STATUS=$(echo "${RPC_RESULT}" | jq -r '.result.status') 119 | [[ -z "${TASK_STATUS}" || "${TASK_STATUS}" = "null" ]] && { 120 | echo "${RPC_RESULT}" | jq '.result' 121 | echo -e "$(DATE_TIME) ${ERROR} Failed to get task status!" 122 | exit 1 123 | } 124 | } 125 | 126 | GET_INFO_HASH() { 127 | INFO_HASH=$(echo "${RPC_RESULT}" | jq -r '.result.infoHash') 128 | if [[ -z "${INFO_HASH}" ]]; then 129 | echo "${RPC_RESULT}" | jq '.result' 130 | echo -e "$(DATE_TIME) ${ERROR} Failed to get Info Hash!" 131 | exit 1 132 | elif [[ "${INFO_HASH}" = "null" ]]; then 133 | return 1 134 | else 135 | TORRENT_FILE="${DOWNLOAD_DIR}/${INFO_HASH}.torrent" 136 | fi 137 | } 138 | 139 | CONVERSION_PATH() { 140 | RELATIVE_PATH="${FILE_PATH#${DOWNLOAD_DIR}/}" 141 | TASK_FILE_NAME="${RELATIVE_PATH%%/*}" 142 | TASK_PATH="${DOWNLOAD_DIR}/${TASK_FILE_NAME}" 143 | DEST_PATH_SUFFIX="${TASK_PATH#${ARIA2_DOWNLOAD_DIR}}" 144 | } 145 | 146 | OUTPUT_LOG() { 147 | echo -e "${LOG}" 148 | [[ "${LOG_PATH}" && -e "${LOG_PATH%/*}" ]] && echo -e "${LOG}" | sed "s,\x1B\[[0-9;]*m,,g" >>"${LOG_PATH}" 149 | } 150 | 151 | CHECK_DOT_ARIA2() { 152 | if [ -f "${FILE_PATH}.aria2" ]; then 153 | DOT_ARIA2_FILE="${FILE_PATH}.aria2" 154 | elif [ -f "${TASK_PATH}.aria2" ]; then 155 | DOT_ARIA2_FILE="${TASK_PATH}.aria2" 156 | else 157 | DOT_ARIA2_FILE='null' 158 | echo -e "$(DATE_TIME) ${INFO} .aria2 file does not exist." 159 | return 1 160 | fi 161 | } 162 | 163 | DELETE_DOT_ARIA2() { 164 | if [[ "${DELETE_DOT_ARIA2}" = "true" ]] && CHECK_DOT_ARIA2; then 165 | echo -e "$(DATE_TIME) ${INFO} Deleting .aria2 file ..." 166 | rm -vf "${DOT_ARIA2_FILE}" 167 | fi 168 | } 169 | 170 | DELETE_TORRENT_FILES() { 171 | sleep $(($SAVE_SESSION_INTERVAL + 1)) 172 | TORRENT_FILES=$(ls "${DOWNLOAD_DIR}" | grep '.*.torrent') 173 | if [[ -f "${ARIA2_SESSION}" && -n "${TORRENT_FILES}" ]]; then 174 | for TORRENT_FILE in "${TORRENT_FILES}"; do 175 | if [[ -n "${TORRENT_FILE}" && -z $(cat "${ARIA2_SESSION}" | grep -i "${TORRENT_FILE%.*}") ]]; then 176 | echo -e "$(DATE_TIME) ${INFO} Deleting .torrent file (enhanced) ..." 177 | rm -vf ${DOWNLOAD_DIR}/${TORRENT_FILE} 178 | fi 179 | done 180 | else 181 | [[ ! -f "${ARIA2_SESSION}" ]] && 182 | echo -e "$(DATE_TIME) ${ERROR} '${ARIA2_SESSION}' does not exist." || 183 | echo -e "$(DATE_TIME) ${WARRING} .torrent file does not exist." 184 | fi 185 | } 186 | 187 | DELETE_DOT_TORRENT() { 188 | if GET_INFO_HASH; then 189 | if [[ "${DELETE_DOT_TORRENT}" = "true" || "${DELETE_DOT_TORRENT}" = "normal" ]] && [[ -f "${TORRENT_FILE}" ]]; then 190 | echo -e "$(DATE_TIME) ${INFO} Deleting .torrent file ..." 191 | rm -vf ${TORRENT_FILE} 192 | elif [[ "${DELETE_DOT_TORRENT}" = "true" || "${DELETE_DOT_TORRENT}" = "enhanced" ]]; then 193 | DELETE_TORRENT_FILES 194 | elif [[ "${DELETE_DOT_TORRENT}" = "normal" ]]; then 195 | echo -e "$(DATE_TIME) ${WARRING} .torrent file may exist but cannot be found. Recommended to enable enhanced mode." 196 | else 197 | echo -e "$(DATE_TIME) ${INFO} Delete .torrent file function is disabled." 198 | fi 199 | else 200 | echo -e "$(DATE_TIME) ${INFO} General download task, skipped delete .torrent file." 201 | fi 202 | } 203 | 204 | DELETE_EMPTY_DIR() { 205 | if [[ "${DELETE_EMPTY_DIR}" = "true" ]]; then 206 | echo -e "$(DATE_TIME) ${INFO} Deleting empty directory ..." 207 | if [[ "${DOWNLOAD_DIR}" =~ "${ARIA2_DOWNLOAD_DIR}" ]]; then 208 | find "${ARIA2_DOWNLOAD_DIR}" ! -path "${ARIA2_DOWNLOAD_DIR}" -depth -type d -empty -exec rm -vrf {} \; 209 | else 210 | find "${DOWNLOAD_DIR}" -depth -type d -empty -exec rm -vrf {} \; 211 | fi 212 | fi 213 | } 214 | 215 | DELETE_EXCLUDE_FILE() { 216 | if [[ ${FILE_NUM} -gt 1 ]] && [[ -n ${MIN_SIZE} || -n ${INCLUDE_FILE} || -n ${EXCLUDE_FILE} ]]; then 217 | echo -e "${INFO} Deleting excluded files ..." 218 | [[ -n ${MIN_SIZE} ]] && find "${TASK_PATH}" -type f -size -${MIN_SIZE} -print0 | xargs -0 rm -vf 219 | [[ -n ${EXCLUDE_FILE} ]] && find "${TASK_PATH}" -type f -regextype posix-extended -iregex ".*\.(${EXCLUDE_FILE})" -print0 | xargs -0 rm -vf 220 | [[ -n ${INCLUDE_FILE} ]] && find "${TASK_PATH}" -type f -regextype posix-extended ! -iregex ".*\.(${INCLUDE_FILE})" -print0 | xargs -0 rm -vf 221 | fi 222 | } 223 | 224 | CLEAN_UP() { 225 | DELETE_DOT_ARIA2 226 | DELETE_DOT_TORRENT 227 | DELETE_EXCLUDE_FILE 228 | DELETE_EMPTY_DIR 229 | } 230 | -------------------------------------------------------------------------------- /conf/delete.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | # 3 | # Copyright (c) 2018-2020 P3TERX 4 | # 5 | # This is free software, licensed under the MIT License. 6 | # See /LICENSE for more information. 7 | # 8 | # https://github.com/P3TERX/aria2.conf 9 | # File name:delete.sh 10 | # Description: Delete files after Aria2 download error or task removed 11 | # Version: 3.0 12 | # 13 | 14 | CHECK_CORE_FILE() { 15 | if [[ -f "${CORE_FILE}" ]]; then 16 | . "${CORE_FILE}" 17 | else 18 | echo "!!! core file does not exist !!!" 19 | exit 1 20 | fi 21 | } 22 | 23 | CHECK_RPC_CONECTION() { 24 | READ_ARIA2_CONF 25 | if [[ "${RPC_SECRET}" ]]; then 26 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.getVersion","id":"P3TERX","params":["token:'${RPC_SECRET}'"]}' 27 | else 28 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.getVersion","id":"P3TERX"}' 29 | fi 30 | (curl "${RPC_ADDRESS}" -fsSd "${RPC_PAYLOAD}" || curl "https://${RPC_ADDRESS}" -kfsSd "${RPC_PAYLOAD}") >/dev/null 31 | } 32 | 33 | DELETE_ON_STOP() { 34 | if [[ "${TASK_STATUS}" = "error" && "${DELETE_ON_ERROR}" = "true" ]] || [[ "${TASK_STATUS}" = "removed" && "${DELETE_ON_REMOVED}" = "true" ]]; then 35 | if [[ -f "${TASK_PATH}.aria2" ]]; then 36 | echo -e "$(DATE_TIME) ${INFO} Download task ${TASK_STATUS}, deleting files..." 37 | rm -vrf "${TASK_PATH}.aria2" "${TASK_PATH}" 38 | else 39 | [[ -e "${TASK_PATH}" ]] && 40 | echo -e "$(DATE_TIME) ${WARRING} Skip delete. Download completed files: ${TASK_PATH}" || 41 | echo -e "$(DATE_TIME) ${WARRING} Skip delete. File does not exist: ${TASK_PATH}" 42 | fi 43 | else 44 | echo -e "$(DATE_TIME) ${WARRING} Skip delete. Task status invalid: ${TASK_STATUS}" 45 | fi 46 | } 47 | 48 | DELETE_ON_UNKNOWN() { 49 | if [[ -f "${FILE_PATH}.aria2" ]]; then 50 | echo -e "$(DATE_TIME) ${INFO} Download task force removed, deleting files..." 51 | rm -vrf "${FILE_PATH}.aria2" "${FILE_PATH}" 52 | else 53 | [[ -e "${FILE_PATH}" ]] && 54 | echo -e "$(DATE_TIME) ${WARRING} Skip delete. Download completed files: ${FILE_PATH}" || 55 | echo -e "$(DATE_TIME) ${WARRING} Skip delete. File does not exist: ${FILE_PATH}" 56 | fi 57 | } 58 | 59 | DELETE_FILE() { 60 | if GET_TASK_INFO; then 61 | GET_DOWNLOAD_DIR 62 | GET_TASK_STATUS 63 | CONVERSION_PATH 64 | DELETE_ON_STOP 65 | DELETE_DOT_TORRENT 66 | DELETE_EMPTY_DIR 67 | elif CHECK_RPC_CONECTION && [[ "${DELETE_ON_UNKNOWN}" = "true" && ${FILE_NUM} -eq 1 ]]; then 68 | DELETE_ON_UNKNOWN 69 | else 70 | echo -e "$(DATE_TIME) ${ERROR} Aria2 RPC interface error!" 71 | exit 1 72 | fi 73 | } 74 | 75 | CHECK_CORE_FILE "$@" 76 | CHECK_PARAMETER "$@" 77 | CHECK_FILE_NUM 78 | CHECK_SCRIPT_CONF 79 | DELETE_FILE 80 | exit 0 81 | -------------------------------------------------------------------------------- /conf/dht.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimuruW/Aria2-Termux/1bdf83bf972a0da104a9d5e8ee514be617f5ec1a/conf/dht.dat -------------------------------------------------------------------------------- /conf/dht6.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimuruW/Aria2-Termux/1bdf83bf972a0da104a9d5e8ee514be617f5ec1a/conf/dht6.dat -------------------------------------------------------------------------------- /conf/function.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | ask() { 4 | # http://djm.me/ask 5 | while true; do 6 | 7 | if [ "${2:-}" = "Y" ]; then 8 | prompt="Y/n" 9 | default=Y 10 | elif [ "${2:-}" = "N" ]; then 11 | prompt="y/N" 12 | default=N 13 | else 14 | prompt="y/n" 15 | default= 16 | fi 17 | 18 | # Ask the question 19 | printf '%s\n' "${LIGHT}" 20 | echo -en "[?] $1 [$prompt] " 21 | 22 | read -r REPLY /dev/null; then 75 | return 0 76 | else 77 | exit 1 78 | fi 79 | } 80 | 81 | network_check_sea() { 82 | network_check 83 | green "[*] 尝试检查网络可用性…" 84 | if ping -q -c 1 -W 1 google.com >/dev/null; then 85 | return 0 86 | else 87 | return 1 88 | fi 89 | } 90 | 91 | remote_status() { 92 | if git remote -v | grep "https://github.com/RimuruW/Aria2-Termux"; then 93 | green "[√] 远程仓库地址为源地址!" 94 | return 0 95 | else 96 | red "[!] 远程仓库地址异常!" 97 | return 1 98 | fi 99 | } 100 | 101 | update_atm() { 102 | if network_check_sea; then 103 | cd $atm_git/main || { 104 | red "[!] 目录跳转失败!" >&2 105 | exit 1 106 | } 107 | git pull 2>/dev/null 108 | cp atm "$PREFIX"/bin/atm 109 | green " 110 | [*] 已拉取最新版本! 111 | [*] 请重启脚本以应用更新! 112 | " 113 | else 114 | cd "$ToolPATH/core" || { 115 | red "[!] 目录跳转失败!" >&2 116 | exit 1 117 | } 118 | git remote set-url origin https://gitee.com/RimuruW/tiviw 119 | if update_remote_status; then 120 | green "[*] 尝试拉取最新版本…" 121 | git checkout . && git clean -xd -f 122 | git pull 2>/dev/null 123 | cp tiviw $PREFIX/bin/tiviw 124 | green "[*] 拉取结束!" 125 | green "[*] 请重启脚本以应用更新!" 126 | else 127 | red "[*] 仍然尝试拉起最新版本…" 128 | red " 拉取可能会失败!" 129 | git checkout . && git clean -xd -f 130 | git pull 2>/dev/null 131 | cp tiviw $PREFIX/bin/tiviw 132 | green "[*] 拉取结束!" 133 | green "[*] 请重启脚本以应用更新!" 134 | fi 135 | git remote set-url origin https://github.com/RimuruW/Tiviw 136 | if remote_status; then 137 | green "[√] 远程仓库地址恢复成功!" 138 | else 139 | red " 140 | [!] 远程仓库地址恢复失败! 141 | 请手动输入 cd $ToolPATH/main && git remote set-url origin https://github.com/RimuruW/Tiviw 恢复远程仓库地址 142 | 提交该界面截图至开发者以帮助开发者解决该问题! 143 | " 144 | exit 1 145 | fi 146 | fi 147 | cd "$HOME" || { 148 | red "[!] 目录跳转失败!" >&2 149 | exit 1 150 | } 151 | } 152 | 153 | check_apt_ability() { 154 | if check_mirror; then 155 | green "Termux 镜像源已配置" 156 | return 0 157 | else 158 | if network_check_sea; then 159 | return 0 160 | else 161 | red "根据检测结果,脚本认定你当前网络环境无法完成安装!" 162 | red "对于国内用户,请配置镜像源以完成安装!" 163 | blue "是否跳转到 Termux 镜像源配置?[y/n]" 164 | Enter 165 | read -r MIRROR_CHOOSE 166 | case $MIRROR_CHOOSE in 167 | y) 168 | source "$ToolPATH/core/main/mirror.sh" 169 | return 0 170 | ;; 171 | *) 172 | red "跳过镜像源配置!" 173 | red "警告,根据网络环境和镜像源配置检测结果,脚本认为你无法完成安装!" 174 | red "安装强制中止!" 175 | Step 176 | return 1 177 | ;; 178 | esac 179 | fi 180 | fi 181 | } 182 | 183 | check_dependency() { 184 | blue "[*] 检查依赖中…" 185 | apt-get update -y &>/dev/null 186 | for i in $1; do 187 | if apt list --installed 2>/dev/null | grep "$i"; then 188 | echo "${GREEN}[√]${RESET} $i 已安装!" 189 | else 190 | echo "Installing $i..." 191 | apt-get install -y "$i" || { 192 | red " 193 | [!] 依赖安装失败! 194 | [*] 退出中…… 195 | " 196 | exit 1 197 | } 198 | fi 199 | done 200 | apt-get upgrade -y 201 | } 202 | 203 | Enter() { 204 | echo -en "\t\tEnter an option: " 205 | } 206 | 207 | Step() { 208 | echo -en "\n\n\t\t\t请回车以确认" 209 | read -r -n 1 line 210 | } 211 | 212 | sp() { 213 | echo -e "\n" 214 | } 215 | 216 | Abort() { 217 | abort_echo=$1 218 | red "$abort_echo" 219 | exit 0 220 | } 221 | 222 | check_mirrors() { 223 | mirrors_status=$(grep "mirror" "$PREFIX/etc/apt/sources.list" | grep -v '#') 224 | if [ -z "$mirrors_status" ]; then 225 | red "[!] Termux 镜像源未配置!" 226 | blue "对于国内用户,添加清华源作为镜像源可以有效增强 Termux 软件包下载速度" 227 | if ask "是否添加清华源?" "Y"; then 228 | sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' "$PREFIX/etc/apt/sources.list" 229 | sed -i 's@^\(deb.*games stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games stable@'"$PREFIX/etc/apt/sources.list.d/game.list" 230 | sed -i 's@^\(deb.*science stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science stable@' "$PREFIX/etc/apt/sources.list.d/science.list" 231 | apt update && apt upgrade -y 232 | else 233 | blue "[√] 使用默认源进行安装" 234 | fi 235 | fi 236 | } -------------------------------------------------------------------------------- /conf/move.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | # 3 | # Copyright (c) 2018-2020 P3TERX 4 | # 5 | # This is free software, licensed under the MIT License. 6 | # See /LICENSE for more information. 7 | # 8 | # https://github.com/P3TERX/aria2.conf 9 | # File name:move.sh 10 | # Description: Move files after Aria2 download is complete 11 | # Version: 3.0 12 | # 13 | 14 | CHECK_CORE_FILE() { 15 | CORE_FILE="$(dirname "$0")/core" 16 | if [[ -f "${CORE_FILE}" ]]; then 17 | . "${CORE_FILE}" 18 | else 19 | echo "!!! core file does not exist !!!" 20 | exit 1 21 | fi 22 | } 23 | 24 | TASK_INFO() { 25 | echo -e " 26 | -------------------------- [${YELLOW_FONT_PREFIX}Task Infomation${FONT_COLOR_SUFFIX}] -------------------------- 27 | ${LIGHT_PURPLE_FONT_PREFIX}Task GID:${FONT_COLOR_SUFFIX} ${TASK_GID} 28 | ${LIGHT_PURPLE_FONT_PREFIX}Number of Files:${FONT_COLOR_SUFFIX} ${FILE_NUM} 29 | ${LIGHT_PURPLE_FONT_PREFIX}First File Path:${FONT_COLOR_SUFFIX} ${FILE_PATH} 30 | ${LIGHT_PURPLE_FONT_PREFIX}Task File Name:${FONT_COLOR_SUFFIX} ${TASK_FILE_NAME} 31 | ${LIGHT_PURPLE_FONT_PREFIX}Task Path:${FONT_COLOR_SUFFIX} ${TASK_PATH} 32 | ${LIGHT_PURPLE_FONT_PREFIX}Aria2 Download Directory:${FONT_COLOR_SUFFIX} ${ARIA2_DOWNLOAD_DIR} 33 | ${LIGHT_PURPLE_FONT_PREFIX}Custom Download Directory:${FONT_COLOR_SUFFIX} ${DOWNLOAD_DIR} 34 | ${LIGHT_PURPLE_FONT_PREFIX}Source Path:${FONT_COLOR_SUFFIX} ${SOURCE_PATH} 35 | ${LIGHT_PURPLE_FONT_PREFIX}Destination Path:${FONT_COLOR_SUFFIX} ${DEST_PATH} 36 | ${LIGHT_PURPLE_FONT_PREFIX}.aria2 File Path:${FONT_COLOR_SUFFIX} ${DOT_ARIA2_FILE} 37 | -------------------------- [${YELLOW_FONT_PREFIX}Task Infomation${FONT_COLOR_SUFFIX}] -------------------------- 38 | " 39 | } 40 | 41 | OUTPUT_MOVE_LOG() { 42 | LOG="${MOVE_LOG}" 43 | LOG_PATH="${MOVE_LOG_PATH}" 44 | export LOG LOG_PATH 45 | OUTPUT_LOG 46 | } 47 | 48 | DEFINITION_PATH() { 49 | SOURCE_PATH="${TASK_PATH}" 50 | if [[ "${DOWNLOAD_DIR}" != "${ARIA2_DOWNLOAD_DIR}" && "${DOWNLOAD_DIR}" =~ ${ARIA2_DOWNLOAD_DIR} ]]; then 51 | DEST_PATH="${DEST_DIR}${DEST_PATH_SUFFIX%/*}" 52 | else 53 | DEST_PATH="${DEST_DIR}" 54 | fi 55 | } 56 | 57 | MOVE_FILE() { 58 | echo -e "$(DATE_TIME) ${INFO} Start move files ..." 59 | TASK_INFO 60 | mkdir -p "${DEST_PATH}" 61 | mv -vf "${SOURCE_PATH}" "${DEST_PATH}" 62 | MOVE_EXIT_CODE=$? 63 | if [ ${MOVE_EXIT_CODE} -eq 0 ]; then 64 | MOVE_LOG="$(DATE_TIME) ${INFO} Move done: ${SOURCE_PATH} -> ${DEST_PATH}" 65 | else 66 | MOVE_LOG="$(DATE_TIME) ${ERROR} Move failed: ${SOURCE_PATH}" 67 | fi 68 | OUTPUT_MOVE_LOG 69 | DELETE_EMPTY_DIR 70 | } 71 | 72 | CHECK_CORE_FILE "$@" 73 | CHECK_PARAMETER "$@" 74 | CHECK_FILE_NUM 75 | CHECK_SCRIPT_CONF 76 | GET_TASK_INFO 77 | GET_DOWNLOAD_DIR 78 | CONVERSION_PATH 79 | DEFINITION_PATH 80 | CLEAN_UP 81 | MOVE_FILE 82 | exit 0 83 | -------------------------------------------------------------------------------- /conf/rclone.env: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2018-2020 P3TERX 3 | # 4 | # This is free software, licensed under the MIT License. 5 | # See /LICENSE for more information. 6 | # 7 | # https://github.com/P3TERX/aria2.conf 8 | # File name:rclone.env 9 | # Description: Rclone environment variables file 10 | # Version: 2020.07.05 11 | # 12 | 13 | # RCLONE 配置文件路径 14 | #export RCLONE_CONFIG=$HOME/.config/rclone/rclone.conf 15 | 16 | # RCLONE 配置文件密码 17 | #export RCLONE_CONFIG_PASS= 18 | 19 | # RCLONE 并行上传文件数,仅对单个任务有效。 20 | #export RCLONE_TRANSFERS=4 21 | 22 | # RCLONE 缓存大小。默认:16M 23 | # 理论上此项值越大文件传输速度越快。每个并行任务都将占用此大小的内存进行缓存,根据实际内存大小合理设置,设置得太大可能会导致进程中断。 24 | #export RCLONE_BUFFER_SIZE=16M 25 | 26 | # RCLONE 上传失败重试次数,默认:3 27 | #export RCLONE_RETRIES=3 28 | 29 | # RCLONE 上传失败重试等待时间(s, m, h),默认禁用 30 | export RCLONE_RETRIES_SLEEP=10s 31 | 32 | # RCLONE 跳过错误继续上传。默认:false 33 | #export RCLONE_IGNORE_ERRORS=true 34 | 35 | # RCLONE 跳过已经存在的文件。默认:false 36 | #export RCLONE_IGNORE_EXISTING=true 37 | 38 | # RCLONE 实时显示传输进度,否则每分钟显示一次。默认:false 39 | #export RCLONE_PROGRESS=true 40 | 41 | # RCLONE 代理设置 42 | #export HTTP_PROXY=localhost:1080 43 | #export HTTPS_PROXY=$HTTP_PROXY 44 | 45 | # More details 46 | # https://rclone.org/docs/#environment-variables 47 | -------------------------------------------------------------------------------- /conf/script.conf: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2018-2020 P3TERX 3 | # 4 | # This is free software, licensed under the MIT License. 5 | # See /LICENSE for more information. 6 | # 7 | # https://github.com/P3TERX/aria2.conf 8 | # File name:script.conf 9 | # Description: Aria2 additional function script configuration file 10 | # Version: 2020.08.08 11 | # 12 | 13 | ## 文件上传设置(upload.sh) ## 14 | 15 | # 网盘名称(RCLONE 配置时填写的 name) 16 | drive-name=OneDrive 17 | 18 | # 网盘目录(上传目标目录,网盘中的文件夹路径)。注释或留空为网盘根目录,末尾不要有斜杠。 19 | #drive-dir=/DRIVEX/Download 20 | 21 | # 上传日志保存路径。注释或留空为不保存。 22 | #upload-log=/root/.aria2/upload.log 23 | 24 | 25 | ## 文件移动设置(move.sh) ## 26 | 27 | # 移动目标目录 28 | dest-dir=/root/completed 29 | 30 | # 移动日志保存路径。注释或留空为不保存。 31 | #move-log=/root/.aria2/move.log 32 | 33 | 34 | ## 文件删除设置(delete.sh) ## 35 | 36 | # 删除正在下载任务后删除文件 37 | delete-on-removed=true 38 | 39 | # 下载错误时删除文件 40 | delete-on-error=true 41 | 42 | # 删除正在下载任务后且任务信息无法读取时删除文件(第三方度盘工具) 43 | delete-on-unknown=true 44 | 45 | 46 | ## 文件清理设置(全局) ## 47 | 48 | # 删除 .aria2 文件 49 | delete-dot-aria2=true 50 | 51 | # 删除 .torrent 文件。可选:normal | enhanced | true | false 52 | # normal: 删除相关任务的种子文件,但可能无法删除通过 RPC 方式(比如 WebUI、Bot)上传的种子文件(文件名无法确定)。 53 | # enhanced:在下载目录中查找非正在下载和暂停任务以外的其它种子文件并删除(非实时)。开启 强制保存(force-save) 后此项无效。 54 | # true:优先使用 normal 模式,在种子文件名无法确定的情况下使用 enhanced 模式。 55 | # false:不删除种子文件 56 | # 注意:通过 RPC 自定义临时下载目录的任务可能不会保存种子文件,与此功能无关。 57 | delete-dot-torrent=true 58 | 59 | # 删除空目录 60 | delete-empty-dir=true 61 | 62 | 63 | ## 文件过滤设置(全局) ## 64 | 65 | # 仅 BT 多文件下载时有效,用于过滤无用文件。 66 | 67 | # 排除小文件。低于此大小的文件将在下载完成后被删除。 68 | #min-size=10M 69 | 70 | # 保留文件类型。其它文件类型将在下载完成后被删除。 71 | #include-file=mp4|mkv|rmvb|mov|avi 72 | 73 | # 排除文件类型。排除的文件类型将在下载完成后被删除。 74 | #exclude-file=html|url|lnk|txt|jpg|png 75 | -------------------------------------------------------------------------------- /conf/update.sh: -------------------------------------------------------------------------------- 1 | UPDATE_CHOOSE=null 2 | sp 3 | sp 4 | echo -e "1 更新脚本" 5 | sp 6 | sleep 0.016 7 | echo -e "2 切换分支" 8 | sp 9 | sleep 0.016 10 | echo -e "0 退出" 11 | sp 12 | sp 13 | Enter 14 | read ABOUT_CHOOSE 15 | case $ABOUT_CHOOSE in 16 | 1) 17 | update_atm 18 | Step 19 | source $ToolPATH/core/main/index.sh 20 | return 0 21 | ;; 22 | 2) 23 | red "注意,该选项是仅面向开发者测试的选项,普通用户请使用默认的 master 分支!" 24 | red "作者不保证 dev 分支代码的可用和安全性,请谨慎切换!" 25 | blue "请输入你想切换的分支[master or dev]" 26 | cd $ToolPATH/core 27 | echo -en "Enter an option: " 28 | read SWICHBRANCH 29 | case $SWICHBRANCH in 30 | dev) 31 | red "正在切换 dev 分支,注意,这是一个高危操作!" 32 | git checkout dev 33 | echo "${BLUE}[*]${RESET} 正在拉取最新版本" 34 | update_atm 35 | cp tiviw $PREFIX/bin/tiviw 36 | ;; 37 | master) 38 | green "正在切换 master 分支…" 39 | git checkout master 40 | echo "${BLUE}[*]${RESET} 正在拉取最新版本" 41 | update_atm 42 | cp tiviw $PREFIX/bin/tiviw 43 | ;; 44 | *) 45 | red "不存在的分支名称!" 46 | red "请输入 master 或 dev!" 47 | source $ToolPATH/core/main/about.sh 48 | return 0 49 | ;; 50 | esac 51 | cd $HOME 52 | source $ToolPATH/core/main/function.sh 53 | green "分支切换完毕!" 54 | green "默认重启脚本以应用更改…" 55 | exit 0 56 | ;; 57 | 0) 58 | return 0 59 | ;; 60 | *) 61 | ABOUT_CHOOSE=null 62 | red "无效输入,请重试!" 63 | Step 64 | source $ToolPATH/core/main/about.sh && return 1 65 | ;; 66 | esac -------------------------------------------------------------------------------- /conf/upload.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | # 3 | # Copyright (c) 2018-2020 P3TERX 4 | # 5 | # This is free software, licensed under the MIT License. 6 | # See /LICENSE for more information. 7 | # 8 | # https://github.com/P3TERX/aria2.conf 9 | # File name:upload.sh 10 | # Description: Use Rclone to upload files after Aria2 download is complete 11 | # Version: 3.0 12 | # 13 | 14 | CHECK_CORE_FILE() { 15 | CORE_FILE="$(dirname "$0")/core" 16 | if [[ -f "${CORE_FILE}" ]]; then 17 | . "${CORE_FILE}" 18 | else 19 | echo && echo "!!! core file does not exist !!!" 20 | exit 1 21 | fi 22 | } 23 | 24 | CHECK_RCLONE() { 25 | [[ $# -eq 0 ]] && { 26 | echo && echo -e "Checking RCLONE connection ..." 27 | if rclone mkdir "${DRIVE_NAME}:${DRIVE_DIR}/P3TERX.COM"; then 28 | rclone rmdir "${DRIVE_NAME}:${DRIVE_DIR}/P3TERX.COM" 29 | echo 30 | echo -e "${LIGHT_GREEN_FONT_PREFIX}success${FONT_COLOR_SUFFIX}" 31 | exit 0 32 | else 33 | echo 34 | echo -e "${RED_FONT_PREFIX}failure${FONT_COLOR_SUFFIX}" 35 | exit 1 36 | fi 37 | } 38 | } 39 | 40 | TASK_INFO() { 41 | echo -e " 42 | -------------------------- [${YELLOW_FONT_PREFIX}Task Infomation${FONT_COLOR_SUFFIX}] -------------------------- 43 | ${LIGHT_PURPLE_FONT_PREFIX}Task GID:${FONT_COLOR_SUFFIX} ${TASK_GID} 44 | ${LIGHT_PURPLE_FONT_PREFIX}Number of Files:${FONT_COLOR_SUFFIX} ${FILE_NUM} 45 | ${LIGHT_PURPLE_FONT_PREFIX}First File Path:${FONT_COLOR_SUFFIX} ${FILE_PATH} 46 | ${LIGHT_PURPLE_FONT_PREFIX}Task File Name:${FONT_COLOR_SUFFIX} ${TASK_FILE_NAME} 47 | ${LIGHT_PURPLE_FONT_PREFIX}Task Path:${FONT_COLOR_SUFFIX} ${TASK_PATH} 48 | ${LIGHT_PURPLE_FONT_PREFIX}Aria2 Download Directory:${FONT_COLOR_SUFFIX} ${ARIA2_DOWNLOAD_DIR} 49 | ${LIGHT_PURPLE_FONT_PREFIX}Custom Download Directory:${FONT_COLOR_SUFFIX} ${DOWNLOAD_DIR} 50 | ${LIGHT_PURPLE_FONT_PREFIX}Local Path:${FONT_COLOR_SUFFIX} ${LOCAL_PATH} 51 | ${LIGHT_PURPLE_FONT_PREFIX}Remote Path:${FONT_COLOR_SUFFIX} ${REMOTE_PATH} 52 | ${LIGHT_PURPLE_FONT_PREFIX}.aria2 File Path:${FONT_COLOR_SUFFIX} ${DOT_ARIA2_FILE} 53 | -------------------------- [${YELLOW_FONT_PREFIX}Task Infomation${FONT_COLOR_SUFFIX}] -------------------------- 54 | " 55 | } 56 | 57 | OUTPUT_UPLOAD_LOG() { 58 | LOG="${UPLOAD_LOG}" 59 | LOG_PATH="${UPLOAD_LOG_PATH}" 60 | export LOG_PATH LOG 61 | OUTPUT_LOG 62 | } 63 | 64 | DEFINITION_PATH() { 65 | LOCAL_PATH="${TASK_PATH}" 66 | if [[ -f "${TASK_PATH}" ]]; then 67 | REMOTE_PATH="${DRIVE_NAME}:${DRIVE_DIR}${DEST_PATH_SUFFIX%/*}" 68 | else 69 | REMOTE_PATH="${DRIVE_NAME}:${DRIVE_DIR}${DEST_PATH_SUFFIX}" 70 | fi 71 | } 72 | 73 | LOAD_RCLONE_ENV() { 74 | RCLONE_ENV_FILE="${ARIA2_CONF_DIR}/rclone.env" 75 | [[ -f ${RCLONE_ENV_FILE} ]] && . "${RCLONE_ENV_FILE}" 76 | } 77 | 78 | UPLOAD_FILE() { 79 | echo -e "$(DATE_TIME) ${INFO} Start upload files..." 80 | TASK_INFO 81 | RETRY=0 82 | RETRY_NUM=3 83 | while [ ${RETRY} -le ${RETRY_NUM} ]; do 84 | [ ${RETRY} != 0 ] && ( 85 | echo 86 | echo -e "$(DATE_TIME) ${ERROR} Upload failed! Retry ${RETRY}/${RETRY_NUM} ..." 87 | echo 88 | ) 89 | rclone move -v "${LOCAL_PATH}" "${REMOTE_PATH}" 90 | RCLONE_EXIT_CODE=$? 91 | if [ ${RCLONE_EXIT_CODE} -eq 0 ]; then 92 | UPLOAD_LOG="$(DATE_TIME) ${INFO} Upload done: ${LOCAL_PATH} -> ${REMOTE_PATH}" 93 | OUTPUT_UPLOAD_LOG 94 | DELETE_EMPTY_DIR 95 | break 96 | else 97 | RETRY=$(${RETRY} + 1) 98 | [ "${RETRY}" -gt ${RETRY_NUM} ] && ( 99 | echo 100 | UPLOAD_LOG="$(DATE_TIME) ${ERROR} Upload failed: ${LOCAL_PATH}" 101 | OUTPUT_UPLOAD_LOG 102 | ) 103 | sleep 3 104 | fi 105 | done 106 | } 107 | 108 | CHECK_CORE_FILE "$@" 109 | CHECK_SCRIPT_CONF 110 | CHECK_RCLONE "$@" 111 | CHECK_FILE_NUM 112 | GET_TASK_INFO 113 | GET_DOWNLOAD_DIR 114 | CONVERSION_PATH 115 | DEFINITION_PATH 116 | CLEAN_UP 117 | LOAD_RCLONE_ENV 118 | UPLOAD_FILE 119 | exit 0 120 | -------------------------------------------------------------------------------- /core/auto-start-aria2: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | #============================================================= 3 | # Address: https://github.com/RimuruW/Aria2-Termux 4 | # Doc: https://github.com/RimuruW/Aria2-Termux/blob/master/README.md 5 | # Author: RimuruW 6 | #============================================================= 7 | if [ "$(uname -o)" != "Android" ]; then 8 | PREFIX=/data/data/com.termux/files/usr 9 | fi 10 | 11 | aria2_conf_dir="$HOME/.aria2" 12 | aria2_conf="${aria2_conf_dir}/aria2.conf" 13 | aria2c="$PREFIX/bin/aria2c" 14 | 15 | [[ -f "$PREFIX/etc/atm/main/.atmrc" ]] && source "$PREFIX/etc/atm/main/.atmrc" 16 | [[ -f "$HOME/.atmrc" ]] && source "$HOME/.atmrc" 17 | 18 | if [ -t 1 ]; then 19 | RED=$(printf '\033[31m') 20 | GREEN=$(printf '\033[32m') 21 | YELLOW=$(printf '\033[33m') 22 | BLUE=$(printf '\033[34m') 23 | LIGHT=$(printf '\033[1;96m') 24 | RESET=$(printf '\033[0m') 25 | else 26 | RED="" 27 | GREEN="" 28 | YELLOW="" 29 | BLUE="" 30 | LIGHT="" 31 | RESET="" 32 | fi 33 | 34 | red() { 35 | echo -e "${RED}$1${RESET}" 36 | } 37 | 38 | green() { 39 | echo -e "${GREEN}$1${RESET}" 40 | } 41 | 42 | yellow() { 43 | echo -e "${YELLOW}$1${RESET}" 44 | } 45 | 46 | blue() { 47 | echo -e "${BLUE}$1${RESET}" 48 | } 49 | 50 | light() { 51 | echo -e "${LIGHT}$1${RESET}" 52 | } 53 | 54 | check_installed_status() { 55 | [[ ! -e ${aria2c} ]] && red "[!] Aria2 未安装!" && return 0 56 | [[ ! -e ${aria2_conf} ]] && red " 57 | [!] Aria2 配置文件不存在! 58 | [*] 如果你不是通过本脚本安装 Aria2,请先在本脚本卸载 Aria2! 59 | " 60 | exit 1 61 | } 62 | 63 | check_pid() { 64 | PID=$(pgrep "aria2c" | grep -v grep | grep -v "aria2.sh" | grep -v "service" | awk '{print $1}') 65 | } 66 | 67 | check_storage() { 68 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 未获取存储权限,请回车确认后按指示授权存储权限!" && echo -en "\n请回车以确认" && read -r -n 1 line && termux-setup-storage 69 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 存储权限未获取!请在确保 Termux 已获取存储权限的情况重新启动脚本!" && exit 1 70 | } 71 | 72 | Start_aria2() { 73 | check_installed_status 74 | check_pid 75 | [[ -n ${PID} ]] && red "[!] Aria2 正在运行!" && return 1 76 | $PREFIX/bin/aria2c "$(grep -v '#' "$HOME/.aria2/aria2.conf" | sed '/^$/d' | sed "s/^/--&/g" | sed ':label;N;s/\n/ /;b label')" -D 77 | check_pid 78 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 79 | check_storage 80 | blue "[*] 尝试开启唤醒锁…" 81 | termux-wake-lock 82 | } 83 | 84 | Start_aria2 85 | -------------------------------------------------------------------------------- /core/restart-aria2.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | check_installed_status 4 | check_pid 5 | [[ -n ${PID} ]] && kill -9 "${PID}" 6 | check_storage 7 | blue "[*] 尝试开启唤醒锁……" 8 | termux-wake-lock 9 | green "[√] 所有步骤执行完毕,开始启动..." 10 | $PREFIX/bin/aria2c --conf-path="${ARIA2CONF}" -D 11 | check_pid 12 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 13 | -------------------------------------------------------------------------------- /core/start-aria2.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | check_installed_status 4 | check_pid 5 | [[ -n ${PID} ]] && red "[!] Aria2 正在运行!" && return 1 6 | check_storage 7 | blue "[*] 尝试开启唤醒锁…" 8 | termux-wake-lock 9 | green "[√] 所有步骤执行完毕,开始启动..." 10 | $PREFIX/bin/aria2c "$(grep -v '#' "$HOME/.aria2/aria2.conf" | sed '/^$/d' | sed "s/^/--&/g" | sed ':label;N;s/\n/ /;b label')" -D 11 | check_pid 12 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 13 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | trap cleanup EXIT 2 4 | 5 | _nowpath=$(pwd) 6 | 7 | RED=$(printf '\033[31m') 8 | GREEN=$(printf '\033[32m') 9 | YELLOW=$(printf '\033[33m') 10 | BLUE=$(printf '\033[34m') 11 | LIGHT=$(printf '\033[1;96m') 12 | RESET=$(printf '\033[0m') 13 | 14 | red() { 15 | echo -e "${RED}$1${RESET}" 16 | } 17 | 18 | green() { 19 | echo -e "${GREEN}$1${RESET}" 20 | } 21 | 22 | yellow() { 23 | echo -e "${YELLOW}$1${RESET}" 24 | } 25 | 26 | blue() { 27 | echo -e "${BLUE}$1${RESET}" 28 | } 29 | 30 | light() { 31 | echo -e "${LIGHT}$1${RESET}" 32 | } 33 | 34 | ask() { 35 | # http://djm.me/ask 36 | while true; do 37 | 38 | if [ "${2:-}" = "Y" ]; then 39 | prompt="Y/n" 40 | default=Y 41 | elif [ "${2:-}" = "N" ]; then 42 | prompt="y/N" 43 | default=N 44 | else 45 | prompt="y/n" 46 | default= 47 | fi 48 | 49 | # Ask the question 50 | printf '%s\n' "${LIGHT}" 51 | printf "[?] " 52 | read -r -p "$1 [$prompt] " REPLY 53 | 54 | # Default? 55 | if [ -z "$REPLY" ]; then 56 | REPLY=$default 57 | fi 58 | 59 | printf '%s\n' "${RESET}" 60 | 61 | # Check if the reply is valid 62 | case "$REPLY" in 63 | Y* | y*) return 0 ;; 64 | N* | n*) return 1 ;; 65 | esac 66 | done 67 | } 68 | 69 | cleanup() { 70 | [[ -n ${USE_MIRROR} ]] && blue "\n[*] 正在恢复镜像源..." && mv -f "${PREFIX}"/etc/apt/sources.list.bak "${PREFIX}"/etc/apt/sources.list 71 | rm -rf "$HOME/atm" 72 | if [ -f "$PREFIX/bin/atm" ]; then 73 | green "\n[√] 安装成功!请输入 atm 启动脚本!" 74 | exit 0 75 | else 76 | red " 77 | [!] 安装失败! 78 | " 79 | exit 1 80 | fi 81 | } 82 | 83 | # Check 84 | if [[ $EUID -eq 0 ]]; then 85 | yellow " 86 | [!] 检测到您正在尝试使用 ROOT 权限运行安装脚本 87 | [!] 这是不建议且不被允许的 88 | [!] 安装全过程不需要 ROOT 权限,且以 ROOT 权限运行可能会带来一些无法预料的问题 89 | [!] 为了您的设备安全,请避免在任何情况下以 ROOT 用户运行安装脚本 90 | " 91 | exit 1 92 | fi 93 | if [[ -d /system/app && -d /system/priv-app ]]; then 94 | systeminfo="Android $(getprop ro.build.version.release)" 95 | export systeminfo 96 | else 97 | red "[!] This operating system is not supported." 98 | exit 1 99 | fi 100 | 101 | if [ -d "$PREFIX/etc/atm" ]; then 102 | yellow " 103 | [!] 您已安装 Aria2-Termux ,无需重复安装 104 | 如果您需要移除 Aria2-Termux,请输入 rm -rf $PREFIX/etc/atm 105 | " 106 | exit 1 107 | fi 108 | 109 | hostname() { 110 | echo "$1" | awk -F'[/:]' '{print $4}' 111 | } 112 | 113 | timeout_test() { 114 | local URL="${1%/}" 115 | local timeout="${2-5}" 116 | 117 | timeout "$((timeout + 1))" curl \ 118 | --head \ 119 | --fail \ 120 | --connect-timeout "$timeout" \ 121 | --location \ 122 | --user-agent "Termux-PKG/1.0 mirror-checker (termux-tools 0.112) Termux (com.termux; install-prefix:/data/data/com.termux/files/usr)'" \ 123 | "$URL" >/dev/null 2>&1 124 | } 125 | 126 | replace_mirrors() { 127 | red "[!] Termux 镜像源不可用!" 128 | blue "对于国内用户,临时添加清华源作为镜像源可以有效增强 Termux 软件包下载速度" 129 | if ask "是否临时添加清华源用以下载脚本依赖?" "Y"; then 130 | cp "${PREFIX}"/etc/apt/sources.list "${PREFIX}"/etc/apt/sources.list.bak 131 | sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' "$PREFIX/etc/apt/sources.list" 132 | apt update && apt upgrade -y 133 | USE_MIRROR=1 134 | else 135 | blue "使用默认源进行安装" 136 | fi 137 | } 138 | 139 | check_mirrors() { 140 | blue "[*] 检查网络环境及镜像源..." 141 | local current_mirror 142 | current_mirror=$(grep -P "^\s*deb\s+" /data/data/com.termux/files/usr/etc/apt/sources.list | grep -oP 'https?://[a-z0-9/._-]+') 143 | 144 | if timeout_test "google.com"; then 145 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 146 | green "[√] 当前镜像源可用" 147 | else 148 | replace_mirrors 149 | fi 150 | elif [[ "$(hostname "$current_mirror")" == *".cn" ]]; then 151 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 152 | green "[√] 当前镜像源可用" 153 | else 154 | replace_mirrors 155 | fi 156 | else 157 | replace_mirrors 158 | fi 159 | } 160 | 161 | check_mirrors 162 | 163 | blue "[*] 检查依赖中..." 164 | apt-get update -y &>/dev/null 165 | for i in git wget zip nmap-ncat iproute2; do 166 | if [ -e "$PREFIX/bin/$i" ]; then 167 | echo " $i 已安装!" 168 | else 169 | echo "Installing $i..." 170 | apt-get install -y $i || { 171 | red " 172 | [!] 依赖安装失败! 173 | [*] 退出中... 174 | " 175 | exit 1 176 | } 177 | fi 178 | done 179 | apt-get upgrade -y 180 | 181 | # Clone files 182 | blue "\n[*] 正在拉取远程仓库..." 183 | rm -rf "$HOME/atm/tmp" 184 | git clone https://github.com/RimuruW/Aria2-Termux "$HOME/atm/tmp" 185 | cd "$HOME/atm/tmp" || { 186 | red "目录跳转失败!" >&2 187 | exit 1 188 | } 189 | git checkout master 190 | 191 | cd "$_nowpath" || { 192 | red "[!] 目录跳转失败!" >&2 193 | exit 1 194 | } 195 | 196 | rm -rf "$PREFIX/bin/atm" 197 | 198 | if [ -d "$HOME/atm/tmp" ]; then 199 | blue "\n[*] 正在处理文件..." 200 | mkdir -p "$PREFIX/etc/atm" 201 | mv -f "$HOME/atm/tmp" "$PREFIX/etc/atm/main" 202 | blue "\n[*] 正在创建启动器..." 203 | cp "$PREFIX/etc/atm/main/bin/atm" "$PREFIX/bin/atm" 204 | chmod +x "$PREFIX/bin/atm" 205 | fi 206 | -------------------------------------------------------------------------------- /script/function.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | # Colors 4 | G='\e[01;32m' # GREEN TEXT 5 | R='\e[01;31m' # RED TEXT 6 | Y='\e[01;33m' # YELLOW TEXT 7 | B='\e[01;34m' # BLUE TEXT 8 | V='\e[01;35m' # VIOLET TEXT 9 | Bl='\e[01;30m' # BLACK TEXT 10 | C='\e[01;36m' # CYAN TEXT 11 | W='\e[01;37m' # WHITE TEXT 12 | L='\e[1;96m' # LIGHT TEXT 13 | BGBL='\e[1;30;47m' # Background W Text Bl 14 | N='\e[0m' # How to use (example): echo "${G}example${N}" 15 | loadBar=' ' # Load UI 16 | 17 | red() { 18 | echo -e "${R}$1${N}" 19 | } 20 | 21 | green() { 22 | echo -e "${G}$1${N}" 23 | } 24 | 25 | yellow() { 26 | echo -e "${Y}$1${N}" 27 | } 28 | 29 | blue() { 30 | echo -e "${B}$1${N}" 31 | } 32 | 33 | light() { 34 | echo -e "${L}$1${N}" 35 | } 36 | 37 | ask() { 38 | # http://djm.me/ask 39 | LIGHT=$(printf '\033[1;96m') 40 | RESET=$(printf '\033[0m') 41 | while true; do 42 | 43 | if [ "${2:-}" = "Y" ]; then 44 | prompt="Y/n" 45 | default=Y 46 | elif [ "${2:-}" = "N" ]; then 47 | prompt="y/N" 48 | default=N 49 | else 50 | prompt="y/n" 51 | default= 52 | fi 53 | 54 | # Ask the question 55 | printf '%s\n' "${LIGHT}" 56 | printf "[?] " 57 | read -r -p "$1 [$prompt] " REPLY 58 | 59 | # Default? 60 | if [ -z "$REPLY" ]; then 61 | REPLY=$default 62 | fi 63 | 64 | printf '%s\n' "${RESET}" 65 | 66 | # Check if the reply is valid 67 | case "$REPLY" in 68 | Y* | y*) return 0 ;; 69 | N* | n*) return 1 ;; 70 | esac 71 | done 72 | } 73 | 74 | # No. of characters in $VER, and $REL 75 | character_no=$(echo "Aria2-Termux $VER $REL" | wc -c) 76 | 77 | div="${Bl}$(printf '%*s' "${character_no}" '' | tr " " "=")${N}" 78 | 79 | # Mktouch 80 | mktouch() { 81 | mkdir -p ${1%/*} 2>/dev/null 82 | [ -z $2 ] && touch $1 || echo $2 >$1 83 | chmod 644 $1 84 | } 85 | 86 | # Abort 87 | abort() { 88 | red "$1" 89 | exit 1 90 | } 91 | 92 | # title_div [-c] 93 | # based on $div with <title> 94 | title_div() { 95 | [ "$1" == "-c" ] && local character_no=$2 && shift 2 96 | [ -z "$1" ] && { 97 | local message= 98 | no=0 99 | } || { 100 | local message="$@ " 101 | local no="$(echo "$@" | wc -c)" 102 | } 103 | [ "$character_no" -gt "$no" ] && local extdiv=$((character_no - no)) || { 104 | echo "Invalid!" 105 | return 106 | } 107 | echo "${W}$message${N}${Bl}$(printf '%*s' "$extdiv" '' | tr " " "=")${N}" 108 | } 109 | 110 | # set_file_prop <property> <value> <prop.file> 111 | set_file_prop() { 112 | if [ -f "$3" ]; then 113 | if grep -q "$1=" "$3"; then 114 | sed -i "s/${1}=.*/${1}=${2}/g" "$3" 115 | else 116 | echo "$1=$2" >>"$3" 117 | fi 118 | else 119 | echo "$3 不存在!" 120 | fi 121 | } 122 | 123 | # https://github.com/fearside/ProgressBar 124 | # ProgressBar <progress> <total> 125 | ProgressBar() { 126 | # Determine Screen Size 127 | if [[ "$COLUMNS" -le "57" ]]; then 128 | local var1=2 129 | local var2=20 130 | else 131 | local var1=4 132 | local var2=40 133 | fi 134 | # Process data 135 | local _progress=$(((${1} * 100 / ${2} * 100) / 100)) 136 | local _done=$(((${_progress} * ${var1}) / 10)) 137 | local _left=$((${var2} - $_done)) 138 | # Build progressbar string lengths 139 | local _done=$(printf "%${_done}s") 140 | local _left=$(printf "%${_left}s") 141 | 142 | # Build progressbar strings and print the ProgressBar line 143 | printf "\rProgress : ${BGBL}|${N}${_done// /${BGBL}$loadBar${N}}${_left// / }${BGBL}|${N} ${_progress}%%" 144 | } 145 | 146 | #https://github.com/fearside/SimpleProgressSpinner 147 | # Spinner <message> 148 | Spinner() { 149 | # Choose which character to show. 150 | case ${_indicator} in 151 | "|") _indicator="/" ;; 152 | "/") _indicator="-" ;; 153 | "-") _indicator="\\" ;; 154 | "\\") _indicator="|" ;; 155 | # Initiate spinner character 156 | *) _indicator="\\" ;; 157 | esac 158 | 159 | # Print simple progress spinner 160 | printf "\r${@} [${_indicator}]" 161 | } 162 | 163 | # cmd & spinner <message> 164 | e_spinner() { 165 | _PID=$! 166 | h=0 167 | anim='-\|/' 168 | while true; do 169 | h=$(((h + 1) % 4)) 170 | sleep 0.02 171 | printf "\r${@} [${anim:$h:1}]" 172 | grep_PID=$(ps aux | awk '{print $2}' | grep -q ${_PID}) 173 | if [ -n "$grep_PID" ]; then 174 | : 175 | else 176 | return 0 177 | fi 178 | done 179 | echo "" 180 | } 181 | 182 | check_storage() { 183 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 未获取存储权限,请回车确认后按指示授权存储权限!" && echo -en "\n请回车以确认" && read -r -n 1 line && termux-setup-storage 184 | [[ ! -d "$HOME/storage/shared/Android/" ]] && red "[!] Termux 存储权限未获取!请在确保 Termux 已获取存储权限的情况重新启动脚本!" && exit 1 185 | } 186 | 187 | test_connection() { 188 | ( 189 | if /system/bin/ping -q -c 1 -W 1 google.com >/dev/null 2>&1; then 190 | true 191 | elif /system/bin/ping -q -c 1 -W 1 bing.com >/dev/null 2>&1; then 192 | true 193 | elif /system/bin/ping -q -c 1 -W 1 baidu.com >/dev/null 2>&1; then 194 | true 195 | else 196 | false 197 | fi #& 198 | #e_spinner "${B}[*]${N} 检查网络连接" 199 | ) && echo -e " - ${G}网络正常${N}" || { 200 | echo -e " - ${R}网络异常${N}" 201 | false 202 | } 203 | sleep 1 204 | } 205 | 206 | # Log files will be uploaded to termbin.com 207 | # 日志将会被上传至 termbin.com 208 | # Logs included: VERLOG LOG oldVERLOG oldLOG 209 | upload_logs() { 210 | ( 211 | test_connection || exit 212 | [ -s $VERLOG ] && verUp=$(cat $VERLOG | nc termbin.com 9999) || verUp=none 213 | [ -s $oldVERLOG ] && oldverUp=$(cat $oldVERLOG | nc termbin.com 9999) || oldverUp=none 214 | [ -s $ARIA2LOG ] && logUp=$(cat $ARIA2LOG | nc termbin.com 9999) || logUp=none 215 | [ -s $_ATMLOG ] && ATMlogUp=$(cat $_ATMLOG | nc termbin.com 9999) || logUp=none 216 | 217 | echo -n "Link: " 218 | echo "Aria2-Termux 219 | Version: $VER $REL 220 | Termux Version: 221 | Android Version: 222 | Model: 223 | 224 | atm_old_Verbose: $oldverUp 225 | atm_Verbose: $verUp 226 | atm_log: $ATMlogUp 227 | 228 | allvar 229 | ============== 230 | $(export) 231 | ============== 232 | 233 | Aria2: $logUp" | nc termbin.com 9999 & 234 | e_spinner "测试网络连接" 235 | ) && echo " - OK" || { 236 | echo " - 出错" 237 | false 238 | } 239 | e_spinner "上传日志" 240 | exit 241 | } 242 | 243 | # Print Random 244 | # Prints a message at random 245 | # CHANCES - no. of chances <integer> 246 | # TARGET - target value out of CHANCES <integer> 247 | prandom() { 248 | local CHANCES=2 249 | local TARGET=2 250 | [ "$1" == "-c" ] && { 251 | local CHANCES=$2 252 | local TARGET=$3 253 | shift 3 254 | } 255 | [ "$((RANDOM % CHANCES + 1))" -eq "$TARGET" ] && echo "$@" 256 | } 257 | 258 | # Print Center 259 | # Prints text in the center of terminal 260 | pcenter() { 261 | local CHAR=$(printf "$@" | sed 's|\\e[[0-9;]*m||g' | wc -m) 262 | local hfCOLUMN=$((COLUMNS / 2)) 263 | local hfCHAR=$((CHAR / 2)) 264 | local indent=$((hfCOLUMN - hfCHAR)) 265 | echo "$(printf '%*s' "${indent}" '') $@" 266 | } 267 | 268 | fancy_opening() { 269 | header 270 | echo -e "\n" 271 | NUM=1 272 | while [ $NUM -le 50 ]; do 273 | ProgressBar $NUM 50 274 | NUM=$((NUM + 5)) 275 | sleep 0.001 276 | done 277 | } 278 | 279 | # Display on Header 280 | header() { 281 | clear 282 | midALG=${#1} 283 | midALG=$((MDLVAL - midALG)) 284 | [ $((midALG % 2)) -eq 0 ] || midALG=$((midALG - 1)) 285 | midALG=$((midALG / 2)) 286 | SP=$(printf %-${midALG}s " ") 287 | [ "$DEVMODE" ] || clear 288 | light " Aria2 一键管理脚本" 289 | echo "" 290 | echo -e " Version: ${Y}${VER}${N}" 291 | echo -e " by ${Y}Qingxu($AUTHOR)${N}" 292 | echo "" 293 | printf "${C}=%.0s${N}" $(seq "$MDLVAL") 294 | echo -e "\n${SP// / }$1" 295 | printf "${C}=%.0s${N}" $(seq "$MDLVAL") 296 | unset midALG 297 | } 298 | 299 | # Display on Footer 300 | footer() { 301 | var=$((MDLVAL / 2)) 302 | var=$((MDLVAL / 2 + 1)) 303 | printf "${C}- %.0s${N}" $(seq $var) 304 | echo "" 305 | if [[ -e ${aria2c} ]]; then 306 | check_pid 307 | if [[ -n "${PID}" ]]; then 308 | echo -e " Aria2 状态: ${G}已安装${N} | ${G}已启动${N}" 309 | else 310 | echo -e " Aria2 状态: ${G}已安装${N} | ${R}未启动${N}" 311 | fi 312 | else 313 | echo -e " Aria2 状态: ${R}未安装${N}" 314 | fi 315 | if [[ -f "$HOME/.termux/boot/auto-start-aria2" ]]; then 316 | echo -e " Aria2 开机自启动: ${G}已开启${N}" 317 | else 318 | echo -e " Aria2 开机自启动: ${R}未开启${N}" 319 | fi 320 | printf "${C}- %.0s${N}" $(seq $var) 321 | echo "" 322 | } 323 | 324 | # invalid_input <type> 325 | invalid_input() { 326 | echo "" 327 | case $1 in 328 | yn) 329 | invMSG="只有输入 [${G}y${N}] 代表 yes(肯定)或者 [${G}n${N}] 代表 no (否定)!" 330 | ;; 331 | t) 332 | invMSG="只能输入上面的 ${G}数字${N} 或选项!" 333 | ;; 334 | esac 335 | echo -e " ${R}无效输入${N}. $invMSG" 336 | unset invMSG 337 | sleep 2 338 | } 339 | 340 | # Print to log 341 | log_handler() { 342 | echo "" >>"$_ATMLOG" 2>&1 343 | echo -e "$1" >>"$_ATMLOG" 2>&1 344 | } 345 | 346 | # Print to log and screen 347 | log_print() { 348 | echo -e "$1" 349 | log_handler "$1" 350 | } 351 | 352 | # Check whether an update is available 353 | sh_update() { 354 | header "准备中" 355 | echo "" 356 | echo "" 357 | test_connection || return 1 358 | mkdir -p ${ATMDIR}/tmp 359 | echo " - 检查更新..." 360 | wget -q -T 10 -O "$ATMDIR/tmp/atmrc" "$GITRAW/.atmrc" >>"$_ATMLOG" 2>&1 361 | echo "" 362 | sh_new_ver=$(grep 'REL="' "$ATMDIR/tmp/atmrc" | awk -F "=" '{print $NF}' | sed 's/\"//g' | head -1) 363 | if [ -s "$ATMDIR/tmp/atmrc" ]; then 364 | if [[ "$REL" -lt "$sh_new_ver" ]]; then 365 | log_print " - ${Y}发现新版本!${N}" 366 | _PWD=$(pwd) 367 | cd "$PREFIX/etc/atm/main" || { 368 | red "目录跳转失败!" >&2 369 | exit 1 370 | } 371 | git pull -p 372 | cp "$PREFIX/etc/atm/main/bin/atm" "$PREFIX/bin/atm" 373 | cd "$_PWD" || { 374 | red "目录跳转失败!" >&2 375 | exit 1 376 | } 377 | else 378 | log_print " - ${G}您使用的是最新版本。${N}" 379 | fi 380 | elif [ -f "$ATMDIR/tmp/atmrc" ]; then 381 | rm -f "$ATMDIR/tmp/atmrc" 382 | log_print " - ${R}错误${N}。无法获取更新。" 383 | log_print " - 文件为空。" 384 | force_update 385 | else 386 | log_print " - ${R}错误${N}。 未获取更新。" 387 | force_update 388 | fi 389 | sleep 1 390 | } 391 | 392 | force_update() { 393 | if ask "是否强制更新?" "N"; then 394 | echo -e "${B}[*]${N} 进行${R}强制更新${N}" 395 | atm -up 396 | else 397 | echo -e "${B}[*]${N} 不进行强制更新" 398 | fi 399 | } 400 | 401 | cleanup() { 402 | rm -rf ${ATMDIR}/tmp 403 | } 404 | 405 | # Save logs locally 406 | save_logs() { 407 | for i in $LOGTOSAVE; do 408 | eval j="\$${i}" 409 | if [ "$j" ]; then 410 | log_handler "${i}=${j}" 411 | fi 412 | done 413 | cp -af "$_ATMLOG" "$EXTRALOG" 414 | cp -af "$VERLOG" "$EXTRALOG" 415 | cd "$EXTRALOG" || exit 1 416 | zip -Aq atm-full.logs atm.log atm-verbose.log 417 | rm -rf atm.log atm-verbose.log 418 | } 419 | 420 | # Saving logs and exit 421 | exit_sh() { 422 | header "祝您有美好的一天 :)" 423 | echo "" 424 | echo "" 425 | cleanup 426 | # save_logs 427 | # echo " 日志将被保存至:" 428 | # echo -e " ${Y}${EXTRALOG}${N}" 429 | # echo "" 430 | exit 0 431 | } 432 | 433 | exit_error() { 434 | header "脚本出现错误" 435 | echo "" 436 | echo "" 437 | echo -e " ${C}U${N}${R}h${N} ${G}o${N}${Y}h${N}." 438 | log_handler "Something wrong" 439 | echo "" 440 | cleanup 441 | save_logs 442 | echo " 日志将被保存至:" 443 | echo -e " ${Y}${LOCALLOG}${N}" 444 | echo "" 445 | exit 0 446 | } 447 | 448 | check_pid() { 449 | PID=$(pgrep "aria2c" | grep -v grep | grep -v "service" | awk '{print $1}') 450 | } 451 | 452 | timeout_test() { 453 | local URL="${1%/}" 454 | local timeout="${2-5}" 455 | 456 | timeout "$((timeout + 1))" curl \ 457 | --head \ 458 | --fail \ 459 | --connect-timeout "$timeout" \ 460 | --location \ 461 | --user-agent "Termux-PKG/1.0 mirror-checker (termux-tools 0.112) Termux (com.termux; install-prefix:/data/data/com.termux/files/usr)'" \ 462 | "$URL" >/dev/null 2>&1 463 | } 464 | 465 | replace_mirrors() { 466 | echo -e "${R}[!]${N} Termux 镜像源不可用!" 467 | blue "对于国内用户,临时添加清华源作为镜像源可以有效增强 Termux 软件包下载速度" 468 | if ask "是否临时添加清华源用以下载脚本依赖?" "Y"; then 469 | cp "${PREFIX}"/etc/apt/sources.list "${PREFIX}"/etc/apt/sources.list.bak 470 | sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' "$PREFIX/etc/apt/sources.list" 471 | apt update && apt upgrade -y 472 | USE_MIRROR=1 473 | else 474 | blue "使用默认源进行安装" 475 | fi 476 | } 477 | 478 | check_mirrors() { 479 | echo -e "${B}[*]${N} 检查网络环境及镜像源..." 480 | local current_mirror 481 | current_mirror=$(grep -P "^\s*deb\s+" /data/data/com.termux/files/usr/etc/apt/sources.list | grep -oP 'https?://[a-z0-9/._-]+') 482 | 483 | if timeout_test "google.com"; then 484 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 485 | echo -e "${G}[√]${N} 当前镜像源可用" 486 | else 487 | replace_mirrors 488 | fi 489 | elif [[ "$(hostname "$current_mirror")" == *".cn" ]]; then 490 | if timeout_test "${current_mirror%/}/dists/stable/Release"; then 491 | echo -e "${G}[√]${N} 当前镜像源可用" 492 | else 493 | replace_mirrors 494 | 495 | fi 496 | else 497 | replace_mirrors 498 | fi 499 | } 500 | 501 | Step() { 502 | echo -en "\n请回车以确认" 503 | read -r -n 1 INPUT 504 | } 505 | 506 | Configure_ARIA2CONF() { 507 | rm -rf ${WORKDIR} 508 | cp -r "${ATMGIT}/conf" "${WORKDIR}" 509 | set_file_prop dir "${DOWNLOADPATH}" "${ARIA2CONF}" 510 | set_file_prop input-file ${WORKDIR} "${ARIA2CONF}" 511 | set_file_prop save-session "${WORKDIR}/aria2.session" "${ARIA2CONF}" 512 | sed -i "s@/data/data/com.termux/files/home/.aria2/@${WORKDIR}/@" "${ARIA2CONF}" 513 | set_file_prop rpc-secret "$(date +%s%N | md5sum | head -c 20)" "${ARIA2CONF}" 514 | sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${DOWNLOADPATH}'@" "${WORKDIR}/*.sh" 515 | set_file_prop log "${ARIA2LOG}" "${ARIA2CONF}" 516 | mktouch ${WORKDIR}/aria2.session 517 | echo -e "${G}[√]${N} Aria2 配置文件处理完成!" 518 | } 519 | 520 | Installation_dependency() { 521 | echo -e "${B}[*]${N} 开始安装并配置依赖..." 522 | apt-get update -y &>/dev/null 523 | for i in nano ca-certificates findutils jq tar gzip dpkg curl aria2; do 524 | if apt list --installed 2>/dev/null | grep "$i"; then 525 | echo " $i 已安装!" 526 | elif [ -e "$PREFIX"/bin/$i ]; then 527 | echo " $i 已安装!" 528 | else 529 | echo "${G}[*]${N} Installing $i..." 530 | apt-get install -y $i || { 531 | echo -e " 532 | ${R}[!]${N} 依赖安装失败! 533 | ${B}[*]${N} 退出中…… 534 | " 535 | exit 1 536 | } 537 | fi 538 | done 539 | apt-get upgrade -y 540 | } 541 | 542 | check_installed_status() { 543 | [[ ! -e ${aria2c} ]] && red "[!] Aria2 未安装!" && return 0 544 | [[ ! -e ${ARIA2CONF} ]] && red " 545 | [!] Aria2 配置文件不存在! 546 | [*] 如果你不是通过本脚本安装 Aria2,请先在本脚本卸载 Aria2! 547 | " && [[ $1 != "un" ]] && return 0 548 | } 549 | 550 | Install_aria2() { 551 | [[ -e ${aria2c} ]] && echo -e "${R}[!]${N} Aria2 已安装,如需重新安装请在脚本中卸载 Aria2!" && return 1 552 | check_mirrors 553 | Installation_dependency 554 | pkg i aria2 -y 555 | Configure_ARIA2CONF 2>${_ATMLOG} & 556 | e_spinner "${B}[*]${N} 开始检查配置文件..." 557 | aria2_RPC_port=${aria2_port} 558 | echo "" 559 | blue "[*] 开始创建下载目录..." 560 | check_storage 561 | mkdir -p "${DOWNLOADPATH}" 562 | green "[√] 所有步骤执行完毕,开始启动..." 563 | Start_aria2 564 | } 565 | 566 | Start_aria2() { 567 | check_installed_status 568 | check_pid 569 | [[ -n ${PID} ]] && red "[!] Aria2 正在运行!" && return 1 570 | check_storage 571 | blue "[*] 尝试开启唤醒锁…" 572 | termux-wake-lock 573 | green "[√] 所有步骤执行完毕,开始启动..." 574 | $PREFIX/bin/aria2c --conf-path="${ARIA2CONF}" -D 575 | check_pid 576 | [[ -z ${PID} ]] && red "[!] Aria2 启动失败,请检查日志!" && return 1 577 | } 578 | 579 | Stop_aria2() { 580 | check_installed_status 581 | check_pid 582 | [[ -z ${PID} ]] && red "[!] Aria2 未启动,请检查日志 !" && return 0 583 | kill -9 "${PID}" 584 | blue "[*] 尝试关闭唤醒锁…" 585 | termux-wake-unlock 586 | } 587 | 588 | Set_aria2_RPC_passwd() { 589 | read_123=$1 590 | if [[ ${read_123} != "1" ]]; then 591 | Read_config 592 | fi 593 | if [[ -z "${aria2_passwd}" ]]; then 594 | aria2_passwd_1="空(没有检测到配置,可能手动删除或注释了)" 595 | else 596 | aria2_passwd_1=${aria2_passwd} 597 | fi 598 | echo -e " 599 | ${G}[*]${N} Aria2 RPC 密钥不要包含等号(=)和井号(#),留空则随机生成。 600 | 601 | 当前 RPC 密钥为: ${G}${aria2_passwd_1}${N} 602 | " 603 | echo -en " 请输入新的 RPC 密钥: " 604 | read -r aria2_RPC_passwd 605 | echo 606 | [[ -z "${aria2_RPC_passwd}" ]] && aria2_RPC_passwd=$(date +%s%N | md5sum | head -c 20) 607 | if [[ "${aria2_passwd}" != "${aria2_RPC_passwd}" ]]; then 608 | if [[ -z "${aria2_passwd}" ]]; then 609 | if echo -e "\nrpc-secret=${aria2_RPC_passwd}" >>"${ARIA2CONF}"; then 610 | echo -e " 611 | ${G}[√]${N} RPC 密钥修改成功! 612 | 新密钥为:${G}${aria2_RPC_passwd}${N}(配置文件中缺少相关选项参数,已自动加入配置文件底部)" 613 | if [[ ${read_123} != "1" ]]; then 614 | source "$ATMGIT/core/restart-aria2.sh" 615 | fi 616 | else 617 | echo -e " 618 | ${R}[!]${N} RPC 密钥修改失败! 619 | 旧密钥为:${R}${aria2_passwd}${N} 620 | " 621 | fi 622 | else 623 | if sed -i 's/^rpc-secret='"${aria2_passwd}"'/rpc-secret='"${aria2_RPC_passwd}"'/g' "${ARIA2CONF}"; then 624 | echo -e " 625 | ${G}[√]${N} RPC 密钥修改成功! 626 | 新密钥为:${G}${aria2_RPC_passwd}${N}" 627 | if [[ ${read_123} != "1" ]]; then 628 | source "$ATMGIT/core/restart-aria2.sh" 629 | fi 630 | else 631 | echo -e " 632 | ${R}[!]${N} RPC 密钥修改失败! 633 | 旧密钥为:${G}${aria2_passwd}${N} 634 | " 635 | fi 636 | fi 637 | else 638 | red "[!] 与旧配置一致,无需修改..." 639 | fi 640 | } 641 | 642 | Set_aria2_RPC_port() { 643 | read_123=$1 644 | if [[ ${read_123} != "1" ]]; then 645 | Read_config 646 | fi 647 | if [[ -z "${aria2_port}" ]]; then 648 | aria2_port_1="空(没有检测到配置,可能手动删除或注释了)" 649 | else 650 | aria2_port_1=${aria2_port} 651 | fi 652 | echo -e " 653 | 当前 RPC 端口为: ${G}${aria2_port_1}${N} 654 | " 655 | echo -en " 请输入新的 RPC 端口(默认: 6800): " 656 | read -r aria2_RPC_port 657 | echo 658 | [[ -z "${aria2_RPC_port}" ]] && aria2_RPC_port="6800" 659 | if [[ "${aria2_port}" != "${aria2_RPC_port}" ]]; then 660 | if [[ -z "${aria2_port}" ]]; then 661 | if echo -e "\nrpc-listen-port=${aria2_RPC_port}" >>"${ARIA2CONF}"; then 662 | echo -e " 663 | ${G}[*]${N} RPC 端口修改成功! 664 | 新端口为:${G}${aria2_RPC_port}${N}(配置文件中缺少相关选项参数,已自动加入配置文件底部)" 665 | if [[ ${read_123} != "1" ]]; then 666 | source "$ATMGIT/core/restart-aria2.sh" 667 | fi 668 | else 669 | echo -e " 670 | ${R}[!]${N} RPC 端口修改失败! 671 | 旧端口为:${G}${aria2_port}${N}" 672 | fi 673 | else 674 | if sed -i 's/^rpc-listen-port='"${aria2_port}"'/rpc-listen-port='"${aria2_RPC_port}"'/g' "${ARIA2CONF}"; then 675 | echo -e " 676 | ${G}[√]${N} RPC 端口修改成功! 677 | 新端口为:${G}${aria2_RPC_port}${N} 678 | " 679 | if [[ ${read_123} != "1" ]]; then 680 | source "$ATMGIT/core/restart-aria2.sh" 681 | fi 682 | else 683 | echo -e " 684 | ${R}[!]${N} RPC 端口修改失败! 685 | 旧端口为:${G}${aria2_port}${N} 686 | " 687 | fi 688 | fi 689 | else 690 | echo -e "${Y}[!]${N} 与旧配置一致,无需修改..." 691 | fi 692 | } 693 | 694 | Set_aria2_RPC_dir() { 695 | read_123=$1 696 | if [[ ${read_123} != "1" ]]; then 697 | Read_config 698 | fi 699 | if [[ -z "${aria2_dir}" ]]; then 700 | aria2_dir_1="空(没有检测到配置,可能手动删除或注释了)" 701 | else 702 | aria2_dir_1=${aria2_dir} 703 | fi 704 | echo -e " 705 | 当前下载目录为: ${G}${aria2_dir_1}${N} 706 | " 707 | echo -en " 请输入新的下载目录(默认: ${DOWNLOADPATH}): " 708 | read -r aria2_RPC_dir 709 | [[ -z "${aria2_RPC_dir}" ]] && aria2_RPC_dir="${DOWNLOADPATH}" 710 | mkdir -p "${aria2_RPC_dir}" 711 | echo 712 | if [[ "${aria2_dir}" != "${aria2_RPC_dir}" ]]; then 713 | if [[ -z "${aria2_dir}" ]]; then 714 | if echo -e "\ndir=${aria2_RPC_dir}" >>"${ARIA2CONF}"; then 715 | echo -e " 716 | ${G}[√]${N} 下载目录修改成功! 717 | 新位置为:${G}${aria2_RPC_dir}${N}(配置文件中缺少相关选项参数,已自动加入配置文件底部) 718 | " 719 | if [[ ${read_123} != "1" ]]; then 720 | source "$ATMGIT/core/restart-aria2.sh" 721 | fi 722 | else 723 | echo -e " 724 | ${R}[!]${N} 下载目录修改失败! 725 | 旧位置为:${G}${aria2_dir}${N} 726 | " 727 | fi 728 | else 729 | aria2_dir_2=$(echo "${aria2_dir}" | sed 's/\//\\\//g') 730 | aria2_RPC_dir_2=$(echo "${aria2_RPC_dir}" | sed 's/\//\\\//g') 731 | if sed -i "s@^\(dir=\).*@\1${aria2_RPC_dir_2}@" "${ARIA2CONF}" && sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${aria2_RPC_dir_2}'@" "${WORKDIR}/*.sh"; then 732 | echo -e " 733 | ${G}[√]${N} 下载目录修改成功! 734 | 新位置为:${G}${aria2_RPC_dir}${N} 735 | " 736 | if [[ ${read_123} != "1" ]]; then 737 | source "$ATMGIT/core/restart-aria2.sh" 738 | fi 739 | else 740 | echo -e " 741 | ${R}[!]${N} 下载目录修改失败! 742 | 旧位置为:${G}${aria2_dir}${N}" 743 | fi 744 | fi 745 | else 746 | echo -e "${Y}[!]${N} 与旧配置一致,无需修改..." 747 | fi 748 | } 749 | 750 | Set_aria2_RPC_passwd_port_dir() { 751 | Read_config 752 | Set_aria2_RPC_passwd "1" 753 | Set_aria2_RPC_port "1" 754 | Set_aria2_RPC_dir "1" 755 | source "$ATMGIT/core/restart-aria2.sh" 756 | } 757 | 758 | Reset_ARIA2CONF() { 759 | Read_config 760 | aria2_port_old=${aria2_port} 761 | echo -e " 762 | ${R}[!]${N} 此操作将重置 Aria2 配置文件,所有已设定的配置将丢失。 763 | 764 | 按任意键继续,按 Ctrl+C 组合键取消" 765 | read -r -n 1 line 766 | Configure_ARIA2CONF 2>${_ATMLOG} & 767 | e_spinner "${B}[*]${N} 开始检查配置文件..." 768 | Read_config 769 | if [[ ${aria2_port_old} != "${aria2_port}" ]]; then 770 | aria2_RPC_port=${aria2_port} 771 | aria2_port=${aria2_port_old} 772 | fi 773 | source "${ATMGIT}/core/restart-aria2.sh" 774 | } 775 | 776 | Read_config() { 777 | status_type=$1 778 | if [[ ! -e ${ARIA2CONF} ]]; then 779 | if [[ ${status_type} != "un" ]]; then 780 | echo -e "${R}[!]${N} Aria2 配置文件不存在 !" && return 0 781 | fi 782 | else 783 | aria2_dir=$(grep "^dir=" "${ARIA2CONF}" | grep -v '#' | awk -F "=" '{print $NF}') 784 | aria2_port=$(grep "^rpc-listen-port=" "${ARIA2CONF}" | grep -v '#' | awk -F "=" '{print $NF}') 785 | aria2_passwd=$(grep "^rpc-secret=" "${ARIA2CONF}" | grep -v '#' | awk -F "=" '{print $NF}') 786 | fi 787 | } 788 | 789 | View_Log() { 790 | [[ ! -e ${ARIA2LOG} ]] && echo -e "${R}[!]${N} Aria2 日志文件不存在 !" && return 0 791 | echo && echo -e " 792 | 793 | ${G}[!]${N} 按 ${G}Ctrl+C${N} 终止查看日志 794 | 如果需要查看完整日志内容,请用 ${G}cat ${ARIA2LOG}${N} 命令。 795 | 796 | " 797 | tail -f "${ARIA2LOG}" 798 | } 799 | 800 | Clean_Log() { 801 | [[ ! -e ${ARIA2LOG} ]] && echo -e "${R}[!]${N} Aria2 日志文件不存在 !" && echo -en "\n\n请回车以继续" && read -r -n 1 line && return 0 802 | echo >"${ARIA2LOG}" 803 | echo -e "${G}[√]${N} Aria2 日志已清空 !" 804 | echo -en "\n\n请回车以继续" 805 | read -r -n 1 line 806 | } 807 | 808 | Update_bt_tracker() { 809 | check_installed_status 810 | check_pid 811 | if [ -z "$PID" ]; then 812 | bash "${ATMGIT}/script/tracker.sh" "${ARIA2CONF}" 2>${_ATMLOG} 813 | else 814 | bash "${ATMGIT}/script/tracker.sh" "${ARIA2CONF}" RPC 2>${_ATMLOG} 815 | fi 816 | echo -en "\n\n请回车以继续" 817 | read -r -n 1 line 818 | } 819 | 820 | Uninstall_aria2() { 821 | check_installed_status "un" 822 | if ask "确定要卸载 Aria2 ? " "N"; then 823 | check_pid 824 | [[ -n $PID ]] && kill -9 "${PID}" && termux-wake-unlock 825 | apt purge -y aria2 2>"${_ATMLOG}" 826 | Read_config "un" 827 | rm -rf "${aria2c}" 828 | rm -rf "${WORKDIR}" 829 | rm -f "$HOME/.termux/boot/auto-start-aria2" 830 | echo -e "\n${G}[√]${N} Aria2 卸载完成!\n" 831 | else 832 | echo && echo -e "${Y}[*]${N} 卸载已取消..." && echo 833 | fi 834 | echo -en "\n\n请回车以继续" 835 | read -r -n 1 line 836 | } 837 | -------------------------------------------------------------------------------- /script/index.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | . "$ATMGIT/script/strings.sh" 4 | 5 | trap exit_sh EXIT 6 | trap exit_error 2 7 | 8 | while true; do 9 | main_menu 10 | echo -en "${G}" 11 | read -r INPUT 12 | echo -en "${N}" 13 | case "$INPUT" in 14 | 0) 15 | exit 0 16 | ;; 17 | 1) 18 | Install_aria2 19 | Step 20 | ;; 21 | 2) 22 | Uninstall_aria2 23 | ;; 24 | 3) 25 | Start_aria2 26 | Step 27 | ;; 28 | 4) 29 | Stop_aria2 30 | Step 31 | ;; 32 | 5) 33 | source "${ATMGIT}/core/restart-aria2.sh" 34 | Step 35 | ;; 36 | 6) 37 | Set_aria2 38 | Step 39 | ;; 40 | 7) 41 | View_Aria2 42 | ;; 43 | 8) 44 | View_Log 45 | Step 46 | ;; 47 | 9) 48 | Clean_Log 49 | ;; 50 | 10) 51 | Update_bt_tracker 52 | ;; 53 | 11) 54 | sh_update 55 | Step 56 | ;; 57 | 12) 58 | Auto_start 59 | Step 60 | ;; 61 | 13) 62 | show_about 63 | Step 64 | ;; 65 | *) 66 | echo 67 | echo -e "${R}[!]${N} 请输入正确的数字" 68 | sleep 3 69 | ;; 70 | esac 71 | done 72 | -------------------------------------------------------------------------------- /script/strings.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | 3 | main_menu() { 4 | header "主菜单" 5 | echo "" 6 | echo -e " 7 | ${G} 0.${N} 退出 8 | —————————————————————— 9 | ${G} 1.${N} 安装 Aria2 10 | ${G} 2.${N} 卸载 Aria2 11 | ——————————————————————— 12 | ${G} 3.${N} 启动 Aria2 13 | ${G} 4.${N} 停止 Aria2 14 | ${G} 5.${N} 重启 Aria2 15 | ——————————————————————— 16 | ${G} 6.${N} 修改 配置 17 | ${G} 7.${N} 查看 配置 18 | ${G} 8.${N} 查看 日志 19 | ${G} 9.${N} 清空 日志 20 | ——————————————————————— 21 | ${G} 10.${N} 一键更新 BT-Tracker 22 | ${G} 11.${N} 一键更新脚本 23 | ${G} 12.${N} Aria2 开机自启动 24 | ——————————————————————— 25 | ${G} 13.${N} 关于脚本 26 | " 27 | footer 28 | printf "\n 请输入数字 [0-13]: " 29 | } 30 | 31 | Set_aria2() { 32 | echo "" 33 | header "修改 配置" 34 | echo "" 35 | check_installed_status 36 | aria2_modify=null 37 | echo -e " 38 | ${G}1.${N} 修改 Aria2 RPC 密钥 39 | ${G}2.${N} 修改 Aria2 RPC 端口 40 | ${G}3.${N} 修改 Aria2 下载目录 41 | ${G}4.${N} 修改 Aria2 密钥 + 端口 + 下载目录 42 | ${G}5.${N} 手动 打开配置文件修改 43 | ${G}6.${N} 重置/更新 Aria2 配置文件 44 | ------------------- 45 | ${G}0.${N} 退出脚本 46 | " 47 | footer 48 | echo -en " 请输入数字 [0-5]: " 49 | read -r aria2_modify 50 | if [[ ${aria2_modify} == "1" ]]; then 51 | Set_aria2_RPC_passwd 52 | elif [[ ${aria2_modify} == "2" ]]; then 53 | Set_aria2_RPC_port 54 | elif [[ ${aria2_modify} == "3" ]]; then 55 | Set_aria2_RPC_dir 56 | elif [[ ${aria2_modify} == "4" ]]; then 57 | Set_aria2_RPC_passwd_port_dir 58 | elif [[ ${aria2_modify} == "5" ]]; then 59 | Set_aria2_vim_conf 60 | elif [[ ${aria2_modify} == "6" ]]; then 61 | Reset_ARIA2CONF 62 | elif [[ ${aria2_modify} == "0" ]]; then 63 | return 0 64 | else 65 | echo 66 | echo "${R}[!]${N} 请输入正确的数字" 67 | return 1 68 | fi 69 | } 70 | 71 | Set_aria2_vim_conf() { 72 | echo "" 73 | header "手动修改配置文件" 74 | echo "" 75 | Read_config 76 | aria2_port_old=${aria2_port} 77 | aria2_dir_old=${aria2_dir} 78 | echo -e " 79 | 配置文件位置:${G}${ARIA2CONF}${N} 80 | 81 | ${G}[*]${N} 手动修改配置文件须知: 82 | 83 | ${G}1.${N} 默认使用 nano 文本编辑器打开 84 | ${G}2.${N} 退出并保存文件:按 ${G}Ctrl+X${N} 组合键,输入 ${G}y${N} ,然后按 ${G}Enter${N} 键 85 | ${G}3.${N} 退出不保存文件:按 ${G}Ctrl+X${N} 组合键,输入 ${G}n${N} 86 | ${G}4.${N} nano 详细使用教程: \033[4;34mhttps://wiki.archlinux.org/index.php/Nano_(简体中文)${N} 87 | " 88 | footer 89 | echo -en "按任意键继续,按 Ctrl+C 组合键取消" 90 | read -r -n 1 line 91 | nano "${ARIA2CONF}" 92 | Read_config 93 | if [[ ${aria2_port_old} != "${aria2_port}" ]]; then 94 | aria2_RPC_port=${aria2_port} 95 | aria2_port=${aria2_port_old} 96 | fi 97 | if [[ ${aria2_dir_old} != "${aria2_dir}" ]]; then 98 | mkdir -p "${aria2_dir}" 99 | aria2_dir_2=$(echo "${aria2_dir}" | sed 's/\//\\\//g') 100 | sed -i "s@^\(DOWNLOAD_PATH='\).*@\1${aria2_dir_2}'@" "${WORKDIR}/*.sh" 101 | fi 102 | source "$ATMGIT/core/restart-aria2.sh" 103 | } 104 | 105 | View_Aria2() { 106 | echo "" 107 | header "正在获取 Aria2 配置信息..." 108 | echo "" 109 | check_installed_status 110 | Read_config 111 | IPV4=$( 112 | wget -qO- -t1 -T2 -4 api.ip.sb/ip || 113 | wget -qO- -t1 -T2 -4 ifconfig.io/ip || 114 | wget -qO- -t1 -T2 -4 www.trackip.net/ip 115 | ) 116 | IPV6=$( 117 | wget -qO- -t1 -T2 -6 api.ip.sb/ip || 118 | wget -qO- -t1 -T2 -6 ifconfig.io/ip || 119 | wget -qO- -t1 -T2 -6 www.trackip.net/ip 120 | ) 121 | LocalIP=$( 122 | for LOCALIP in $(ip a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d "/" -f1); do 123 | unset "$TMPLOCALIP" 124 | TMPLOCALIP=$LOCALIP 125 | done 126 | echo "$TMPLOCALIP" 127 | ) 128 | [[ -z "${IPV4}" ]] && IPV4="IPv4 地址检测失败" 129 | [[ -z "${IPV6}" ]] && IPV6="IPv6 地址检测失败" 130 | [[ -z "${LocalIP}" ]] && LocalIP="本地 IP 获取失败" 131 | [[ -z "${aria2_dir}" ]] && aria2_dir="找不到配置参数" 132 | [[ -z "${aria2_port}" ]] && aria2_port="找不到配置参数" 133 | [[ -z "${aria2_passwd}" ]] && aria2_passwd="找不到配置参数(或无密钥)" 134 | if [[ -z "${IPV4}" || -z "${aria2_port}" ]]; then 135 | AriaNg_URL="null" 136 | else 137 | AriaNg_API_1="/#!/settings/rpc/set/ws/${LocalIP}/${aria2_port}/jsonrpc/$(echo -n ${aria2_passwd} | base64)" 138 | AriaNg_API_2="/#!/settings/rpc/set/ws/127.0.0.1/${aria2_port}/jsonrpc/$(echo -n ${aria2_passwd} | base64)" 139 | AriaNg_URL_1="http://ariang.linioi.com${AriaNg_API_1}" 140 | AriaNg_URL_2="http://ariang.linioi.com${AriaNg_API_2}" 141 | fi 142 | clear 143 | echo "" 144 | header "Aria2 简单配置信息" 145 | echo "" 146 | echo -e " 147 | IPv4 地址: ${G}${IPV4}${N} 148 | IPv6 地址: ${G}${IPV6}${N} 149 | 内网 IP 地址: ${G}${LocalIP}${N} 150 | RPC 端口: ${G}${aria2_port}${N} 151 | RPC 密钥: ${G}${aria2_passwd}${N} 152 | 下载目录: ${G}${aria2_dir}${N} 153 | 154 | AriaNg 链接 155 | - 本机连接 AriaNg:${G}${AriaNg_URL_2}${N} 156 | - 区域网内其他设备连接 AriaNg: ${G}${AriaNg_URL_1}${N} 157 | 158 | 说明: 159 | 1、内网 IP 地址指设备所处区域网的 IP 地址,可以在手机设置中查看该 IP 地址,通常格式为 192.168.x.x 160 | 2、AriaNg 为其他开发者为 Aria2 制作的图形化操作界面,你也可以使用其他可视化工具,并使用 Aria2。 161 | 3、AriaNg 中对 Aria2 配置的修改${R}只能在该次对话中生效${N}。如果你希望修改持续生效请在脚本中修改配置或者直接修改配置文件。 162 | 4、如无其他需求,一般使用第一个 AriaNg 链接即可。 163 | 5、除非你知道如何配置 AriaNg 证书,否则${R}请勿使用${N} HTTPS 协议连接 AriaNg。 164 | 6、如果出现访问 AriaNg 自动跳转 HTTPS 网页且无法手动修改为 HTTP,可以尝试使用 AriaNg 客户端 165 | 166 | AriaNg Android 客户端链接:${B}https://github.com/Xmader/aria-ng-gui-android/releases${N}\n" 167 | footer 168 | echo -en "\n\n请回车以继续" && read -r -n 1 line 169 | } 170 | 171 | Auto_start() { 172 | echo "" 173 | header "Aria2 开机自启" 174 | echo "" 175 | echo -e " 176 | ${Y}[!]${N} 受限于 Termux,Aria2 开机自启动需要 Termux 提供相应支持。 177 | ${Y}[!]${N} 你需要先安装 ${G}Termux:Boot${N} 才可以实现 Termux 178 | Termux:Boot 下载链接: ${G}https://f-droid.org/zh_Hans/packages/com.termux.boot/${N} 179 | 180 | ${R}[!]${N} 注意,如果你未安装 ${G}Termux:Boot${N},脚本中任何关于 Aria2 自启动的配置${R}没有任何意义${N} 181 | " 182 | footer 183 | if [ -f "$HOME/.termux/boot/auto-start-aria2" ]; then 184 | if ask "你已开启 Aria2 自启动,是否关闭?" "N"; then 185 | if rm -f "$HOME/.termux/boot/auto-start-aria2"; then 186 | echo -e "${G}[√]${N} 已关闭 Aria2 自启动" 187 | else 188 | echo -e "${R}[!] ${N} Aria2 自启动关闭失败!" 189 | fi 190 | else 191 | echo "${G}[*]${N} 已跳过…" 192 | fi 193 | else 194 | if ask "是否开启 Aria2 开机自启动?" "N"; then 195 | mkdir -p "$HOME/.termux/boot" 196 | if [ -f "$ATMGIT/core/auto-start-aria2" ]; then 197 | if cp "$ATMGIT/core/auto-start-aria2" "$HOME/.termux/boot/auto-start-aria2"; then 198 | echo -e "${G}[√]${N} Aria2 开机自启动已开启!" 199 | else 200 | echo -e "${R}[!]${N} Aria2 启动开启失败!" 201 | fi 202 | else 203 | echo -e " 204 | ${R}[!]${N} 未找到自启动配置文件! 205 | ${R}[!]${N} 这可能是因为你未通过本脚本完成 Aria2 安装或手动修改了相关目录。 206 | ${R}[!]${N} 请通过脚本重新安装 Aria2 以避免绝大多数可避免的问题!" 207 | fi 208 | else 209 | echo -e "${G}[*]${N} 不开启 Aria2 开机自启动…" 210 | fi 211 | fi 212 | } 213 | show_about(){ 214 | header "Aria2-Termux" 215 | echo -e " 216 | 217 | GitHub Repository: 218 | ${B}https://github.com/RimuruW/Aria2-Termux${N} 219 | 220 | Author: ${B}RimuruW${N} 221 | 222 | License: ${B}MIT${N} 223 | 224 | Tutorial: 225 | - Recommend: ${B}https://github.com/RimuruW/Aria2-Termux/blob/master/README.md${N} 226 | 227 | - For getting started: ${B}https://blog.linioi.com/posts/aria2-for-termux/${N} 228 | 229 | 230 | Aria2-Termux Version: ${B}$VER $REL${N} 231 | 232 | Termux Version: ${B}$TERMUX_VERSION${N} 233 | 234 | Android Version: 235 | $(getprop | grep ro.build.version.release) 236 | $(getprop | grep ro.build.version.sdk) 237 | 238 | Model: 239 | $(getprop | grep ro.product.model) 240 | 241 | $(getprop | grep ro.product.name) 242 | 243 | 如果您在使用中出现问题请提交 issues 并在 issue 中描述你的问题,或者提交 pull request 修复这个问题。 244 | 245 | 你可以先更新脚本再尝试问题是否会复现。 246 | 247 | Issues link: 248 | ${B}https://github.com/RimuruW/Aria2-Termux/issues${N} 249 | 250 | Pull Requests link: 251 | ${B}https://github.com/RimuruW/Aria2-Termux/pulls${N} 252 | 253 | " 254 | } 255 | -------------------------------------------------------------------------------- /script/tracker.sh: -------------------------------------------------------------------------------- 1 | #!/data/data/com.termux/files/usr/bin/bash 2 | # 3 | # Copyright (c) 2018-2020 P3TERX <https://p3terx.com> 4 | # 5 | # This is free software, licensed under the MIT License. 6 | # See /LICENSE for more information. 7 | # 8 | # https://github.com/P3TERX/aria2.conf 9 | # File name:tracker.sh 10 | # Description: Get BT trackers and add to Aria2 11 | # Version: 3.0 12 | # 13 | # BT tracker is provided by the following project. 14 | # https://github.com/XIU2/TrackersListCollection 15 | # 16 | # Fallback URLs provided by jsDelivr 17 | # https://www.jsdelivr.com 18 | # 19 | 20 | RED_FONT_PREFIX="\033[31m" 21 | GREEN_FONT_PREFIX="\033[32m" 22 | LIGHT_PURPLE_FONT_PREFIX="\033[1;35m" 23 | FONT_COLOR_SUFFIX="\033[0m" 24 | INFO="[${GREEN_FONT_PREFIX}INFO${FONT_COLOR_SUFFIX}]" 25 | ERROR="[${RED_FONT_PREFIX}ERROR${FONT_COLOR_SUFFIX}]" 26 | ARIA2_CONF=${1:-aria2.conf} 27 | DOWNLOADER="curl -fsSL --connect-timeout 3 --max-time 3 --retry 2" 28 | 29 | DATE_TIME() { 30 | date +"%m/%d %H:%M:%S" 31 | } 32 | 33 | GET_TRACKERS() { 34 | echo && echo -e "$(DATE_TIME) ${INFO} Get BT trackers ..." 35 | if [[ -z "${CUSTOM_TRACKER_URL}" ]]; then 36 | TRACKER=$( 37 | ${DOWNLOADER} https://trackerslist.com/best_aria2.txt || 38 | ${DOWNLOADER} https://cdn.jsdelivr.net/gh/XIU2/TrackersListCollection@master/best_aria2.txt || 39 | ${DOWNLOADER} https://trackers.p3terx.com/all_aria2.txt 40 | ) 41 | else 42 | TRACKER=$(${DOWNLOADER} "${CUSTOM_TRACKER_URL}" | awk NF | sed ":a;N;s/\n/,/g;ta") 43 | fi 44 | [[ -z "${TRACKER}" ]] && { 45 | echo 46 | echo -e "$(DATE_TIME) ${ERROR} Unable to get trackers, network failure or invalid links." && exit 1 47 | } 48 | } 49 | 50 | ECHO_TRACKERS() { 51 | echo -e " 52 | --------------------[BitTorrent Trackers]-------------------- 53 | ${TRACKER} 54 | --------------------[BitTorrent Trackers]-------------------- 55 | " 56 | } 57 | 58 | ADD_TRACKERS() { 59 | echo -e "$(DATE_TIME) ${INFO} Adding BT trackers to Aria2 configuration file ${LIGHT_PURPLE_FONT_PREFIX}${ARIA2_CONF}${FONT_COLOR_SUFFIX} ..." && echo 60 | if [ ! -f "${ARIA2_CONF}" ]; then 61 | echo -e "$(DATE_TIME) ${ERROR} '${ARIA2_CONF}' does not exist." 62 | exit 1 63 | else 64 | ! grep -q "bt-tracker=" "${ARIA2_CONF})" && echo "bt-tracker=" >>"${ARIA2_CONF}" 65 | sed -i "s@^\(bt-tracker=\).*@\1${TRACKER}@" "${ARIA2_CONF}" && echo -e "$(DATE_TIME) ${INFO} BT trackers successfully added to Aria2 configuration file !" 66 | fi 67 | } 68 | 69 | ADD_TRACKERS_RPC() { 70 | if [[ "${RPC_SECRET}" ]]; then 71 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.changeGlobalOption","id":"P3TERX","params":["token:'${RPC_SECRET}'",{"bt-tracker":"'${TRACKER}'"}]}' 72 | else 73 | RPC_PAYLOAD='{"jsonrpc":"2.0","method":"aria2.changeGlobalOption","id":"P3TERX","params":[{"bt-tracker":"'${TRACKER}'"}]}' 74 | fi 75 | curl "${RPC_ADDRESS}" -fsSd "${RPC_PAYLOAD}" || curl "https://${RPC_ADDRESS}" -kfsSd "${RPC_PAYLOAD}" 76 | } 77 | 78 | ADD_TRACKERS_RPC_STATUS() { 79 | RPC_RESULT=$(ADD_TRACKERS_RPC) 80 | grep -q OK "${RPC_RESULT}" && 81 | echo -e "$(DATE_TIME) ${INFO} BT trackers successfully added to Aria2 !" || 82 | echo -e "$(DATE_TIME) ${ERROR} Network failure or Aria2 RPC interface error!" 83 | } 84 | 85 | ADD_TRACKERS_REMOTE_RPC() { 86 | echo -e "$(DATE_TIME) ${INFO} Adding BT trackers to remote Aria2: ${LIGHT_PURPLE_FONT_PREFIX}${RPC_ADDRESS%/*}${FONT_COLOR_SUFFIX} ..." && echo 87 | ADD_TRACKERS_RPC_STATUS 88 | } 89 | 90 | ADD_TRACKERS_LOCAL_RPC() { 91 | if [ ! -f "${ARIA2_CONF}" ]; then 92 | echo -e "$(DATE_TIME) ${ERROR} '${ARIA2_CONF}' does not exist." 93 | exit 1 94 | else 95 | RPC_PORT=$(grep ^rpc-listen-port "${ARIA2_CONF}" | cut -d= -f2-) 96 | RPC_SECRET=$(grep ^rpc-secret "${ARIA2_CONF}" | cut -d= -f2-) 97 | [[ ${RPC_PORT} ]] || { 98 | echo -e "$(DATE_TIME) ${ERROR} Aria2 configuration file incomplete." 99 | exit 1 100 | } 101 | RPC_ADDRESS="localhost:${RPC_PORT}/jsonrpc" 102 | echo -e "$(DATE_TIME) ${INFO} Adding BT trackers to Aria2 ..." && echo 103 | ADD_TRACKERS_RPC_STATUS 104 | fi 105 | } 106 | 107 | [ "$(command -v curl)" ] || { 108 | echo -e "$(DATE_TIME) ${ERROR} curl is not installed." 109 | exit 1 110 | } 111 | 112 | if [ "$1" = "cat" ]; then 113 | GET_TRACKERS 114 | ECHO_TRACKERS 115 | elif [ "$1" = "RPC" ]; then 116 | RPC_ADDRESS="$2/jsonrpc" 117 | RPC_SECRET="$3" 118 | GET_TRACKERS 119 | ECHO_TRACKERS 120 | ADD_TRACKERS_REMOTE_RPC 121 | elif [ "$2" = "RPC" ]; then 122 | GET_TRACKERS 123 | ECHO_TRACKERS 124 | ADD_TRACKERS 125 | echo 126 | ADD_TRACKERS_LOCAL_RPC 127 | else 128 | GET_TRACKERS 129 | ECHO_TRACKERS 130 | ADD_TRACKERS 131 | fi 132 | 133 | exit 0 134 | --------------------------------------------------------------------------------