Total Pageviews

Thursday, 7 July 2016

Aria2——Unix 系统中的下载神器

拥有了 Aria2 的默默扶持,再也不用忍受 OSX 下的国内那些半死不活的下载工具了。

关于 Aria2

Aria2 是一个基于命令行的开源下载工具,支持多协议、多来源(Http/https、FTP、Magnet、BitTorrent 等)、多线程的下载。
主要优势如下:
  • 高速,自动多线程下载;
  • 断点续传;
  • 轻量。占用内存非常少,通常情况平均 4~9MB 内存占用(官方介绍);
  • 多平台。支援 Win/Linux/OSX/Android 等操作系统下的部署;
  • 模块化。分段下载引擎,文件整合速度快;
  • 支持 RPC 界面远程;
  • 全面支持 BitTorrent 协议;

Install Aria2

安装 Aria2 依赖于 Mac 下的包管理工具 Homebrew(Linux 用户可使用 apt-get 命令直接安装)。而 Homebrew 的使用依赖于 OSX 的 XCode 命令行工具部分。所以,这些都得有…(Linux 用户直接看第 2 小节)。
  1. 先安装 Homebrew:
    • 打开终端(Terminal or iTerm)
    • 安装 XCode(已安装可跳过,选装 XCode 的 CLI 工具):$ xcode-select --install
    • 复制并运行 Homebrew 安装命令:$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    • 查看版本(确认安装是否完成):$ brew --version
  2. Homebrew 管理工具加入系统后,安装 Aria2:
    • OSX 运行:$ brew install aria2
    • Linux 运行: $ sudo apt-get install aria2
  3. 查看命令安装情况:
    • $ aria2c --version 提示版本及说明则表示已安装完成。

配置 Aria2

命令安装完,进入 Aria2 的配置部分。
  1. 在系统主目录下新建 .aria2 文件夹。
    • $ mkdir .aria2
  2. 在 .aria2 文件夹下新建 aria2.conf 配置文件。
    • 进入文件夹:$ cd .aria2
    • 创建配置文件:$ touch aria2.conf
  3. 在 Finder 里查看并对文件进行编辑。
    • a. iTerm/Terminal 当前路径下(~/.aria2/)输入命令 $ open . 进入 Finder 界面下 .aria2 文件夹;
    • b. Finder 界面,快捷键 Command + Shift + G 在弹出的路径跳转小窗口,填入 ~/.aria2/aria2.conf 后 Return。
  4. 使用 TextMate/Sublime Text/TextEdit 等编辑器打开 aria2.conf 文档,填入内容。
#用户名
#rpc-user=user
#密码
#rpc-passwd=passwd
#上面的认证方式不建议使用,建议使用下面的token方式
#设置加密的密钥
#rpc-secret=token
#允许rpc
enable-rpc=true
#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true
#允许外部访问,false的话只监听本地端口
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
rpc-listen-port=6800
#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=5
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=5
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=10
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0
#断开速度过慢的连接
#lowest-speed-limit=0
#验证用,需要1.16.1之后的release版本
#referer=*
#文件保存路径, 默认为当前启动位置
dir=/Users/YourID/Downloads
#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本
#disk-cache=0
#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)
#enable-mmap=true
#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
#所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持
file-allocation=prealloc
注意将配置表中保存路径一项「YourMacID」替换为个人的 Mac OSX 用户名(不知道可以用 $ pwd 命令查看)。
保存并退出。

Aria2 的使用

配置完成后,就可以开始使用了。
Aria2 有两种模式:
  • 命令直接调用。调用命令 $ aria2c "download.url" 下载完成后退出
  • 后台常驻触发,也就是 rpc server 模式。Aria2 作为后台常驻程序,监测 rpc 端口的活动情况,添加并下载文件。完成后继续在后台运行。
涉及到命令输入,力求简化,第二种模式明显更省事。
启动 Aria2 rpc 模式的命令:
$ aria2c --conf-path=<Path>
<Path> 是指配置文件所在的绝对路径。依照上述配置一路下来,具体是:
$ aria2c --conf-path="/Users/YourMacID/.aria2/aria2.conf" -D
使用时注意将其中的「YourMacID」替换为个人的 Mac OSX 用户名。
这时,正确无误的话,Aria2 就启动了。
安装扩展程序,方便浏览器中查看和下载资源时的 rpc 端口调用。
BaiduExporter - Chrome 网上应用店 主要用于 Mac 下下载百度云的资源。
在网站内可见一个「导出下载」的按钮。点击可见 RPC 导出下载和设置三个选项。下载点击 RPC 选项即可。
界面:
如果点击后发现下载没执行或报错,注意检查:
  1. aria2.conf 文件配置是否出错;
  2. 代理工具是否切换到全局穿越模式,如有,则退出全局模式再重试;
从后台关闭 Aria2。在终端执行 kill 命令来关闭 Aria2。
  • 输入 $ kill aria2c 点 Tab 键,显示 aria2 的进程号,然后 Return。Aria2 的进程将被关闭。
  • 直接 $ killalll aria2c 关闭进程。
再次使用时需重新运行。

搭配 Aria2 Web UI

Aria2 不带 GUI 界面。了解下载进度会有不便,日常使用需搭配 Web UI 工具方便查看。
进入网址查看:Aria2 Web 控制台(可保存为书签使用。)
界面效果:

优化启动

利用命令行工具的 alias 进行命令优化,简化 Aria2 命令的输入。
  1. VIM 编辑全局配置文件:
    • 命令行工具默认:$ vi ~/.bashrc
    • 配置 zsh 的命令行工具:$ vi ~/.zshrc
  2. 在末尾添加一条新的 alias:
    • alias aria="aria2c --conf-path="/Users/YourID/.aria2/aria2.conf" -D"
  3. 使之全局生效:
    • 命令行工具默认:$ source ~/.bashrc
    • 配置 zsh 的命令行工具:$ source ~/.zshrc
  4. 以后每次开机或重新启用终端后,键入以下命令直接启用 Aria2,使它常驻后台:
    • $ aria
-----------------


一个支持 离线下载/BT/磁力链接 的在线管理工具 —— Aria2 WebUI


Aria2是一个命令行下运行、多协议、多来源下载工具,支持迅雷磁力链接、BT种子、HTTP、FTP等下载协议,当然了它是命令行下载工具我们想下载一个东西还需要去敲命令自然是不方便,但是现在有人开发了一个WebUI,可以直接在网页上面添加管理任务

配置环境

教程测试环境是:Debian 7

这个Aria2 WebUI是一个 Web面板 + Aria2c后端 组成的。

而这个 Web面板并没有用到PHP,所以不需要PHP环境,只要能运行HTML就可以了。

我这里提供三个方法:Nginx、Apache、LNMP一键包。

因为不需要PHP,不需要数据库,所以单独安装Nginx或者apache都是可以的,也是属于最简安装。当然LNMP一键包我写教程都会带上这个的。

Nginx

apt-get install nginx -y
这时候你的 虚拟主机文件夹就是这个,进入这个文件夹,并删除默认的首页:

cd /usr/share/nginx/www
rm -rf index.html
Apache

注意这个,一些openvz框架的系统可能会自带apache,不要重复安装。

apt-get install apache -y
这时候你的 虚拟主机文件夹就是这个,进入这个文件夹,并删除默认的首页:

cd /var/www
rm -rf index.html

安装步骤

一下安装步骤,我以 LNMP一键包 的虚拟主机目录 为例!

首先是安装 aria2c 后端和git。

apt-get install aria2c
apt-get install git -y
然后通过上面的配置环境步骤 进入你的虚拟主机文件夹,执行以下命令安装前端面板:

git clone https://github.com/ziahamza/webui-aria2.git
# github地址:https://github.com/ziahamza/webui-aria2

mv webui-aria2/* .
rm -rf webui-aria2

chmod -R 755 你的虚拟主机文件夹
# 例如chmod -R 755 /home/wwwroot/233.com
然后这时候通过你的 域名或者IP 就可以访问你的 前端面板了。

当然这个时候还没有启动 后端,所以前端面板在无法连接到后端的时候会一直提示出错。

配置后端

因为 aria2c 后端启动后就不能关闭SSH,所以需要设置一下后台运行。

apt-get install screen -y
# 安装screen

screen -S aria2c
# 创建aria2c活动(名称随意)

screen -r aria2c
# 如果你关闭SSH后想重新进入这个活动就输入这个。
然后就是启动 aria2c 后端了,下面这个代码是直接启动。

aria2c --enable-rpc --rpc-listen-all
下面这个代码是设置了下载文件目录、登录用户名和密码(强烈建议使用这个代码来进行加密,避免暴露你的IP或域名)

aria2c --enable-rpc=true --rpc-listen-all --rpc-allow-origin-all=true --rpc-listen-all=true --dir=/home/wwwroot/你的域名/download --rpc-user=用户名 --rpc-passwd=用户密码
运行完后,访问你的 IP 或者 域名 进入前端面板配置。

配置前端

首先,如果你设置了登录用户名和密码,那你打开网站后就会提示输入用户名和密码。

没有设置这个或者登录进去后,需要设置 连接设置。

点击顶部菜单栏 设置——连接设置。

主机选项,如果你用的是IP或者域名就填写上去,也可以留空,留空代表默认本机。

端口选项,后端启动的时候没有指定端口的话就是默认的6800.

用户名和密码选项是可选的,根据上面启动后端时候设置的填写。

最后的直接下载选项,就是填写相对路径。

比如你的 虚拟主机文件夹 是 /home/wwwroot/你的域名

然后你的 下载文件目录 是 /home/wwwroot/你的域名/download

那么你就填写 /download/ 。

最后点击下面的 保存连接设置 按钮,不出意外就会提示连接成功,当然有时候还是会提示失败,多刷新几次就好了。

这时候你就可以添加下载任务了。

以 使用链接下载 为例,下载我的 逗比 · 云 中的一个视频文件。

pause 选项是,提交下载任务后,是暂停还是直接下载,默认false就是提交后直接下载了。

dir 选项就是下载目录了。

然后点击 开始 提交下载任务。

下载完成后,如果你在 连接设置 中设置的直接下载的相对路径正确,那你直接点击下面的文件名就可以下载到本地了。

当然因为 html5的支持,一些视频文件可以在线播放。

所以就实现了,离线下载视频,并在线观看!

注意事项

这个前端面板并不会保存任何设置,所有设置都是 从后端的启动参数中获取的。

大部分IDC都是对版权文件敏感,特别是美国的VPS,当你下载BT和磁力链接文件的时候,很有可能会被封VPS。


所以请自行选择 版权文件不敏感的 瑞典 乌克兰 俄罗斯 罗马尼亚 地区的IDC的VPS.
--------------------------




aria2配置示例


其实面对man的存在,写什么总结完全没有必要,一切宝藏都在manual。不过反正不会有人会读就是了。那我就写一下吧
##基础
首先,aria2或者叫做aria2c,它是一个下载器,嗯。
常用的两种模式是直接下载,比如 aria2c "http://host/file.zip" 这样,当它完成后就退出了,就像wget(估计你们也不知道吧)那样。
另一种就是rpc server模式,特点就是,它启动之后什么都不干,然后等着从rpc接口添加任务,下载完也不退出,而是一直等着。对,就像迅雷干的那样,当然,它不会上传你硬盘上的数据。
因为第一种方式要每次都敲命令,除非像我是原生nix,没有命令行就没法用电脑,估计也没什么用,于是常用的就是第二种。一般启动命令是 aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all -c -D 。但是,其实*这个命令是不好的!不要使用这种启动方式。
首先,用命令方式导致配置不方便修改保存,-D导致无法看到出错信息。
推荐启动方式是使用配置文件 $HOME/.aria2/aria2.conf 。嗯,我知道路由上这个地址是无法修改或者重启后会丢失的,那么你可以放到别的地方,然后 aria2c --conf-path=<PATH> 注意 <PATH> 填完整路径,因为鬼知道这个程序是从那个路径启动的。-D (用于后台执行, 这样ssh断开连接后程序不会退出) 只有在确认OK之后在启动脚本中使用。
以下方案都基于配置文件方式
##图形界面
aria2是没有图形界面的,已知相对好用的图形界面有:
请使用chrome,firefox等现代浏览器访问。这两个东西都可以直接使用,除了看英文不爽以外,有什么必要下载回来使用?(吐槽:难道你们就不觉得webui-aria2的title总是被压成好几行,诡异的配色(对,说的就是那个蓝色背景,深蓝颜色的 Use custom IP and port settings 按钮)不难看吗?)
这两个东西上的配置在重启后都会失效! 使用配置文件保存您的设置
图形界面基本都基于RPC模式,所以一定确定开启了RPC,IP端口可访问,并且在管理器中填写了正确的地址
##配置
请将所有配置置于配置文件中
只有在确认配置无误后再加上 -D 选项
请阅读出错信息!



1
2
3
4
5
6
7
8
#允许rpc
enable-rpc=true
#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true
#允许非外部访问
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
#rpc-listen-port=6800

如果启动时出现 Initializing EpollEventPoll failed. 或相似错误, 在配置中加上 event-poll=select
使用token验证(建议使用,需要1.18.4以上版本,帐号密码方式将在后续版本中停用!)



1
2
# token验证
rpc-secret=secret

在YAAW中使用 http://token:secret@hostname:port/jsonrpc 的地址格式设置secret.
如果需要使用密码验证(需要1.15.2以上,1.18.6以下版本)



1
2
3
4
#用户名
rpc-user=username
#密码
rpc-passwd=passwd

在YAAW中使用 http://username:passwd@hostname:port/jsonrpc 的地址格式设置密码.
对于RPC模式来说, 界面和后端是分离的, 只要给后端设置密码即可. 前端认证什么的是毫无意义的.
如果你比较新潮, 在YAAW中也可以用 ws:// 为前缀,只用websocket连接aria2c, 如果你不知道websocket是什么. 那就算了.
###速度相关



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=5
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=5
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=10
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0
#断开速度过慢的连接
#lowest-speed-limit=0
#验证用,需要1.16.1之后的release版本
#referer=*

###进度保存相关
aria2c只有在正常退出时(ctrl-c), 突然断电是无法保存进度的. 在第一次使用的时候会出现会话文件不存在的错误, 手动创建一个空文件即可. 如果您编写的是自动启动脚本, 在启动aria2前加上 touch aria2.session 这句命令.



1
2
3
4
input-file=/some/where/aria2.session
save-session=/some/where/aria2.session
#定时保存会话,需要1.16.1之后的release版
#save-session-interval=60

###磁盘相关



1
2
3
4
5
6
7
8
9
#文件保存路径, 默认为当前启动位置
dir=/some/where
#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本
#disk-cache=0
#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)
#enable-mmap=true
#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
#所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持
file-allocation=prealloc




1
2
3
4
5
6
7
8
9
10
11
12
#启用本地节点查找
bt-enable-lpd=true
#添加额外的tracker
#bt-tracker=<URI>,…
#单种子最大连接数
#bt-max-peers=55
#强制加密, 防迅雷必备
#bt-require-crypto=true
#当下载的文件是一个种子(以.torrent结尾)时, 自动下载BT
follow-torrent=true
#BT监听端口, 当端口屏蔽时使用
#listen-port=6881-6999

aria2亦可以用于PT下载, 下载的关键在于伪装



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#不确定是否需要,为保险起见,need more test
enable-dht=false
bt-enable-lpd=false
enable-peer-exchange=false
#修改特征
user-agent=uTorrent/2210(25130)
peer-id-prefix=-UT2210-
#修改做种设置, 允许做种
seed-ratio=0
#保存会话
force-save=true
bt-hash-check-seed=true
bt-seed-unverified=true
bt-save-metadata=true
#定时保存会话,需要1.16.1之后的某个release版本(比如1.16.2)
#save-session-interval=60

##常见问题
###Internal server error
手动访问你的JSON-RPC地址 http://hostname:port/jsonrpc?jsoncallback=1 如果没有返回, 请确认aria2是否启动以及连通性. 如果aria2在路由器后或没有公网IP, 请做好端口映射。
------------
linux下的高速下载工具aria2 的用法

aria2下载工具特点:
1、支持http/https/ftp/bt协议
2、支持metalink3.0,metalink是一种可以将不同协议下载的同一文件集合到一起以达到最大下载稳定性和速度的东东。个人感觉这个似乎比迅雷支持不同网址下载同一文件似乎更高级些
3、支持分段下载和续传
4、支持通过http代理的ftp下载
5、可以作为守候进程运行
注:aria有gtk界面,但aria2只有命令行版本。
arch下安装:
pacman -S aria2
典型用法:
aria2c http://AAA.BBB.CCC/file.zip  普通下载
aria2c -s 2http://AAA.BBB.CCC/file.zip 开2个线程下载
aria2c http://AAA.BBB.CCC/file.zipftp://DDD.EEE.FFF/GGG/file.zip 从不同的地址下载同一文件
aria2c http://AAA.BBB.CCC/file.zipftp://DDD.EEE.FFF/GGG/file.zip  支持不同的协议下载同一文件
aria2c -otest.torrent http://AAA.BBB.CCC/file.torrent 下载BT种子
aria2c –max-upload-limit 40K -Tfile.torrent 设定BT最大上传速度
aria2chttp://AAA.BBB.CCC/file.metalink  从metalink下载文件
注:https下载依赖于安装gnutls或openssl
   bt下载依赖于安装gnutls+libgcrypt或openssl
   metalink下载依赖于安装libxml2
官方地址:http://aria2.sourceforge.net/
命令行下多线程下载工具:axel (prozilla下载工具因安全问题不推荐使用)
图形界面下载工具:d4x wxdownload
转自:http://floss.zoomquiet.org/data/20100901090942/

相关文档:
http://aria2.sourceforge.net/
http://aria2.sourceforge.net/manual/en/html/
http://aria2.sourceforge.net/manual/en/html/aria2c.html#rpc-interface
http://www.openboy.net/ubuntu-linux-download-tool-aria2.html
http://wiki.ubuntu.org.cn/Aria2
http://www.debugfs.com/?p=412

aria2是一款轻量型命令行下载工具,它提供了对多协议和多源地址的支持,目前支持的协议包括HTTP(S), FTP, BitTorrent (DHT, PEX, MSE/PE), and Metalink。
aria2可以从多个源地址,并使用多种协议进行下载,并尝试将下载带宽利用率最大化。它可以同时从HTTP(S)/FTP 和 BitTorrent下载一份数据,并且将其上传到bt集群中。通过Metalink的分块检查,aria2可以在下载过程中自动的进行数据校验。
虽然现在有诸如wget和curl等其他类似产品,但aria2具有两个独特的功能:(1)aria2可以从多个源下载文件(HTTP(S)/FTP/BitTorrent),(2)aria2可以并发的进行多个源地址的下载。这样用户将不必等待单个文件的下载完成,而且aria2会尽可能快的下载。
除aria2外,也有一些其他可以进行分片下载的工具,它们往往按照线程数分割文件,并行下载,换言之,它们不会对未完成的部分进行自适应性重新分片,当整个流程工作正常时,这个策略是可以的,但一旦存在一个线程运行非常慢,这样整个进程就需要等待该线程的执行。而aria2可以很好的处理这个情况,它可以将文件分割成1M大小的分片,当某个线程运行特别缓慢时,aria2可以使用更快的线程来替换。总之,根据作者的说法,aria2是非常智能和可靠的。
和最初的aria工具具有一个GTK+界面不同,aria2只提供了命令行接口,从而使得对资源的要求更小。通常它的物理内存消耗为4M(HTTP/FTP)到9M(BitTorrent),当进行bt下载且速度为2.8M/s时的cpu消耗约为6%

aria2使用举例
本篇描述的是aria2的使用示例,更详尽的描述请见:man page
当源地址存在诸如’&’或’*'等其他shell特殊字符时,请使用单引号或者双引号将uri包含起来。
在aria2的1.10.0版中,aria2对每台主机默认使用1个连接和20MB的分块大小,所以不论在-s参数中指定任何值,他都对一台主机只会建立一个连接,需要注意的一点是这个限制是针对单个主机的,当指定了多台主机时,它会对每台主机建立一个连接。如果要使用1.9.x版中的行为,则要使用-x16 -k1M。另见man页面的 –max-connection-per-server 和 –min-split-size。
aria2默认会在开始下载前预先分配文件空间以避免可能的文件碎片,但这会在部分PC上带来50%-90%的cpu消耗。当使用环境为比较新的文件系统,例如ext4,btrfs,xfs或者NTFS时,作者推荐使用–file-allocation=falloc,这种方式会在瞬间完成大文件(数G)的空间分配并且不会带来额外的性能下降。
如果你既没有使用cutting-edge文件系统,也没有使用linux,并且很在意系统性能,那么可以使用–file-allocation=none来关闭文件的预分配。

如果你忘记了这些参数的全名或者含义,把-h放在选项或者词的前面,比如aria2c -hcrypt,这样aria2就会搜索crypt相关的选项并把他的帮助打印出来,如果aria2发现使用了-h,它会在打印出帮助信息后停止运行。
基本用法
  • 下载一个文件
aria2c http://host/image.iso
在1.10.0版中,aria2对每个host使用一个连接,你可以使用–max-connection-per-server 或 -x来修改
  • 使用两个连接从一个源下载文件
    aria2c -x2 http://host/image.iso
    Ctrl+c可以中止当前的下载,在同样的目录运行同样的命令可以继续原来的下载,你设置可以修改uri,如果他们指向的是同一个文件的话。
  • 使用两个连接下载文件:
    aria2c -s2 http://host/image.iso http://mirror1/image.iso http://mirror2/image.iso
    注:如果命令中uri的数量多于-s的值,如本例所示,aria2将会首先使用前两个uri,将第3个uri作为候补,如果前两个有一个下载失败,就会启用第3个
  • 从http或ftp服务器下载:
    aria2c http://host1/file.zip ftp://host2/file.zip
  • 从任意源进行并行下载:
    aria2c -Z http://host/file1 file2.torrent file3.metalink
    如果仅仅指定本地磁盘上的torrent文件或者metalink,是不需要-Z选项的,如:
    aria2c file1.torrent file2.torrent
  • 从文件中读取目的文件,并行下载
    aria2c -ifiles.txt -j5
    注:-j参数指定了并发下载的数量,在输入文件中可以包含torrent文件和metelink
    注:输入文件中支持添加参数,详见后续的“输入文件”章节
  • 退出时保存出错/未完成的下载
    aria2c -ifiles.txt --save-session=out.txt
    当ctrl+c或者aria2自己退出时,所有的错误,未完成的下载信息会保存到out.txt中,但通过aria2.addTorrent 和 aria2.addMetalink XML-RPC方式增加的下载不会保存。
    后续可以使用该文件继续未完成的下载:
    aria2c -iout.txt

aria2对续传有很好的支持,只需要重新运行同样的命令即可,假如通过如下命令进行文件下载:
aria2c -d /tmp http://localhost/file.gz
当在aria2的下载过程中按下ctrl+c中止了服务运行后,会在/tmp目录下发现file.gz和file.gz.aria2两个文件
$ ls /tmp file.gz file.gz.aria2
其中file.gz.aria2保存这下载的进度信息,当aria2使用同样的命令重新运行时,它会读取这个文件并继续原来的下载。当然,aria2并不要求一定要是使用完全一直的参数:用户需要指定那些可以找到*.aria2文件的参数,所有-d选项是很重要的,而URI却不一定与上次相同,只要保证他们指向了同样的文件即可。这意味着你可以用某个URI开始下载,然后使用torrent文件进行续传。当然如果只存在*.aria2文件,续传就会被忽略掉。
为了能够成功进行续传,需要考虑到如下的一些情况
HTTP(S)/FTP/Metalink(without BitTorrent)协议下的续传
file size knownDDDOX
file existsOXOOO
ctrl existsOXOXX
file size matchO-X--
ACTIONRSABC

  • “size known” 表示文件大小在开始下载前是已知的,如metalink可以提供文件大小
  • “file size match”表示控制文件中的大小与远端(或metalink)的大小相同
  • ‘D’表示不关心
  • ACTION表示在上面的各种情况下aria2会采取的动作:
R
续传,但如果给定的URI不支持续传则会失败
S
重新开始下载
A
取消下载
B
如果–allow-overwrite=true则重新下载,否则取消
C
如果–allow-overwrite=true,则重新下载;如果本地文件大小与远程文件大小一致,则不再下载;如果–auto-file-renaming=true则重命名文件;其他情况取消下载

BitTorrent下的续传规则

file existsOOOX
ctrl existsOOXX
file size matchOX--
ACTIONRABS

R, A, B, S与刚才介绍的定义一致

BitTorrent相关下载
  • 通过远程BitTorrent文件下载
    aria2c http://site/file.torrent
  • 通过远程BitTorrent文件下载,但在内存中处理
    aria2c --follow-torrent=mem http://site/file.torrent
  • 通过本地torrent文件下载:
    aria2c -u40K /path/to/file.torrent
    注:-u, –max-upload-limit用来指定最大上传速度
    可以同时处理多个torrent文件
    aria2c /path/to/file1.torrent /path/to/file2.torrent
  • 通过BitTorrent Magnet URI下载:
    aria2c "magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C&dn=aria2"
    注:需要将magnet的地址用单引号或者双引号引起来,因为里面包含’&'字符。当使用magnet时,强烈建议打开dht选项,–enable-dht
    将metadata保存成.torrent文件
    aria2c --bt-save-metadata "magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C&dn=aria2"
    这个命令会将metadata信息保存在248d0a1cd08284299de78d5c1ed359bb46717d8c.torrent文件中
  • 自动调整peer节点数量
    当所有节点的整体下载速度低于某个值时,aria2可以临时增加节点数量来获取更快的下载速率
    aria2c --bt-request-peer-speed-limit=200K file.torrent
  • 开启DHT
    aria2c --enable-dht http://site/file.torrent
    注:在1.7.2版本后,dht选项是被默认打开的。当aria2只处理http/ftp下载时,不会打开dht选项。当第一个torrent开始下载时,aria2进行DHT功能的初始化,然后一直运行到aria2退出。
  • 开启ipv6的DHT
    aria2c --enable-dht6 --dht-listen-port=6881 --dht-listen-addr6=YOUR_GLOBAL_UNICAST_IPV6_ADDR --enable-async-dns6
    注:如果aria2在build时没有使用c-ares,则不需要–enable-async-dns6。aria2在ipv4和ipv6的dht中共享一些端口
  • 增加和删除tracker URI:
    下面这个例子将从file.torrent中移除所有的tracker的uri,然后使用”http://tracker1/announce” 和 “http://tracker2/announce”
    aria2c --bt-exclude-tracker="*" --bt-tracker="http://tracker1/announce,http://tracker2/announce" file.torrent
  • 加密
    在默认情况下,aria2可以接收加密/非加密的连接,并且会首先尝试加密握手,如果失败才会去使用传统的BitTorrent握手
    下面这个例子中,aria2将只通过加密的握手接受与建立连接。
    aria2c --bt-require-crypto=true http://site/file.torrent
    存在两种加密方式,头加密和全连接加密。如果两种都可以被peer提供,aria2将默认使用头加密方式。如果要使用全连接加密,可以使用:
    aria2c --bt-min-crypto-level=arc4 http://site/file.torrent
  • 打印torrent文件内容
    aria2c -S file.torrent
  • 通过序号选择指定文件下载:
    aria2c --select-file=1-4,8 -Tfile.torrent
    注:index信息可以通过-S来获得
  • 修改监听端口
    aria2c --listen-port=6881-6883 file.torrent
    注:请确保指定端口可以进行tcp的上行和下行通信
  • 指定aria2完成下载后的停止条件
    aria2c --seed-time=120 --seed-ratio=1.0 file.torrent
    注:本例中,aria2会在下载完成后120分钟,或seed ratio达到1.0时退出程序
  • 设置上传速度
    aria2c --max-upload-limit=100K file.torrent
  • Seeding已经下载完成的文件
    可以使用-V选择来播种下载完成的文件,它会首先对文件进行分片的hash校验
    Seeding already downloaded file
    如果可以确定下载文件的正确性,可以使用–bt-seed-unverified选项来跳过文件的校验环节
    aria2c --bt-seed-unverified -d/path/to/dir file.torrent
    还可以同时播种多个torrent文件
    aria2c --bt-seed-unverified -d/path/to/dir file1.torrent file2.torrent
  • 通过index指定文件名
    为了指定bt下载的文件名称,需要使用-S选线来查看torrent文件中的index信息,例如:
    idx|path/length
  • ===+======================
  •   1|dist/base-2.6.18.iso 
  •   |99.9MiB
  • ---+----------------------
  •   2|dist/driver-2.6.18.iso
  •    |169.0MiB
  • ---+----------------------
    下面的命令可以将dist/base-2.6.18.iso 保存为 /tmp/mydir/base.iso,同时将dist/driver-2.6.18.iso 保存成 /tmp/dir/driver.iso
    aria2c --dir=/tmp --index-out=1=mydir/base.iso --index-out=2=dir/driver.iso file.torrent
    注:当对http uri中的torrent文件使用–index-out是不成功,它只对本地的torrent文件有效。aria2也不会去记忆–index-out选项内容,在每次的继续下载或播种时都需要手工指明,而且如果没有该选项,它也不会给用户任何提醒,所以需要注意。
  • 为进行文件预览进行分片优先下载
    优先下载torrent中所有文件的前1MB
    aria2c --bt-prioritize-piece=head file.torrent
Metalink相关下载示例
  • 从远程metalink下载文件:
    aria2c http://host/file.metalink
  • 从远程metalink下载文件,但在内存中处理metalink:
    aria2c --follow-metalink=mem http://host/file.metalink
  • 通过本地metalink下载:
    aria2c -t10 --lowest-speed-limit=4000 file.metalink
  • 使用5个server下载
    aria2c -C5 file.metalink
    注:当使用metalink时,-s参数不再起作用,需要使用-C选项
  • 通过多个本地metalink文件进行下载:
    aria2c file1.metalink file2.metalink
  • 打印metalink的内容
    aria2c -S file.metalink
  • 通过序号下载指定文件
    aria2c --select-file=1-4,8 -Mfile.metalink
    注:可以通过-S选择来打印metalink文件的内容
  • 指定用户偏好从本地metalink下载文件
    aria2c --metalink-location=JP,US --metalink-version=1.1 --metalink-language=en-US file.metalink

使用代理服务器
  • 为所有协议(HTTP(S)/FTP)设定代理服务器
    aria2c --all-proxy='http://proxy:8080' http://host/file
    注:–all-proxy选项可以被特定的协议选项覆盖,如–http-proxy, –https-proxy 和 –ftp-proxy
  • 设置http代理
    aria2c --http-proxy='http://proxy:8080' http://host/file
  • 使用需要认证的代理
    aria2c --http-proxy='http://proxy:8080' --http-proxy-user='username' --http-proxy-passwd='password' http://host/file aria2c --http-proxy='http://username:password@proxy:8080' http://host/file
    注:username and password 需要进行%转码,如过username是’myid@domain’,则转码后的结果为:’myid@domain’。
    高级的http特性
  • 导入cookie
    导入Mozilla/Firefox(1.x/2.x) 和 Netscape格式的cookie
    aria2c --load-cookies=cookies.txt http://host/file
  • 导入Firefox3格式的cookie
    aria2c --load-cookies=cookies.sqlite http://host/file
  • 被浏览器或其他程序继续下载
    aria2c -c -s2 http://host/partiallydownloadedfile.zip
    其他高级特性
  • 下载速度限制
    aria2c --max-download-limit=100K http://host/file
  • 使用-V修复受损的下载
    aria2c -V file.metalink
    注:这个选项只适用于BitTorrent或者带有校验的metalink
  • 当下载速度下于某个特定值时放弃下载
    aria2c --lowest-speed-limit=10K file.metalink
    URI的参数化支持
  • 可以使用大括号来表达一组列表
    aria2c -P http://{host1,host2,host3}/file.iso
  • 可以使用[]来表示一个数字序列
    aria2c -Z -P http://host/image[000-100].png
    注:当所有的URI指向不同的文件时,需要使用-Z选项
  • 甚至可以指定步长
    aria2c -Z -P http://host/image[A-Z:2].png
  • 时间戳
    保留源文件时间戳
    aria2c -R http://host/file.iso
  • 下载完成后执行特定命令
    aria2c --on-download-complete=COMMAND http://example.org/file.iso
    另见:–on-download-error, –on-download-start 和 –on-download-stop,或者执行aria2c -h#hook
  • 写入/dev/null
    aria2c -d /dev -o null --allow-overwrite=true http://example.org/file
    –allow-overwrite=true是为了避免aria2重命名已有的/dev/null
    输入文件
    输入文件中可以包括一系列的URI地址,也可以针对同一个资源设置多个URI:不同的URI写在一行并使用tab分割。
    输入文件的每一行都被当作aria2的命令行参数,因此可以受到-Z和-P选项影响
    另外,选项也可以在每行URI的后面设置,更详尽的描述可以在man page的输入文件部分得到。这种选择的含义与命令行选项的含义一致,不过只适用在他们跟随的那个URI上。
    如下,一个uri文件名为uri.txt,其内容如下:
    http://server/file.iso http://mirror/file.iso dir=/iso_images out=file.img http://foo/bar
    如果aria2使用 -i uri.txt -d /tmp, 那么file.iso就会被保存为/iso_images/file.img,它的下载源为http://server/file.iso 和 http://mirror/file.iso ;而bar文件则是从http://foo/bar 下载并且保存为 /tmp/bar。
------------------------

Firefox 使用aria2作为下载工具 [本地/远程RPC版]


Firefox配合扩展Flashgot可以利用Aria2作为下载工具,只不过并不会跟Linux版一样打开xterm来运行aria2并显示下载进度,于是我实现来自动打开iTerm来显示进度。 
但是,可不可以以更“图形界面”的方式来查看/管理Aria2呢?当然 
aria2除了作为命令行下载工具,还可以以后台服务方式运行,并监听6800(默认),接收使用JSON或XML数据格式的POST请求来管理Aria2,你可以添加,删除,暂停任务,查看下载进度等种种功能,同全功能的下载工具无异。 

于是我们可以用这样的 Aria2 下载组合方式: 
Aria2服务 + 图形管理界面 + Firefox + Flashgot + 一个程序作为Flashgot的自定义下载工具可通过RPC给aria2添加任务 

1 Aria2服务: 
aria2可以通过homebrew安装: 
brew install aria2
或者去官网下载osx 的编译版本 
根据自己需要对~/.aria2/aria2.conf文件做配置(非必须) 
然后要让其以后台方式运行:
复制代码
aria2c --enable-rpc --rpc-listen-all -D
或者利用Launch Control(可免费无限试用)工具建立自动启动服务项(推荐): 
 
Linux下根据相应的发行版,也可以写一个服务启动项。 

2 图形管理界面 
 
我们可以利用webui-aria2项目来管理aria2,就像其说明介绍的一样,若过你的aria2已经启动后台服务了,那么下载webui-aria2后,直接打开里面的index.html, 就可以跟一个下载工具一样进行管理了。(可以保存个书签,方便打开) 
但是,如果到此为止的话,尽管在webui-aria2界面已经可以添加下载任务了,但是每次还要复制粘贴显然不方便,于是我们要继续接下来的配置 

3 使用工具通过Aria2 的RPC接口快速添加下载任务 
我分别用Python和Go写了这个工具,源码见帖子最后。 
 - Python版直接把代码保存成文件(例如aria2rpc),添加执行权,放到任意位置(例如$HOME/bin/aria2rpc) 
 - Go版可以把代码保存成文件自行编译,或者下载我编译的版本(密:cmom),也是添加执行权放到任意位置 

4 使用Firefox的Flashgot扩展实现添加任务 
我们为Flashgot添加一个自定义的下载工具,配置如下 
 
这样以后点击下载链接时,在下载保存提示窗口中,我们选择用aria2rpc下载,就会将任务添加给aria2, 
同时在webui-aria2界面立刻看到添加的下载任务 
 

5 后记 
使用这种组合的好处是更加“图形界面”化,其次可以方便的对任务进行管理, 
同时,对aria2 的RPC调用支持也由原来的 特定网盘(离线)+userscript的固定组合扩展到任意下载链接 
(当然,这个还没法自动添加磁力链接和BT文件,因为Flashgot不支持,所以也没有添加的意义,只能手动赋值粘贴了,不过貌似xThunder扩展支持,等以后再研究一下) 
而且,使用该方法,aria2并不一定要运行在本地机器, 你可以将aria2 服务运行在NAS,路由器,android电视盒,服务器上,然后远程添加任务(flashgot里需要多添加一个选项指定远程的IP地址, 
例如“ [--cookie COOKIE] [--dir FOLDER] [--output FNAME] --rpc http://123.123.101.101:6800/jsonrpc [URL]"这样配置, 
webui-aria2也要在Settings -> Connection Settings里设置一下地址) 

以上内容也同样适用于Linux系统 

6 代码 
Python 

复制代码
#!/usr/bin/env python2
  
import json, urllib2, sys
from argparse import ArgumentParser
  
parser = ArgumentParser()
parser.add_argument('-c', '--cookie', help='use cookies', type=str, 
                    default='', metavar='COOKIES', dest='cookies')
parser.add_argument('-o', '--output', help='output name', type=str, 
                    default='', metavar='NAME', dest='output')
parser.add_argument('-d', '--dir', help='dest dir', type=str, 
                    default='', metavar='DIR', dest='dir')
parser.add_argument('-r', '--rpc', help='aria2 rpc (http://localhost:6800/jsonroc)',
                    type=str, default='http://127.0.0.1:6800/jsonrpc',
                    metavar='URL', dest='rpc')
parser.add_argument('URIs', nargs='+', help='URIs', type=str, 
                    default='', metavar='URI')
opts = parser.parse_args()
  
jsondict = {'jsonrpc':'2.0', 'id':'qwer',
        'method':'aria2.addUri','params':[opts.URIs]}
  
aria2optsDefault={
        'continue'                  :'true',
        'max-connection-per-server' :'15',
        'split'                     :'15',
        'min-split-size'            :'10M'}
  
aria2opts = {}
aria2opts.update(aria2optsDefault)
  
if opts.output:
    aria2opts['out'] = opts.output
if opts.dir:
    aria2opts['dir'] = opts.dir
if opts.cookies:
    aria2opts['header'] = ['Cookie: {0}'.format(opts.cookies)]
  
jsondict['params'].append(aria2opts)
  
jsonreq = json.dumps(jsondict)
print jsonreq
urllib2.urlopen(opts.rpc, jsonreq)
Go: 

复制代码
package main
  
import "encoding/json"
import "fmt"
import "flag"
import "log"
import "os"
import "net/http"
import "bytes"
  
var rpc = flag.String("rpc", "http://127.0.0.1:6800/jsonrpc", "Aria2 rpc server address")
var cookie = flag.String("cookie", "", "Cookies")
var dir = flag.String("dir", "", "Saved dest directory")
var out = flag.String("out", "", "Saved output file name")
var split = flag.Int("split", 15, "One file N connections")
var server = flag.Int("server", 15, "One server N connections")
  
func main() {
    flag.Parse()
    URIs := flag.Args()
    if len(URIs) == 0 {
        flag.PrintDefaults()
        os.Exit(0)
    }
    params := makeParamsArry(URIs)
    jsonreq, err := makeJsonStruct(params)
    if err != nil {
        log.Fatal(err)
    }
    addTask(*rpc, jsonreq)
}
  
func makeParamsArry(uris []string) []interface{} {
    output := make([]interface{}, 0, 2)
    output = append(output, uris)
    opts := make(map[string]interface{}, 9)
    if *dir != "" {
        opts["dir"] = *dir
    }
    if *out != "" {
        opts["out"] = *out
    }
    if *cookie != "" {
        opts["header"] = []string{fmt.Sprintf("Cookie: %s", *cookie)}
    }
    opts["continue"] = "true"
    opts["max-connection-per-server"] = *server
    opts["split"] = *split
    opts["min-split-size"] = "5M"
    output = append(output, opts)
    return output
}
  
func makeJsonStruct(params []interface{}) ([]byte, error) {
    output := make(map[string]interface{}, 4)
    output["jsonrpc"] = "2.0"
    output["id"] = "qwer"
    output["method"] = "aria2.addUri"
    output["params"] = params
    return json.Marshal(output)
}
  
func addTask(url string, json []byte) {
    body := bytes.NewReader(json)
    resp, err := http.Post(*rpc, "text/plain", body)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
}

from  http://appwen.com/read.php?tid=3393