diff --git a/published/20140114 Caffeinated 6.828:Lab 2 Memory Management.md b/published/20140114 Caffeinated 6.828:Lab 2 Memory Management.md new file mode 100644 index 0000000000..379fafa165 --- /dev/null +++ b/published/20140114 Caffeinated 6.828:Lab 2 Memory Management.md @@ -0,0 +1,230 @@ +Caffeinated 6.828:实验 2:内存管理 +====== + +### 简介 + +在本实验中,你将为你的操作系统写内存管理方面的代码。内存管理由两部分组成。 + +第一部分是内核的物理内存分配器,内核通过它来分配内存,以及在不需要时释放所分配的内存。分配器以page为单位分配内存,每个页的大小为 4096 字节。你的任务是去维护那个数据结构,它负责记录物理页的分配和释放,以及每个分配的页有多少进程共享它。本实验中你将要写出分配和释放内存页的全套代码。 + +第二个部分是虚拟内存的管理,它负责由内核和用户软件使用的虚拟内存地址到物理内存地址之间的映射。当使用内存时,x86 架构的硬件是由内存管理单元(MMU)负责执行映射操作来查阅一组页表。接下来你将要修改 JOS,以根据我们提供的特定指令去设置 MMU 的页表。 + +#### 预备知识 + +在本实验及后面的实验中,你将逐步构建你的内核。我们将会为你提供一些附加的资源。使用 Git 去获取这些资源、提交自[实验 1][1] 以来的改变(如有需要的话)、获取课程仓库的最新版本、以及在我们的实验 2 (`origin/lab2`)的基础上创建一个称为 `lab2` 的本地分支: + +```c +athena% cd ~/6.828/lab +athena% add git +athena% git pull +Already up-to-date. +athena% git checkout -b lab2 origin/lab2 +Branch lab2 set up to track remote branch refs/remotes/origin/lab2. +Switched to a new branch "lab2" +athena% +``` + +上面的 `git checkout -b` 命令其实做了两件事情:首先它创建了一个本地分支 `lab2`,它跟踪给我们提供课程内容的远程分支 `origin/lab2` ,第二件事情是,它改变你的 `lab` 目录的内容以反映 `lab2` 分支上存储的文件的变化。Git 允许你在已存在的两个分支之间使用 `git checkout *branch-name*` 命令去切换,但是在你切换到另一个分支之前,你应该去提交那个分支上你做的任何有意义的变更。 + +现在,你需要将你在 `lab1` 分支中的改变合并到 `lab2` 分支中,命令如下: + +```c +athena% git merge lab1 +Merge made by recursive. + kern/kdebug.c | 11 +++++++++-- + kern/monitor.c | 19 +++++++++++++++++++ + lib/printfmt.c | 7 +++---- + 3 files changed, 31 insertions(+), 6 deletions(-) +athena% +``` + +在一些案例中,Git 或许并不知道如何将你的更改与新的实验任务合并(例如,你在第二个实验任务中变更了一些代码的修改)。在那种情况下,你使用 `git` 命令去合并,它会告诉你哪个文件发生了冲突,你必须首先去解决冲突(通过编辑冲突的文件),然后使用 `git commit -a` 去重新提交文件。 + +实验 2 包含如下的新源代码,后面你将逐个了解它们: + +- `inc/memlayout.h` +- `kern/pmap.c` +- `kern/pmap.h` +- `kern/kclock.h` +- `kern/kclock.c` + +`memlayout.h` 描述虚拟地址空间的布局,这个虚拟地址空间是通过修改 `pmap.c`、`memlayout.h` 和 `pmap.h` 所定义的 `PageInfo` 数据结构来实现的,这个数据结构用于跟踪物理内存页面是否被释放。`kclock.c` 和 `kclock.h` 维护 PC 上基于电池的时钟和 CMOS RAM 硬件,在此,BIOS 中记录了 PC 上安装的物理内存数量,以及其它的一些信息。在 `pmap.c` 中的代码需要去读取这个设备硬件,以算出在这个设备上安装了多少物理内存,但这部分代码已经为你完成了:你不需要知道 CMOS 硬件工作原理的细节。 + +特别需要注意的是 `memlayout.h` 和 `pmap.h`,因为本实验需要你去使用和理解的大部分内容都包含在这两个文件中。你或许还需要去看看 `inc/mmu.h` 这个文件,因为它也包含了本实验中用到的许多定义。 + +开始本实验之前,记得去添加 `exokernel` 以获取 QEMU 的 6.828 版本。 + +#### 实验过程 + +在你准备进行实验和写代码之前,先添加你的 `answers-lab2.txt` 文件到 Git 仓库,提交你的改变然后去运行 `make handin`。 + +``` +athena% git add answers-lab2.txt +athena% git commit -am "my answer to lab2" +[lab2 a823de9] my answer to lab2 4 files changed, 87 insertions(+), 10 deletions(-) +athena% make handin +``` + +正如前面所说的,我们将使用一个评级程序来分级你的解决方案,你可以在 `lab` 目录下运行 `make grade`,使用评级程序来测试你的内核。为了完成你的实验,你可以改变任何你需要的内核源代码和头文件。但毫无疑问的是,你不能以任何形式去改变或破坏评级代码。 + +### 第 1 部分:物理页面管理 + +操作系统必须跟踪物理内存页是否使用的状态。JOS 以“页”为最小粒度来管理 PC 的物理内存,以便于它使用 MMU 去映射和保护每个已分配的内存片段。 + +现在,你将要写内存的物理页分配器的代码。它将使用 `struct PageInfo` 对象的链表来保持对物理页的状态跟踪,每个对象都对应到一个物理内存页。在你能够编写剩下的虚拟内存实现代码之前,你需要先编写物理内存页面分配器,因为你的页表管理代码将需要去分配物理内存来存储页表。 + +> **练习 1** +> +> 在文件 `kern/pmap.c` 中,你需要去实现以下函数的代码(或许要按给定的顺序来实现)。 +> +> - `boot_alloc()` +> - `mem_init()`(只要能够调用 `check_page_free_list()` 即可) +> - `page_init()` +> - `page_alloc()` +> - `page_free()` +> +> `check_page_free_list()` 和 `check_page_alloc()` 可以测试你的物理内存页分配器。你将需要引导 JOS 然后去看一下 `check_page_alloc()` 是否报告成功即可。如果没有报告成功,修复你的代码直到成功为止。你可以添加你自己的 `assert()` 以帮助你去验证是否符合你的预期。 + +本实验以及所有的 6.828 实验中,将要求你做一些检测工作,以便于你搞清楚它们是否按你的预期来工作。这个任务不需要详细描述你添加到 JOS 中的代码的细节。查找 JOS 源代码中你需要去修改的那部分的注释;这些注释中经常包含有技术规范和提示信息。你也可能需要去查阅 JOS 和 Intel 的技术手册、以及你的 6.004 或 6.033 课程笔记的相关部分。 + +### 第 2 部分:虚拟内存 + +在你开始动手之前,需要先熟悉 x86 内存管理架构的保护模式:即分段和页面转换。 + +> **练习 2** +> +> 如果你对 x86 的保护模式还不熟悉,可以查看 [Intel 80386 参考手册][2]的第 5 章和第 6 章。阅读这些章节(5.2 和 6.4)中关于页面转换和基于页面的保护。我们建议你也去了解关于段的章节;在虚拟内存和保护模式中,JOS 使用了分页、段转换、以及在 x86 上不能禁用的基于段的保护,因此你需要去理解这些基础知识。 + +#### 虚拟地址、线性地址和物理地址 + +在 x86 的专用术语中,一个虚拟地址virtual address是由一个段选择器和在段中的偏移量组成。一个线性地址linear address是在页面转换之前、段转换之后得到的一个地址。一个物理地址physical address是段和页面转换之后得到的最终地址,它最终将进入你的物理内存中的硬件总线。 + +![](https://ws1.sinaimg.cn/large/0069RVTdly1fuxgrc398jj30gx04bgm1.jpg) + +一个 C 指针是虚拟地址的“偏移量”部分。在 `boot/boot.S` 中我们安装了一个全局描述符表Global Descriptor Table(GDT),它通过设置所有的段基址为 0,并且限制为 `0xffffffff` 来有效地禁用段转换。因此“段选择器”并不会生效,而线性地址总是等于虚拟地址的偏移量。在实验 3 中,为了设置权限级别,我们将与段有更多的交互。但是对于内存转换,我们将在整个 JOS 实验中忽略段,只专注于页转换。 + +回顾[实验 1][1] 中的第 3 部分,我们安装了一个简单的页表,这样内核就可以在 `0xf0100000` 链接的地址上运行,尽管它实际上是加载在 `0x00100000` 处的 ROM BIOS 的物理内存上。这个页表仅映射了 4MB 的内存。在实验中,你将要为 JOS 去设置虚拟内存布局,我们将从虚拟地址 `0xf0000000` 处开始扩展它,以映射物理内存的前 256MB,并映射许多其它区域的虚拟内存。 + +> **练习 3** +> +> 虽然 GDB 能够通过虚拟地址访问 QEMU 的内存,它经常用于在配置虚拟内存期间检查物理内存。在实验工具指南中复习 QEMU 的[监视器命令][3],尤其是 `xp` 命令,它可以让你去检查物理内存。要访问 QEMU 监视器,可以在终端中按 `Ctrl-a c`(相同的绑定返回到串行控制台)。 +> +> 使用 QEMU 监视器的 `xp` 命令和 GDB 的 `x` 命令去检查相应的物理内存和虚拟内存,以确保你看到的是相同的数据。 +> +> 我们的打过补丁的 QEMU 版本提供一个非常有用的 `info pg` 命令:它可以展示当前页表的一个具体描述,包括所有已映射的内存范围、权限、以及标志。原本的 QEMU 也提供一个 `info mem` 命令用于去展示一个概要信息,这个信息包含了已映射的虚拟内存范围和使用了什么权限。 + +在 CPU 上运行的代码,一旦处于保护模式(这是在 `boot/boot.S` 中所做的第一件事情)中,是没有办法去直接使用一个线性地址或物理地址的。所有的内存引用都被解释为虚拟地址,然后由 MMU 来转换,这意味着在 C 语言中的指针都是虚拟地址。 + +例如在物理内存分配器中,JOS 内存经常需要在不反向引用的情况下,去维护作为地址的一个很难懂的值或一个整数。有时它们是虚拟地址,而有时是物理地址。为便于在代码中证明,JOS 源文件中将它们区分为两种:类型 `uintptr_t` 表示一个难懂的虚拟地址,而类型 `physaddr_trepresents` 表示物理地址。这些类型其实不过是 32 位整数(`uint32_t`)的同义词,因此编译器不会阻止你将一个类型的数据指派为另一个类型!因为它们都是整数(而不是指针)类型,如果你想去反向引用它们,编译器将报错。 + +JOS 内核能够通过将它转换为指针类型的方式来反向引用一个 `uintptr_t` 类型。相反,内核不能反向引用一个物理地址,因为这是由 MMU 来转换所有的内存引用。如果你转换一个 `physaddr_t` 为一个指针类型,并反向引用它,你或许能够加载和存储最终结果地址(硬件将它解释为一个虚拟地址),但你并不会取得你想要的内存位置。 + +总结如下: + +| C 类型 | 地址类型 | +| ------------ | ------------ | +| `T*` | 虚拟 | +| `uintptr_t` | 虚拟 | +| `physaddr_t` | 物理 | + +> 问题: +> +> 1. 假设下面的 JOS 内核代码是正确的,那么变量 `x` 应该是什么类型?`uintptr_t` 还是 `physaddr_t` ? +> +> ![](https://ws3.sinaimg.cn/large/0069RVTdly1fuxgrbkqd3j30m302bmxc.jpg) +> + +JOS 内核有时需要去读取或修改它只知道其物理地址的内存。例如,添加一个映射到页表,可以要求分配物理内存去存储一个页目录,然后去初始化它们。然而,内核也和其它的软件一样,并不能跳过虚拟地址转换,内核并不能直接加载和存储物理地址。一个原因是 JOS 将重映射从虚拟地址 `0xf0000000` 处的物理地址 `0` 开始的所有的物理地址,以帮助内核去读取和写入它知道物理地址的内存。为转换一个物理地址为一个内核能够真正进行读写操作的虚拟地址,内核必须添加 `0xf0000000` 到物理地址以找到在重映射区域中相应的虚拟地址。你应该使用 `KADDR(pa)` 去做那个添加操作。 + +JOS 内核有时也需要能够通过给定的内核数据结构中存储的虚拟地址找到内存中的物理地址。内核全局变量和通过 `boot_alloc()` 分配的内存是在内核所加载的区域中,从 `0xf0000000` 处开始的这个所有物理内存映射的区域。因此,要转换这些区域中一个虚拟地址为物理地址时,内核能够只是简单地减去 `0xf0000000` 即可得到物理地址。你应该使用 `PADDR(va)` 去做那个减法操作。 + +#### 引用计数 + +在以后的实验中,你将会经常遇到多个虚拟地址(或多个环境下的地址空间中)同时映射到相同的物理页面上。你将在 `struct PageInfo` 数据结构中的 `pp_ref` 字段来记录一个每个物理页面的引用计数器。如果一个物理页面的这个计数器为 0,表示这个页面已经被释放,因为它不再被使用了。一般情况下,这个计数器应该等于所有页表中物理页面出现在 `UTOP` 之下的次数(`UTOP` 之上的映射大都是在引导时由内核设置的,并且它从不会被释放,因此不需要引用计数器)。我们也使用它去跟踪放到页目录页的指针数量,反过来就是,页目录到页表页的引用数量。 + +使用 `page_alloc` 时要注意。它返回的页面引用计数总是为 0,因此,一旦对返回页做了一些操作(比如将它插入到页表),`pp_ref` 就应该增加。有时这需要通过其它函数(比如,`page_instert`)来处理,而有时这个函数是直接调用 `page_alloc` 来做的。 + +#### 页表管理 + +现在,你将写一套管理页表的代码:去插入和删除线性地址到物理地址的映射表,并且在需要的时候去创建页表。 + +> **练习 4** +> +> 在文件 `kern/pmap.c` 中,你必须去实现下列函数的代码。 +> +> - pgdir_walk() +> - boot_map_region() +> - page_lookup() +> - page_remove() +> - page_insert() +> +> `check_page()`,调用自 `mem_init()`,测试你的页表管理函数。在进行下一步流程之前你应该确保它成功运行。 + +### 第 3 部分:内核地址空间 + +JOS 分割处理器的 32 位线性地址空间为两部分:用户环境(进程),(我们将在实验 3 中开始加载和运行),它将控制其上的布局和低位部分的内容;而内核总是维护对高位部分的完全控制。分割线的定义是在 `inc/memlayout.h` 中通过符号 `ULIM` 来划分的,它为内核保留了大约 256MB 的虚拟地址空间。这就解释了为什么我们要在实验 1 中给内核这样的一个高位链接地址的原因:如是不这样做的话,内核的虚拟地址空间将没有足够的空间去同时映射到下面的用户空间中。 + +你可以在 `inc/memlayout.h` 中找到一个图表,它有助于你去理解 JOS 内存布局,这在本实验和后面的实验中都会用到。 + +#### 权限和故障隔离 + +由于内核和用户的内存都存在于它们各自环境的地址空间中,因此我们需要在 x86 的页表中使用权限位去允许用户代码只能访问用户所属地址空间的部分。否则,用户代码中的 bug 可能会覆写内核数据,导致系统崩溃或者发生各种莫名其妙的的故障;用户代码也可能会偷窥其它环境的私有数据。 + +对于 `ULIM` 以上部分的内存,用户环境没有任何权限,只有内核才可以读取和写入这部分内存。对于 `[UTOP,ULIM]` 地址范围,内核和用户都有相同的权限:它们可以读取但不能写入这个地址范围。这个地址范围是用于向用户环境暴露某些只读的内核数据结构。最后,低于 `UTOP` 的地址空间是为用户环境所使用的;用户环境将为访问这些内核设置权限。 + +#### 初始化内核地址空间 + +现在,你将去配置 `UTOP` 以上的地址空间:内核部分的地址空间。`inc/memlayout.h` 中展示了你将要使用的布局。我将使用函数去写相关的线性地址到物理地址的映射配置。 + +> **练习 5** +> +> 完成调用 `check_page()` 之后在 `mem_init()` 中缺失的代码。 + +现在,你的代码应该通过了 `check_kern_pgdir()` 和 `check_page_installed_pgdir()` 的检查。 + +> 问题: +> +> ​ 1、在这个时刻,页目录中的条目(行)是什么?它们映射的址址是什么?以及它们映射到哪里了?换句话说就是,尽可能多地填写这个表: +> +> | 条目 | 虚拟地址基址 | 指向(逻辑上):| +> | --- | ---------- | ------------- | +> | 1023 | ? | 物理内存顶部 4MB 的页表 | +> | 1022 | ? | ? | +> | . | ? | ? | +> | . | ? | ? | +> | . | ? | ? | +> | 2 | 0x00800000 | ? | +> | 1 | 0x00400000 | ? | +> | 0 | 0x00000000 | [参见下一问题] | +> +> ​ 2、(来自课程 3) 我们将内核和用户环境放在相同的地址空间中。为什么用户程序不能去读取和写入内核的内存?有什么特殊机制保护内核内存? +> +> ​ 3、这个操作系统能够支持的最大的物理内存数量是多少?为什么? +> +> ​ 4、如果我们真的拥有最大数量的物理内存,有多少空间的开销用于管理内存?这个开销可以减少吗? +> +> ​ 5、复习在 `kern/entry.S` 和 `kern/entrypgdir.c` 中的页表设置。一旦我们打开分页,EIP 仍是一个很小的数字(稍大于 1MB)。在什么情况下,我们转而去运行在 KERNBASE 之上的一个 EIP?当我们启用分页并开始在 KERNBASE 之上运行一个 EIP 时,是什么让我们能够一个很低的 EIP 上持续运行?为什么这种转变是必需的? + +#### 地址空间布局的其它选择 + +在 JOS 中我们使用的地址空间布局并不是我们唯一的选择。一个操作系统可以在低位的线性地址上映射内核,而为用户进程保留线性地址的高位部分。然而,x86 内核一般并不采用这种方法,因为 x86 向后兼容模式之一(被称为“虚拟 8086 模式”)“不可改变地”在处理器使用线性地址空间的最下面部分,所以,如果内核被映射到这里是根本无法使用的。 + +虽然很困难,但是设计这样的内核是有这种可能的,即:不为处理器自身保留任何固定的线性地址或虚拟地址空间,而有效地允许用户级进程不受限制地使用整个 4GB 的虚拟地址空间 —— 同时还要在这些进程之间充分保护内核以及不同的进程之间相互受保护! + +将内核的内存分配系统进行概括类推,以支持二次幂为单位的各种页大小,从 4KB 到一些你选择的合理的最大值。你务必要有一些方法,将较大的分配单位按需分割为一些较小的单位,以及在需要时,将多个较小的分配单位合并为一个较大的分配单位。想一想在这样的一个系统中可能会出现些什么样的问题。 + +这个实验做完了。确保你通过了所有的等级测试,并记得在 `answers-lab2.txt` 中写下你对上述问题的答案。提交你的改变(包括添加 `answers-lab2.txt` 文件),并在 `lab` 目录下输入 `make handin` 去提交你的实验。 + +------ + +via: https://sipb.mit.edu/iap/6.828/lab/lab2/ + +作者:[Mit](https://sipb.mit.edu/iap/6.828/lab/lab2/) +译者:[qhwdw](https://github.com/qhwdw) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[1]: https://linux.cn/article-9740-1.html +[2]: https://sipb.mit.edu/iap/6.828/readings/i386/toc.htm +[3]: https://sipb.mit.edu/iap/6.828/labguide/#qemu diff --git a/published/20170928 A 3-step process for making more transparent decisions.md b/published/20170928 A 3-step process for making more transparent decisions.md new file mode 100644 index 0000000000..d72837a663 --- /dev/null +++ b/published/20170928 A 3-step process for making more transparent decisions.md @@ -0,0 +1,80 @@ +让决策更透明的三步 +====== + +> 当您使用这种决策技巧时,可以使你作为一个开源领导人做出决策时更透明。 + +![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/GOV_Transparency_A.png?itok=2r47nFJB) + +要让你的领导工作更加透明,其中一个最有效的方法就是将一个现有的流程开放给你的团队进行反馈,然后根据反馈去改变流程。下面这些练习能让透明度更加切实,并且它有助于让你在持续评估并调整你的工作的透明度时形成“肌肉记忆”。 + +我想说,你可以通过任何流程来完成这项工作 —— 即使有些流程看起来像是“禁区”流程,比如晋升或者调薪。但是如果第一次它对于初步实践来说太大了,那么你可能需要从一个不那么敏感的流程开始,比如旅行批准流程或者为你的团队寻找空缺候选人的系统。(举个例子,我在我们的招聘和晋升流程中使用了这种方式) + +开放流程并使其更加透明可以建立你的信誉并增强团队成员对你的信任。它会使你以一种可能超乎你设想和舒适程度的方式“走在透明的路上”。以这种方式工作确实会产生额外的工作,尤其是在过程的开始阶段 —— 但是,最终这种方法对于让管理者(比如我)对团队成员更具责任,而且它会更加相容。 + +### 阶段一:选择一个流程 + +**第一步** 想想你的团队使用的一个普通的或常规的流程,但是这个流程通常不需要仔细检查。下面有一些例子: + + * 招聘:如何创建职位描述、如何挑选面试团队、如何筛选候选人以及如何做出最终的招聘决定。 + * 规划:你的团队或组织如何确定年度或季度目标。 + * 升职:你如何选择并考虑升职候选人,并决定谁升职。 + * 经理绩效评估:谁有机会就经理绩效提供反馈,以及他们是如何反馈。 + * 旅游:旅游预算如何分配,以及你如何决定是否批准旅行(或提名某人是否旅行)。 + +上面的某个例子可能会引起你的共鸣,或者你可能会发现一些你觉得更合适的流程。也许你已经收到了关于某个特定流程的问题,又或者你发现自己屡次解释某个特定决策的逻辑依据。选择一些你能够控制或影响的东西 —— 一些你认为你的成员所关心的东西。 + +**第二步** 现在回答以下关于这个流程的问题: + + * 该流程目前是否记录在一个所有成员都知道并可以访问的地方?如果没有,现在就开始创建文档(不必太详细;只需要解释这个流程的不同步骤以及它是如何工作的)。你可能会发现这个过程不够清晰或一致,无法记录到文档。在这种情况下,用你*认为*理想情况下所应该的方式去记录它。 + * 完成流程的文档是否说明了在不同的点上是如何做出决定?例如,在旅行批准流程中,它是否解释了如何批准或拒绝请求。 + * 流程的*输入信息*是什么?例如,在确定部门年度目标时,哪些数据用于关键绩效指标,查找或者采纳谁的反馈,谁有机会审查或“签字”。 + * 这个过程会做出什么*假设*?例如,在升职决策中,你是否认为所有的晋升候选人都会在适当的时间被他们的经理提出。 + * 流程的*输出物*是什么?例如,在评估经理的绩效时,评估的结果是否会与经理共享,该审查报告的任何方面是否会与经理的直接报告更广泛地共享(例如,改进的领域)? + +回答上述问题时,避免作出判断。如果这个流程不能清楚地解释一个决定是如何做出的,那也可以接受。这些问题只是评估现状的一个机会。 + +接下来,修改流程的文档,直到你对它充分说明了流程并预测潜在的问题感到满意。 + +### 阶段二:收集反馈 + +下一个阶段涉及到与你的成员分享这个流程并要求反馈。分享说起来容易做起来难。 + +**第一步** 鼓励人们提供反馈。考虑一下实现此目的的各种机制: + + * 把这个流程公布在人们可以在内部找到的地方,并提示他们可以在哪里发表评论或提供反馈。谷歌文档可以很好地评论特定的文本或直接提议文本中的更改。 + * 通过电子邮件分享过程文档,邀请反馈。 + * 提及流程文档,在团队会议或一对一的谈话时要求反馈。 + * 给人们一个他们可以提供反馈的时间窗口,并在此窗口内定期发送提醒。 + +如果你得不到太多的反馈,不要认为沉默就等于认可。你可以试着直接询问人们,他们为什么没有反馈。是因为他们太忙了吗?这个过程对他们来说不像你想的那么重要吗?你清楚地表达了你的要求吗? + +**第二步** 迭代。当你获得关于流程的反馈时,鼓励团队对流程进行修改和迭代。加入改进的想法和建议,并要求确认预期的反馈已经被应用。如果你不同意某个建议,那就接受讨论,问问自己为什么不同意,以及一种方法和另一种方法的优点是什么。 + +设置一个收集反馈和迭代的时间窗口有助于向前推进。一旦收集和审查了反馈,你应当讨论和应用它,并且发布最终的流程供团队审查。 + +### 阶段三:实现 + +实现一个流程通常是计划中最困难的阶段。但如果你在修改过程中考虑了反馈意见,人们应该已经预料到了,并且可能会更支持你。从上面迭代过程中获得的文档是一个很好的工具,可以让你对实现负责。 + +**第一步** 审查实施需求。许多可以从提高透明度中获益的流程只需要做一点不同的事情,但是你确实需要检查你是否需要其他支持(例如工具)。 + +**第二步** 设置实现的时间表。与成员一起回顾时间表,这样他们就知道会发生什么。如果新流程需要对其他流程进行更改,请确保为人们提供足够的时间去适应新方式,并提供沟通和提醒。 + +**第三步** 跟进。在使用该流程 3-6 个月后,与你的成员联系,看看进展如何。新流程是否更加透明、更有效、更可预测?你有什么经验教训可以用来进一步改进这个流程吗? + +### 关于作者 + +Sam Knuth —— 我有幸在 Red Hat 领导客户内容服务团队;我们生成提供给我们的客户的所有文档。我们的目标是为客户提供他们在企业中使用开源技术取得成功所需要的洞察力。在 Twitter 上与我联系([@samfw][1])。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/open-organization/17/9/exercise-in-transparent-decisions + +作者:[Sam Knuth][a] +译者:[MarineFish](https://github.com/MarineFish) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/samfw +[1]: https://twitter.com/samfw diff --git a/published/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md b/published/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md new file mode 100644 index 0000000000..e728b3a9ab --- /dev/null +++ b/published/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md @@ -0,0 +1,260 @@ +在 Ubuntu 和 Debian 上启用双因子身份验证的三种备选方案 +===== + +> 如何为你的 SSH 服务器安装三种不同的双因子身份验证方案。 + +如今,安全比以往更加重要,保护 SSH 服务器是作为系统管理员可以做的最为重要的事情之一。传统地,这意味着禁用密码身份验证而改用 SSH 密钥。无疑这是你首先应该做的,但这并不意味着 SSH 无法变得更加安全。 + +双因子身份验证就是指需要两种身份验证才能登录。可以是密码和 SSH 密钥,也可以是密钥和第三方服务,比如 Google。这意味着单个验证方法的泄露不会危及服务器。 + +以下指南是为 SSH 启用双因子验证的三种方式。 + +当你修改 SSH 配置时,总是要确保有一个连接到服务器的第二终端。第二终端意味着你可以修复你在 SSH 配置中犯的任何错误。打开的终端将一直保持,即便 SSH 服务重启。 + +### SSH 密钥和密码 + +SSH 支持对登录要求不止一个身份验证方法。 + +在 `/etc/sh/sshd_config` 中的 SSH 服务器配置文件中的 `AuthenticationMethods` 选项中设置了身份验证方法。 + +当在 `/etc/ssh/sshd_config` 中添加下一行时,SSH 需要提交一个 SSH 密钥,然后提示输入密码: + +``` +AuthenticationMethods "publickey,password" +``` + +如果你想要根据使用情况设置这些方法,那么请使用以下附加配置: + +``` +Match User jsmith + AuthenticationMethods "publickey,password" +``` + +当你已经编辑或保存了新的 `sshd_config` 文件,你应该通过运行以下程序来确保你没有犯任何错误: + +``` +sshd -t +``` + +任何导致 SSH 不能启动的语法或其他错误都将在这里标记出来。当 `ssh-t` 运行时没有错误,使用 `systemctl` 重新启动 SSH: + +``` +systemctl restart sshd +``` + +现在,你可以使用新终端登录,以核实你会被提示输入密码并需要 SSH 密钥。如果你用 `ssh-v`,例如: + +``` +ssh -v jsmith@example.com +``` + +你将可以看到登录的每一步。 + +注意,如果你确实将密码设置成必需的身份验证方法,你要确保将 `PasswordAuthentication` 选项设置成 `yes`。 + +### 使用 Google Authenticator 的 SSH + +Google 在 Google 自己的产品上使用的双因子身份验证系统可以集成到你的 SSH 服务器中。如果你已经使用了Google Authenticator,那么此方法将非常方便。 + +虽然 libpam-google-authenticator 是由 Google 编写的,但它是[开源][1]的。此外,Google Authenticator 是由 Google 编写的,但并不需要 Google 帐户才能工作。多亏了 [Sitaram Chamarty][2] 的贡献。 + +如果你还没有在手机上安装和配置 Google Authenticator,请参阅 [这里][3]的说明。 + +首先,我们需要在服务器上安装 Google Authenticatior 安装包。以下命令将更新你的系统并安装所需的软件包: + +``` +apt-get update +apt-get upgrade +apt-get install libpam-google-authenticator +``` + +现在,我们需要在你的手机上使用 Google Authenticatior APP 注册服务器。这是通过首先运行我们刚刚安装的程序完成的: + +``` +google-authenticator +``` + +运行这个程序时,会问到几个问题。你应该以适合你的设置的方式回答,然而,最安全的选项是对每个问题回答 `y`。如果以后需要更改这些选项,您可以简单地重新运行 `google-authenticator` 并选择不同的选项。 + +当你运行 `google-authenticator` 时,一个二维码会被打印到终端上,有些代码看起来像这样: + +``` +Your new secret key is: VMFY27TYDFRDNKFY +Your verification code is 259652 +Your emergency scratch codes are: + 96915246 + 70222983 + 31822707 + 25181286 + 28919992 +``` + +你应该将所有这些代码记录到一个像密码管理器一样安全的位置。“scratch codes” 是单一的使用代码,即使你的手机不可用,它总是允许你访问。 + +要将服务器注册到 Authenticator APP 中,只需打开应用程序并点击右下角的红色加号即可。然后选择扫描条码选项,扫描打印到终端的二维码。你的服务器和应用程序现在连接。 + +回到服务器上,我们现在需要编辑用于 SSH 的 PAM (可插入身份验证模块),以便它使用我们刚刚安装的身份验证器安装包。PAM 是独立系统,负责 Linux 服务器上的大多数身份验证。 + +需要修改的 SSH PAM 文件位于 `/etc/pam.d/sshd` ,用以下命令编辑: + +``` +nano /etc/pam.d/sshd +``` +  +在文件顶部添加以下行: + +``` +auth required pam_google_authenticator.so +``` + +此外,我们还需要注释掉一行,这样 PAM 就不会提示输入密码。改变这行: + +``` +# Standard Un*x authentication. +@include common-auth +``` + +为如下: + +``` +# Standard Un*x authentication. +# @include common-auth +```  + +接下来,我们需要编辑 SSH 服务器配置文件: + +``` +nano /etc/ssh/sshd_config +``` + +改变这一行: + +``` +ChallengeResponseAuthentication no +``` + +为: + +``` +ChallengeResponseAuthentication yes +``` +  +接下来,添加以下代码行来启用两个身份验证方案:SSH 密钥和谷歌认证器(键盘交互): + +``` +AuthenticationMethods "publickey,keyboard-interactive" +``` +  +在重新加载 SSH 服务器之前,最好检查一下在配置中没有出现任何错误。执行以下命令: + +``` +sshd -t +``` + +如果没有标识出任何错误,用新的配置重载 SSH: + +``` +systemctl reload sshd.service +``` +  +现在一切都应该开始工作了。现在,当你登录到你的服务器时,你将需要使用 SSH 密钥,并且当你被提示输入: + +``` +Verification code: +``` + +打开 Authenticator APP 并输入为您的服务器显示的 6 位代码。 + +### Authy + +[Authy][4] 是一个双重身份验证服务,与 Google 一样,它提供基于时间的代码。然而,Authy 不需要手机,因为它提供桌面和平板客户端。它们还支持离线身份验证,不需要 Google 帐户。 + +你需要从应用程序商店安装 Authy 应用程序,或 Authy [下载页面][5]所链接的桌面客户端。 + +安装完应用程序后,需要在服务器上使用 API 密钥。这个过程需要几个步骤: + +1. 在[这里][6]注册一个账户。 +2. 向下滚动到 “Authy” 部分。 +3. 在帐户上启用双因子认证(2FA)。 +4. 回 “Authy” 部分。 +5. 为你的服务器创建一个新的应用程序。 +6. 从新应用程序的 “General Settings” 页面顶部获取 API 密钥。你需要 “PRODUCTION API KEY”旁边的眼睛符号来显示密钥。如图: + +![](https://bash-prompt.net/images/guides/2FA/twilio-authy-api.png) + +在某个安全的地方记下 API 密钥。 + +现在,回到服务器,以 root 身份运行以下命令: + +``` +curl -O 'https://raw.githubusercontent.com/authy/authy-ssh/master/authy-ssh' +bash authy-ssh install /usr/local/bin +``` +  +当提示时输入 API 键。如果输入错误,你始终可以编辑 `/usr/local/bin/authy-ssh` 再添加一次。 + +Authy 现已安装。但是,在为用户启用它之前,它不会开始工作。启用 Authy 的命令有以下形式: + +``` +/usr/local/bin/authy-ssh enable +``` +  +root 登录的一些示例细节: + +``` +/usr/local/bin/authy-ssh enable root john@example.com 44 20822536476 +``` +  +如果一切顺利,你会看到: + +``` +User was registered +``` + +现在可以通过运行以下命令来测试 Authy: + +``` +authy-ssh test +``` + +最后,重载 SSH 实现新的配置: + +``` +systemctl reload sshd.service +``` +  +Authy 现在正在工作,SSH 需要它才能登录。 + +现在,当你登录时,你将看到以下提示: + +``` +Authy Token (type 'sms' to request a SMS token): +``` +  +你可以输入手机或桌面客户端的 Authy APP 上的代码。或者你可以输入 `sms`, Authy 会给你发送一条带有登录码的短信。 + +可以通过运行以下命令卸载 Authy: + +``` +/usr/local/bin/authy-ssh uninstall +``` + +-------------------------------------------------------------------------------- + +via: https://bash-prompt.net/guides/ssh-2fa/ + +作者:[Elliot Cooper][a] +译者:[cielllll](https://github.com/cielllll) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://bash-prompt.net +[1]:https://github.com/google/google-authenticator-libpam +[2]:https://plus.google.com/115609618223925128756 +[3]:https://support.google.com/accounts/answer/1066447?hl=en +[4]:https://authy.com/ +[5]:https://authy.com/download/ +[6]:https://www.authy.com/signup +[7]:/images/guides/2FA/twilio-authy-api.png + diff --git a/translated/tech/20180101 Manage Your Games Using Lutris In Linux.md b/published/20180101 Manage Your Games Using Lutris In Linux.md similarity index 68% rename from translated/tech/20180101 Manage Your Games Using Lutris In Linux.md rename to published/20180101 Manage Your Games Using Lutris In Linux.md index b5db293f0b..de14f298e7 100644 --- a/translated/tech/20180101 Manage Your Games Using Lutris In Linux.md +++ b/published/20180101 Manage Your Games Using Lutris In Linux.md @@ -1,67 +1,71 @@ 在 Linux 上使用 Lutries 管理你的游戏 ====== + ![](https://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-1-720x340.jpg) -让我们用游戏开始 2018 的第一天吧!今天我们要讨论的是 **Lutris**,一个 Linux 上的开源游戏平台。你可以使用 Lutries 安装、移除、配置、启动和管理你的游戏。它可以以一个界面帮你管理你的 Linux 游戏、Windows 游戏、仿真控制台游戏和浏览器游戏。它还包含社区编写的安装脚本,使得游戏的安装过程更加简单。 +今天我们要讨论的是 **Lutris**,一个 Linux 上的开源游戏平台。你可以使用 Lutries 安装、移除、配置、启动和管理你的游戏。它可以在一个单一界面中帮你管理你的 Linux 游戏、Windows 游戏、仿真控制台游戏和浏览器游戏。它还包含社区编写的安装脚本,使得游戏的安装过程更加简单。 Lutries 自动安装(或者你可以单击点击安装)了超过 20 个模拟器,它提供了从七十年代到现在的大多数游戏系统。目前支持的游戏系统如下: - * Native Linux + * Linux 原生 * Windows - * Steam (Linux and Windows) + * Steam (Linux 和 Windows) * MS-DOS * 街机 * Amiga 电脑 * Atari 8 和 16 位计算机和控制器 * 浏览器 (Flash 或者 HTML5 游戏) * Commmodore 8 位计算机 - * 基于 SCUMM 的游戏和其他点击冒险游戏 - * Magnavox Odyssey², Videopac+ + * 基于 SCUMM 的游戏和其他点击式冒险游戏 + * Magnavox Odyssey²、Videopac+ * Mattel Intellivision - * NEC PC-Engine Turbographx 16, Supergraphx, PC-FX - * Nintendo NES, SNES, Game Boy, Game Boy Advance, DS - * Game Cube and Wii - * Sega Master Sytem, Game Gear, Genesis, Dreamcast - * SNK Neo Geo, Neo Geo Pocket + * NEC PC-Engine Turbographx 16、Supergraphx、PC-FX + * Nintendo NES、SNES、Game Boy、Game Boy Advance、DS + * Game Cube 和 Wii + * Sega Master Sytem、Game Gear、Genesis、Dreamcast + * SNK Neo Geo、Neo Geo Pocket * Sony PlayStation * Sony PlayStation 2 * Sony PSP * 像 Zork 这样的 Z-Machine 游戏 * 还有更多 - - ### 安装 Lutris 就像 Steam 一样,Lutries 包含两部分:网站和客户端程序。从网站你可以浏览可用的游戏,添加最喜欢的游戏到个人库,以及使用安装链接安装他们。 首先,我们还是来安装客户端。它目前支持 Arch Linux、Debian、Fedroa、Gentoo、openSUSE 和 Ubuntu。 -对于 Arch Linux 和它的衍生版本,像是 Antergos, Manjaro Linux,都可以在 [**AUR**][1] 中找到。因此,你可以使用 AUR 帮助程序安装它。 +对于 **Arch Linux** 和它的衍生版本,像是 Antergos, Manjaro Linux,都可以在 [AUR][1] 中找到。因此,你可以使用 AUR 帮助程序安装它。 + +使用 [Pacaur][2]: -使用 [**Pacaur**][2]: ``` pacaur -S lutris ``` -使用 **[Packer][3]** : +使用 [Packer][3]: + ``` packer -S lutris ``` -使用 [**Yaourt**][4]: +使用 [Yaourt][4]: + ``` yaourt -S lutris ``` -使用 [**Yay**][5]: +使用 [Yay][5]: + ``` yay -S lutris ``` **Debian:** -在 **Debian 9.0** 上以 **root** 身份运行以下命令: +在 **Debian 9.0** 上以 **root** 身份运行以下命令: + ``` echo 'deb http://download.opensuse.org/repositories/home:/strycore/Debian_9.0/ /' > /etc/apt/sources.list.d/lutris.list wget -nv https://download.opensuse.org/repositories/home:strycore/Debian_9.0/Release.key -O Release.key @@ -71,6 +75,7 @@ apt-get install lutris ``` 在 **Debian 8.0** 上以 **root** 身份运行以下命令: + ``` echo 'deb http://download.opensuse.org/repositories/home:/strycore/Debian_8.0/ /' > /etc/apt/sources.list.d/lutris.list wget -nv https://download.opensuse.org/repositories/home:strycore/Debian_8.0/Release.key -O Release.key @@ -79,19 +84,22 @@ apt-get update apt-get install lutris ``` -在 **Fedora 27** 上以 **root** 身份运行以下命令: r +在 **Fedora 27** 上以 **root** 身份运行以下命令: + ``` dnf config-manager --add-repo https://download.opensuse.org/repositories/home:strycore/Fedora_27/home:strycore.repo dnf install lutris ``` -在 **Fedora 26** 上以 **root** 身份运行以下命令: +在 **Fedora 26** 上以 **root** 身份运行以下命令: + ``` dnf config-manager --add-repo https://download.opensuse.org/repositories/home:strycore/Fedora_26/home:strycore.repo dnf install lutris ``` 在 **openSUSE Tumbleweed** 上以 **root** 身份运行以下命令: + ``` zypper addrepo https://download.opensuse.org/repositories/home:strycore/openSUSE_Tumbleweed/home:strycore.repo zypper refresh @@ -99,13 +107,15 @@ zypper install lutris ``` 在 **openSUSE Leap 42.3** 上以 **root** 身份运行以下命令: + ``` zypper addrepo https://download.opensuse.org/repositories/home:strycore/openSUSE_Leap_42.3/home:strycore.repo zypper refresh zypper install lutris ``` -**Ubuntu 17.10**: +**Ubuntu 17.10**: + ``` sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/strycore/xUbuntu_17.10/ /' > /etc/apt/sources.list.d/lutris.list" wget -nv https://download.opensuse.org/repositories/home:strycore/xUbuntu_17.10/Release.key -O Release.key @@ -114,7 +124,8 @@ sudo apt-get update sudo apt-get install lutris ``` -**Ubuntu 17.04**: +**Ubuntu 17.04**: + ``` sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/strycore/xUbuntu_17.04/ /' > /etc/apt/sources.list.d/lutris.list" wget -nv https://download.opensuse.org/repositories/home:strycore/xUbuntu_17.04/Release.key -O Release.key @@ -123,7 +134,8 @@ sudo apt-get update sudo apt-get install lutris ``` -**Ubuntu 16.10**: +**Ubuntu 16.10**: + ``` sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/strycore/xUbuntu_16.10/ /' > /etc/apt/sources.list.d/lutris.list" wget -nv https://download.opensuse.org/repositories/home:strycore/xUbuntu_16.10/Release.key -O Release.key @@ -132,7 +144,8 @@ sudo apt-get update sudo apt-get install lutris ``` -**Ubuntu 16.04**: +**Ubuntu 16.04**: + ``` sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/strycore/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/lutris.list" wget -nv https://download.opensuse.org/repositories/home:strycore/xUbuntu_16.04/Release.key -O Release.key @@ -141,71 +154,75 @@ sudo apt-get update sudo apt-get install lutris ``` -对于其他平台,参考 [**Lutris 下载链接**][6]. +对于其他平台,参考 [Lutris 下载链接][6]。 ### 使用 Lutris 管理你的游戏 安装完成后,从菜单或者应用启动器里打开 Lutries。首次启动时,Lutries 的默认界面像下面这样: -[![][7]][8] +![][8] -**登录你的 Lutris.net 账号** +#### 登录你的 Lutris.net 账号 -为了能同步你个人库中的游戏,下一步你需要在客户端中登录你的 Lutris.net 账号。如果你没有,先 [**注册一个新的账号**][9]。然后点击 **"连接到你的 Lutirs.net 账号同步你的库 "** 连接到 Lutries 客户端。 +为了能同步你个人库中的游戏,下一步你需要在客户端中登录你的 Lutris.net 账号。如果你没有,先 [注册一个新的账号][9]。然后点击 “Connecting to your Lutirs.net account to sync your library” 连接到 Lutries 客户端。 -输入你的账号信息然后点击 **继续**。 +输入你的账号信息然后点击 “Connect”。 -[![][7]][10] +![][10] 现在你已经连接到你的 Lutries.net 账号了。 -[![][7]][11]**Browse Games** +![][11] + +#### 浏览游戏 点击工具栏里的浏览图标(游戏控制器图标)可以搜索任何游戏。它会自动定向到 Lutries 网站的游戏页。你可以以字母顺序查看所有可用的游戏。Lutries 现在已经有了很多游戏,而且还有更多的不断添加进来。 -[![][7]][12] +![][12] 任选一个游戏,添加到你的库中。 -[![][7]][13] +![][13] -然后返回到你的 Lutries 客户端,点击 **菜单 - > Lutris -> 同步库**。现在你可以在本地的 Lutries 客户端中看到所有在库中的游戏了。 +然后返回到你的 Lutries 客户端,点击 “Menu -> Lutris -> Synchronize library”。现在你可以在本地的 Lutries 客户端中看到所有在库中的游戏了。 -[![][7]][14] +![][14] 如果你没有看到游戏,只需要重启一次。 -**安装游戏** +#### 安装游戏 -安装游戏,只需要点击游戏,然后点击 **安装** 按钮。例如,我想在我的系统安装 [**2048**][15],就像你在底下的截图中看到的,它要求我选择一个版本去安装。因为它只有一个版本(例如,在线),它就会自动选择这个版本。点击 **继续**。 +安装游戏,只需要点击游戏,然后点击 “Install” 按钮。例如,我想在我的系统安装 [2048][15],就像你在底下的截图中看到的,它要求我选择一个版本去安装。因为它只有一个版本(例如,在线),它就会自动选择这个版本。点击 “Continue”。 -[![][7]][16]Click Install: +![][16] -[![][7]][17] +点击“Install”: + +![][17] 安装完成之后,你可以启动新安装的游戏或是关闭这个窗口,继续从你的库中安装其他游戏。 -**导入 Steam 库** +#### 导入 Steam 库 -你也可以导入你的 Steam 库。在你的头像处点击 **"通过 Steam 登录"** 按钮。接下来你将被重定向到 Steam,输入你的账号信息。填写正确后,你的 Steam 账号将被连接到 Lutries 账号。请注意,为了同步库中的游戏,这里你的 Steam 账号将被公开。你可以在同步完成之后将其重新设为私密状态。 +你也可以导入你的 Steam 库。在你的头像处点击 “Sign in through Steam” 按钮。接下来你将被重定向到 Steam,输入你的账号信息。填写正确后,你的 Steam 账号将被连接到 Lutries 账号。请注意,为了同步库中的游戏,这里你的 Steam 账号将被公开。你可以在同步完成之后将其重新设为私密状态。 -**手动添加游戏** +#### 手动添加游戏 -Lutries 有手动添加游戏的选项。在工具栏中点击 + 号登录。 +Lutries 有手动添加游戏的选项。在工具栏中点击 “+” 号登录。 -[![][7]][18] +![][18] -在下一个窗口,输入游戏名,在游戏信息栏选择一个运行器。运行器是指 Linux 上类似 wine,Steam 之类的程序,它们可以帮助你启动这个游戏。你可以从 菜单 -> 管理运行器 中安装运行器。 +在下一个窗口,输入游戏名,在游戏信息栏选择一个运行器。运行器是指 Linux 上类似 wine、Steam 之类的程序,它们可以帮助你启动这个游戏。你可以从 “Menu -> Manage” 中安装运行器。 -[![][7]][19] +![][19] 然后在下一栏中选择可执行文件或者 ISO。最后点击保存。有一个好消息是,你可以添加一个游戏的多个版本。 -**移除游戏** +#### 移除游戏 -移除任何已安装的游戏,只需在 Lutries 客户端的本地库中点击对应的游戏。选择 **移除** 然后 **应用**。 +移除任何已安装的游戏,只需在 Lutries 客户端的本地库中点击对应的游戏。选择 “Remove” 然后 “Apply”。 -[![][7]][20] +![][20] Lutries 就像 Steam。只是从网站向你的库中添加游戏,并在客户端中为你安装它们。 @@ -215,15 +232,13 @@ Lutries 就像 Steam。只是从网站向你的库中添加游戏,并在客户 :) - - -------------------------------------------------------------------------------- via: https://www.ostechnix.com/manage-games-using-lutris-linux/ 作者:[SK][a] 译者:[dianbanjiu](https://github.com/dianbanjiu) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -234,17 +249,16 @@ via: https://www.ostechnix.com/manage-games-using-lutris-linux/ [4]:https://www.ostechnix.com/install-yaourt-arch-linux/ [5]:https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ [6]:https://lutris.net/downloads/ -[7]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[8]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-1-1.png () +[8]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-1-1.png [9]:https://lutris.net/user/register/ -[10]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-2.png () -[11]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-3.png () -[12]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-15-1.png () -[13]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-16.png () -[14]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-6.png () +[10]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-2.png +[11]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-3.png +[12]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-15-1.png +[13]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-16.png +[14]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-6.png [15]:https://www.ostechnix.com/let-us-play-2048-game-terminal/ -[16]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-12.png () -[17]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-13.png () -[18]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-18-1.png () -[19]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-19.png () -[20]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-14-1.png () +[16]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-12.png +[17]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-13.png +[18]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-18-1.png +[19]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-19.png +[20]:http://www.ostechnix.com/wp-content/uploads/2018/01/Lutris-14-1.png diff --git a/translated/tech/20180305 Getting started with Python for data science.md b/published/20180305 Getting started with Python for data science.md similarity index 50% rename from translated/tech/20180305 Getting started with Python for data science.md rename to published/20180305 Getting started with Python for data science.md index 2b4fa48363..5793e36c6d 100644 --- a/translated/tech/20180305 Getting started with Python for data science.md +++ b/published/20180305 Getting started with Python for data science.md @@ -1,118 +1,101 @@ Python 数据科学入门 ====== +> 不需要昂贵的工具即可领略数据科学的力量,从这些开源工具起步即可。 + ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/GOV_open_data_520x292.jpg?itok=R8rBrlk7) -无论你是一个具有数学或计算机科学背景的数据科学爱好者,还是一个其它领域的专家,数据科学提供的可能性都在你力所能及的范围内,而且你不需要昂贵的,高度专业化的企业软件。本文中讨论的开源工具就是你入门时所需的全部内容。 +无论你是一个具有数学或计算机科学背景的资深数据科学爱好者,还是一个其它领域的专家,数据科学提供的可能性都在你力所能及的范围内,而且你不需要昂贵的,高度专业化的企业级软件。本文中讨论的开源工具就是你入门时所需的全部内容。 -[Python][1],其机器学习和数据科学库([pandas][2], [Keras][3], [TensorFlow][4], [scikit-learn][5], [SciPy][6], [NumPy][7] 等),以及大量可视化库([Matplotlib][8], [pyplot][9], [Plotly][10] 等)对于初学者和专家来说都是优秀的 FOSS(译注:全称为 Free and Open Source Software)工具。它们易于学习,很受欢迎且受到社区支持,并拥有为数据科学开发的最新技术和算法。它们是你在开始学习时可以获得的最佳工具集之一。 +[Python][1],其机器学习和数据科学库([pandas][2]、 [Keras][3]、 [TensorFlow][4]、 [scikit-learn][5]、 [SciPy][6]、 [NumPy][7] 等),以及大量可视化库([Matplotlib][8]、[pyplot][9]、 [Plotly][10] 等)对于初学者和专家来说都是优秀的自由及开源软件工具。它们易于学习,很受欢迎且受到社区支持,并拥有为数据科学而开发的最新技术和算法。它们是你在开始学习时可以获得的最佳工具集之一。 -许多 Python 库都是建立在彼此之上的(称为依赖项),其基础是 [NumPy][7] 库。NumPy 专门为数据科学设计,经常用于在其 ndarray 数据类型中存储数据集的相关部分。ndarray 是一种方便的数据类型,用于将关系表中的记录存储为 `cvs` 文件或其它任何格式,反之亦然。将 scikit 功能应用于多维数组时,它特别方便。SQL 非常适合查询数据库,但是对于执行复杂和资源密集型的数据科学操作,在 ndarray 中存储数据可以提高效率和速度(确保在处理大量数据集时有足够的 RAM)。当你使用 pandas 进行知识提取和分析时,pandas 中的 DataFrame 数据类型和 NumPy 中的 ndarray 之间的无缝转换分别为提取和计算密集型操作创建了一个强大的组合。 +许多 Python 库都是建立在彼此之上的(称为依赖项),其基础是 [NumPy][7] 库。NumPy 专门为数据科学设计,经常被用于在其 ndarray 数据类型中存储数据集的相关部分。ndarray 是一种方便的数据类型,用于将关系表中的记录存储为 `cvs` 文件或其它任何格式,反之亦然。将 scikit 函数应用于多维数组时,它特别方便。SQL 非常适合查询数据库,但是对于执行复杂和资源密集型的数据科学操作,在 ndarray 中存储数据可以提高效率和速度(但请确保在处理大量数据集时有足够的 RAM)。当你使用 pandas 进行知识提取和分析时,pandas 中的 DataFrame 数据类型和 NumPy 中的 ndarray 之间的无缝转换分别为提取和计算密集型操作创建了一个强大的组合。 + +作为快速演示,让我们启动 Python shell 并在 pandas DataFrame 变量中加载来自巴尔的摩的犯罪统计数据的开放数据集,并查看加载的一部分 DataFrame: -为了快速演示,让我们启动 Python shel 并在 pandas DataFrame 变量中加载来自巴尔的摩(Baltimore)的犯罪统计数据的开放数据集,并查看加载 frame 的一部分: ``` >>>  import pandas as pd - >>>  crime_stats = pd.read_csv('BPD_Arrests.csv') - >>>  crime_stats.head() ``` ![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/crime_stats_chart.jpg?itok=_rPXJYHz) -我们现在可以在这个 pandas DataFrame 上执行大多数查询就像我们可以在数据库中使用 SQL。例如,要获取 "Description"属性的所有唯一值,SQL 查询是: +我们现在可以在这个 pandas DataFrame 上执行大多数查询,就像我们可以在数据库中使用 SQL 一样。例如,要获取 `Description` 属性的所有唯一值,SQL 查询是: + ``` $ SELECT unique(“Description”) from crime_stats; - ``` 利用 pandas DataFrame 编写相同的查询如下所示: + ``` ->>>  crime_stats['Description'].unique() - -['COMMON   ASSAULT'   'LARCENY'   'ROBBERY   - STREET'   'AGG.   ASSAULT' - -'LARCENY   FROM   AUTO'   'HOMICIDE'   'BURGLARY'   'AUTO   THEFT' - -'ROBBERY   - RESIDENCE'   'ROBBERY   - COMMERCIAL'   'ROBBERY   - CARJACKING' - -'ASSAULT   BY  THREAT'   'SHOOTING'   'RAPE'   'ARSON'] - +>>> crime_stats['Description'].unique() +['COMMON ASSAULT' 'LARCENY' 'ROBBERY - STREET' 'AGG. ASSAULT' +'LARCENY FROM AUTO' 'HOMICIDE' 'BURGLARY' 'AUTO THEFT' +'ROBBERY - RESIDENCE' 'ROBBERY - COMMERCIAL' 'ROBBERY - CARJACKING' +'ASSAULT BY THREAT' 'SHOOTING' 'RAPE' 'ARSON'] ``` 它返回的是一个 NumPy 数组(ndarray 类型): + ``` ->>>  type(crime_stats['Description'].unique()) - - - +>>> type(crime_stats['Description'].unique()) + ``` 接下来让我们将这些数据输入神经网络,看看它能多准确地预测使用的武器类型,给出的数据包括犯罪事件,犯罪类型以及发生的地点: + ``` ->>>  from sklearn.neural_network import MLPClassifier - ->>>  import numpy as np - +>>> from sklearn.neural_network import MLPClassifier +>>> import numpy as np >>> - ->>>  prediction = crime_stats[[‘Weapon’]] - ->>>  predictors = crime_stats['CrimeTime', ‘CrimeCode’, ‘Neighborhood’] - +>>> prediction = crime_stats[[‘Weapon’]] +>>> predictors = crime_stats['CrimeTime', ‘CrimeCode’, ‘Neighborhood’] >>> - ->>>  nn_model = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5,2), random_state=1) - +>>> nn_model = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, +2), random_state=1) >>> - ->>>predict_weapon = nn_model.fit(prediction, predictors) - +>>>predict_weapon = nn_model.fit(prediction, predictors) ``` 现在学习模型准备就绪,我们可以执行一些测试来确定其质量和可靠性。对于初学者,让我们输入一个训练集数据(用于训练模型的原始数据集的一部分,不包括在创建模型中): -``` ->>>  predict_weapon.predict(training_set_weapons) - -array([4, 4, 4, ..., 0, 4, 4]) ``` - -如你所见,它返回一个列表,每个数字预测训练集中每个记录的武器。我们之所以看到的是数字而不是武器名称,是因为大多数分类算法都是用数字优化的。对于分类数据,有一些技术可以将属性转换为数字表示。在这种情况下,使用的技术是 Label Encoder,使用 sklearn 预处理库中的 LabelEncoder 函数:`preprocessing.LabelEncoder()`。它能够对一个数据和其对应的数值表示来进行变换和逆变换。在这个例子中,我们可以使用 LabelEncoder() 的 `inverse_transform` 函数来查看武器 0 和 4 是什么: +>>> predict_weapon.predict(training_set_weapons) +array([4, 4, 4, ..., 0, 4, 4]) ``` ->>>  preprocessing.LabelEncoder().inverse_transform(encoded_weapons) -array(['HANDS',   'FIREARM',   'HANDS',   ..., 'FIREARM',   'FIREARM',   'FIREARM'] +如你所见,它返回一个列表,每个数字预测训练集中每个记录的武器。我们之所以看到的是数字而不是武器名称,是因为大多数分类算法都是用数字优化的。对于分类数据,有一些技术可以将属性转换为数字表示。在这种情况下,使用的技术是标签编码,使用 sklearn 预处理库中的 `LabelEncoder` 函数:`preprocessing.LabelEncoder()`。它能够对一个数据和其对应的数值表示来进行变换和逆变换。在这个例子中,我们可以使用 `LabelEncoder()` 的 `inverse_transform` 函数来查看武器 0 和 4 是什么: +``` +>>> preprocessing.LabelEncoder().inverse_transform(encoded_weapons) +array(['HANDS', 'FIREARM', 'HANDS', ..., 'FIREARM', 'FIREARM', 'FIREARM'] ``` 这很有趣,但为了了解这个模型的准确程度,我们将几个分数计算为百分比: -``` ->>>  nn_model.score(X, y) +``` +>>> nn_model.score(X, y) 0.81999999999999995 ``` -这表明我们的神经网络模型准确度约为 82%。这个结果似乎令人印象深刻,但用于不同的犯罪数据集时,检查其有效性非常重要。还有其它测试来做这个,如相关性,混淆,矩阵等。尽管我们的模型有很高的准确率,但它对于一般犯罪数据集并不是非常有用,因为这个特定数据集具有不成比例的行数,其列出 ‘FIREARM’ 作为使用的武器。除非重新训练,否则我们的分类器最有可能预测 ‘FIREARM’,即使输入数据集有不同的分布。 +这表明我们的神经网络模型准确度约为 82%。这个结果似乎令人印象深刻,但用于不同的犯罪数据集时,检查其有效性非常重要。还有其它测试来做这个,如相关性、混淆、矩阵等。尽管我们的模型有很高的准确率,但它对于一般犯罪数据集并不是非常有用,因为这个特定数据集具有不成比例的行数,其列出 `FIREARM` 作为使用的武器。除非重新训练,否则我们的分类器最有可能预测 `FIREARM`,即使输入数据集有不同的分布。 在对数据进行分类之前清洗数据并删除异常值和畸形数据非常重要。预处理越好,我们的见解准确性就越高。此外,为模型或分类器提供过多数据(通常超过 90%)以获得更高的准确度是一个坏主意,因为它看起来准确但由于[过度拟合][11]而无效。 -[Jupyter notebooks][12] 相对于命令行来说是一个很好的交互式替代品。虽然 CLI 对大多数事情都很好,但是当你想要运行代码片段以生成可视化时,Jupyter 会很出色。它比终端更好地格式化数据。 +[Jupyter notebooks][12] 相对于命令行来说是一个很好的交互式替代品。虽然 CLI 对于大多数事情都很好,但是当你想要运行代码片段以生成可视化时,Jupyter 会很出色。它比终端更好地格式化数据。 [这篇文章][13] 列出了一些最好的机器学习免费资源,但是还有很多其它的指导和教程。根据你的兴趣和爱好,你还会发现许多开放数据集可供使用。作为起点,由 [Kaggle][14] 维护的数据集,以及在州政府网站上提供的数据集是极好的资源。 -(to 校正:最后这句话不知该如何理解) -Payal Singh 将出席今年 3 月 8 日至 11 日在 California(加利福尼亚)的 Pasadena(帕萨迪纳)举行的 SCaLE16x。要参加并获得 50% 的门票优惠,[注册][15]使用优惠码**OSDC**。 - - -------------------------------------------------------------------------------- via: https://opensource.com/article/18/3/getting-started-data-science 作者:[Payal Singh][a] 译者:[MjSeven](https://github.com/MjSeven) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/talk/20180502 9 ways to improve collaboration between developers and designers.md b/published/20180502 9 ways to improve collaboration between developers and designers.md similarity index 96% rename from translated/talk/20180502 9 ways to improve collaboration between developers and designers.md rename to published/20180502 9 ways to improve collaboration between developers and designers.md index 5c18d6c307..9c0110dc95 100644 --- a/translated/talk/20180502 9 ways to improve collaboration between developers and designers.md +++ b/published/20180502 9 ways to improve collaboration between developers and designers.md @@ -1,10 +1,9 @@ 9 个提升开发者与设计师协作的方法 ====== +> 抛开成见,设计师和开发者的命运永远交织在一起。 以下是如何让每个人都在同一页面上。 ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUS_consensuscollab1.png?itok=ULQdGjlV) -本文由我与 [Jason Porter][1] 共同完成。 - 在任何软件项目中,设计至关重要。设计师不像开发团队那样熟悉其内部工作,但迟早都要知道开发人员写代码的意图。 两边都有自己的成见。工程师经常认为设计师们古怪不理性,而设计师也认为工程师们死板要求高。在一天的工作快要结束时,情况会变得更加微妙。设计师和开发者们的命运永远交织在一起。 @@ -53,7 +52,7 @@ via: https://opensource.com/article/18/5/9-ways-improve-collaboration-developers-designers -作者:[Jason Brock][a] +作者:[Jason Brock][a], [Jason Porter][1] 选题:[lujun9972](https://github.com/lujun9972) 译者:[LuuMing](https://github.com/LuuMing) 校对:[pityonline](https://github.com/pityonline) diff --git a/published/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md b/published/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md new file mode 100644 index 0000000000..0b417c1cfc --- /dev/null +++ b/published/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md @@ -0,0 +1,159 @@ +对 C++ 的忧虑?C++创始人警告:关于 C++ 的某些未来计划十分危险 +====== + +![](https://regmedia.co.uk/2018/06/15/shutterstock_38621860.jpg?x=442&y=293&crop=1) + +今年早些时候,我们对 Bjarne Stroustrup 进行了采访。他是 C++ 语言的创始人,摩根士丹利技术部门的董事总经理,美国哥伦比亚大学计算机科学的客座教授。他写了[一封信][1],请那些关注编程语言进展的人去“想想瓦萨号!” + +这句话对于丹麦人来说,毫无疑问,很容易理解。而那些对于 17 世纪的斯堪的纳维亚历史了解不多的人,还需要详细说明一下。瓦萨号是一艘瑞典军舰,由国王 Gustavus Adolphus 定做。它是当时波罗的海国家中最强大的军舰,但在 1628 年 8 月 10 日首航没几分钟之后就沉没了。 + +巨大的瓦萨号有一个难以解决的设计缺陷:头重脚轻,以至于它被[一阵狂风刮翻了][2]。通过援引这艘沉船的历史,Stroustrup 警示了 C++ 所面临的风险 —— 现在越来越多的特性被添加到了 C++ 中。 + +我们现在已经发现了好些能导致头重脚轻的特性。Stroustrup 在他的信中引用了 43 个提议。他认为那些参与 C++ 语言 ISO 标准演进的人(即所谓的 [WG21 小组][3])正在努力推进语言发展,但成员们的努力方向却并不一致。 + +在他的信中,他写道: + +> 分开来看,许多提议都很有道理。但将它们综合到一起,这些提议是很愚蠢的,将危害 C++ 的未来。 + +他明确表示,他用瓦萨号作为比喻并不是说他认为不断提升会带来毁灭。我们应该吸取瓦萨号的教训,构建一个坚实的基础,从错误中学习并对新版本做彻底的测试。 + +在瑞士拉普斯威尔Rapperswill召开 C++ 标准化委员会会议之后,本月早些时候,Stroustrup 接受了 *The Register* 的采访,回答了有关 C++ 语言下一步发展方向的几个问题。(最新版是去年刚发布的 C++17;下一个版本是 C++20,预计于 2020 年发布。) + +*Register:*在您的信件《想想瓦萨号!》中,您写道: + +> 在 C++11 开始的基础建设尚未完成,而 C++17 基本没有在使基础更加稳固、规范和完整方面做出改善。相反,却增加了重要接口的复杂度(原文为 surface complexity,直译“表面复杂度”),让人们需要学习的特性数量越来越多。C++ 可能在这种不成熟的提议的重压之下崩溃。我们不应该花费大量的时间为专家级用户们(比如我们自己)去创建越来越复杂的东西。~~(还要考虑普通用户的学习曲线,越复杂的东西越不易普及。)~~ + +**对新人来说,C++ 过难了吗?如果是这样,您认为怎样的特性让新人更易理解?** + +*Stroustrup:*C++ 的有些东西对于新人来说确实很具有挑战性。 + +另一方面而言,C++ 中有些东西对于新人来说,比起 C 或上世纪九十年代的 C++ 更容易理解了。而难点是让大型社区专注于这些部分,并且帮助新手和非专业的 C++ 用户去规避那些对高级库实现提供支持的部分。 + +我建议使用 [C++ 核心准则][4]作为实现上述目标的一个辅助。 + +此外,我的“C++ 教程”也可以帮助人们在使用现代 C++ 时走上正确的方向,而不会迷失在自上世纪九十年代以来的复杂性中,或困惑于只有专家级用户才能理解的东西中。这本即将出版的第二版的“C++ 教程”涵盖了 C++17 和部分 C++20 的内容。 + +我和其他人给没有编程经验的大一新生教过 C++,只要你不去深入编程语言的每个晦涩难懂的角落,把注意力集中到 C++ 中最主流的部分,就可以在三个月内学会 C++。 + +“让简单的东西保持简单”是我长期追求的目标。比如 C++11 的 `range-for` 循环: + +``` +for (int& x : v) ++x; // increment each element of the container v +``` + +`v` 的位置可以是任何容器。在 C 和 C 风格的 C++ 中,它可能看起来是这样: + +``` +for (int i=0; i标准线程库standard thread library。它比起使用 POSIX 或直接使用 Windows 的 C API 来说更简单,并且更不易出错。 + +*Register:***您如何看待 C++ 现在的状况?** + +*Stroustrup:*C++11 中作出了许多重大改进,并且我们在 C++14 上全面完成了改进工作。C++17 添加了相当多的新特性,但是没有提供对新技术的很多支持。C++20 目前看上去可能会成为一个重大改进版。编译器的状况非常好,标准库实现得也很优秀,非常接近最新的标准。C++17 现在已经可以使用,对于工具的支持正在逐步推进。已经有了许多第三方的库和好些新工具。然而,不幸的是,这些东西不太好找到。 + +我在《想想瓦萨号!》一文中所表达的担忧与标准化过程有关,对新东西的过度热情与完美主义的组合推迟了重大改进。“追求完美往往事与愿违”。在六月份拉普斯威尔的会议上有 160 人参与;在这样一个数量庞大且多样化的人群中很难取得一致意见。专家们也本来就有只为自己设计语言的倾向,这让他们不会时常在设计时考虑整个社区的需求。 + +*Register:***C++ 是否有一个理想的状态,或者与之相反,您只是为了程序员们的期望而努力,随时适应并且努力满足程序员们的需要?** + +*Stroustrup:*二者都有。我很乐意看到 C++ 支持彻底保证类型安全type-safe资源安全resource-safe的编程方式。这不应该通过限制适用性或增加性能损耗来实现,而是应该通过改进的表达能力和更好的性能来实现。通过让程序员使用更好的(和更易用的)语言工具可以达到这个目标,我们可以做到的。 + +终极目标不会马上实现,也不会单靠语言设计来实现。为了实现这一目标,我们需要改进语言特性、提供更好的库和静态分析,并且设立提升编程效率的规则。C++ 核心准则是我为了提升 C++ 代码质量而实行的广泛而长期的计划的一部分。 + +*Register:***目前 C++ 是否面临着可以预见的风险?如果有,它是以什么形式出现的?(如,迭代过于缓慢,新兴低级语言,等等……据您的观点来看,似乎是提出的提议过多。)** + +*Stroustrup:*就是这样。今年我们已经收到了 400 篇文章。当然了,它们并不都是新提议。许多提议都与规范语言和标准库这一必需而乏味的工作相关,但是量大到难以管理。你可以在 [WG21 网站][6]上找到所有这些文章。 + +我写了《想想瓦萨号!》这封信作为一个呼吁,因为这种为了解决即刻需求(或者赶时髦)而不断增添语言特性,却对巩固语言基础(比如,改善静态类型系统static type system)不管不问的倾向让我感到震惊。增加的任何新东西,无论它多小都会产生成本,比如实现、学习、工具升级。重大的特性改变能够改变我们对编程的想法,而它们才是我们必须关注的东西。 + +委员会已经设立了一个“指导小组”,这个小组由在语言、标准库、实现、以及工程实践领域中拥有不错履历的人组成。我是其中的成员之一。我们负责为重点领域写[一些关于发展方向、设计理念和建议重点发展领域的东西][7]。 + +对于 C++20,我们建议去关注: + +* 概念 +* 模块(适度地模块化并带来编译时的显著改进) +* Ranges(包括一些无限序列的扩展) +* 标准库中的网络概念 + +在拉普斯威尔会议之后,这些都有了实现的机会,虽然模块和网络化都不是会议的重点讨论对象。我是一个乐观主义者,并且委员会的成员们都非常努力。 + +我并不担心其它语言或新语言会取代它。我喜欢编程语言。如果一门新的语言提供了独一无二的、非常有用的东西,那它就是我们的榜样,我们可以向它学习。当然,每门语言本身都有一些问题。C++ 的许多问题都与它广泛的应用领域、大量的使用人群和过度的热情有关。大多数语言的社区都会有这样的问题。 + +*Register:***关于 C++ 您是否重新考虑过任何架构方面的决策?** + +*Stroustrup:*当我着手规划新版本时,我经常反思原来的决策和设计。关于这些,可以看我的《编程的历史》论文第 [1][8]、[2][9] 部分。 + +并没有让我觉得很后悔的重大决策。如果我必须重新做一次,我觉得和以前做的不会有太大的不同。 + +与以前一样,能够直接处理硬件加上零开销的抽象是设计的指导思想。使用构造函数constructor析构函数destructor去处理资源是关键(资源获取即初始化Resource Acquisition Is Initialization,RAII);标准模板库Standard Template Library(STL) 就是解释 C++ 库能够做什么的一个很好的例子。 + +*Register:***在 2011 年被采纳的每三年发布一个新版本的节奏是否仍然有效?我之所以这样问是因为 Java 已经决定更快地迭代。** + +*Stroustrup:*我认为 C++20 将会按时发布(就像 C++14 和 C++17 那样),并且主流的编译器也会立即采用它。我也希望 C++20 基于 C++17 能有重大的改进。 + +对于其它语言如何管理它们的版本,我并不十分关心。C++ 是由一个遵循 ISO 规则的委员会来管理的,而不是由某个大公司或某种“终生的仁慈独裁者Beneficial Dictator Of Life(BDOL)”来管理。这一点不会改变。C++ 每三年发布一次的周期在 ISO 标准中是一个引人注目的创举。通常而言,周期应该是 5 或 10 年。 + +*Register:***在您的信中您写道:** + +> 我们需要一个能够被“普通程序员”使用的,条理还算清楚的编程语言。他们主要关心的是,能否按时高质量地交付他们的应用程序。 + +改进语言能够解决这个问题吗?或者,我们还需要更容易获得的工具和教育支持? + +*Stroustrup:*我尽力宣传我关于 C++ 的实质和使用方式的[理念][10],并且我鼓励其他人也和我采取相同的行动。 + +特别是,我鼓励讲师和作者们向 C++ 程序员们提出有用的建议,而不是去示范复杂的示例和技术来展示他们自己有多高明。我在 2017 年的 CppCon 大会上的演讲主题就是“学习和传授 C++”,并且也指出,我们需要更好的工具。 + +我在演讲中提到了构建技术支持和包管理器,这些历来都是 C++ 的弱项。标准化委员会现在有一个工具研究小组,或许不久的将来也会组建一个教育研究小组。 + +C++ 的社区以前是十分无组织性的,但是在过去的五年里,为了满足社区对新闻和技术支持的需要,出现了很多集会和博客。CppCon、isocpp.org、以及 Meeting++ 就是一些例子。 + +在一个庞大的委员会中做语言标准设计是很困难的。但是,对于所有的大型项目来说,委员会又是必不可少的。我很忧虑,但是关注它们并且面对问题是成功的必要条件。 + +*Register:***您如何看待 C++ 社区的流程?在沟通和决策方面你希望看到哪些变化?** + +*Stroustrup:*C++ 并没有企业管理一般的“社区流程”;它所遵循的是 ISO 标准流程。我们不能对 ISO 的条例做大的改变。理想的情况是,我们设立一个小型的、全职的“秘书处”来做最终决策和方向管理,但这种理想情况是不会出现的。相反,我们有成百上千的人在线讨论,大约有 160 人在技术问题上进行投票,大约有 70 组织和 11 个国家的人在最终提议上正式投票。这样很混乱,但是有些时候它的确能发挥作用。 + +*Register:***在最后,您认为那些即将推出的 C++ 特性中,对 C++ 用户最有帮助的是哪些?** + +*Stroustrup:* + +* 那些能让编程显著变简单的概念。 +* 并行算法Parallel algorithms —— 如果要使用现代硬件的并发特性的话,这方法再简单不过了。 +* 协程Coroutines,如果委员会能够确定在 C++20 上推出。 +* 改进了组织源代码方式的,并且大幅改善了编译时间的模块。我希望能有这样的模块,但是还没办法确定我们能不能在 C++20 上推出。 +* 一个标准的网络库,但是还没办法确定我们能否在 C++20 上推出。 + +此外: + +* Contracts(运行时检查的先决条件、后置条件、和断言)可能对许多人都非常重要。 +* date 和 time-zone 支持库可能对许多人(行业)非常重要。 + +*Register:***您还有想对读者们说的话吗?** + +*Stroustrup:*如果 C++ 标准化委员会能够专注于重大问题,去解决重大问题,那么 C++20 将会非常优秀。但是在 C++20 推出之前,我们还有 C++17;无论如何,它仍然远超许多人对 C++ 的旧印象。® + +-------------------------------------------------------------------------------- + +via: https://www.theregister.co.uk/2018/06/18/bjarne_stroustrup_c_plus_plus/ + +作者:[Thomas Claburn][a] +选题:[lujun9972](https://github.com/lujun9972) +译者:[qhwdw](https://github.com/qhwdw) +校对:[thecyanbird](https://github.com/thecyanbird)、[Northurland](https://github.com/Northurland)、[pityonline](https://github.com/pityonline) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: http://www.theregister.co.uk/Author/3190 +[1]: http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0977r0.pdf +[2]: https://www.vasamuseet.se/en/vasa-history/disaster +[3]: http://open-std.org/JTC1/SC22/WG21/ +[4]: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md +[5]: https://go.theregister.co.uk/tl/1755/shttps://continuouslifecycle.london/ +[6]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ +[7]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0939r0.pdf +[8]: http://www.stroustrup.com/hopl-almost-final.pdf +[9]: http://www.stroustrup.com/hopl2.pdf +[10]: http://www.stroustrup.com/papers.html diff --git a/translated/tech/20180716 How To Find The Mounted Filesystem Type In Linux.md b/published/20180716 How To Find The Mounted Filesystem Type In Linux.md similarity index 71% rename from translated/tech/20180716 How To Find The Mounted Filesystem Type In Linux.md rename to published/20180716 How To Find The Mounted Filesystem Type In Linux.md index 481a48ea3b..8fe6b67701 100644 --- a/translated/tech/20180716 How To Find The Mounted Filesystem Type In Linux.md +++ b/published/20180716 How To Find The Mounted Filesystem Type In Linux.md @@ -3,17 +3,18 @@ ![](https://www.ostechnix.com/wp-content/uploads/2018/07/filesystem-720x340.png) -如你所知,Linux 支持非常多的文件系统,例如 Ext4、ext3、ext2、sysfs、securityfs、FAT16、FAT32、NTFS 等等,当前被使用最多的文件系统是 Ext4。你曾经疑惑过你的 Linux 系统使用的是什么类型的文件系统吗?没有疑惑过?不用担心!我们将帮助你。本指南将解释如何在类 Unix 的操作系统中查看已挂载的文件系统类型。 +如你所知,Linux 支持非常多的文件系统,例如 ext4、ext3、ext2、sysfs、securityfs、FAT16、FAT32、NTFS 等等,当前被使用最多的文件系统是 ext4。你曾经疑惑过你的 Linux 系统使用的是什么类型的文件系统吗?没有疑惑过?不用担心!我们将帮助你。本指南将解释如何在类 Unix 的操作系统中查看已挂载的文件系统类型。 ### 在 Linux 中查看已挂载的文件系统类型 有很多种方法可以在 Linux 中查看已挂载的文件系统类型,下面我将给出 8 种不同的方法。那现在就让我们开始吧! -#### 方法 1 – 使用 `findmnt` 命令 +#### 方法 1 – 使用 findmnt 命令 -这是查出文件系统类型最常使用的方法。**findmnt** 命令将列出所有已挂载的文件系统或者搜索出某个文件系统。`findmnt` 命令能够在 `/etc/fstab`、`/etc/mtab` 或 `/proc/self/mountinfo` 这几个文件中进行搜索。 +这是查出文件系统类型最常使用的方法。`findmnt` 命令将列出所有已挂载的文件系统或者搜索出某个文件系统。`findmnt` 命令能够在 `/etc/fstab`、`/etc/mtab` 或 `/proc/self/mountinfo` 这几个文件中进行搜索。 + +`findmnt` 预装在大多数的 Linux 发行版中,因为它是 `util-linux` 包的一部分。如果 `findmnt` 命令不可用,你可以安装这个软件包。例如,你可以使用下面的命令在基于 Debian 的系统中安装 `util-linux` 包: -`findmnt` 预装在大多数的 Linux 发行版中,因为它是 **util-linux** 包的一部分。为了防止 `findmnt` 命令不可用,你可以安装这个软件包。例如,你可以使用下面的命令在基于 Debian 的系统中安装 **util-linux** 包: ``` $ sudo apt install util-linux ``` @@ -21,24 +22,27 @@ $ sudo apt install util-linux 下面让我们继续看看如何使用 `findmnt` 来找出已挂载的文件系统。 假如你只敲 `findmnt` 命令而不带任何的参数或选项,它将像下面展示的那样以树状图形式列举出所有已挂载的文件系统。 + ``` $ findmnt ``` -**示例输出:** +示例输出: ![][2] -正如你看到的那样,`findmnt` 展示出了目标挂载点(TARGET)、源设备(SOURCE)、文件系统类型(FSTYPE)以及相关的挂载选项(OPTIONS),例如文件系统是否是可读可写或者只读的。以我的系统为例,我的根(`/`)文件系统的类型是 EXT4 。 +正如你看到的那样,`findmnt` 展示出了目标挂载点(`TARGET`)、源设备(`SOURCE`)、文件系统类型(`FSTYPE`)以及相关的挂载选项(`OPTIONS`),例如文件系统是否是可读可写或者只读的。以我的系统为例,我的根(`/`)文件系统的类型是 EXT4 。 + +假如你不想以树状图的形式来展示输出,可以使用 `-l` 选项来以简单平凡的形式来展示输出: -假如你不想以树状图的形式来展示输出,可以使用 **-l** 选项来以简单平凡的形式来展示输出: ``` $ findmnt -l ``` ![][3] -你还可以使用 **-t** 选项来列举出特定类型的文件系统,例如下面展示的 **ext4** 文件系统类型: +你还可以使用 `-t` 选项来列举出特定类型的文件系统,例如下面展示的 `ext4` 文件系统类型: + ``` $ findmnt -t ext4 TARGET SOURCE FSTYPE OPTIONS @@ -47,15 +51,18 @@ TARGET SOURCE FSTYPE OPTIONS ``` `findmnt` 还可以生成 `df` 类型的输出,使用命令 + ``` $ findmnt --df ``` + 或 + ``` $ findmnt -D ``` -**示例输出:** +示例输出: ``` SOURCE FSTYPE SIZE USED AVAIL USE% TARGET @@ -75,6 +82,7 @@ gvfsd-fuse fuse.gvfsd-fuse 0 0 0 - /run/user/1000/gvfs 你还可以展示某个特定设备或者挂载点的文件系统类型。 查看某个特定的设备: + ``` $ findmnt /dev/sda1 TARGET SOURCE FSTYPE OPTIONS @@ -82,6 +90,7 @@ TARGET SOURCE FSTYPE OPTIONS ``` 查看某个特定的挂载点: + ``` $ findmnt / TARGET SOURCE FSTYPE OPTIONS @@ -89,34 +98,38 @@ TARGET SOURCE FSTYPE OPTIONS ``` 你甚至还可以查看某个特定标签的文件系统的类型: + ``` $ findmnt LABEL=Storage ``` 更多详情,请参考其 man 手册。 + ``` $ man findmnt ``` -`findmnt` 命令已足够完成在 Linux 中查看已挂载文件系统类型的任务,这个命令就是为了这个特定任务而生的。然而,还存在其他方法来查看文件系统的类型,假如你感兴趣的话,请接着让下看。 +`findmnt` 命令已足够完成在 Linux 中查看已挂载文件系统类型的任务,这个命令就是为了这个特定任务而生的。然而,还存在其他方法来查看文件系统的类型,假如你感兴趣的话,请接着往下看。 -#### 方法 2 – 使用 `blkid` 命令 +#### 方法 2 – 使用 blkid 命令 -**blkid** 命令被用来查找和打印块设备的属性。它也是 **util-linux** 包的一部分,所以你不必再安装它。 +`blkid` 命令被用来查找和打印块设备的属性。它也是 `util-linux` 包的一部分,所以你不必再安装它。 为了使用 `blkid` 命令来查看某个文件系统的类型,可以运行: + ``` $ blkid /dev/sda1 ``` -#### 方法 3 – 使用 `df` 命令 +#### 方法 3 – 使用 df 命令 + +在类 Unix 的操作系统中,`df` 命令被用来报告文件系统的磁盘空间使用情况。为了查看所有已挂载文件系统的类型,只需要运行: -在类 Unix 的操作系统中, **df** 命令被用来报告文件系统的磁盘空间使用情况。为了查看所有已挂载文件系统的类型,只需要运行: ``` $ df -T ``` -**示例输出:** +示例输出: ![][4] @@ -125,15 +138,17 @@ $ df -T - [针对新手的 df 命令教程](https://www.ostechnix.com/the-df-command-tutorial-with-examples-for-beginners/) 同样也可以参考其 man 手册: + ``` $ man df ``` -#### 方法 4 – 使用 `file` 命令 +#### 方法 4 – 使用 file 命令 -**file** 命令可以判读出某个特定文件的类型,即便该文件没有文件后缀名也同样适用。 +`file` 命令可以判读出某个特定文件的类型,即便该文件没有文件后缀名也同样适用。 运行下面的命令来找出某个特定分区的文件系统类型: + ``` $ sudo file -sL /dev/sda1 [sudo] password for sk: @@ -141,13 +156,14 @@ $ sudo file -sL /dev/sda1 ``` 查看其 man 手册可以知晓更多细节: + ``` $ man file ``` -#### 方法 5 – 使用 `fsck` 命令 +#### 方法 5 – 使用 fsck 命令 -**fsck** 命令被用来检查某个文件系统是否健全或者修复它。你可以像下面那样通过将分区名字作为 `fsck` 的参数来查看该分区的文件系统类型: +`fsck` 命令被用来检查某个文件系统是否健全或者修复它。你可以像下面那样通过将分区名字作为 `fsck` 的参数来查看该分区的文件系统类型: ``` $ fsck -N /dev/sda1 @@ -156,15 +172,17 @@ fsck from util-linux 2.32 ``` 如果想知道更多的内容,请查看其 man 手册: + ``` $ man fsck ``` -#### 方法 6 – 使用 `fstab` 命令 +#### 方法 6 – 使用 fstab 命令 -**fstab** 是一个包含文件系统静态信息的文件。这个文件通常包含了挂载点、文件系统类型和挂载选项等信息。 +`fstab` 是一个包含文件系统静态信息的文件。这个文件通常包含了挂载点、文件系统类型和挂载选项等信息。 要查看某个文件系统的类型,只需要运行: + ``` $ cat /etc/fstab ``` @@ -172,15 +190,17 @@ $ cat /etc/fstab ![][5] 更多详情,请查看其 man 手册: + ``` $ man fstab ``` -#### 方法 7 – 使用 `lsblk` 命令 +#### 方法 7 – 使用 lsblk 命令 -**lsblk** 命令可以展示设备的信息。 +`lsblk` 命令可以展示设备的信息。 要展示已挂载文件系统的信息,只需运行: + ``` $ lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT @@ -193,15 +213,17 @@ sr0 ``` 更多细节,可以参考它的 man 手册: + ``` $ man lsblk ``` -#### 方法 8 – 使用 `mount` 命令 +#### 方法 8 – 使用 mount 命令 -**mount** 被用来在类 Unix 系统中挂载本地或远程的文件系统。 +`mount` 被用来在类 Unix 系统中挂载本地或远程的文件系统。 要使用 `mount` 命令查看文件系统的类型,可以像下面这样做: + ``` $ mount | grep "^/dev" /dev/sda2 on / type ext4 (rw,relatime,commit=360) @@ -209,6 +231,7 @@ $ mount | grep "^/dev" ``` 更多详情,请参考其 man 手册的内容: + ``` $ man mount ``` @@ -224,7 +247,7 @@ via: https://www.ostechnix.com/how-to-find-the-mounted-filesystem-type-in-linux/ 作者:[SK][a] 选题:[lujun9972](https://github.com/lujun9972) 译者:[FSSlc](https://github.com/FSSlc) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md b/published/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md similarity index 58% rename from translated/tech/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md rename to published/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md index 48a556d29a..4dcf41a0ab 100644 --- a/translated/tech/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md +++ b/published/20180820 How To Disable Ads In Terminal Welcome Message In Ubuntu Server.md @@ -1,34 +1,32 @@ -如何在 Ubuntu 服务器中禁用终端欢迎消息中的广告 +如何禁用 Ubuntu 服务器中终端欢迎消息中的广告 ====== 如果你正在使用最新的 Ubuntu 服务器版本,你可能已经注意到欢迎消息中有一些与 Ubuntu 服务器平台无关的促销链接。你可能已经知道 **MOTD**,即 **M**essage **O**f **T**he **D**ay 的开头首字母,在 Linux 系统每次登录时都会显示欢迎信息。通常,欢迎消息包含操作系统版本,基本系统信息,官方文档链接以及有关最新安全更新等的链接。这些是我们每次通过 SSH 或本地登录时通常会看到的内容。但是,最近在终端欢迎消息中出现了一些其他链接。我已经几次注意到这些链接,但我并在意,也从未点击过。以下是我的 Ubuntu 18.04 LTS 服务器上显示的终端欢迎消息。 ![](http://www.ostechnix.com/wp-content/uploads/2018/08/Ubuntu-Terminal-welcome-message.png) -正如你在上面截图中所看到的,欢迎消息中有一个 bit.ly 链接和 Ubuntu wiki 链接。有些人可能会惊讶并想知道这是什么。其实欢迎信息中的链接无需担心。它可能看起来像广告,但并不是商业广告。链接实际上指的是 [**Ubuntu 官方博客**][1] 和 [**Ubuntu wiki**][2]。正如我之前所说,其中的一个链接是不相关的,没有任何与 Ubuntu 服务器相关的细节,这就是为什么我开头称它们为广告。 -(to 校正:这里是其中一个链接不相关还是两个链接都不相关) +正如你在上面截图中所看到的,欢迎消息中有一个 bit.ly 链接和 Ubuntu wiki 链接。有些人可能会惊讶并想知道这是什么。其实欢迎信息中的链接无需担心。它可能看起来像广告,但并不是商业广告。链接实际上指向到了 [Ubuntu 官方博客][1] 和 [Ubuntu wiki][2]。正如我之前所说,其中的一个链接是不相关的,没有任何与 Ubuntu 服务器相关的细节,这就是为什么我开头称它们为广告。 -虽然我们大多数人都不会访问 bit.ly 链接,但是有些人可能出于好奇去访问这些链接,结果失望地发现它只是指向一个外部链接。你可以使用任何 URL 短网址服务,例如 unshorten.it,在访问真正链接之前,查看它会指向哪里。或者,你只需在 bit.ly 链接的末尾输入加号(**+**)即可查看它们的实际位置以及有关链接的一些统计信息。 +虽然我们大多数人都不会访问 bit.ly 链接,但是有些人可能出于好奇去访问这些链接,结果失望地发现它只是指向一个外部链接。你可以使用任何 URL 去短网址服务,例如 unshorten.it,在访问真正链接之前,查看它会指向哪里。或者,你只需在 bit.ly 链接的末尾输入加号(`+`)即可查看它们的实际位置以及有关链接的一些统计信息。 ![](http://www.ostechnix.com/wp-content/uploads/2018/08/shortlink.png) ### 什么是 MOTD 以及它是如何工作的? -2009 年,来自 Canonical 的 **Dustin Kirkland** 在 Ubuntu 中引入了 MOTD 的概念。它是一个灵活的框架,使管理员或发行包能够在 /etc/update-motd.d/* 位置添加可执行脚本,目的是生成在登录时显示有益的,有趣的消息。它最初是为 Landscape(Canonical 的商业服务)实现的,但是其它发行版维护者发现它很有用,并且在他们自己的发行版中也采用了这个特性。 +2009 年,来自 Canonical 的 Dustin Kirkland 在 Ubuntu 中引入了 MOTD 的概念。它是一个灵活的框架,使管理员或发行包能够在 `/etc/update-motd.d/` 位置添加可执行脚本,目的是生成在登录时显示有益的、有趣的消息。它最初是为 Landscape(Canonical 的商业服务)实现的,但是其它发行版维护者发现它很有用,并且在他们自己的发行版中也采用了这个特性。 -如果你在 Ubuntu 系统中查看 **/etc/update-motd.d/**,你会看到一组脚本。一个是打印通用的 “ Welcome” 横幅。下一个打印 3 个链接,显示在哪里可以找到操作系统的帮助。另一个计算并显示本地系统包可以更新的数量。另一个脚本告诉你是否需要重新启动等等。 +如果你在 Ubuntu 系统中查看 `/etc/update-motd.d/`,你会看到一组脚本。一个是打印通用的 “欢迎” 横幅。下一个打印 3 个链接,显示在哪里可以找到操作系统的帮助。另一个计算并显示本地系统包可以更新的数量。另一个脚本告诉你是否需要重新启动等等。 -从 Ubuntu 17.04 起,开发人员添加了 **/etc/update-motd.d/50-motd-news**,这是一个脚本用来在欢迎消息中包含一些附加信息。这些附加信息是: - - 1. 重要的关键信息,例如 ShellShock, Heartbleed 等 +从 Ubuntu 17.04 起,开发人员添加了 `/etc/update-motd.d/50-motd-news`,这是一个脚本用来在欢迎消息中包含一些附加信息。这些附加信息是: + 1. 重要的关键信息,例如 ShellShock、Heartbleed 等 2. 生命周期(EOL)消息,新功能可用性等 - 3. 在 Ubuntu 官方博客和其他有关 Ubuntu 的新闻中发布的一些有趣且有益的帖子 -另一个特点是异步,启动后约 60 秒,systemd 计时器运行 “/etc/update-motd.d/50-motd-news –force” 脚本。它提供了 /etc/default/motd-news 脚本中定义的 3 个配置变量。默认值为:ENABLED=1, URLS=”, WAIT=”5″。 +另一个特点是异步,启动后约 60 秒,systemd 计时器运行 `/etc/update-motd.d/50-motd-news –force` 脚本。它提供了 `/etc/default/motd-news` 脚本中定义的 3 个配置变量。默认值为:`ENABLED=1, URLS="https://motd.ubuntu.com", WAIT="5"`。 + +以下是 `/etc/default/motd-news` 文件的内容: -以下是 /etc/default/motd-news 文件的内容: ``` $ cat /etc/default/motd-news # Enable/disable the dynamic MOTD news service @@ -50,20 +48,20 @@ URLS="https://motd.ubuntu.com" # Note that news messages are fetched in the background by # a systemd timer, so this should never block boot or login WAIT=5 - ``` -好事情是 MOTD 是完全可定制的,所以你可以彻底禁用它(ENABLED=0),根据你的意愿更改或添加脚本,并以秒为单位更改等待时间。 +好事情是 MOTD 是完全可定制的,所以你可以彻底禁用它(`ENABLED=0`)、根据你的意愿更改或添加脚本、以秒为单位更改等待时间等等。 -如果启用了 MOTD,那么 systemd 计时器作业将循环遍历每个 URL,将它们缩减到每行 80 个字符,最多 10 行,并将它们连接(to 校正:也可能是链接?)到 /var/cache/motd-news 中的缓存文件。此 systemd 计时器作业将每隔 12 小时运行并更新 /var/cache/motd-news。用户登录后,/var/cache/motd-news 的内容会打印到屏幕上。这就是 MOTD 的工作原理。 +如果启用了 MOTD,那么 systemd 计时器作业将循环遍历每个 URL,将它们的内容缩减到每行 80 个字符、最多 10 行,并将它们连接到 `/var/cache/motd-news` 中的缓存文件。此 systemd 计时器作业将每隔 12 小时运行并更新 `/var/cache/motd-news`。用户登录后,`/var/cache/motd-news` 的内容会打印到屏幕上。这就是 MOTD 的工作原理。 + +此外,`/etc/update-motd.d/50-motd-news` 文件中包含自定义的用户代理字符串,以报告有关计算机的信息。如果你查看 `/etc/update-motd.d/50-motd-news` 文件,你会看到: -此外,**/etc/update-motd.d/50-motd-news** 文件中包含自定义用户代理字符串,以报告有关计算机的信息。如果你查看 **/etc/update-motd.d/50-motd-news** 文件,你会看到 ``` # Piece together the user agent USER_AGENT="curl/$curl_ver $lsb $platform $cpu $uptime" ``` -这意味着,MOTD 检索器将向 Canonical 报告你的**操作系统版本**,**硬件平台**,**CPU 类型**和**正常运行时间**。 +这意味着,MOTD 检索器将向 Canonical 报告你的操作系统版本、硬件平台、CPU 类型和正常运行时间。 到这里,希望你对 MOTD 有了一个基本的了解。 @@ -72,11 +70,13 @@ USER_AGENT="curl/$curl_ver $lsb $platform $cpu $uptime" ### 在 Ubuntu 服务器中禁用终端欢迎消息中的广告 要禁用这些广告,编辑文件: + ``` $ sudo vi /etc/default/motd-news ``` -找到以下行并将其值设置为 0(零)。 +找到以下行并将其值设置为 `0`(零)。 + ``` [...] ENABLED=0 @@ -101,7 +101,7 @@ via: https://www.ostechnix.com/how-to-disable-ads-in-terminal-welcome-message-in 作者:[SK][a] 选题:[lujun9972](https://github.com/lujun9972) 译者:[MjSeven](https://github.com/MjSeven) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/talk/20181008 3 areas to drive DevOps change.md b/published/20181008 3 areas to drive DevOps change.md similarity index 53% rename from translated/talk/20181008 3 areas to drive DevOps change.md rename to published/20181008 3 areas to drive DevOps change.md index 2edb255af5..2efd0fc6c5 100644 --- a/translated/talk/20181008 3 areas to drive DevOps change.md +++ b/published/20181008 3 areas to drive DevOps change.md @@ -1,12 +1,13 @@ 推动 DevOps 变革的三个方面 ====== -推动大规模的组织变革是一个痛苦的过程。对于 DevOps 来说,尽管也有阵痛,但变革带来的价值则相当可观。 + +> 推动大规模的组织变革是一个痛苦的过程。对于 DevOps 来说,尽管也有阵痛,但变革带来的价值则相当可观。 ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/diversity-inclusion-transformation-change_20180927.png?itok=2E-g10hJ) 避免痛苦是一种强大的动力。一些研究表明,[植物也会通过遭受疼痛的过程][1]以采取措施来保护自己。我们人类有时也会刻意让自己受苦——在剧烈运动之后,身体可能会发生酸痛,但我们仍然坚持运动。那是因为当人认为整个过程利大于弊时,几乎可以忍受任何事情。 -推动大规模的组织变革得过程确实是痛苦的。有人可能会因难以改变价值观和行为而感到痛苦,有人可能会因难以带领团队而感到痛苦,也有人可能会因难以开展工作而感到痛苦。但就 DevOps 而言,我可以说这些痛苦都是值得的。 +推动大规模的组织变革的过程确实是痛苦的。有人可能会因难以改变价值观和行为而感到痛苦,有人可能会因难以带领团队而感到痛苦,也有人可能会因难以开展工作而感到痛苦。但就 DevOps 而言,我可以说这些痛苦都是值得的。 我也曾经关注过一个团队耗费大量时间优化技术流程的过程,在这个过程中,团队逐渐将流程进行自动化改造,并最终获得了成功。 @@ -14,60 +15,64 @@ 图片来源:Lee Eason. CC BY-SA 4.0 -这张图表充分表明了变革的价值。一家公司在我主导实行了 DevOps 转型之后,60 多个团队每月提交了超过 900 个发布请求。这些工作量的原耗时高达每个月 350 天,而这么多的工作量对于任何公司来说都是不可忽视的。除此以外,他们每月的部署次数从 100 次增加到了 9000 次,高危 bug 减少了 24%,工程师们更轻松了,净推荐值Net Promoter Score(NPS)也提高了,而 NPS 提高反过来也让团队的 DevOps 转型更加顺利。正如 [Puppet 发布的 DevOps 报告][4]所预测的,用在技术流程改进上的投资可以在业务成果上明显地体现出来。 +这张图表充分表明了变革的价值。一家公司在我主导实行了 DevOps 转型之后,60 多个团队每月提交了超过 900 个发布请求。这些工作量的原耗时高达每个月 350 人/天,而这么多的工作量对于任何公司来说都是不可忽视的。除此以外,他们每月的部署次数从 100 次增加到了 9000 次,高危 bug 减少了 24%,工程师们更轻松了,净推荐值Net Promoter Score(NPS)也提高了,而 NPS 提高反过来也让团队的 DevOps 转型更加顺利。正如 [Puppet 发布的 DevOps 报告][4]所预测的,用在技术流程改进上的投入可以在业务成果上明显地体现出来。 -而 DevOps 主导者在推动变革是必须关注这三个方面:团队管理,团队文化和团队活力。 +而 DevOps 主导者在推动变革时必须关注这三个方面:团队管理,团队文化和团队活力。 ### 团队管理 +最重要的是,改进对技术流程的投入可以转化为更好的业务成果。 + 组织架构越大,业务领导与一线员工之间的距离就会越大,当然发生误解的可能性也会越大。而且各种技术工具和实际应用都在以日新月异的速度变化,这就导致业务领导几乎不可能对 DevOps 或敏捷开发的转型方向有一个亲身的了解。 DevOps 主导者必须和管理层密切合作,在进行决策的时候给出相关的意见,以帮助他们做出正确的决策。 -公司的管理层只是知道 DevOps 会对产品部署的方式进行改进,而并不了解其中的具体过程。当管理层发现你在和软件团队执行自动化部署失败时,就会想要了解这件事情的细节。如果管理层了解到进行部署的是软件团队而不是专门的发布管理团队,就可能会坚持使用传统的变更流程来保证业务的正常运作。你可能会失去团队的信任,团队也可能不愿意作出进一步的改变。 +公司的管理层只是知道 DevOps 会对产品部署的方式进行改进,而并不了解其中的具体过程。假设你正在帮助一个软件开发团队实现自动化部署,当管理层得知某次部署失败时(这种情况是有的),就会想要了解这件事情的细节。如果管理层了解到进行部署的是软件团队而不是专门的发布管理团队,就可能会坚持使用传统的变更流程来保证业务的正常运作。你可能会失去团队的信任,团队也可能不愿意做出进一步的改变。 -如果没有和管理层做好心理上的预期,一旦发生意外的生产事件,都会对你和管理层之间的信任造成难以消除的影响。所以,最好事先和管理层之间在各方面协调好,这会让你在后续的工作中避免很多麻烦。 +如果没有和管理层做好心理上的预期,一旦发生意外的生产事件,重建管理层的信任并得到他们的支持比事先对他们进行教育需要更长的时间。所以,最好事先和管理层在各方面协调好,这会让你在后续的工作中避免很多麻烦。 对于和管理层之间的协调,这里有两条建议: - * 一是**重视所有规章制度**。如果管理层对合同、安全等各方面有任何疑问,你都可以向法务或安全负责人咨询,这样做可以避免犯下后果严重的错误。 - * 二是**将管理层的重点关注的方面输出为量化指标**。举个例子,如果公司的目标是减少客户流失,而你调查得出计划外的停机是造成客户流失的主要原因,那么就可以让团队对故障的平均检测时间Mean Time To Detection(MTTD)和平均解决时间Mean Time To Resolution(MTTR)实行重点优化。你可以使用这些关键指标来量化团队的工作成果,而管理层对此也可以有一个直观的了解。 - - +* 一是**重视所有规章制度**。如果管理层对合同、安全等各方面有任何疑问,你都可以向法务或安全负责人咨询,这样做可以避免犯下后果严重的错误。 +* 二是**将管理层重点关注的方面输出为量化指标**。举个例子,如果公司的目标是减少客户流失,而你调查得出计划外的服务宕机是造成客户流失的主要原因,那么就可以让团队对故障的平均排查时间Mean Time To Detection(MTTD)和平均解决时间Mean Time To Resolution(MTTR)实行重点优化。你可以使用这些关键指标来量化团队的工作成果,而管理层对此也可以有一个直观的了解。 ### 团队文化 DevOps 是一种专注于持续改进代码、构建、部署和操作流程的文化,而团队文化代表了团队的价值观和行为。从本质上说,团队文化是要塑造团队成员的行为方式,而这并不是一件容易的事。 -我推荐一本叫做《[披着狼皮的 CIO][5]》的书。另外,研究心理学、阅读《[Drive][6]》、观看 Daniel Pink 的 [TED 演讲][7]、阅读《[千面英雄][7]》、了解每个人的心路历程,以上这些都是你推动公司技术变革所应该尝试去做的事情。 +我推荐一本叫做《[披着狼皮的 CIO][5]》的书。另外,研究心理学、阅读《[Drive][6]》、观看 Daniel Pink 的 [TED 演讲][7]、阅读《[千面英雄][7]》、了解每个人的心路历程,以上这些都是你推动公司技术变革所应该尝试去做的事情。如果这些你都没兴趣,说明你不是那个推动公司变革的人。如果你想成为那个人,那就开始学习吧! -理性的人大多都按照自己的价值观工作,然而团队通常没有让每个人都能达成共识的明确价值观。因此,你需要明确团队目前的价值观,包括价值观的形成过程和价值观的目标导向。也不能将这些价值观强加到团队成员身上,只需要让团队成员在目前的硬件条件下力所能及地做到最好就可以了 +从本质上说,改变一个人真不是件容易的事。 -同时需要向团队成员阐明,公司正在发生组织上的变化,团队的价值观也随之改变,最好也厘清整个过程中将会作出什么变化。例如,公司以往或许是由于资金有限,一直将节约成本的原则放在首位,在研发新产品的时候,基础架构团队不得不通过共享数据库集群或服务器,从而导致了服务之间的紧密耦合。然而随着时间的推移,这种做法会产生难以维护的混乱,即使是一个小小的变化也可能造成无法预料的后果。这就导致交付团队难以执行变更控制流程,进而令变更停滞不前。 +理性的人大多都按照自己的价值观工作,然而团队通常没有让每个人都能达成共识的明确价值观。因此,你需要明确团队目前的价值观,包括价值观的形成过程和价值观的目标导向。但不能将这些价值观强加到团队成员身上,只需要让团队成员在现有条件下力所能及地做到最好就可以了。 -如果这种状况持续多年,最终的结果将会是毫无创新、技术老旧、问题繁多以及产品品质低下,公司的发展到达了瓶颈,原本的价值观已经不再适用。所以,工作效率的优先级必须高于节约成本。 +同时需要向团队成员阐明,公司正在发生组织和团队目标的变化,团队的价值观也随之改变,最好也厘清整个过程中将会作出什么变化。例如,公司以往或许是由于资金有限,一直将节约成本的原则放在首位,在研发新产品的时候,基础架构团队不得不共享数据库集群或服务器,从而导致了服务之间的紧密耦合。然而随着时间的推移,这种做法会产生难以维护的混乱,即使是一个小小的变化也可能造成无法预料的后果。这就导致交付团队难以执行变更控制流程,进而令变更停滞不前。 -你必须强调团队的价值观。每当团队按照价值观取得了一定的工作进展,都应该对团队作出激励。在团队部署出现失败时,鼓励他们承担风险、继续学习,同时指导团队如何改进他们的工作并表示支持。长此下来,团队成员就会对你产生信任,并逐渐切合团队的价值观。 +如果这种状况持续几年,最终的结果将会是毫无创新、技术老旧、问题繁多以及产品品质低下,公司的发展到达了瓶颈,原本的价值观已经不再适用。所以,工作效率的优先级必须高于节约成本。如果一个选择能让团队运作更好,另一个选择只是短期来看成本便宜,那你应该选择前者。 + +你必须反复强调团队的价值观。每当团队取得了一定的工作进展(即使探索创新时出现一些小的失误),都应该对团队作出激励。在团队部署出现失败时,鼓励他们承担风险、吸取教训,同时指导团队如何改进他们的工作并表示支持。长此下来,团队成员就会对你产生信任,不再顾虑为切合团队的价值观而做出改变。 ### 团队活力 -你有没有在会议上听过类似这样的话?“在张三度假回来之前,我们无法对这件事情做出评估。他是唯一一个了解代码的人”,或者是“我们完成不了这项任务,它在网络上需要跨团队合作,而防火墙管理员刚好请病假了”,又或者是“张三最清楚这个系统最好,他说是怎么样,通常就是怎么样”。那么如果团队在处理工作时,谁才是主力?就是张三。而且也一直会是他。 +你有没有在会议上听过类似这样的话?“在张三度假回来之前,我们无法对这件事情做出评估。他是唯一一个了解代码的人”,或者是“我们完成不了这项任务,它在网络上需要跨团队合作,而防火墙管理员刚好请病假了”,又或者是“张三最清楚这个系统,他说是怎么样,通常就是怎么样”。那么如果团队在处理工作时,谁才是主力?就是张三。而且也一直会是他。 -我们一直都认为这就是软件开发的本质。但是如果我们不作出改变,这种循环就会一直保持下去。 +我们一直都认为这就是软件开发的自带属性。但是如果我们不作出改变,这种循环就会一直持续下去。 -熵的存在会让团队自发地变得混乱和缺乏活力,团队的成员和主导者的都有责任控制这个熵并保持团队的活力。DevOps、敏捷开发、上云、代码重构这些行为都会令熵增加速,这是因为转型让团队需要学习更多新技能和专业知识以开展新工作。 +熵的存在会让团队自发地变得混乱和缺乏活力,团队的成员和主导者的都有责任控制这个熵并保持团队的活力。DevOps、敏捷开发、上云、代码重构这些行为都会令熵加速增长,这是因为转型让团队需要学习更多新技能和专业知识以开展新工作。 -我们来看一个产品团队重构遗留代码的例子。像往常一样,他们在 AWS 上构建新的服务。而传统的系统则在数据中心部署,并由 IT 部门进行监控和备份。IT 部门会确保在基础架构的层面上满足应用的安全需求、进行灾难恢复测试、系统补丁、安装配置了入侵检测和防病毒代理,而且 IT 部门还保留了年度审计流程所需的变更控制记录。 +我们来看一个产品团队重构历史代码的例子。像往常一样,他们在 AWS 上构建新的服务。而传统的系统则在数据中心部署,并由 IT 部门进行监控和备份。IT 部门会确保在基础架构的层面上满足应用的安全需求、进行灾难恢复测试、系统补丁、安装配置了入侵检测和防病毒代理,而且 IT 部门还保留了年度审计流程所需的变更控制记录。 -产品团队经常会犯一个致命的错误,就是认为 IT 部门是需要突破的瓶颈。他们希望脱离已有的 IT 部门并使用公有云,但实际上是他们忽视了 IT 部门提供的关键服务。迁移到云上只是以不同的方式实现这些关键服务,因为 AWS 也是一个数据中心,团队即使使用 AWS 也需要完成 IT 运维任务。 +产品团队经常会犯一个致命的错误,就是认为 IT 是消耗资源的部门,是需要突破的瓶颈。他们希望脱离已有的 IT 部门并使用公有云,但实际上是他们忽视了 IT 部门提供的关键服务。迁移到云上只是以不同的方式实现这些关键服务,因为 AWS 也是一个数据中心,团队即使使用 AWS 也需要完成 IT 运维任务。 -实际上,产品团队在迁移到云时候也必须学习如何使用这些 IT 服务。因此,当产品团队开始重构遗留的代码并部署到云上时,也需要学习大量的技能才能正常运作。这些技能不会无师自通,必须自行学习或者聘用相关的人员,团队的主导者也必须积极进行管理。 +实际上,产品团队在向云迁移的时候也必须学习如何使用这些 IT 服务。因此,当产品团队开始重构历史代码并部署到云上时,也需要学习大量的技能才能正常运作。这些技能不会无师自通,必须自行学习或者聘用相关的人员,团队的主导者也必须积极进行管理。 -在带领团队时,我找不到任何适合我的工具,因此我建立了 [Tekita.io][9] 这个项目。Tekata 免费而且容易使用。但相比起来,把注意力集中在人员和流程上更为重要,你需要不断学习,持续关注团队的弱项,因为它们会影响团队的交付能力,而修补这些弱项往往需要学习大量的新知识,这就需要团队成员之间有一个很好的协作。因此 76% 的年轻人都认为个人发展机会是公司文化[最重要的的一环][10]。 +在带领团队时,我找不到任何适合我的工具,因此我建立了 [Tekita.io][9] 这个项目。Tekata 免费而且容易使用。但相比起来,把注意力集中在人员和流程上更为重要,你需要不断学习,持续关注团队的短板,因为它们会影响团队的交付能力,而弥补这些短板往往需要学习大量的新知识,这就需要团队成员之间有一个很好的协作。因此 76% 的年轻人都认为个人发展机会是公司文化[最重要的的一环][10]。 ### 效果就是最好的证明 -DevOps 转型会改变团队的工作方式和文化,这需要得到管理层的支持和理解。同时,工作方式的改变意味着新技术的引入,所以在管理上也必须谨慎。但转型的最终结果是团队变得更高效、成员变得更积极、产品变得更优质,客户也变得更快乐。 +DevOps 转型会改变团队的工作方式和文化,这需要得到管理层的支持和理解。同时,工作方式的改变意味着新技术的引入,所以在管理上也必须谨慎。但转型的最终结果是团队变得更高效、成员变得更积极、产品变得更优质,客户也变得更满意。 + +Lee Eason 将于 10 月 21-23 日在北卡罗来纳州 Raleigh 举行的 [All Things Open][12] 上讲述 [DevOps 转型的故事][11]。 免责声明:本文中的内容仅为 Lee Eason 的个人立场,不代表 Ipreo 或 IHS Markit。 @@ -78,7 +83,7 @@ via: https://opensource.com/article/18/10/tales-devops-transformation 作者:[Lee Eason][a] 选题:[lujun9972][b] 译者:[HankChow](https://github.com/HankChow) -校对:[校对者ID](https://github.com/校对者ID) +校对:[pityonline](https://github.com/pityonline) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -96,4 +101,3 @@ via: https://opensource.com/article/18/10/tales-devops-transformation [10]: https://www.execu-search.com/~/media/Resources/pdf/2017_Hiring_Outlook_eBook [11]: https://allthingsopen.org/talk/tales-from-a-devops-transformation/ [12]: https://allthingsopen.org/ - diff --git a/translated/tech/20181010 An introduction to using tcpdump at the Linux command line.md b/published/20181010 An introduction to using tcpdump at the Linux command line.md similarity index 81% rename from translated/tech/20181010 An introduction to using tcpdump at the Linux command line.md rename to published/20181010 An introduction to using tcpdump at the Linux command line.md index 9926a2279c..8744ef5162 100644 --- a/translated/tech/20181010 An introduction to using tcpdump at the Linux command line.md +++ b/published/20181010 An introduction to using tcpdump at the Linux command line.md @@ -1,41 +1,41 @@ - Linux 命令行中使用 tcpdump 抓包 +在 Linux 命令行中使用 tcpdump 抓包 ====== -Tcpdump 是一款灵活、功能强大的抓包工具,能有效地帮助排查网络故障问题。 +> `tcpdump` 是一款灵活、功能强大的抓包工具,能有效地帮助排查网络故障问题。 ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE) -根据我作为管理员的经验,在网络连接中经常遇到十分难以排查的故障问题。对于这类情况,tcpdump 便能派上用场。 +以我作为管理员的经验,在网络连接中经常遇到十分难以排查的故障问题。对于这类情况,`tcpdump` 便能派上用场。 -Tcpdump 是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包。它通常被用作于网络故障分析工具以及安全工具。 +`tcpdump` 是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包。它通常被用作于网络故障分析工具以及安全工具。 -Tcpdump 是一款强大的工具,支持多种选项和过滤规则,适用场景十分广泛。由于它是命令行工具,因此适用于在远程服务器或者没有图形界面的设备中收集数据包以便于事后分析。它可以在后台启动,也可以用 cron 等定时工具创建定时任务启用它。 +`tcpdump` 是一款强大的工具,支持多种选项和过滤规则,适用场景十分广泛。由于它是命令行工具,因此适用于在远程服务器或者没有图形界面的设备中收集数据包以便于事后分析。它可以在后台启动,也可以用 cron 等定时工具创建定时任务启用它。 -本文中,我们将讨论 tcpdump 最常用的一些功能。 +本文中,我们将讨论 `tcpdump` 最常用的一些功能。 -### 1\. 在 Linux 中安装 tcpdump +### 1、在 Linux 中安装 tcpdump -Tcpdump 支持多种 Linux 发行版,所以你的系统中很有可能已经安装了它。用下面的命令检查一下是否已经安装了 tcpdump: +`tcpdump` 支持多种 Linux 发行版,所以你的系统中很有可能已经安装了它。用下面的命令检查一下是否已经安装了 `tcpdump`: ``` $ which tcpdump /usr/sbin/tcpdump ``` -如果还没有安装 tcpdump,你可以用软件包管理器安装它。 -例如,在 CentOS 或者 Red Hat Enterprise 系统中,用如下命令安装 tcpdump: +如果还没有安装 `tcpdump`,你可以用软件包管理器安装它。 +例如,在 CentOS 或者 Red Hat Enterprise 系统中,用如下命令安装 `tcpdump`: ``` $ sudo yum install -y tcpdump ``` -Tcpdump 依赖于 `libpcap`,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。 +`tcpdump` 依赖于 `libpcap`,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。 现在你可以开始抓包了。 -### 2\. 用 tcpdump 抓包 +### 2、用 tcpdump 抓包 -使用 tcpdump 抓包,需要管理员权限,因此下面的示例中绝大多数命令都是以 `sudo` 开头。 +使用 `tcpdump` 抓包,需要管理员权限,因此下面的示例中绝大多数命令都是以 `sudo` 开头。 首先,先用 `tcpdump -D` 命令列出可以抓包的网络接口: @@ -80,7 +80,7 @@ listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes $ ``` -Tcpdump 会持续抓包直到收到中断信号。你可以按 `Ctrl+C` 来停止抓包。正如上面示例所示,`tcpdump` 抓取了超过 9000 个数据包。在这个示例中,由于我是通过 `ssh` 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。`-c` 选项可以用于限制 tcpdump 抓包的数量: +`tcpdump` 会持续抓包直到收到中断信号。你可以按 `Ctrl+C` 来停止抓包。正如上面示例所示,`tcpdump` 抓取了超过 9000 个数据包。在这个示例中,由于我是通过 `ssh` 连接到服务器,所以 `tcpdump` 也捕获了所有这类数据包。`-c` 选项可以用于限制 `tcpdump` 抓包的数量: ``` $ sudo tcpdump -i any -c 5 @@ -97,9 +97,9 @@ listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes $ ``` -如上所示,`tcpdump` 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用——比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包(如下所示)时,`-c` 的作用就十分突出了。 +如上所示,`tcpdump` 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用 —— 比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包(如下所示)时,`-c` 的作用就十分突出了。 -在上面示例中,tcpdump 默认是将 IP 地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中,使用 IP 地址和端口号更便于分析问题;用 `-n` 选项显示 IP 地址,`-nn` 选项显示端口号: +在上面示例中,`tcpdump` 默认是将 IP 地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中,使用 IP 地址和端口号更便于分析问题;用 `-n` 选项显示 IP 地址,`-nn` 选项显示端口号: ``` $ sudo tcpdump -i any -c5 -nn @@ -115,13 +115,13 @@ listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 0 packets dropped by kernel ``` -如上所示,抓取的数据包中显示 IP 地址和端口号。这样还可以阻止 tcpdump 发出 DNS 查找,有助于在网络故障排查中减少数据流量。 +如上所示,抓取的数据包中显示 IP 地址和端口号。这样还可以阻止 `tcpdump` 发出 DNS 查找,有助于在网络故障排查中减少数据流量。 现在你已经会抓包了,让我们来分析一下这些抓包输出的含义吧。 -### 3\. 理解抓取的报文 +### 3、理解抓取的报文 -Tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP,UDP,ICMP 等等。虽然这里我们不可能介绍所有的数据报文类型,但可以分析下 TCP 类型的数据报文,来帮助你入门。更多有关 tcpdump 的详细介绍可以参考其 [帮助手册][1]。Tcpdump 抓取的 TCP 报文看起来如下: +`tcpdump` 能够抓取并解码多种协议类型的数据报文,如 TCP、UDP、ICMP 等等。虽然这里我们不可能介绍所有的数据报文类型,但可以分析下 TCP 类型的数据报文,来帮助你入门。更多有关 `tcpdump` 的详细介绍可以参考其 [帮助手册][1]。`tcpdump` 抓取的 TCP 报文看起来如下: ``` 08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372 @@ -137,7 +137,7 @@ Tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP,UDP 在源 IP 和目的 IP 之后,可以看到是 TCP 报文标记段 `Flags [P.]`。该字段通常取值如下: -| Value | Flag Type | Description | +| 值 | 标志类型 | 描述 | | ----- | --------- | ----------------- | | S | SYN | Connection Start | | F | FIN | Connection Finish | @@ -149,19 +149,19 @@ Tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP,UDP 接下来是该数据包中数据的序列号。对于抓取的第一个数据包,该字段值是一个绝对数字,后续包使用相对数值,以便更容易查询跟踪。例如此处 `seq 196:568` 代表该数据包包含该数据流的第 196 到 568 字节。 -接下来是 ack 值:`ack 1`。该数据包是数据发送方,ack 值为1。在数据接收方,该字段代表数据流上的下一个预期字节数据,例如,该数据流中下一个数据包的 ack 值应该是 568。 +接下来是 ack 值:`ack 1`。该数据包是数据发送方,ack 值为 1。在数据接收方,该字段代表数据流上的下一个预期字节数据,例如,该数据流中下一个数据包的 ack 值应该是 568。 接下来字段是接收窗口大小 `win 309`,它表示接收缓冲区中可用的字节数,后跟 TCP 选项如 MSS(最大段大小)或者窗口比例值。更详尽的 TCP 协议内容请参考 [Transmission Control Protocol(TCP) Parameters][2]。 -最后,`length 372`代表数据包有效载荷字节长度。这个长度和 seq 序列号中字节数值长度是不一样的。 +最后,`length 372` 代表数据包有效载荷字节长度。这个长度和 seq 序列号中字节数值长度是不一样的。 现在让我们学习如何过滤数据报文以便更容易的分析定位问题。 -### 4\. 过滤数据包 +### 4、过滤数据包 -正如上面所提,tcpdump 可以抓取很多种类型的数据报文,其中很多可能和我们需要查找的问题并没有关系。举个例子,假设你正在定位一个与 web 服务器连接的网络问题,就不必关系 SSH 数据报文,因此在抓包结果中过滤掉 SSH 报文可能更便于你分析问题。 +正如上面所提,`tcpdump` 可以抓取很多种类型的数据报文,其中很多可能和我们需要查找的问题并没有关系。举个例子,假设你正在定位一个与 web 服务器连接的网络问题,就不必关系 SSH 数据报文,因此在抓包结果中过滤掉 SSH 报文可能更便于你分析问题。 -Tcpdump 有很多参数选项可以设置数据包过滤规则,例如根据源 IP 以及目的 IP 地址,端口号,协议等等规则来过滤数据包。下面就介绍一些最常用的过滤方法。 +`tcpdump` 有很多参数选项可以设置数据包过滤规则,例如根据源 IP 以及目的 IP 地址,端口号,协议等等规则来过滤数据包。下面就介绍一些最常用的过滤方法。 #### 协议 @@ -181,7 +181,7 @@ PING opensource.com (54.204.39.132) 56(84) bytes of data. 64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms ``` -回到运行 tcpdump 命令的终端中,可以看到它筛选出了 ICMP 报文。这里 tcpdump 并没有显示有关 `opensource.com`的域名解析数据包: +回到运行 `tcpdump` 命令的终端中,可以看到它筛选出了 ICMP 报文。这里 `tcpdump` 并没有显示有关 `opensource.com` 的域名解析数据包: ``` 09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64 @@ -215,7 +215,7 @@ listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes #### 端口号 -Tcpdump 可以根据服务类型或者端口号来筛选数据包。例如,抓取和 HTTP 服务相关的数据包: +`tcpdump` 可以根据服务类型或者端口号来筛选数据包。例如,抓取和 HTTP 服务相关的数据包: ``` $ sudo tcpdump -i any -c5 -nn port 80 @@ -303,11 +303,11 @@ listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 该例子中我们只抓取了来自源 IP 为 `192.168.122.98` 或者 `54.204.39.132` 的 HTTP (端口号80)的数据包。使用该方法就很容易抓取到数据流中交互双方的数据包了。 -### 5\. 检查数据包内容 +### 5、检查数据包内容 -在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。Tcpdump 提供了两个选项可以查看数据包内容,`-X` 以十六进制打印出数据报文内容,`-A` 打印数据报文的 ASCII 值。 +在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。`tcpdump` 提供了两个选项可以查看数据包内容,`-X` 以十六进制打印出数据报文内容,`-A` 打印数据报文的 ASCII 值。 -例如,HTTP request 报文内容如下: +例如,HTTP 请求报文内容如下: ``` $ sudo tcpdump -i any -c10 -nn -A port 80 @@ -379,9 +379,9 @@ E..4..@.@.....zb6.'....P....o.............. 这对定位一些普通 HTTP 调用 API 接口的问题很有用。当然如果是加密报文,这个输出也就没多大用了。 -### 6\. 保存抓包数据 +### 6、保存抓包数据 -Tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以夜里让它在那里抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。 +`tcpdump` 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以夜里让它在那里抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。 使用 `-w` 选项来保存数据包而不是在屏幕上显示出抓取的数据包: @@ -398,7 +398,7 @@ tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 2621 正如示例中所示,保存数据包到文件中时屏幕上就没有任何有关数据报文的输出,其中 `-c10` 表示抓取到 10 个数据包后就停止抓包。如果想有一些反馈来提示确实抓取到了数据包,可以使用 `-v` 选项。 -Tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 `-r` 选项参数来阅读该文件中的报文内容: +`tcpdump` 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 `-r` 选项参数来阅读该文件中的报文内容: ``` $ tcpdump -nn -r webserver.pcap @@ -418,7 +418,7 @@ $ 这里不需要管理员权限 `sudo` 了,因为此刻并不是在网络接口处抓包。 -你还可以使用我们讨论过的任何过滤规则来过滤文件中的内容,就像使用实时数据一样。 例如,通过执行以下命令从源 IP 地址`54.204.39.132` 检查文件中的数据包: +你还可以使用我们讨论过的任何过滤规则来过滤文件中的内容,就像使用实时数据一样。 例如,通过执行以下命令从源 IP 地址 `54.204.39.132` 检查文件中的数据包: ``` $ tcpdump -nn -r webserver.pcap src 54.204.39.132 @@ -431,11 +431,11 @@ reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked) ### 下一步做什么? -以上的基本功能已经可以帮助你使用强大的 tcpdump 抓包工具了。更多的内容请参考 [tcpdump网页][3] 以及它的 [帮助文件][4]。 +以上的基本功能已经可以帮助你使用强大的 `tcpdump` 抓包工具了。更多的内容请参考 [tcpdump 网站][3] 以及它的 [帮助文件][4]。 -Tcpdump 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 [Wireshark][5]。 +`tcpdump` 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 [Wireshark][5]。 -Wireshark 还可以用来读取 tcpdump 保存的 `pcap` 文件。你可以使用 tcpdump 命令行在没有 GUI 界面的远程机器上抓包然后在 Wireshark 中分析数据包。 +Wireshark 还可以用来读取 `tcpdump` 保存的 pcap 文件。你可以使用 `tcpdump` 命令行在没有 GUI 界面的远程机器上抓包然后在 Wireshark 中分析数据包。 -------------------------------------------------------------------------------- @@ -444,7 +444,7 @@ via: https://opensource.com/article/18/10/introduction-tcpdump 作者:[Ricardo Gerardi][a] 选题:[lujun9972][b] 译者:[jrg](https://github.com/jrglinux) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md b/published/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md similarity index 63% rename from translated/tech/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md rename to published/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md index 4f01447600..26abe69e74 100644 --- a/translated/tech/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md +++ b/published/20181015 Kali Linux- What You Must Know Before Using it - FOSS Post.md @@ -1,71 +1,74 @@ -Kali Linux:在开始使用之前你必须知道的 – FOSS Post +在你开始使用 Kali Linux 之前必须知道的事情 ====== ![](https://i1.wp.com/fosspost.org/wp-content/uploads/2018/10/kali-linux.png?fit=1237%2C527&ssl=1) -Kali Linux 在渗透测试和白帽子方面,是业界领先的 Linux 发行版。默认情况下,该发行版附带了大量黑客和渗透工具和软件,并且在全世界都得到了广泛认可。即使在那些甚至可能不知道 Linux 是什么的 Windows 用户中也是如此。 +Kali Linux 在渗透测试和白帽子方面是业界领先的 Linux 发行版。默认情况下,该发行版附带了大量入侵和渗透的工具和软件,并且在全世界都得到了广泛认可。即使在那些甚至可能不知道 Linux 是什么的 Windows 用户中也是如此。 -由于后者的原因,许多人都试图单独使用 Kali Linux,尽管他们甚至不了解 Linux 系统的基础知识。原因可能各不相同,有的为了玩乐,有的是为了取悦女友而伪装成黑客,有的仅仅是试图破解邻居的 WiFi 网络以免费上网。如果你打算使用 Kali Linux,所有的这些都是不好的事情。 +由于后者的原因(LCTT 译注:Windows 用户),许多人都试图单独使用 Kali Linux,尽管他们甚至不了解 Linux 系统的基础知识。原因可能各不相同,有的为了玩乐,有的是为了取悦女友而伪装成黑客,有的仅仅是试图破解邻居的 WiFi 网络以免费上网。如果你打算使用 Kali Linux,记住,所有的这些都是不好的事情。 在计划使用 Kali Linux 之前,你应该了解一些提示。 ### Kali Linux 不适合初学者 ![](https://i0.wp.com/fosspost.org/wp-content/uploads/2018/10/Kali-Linux-000.png?resize=850%2C478&ssl=1) -Kali Linux 默认 GNOME 桌面 -如果你是几个月前刚开始使用 Linux 的人,或者你认为自己的知识水平低于平均水平,那么 Kali Linux 就不适合你。如果你打算问“如何在 Kali 上安装 Stream?如何让我的打印机在 Kali 上工作?如何解决 Kali 上的 APT 源错误?”这些东西,那么 Kali Linux 并不适合你。 +*Kali Linux 默认 GNOME 桌面* -Kali Linux 主要面向想要运行渗透测试的专家或想要学习成为白帽子和数字取证的人。但即使你来自后者,普通的 Kali Linux 用户在日常使用时也会遇到很多麻烦。他还被要求以非常谨慎的方式使用工具和软件,而不仅仅是“让我们安装并运行一切”。每一个工具必须小心使用,你安装的每一个软件都必须仔细检查。 +如果你是几个月前刚开始使用 Linux 的人,或者你认为自己的知识水平低于平均水平,那么 Kali Linux 就不适合你。如果你打算问“如何在 Kali 上安装 Steam?如何让我的打印机在 Kali 上工作?如何解决 Kali 上的 APT 源错误?”这些东西,那么 Kali Linux 并不适合你。 -**建议阅读:** [Linux 系统的组件是什么?][1] +Kali Linux 主要面向想要运行渗透测试套件的专家或想要学习成为白帽子和数字取证的人。但即使你属于后者,普通的 Kali Linux 用户在日常使用时也会遇到很多麻烦。他还被要求以非常谨慎的方式使用工具和软件,而不仅仅是“让我们安装并运行一切”。每一个工具必须小心使用,你安装的每一个软件都必须仔细检查。 -普通 Linux 用户无法做正常的事情。(to 校正:这里什么意思呢?)一个更好的方法是花几周时间学习 Linux 及其守护进程,服务,软件,发行版及其工作方式,然后观看几十个关于白帽子攻击的视频和课程,然后再尝试使用 Kali 来应用你学习到的东西。 +**建议阅读:** [Linux 系统的组件有什么?][1] + +普通 Linux 用户都无法自如地使用它。一个更好的方法是花几周时间学习 Linux 及其守护进程、服务、软件、发行版及其工作方式,然后观看几十个关于白帽子攻击的视频和课程,然后再尝试使用 Kali 来应用你学习到的东西。 ### 它会让你被黑客攻击 ![](https://i0.wp.com/fosspost.org/wp-content/uploads/2018/10/Kali-Linux-001.png?resize=850%2C478&ssl=1) -Kali Linux 入侵和测试工具 + +*Kali Linux 入侵和测试工具* 在普通的 Linux 系统中,普通用户有一个账户,而 root 用户也有一个单独的账号。但在 Kali Linux 中并非如此。Kali Linux 默认使用 root 账户,不提供普通用户账户。这是因为 Kali 中几乎所有可用的安全工具都需要 root 权限,并且为了避免每分钟要求你输入 root 密码,所以这样设计。 -当然,你可以简单地创建一个普通用户账户并开始使用它。但是,这种方式仍然不推荐,因为这不是 Kali Linux 系统设计的工作方式。然后,在使用程序,打开端口,调试软件时,你会遇到很多问题,你会发现为什么这个东西不起作用,最终却发现它是一个奇怪的权限错误。另外每次在系统上做任何事情时,你会被每次运行工具都要求输入密码而烦恼。 +当然,你可以简单地创建一个普通用户账户并开始使用它。但是,这种方式仍然不推荐,因为这不是 Kali Linux 系统设计的工作方式。使用普通用户在使用程序,打开端口,调试软件时,你会遇到很多问题,你会发现为什么这个东西不起作用,最终却发现它是一个奇怪的权限错误。另外每次在系统上做任何事情时,你会被每次运行工具都要求输入密码而烦恼。 -现在,由于你被迫以 root 用户身份使用它,因此你在系统上运行的所有软件也将以 root 权限运行。如果你不知道自己在做什么,那么这很糟糕,因为如果 Firefox 中存在漏洞,并且你访问了一个受感染的网站,那么黑客能够在你的 PC 上获得全部 root 权限并入侵你。如果你使用的是普通用户账户,则会收到限制。此外,你安装和使用的某些工具可能会在你不知情的情况下打开端口并泄露信息,因此如果你不是非常小心,人们可能会以你尝试入侵他们的方式入侵你。 +现在,由于你被迫以 root 用户身份使用它,因此你在系统上运行的所有软件也将以 root 权限运行。如果你不知道自己在做什么,那么这很糟糕,因为如果 Firefox 中存在漏洞,并且你访问了一个受感染的网站,那么黑客能够在你的 PC 上获得全部 root 权限并入侵你。如果你使用的是普通用户账户,则会受到限制。此外,你安装和使用的某些工具可能会在你不知情的情况下打开端口并泄露信息,因此如果你不是非常小心,人们可能会以你尝试入侵他们的方式入侵你。 -如果你在一些情况下访问于与 Kali Linux 相关的 Facebook 群组,你会发现这些群组中几乎有四分之一的帖子是人们在寻求帮助,因为有人入侵了他们。 +如果你曾经访问过与 Kali Linux 相关的 Facebook 群组,你会发现这些群组中几乎有四分之一的帖子是人们在寻求帮助,因为有人入侵了他们。 ### 它可以让你入狱 -Kali Linux 仅提供软件。那么,如何使用它们完全是你自己的责任。 +Kali Linux 只是提供了软件。那么,如何使用它们完全是你自己的责任。 在世界上大多数发达国家,使用针对公共 WiFi 网络或其他设备的渗透测试工具很容易让你入狱。现在不要以为你使用了 Kali 就无法被跟踪,许多系统都配置了复杂的日志记录设备来简单地跟踪试图监听或入侵其网络的人,你可能无意间成为其中的一个,那么它会毁掉你的生活。 永远不要对不属于你的设备或网络使用 Kali Linux 系统,也不要明确允许对它们进行入侵。如果你说你不知道你在做什么,在法庭上它不会被当作借口来接受。 -### 修改了内核和软件 +### 修改了的内核和软件 -Kali [基于][2] Debian(测试分支,这意味着 Kali Linux 使用滚动发布模型),因此它使用了 Debian 的大部分软件体系结构,你会发现 Kali Linux 中的大部分软件跟 Debian 中的没什么区别。 +Kali [基于][2] Debian(“测试”分支,这意味着 Kali Linux 使用滚动发布模型),因此它使用了 Debian 的大部分软件体系结构,你会发现 Kali Linux 中的大部分软件跟 Debian 中的没什么区别。 但是,Kali 修改了一些包来加强安全性并修复了一些可能的漏洞。例如,Kali 使用的 Linux 内核被打了补丁,允许在各种设备上进行无线注入。这些补丁通常在普通内核中不可用。此外,Kali Linux 不依赖于 Debian 服务器和镜像,而是通过自己的服务器构建软件包。以下是最新版本中的默认软件源: + ``` - deb http://http.kali.org/kali kali-rolling main contrib non-free - deb-src http://http.kali.org/kali kali-rolling main contrib non-free +deb http://http.kali.org/kali kali-rolling main contrib non-free +deb-src http://http.kali.org/kali kali-rolling main contrib non-free ``` 这就是为什么,对于某些特定的软件,当你在 Kali Linux 和 Fedora 中使用相同的程序时,你会发现不同的行为。你可以从 [git.kali.org][3] 中查看 Kali Linux 软件的完整列表。你还可以在 Kali Linux(GNOME)上找到我们[自己生成的已安装包列表][4]。 -更重要的是,Kali Linux 官方文档极力建议不要添加任何其他第三方软件仓库,因为 Kali Linux 是一个滚动发行版,并且依赖于 Debian 测试,由于依赖关系冲突和包钩子,所以你很可能只是添加一个新的仓库源就会破坏系统。 +更重要的是,Kali Linux 官方文档极力建议不要添加任何其他第三方软件仓库,因为 Kali Linux 是一个滚动发行版,并且依赖于 Debian 测试分支,由于依赖关系冲突和包钩子,所以你很可能只是添加一个新的仓库源就会破坏系统。 ### 不要安装 Kali Linux ![](https://i0.wp.com/fosspost.org/wp-content/uploads/2018/10/Kali-Linux-002.png?resize=750%2C504&ssl=1) -使用 Kali Linux 在 fosspost.org 上运行 wpscan +*使用 Kali Linux 在 fosspost.org 上运行 wpscan* 我在极少数情况下使用 Kali Linux 来测试我部署的软件和服务器。但是,我永远不敢安装它并将其用作主系统。 -如果你要将其用作主系统,那么你必须保留自己的个人文件,密码,数据以及系统上的所有内容。你还需要安装大量日常使用的软件,以解放你的生活。但正如我们上面提到的,使用 Kali Linux 是非常危险的,应该非常小心地进行,如果你被入侵了,你将丢失所有数据,并且可能会暴露给更多的人。如果你在做一些不合法的事情,你的个人信息也可用于跟踪你。如果你不小心使用这些工具,那么你甚至可能会毁掉自己的数据。 +如果你要将其用作主系统,那么你必须保留自己的个人文件、密码、数据以及系统上的所有内容。你还需要安装大量日常使用的软件,以解放你的生活。但正如我们上面提到的,使用 Kali Linux 是非常危险的,应该非常小心地进行,如果你被入侵了,你将丢失所有数据,并且可能会暴露给更多的人。如果你在做一些不合法的事情,你的个人信息也可用于跟踪你。如果你不小心使用这些工具,那么你甚至可能会毁掉自己的数据。 即使是专业的白帽子也不建议将其作为主系统安装,而是通过 USB 使用它来进行渗透测试工作,然后再回到普通的 Linux 发行版。 @@ -83,7 +86,7 @@ via: https://fosspost.org/articles/must-know-before-using-kali-linux 作者:[M.Hanny Sabbagh][a] 选题:[lujun9972][b] 译者:[MjSeven](https://github.com/MjSeven) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20181017 Browsing the web with Min, a minimalist open source web browser.md b/published/20181017 Browsing the web with Min, a minimalist open source web browser.md similarity index 90% rename from translated/tech/20181017 Browsing the web with Min, a minimalist open source web browser.md rename to published/20181017 Browsing the web with Min, a minimalist open source web browser.md index aac33903d9..8b0244f58b 100644 --- a/translated/tech/20181017 Browsing the web with Min, a minimalist open source web browser.md +++ b/published/20181017 Browsing the web with Min, a minimalist open source web browser.md @@ -1,9 +1,11 @@ 使用极简浏览器 Min 浏览网页 ====== + > 并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。 + ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openweb-osdc-lead.png?itok=yjU4KliG) -现在还有开发新的网络浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。 +现在还有开发新的 Web 浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。 [Min][1] 就是其中一个。顾名思义,Min 是一个小的浏览器,也是一个极简主义的浏览器。但它麻雀虽小五脏俱全,而且还是一个开源的浏览器,它的 Apache 2.0 许可证引起了我的注意。 @@ -29,7 +31,7 @@ Min 号称是更智能、更快速的浏览器。经过尝试以后,我觉得 Min 和其它浏览器一样,支持页面选项卡。它还有一个称为 Tasks 的功能,可以对打开的选项卡进行分组。 -[DuckDuckGo][6]是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。 +[DuckDuckGo][6] 是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。 Min 没有使用类似 AdBlock 这样的插件来过滤你不想看到的内容,而是使用了一个名为 [EasyList][7] 的内置的广告拦截器,你可以使用它来屏蔽脚本和图片。另外 Min 还带有一个内置的防跟踪软件。 @@ -54,7 +56,7 @@ Min 确实也有自己的缺点,例如它无法将网站添加为书签。替 ### 总结 Min 算是一个中规中矩的浏览器,它可以凭借轻量、快速的优点吸引很多极简主义的用户。但是对于追求多功能的用户来说,Min 就显得相当捉襟见肘了。 -. + 所以,如果你想摆脱当今多功能浏览器的束缚,我觉得可以试用一下 Min。 @@ -65,7 +67,7 @@ via: https://opensource.com/article/18/10/min-web-browser 作者:[Scott Nesbitt][a] 选题:[lujun9972][b] 译者:[HankChow](https://github.com/HankChow) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20181030 How To Analyze And Explore The Contents Of Docker Images.md b/published/20181030 How To Analyze And Explore The Contents Of Docker Images.md similarity index 59% rename from translated/tech/20181030 How To Analyze And Explore The Contents Of Docker Images.md rename to published/20181030 How To Analyze And Explore The Contents Of Docker Images.md index 8b0021bf26..932937b0f2 100644 --- a/translated/tech/20181030 How To Analyze And Explore The Contents Of Docker Images.md +++ b/published/20181030 How To Analyze And Explore The Contents Of Docker Images.md @@ -1,33 +1,42 @@ 如何分析并探索 Docker 容器镜像的内容 ====== + ![](https://www.ostechnix.com/wp-content/uploads/2018/10/dive-tool-720x340.png) -或许你已经了解到 Docker 容器镜像是一个轻量、独立、含有运行某个应用所需全部软件的可执行包,这也是为什么容器镜像会经常被开发者用于构建和分发应用。假如你很好奇一个 Docker 镜像里面包含了什么东西,那么这篇简要的指南或许会帮助到你。今天,我们将学会使用一个名为 **Dive** 的工具来分析和探索 Docker 镜像每层的内容。通过分析 Docker 镜像,我们可以发现在各个层之间可能重复的文件并通过移除它们来减小 Docker 镜像的大小。Dive 工具不仅仅是一个 Docker 镜像分析工具,它还可以帮助我们来构建镜像。Dive 是一个用 Go 编程语言编写的免费开源工具。 +或许你已经了解到 Docker 容器镜像是一个轻量、独立、含有运行某个应用所需全部软件的可执行包,这也是为什么容器镜像会经常被开发者用于构建和分发应用。假如你很好奇一个 Docker 镜像里面包含了什么东西,那么这篇简要的指南或许会帮助到你。今天,我们将学会使用一个名为 **Dive** 的工具来分析和探索 Docker 镜像每层的内容。 + +通过分析 Docker 镜像,我们可以发现在各个层之间可能重复的文件并通过移除它们来减小 Docker 镜像的大小。Dive 工具不仅仅是一个 Docker 镜像分析工具,它还可以帮助我们来构建镜像。Dive 是一个用 Go 编程语言编写的自由开源工具。 ### 安装 Dive -首先从该项目的 [**发布页**][1] 下载最新版本,然后像下面展示的那样根据你所使用的发行版来安装它。 +首先从该项目的 [发布页][1] 下载最新版本,然后像下面展示的那样根据你所使用的发行版来安装它。 假如你正在使用 **Debian** 或者 **Ubuntu**,那么可以运行下面的命令来下载并安装它。 + ``` $ wget https://github.com/wagoodman/dive/releases/download/v0.0.8/dive_0.0.8_linux_amd64.deb ``` + ``` $ sudo apt install ./dive_0.0.8_linux_amd64.deb ``` **在 RHEL 或 CentOS 系统中** + ``` $ wget https://github.com/wagoodman/dive/releases/download/v0.0.8/dive_0.0.8_linux_amd64.rpm ``` + ``` $ sudo rpm -i dive_0.0.8_linux_amd64.rpm ``` -Dive 也可以使用 [**Linuxbrew**][2] 包管理器来安装。 +Dive 也可以使用 [Linuxbrew][2] 包管理器来安装。 + ``` $ brew tap wagoodman/dive ``` + ``` $ brew install dive ``` @@ -36,34 +45,37 @@ $ brew install dive ### 分析并探索 Docker 镜像的内容 -要分析一个 Docker 镜像,只需要运行加上 Docker 镜像 ID的 dive 命令就可以了。你可以使用 `sudo docker images` 来得到 Docker 镜像的 ID。 +要分析一个 Docker 镜像,只需要运行加上 Docker 镜像 ID 的 `dive` 命令就可以了。你可以使用 `sudo docker images` 来得到 Docker 镜像的 ID。 + ``` $ sudo dive ea4c82dcd15a ``` -上面命令中的 **ea4c82dcd15a** 是某个镜像的 id。 +上面命令中的 `ea4c82dcd15a` 是某个镜像的 ID。 -然后 Dive 命令将快速地分析给定 Docker 镜像的内容并将它在终端中展示出来。 +然后 `dive` 命令将快速地分析给定 Docker 镜像的内容并将它在终端中展示出来。 ![](https://www.ostechnix.com/wp-content/uploads/2018/10/Dive-1.png) -正如你在上面的截图中看到的那样,在终端的左边一栏列出了给定 Docker 镜像的各个层及其详细内容,浪费的空间大小等信息。右边一栏则给出了给定 Docker 镜像每一层的内容。你可以使用 **Ctrl+SPACEBAR** 来在左右栏之间切换,使用 **UP/DOWN** 上下键来在目录树中进行浏览。 +正如你在上面的截图中看到的那样,在终端的左边一栏列出了给定 Docker 镜像的各个层及其详细内容,浪费的空间大小等信息。右边一栏则给出了给定 Docker 镜像每一层的内容。你可以使用 `Ctrl+空格` 来在左右栏之间切换,使用 `UP`/`DOWN` 光标键来在目录树中进行浏览。 -下面是 `Dive` 的快捷键列表: - * **Ctrl+Spacebar** – 在左右栏之间切换 - * **Spacebar** – 展开或收起目录树 - * **Ctrl+A** – 文件树视图:展示或隐藏增加的文件 - * **Ctrl+R** – 文件树视图:展示或隐藏被移除的文件 - * **Ctrl+M** – 文件树视图:展示或隐藏被修改的文件 - * **Ctrl+U** – 文件树视图:展示或隐藏未修改的文件 - * **Ctrl+L** – 层视图:展示当前层的变化 - * **Ctrl+A** – 层视图:展示总的变化 - * **Ctrl+/** – 筛选文件 - * **Ctrl+C** – 退出 +下面是 `dive` 的快捷键列表: -在上面的例子中,我使用了 `sudo` 权限,这是因为我的 Docker 镜像存储在 **/var/lib/docker/** 目录中。假如你的镜像保存在你的家目录 `$HOME`或者在其他不属于 `root` 用户的目录,你就没有必要使用 `sudo` 命令。 + * `Ctrl+空格` —— 在左右栏之间切换 + * `空格` —— 展开或收起目录树 + * `Ctrl+A` —— 文件树视图:展示或隐藏增加的文件 + * `Ctrl+R` —— 文件树视图:展示或隐藏被移除的文件 + * `Ctrl+M` —— 文件树视图:展示或隐藏被修改的文件 + * `Ctrl+U` —— 文件树视图:展示或隐藏未修改的文件 + * `Ctrl+L` —— 层视图:展示当前层的变化 + * `Ctrl+A` —— 层视图:展示总的变化 + * `Ctrl+/` —— 筛选文件 + * `Ctrl+C` —— 退出 + +在上面的例子中,我使用了 `sudo` 权限,这是因为我的 Docker 镜像存储在 `/var/lib/docker/` 目录中。假如你的镜像保存在你的家目录 (`$HOME`)或者在其他不属于 `root` 用户的目录,你就没有必要使用 `sudo` 命令。 你还可以使用下面的单个命令来构建一个 Docker 镜像并立刻分析该镜像: + ``` $ dive build -t ``` @@ -83,7 +95,7 @@ via: https://www.ostechnix.com/how-to-analyze-and-explore-the-contents-of-docker 作者:[SK][a] 选题:[lujun9972][b] 译者:[FSSlc](https://github.com/FSSlc) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -91,4 +103,4 @@ via: https://www.ostechnix.com/how-to-analyze-and-explore-the-contents-of-docker [b]: https://github.com/lujun9972 [1]: https://github.com/wagoodman/dive/releases [2]: https://www.ostechnix.com/linuxbrew-common-package-manager-linux-mac-os-x/ -[3]: https://github.com/wagoodman/dive \ No newline at end of file +[3]: https://github.com/wagoodman/dive diff --git a/sources/talk/20180417 What developers need to know about security.md b/sources/talk/20180417 What developers need to know about security.md deleted file mode 100644 index c8fcb9da27..0000000000 --- a/sources/talk/20180417 What developers need to know about security.md +++ /dev/null @@ -1,61 +0,0 @@ -Translating by MjSeven - - -What developers need to know about security -====== - -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/locks_keys_bridge_paris.png?itok=Bp0dsEc9) - -DevOps doesn't mean that everyone needs to be an expert in both development and operations. This is especially true in larger organizations in which roles tend to be more specialized. Rather, DevOps thinking has evolved in a way that makes it more about the separation of concerns. To the degree that operations teams can deploy platforms for developers (whether on-premises or in a public cloud) and get out of the way, that's good news for both teams. Developers get a productive development environment and self-service. Operations can focus on keeping the underlying plumbing running and maintaining the platform. - -It's a contract of sorts. Devs expect a stable and functional platform from ops. Ops expects that devs will be able to handle most of the tasks associated with developing apps on their own. - -Devs expect a stable and functional platform from ops. Ops expects that devs will be able to handle most of the tasks associated with developing apps on their own. - -That said, DevOps is also about better communication, collaboration, and transparency. It works better if it's not about merely a new type of wall between dev and ops. Ops needs to be sensitive to the type of tools developers want and need and the visibility they require, through monitoring and logging, to write better applications. Conversely, developers need some awareness of how the underlying infrastructure can be used most effectively and what can keep operations up at night (literally). - -That said, DevOps is also about better communication, collaboration, and transparency. It works better if it's not about merely a new type of wall between dev and ops. Ops needs to be sensitive to the type of tools developers want and need and the visibility they require, through monitoring and logging, to write better applications. Conversely, developers need some awareness of how the underlying infrastructure can be used most effectively and what can keep operations up at night (literally). - -The same principle applies more broadly to DevSecOps, a term that serves to explicitly remind us that security needs to be embedded throughout the entire DevOps pipeline from sourcing content to writing apps, building them, testing them, and running them in production. Developers (and operations) don't suddenly need to become security specialists in addition to the other hats they already wear. But they can often benefit from a greater awareness of security best practices (which may be different from what they've become accustomed to) and shifting away from a mindset that views security as some unfortunate obstacle. - -Here are a few observations. - -The Open Web Application Security Project ([OWASP][1]) [Top 10 list][2] provides a window into the top vulnerabilities in web applications. Many entries on the list will be familiar to web programmers. Cross-site scripting (XSS) and injection flaws are among the most common. What's striking though is that many of the flaws on the original 2007 list are still on 2017's list ([PDF][3]). Whether it's training or tooling that's most at fault, many of the same coding flaws keep popping up. - -The situation is exacerbated by new platform technologies. For example, while containers don't necessarily require applications to be written differently, they dovetail with new patterns (such as [microservices][4] ) and can amplify the effects of certain security practices. For example, as my colleague [Dan Walsh][5] [@rhatdan][6] ) writes, "The biggest misconception in computing [is] you need root to run applications. The problem is not so much that devs think they need root. It is that they build this assumption into the services that they build, i.e., the services cannot run without root, making us all less secure." - -Was defaulting to root access ever a good practice? Not really. But it was arguably (maybe) a defensible one with applications and systems that were otherwise sufficiently isolated by other means. But with everything connected, no real perimeter, multi-tenant workloads, users with many different levels of access rights—to say nothing of an ever more dangerous threat environment—there's far less leeway for shortcuts. - -[Automation][7] should be an integral part of DevOps anyway. That automation needs to include security and compliance testing throughout the process. Where did the code come from? Are third-party technologies, products, or container images involved? Are there known security errata? Are there known common code flaws? Are secrets and personally identifiable information kept isolated? How do we authenticate? Who is authorized to deploy services and applications? - -You're not writing your own crypto, are you? - -Automate penetration testing where possible. Did I mention automation? It's an essential part of making security continuous rather than a checklist item that's done once in a while. - -Does this sound hard? It probably is a bit. At least it may be different. But as a participant in a [DevOpsDays OpenSpaces][8] London said to me: "It's just technical testing. It's not magical or mysterious." He went on to say that it's not even that hard to get involved with security as a way to gain a broader understanding of the whole software lifecycle (which is not a bad skill to have). He also suggested taking part in incident response exercises or [capture the flag exercises][9]. You might even find they're fun. - -This article is based on [a talk][10] the author will be giving at [Red Hat Summit 2018][11], which will be held May 8-10 in San Francisco. _[Register by May 7][11] to save US$ 500 off of registration. Use discount code **OPEN18** on the payment page to apply the discount._ - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/18/4/what-developers-need-know-about-security - -作者:[Gordon Haff][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) -选题:[lujun9972](https://github.com/lujun9972) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/ghaff -[1]:https://www.owasp.org/index.php/Main_Page -[2]:https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project -[3]:https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf -[4]:https://opensource.com/tags/microservices -[5]:https://opensource.com/users/rhatdan -[6]:https://twitter.com/rhatdan -[7]:https://opensource.com/tags/automation -[8]:https://www.devopsdays.org/open-space-format/ -[9]:https://dev.to/_theycallmetoni/capture-the-flag-its-a-game-for-hacki-mean-security-professionals -[10]:https://agenda.summit.redhat.com/SessionDetail.aspx?id=154677 -[11]:https://www.redhat.com/en/summit/2018 diff --git a/sources/talk/20180904 Why schools of the future are open.md b/sources/talk/20180904 Why schools of the future are open.md index 32b2f58e99..52f934f280 100644 --- a/sources/talk/20180904 Why schools of the future are open.md +++ b/sources/talk/20180904 Why schools of the future are open.md @@ -1,3 +1,4 @@ +hkurj translating Why schools of the future are open ====== diff --git a/sources/tech/20170928 A 3-step process for making more transparent decisions.md b/sources/tech/20170928 A 3-step process for making more transparent decisions.md deleted file mode 100644 index 80e4d294f6..0000000000 --- a/sources/tech/20170928 A 3-step process for making more transparent decisions.md +++ /dev/null @@ -1,81 +0,0 @@ -A 3-step process for making more transparent decisions -====== -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/GOV_Transparency_A.png?itok=2r47nFJB) - -One of the most powerful ways to make your work as a leader more transparent is to take an existing process, open it up for feedback from your team, and then change the process to account for this feedback. The following exercise makes transparency more tangible, and it helps develop the "muscle memory" needed for continually evaluating and adjusting your work with transparency in mind. - -I would argue that you can undertake this activity this with any process--even processes that might seem "off limits," like the promotion or salary adjustment processes. But if that's too big for a first bite, then you might consider beginning with a less sensitive process, such as the travel approval process or your system for searching for candidates to fill open positions on your team. (I've done this with our hiring process and promotion processes, for example.) - -Opening up processes and making them more transparent builds your credibility and enhances trust with team members. It forces you to "walk the transparency walk" in ways that might challenge your assumptions or comfort level. Working this way does create additional work, particularly at the beginning of the process--but, ultimately, this works well for holding managers (like me) accountable to team members, and it creates more consistency. - -### Phase 1: Pick a process - -**Step 1.** Think of a common or routine process your team uses, but one that is not generally open for scrutiny. Some examples might include: - - * Hiring: How are job descriptions created, interview teams selected, candidates screened and final hiring decisions made? - * Planning: How are your team or organizational goals determined for the year or quarter? - * Promotions: How do you select candidates for promotion, consider them, and decide who gets promoted? - * Manager performance appraisals: Who receives the opportunity to provide feedback on manager performance, and how are they able to do it? - * Travel: How is the travel budget apportioned, and how do you make decisions about whether to approval travel (or whether to nominate someone for travel)? - - - -One of the above examples may resonate with you, or you may identify something else that you feel is more appropriate. Perhaps you've received questions about a particular process, or you find yourself explaining the rationale for a particular kind of decision frequently. Choose something that you are able to control or influence--and something you believe your constituents care about. - -**Step 2.** Now answer the following questions about the process: - - * Is the process currently documented in a place that all constituents know about and can access? If not, go ahead and create that documentation now (it doesn't have to be too detailed; just explain the different steps of the process and how it works). You may find that the process isn't clear or consistent enough to document. In that case, document it the way you think it should work in the ideal case. - * Does the completed process documentation explain how decisions are made at various points? For example, in a travel approval process, does it explain how a decision to approve or deny a request is made? - * What are the inputs of the process? For example, when determining departmental goals for the year, what data is used for key performance indicators? Whose feedback is sought and incorporated? Who has the opportunity to review or "sign off"? - * What assumptions does this process make? For example, in promotion decisions, do you assume that all candidates for promotion will be put forward by their managers at the appropriate time? - * What are the outputs of the process? For example, in assessing the performance of the managers, is the result shared with the manager being evaluated? Are any aspects of the review shared more broadly with the manager's direct reports (areas for improvement, for example)? - - - -Avoid making judgements when answering the above questions. If the process doesn't clearly explain how a decision is made, that might be fine. The questions are simply an opportunity to assess the current state. - -Next, revise the documentation of the process until you are satisfied that it adequately explains the process and anticipates the potential questions. - -### Phase 2: Gather feedback - -The next phase involves sharing the process with your constituents and asking for feedback. Sharing is easier said than done. - -**Step 1.** Encourage people to provide feedback. Consider a variety of mechanisms for doing this: - - * Post the process somewhere people can find it internally and note where they can make comments or provide feedback. A Google document works great with the ability to comment on specific text or suggest changes directly in the text. - * Share the process document via email, inviting feedback - * Mention the process document and ask for feedback during team meetings or one-on-one conversations - * Give people a time window within which to provide feedback, and send periodic reminders during that window. - - - -If you don't get much feedback, don't assume that silence is equal to endorsement. Try asking people directly if they have any idea why feedback is not coming in. Are people too busy? Is the process not as important to people as you thought? Have you effectively articulated what you're asking for? - -**Step 2.** Iterate. As you get feedback about the process, engage the team in revising and iterating on the process. Incorporate ideas and suggestions for improvement, and ask for confirmation that the intended feedback has been applied. If you don't agree with a suggestion, be open to the discussion and ask yourself why you don't agree and what the merits are of one method versus another. - -Setting a timebox for collecting feedback and iterating is helpful to move things forward. Once feedback has been collected and reviewed, discussed and applied, post the final process for the team to review. - -### Phase 3: Implement - -Implementing a process is often the hardest phase of the initiative. But if you've taken account of feedback when revising your process, people should already been anticipating it and will likely be more supportive. The documentation you have from the iterative process above is a great tool to keep you accountable on the implementation. - -**Step 1.** Review requirements for implementation. Many processes that can benefit from increased transparency simply require doing things a little differently, but you do want to review whether you need any other support (tooling, for example). - -**Step 2.** Set a timeline for implementation. Review the timeline with constituents so they know what to expect. If the new process requires a process change for others, be sure to provide enough time for people to adapt to the new behavior, and provide communication and reminders. - -**Step 3.** Follow up. After using the process for 3-6 months, check in with your constituents to see how it's going. Is the new process more transparent? More effective? More predictable? Do you have any lessons learned that could be used to improve the process further? - -### About The Author -Sam Knuth;I Have The Privilege To Lead The Customer Content Services Team At Red Hat;Which Produces All Of The Documentation We Provide For Our Customers. Our Goal Is To Provide Customers With The Insights They Need To Be Successful With Open Source Technology In The Enterprise. Connect With Me On Twitter - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/17/9/exercise-in-transparent-decisions - -作者:[a][Sam Knuth] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/samfw diff --git a/sources/tech/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md b/sources/tech/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md deleted file mode 100644 index cbe5e1f9bd..0000000000 --- a/sources/tech/20171002 Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie.md +++ /dev/null @@ -1,260 +0,0 @@ -Translating by cielllll - -Three Alternatives for Enabling Two Factor Authentication For SSH On Ubuntu 16.04 And Debian Jessie -====== -Security is now more important than ever and securing your SSH server is one of the most important things that you can do as a systems administrator. Traditionally this has meant disabling password authentication and instead using SSH keys. Whilst this is absolutely the first thing you should do that doesn't mean that SSH can't be made even more secure. - -Two-factor authentication simply means that two means of identification are required to log in. These could be a password and an SSH key, or a key and a 3rd party service like Google. It means that the compromise of a single authentication method does not compromise the server. - -The following guides are three ways to enable two-factor authentication for SSH. - -Whenever you are modifying the configuration of SSH always ensure that you have a second terminal open to the server. The second terminal means that you will be able to fix any mistakes you make with the SSH configuration. Open terminals will stay open even through SSH restarts. - -### SSH Key and Password - -SSH supports the ability to require more than a single authentication method for logins. - -The authentication methods are set with the `AuthenticationMethods` option in the SSH server's configuration file at `/etc/ssh/sshd_config`. - -When the following line is added into `/etc/ssh/sshd_config` SSH requires an SSH key to be submitted and then a password is prompted for: -``` -AuthenticationMethods "publickey,password" - -``` - -If you want to set these methods on a per use basis then use the following additional configuration: -``` -Match User jsmith - AuthenticationMethods "publickey,password" - -``` - -When you have edited and saved the new `sshd_config` file you should check that you did not make any errors by running this command: -``` -sshd -t - -``` - -Any syntax or other errors that would stop SSH from starting will be flagged here. When `ssh -t` runs without error use `systemctl` to restart SSH" -``` -systemctl restart sshd - -``` - -Now you can log in with a new terminal to check that you are prompted for a password and your SSH key is required. If you use `ssh -v` e.g.: -``` -ssh -v jsmith@example.com - -``` - -you will be able to see every step of the login. - -Note, if you do set `password` as a required authentication method then you will need to ensure that `PasswordAuthentication` option is set to `yes`. - -### SSH With Google Authenticator - -Google's two-factor authentication system that is used on Google's own products can be integrated into your SSH server. This makes this method very convenient if you already have use the Google Authenticator app. - -Although the `libpam-google-authenticator` is written by Google it is [open source][1]. Also, the Google Authenticator app is written by Google but does not require a Google account to work. Thanks to [Sitaram Chamarty][2] for the heads up on that. - -If you don't already have the Google Authenticator app installed and configured on your phone please see the instructions [here][3]. - -First, we need to install the Google Authenticator package on the server. The following commands will update your system and install the needed packages: -``` -apt-get update -apt-get upgrade -apt-get install libpam-google-authenticator - -``` - -Now, we need to register the server with the Google Authenticator app on your phone. This is done by first running the program we just installed: -``` -google-authenticator - -``` - -You will be asked a few questions when you run this. You should answer in the way that suits your setup, however, the most secure options are to answer `y` to every question. If you need to change these later you can simply re-run `google-authenticator` and select different options. - -When you run `google-authenticator` a QR code will be printed to the terminal and some codes that look like: -``` -Your new secret key is: VMFY27TYDFRDNKFY -Your verification code is 259652 -Your emergency scratch codes are: - 96915246 - 70222983 - 31822707 - 25181286 - 28919992 - -``` - -You should record all of these codes to a secure location like a password manager. The scratch codes are single use codes that will always allow you access even if your phone is unavailable. - -All you need to do to register your server with the Authenticator app is to open the app and hit the red plus symbol on the bottom right. Then select the **Scan a barcode** option and scan the QR code that was printed to the terminal. Your server and the app are now linked. - -Back on the server, we now need to edit the PAM (Pluggable Authentication Module) for SSH so that it uses the authenticator package we just installed. PAM is the standalone system that takes care of most authentication on a Linux server. - -The PAM file for SSH that needs modifying is located at `/etc/pam.d/sshd` and edited with the following command: -``` -nano /etc/pam.d/sshd - -``` - -Add the following line to the top of the file: -``` -auth required pam_google_authenticator.so - -``` - -In addition, we also need to comment out a line so that PAM will not prompt for a password. Change this line: -``` -# Standard Un*x authentication. -@include common-auth - -``` - -To this: -``` -# Standard Un*x authentication. -# @include common-auth - -``` - -Next, we need to edit the SSH server configuration file: -``` -nano /etc/ssh/sshd_config - -``` - -And change this line: -``` -ChallengeResponseAuthentication no - -``` - -To: -``` -ChallengeResponseAuthentication yes - -``` - -Next, add the following line to enable two authentication schemes; SSH keys and Google Authenticator (keyboard-interactive): -``` -AuthenticationMethods "publickey,keyboard-interactive" - -``` - -Before we reload the SSH server it is a good idea to check that we did not make any errors in the configuration. This is done with the following command: -``` -sshd -t - -``` - -If this does not flag any errors, reload SSH with the new configuration: -``` -systemctl reload sshd.service - -``` - -Everything should now be working. Now, when you log into to your server you will need to use your SSH keys and when you are prompted for the: -``` -Verification code: - -``` - -open the Authenticator app and enter the 6 digit code that is displaying for your server. - -### Authy - -[Authy][4] is a two-factor authentication service that, like Google, offers time-based codes. However, Authy does not require a phone as they provide desktop and tables clients. They also enable offline authentication and do not require a Google account. - -You will need to install the Authy app from your app store, or the desktop client all of which are linked to from the Authy [download page][5]. - -After you have installed the app you will need an API key that will be used on the server. This process requires a few steps: - - 1. Sign up for an account [here][6]. - 2. Scroll down to the **Authy** section. - 3. Enable 2FA on the account. - 4. Return to the **Authy** section. - 5. Create a new Application for your server. - 6. Obtain the API key from the top of the `General Settings` page for the new Application. You need to click the eye symbol next to the `PRODUCTION API KEY` line to reveal the key. Shown here: - - - -![][7] - -Take a note of the API key somewhere secure. - -Now, go back to your server and run the following commands as root: -``` -curl -O 'https://raw.githubusercontent.com/authy/authy-ssh/master/authy-ssh' -bash authy-ssh install /usr/local/bin - -``` - -Enter the API key when prompted. If you input it incorrectly you can always edit `/usr/local/bin/authy-ssh.conf` and add it again. - -Authy is now installed. However, it will not start working until it is enabled for a user. The command to enable Authy has the form: -``` -/usr/local/bin/authy-ssh enable - -``` - -With some example details for **root** logins: -``` -/usr/local/bin/authy-ssh enable root john@example.com 44 20822536476 - -``` - -If everything was successful you will see: -``` -User was registered - -``` - -You can test Authy now by running the command: -``` -authy-ssh test - -``` - -Finally, reload SSH to implement the new configuration: -``` -systemctl reload sshd.service - -``` - -Authy is now working and will be required for SSH logins. - -Now, when you log in you will see the following prompt: -``` -Authy Token (type 'sms' to request a SMS token): - -``` - -You can either enter the code from the Authy app on your phone or desktop client. Or you can type `sms` and Authy will send you an SMS message with a login code. - -Authy is uninstalled by running the following: -``` -/usr/local/bin/authy-ssh uninstall - -``` - --------------------------------------------------------------------------------- - -via: https://bash-prompt.net/guides/ssh-2fa/ - -作者:[Elliot Cooper][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://bash-prompt.net -[1]:https://github.com/google/google-authenticator-libpam -[2]:https://plus.google.com/115609618223925128756 -[3]:https://support.google.com/accounts/answer/1066447?hl=en -[4]:https://authy.com/ -[5]:https://authy.com/download/ -[6]:https://www.authy.com/signup -[7]:/images/guides/2FA/twilio-authy-api.png diff --git a/sources/tech/20171027 Scout out code problems with SonarQube.md b/sources/tech/20171027 Scout out code problems with SonarQube.md index 479f7e7921..d1ce25131c 100644 --- a/sources/tech/20171027 Scout out code problems with SonarQube.md +++ b/sources/tech/20171027 Scout out code problems with SonarQube.md @@ -1,3 +1,5 @@ +Translating by Jamkr + Scout out code problems with SonarQube ====== ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open%20source_collaboration_0.png?itok=YEl_GXbv) diff --git a/sources/tech/20180131 For your first HTML code lets help Batman write a love letter.md b/sources/tech/20180131 For your first HTML code lets help Batman write a love letter.md index 0cf4ec4040..78cb024bb4 100644 --- a/sources/tech/20180131 For your first HTML code lets help Batman write a love letter.md +++ b/sources/tech/20180131 For your first HTML code lets help Batman write a love letter.md @@ -1,3 +1,6 @@ +Translating by MjSeven + + For your first HTML code, let’s help Batman write a love letter ============================================================ @@ -553,360 +556,4 @@ We want to apply our styles to the specific div and img that we are using right
``` -and here’s how to use this id in our embedded style as a selector: - -``` -#letter-container{ - ... -} -``` - -Notice the “#” symbol. It indicates that it is an id, and the styles inside {…} should apply to the element with that specific id only. - -Let’s apply this to our code: - -``` - -``` - -``` -
-

Bat Letter

- -

- After all the battles we faught together, after all the difficult times we saw together, after all the good and bad moments we've been through, I think it's time I let you know how I feel about you. -

-``` - -``` -

You are the light of my life

-

- You complete my darkness with your light. I love: -

-
    -
  • the way you see good in the worse
  • -
  • the way you handle emotionally difficult situations
  • -
  • the way you look at Justice
  • -
-

- I have learned a lot from you. You have occupied a special place in my heart over the time. -

-

I have a confession to make

-

- It feels like my chest does have a heart. You make my heart beat. Your smile brings smile on my face, your pain brings pain to my heart. -

-

- I don't show my emotions, but I think this man behind the mask is falling for you. -

-

I love you Superman.

-

- Your not-so-secret-lover,
- Batman -

-
-``` - -Our HTML is ready with embedded styling. - -However, you can see that as we include more styles, the will get bigger. This can quickly clutter our main html file. So let’s go one step further and use linked styling by copying the content inside our style tag to a new file. - -Create a new file in the project root directory and save it as style.css: - -``` -#letter-container{ - width:550px; -} -#header-bat-logo{ - width:100%; -} -``` - -We don’t need to write `` in our CSS file. - -We need to link our newly created CSS file to our HTML file using the ``tag in our html file. Here’s how we can do that: - -``` - -``` - -We use the link element to include external resources inside your HTML document. It is mostly used to link Stylesheets. The three attributes that we are using are: - -* rel: Relation. What relationship the linked file has to the document. The file with the .css extension is called a stylesheet, and so we keep rel=“stylesheet”. - -* type: the Type of the linked file; it’s “text/css” for a CSS file. - -* href: Hypertext Reference. Location of the linked file. - -There is no at the end of the link element. So, is also a self-closing tag. - -``` - -``` - -If only getting a Girlfriend was so easy :D - -Nah, that’s not gonna happen, let’s move on. - -Here’s the content of our loveletter.html: - -``` - -
-

Bat Letter

- -

- After all the battles we faught together, after all the difficult times we saw together, after all the good and bad moments we've been through, I think it's time I let you know how I feel about you. -

-

You are the light of my life

-

- You complete my darkness with your light. I love: -

-
    -
  • the way you see good in the worse
  • -
  • the way you handle emotionally difficult situations
  • -
  • the way you look at Justice
  • -
-

- I have learned a lot from you. You have occupied a special place in my heart over the time. -

-

I have a confession to make

-

- It feels like my chest does have a heart. You make my heart beat. Your smile brings smile on my face, your pain brings pain to my heart. -

-

- I don't show my emotions, but I think this man behind the mask is falling for you. -

-

I love you Superman.

-

- Your not-so-secret-lover,
- Batman -

-
-``` - -and our style.css: - -``` -#letter-container{ - width:550px; -} -#header-bat-logo{ - width:100%; -} -``` - -Save both the files and refresh, and your output in the browser should remain the same. - -### A Few Formalities - -Our love letter is almost ready to deliver to Batman, but there are a few formal pieces remaining. - -Like any other programming language, HTML has also gone through many versions since its birth year(1990). The current version of HTML is HTML5. - -So, how would the browser know which version of HTML you are using to code your page? To tell the browser that you are using HTML5, you need to include `` at top of the page. For older versions of HTML, this line used to be different, but you don’t need to learn that because we don’t use them anymore. - -Also, in previous HTML versions, we used to encapsulate the entire document inside `` tag. The entire file was divided into two major sections: Head, inside ``, and Body, inside ``. This is not required in HTML5, but we still do this for compatibility reasons. Let’s update our code with ``, ``, `` and ``: - -``` - - - - - - -
-

Bat Letter

- -

- After all the battles we faught together, after all the difficult times we saw together, after all the good and bad moments we've been through, I think it's time I let you know how I feel about you. -

-

You are the light of my life

-

- You complete my darkness with your light. I love: -

-
    -
  • the way you see good in the worse
  • -
  • the way you handle emotionally difficult situations
  • -
  • the way you look at Justice
  • -
-

- I have learned a lot from you. You have occupied a special place in my heart over the time. -

-

I have a confession to make

-

- It feels like my chest does have a heart. You make my heart beat. Your smile brings smile on my face, your pain brings pain to my heart. -

-

- I don't show my emotions, but I think this man behind the mask is falling for you. -

-

I love you Superman.

-

- Your not-so-secret-lover,
- Batman -

-
- - -``` - -The main content goes inside `` and meta information goes inside ``. So we keep the div inside `` and load the stylesheets inside ``. - -Save and refresh, and your HTML page should display the same as earlier. - -### Title in HTML - -This is the last change. I promise. - -You might have noticed that the title of the tab is displaying the path of the HTML file: - - -![](https://cdn-images-1.medium.com/max/1000/1*PASKm4ji29hbcZXVSP8afg.jpeg) - -We can use `` tag to define a title for our HTML file. The title tag also, like the link tag, goes inside head. Let’s put “Bat Letter” in our title: - -``` -<!DOCTYPE html> -<html> -<head> - <title>Bat Letter - - - -
-

Bat Letter

- -

- After all the battles we faught together, after all the difficult times we saw together, after all the good and bad moments we've been through, I think it's time I let you know how I feel about you. -

-

You are the light of my life

-

- You complete my darkness with your light. I love: -

-
    -
  • the way you see good in the worse
  • -
  • the way you handle emotionally difficult situations
  • -
  • the way you look at Justice
  • -
-

- I have learned a lot from you. You have occupied a special place in my heart over the time. -

-

I have a confession to make

-

- It feels like my chest does have a heart. You make my heart beat. Your smile brings smile on my face, your pain brings pain to my heart. -

-

- I don't show my emotions, but I think this man behind the mask is falling for you. -

-

I love you Superman.

-

- Your not-so-secret-lover,
- Batman -

-
- - -``` - -Save and refresh, and you will see that instead of the file path, “Bat Letter” is now displayed on the tab. - -Batman’s Love Letter is now complete. - -Congratulations! You made Batman’s Love Letter in HTML. - - -![](https://cdn-images-1.medium.com/max/1000/1*qC8qtrYtxAB6cJfm9aVOOQ.jpeg) - -### What we learned - -We learned the following new concepts: - -* The structure of an HTML document - -* How to write elements in HTML (

) - -* How to write styles inside the element using the style attribute (this is called inline styling, avoid this as much as you can) - -* How to write styles of an element inside (this is called embedded styling) - -* How to write styles in a separate file and link to it in HTML using (this is called a linked stylesheet) - -* What is a tag name, attribute, opening tag, and closing tag - -* How to give an id to an element using id attribute - -* Tag selectors and id selectors in CSS - -We learned the following HTML tags: - -*

: for paragraphs - -*
: for line breaks - -*

    ,
  • : to display lists - -*
    : for grouping elements of our letter - -*

    ,

    : for heading and sub heading - -* : to insert an image - -* , : for bold and italic text styling - -*