2016年11月

这是 JavaScript 框架系列的第二章。在这一章里,我打算讲一下在浏览器里的异步代码不同执行方式。你将了解定时器和事件循环之间的不同差异,比如 setTimeout 和 Promises。

这个系列是关于一个开源的客户端框架,叫做 NX。在这个系列里,我主要解释一下写该框架不得不克服的主要困难。如果你对 NX 感兴趣可以参观我们的 主页

这个系列包含以下几个章节:

  1. 项目结构
  2. 定时执行 (当前章节)
  3. 沙箱代码评估
  4. 数据绑定介绍
  5. 数据绑定与 ES6 代理
  6. 自定义元素
  7. 客户端路由

异步代码执行

你可能比较熟悉 Promiseprocess.nextTick()setTimeout(),或许还有 requestAnimationFrame() 这些异步执行代码的方式。它们内部都使用了事件循环,但是它们在精确计时方面有一些不同。

在这一章里,我将解释它们之间的不同,然后给大家演示怎样在一个类似 NX 这样的先进框架里面实现一个定时系统。不用我们重新做一个,我们将使用原生的事件循环来达到我们的目的。

事件循环

事件循环甚至没有在 ES6 规范里提到。JavaScript 自身只有任务(Job)和任务队列(job queue)。更加复杂的事件循环是在 NodeJS 和 HTML5 规范里分别定义的,因为这篇是针对前端的,我会在详细说明后者。

事件循环可以被看做某个条件的循环。它不停的寻找新的任务来运行。这个循环中的一次迭代叫做一个滴答(tick)。在一次滴答期间执行的代码称为一次任务(task)。

while (eventLoop.waitForTask()) {  
  eventLoop.processNextTask()
}

任务是同步代码,它可以在循环中调度其它任务。一个简单的调用新任务的方式是 setTimeout(taskFn)。不管怎样, 任务可能有很多来源,比如用户事件、网络或者 DOM 操作。

任务队列

更复杂一些的是,事件循环可以有多个任务队列。这里有两个约束条件,相同任务源的事件必须在相同的队列,以及任务必须按插入的顺序进行处理。除此之外,浏览器可以做任何它想做的事情。例如,它可以决定接下来处理哪个任务队列。

while (eventLoop.waitForTask()) {  
  const taskQueue = eventLoop.selectTaskQueue()
  if (taskQueue.hasNextTask()) {
    taskQueue.processNextTask()
  }
}

用这个模型,我们不能精确的控制定时。如果用 setTimeout()浏览器可能决定先运行完其它几个队列才运行我们的队列。

微任务队列

幸运的是,事件循环还提供了一个叫做微任务(microtask)队列的单一队列。当前任务结束的时候,微任务队列会清空每个滴答里的任务。

while (eventLoop.waitForTask()) {  
  const taskQueue = eventLoop.selectTaskQueue()
  if (taskQueue.hasNextTask()) {
    taskQueue.processNextTask()
  }

  const microtaskQueue = eventLoop.microTaskQueue
  while (microtaskQueue.hasNextMicrotask()) {
    microtaskQueue.processNextMicrotask()
  }
}

最简单的调用微任务的方法是 Promise.resolve().then(microtaskFn)。微任务按照插入顺序进行处理,并且由于仅存在一个微任务队列,浏览器不会把时间弄乱了。

此外,微任务可以调度新的微任务,它将插入到同一个队列,并在同一个滴答内处理。

绘制 Rendering

最后是 绘制 Rendering 调度,不同于事件处理和分解,绘制并不是在单独的后台任务完成的。它是一个可以运行在每个循环滴答结束时的算法。

在这里浏览器又有了许多自由:它可能在每个任务以后绘制,但是它也可能在好几百个任务都执行了以后也不绘制。

幸运的是,我们有 requestAnimationFrame(),它在下一个绘制之前执行传递的函数。我们最终的事件模型像这样:

while (eventLoop.waitForTask()) {  
  const taskQueue = eventLoop.selectTaskQueue()
  if (taskQueue.hasNextTask()) {
    taskQueue.processNextTask()
  }

  const microtaskQueue = eventLoop.microTaskQueue
  while (microtaskQueue.hasNextMicrotask()) {
    microtaskQueue.processNextMicrotask()
  }

  if (shouldRender()) {
    applyScrollResizeAndCSS()
    runAnimationFrames()
    render()
  }
}

现在用我们所知道知识来创建定时系统!

利用事件循环

和大多数现代框架一样,NX 也是基于 DOM 操作和数据绑定的。批量操作和异步执行以取得更好的性能表现。基于以上理由我们用 PromisesMutationObserversrequestAnimationFrame()

我们所期望的定时器是这样的:

  1. 代码来自于开发者
  2. 数据绑定和 DOM 操作由 NX 来执行
  3. 开发者定义事件钩子
  4. 浏览器进行绘制

步骤 1

NX 寄存器对象基于 ES6 代理 以及 DOM 变动基于MutationObserver (变动观测器)同步运行(下一节详细介绍)。 它作为一个微任务延迟直到步骤 2 执行以后才做出反应。这个延迟已经在 Promise.resolve().then(reaction) 进行了对象转换,并且它将通过变动观测器自动运行。

步骤 2

来自开发者的代码(任务)运行完成。微任务由 NX 开始执行所注册。 因为它们是微任务,所以按序执行。注意,我们仍然在同一个滴答循环中。

步骤 3

开发者通过 requestAnimationFrame(hook) 通知 NX 运行钩子。这可能在滴答循环后发生。重要的是,钩子运行在下一次绘制之前和所有数据操作之后,并且 DOM 和 CSS 改变都已经完成。

步骤 4

浏览器绘制下一个视图。这也有可能发生在滴答循环之后,但是绝对不会发生在一个滴答的步骤 3 之前。

牢记在心里的事情

我们在原生的事件循环之上实现了一个简单而有效的定时系统。理论上讲它运行的很好,但是还是很脆弱,一个轻微的错误可能会导致很严重的 BUG。

在一个复杂的系统当中,最重要的就是建立一定的规则并在以后保持它们。在 NX 中有以下规则:

  1. 永远不用 setTimeout(fn, 0) 来进行内部操作
  2. 用相同的方法来注册微任务
  3. 微任务仅供内部操作
  4. 不要干预开发者钩子运行时间

规则 1 和 2

数据反射和 DOM 操作将按照操作顺序执行。这样只要不混合就可以很好的延迟它们的执行。混合执行会出现莫名其妙的问题。

setTimeout(fn, 0) 的行为完全不可预测。使用不同的方法注册微任务也会发生混乱。例如,下面的例子中 microtask2 不会正确地在 microtask1 之前运行。

Promise.resolve().then().then(microtask1)  
Promise.resolve().then(microtask2) 

规则 3 和 4

分离开发者的代码执行和内部操作的时间窗口是非常重要的。混合这两种行为会导致不可预测的事情发生,并且它会需要开发者了解框架内部。我想很多前台开发者已经有过类似经历。

结论

如果你对 NX 框架感兴趣,可以参观我们的主页。还可以在 GIT 上找到我们的源代码

在下一节我们再见,我们将讨论 沙盒化代码执行

你也可以给我们留言。


via: https://blog.risingstack.com/writing-a-javascript-framework-execution-timing-beyond-settimeout/

作者:Bertalan Miklos 译者:kokialoves 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Kali Linux 系统可以说是在安全测试方面最好的开箱即用的 Linux 发行版。Kali 下的很多工具软件都可以安装在大多数的 Linux 发行版中,Offensive Security 团队在 Kali 系统的开发过程中投入大量的时间精力来完善这个用于渗透测试和安全审计的 Linux 发行版。

Kali Linux 是基于 Debian 的面向安全的发行版本。该系统由于预安装了上百个知名的安全工具软件而出名。

Kali 甚至在信息安全领域还有一个含金量较高的认证叫做“ Kali 渗透测试 Pentesting with Kali ”认证。该认证的申请者必须在艰难的 24 小时内成功入侵多台计算机,然后另外 24 小时内完成渗透测试报告并发送给 Offensive Security 的安全人员进行评审。成功通过考试的人将会获得 OSCP 认证证书。

本安装指南及以后的文章主要是为了帮助个人熟悉 Kali Linux 系统和其中一些工具软件的使用。

请谨慎使用 Kali 下的工具,因为其中一些工具如果使用不当将会导致计算机系统损坏。请在合法的途径下使用所有 Kali 系列文章中所包含的信息。

系统要求

Kali 系统对硬件有一些最基本的要求及建议。根据用户使用目的,你可以使有更高的配置。这篇文章中假设读者想要把 kali 安装为电脑上唯一的操作系统。

  1. 至少 10GB 的磁盘空间;强烈建议分配更多的存储空间。
  2. 至少 512MB 的内存;希望有更多的内存,尤其是在图形界面下。
  3. 支持 USB 或 CD/DVD 启动方式。
  4. Kali Linux 系统 ISO 镜像下载地址 https://www.kali.org/downloads/

使用 dd 命令创建 USB 启动工具

该文章假设可使用 USB 设备来引导安装系统。注意尽可能的使用 4GB 或者 8GB 的 USB 设备,并且其上的所有数据将会被删除。

本文作者在使用更大容量的 USB 设备在安装的过程中遇到了问题,但是别的人应该还是可以的。不管怎么说,下面的安装步骤将会清除 USB 设备内的数据。

在开始之前请务必备份所有数据。用于安装 Kali Linux 系统的 USB 启动设备将在另外一台机器上创建完成。

第一步是获取 Kali Linux 系统 ISO 镜像文件。本指南将使用最新版的包含 Enlightenment 桌面环境的 Kali Linux 系统进行安装。

在终端下输入如下命令来获取这个版本的 ISO 镜像文件。

$ cd ~/Downloads
$ wget -c http://cdimage.kali.org/kali-2016.2/kali-linux-e17-2016.2-amd64.iso

上面两个命令将会把 Kali Linux 的 ISO 镜像文件下载到当前用户的 Downloads 目录。

下一步是把 ISO 镜像写入到 USB 设备中来启动安装程序。我们可以使用 Linux 系统中的 dd 命令来完成该操作。首先,该 USB 设备要在 lsblk 命令下可找到。

$ lsblk

Find Out USB Device Name in Linux

在 Linux 系统中确认 USB 设备名

确定 USB 设备的名字为 /dev/sdc,可以使用 dd 工具将 Kali 系统镜像写入到 USB 设备中。

$ sudo dd if=~/Downloads/kali-linux-e17-2016.2-amd64.iso of=/dev/sdc

注意:以上命令需要 root 权限,因此使用 sudo 命令或使用 root 账号登录来执行该命令。这个命令会删除 USB 设备中的所有数据。确保已备份所需的数据。

一旦 ISO 镜像文件完全复制到 USB 设备,接下来可进行 Kali Linux 系统的安装。

安装 Kali Linux 系统

1、 首先,把 USB 设备插入到要安装 Kali 操作系统的电脑上,然后从 USB 设备引导系统启动。只要成功地从 USB 设备启动系统,你将会看到下面的图形界面,选择“Install”或者“Graphical Install”选项。

本指南将使用“Graphical Install”方式进行安装。

Kali Linux Boot Menu

Kali Linux 启动菜单

2、 下面几个界面将会询问用户选择区域设置信息,比如语言、国家,以及键盘布局。

选择完成之后,系统将会提示用户输入主机名和域名信息。输入合适的环境信息后,点击继续安装。

Set Hostname for Kali Linux

设置 Kali Linux 系统的主机名

Set Domain for Kali Linux

设置 Kali Linux 系统的域名

3、 主机名和域名设置完成后,需要设置 root 用户的密码。请勿忘记该密码。

Set Root User Password for Kali Linux

设置 Kali Linux 系统用户密码

4、 密码设置完成之后,安装步骤会提示用户选择时区然后停留在硬盘分区界面。

如果 Kali Linux 是这个电脑上的唯一操作系统,最简单的选项就是使用“Guided – Use Entire Disk”,然后选择你需要安装 Kali 的存储设备。

Select Kali Linux Installation Type

选择 Kali Linux 系统安装类型

选择 Kali Linux 安装磁盘

5、 下一步将提示用户在存储设备上进行分区。大多数情况下,我们可以把整个系统安装在一个分区内。

Install Kali Linux Files in Partition

在分区上安装 Kali Linux 系统

6、 最后一步是提示用户确认将所有的更改写入到主机硬盘。注意,点确认后将会清空整个磁盘上的所有数据

Confirm Disk Partition Write Changes

确认磁盘分区更改

7、 一旦确认分区更改,安装包将会进行复制文件的安装过程。安装完成后,你需要设置一个网络镜像源来获取软件包和系统更新。如果你希望使用 Kali 的软件库,确保开启此功能。

Configure Kali Linux Package Manager

配置 Kali Linux 包管理器

8、 选择网络镜像源后,系统将会询问你安装 Grub 引导程序。再次说明,本文假设你的电脑上仅安装唯一的 Kali Linux 操作系统。

在该屏幕上选择“Yes”,用户需要选择要写入引导程序信息的硬盘引导设备。

Install GRUB Boot Loader

安装 Grub 引导程序

Select Partition to Install GRUB Boot Loader

选择安装 Grub 引导程序的分区

9、 当 Grub 安装完成后,系统将会提醒用户重启机器以进入新安装的 Kali Linux 系统。

Kali Linux Installation Completed

Kali Linux 系统安装完成

10、 因为本指南使用 Enlightenment 作为 Kali Linux 系统的桌面环境,因此默认情况下是启动进入到 shell 环境。

使用 root 账号及之前安装过程中设置的密码登录系统,以便运行 Enlightenment 桌面环境。

登录成功后输入命令startx进入 Enlightenment 桌面环境。

# startx

Start Enlightenment Desktop in Kali Linux

Kali Linux 下进入 Enlightenment 桌面环境

初次进入 Enlightenment 桌面环境时,它将会询问用户进行一些首选项配置,然后再运行桌面环境。

Kali Linux Enlightenment Desktop

Kali Linux Enlightenment 桌面

此时,你已经成功地安装了 Kali Linux 系统,并可以使用了。后续的文章我们将探讨 Kali 系统中一些有用的工具以及如何使用这些工具来探测主机及网络方面的安全状况。

请随意发表任何评论或提出相关的问题。


via: http://www.tecmint.com/kali-linux-installation-guide/

作者:Rob Turner 译者:rusking 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LibreOffice 提供了丰富的字体,并且用户可以自由选择和下载增加自己的字体。然而,就算是你想创造自己的字体,也可以非常容易地使用 Glyphr 来做到。Glyphr 是一个新开源的矢量字体设计器,通过直观而易用的图形界面和丰富的功能集可以完成字体设计的方方面面。虽然这个应用还在早期开发阶段,但是已经十分棒了。下面将会有一个简短的快速入门教你如何使用 Glyphr 创建字体并加入到 LibreOffice。

首先,从官方 Git 库下载 Glyphr。它提供 32 位和 64 位版本的二进制格式。完成下载后,进入下载文件夹, 解压文件,进入解压后的文件夹,右键点击 Glyphr Studio,选择“Run”。

启动应用后会给你三个选项。一个是从头创建一个新的字体集;第二个是读取已经存在的项目,可以是 Glyphr Studio 项目文件,也可以是其他 OpenType 字体(otf)或 TrueType 字体(ttf),甚至是 SVG 字体。第三个是读取已有的两个示例之一,然后可以在示例上修改创建。我将会选择第一个选项,并教你一些简单的设计概念。

完成进入编辑界面后, 你可以从屏幕左边的面板中选择字母,然后在右边的绘制区域设计。我选择 A 字母的图标开始编辑它。

要在绘图板上设计一些东西,我们可以从该板的左上角选择矩形、椭圆形或者路径等同处的“形状”工具,也可以使用该工具的第二行的第一项的路径编辑工具。使用任意工具,开始在板上放 路径点 path point 来创建形状。添加的点数越多,接下来步骤的形状选项就越多。

将点移动到不同位置可以获得不同的路径,可以使用路径编辑工具右边的路径编辑,点击形状会出现可编辑点。然后可以把这些点拖到你喜欢的任意位置。

最后,形状编辑工具可以让你选择形状并将其拖动到其它位置、更改其尺寸以及旋转。

其它有用的设计动作集还有左侧面板提供的复制-粘贴、翻转-旋转操作。来看个例子,假设我现在正在创作 B 字母, 我要把已经创建好的上部分镜像到下半部分,保持设计的高度一致性。

现在,为了达到这个目的,选择形状编辑工具,选中欲镜像的部分,点击复制操作,然后在其上点击图形,拖放粘帖的形状到你需要的位置,根据你的需要进行水平翻转或者垂直翻转。

这款应用在太多地方可以讲述。如果有兴趣深入,可以深入了解数字化编辑、弯曲和引导等等,

然而,字体并不是仅仅是单个字体的设计,还需要学习字体设计的其他方面。通过应用左上角菜单栏上的“导航”还可以设置特殊字符对之间的字间距、增加连字符、部件、和设置常规字体设置等。

最棒的是你可以使用“测试驱动”来使用你的新字体,帮助你判断字体设计如何、间距对不对、尽量来优化你的字体。

完成设计和优化后,我们还可以导出 ttf 和 svg 格式的字体。

要将新的字体加入到系统中,打开字体浏览器并点击“安装”按钮。如果它不工作,可以在主目录下创建一个新的文件夹叫做.fonts,并将字体复制进去。也可以使用 root 用户打开文件管理器,进入 /usr/share/fonts/opentype, 创建一个新的文件夹并粘贴字体文件到里面。然后打开终端,输入命令重建字体缓存:sudo fc-cache -f -v

在 LibreOffice 中已经可以看见新的字体咯,同样也可以使用你系统中的其它文本应用程序如 Gedit 来测试新字体。


via: https://www.howtoforge.com/tutorial/how-to-design-and-add-your-own-font-on-linux-with-glyphr/

作者:Bill Toulas 译者:VicYu/Vic020 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 用户常常做的一个事情是,是在命令行列出目录内容

我们已经知道,lsdir 是两个可用在列出目录内容的 Linux 命令,前者是更受欢迎的,在大多数情况下,是用户的首选。

我们列出目录内容时,可以按照不同的标准进行排序,例如文件名、修改时间、添加时间、版本或者文件大小。可以通过指定一个特别的参数来使用这些文件的属性进行排序。

在这个简洁的 ls 命令指导中,我们将看看如何通过上次修改时间(日期和时分秒)排序 ls 命令的输出结果

让我们由执行一些基本的 ls 命令开始。

Linux 基本 ls 命令

1、 不带任何参数运行 ls 命令将列出当前工作目录的内容。

$ ls 

List Content of Working Directory

列出工作目录的内容

2、要列出任何目录的内容,例如 /etc 目录使用如下命令:

$ ls /etc

List Contents of Directory

列出工作目录 /etc 的内容

3、一个目录总是包含一些隐藏的文件(至少有两个),因此,要展示目录中的所有文件,使用-a-all标志:

$ ls  -a

List Hidden Files in Directory

列出工作目录的隐藏文件

4、你还可以打印输出的每一个文件的详细信息,例如文件权限、链接数、所有者名称和组所有者、文件大小、最后修改的时间和文件/目录名称。

这是由-l选项来设置,这意味着一个如下面的屏幕截图般的长长的列表格式。

$ ls -l

Long List Directory Contents

长列表目录内容

基于日期和基于时刻排序文件

5、要在目录中列出文件并对最后修改日期和时间进行排序,在下面的命令中使用-t选项:

$ ls -lt 

Sort ls Output by Date and Time

按日期和时间排序ls输出内容

6、如果你想要一个基于日期和时间的逆向排序文件,你可以使用-r选项来工作,像这样:

$ ls -ltr

Sort ls Output Reverse by Date and Time

按日期和时间排序的逆向输出

我们将在这里结束,但是,ls 命令还有更多的使用信息和选项,因此,应该特别注意它或看看其它指南,比如《每一个用户应该知道 ls 的命令技巧》或《使用排序命令》。

最后但并非最不重要的,你可以通过以下反馈部分联系我们。


via: http://www.tecmint.com/sort-ls-output-by-last-modified-date-and-time

作者:Aaron Kili 译者:zky001 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Xfce 的开发者们正忙于把 Xfce 的应用和部件转移到 GTK3 上,在这个过程中,他们也增加了一些新的特性。

“免打扰”,一个常被要求增加的特性,最近已登陆到了 xfce-notifyd 0.3.4 (Xfce 通知进程)上。

更近一步地,最新的 xfce-notifyd 包括了一个可以在单一应用基础上开启或关闭通知的选项。

当一个应用发出一个通知以后,这个应用就被加入到到了通知设置的列表里。从通知列表里,你可以控制哪些应用能够显示通知。

”免打扰“模式和应用特定的通知设置均可在“设置” > “通知” 中找到:

现在为止,还没有方法可以访问由于启用”免打扰“模式而错过的消息。然而,可以预期将来会发布通知记录/维持的特性。

最后, xfce-notifyd 0.3.4 的另一个特性选择在主监视器显示通知(直到现在,通知都是显示在当前监视器)。这个特性目前在图形设置界面里是没有的,必须使用 Xfconf(设置编辑)在 xfce-notifyd 下增添一个叫做 /primary-monitor(没有引号)的布尔属性,并设置为 True 来启用该特性:

xfce4-notifyd 0.3.4 目前在 PPA 上还没有,但是不久它可能被增添到 Xfce GTK3 PPA中。

如果你想直接从源代码编译,从这儿下载。


via: http://www.webupd8.org/2016/11/xfce-gets-do-not-disturb-mode-and-per.html

作者:Andrew 译者:ucasFL 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

aria2 是一个自由、开源、轻量级多协议和多源的命令行下载工具。它支持 HTTP/HTTPS、FTP、SFTP、 BitTorrent 和 Metalink 协议。aria2 可以通过内建的 JSON-RPC 和 XML-RPC 接口来操纵。aria2 下载文件的时候,自动验证数据块。它可以通过多个来源或者多个协议下载一个文件,并且会尝试利用你的最大下载带宽。默认情况下,所有的 Linux 发行版都包括 aria2,所以我们可以从官方库中很容易的安装。一些 GUI 下载管理器例如 uget 使用 aria2 作为插件来提高下载速度。

Aria2 特性

  • 支持 HTTP/HTTPS GET
  • 支持 HTTP 代理
  • 支持 HTTP BASIC 认证
  • 支持 HTTP 代理认证
  • 支持 FTP (主动、被动模式)
  • 通过 HTTP 代理的 FTP(GET 命令行或者隧道)
  • 分段下载
  • 支持 Cookie
  • 可以作为守护进程运行。
  • 支持使用 fast 扩展的 BitTorrent 协议
  • 支持在多文件 torrent 中选择文件
  • 支持 Metalink 3.0 版本(HTTP/FTP/BitTorrent)
  • 限制下载、上传速度

1) Linux 下安装 aria2

我们可以很容易的在所有的 Linux 发行版上安装 aria2 命令行下载器,例如 Debian、 Ubuntu、 Mint、 RHEL、 CentOS、 Fedora、 suse、 openSUSE、 Arch Linux、 Manjaro、 Mageia 等等……只需要输入下面的命令安装即可。对于 CentOS、 RHEL 系统,我们需要开启 uget 或者 RPMForge 库的支持。

[对于 Debian、 Ubuntu 和 Mint]
$ sudo apt-get install aria2

[对于 CentOS、 RHEL、 Fedora 21 和更早些的操作系统]
# yum install aria2

[Fedora 22 和 之后的系统]
# dnf install aria2

[对于 suse 和 openSUSE]
# zypper install wget

[Mageia]
# urpmi aria2

[对于 Arch Linux]
$ sudo pacman -S aria2

2) 下载单个文件

下面的命令将会从指定的 URL 中下载一个文件,并且保存在当前目录,在下载文件的过程中,我们可以看到文件的(日期、时间、下载速度和下载进度)。

# aria2c https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#986c80 19MiB/21MiB(90%) CN:1 DL:3.0MiB]
03/22 09:49:13 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
986c80|OK  |   3.0MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

3) 使用不同的名字保存文件

在初始化下载的时候,我们可以使用 -o(小写)选项在保存文件的时候使用不同的名字。这儿我们将要使用 owncloud.zip 文件名来保存文件。

# aria2c -o owncloud.zip https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#d31304 16MiB/21MiB(74%) CN:1 DL:6.2MiB]
03/22 09:51:02 [NOTICE] Download complete: /opt/owncloud.zip

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
d31304|OK  |   7.3MiB/s|/opt/owncloud.zip

Status Legend:
(OK):download completed.

4) 下载速度限制

默认情况下,aria2 会利用全部带宽来下载文件,在文件下载完成之前,我们在服务器就什么也做不了(这将会影响其他服务访问带宽)。所以在下载大文件时最好使用 –max-download-limit 选项来避免进一步的问题。

# aria2c --max-download-limit=500k https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#7f9fbf 21MiB/21MiB(99%) CN:1 DL:466KiB]
03/22 09:54:51 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
7f9fbf|OK  |   462KiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

5) 下载多个文件

下面的命令将会从指定位置下载超过一个的文件并保存到当前目录,在下载文件的过程中,我们可以看到文件的(日期、时间、下载速度和下载进度)。

# aria2c -Z https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2 ftp://ftp.gnu.org/gnu/wget/wget-1.17.tar.gz
[DL:1.7MiB][#53533c 272KiB/21MiB(1%)][#b52bb1 768KiB/3.6MiB(20%)]
03/22 10:25:54 [NOTICE] Download complete: /opt/wget-1.17.tar.gz
[#53533c 18MiB/21MiB(86%) CN:1 DL:3.2MiB]
03/22 10:25:59 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
b52bb1|OK  |   2.8MiB/s|/opt/wget-1.17.tar.gz
53533c|OK  |   3.4MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

6) 续传未完成的下载

当你遇到一些网络连接问题或者系统问题的时候,并将要下载一个大文件(例如: ISO 镜像文件),我建议你使用 -c 选项,它可以帮助我们从该状态续传未完成的下载,并且像往常一样完成。不然的话,当你再次下载,它将会初始化新的下载,并保存成一个不同的文件名(自动的在文件名后面添加 .1 )。注意:如果出现了任何中断,aria2 使用 .aria2 后缀保存(未完成的)文件。

# aria2c -c https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#db0b08 8.2MiB/21MiB(38%) CN:1 DL:3.1MiB ETA:4s]^C
03/22 10:09:26 [NOTICE] Shutdown sequence commencing... Press Ctrl-C again for emergency shutdown.

03/22 10:09:26 [NOTICE] Download GID#db0b08bf55d5908d not complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
db0b08|INPR|   3.3MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(INPR):download in-progress.

如果重新启动传输,aria2 将会恢复下载。

# aria2c -c https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#873d08 21MiB/21MiB(98%) CN:1 DL:2.7MiB]
03/22 10:09:57 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
873d08|OK  |   1.9MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

7) 从文件获取输入

就像 wget 可以从一个文件获取输入的 URL 列表来下载一样。我们需要创建一个文件,将每一个 URL 存储在单独的行中。ara2 命令行可以添加 -i 选项来执行此操作。

# aria2c -i test-aria2.txt
[DL:3.9MiB][#b97984 192KiB/21MiB(0%)][#673c8e 2.5MiB/3.6MiB(69%)]
03/22 10:14:22 [NOTICE] Download complete: /opt/wget-1.17.tar.gz
[#b97984 19MiB/21MiB(90%) CN:1 DL:2.5MiB]
03/22 10:14:30 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
673c8e|OK  |   4.3MiB/s|/opt/wget-1.17.tar.gz
b97984|OK  |   2.5MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

8) 每个主机使用两个连接来下载

默认情况,每次下载连接到一台服务器的最大数目,对于一条主机只能建立一条。我们可以通过 aria2 命令行添加 -x22 表示两个连接)来创建到每台主机的多个连接,以加快下载速度。

# aria2c -x2 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
[#ddd4cd 18MiB/21MiB(83%) CN:1 DL:5.0MiB]
03/22 10:16:27 [NOTICE] Download complete: /opt/owncloud-9.0.0.tar.bz2

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
ddd4cd|OK  |   5.5MiB/s|/opt/owncloud-9.0.0.tar.bz2

Status Legend:
(OK):download completed.

9) 下载 BitTorrent 种子文件

我们可以使用 aria2 命令行直接下载一个 BitTorrent 种子文件:

# aria2c https://torcache.net/torrent/C86F4E743253E0EBF3090CCFFCC9B56FA38451A3.torrent?title=[kat.cr]irudhi.suttru.2015.official.teaser.full.hd.1080p.pathi.team.sr
[#388321 0B/0B CN:1 DL:0B]                                                                                                                    
03/22 20:06:14 [NOTICE] Download complete: /opt/[kat.cr]irudhi.suttru.2015.official.teaser.full.hd.1080p.pathi.team.sr.torrent

03/22 20:06:14 [ERROR] Exception caught
Exception: [BtPostDownloadHandler.cc:98] errorCode=25 Could not parse BitTorrent metainfo

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
388321|OK  |    11MiB/s|/opt/[kat.cr]irudhi.suttru.2015.official.teaser.full.hd.1080p.pathi.team.sr.torrent

Status Legend:
(OK):download completed.

10) 下载 BitTorrent 磁力链接

使用 aria2 我们也可以通过 BitTorrent 磁力链接直接下载一个种子文件:

# aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C'

11) 下载 BitTorrent Metalink 种子

我们也可以通过 aria2 命令行直接下载一个 Metalink 文件。

# aria2c https://curl.haxx.se/metalink.cgi?curl=tar.bz2

12) 从密码保护的网站下载一个文件

或者,我们也可以从一个密码保护网站下载一个文件。下面的命令行将会从一个密码保护网站中下载文件。

# aria2c --http-user=xxx --http-password=xxx https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2

# aria2c --ftp-user=xxx --ftp-password=xxx ftp://ftp.gnu.org/gnu/wget/wget-1.17.tar.gz

13) 阅读更多关于 aria2

如果你希望了解了解更多选项 —— 它们同时适用于 wget,可以输入下面的命令行在你自己的终端获取详细信息:

# man aria2c
or
# aria2c --help

谢谢欣赏 …)


via: http://www.2daygeek.com/aria2-command-line-download-utility-tool/

作者:MAGESH MARUTHAMUTHU 译者:yangmingming 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出