grep 命令系列：grep 中的正则表达式

Summary: Linux 附带有 GNU grep 命令工具，它支持扩展正则表达式extended regular expressions，而且 GNU grep 在所有的 Linux 系统中都是默认有的。Grep 命令被用于搜索定位存储在您服务器或工作站上的任何信息。

是不是有个 “”找出以单词 word 结尾的行：“”下面的引用与实际内容不匹配？

不错，内容质量挺高的！

反斜线搞错了吧

反斜线搞错了吧

好！

在 Linux 、类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢？

Linux 附带有 GNU grep 命令工具，它支持<ruby> 扩展正则表达式 <rp>  （ </rp> <rt>  extended regular expressions </rt> <rp>  ） </rp></ruby>，而且 GNU grep 在所有的 Linux 系统中都是默认有的。Grep 命令被用于搜索定位存储在您服务器或工作站上的任何信息。

![](/data/attachment/album/201601/27/113023qx42fw5i561fip1z.jpg)

### 正则表达式

正则表达式就是用于匹配每行输入的一种模式，模式是指一串字符序列。下面是范例：

```
^w1
w1|w2
[^ ]

```

#### grep 正则表达式示例

在 /etc/passswd 目录中搜索 'vivek'

```
grep vivek /etc/passwd

```

输出例子:

```
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh

```

搜索大小写任意的 vivek(即不区分大小写的搜索)

```
grep -i -w vivek /etc/passwd

```

搜索大小写任意的 vivek 或 raj

```
grep -E -i -w 'vivek|raj' /etc/passwd

```

上面最后的例子显示的，就是一个扩展的正则表达式的模式。

### 锚点

你可以分别使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾。下面的例子搜索显示仅仅以 vivek 开始的输入行：

```
grep ^vivek /etc/passwd

```

输出例子:

```
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh

```

你可以仅仅只搜索出以单词 vivek 开始的行，即不显示 vivekgit、vivekg 等（LCTT 译注：即该单词后面是空格、符号等英文的单词分隔符。）

```
grep -w ^vivek /etc/passwd

```

找出以单词 word 结尾的行：

```
grep 'foo$' 文件名

```

匹配仅仅只包含 foo 的行：

```
grep '^foo$' 文件名

```

如下所示的例子可以搜索空行：

```
grep '^$' 文件名

```

### 字符类

匹配 Vivek 或 vivek：

```
grep '[vV]ivek' 文件名

```

或者

```
grep '[vV][iI][Vv][Ee][kK]' 文件名

```

也可以匹配数字 (即匹配 vivek1 或 Vivek2 等等):

```
grep -w '[vV]ivek[0-9]' 文件名

```

可以匹配两个数字字符(即 foo11、foo12 等):

```
grep 'foo[0-9][0-9]' 文件名

```

不仅仅局限于数字，也能匹配至少一个字母的:

```
grep '[A-Za-z]' 文件名

```

显示含有 "w" 或 "n" 字符的所有行：

```
grep [wn] 文件名

```

放在括号内的表达式，即包在 "[:" 和 ":]" 之间的字符类的名字，它表示的是属于此类的所有字符列表。标准的字符类名称如下：

* `[:alnum:]` - 字母数字字符
* `[:alpha:]` - 字母字符
* `[:blank:]` - 空字符: 空格键符 和 制表符
* `[:digit:]` - 数字: '0 1 2 3 4 5 6 7 8 9'
* `[:lower:]` - 小写字母: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
* `[:space:]` - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符
* `[:upper:]` - 大写字母: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'

在这个例子所示的是匹配所有大写字母:

```
grep '[:upper:]' 文件名

```

### 通配符

你可以使用 "." 来匹配单个字符。例子中匹配以 "b" 开头以 "t" 结尾的3个字符的单词：

```
grep '\<b.t\>' 文件名

```

在这儿,

* `\<` 匹配单词前面的空字符串
* `\>` 匹配单词后面的空字符串

打印出只有两个字符的所有行:

```
grep '^..$' 文件名

```

显示以一个点和一个数字开头的行：

```
grep '^\.[0-9]' 文件名

```

#### 点字符转义

下面要匹配到 IP 地址为 192.168.1.254 的正则式是不正确的：（LCTT 译注：可以匹配到该 IP 地址，但是也有可能匹配到间隔符号不是点的类似格式）

```
grep '192.168.1.254' /etc/hosts

```

三个点字符都需要转义：

```
grep '192\.168\.1\.254' /etc/hosts

```

下面的例子只能匹配出 IP 地址：（LCTT 译注：实际上由于 IP 地址中数字的取值范围，该正则表达式并不精确）

```
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' 文件名

```

### 怎么样搜索以“-” 符号开头的匹配模式？

要使用 -e 选项来搜索匹配 '--test--' 字符串，如果不使用 -e 选项，grep 命令会试图把 '--test--' 当作自己的选项参数来解析：

```
grep -e '--test--' 文件名

```

### 怎么使用 grep 的“或”匹配?

使用如下的语法：

```
grep -E 'word1|word2' 文件名
或
egrep 'word1|word2' 文件名

```

或者是

```
grep 'word1\|word2' 文件名

```

### 怎么使用 grep 的“和”匹配?

使用下面的语法来显示既包含 'word1' 又包含 'word2' 的所有行

```
grep 'word1' 文件名 | grep 'word2'

```

### 怎么样使用序列检测?

使用如下的语法，您可以检测一个字符在序列中重复出现次数：

```
{N}
{N,}
{min,max}

```

要匹配字符 “v" 出现两次：

```
egrep "v{2}" 文件名

```

下面的命令能匹配到 "col" 和 "cool" ：

```
egrep 'co{1,2}l' 文件名

```

下面的命令将会匹配出至少有三个 'c' 字符的所有行。

```
egrep 'c{3,}' 文件名

```

下面的例子会匹配 91-1234567890（即二个数字-十个数字） 这种格式的手机号。

```
grep "[[:digit:]]\{2\}[ -]\?[[:digit:]]\{10\}" 文件名

```

### 怎么样使 grep 命令高亮显示？

使用如下的语法：

```
grep --color 正则表达式 文件名

```

### 怎么样仅仅只显示匹配出的字符，而不是匹配出的行？

使用如下语法：

```
grep -o 正则表达式 文件名

```

### 正则表达式限定符

| 限定符 | 描述 |
| --- | --- |
| `.` | 匹配任意的一个字符。 |
| `?` | 匹配前面的子表达式，最多一次。 |
| `*` | 匹配前面的子表达式零次或多次。 |
| `+` | 匹配前面的子表达式一次或多次。 |
| `{N}` | 匹配前面的子表达式 N 次。 |
| `{N,}` | 匹配前面的子表达式 N 次到多次。 |
| `{N,M}` | 匹配前面的子表达式 N 到 M 次，至少 N 次至多 M 次。 |
| `-` | 只要不是在序列开始、结尾或者序列的结束点上，表示序列范围。 |
| `^` | 匹配一行开始的空字符串；也表示字符不在要匹配的列表中。 |
| `$` | 匹配一行末尾的空字符串。 |
| `\b` | 匹配一个单词前后的空字符串。 |
| `\B` | 匹配一个单词中间的空字符串。 |
| `\<` | 匹配单词前面的空字符串。 |
| `\>` | 匹配单词后面的空字符串。 |

#### grep 和 egrep

egrep 等同于 **grep -E** 。它会以扩展的正则表达式的模式来解释模式。下面来自 grep 的帮助页：

>
> 基本的正则表达式元字符 ?、+、 {、 |、 ( 和 ) 已经失去了它们原来的意义，要使用的话用反斜线的版本 \?、\+、\{、\|、\( 和 \) 来代替。 传统的 egrep 并不支持 { 元字符，一些 egrep 的实现是以 \{ 替代的，所以一个可移植的脚本应该避免在 grep -E 使用 { 符号，要匹配字面的 { 应该使用 [}]。
>
>
> GNU grep -E 试图支持传统的用法，如果 { 出在在无效的间隔规范字符串这前，它就会假定 { 不是特殊字符。
>
>
> 例如，grep -E '{1' 命令搜索包含 {1 两个字符的串，而不会报出正则表达式语法错误。
>
>
> POSIX.2 标准允许这种操作的扩展，但在可移植脚本文件里应该避免这样使用。
>
>
>

参考:

* grep 和 regex 帮助手册页(7)
* grep 的 info 页

---

via: <http://www.cyberciti.biz/faq/grep-regular-expressions/>

作者：Vivek Gite 译者：[runningwater](https://github.com/runningwater) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 基金会引发巨大争议，它到底是企业的还是草根的？

没有企业支持，纯草根项目很难一直支撑下去，毕竟键盘党的叫嚣没什么用。

同意，靠 RMS 那样的理念太虚幻。

话语权争夺战中，最先被流放的显然是个人

早期的开源是一种精神，现在重要的开源主要是商业公司混不下去了，无法占稳市场，索性开源，即使如何，如果后面没有商业支持，后续的支持也是一落千丈，有人总号称开源有源码后，无支持后顾之忧，素不知，没有实力的支持是空谈

>
> 开源界爆发了一场“Linux基金会到底是姓‘企业’还是姓‘草根’？”的争论。
>
>
>

Linux 圈一直以来争议不断，无论 [Sarah Sharp](http://www.zdnet.com/article/linux-developer-who-took-on-linus-torvalds-over-abuse-quits-toxic-kernel-community/) 愤而离开了 [Linux 内核邮件列表（LKML）](https://lkml.org/)，还是 [Matthew Garrett 去单干了](http://www.zdnet.com/article/matthew-garrett-is-not-forking-linux/)，往往连这些顶级开发者都深陷争议之中。甚至连 Linus Torvalds 也是以口无遮拦著称，[对看不上的代码就破口大骂](http://www.zdnet.com/article/linux-4-3-released-after-linus-torvalds-scraps-brain-damage-code/)。

![Linux 基金会](/data/attachment/album/201601/28/083904qwrxpkka9mkldrrl.png)

而最近成为争议焦点的 <ruby>   Linux 基金会  <rp>  （ </rp> <rt>  The Linux Foundation </rt> <rp>  ） </rp></ruby>不但是一个支持 Linux 的非盈利组织，而且也支持了越来越多的开源项目，比如 SDN 方面的 [OpenDaylight](https://www.opendaylight.org/)、容器方面的 <ruby>   Open Container Initiative  <rp>  （ </rp> <rt>  开放容器计划 </rt> <rp>  ） </rp></ruby>，以及 R 语言方面的 <ruby>   R Consortium  <rp>  （ </rp> <rt>  R 语言联盟 </rt> <rp>  ） </rp></ruby>等。

[CoreOS](https://coreos.com/) 的安全开发人员 Garrett 最近披露，Linux 基金会[悄悄修改了其法律条款](/article-6916-1.html)，**不再允许基金会的个人会员选举董事成员**。Garrett 写到，“Linux 基金会的董事主要是由其企业会员选出的：10个来自白金会员（年费50万美金），3个来自金牌会员（年费10万美金），1个来自银牌会员（根据公司规模不同，年费在5千到2万美金）。直到最近，个人会员（年费99美元）还能够选举两位董事成员，以在董事会层面代表社区的意见。”

为什么 Linux 基金会要这样做？Garrett 猜测是因为 Karen Sandler，她是<ruby>   软件自由保护协会  <rp>  （ </rp> <rt>  Software Freedom Conservancy </rt></ruby> （SFC）的执行董事，该组织[致力于非常重要的 GPL 开源许可证的执法工作](https://mjg59.dreamwidth.org/38992.html)，她正在谋求[竞选 Linux 基金会的董事](https://sfconservancy.org/blog/2016/jan/17/karen-LF-candidacy/)。Garrett 说，“Linux 基金会的‘<ruby> 个人会员 <rp>  （ </rp> <rt>  Individual membership </rt> <rp>  ） </rp></ruby>’被悄然改为‘<ruby> 个人支持者 <rp>  （ </rp> <rt>  Individual supporter </rt> <rp>  ） </rp></ruby>’，而之前承诺的可以参选和选举董事的权利被删除了（可以比较[新版本](https://www.linuxfoundation.org/about/join/individual)和[旧版本](http://web.archive.org/web/20150321165558/https://www.linuxfoundation.org/about/join/individual)）。”

Garrett 指出，“（Linux 基金会）一直以来就对 GPL 执法并不热心，而 SFC 正在[资助](https://sfconservancy.org/news/2015/mar/05/vmware-lawsuit/)一起针对其董事会成员（VMware）违反了 GPL 的诉讼。时间上也许是巧合，但是看起来像是 Linux 基金会为了避免在董事会内出现关于 GPL 方面的执法提案而扔掉了其代表了社区的伪装。”

由于 Linux 基金会主席 Jim Zemlin 前几天在中国开会，[访问互联网和收发电子邮件受限](http://www.linuxfoundation.org/news-media/blogs/browse/2016/01/linux-foundation-update)，所以对这两天社区里面发生的争论没有及时回复。

Zemlin 对此反驳道：“[Linux 基金会的董事会结构没有改变过](http://www.linuxfoundation.org/news-media/blogs/browse/2016/01/linux-foundation-update)。个人仍然可以成为董事，来自企业和个人的董事比例也没有变化。我们做这件事之前经过了长期讨论，这十年来的首次改变可以为个人支持者带来更多的价值。而**招募来自社区的董事的流程会变得和业界其它的顶尖组织一样**。”

Zemlin 继续说道：“董事会投票继续留任 Larry Augustin [[SugarCRM](https://www.sugarcrm.com/) 的 CEO] 和 Bdale Garbee [[惠普企业](http://hpe.com/) 的 CTO 办公室研究员] 作为个人<ruby> 非执行董事 <rp>  （ </rp> <rt>  At-Large Director </rt> <rp>  ） </rp></ruby> ，以表彰他们对社区的长期服务及对 Linux 基金会的个人参与。内核开发者们也会继续任命一位董事，我们欢迎并认可 Grant Likely 继续以这种身份参与进来。随着时间的推移，Linux 基金会董事会也许会从日益增长的社区增加更多的个人董事。”

他补充道：“我们知道社区政策很重要，而且当发生改变时会有不同的观点碰撞。这是正常的、健康的。但是经常在开发者社区中爆发的‘口水战’则是不健康的。不幸的是，现在发生的事情就是这样，对 Linux 基金会的这个政策改变的争论现在变成了个人的、不合适的攻击，尤其是针对我们社区中的某些成员，特别是 Karen Sandler 的攻击。”

“Karen，” Zemlin 继续说，“在她的职业生涯中致力于推动和捍卫自由软件。因为这些线上的讨论和攻击关系到了 Linux 基金会，我觉得有必要毫不含糊的指出，Linux 基金会对此绝不容忍，并随时会针对这种放任自流的网上行为作出斗争！”

我完全赞同 Zemlin 的这番反对的立场，但是我觉得 Garrett 和 Zemlin 说的不是一个事情，眼前的问题是：“Sandler 是否仍然可以竞选董事？”，我问过 Linux 基金会，但是没有得到答案。

在我看来，这场争论背后的真正的问题是，是谁在控制 Linux 基金会？是用户还是公司？

Garrett 认为 Linux 基金会正在远离社区而投入企业的怀抱。Zemlin 并没有特别谈到这个问题，但是令人注意的是，他说“招募来自社区的董事的流程会变得和业界其它的顶尖组织一样。”

此外，正如 Garrett 指出的，个人不再有“[竞选和投票支持 Linux 基金会董事会席位的能力](http://web.archive.org/web/20150321165558/https://www.linuxfoundation.org/about/join/individual)，从而影响基金会的发展方向。”

就个人而言，我认为这是 Linux 基金会进一步走向了被企业控制。不过，正如俗话说的，谁请客谁买单，这也没什么好奇怪的。

开源用户喜欢“社区”这个概念，然而这十来年，“社区”已经变成了企业高管和公司雇员了。只有最理想化的开源开发者和领导者，（令人感到讽刺的是，）以及开源最热切的敌人们仍然认为 Linux 和开源项目是由个人所创建和控制的。

此外，Linux 基金会的绝大多数董事会成员都是由公司选择的。不过，对于 Linux 基金会的这个决定我看的不顺眼。Linux 始于个人项目，其迅猛发展得益于大量程序员的支持，总应该在 Linux 基金会里面有一个为个人而不是为公司说话的地方。

我希望 Sandler，这位强力、才华横溢的开源领袖，不仅能被允许参与竞选，而且能赢得董事会席位。我也希望 Linux 基金会恢复个人参选和投票董事的权利。这要求并不多，这将恢复人们对 Linux 基金会的信心，让我们觉得它并不仅仅只有大公司的位置，也有小小的个人的位置。


grep 命令系列：使用 grep 命令来搜索多个单词

Summary: 要使用 grep 命令来搜索多个字符串或单词，我们该怎么做？例如我想要查找 /path/to/file 文件中的 word1、word2、word3 等单词，我怎么样命令 grep 查找这些单词呢？ grep 命令支持正则表达式匹配模式。要使用多单词搜索，请使用如下语法： grep 'word1\|word2\|word3' /path/to/file  下的例子中，要在一个名叫 /var/log/messages 的文本日志文件中查找 warning、error 和 critical 这几个单词，输入： $ grep 'warning\|error\|critical' /var/log/messages  仅仅只是要匹配单词（即该词两侧是单词分界符，针对西方以空格分隔的语言而言

要使用 grep 命令来搜索多个字符串或单词，我们该怎么做？例如我想要查找 /path/to/file 文件中的 word1、word2、word3 等单词，我怎么样命令 grep 查找这些单词呢？

[grep 命令支持正则表达式](/article-6941-1.html)匹配模式。要使用多单词搜索，请使用如下语法：

```
grep 'word1\|word2\|word3' /path/to/file

```

下的例子中，要在一个名叫 /var/log/messages 的文本日志文件中查找 warning、error 和 critical 这几个单词，输入：

```
$ grep 'warning\|error\|critical' /var/log/messages

```

仅仅只是要匹配单词（即该词两侧是单词分界符，针对西方以空格分隔的语言而言）的话，可以加上 -w 选项参数：

```
$ grep -w 'warning\|error\|critical' /var/log/messages

```

egrep 命令可以跳过上面的语法格式，其使用的语法格式如下：

```
$ egrep -w 'warning|error|critical' /var/log/messages

```

我建义您们加上 -i (忽略大小写) 和 --color 选项参数，如下示：

```
$ egrep -wi --color 'warning|error|critical' /var/log/messages

```

输出示例：

![Fig.01: Linux / Unix egrep Command Search Multiple Words Demo Output](/data/attachment/album/201601/29/065939cdl9o5xd1o29ol9p.png)

图一: Linux / Unix egrep 命令查找多个单词输出例子

---

via: <http://www.cyberciti.biz/faq/searching-multiple-words-string-using-grep/>

作者：Vivek Gite 译者：[runningwater](https://github.com/runningwater) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


grep 命令系列：用 grep 命令统计匹配字符串的行数

Summary: 在 Linux 或 UNIX 操作系统下，对于给定的单词或字符串，我们应该怎么统计它们在每个输入文件中存在的行数呢？  您需要通过添加 -c 或者 --count 选项参数来抑制正常的输出。它将会显示对输入文件单词匹配的行数，如下所示： $ grep -c vivek /etc/passwd  或者 $ grep -w -c vivek /etc/passwd  输出的示例: 1  相反的，使用 -v 或者 --invert 选项参数可以统计出不匹配的输入文件行数，键入： $ grep -c vivek /etc/passwd  输出的示例: 45   via: http://www.cyberciti.biz/faq/grep-count-lines-if-a-string-word-matches/ 作者：Vive

在 Linux 或 UNIX 操作系统下，对于给定的单词或字符串，我们应该怎么统计它们在每个输入文件中存在的行数呢？

![](/data/attachment/album/201601/29/070409oun9deokc0clkkez.jpg)

您需要通过添加 -c 或者 --count 选项参数来抑制正常的输出。它将会显示对输入文件单词匹配的行数，如下所示：

```
$ grep -c vivek /etc/passwd

```

或者

```
$ grep -w -c vivek /etc/passwd

```

输出的示例:

```
1

```

相反的，使用 -v 或者 --invert 选项参数可以统计出不匹配的输入文件行数，键入：

```
$ grep -c vivek /etc/passwd

```

输出的示例:

```
45

```

---

via: <http://www.cyberciti.biz/faq/grep-count-lines-if-a-string-word-matches/>

作者：Vivek Gite 译者：[runningwater](https://github.com/runningwater) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


KDE 的19年进化历程

不少实用、新颖功能，就是相比win桌面bug不断

建议贵站可以考虑增加 “余下全文”功能。

视频和图片全挂了

确实相当的华丽@！～

一般我们不分页，这是因为这个文章的图太大，太多了。。

kde4之后的版本比较好看，前面三个大版本ui比较乱啊，看来可以换kde玩玩了。<br />
小编可以考虑再来一个gnome的版本发展史

来自安徽合肥的 Internet Explorer 11.0|Windows 7 用户

看来看去，还是gnome简单好用啊，unity其实也不错

对kde是无比的喜欢啊！！

### 概述

KDE – 史上功能最强大的桌面环境之一；开源且可自由使用。19年前，1996年10月14日，德国程序员 Matthias Ettrich 开始了这个美观的桌面环境的开发。KDE 提供了用户界面以及其他很多日常使用的程序。今日，KDE 被成千上万人在 Unix 和 Windows 上使用。19年，一个对软件项目而言极为漫长的年岁。现在是时候让我们回到最初，看看这一切肇始于何处。

![](/data/attachment/album/201607/09/092813oufgdpuf4w8l4w14.jpg)

K Desktop Environment（KDE）有很多创新之处：新设计，美观，一致的体验，易于使用，对普通用户和专业用户都足够强大的应用库。“KDE”这个名字是对单词<ruby> “通用桌面环境” <rp>  （ </rp> <rt>  Common Desktop Environment </rt> <rp>  ） </rp></ruby>玩的一个简单谐音游戏，“K”即“Cool”。 第一代 KDE 在双许可证授权下使用了 Trolltech 公司专利的 Qt framework（现 Qt 的前身），这两个许可证分别是开源的 QPL（Q public license）和<ruby> 商业专利许可证 <rp>  （ </rp> <rt>  proprietary commercial license </rt> <rp>  ） </rp></ruby>。在2000年 Trolltech 公司让一部分 Qt 软件库开始发布在 GPL 证书下; Qt 4.5 发布在了 LGPL 2.1 许可证下。自2009起 KDE 桌面环境由三部分构成：Plasma Workspaces（用做交互界面），KDE Applications，作为 KDE Software 编译的 KDE Platform。

各发布版本
-----

### 预发布版本 – 1996年10月14日

![](/data/attachment/album/201601/29/080552b56119trtfzhh00r.png)

当时名称为 Kool Desktop Environment；“Kool”这个单词在很快就被弃用了。最初，所有 KDE 的组件都是被单独发布在开发社区里的，它们并没有被一个大的项目所贯穿起来。开发组邮件列表中的首选通信是发往 [kde@fiwi02.wiwi.uni-Tubingen.de](mailto:kde@fiwi02.wiwi.uni-Tubingen.de) 邮件列表。

### KDE 1.0 – 1998年7月12日

![](/data/attachment/album/201601/29/080553wpyoopprwlpdwd09.png)

这个版本受到了颇有争议的反馈。很多人反对使用 Qt 框架，因为当时的 FreeQt 许可证和自由软件许可证并不兼容，他们建议开发组使用 Motif 或者 LessTif 替代。尽管有着这些反对声，KDE 仍然被很多用户所青睐，并且成功作为第一个 Linux 发行版的环境被集成了进去。

![28 January 1999](/data/attachment/album/201601/29/080555sqqc111x5d1a1aa7.png)

*1999年1月28日*

有一次升级，**K Desktop Environment 1.1**，更快，更稳定的同时加入了很多小的改进。这个版本同时也加入了很多新的图标，背景和材质纹理。和这些全面翻新同时出现的还有 Torsten Rahn 绘制的全新 KDE 图标----一个放在齿轮前的字母 K ；这个图标的修改版也一直沿用至今。

### KDE 2.0 – 2000年10月23日

![](/data/attachment/album/201601/29/080556hhn9h3h4qs0y0qsh.png)

重大更新：

* DCOP (Desktop COmmunication Protocol)，一个端到端的通信协议
* KIO，一个应用程序 I/O 库
* KParts，组件对象模型
* KHTML，一个符合 HTML 4.0 标准的渲染绘制引擎。

![26 February 2001](/data/attachment/album/201601/29/080557hqmzqcq15qsod6dd.png)

*2001年2月26日*

**K Desktop Environment 2.1** 首次发布了媒体播放器 noatun，它使用了模组化、插件设计。为了便利开发者，K Desktop Environment 2.1 打包了 KDevelop。

![15 August 2001](/data/attachment/album/201601/29/080600iy3w2lx42f1eby46.png)

*2001年8月15日*

**KDE 2.2**版本在 GNU/Linux 上加快了50%的应用启动速度，同时提高了 HTML 渲染、JavaScript 稳定性和性能，同时还增加了一些 KMail 的功能。

### KDE 3.0 – 2002年4月3日

![](/data/attachment/album/201601/29/080602nj32hyd828ydw4fp.png)

K Desktop Environment 3.0 加入了更好的限制使用功能，这个功能在电话亭、网咖，企业公用电脑上被广泛需求，它可以禁止用户完全使用软件的某些能力。

![28 January 2003](/data/attachment/album/201601/29/080603fafu14dhd3uuwfpa.png)

*2003年1月28日*

**K Desktop Environment 3.1** 加入了新的默认窗口（Keramik）和图标样式（Crystal）和其他一些改进。

![3 February 2004](/data/attachment/album/201601/29/080604nq256msd1i5zo22m.png)

*2004年2月3日*

**K Desktop Environment 3.2** 加入了诸如在网页表格、书写邮件中拼写检查的新功能；增强了邮件和日历功能。完善了 Konqueror 中的标签机制和对 Microsoft Windows 桌面共享协议（RDP）的支持。

![19 August 2004](/data/attachment/album/201601/29/080608dil9hce9j266azm6.png)

*2004年8月19日*

**K Desktop Environment 3.3** 侧重于组合不同的桌面组件。Kontact 被放进了群件应用 Kolab 并与 Kpilot 结合。Konqueror 的加入让 KDE 有了更好的 IM 交流功能，比如支持发送文件，以及其他 IM 协议（如IRC）的支持。

![16 March 2005](/data/attachment/album/201601/29/080609v77j8qj8e63ms936.png)

*2005年3月16日*

**K Desktop Environment 3.4** 侧重于提高易用性。这次更新为 Konqueror、Kate、KPDF 加入了文字-语音转换功能；也在桌面系统中加入了独立的 KSayIt 文字-语音转换软件。

![29 November 2005](/data/attachment/album/201601/29/080611fplq9l4qqxzj4bbi.png)

*2005年11月29日*

**The K Desktop Environment 3.5** 发布加入了 SuperKaramba，为桌面环境提供了易于安装的<ruby> 插件 <rp>  （ </rp> <rt>  widgets </rt> <rp>  ） </rp></ruby>机制。 Konqueror 加入了广告屏蔽功能并成为了有史以来第二个通过 Acid2 CSS 测试的浏览器。

### KDE SC 4.0 – 2008年1月11日

![](/data/attachment/album/201601/29/080614dy07ks0f828lywe8.png)

大部分的开发投身于把最新的技术和开发框架整合进 KDE 4 当中。Plasma 和 Oxygen 是两次最大的用户界面风格变更。同时，Dolphin 替代 Konqueror 成为默认文件管理器，Okular 成为了默认文档浏览器。

![29 July 2008](/data/attachment/album/201601/29/080617xnxjxoslmkfixoww.png)

*2008年7月29日*

**KDE 4.1** 引入了一个在 PIM 和 Kopete 中共享使用的表情主题系统；引入了可以让用户便利地从互联网上一键下载数据的 DXS。同时引入了 GStreamer、QuickTime 和 DirectShow 9 Phonon 后端。加入了新应用如：

* Dragon Player
* Kontact
* Skanlite — 扫描仪软件
* Step —— 物理模拟软件
* 新游戏: Kdiamond、Kollision、KBreakout 和更多......

![27 January 2009](/data/attachment/album/201601/29/080618itns63jgkz08022w.png)

*2009年1月27日*

**KDE 4.2** 被认为是在已经极佳的 KDE 4.1 基础上的又一次全面超越，同时也成为了大多数用户替换旧 3.5 版本的完美选择。

![4 August 2009](/data/attachment/album/201601/29/080620fkk0s71slslikkis.png)

*2009年8月4日*

**KDE 4.3** 修复了超过10000个 bug，同时加入了让近2000个用户要求的功能。整合一些新的技术例如：PolicyKit、NetworkManage & Geolocation services 等也是这个版本的一大重点。

![9 February 2010](/data/attachment/album/201601/29/080622r2zy2q2vs6yoyzlp.png)

*2010年2月9日*

**KDE SC 4.4** 基于 Qt 4 toolkit 的 4.6 版本，加入新的应用 KAddressBook。

![10 August 2010](/data/attachment/album/201601/29/080624tspeseuuouvxnqgs.png)

*2010年8月10日*

**KDE SC 4.5** 增加了一些新特性：整合了开源的浏览器引擎 WebKit 库，其现在也在 Apple Safari 和 Google Chrome 中广泛使用。KPackageKit 替换了 Kpackage。

![26 January 2011](/data/attachment/album/201601/29/080625sppzoouu44bbqp8y.png)

*2011年1月26日*

**KDE SC 4.6** 加强了 OpenGl 的性能，同时照常更新了无数bug和小改进。

![27 July 2011](/data/attachment/album/201601/29/080627mdwo88spw6hvp3d0.png)

*2011年7月27日*

**KDE SC 4.7** 升级 KWin 以兼容 OpenGL ES 2.0 ，更新了 Qt Quick，Plasma Desktop 带来许多增强和在应用里的大量新特性， 修复了1.2万个 bug。

![25 January 2012](/data/attachment/album/201601/29/080629gv48254ng49vfccr.png)

*2012年1月25日*

**KDE SC 4.8**: 更好的 KWin 性能与 Wayland 支持，更崭新的 Doplhin 的外观设计。

![1 August 2012](/data/attachment/album/201601/29/080633bzlslp56nxp18a1m.png)

*2012年8月1日*

**KDE SC 4.9**: 向 Dolphin 文件管理器增加了一些更新，比如重新加入了实时文件重命名，鼠标辅助按钮支持，更好的位置面板和更多文件分类管理功能。

![6 February 2013](/data/attachment/album/201601/29/080635s1i62c46a6cz4234.png)

*2013年2月6日*

**KDE SC 4.10**: 很多 Plasma 插件使用 QML 重写； Nepomuk、Kontact 和 Okular 得到了很大程度的性能和功能提升。

![14 August 2013](/data/attachment/album/201601/29/080637axx3xvjmwjyyjqmu.png)

*2013年8月14日*

**KDE SC 4.11**: Kontact 和 Nepomuk 有了很多优化。 第一代 Plasma Workspaces 进入了单纯维护阶段。

![18 December 2013](/data/attachment/album/201601/29/080638t236r3r2y30c34k3.png)

*2013年12月18日*

**KDE SC 4.12**: Kontact 得到了极大的提升，包括许多小的改进。

![16 April 2014](/data/attachment/album/201601/29/080640kdttukdk44br9df9.png)

*2014年4月16日*

**KDE SC 4.13**: Nepomuk 语义搜索功能替代了桌面上的原有的 Baloo 搜索。 KDE SC 4.13 以53个语言版本发布。

![20 August 2014](/data/attachment/album/201601/29/080644olckk4ictbtsfbcs.png)

*2014年8月20日*

**KDE SC 4.14**: 这个发布版本侧重于稳定性提升：大量的 bug 修复和增加了一些小的功能。这是最后一个 KDE SC 4 发布版本。

### KDE Plasma 5.0 – 2014年7月15日

![](/data/attachment/album/201601/29/080646pdqds4a3uqdq7svw.png)

KDE Plasma 5 – 第五代 KDE。大幅改进了设计和系统，新的默认主题 Breeze 完全迁移到了 QML，更好的 OpenGL 性能，更完美的 HiDPI （高分辨率）显示支持。

![11 November 2014](/data/attachment/album/201601/29/080647alf49aa7mabfahww.png)

*2014年11月11日*

**KDE Plasma 5.1**：迁移了从 Plasma 4 里丢失的功能。

![27 January 2015](/data/attachment/album/201601/29/080648r66yf5fiyiscy5ih.png)

*2015年1月27日*

**KDE Plasma 5.2**：新组件：BlueDevil、KSSHAskPass、Muon、SDDM 主题设置、KScreen、GTK+ 样式设置和 KDecoration。

![28 April 2015](/data/attachment/album/201601/29/080650t6yh346vhv3yyzov.png)

*2015年4月28日*

**KDE Plasma 5.3**：Plasma Media Center 技术预览。新的蓝牙和触摸板小程序；改良了电源管理。

![25 August 2015](/data/attachment/album/201601/29/080652to1gglz8xy1kgxoc.png)

*2015年8月25日*

**KDE Plasma 5.4**：Wayland 登场，新的基于 QML 的音频管理程序，一个全屏的程序启动器替代品。

万分感谢 [KDE](https://www.kde.org/) 开发者及社区，并感谢 Wikipedia 为书写 [概述](https://en.wikipedia.org/wiki/KDE_Plasma_5) 带来的帮助，同时，感谢所有读者。让我们保持自由精神（be free）并继续支持如同 KDE 一样的开源的自由软件发展。

---

via: <https://tlhp.cf/kde-history/>

作者：[Pavlo Rudyi](https://tlhp.cf/author/paul/) 译者：[jerryling315](https://github.com/jerryling315) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


grep 命令系列：从文件中搜索并显示文件名

Summary: 我怎样从几个文件中搜索（grep），并只显示匹配到的文件的文件名？  当你从不止一个的文件中搜索时，默认它将显示文件名： grep "word" 文件名 grep root /etc/*  示例输出： /etc/bash.bashrc: See "man sudo_root" for details. /etc/crontab:17 * * * * root cd /  run-parts --report /etc/cron.hourly /etc/crontab:25 6 * * * root test -x /usr/sbin/anacron || ( cd /  run-parts --report /etc/cron.daily ) /etc/crontab:47 6 * * 7 root test -x /usr/sbin/anacron || ( cd /  run-parts --report /etc/cron.weekly ) /etc/cro

我怎样从几个文件中搜索（grep），并只显示匹配到的文件的文件名？

![](/data/attachment/album/201601/30/141554p7wzr4u1lol0kd40.jpg)

当你从不止一个的文件中搜索时，默认它将显示文件名：

```
grep "word" 文件名
grep root /etc/*

```

示例输出：

```
/etc/bash.bashrc:       See "man sudo_root" for details.
/etc/crontab:17 *       * * *   root    cd / && run-parts --report /etc/cron.hourly
/etc/crontab:25 6       * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
/etc/crontab:47 6       * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
/etc/crontab:52 6       1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
/etc/group:root:x:0:
grep: /etc/gshadow: Permission denied
/etc/logrotate.conf:    create 0664 root utmp
/etc/logrotate.conf:    create 0660 root utmp

```

每行开始的第一个部分是文件名（如：/etc/crontab、/etc/group）。使用 -l 选项可以只显示文件名：

```
grep -l "string" filename
grep -l root /etc/*

```

示例输出：

```
/etc/aliases
/etc/arpwatch.conf
grep: /etc/at.deny: Permission denied
/etc/bash.bashrc
/etc/bash_completion
/etc/ca-certificates.conf
/etc/crontab
/etc/group

```

你也可以逆转输出；使用 -L 选项来输出**那些不匹配的文件的文件名**：

```
grep -L "word" filename
grep -L root /etc/*

```

示例输出：

```
/etc/apm
/etc/apparmor
/etc/apparmor.d
/etc/apport
/etc/apt
/etc/avahi
/etc/bash_completion.d
/etc/bindresvport.blacklist
/etc/blkid.conf
/etc/bluetooth
/etc/bogofilter.cf
/etc/bonobo-activation
/etc/brlapi.key

```

---

via: <http://www.cyberciti.biz/faq/grep-from-files-and-display-the-file-name/>

作者：Vivek Gite 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


grep 命令系列：如何在 UNIX 中根据文件内容查找文件

Summary: 为了完成课程作业，我写了很多 C 语言代码并把它们保存为 /home/user/c/*.c 和 *.h。那么在 UNIX shell 窗口中我如何能通过字符串或者单词（例如函数名 main()）文件内容来查找文件呢？  你需要用到以下工具：  grep 命令 ： 输出匹配模式的行。  find 命令： 在目录层次中查找文件。 使用 grep 命令根据内容查找文件 输入以下命令： grep 'string' *.txt grep 'main(' *.c grep '#includeexample.h' *.c grep 'getChar*' *.c grep -i 'ultra' *.conf grep -iR 'ultra' *.conf  其中  -i ： 忽略模式（匹配字符串 valid、 VALID、 ValID

为了完成课程作业，我写了很多 C 语言代码并把它们保存为 /home/user/c/\*.c 和 \*.h。那么在 UNIX shell 窗口中我如何能通过字符串或者单词（例如函数名 main()）文件内容来查找文件呢？

![](/data/attachment/album/201601/30/142415eb8bz8oz420182x8.jpg)

你需要用到以下工具：

[a] **grep 命令** ： 输出匹配模式的行。

[b] **find 命令**： 在目录层次中查找文件。

### [使用 grep 命令根据内容查找文件](http://www.cyberciti.biz/faq/howto-search-find-file-for-text-string/)

输入以下命令：

```
grep 'string' *.txt
grep 'main(' *.c
grep '#include<example.h>' *.c
grep 'getChar*' *.c
grep -i 'ultra' *.conf
grep -iR 'ultra' *.conf

```

其中

* **-i** ： 忽略模式（匹配字符串 valid、 VALID、 ValID ）和输入文件（匹配 file.c FILE.c FILE.C）的大小写。
* **-R** ： 递归读取每个目录下的所有文件。

### 高亮匹配到的模式

在搜索大量文件的时候你可以轻松地高亮模式：

```
$ grep --color=auto -iR 'getChar();' *.c

```

### 为查找到的模式显示文件名和行号

你也许需要显示文件名和行号：

```
$ grep --color=auto -iRnH 'getChar();' *.c

```

其中，

* **-n** ： 在输出的每行前面添加以 1 开始的行号。
* **-H** ： 为每个匹配打印文件名。要搜索多个文件时这是默认选项。（LCTT 译注：-h 选项强制隐藏文件名；另外 -l 和 -L 选项用于仅显示匹配/不匹配的文件名，而 -H 和 -h用于控制在显示匹配行前显示/不显示文件名，注意区分。）

```
$grep --color=auto -nH 'DIR' *
```

输出样例：

![Fig.01: grep 命令显示搜索到的模式](/data/attachment/album/201601/30/142614k0kfszpz1y1kpdyh.png)

*图 01: grep 命令显示搜索到的模式*

你也可以使用 find 命令：

```
$ find . -name "*.c" -print | xargs grep "main("

```

---

via: <http://www.cyberciti.biz/faq/unix-linux-finding-files-by-content/>

作者：Vivek Gite 译者：[ictlyh](http://mutouxiaogui.cn/blog/) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


grep 命令系列：如何只查看配置文件中未被注释的有效配置行

Summary: 大多数的Linux和类Unix系统的配置文件中都有许多的注释行，但是有时候我只想看其中的有效配置行。那我怎么才能只看到quid.conf或httpd.conf这样的配置文件中的非注释命令行呢？怎么去掉这些注释或者空行呢？ 我们可以使用 UNIX/BSD/OS X/Linux 这些操作系统自身提供的 grep，sed，awk，perl或者其他文本处理工具来查看配置文件中的有效配置命令行。  grep 命令示例去掉注释 可以按照如下示例使用grep命令: $ grep -v "^#" /path/to/config/file $ grep -v "^#" /etc/apache2/apache2.conf  示例输出: ServerRoot "/etc/apache2" LockFile

大多数的Linux和类Unix系统的配置文件中都有许多的注释行，但是有时候我只想看其中的有效配置行。那我怎么才能只看到quid.conf或httpd.conf这样的配置文件中的非注释命令行呢？怎么去掉这些注释或者空行呢？

我们可以使用 UNIX/BSD/OS X/Linux 这些操作系统自身提供的 grep，sed，awk，perl或者其他文本处理工具来查看配置文件中的有效配置命令行。

![](/data/attachment/album/201601/30/143321m5gfoa1uicniv7dz.jpg)

### grep 命令示例——去掉注释

可以按照如下示例使用grep命令:

```
$ grep -v "^#" /path/to/config/file
$ grep -v "^#" /etc/apache2/apache2.conf

```

示例输出:

```
ServerRoot "/etc/apache2"

LockFile /var/lock/apache2/accept.lock

PidFile ${APACHE_PID_FILE}

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 15

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_event_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

DefaultType text/plain

HostnameLookups Off

ErrorLog /var/log/apache2/error.log

LogLevel warn

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Include /etc/apache2/httpd.conf

Include /etc/apache2/ports.conf

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined

Include /etc/apache2/conf.d/

Include /etc/apache2/sites-enabled/

```

想要跳过其中的空行，可以使用 [egrep 命令](http://www.cyberciti.biz/faq/grep-regular-expressions/), 示例:

```
egrep -v "^#|^$" /etc/apache2/apache2.conf
## or pass it to the page such as more or less ##
egrep -v "^#|^$" /etc/apache2/apache2.conf | less

## Bash function ######################################
## or create function or alias and use it as follows ##
## viewconfig /etc/squid/squid.conf                  ##
#######################################################
viewconfig(){
   local f="$1"
   [ -f "$1" ] && command egrep -v "^#|^$" "$f" || echo "Error $1 file not found."
}

```

示例输出:

![Fig.01: Unix/Linux Egrep Strip Out Comments Blank Lines](/data/attachment/album/201601/30/143444bovvlitdoqlhukof.jpg)

*图 01: Unix/Linux Egrep 除去注释行和空行*

### 理解 grep/egrep 命令行选项

-v 选项，选择出不匹配的命令行。该选项适用于所有基于posix的系统。正则表达式 `^$` 匹配出所有的非空行， `^#` 匹配出所有的不以“#”开头的非注释行。

### sed 命令示例

可以按照如下示例使用 GNU 上的 sed 命令:

```
$ sed '/ *#/d; /^ *$/d' /path/to/file
$ sed '/ *#/d; /^ *$/d' /etc/apache2/apache2.conf

```

GNU 或 BSD 上的 sed 也可以修改配置文件。下面的命令的作用是原地编辑文件，并以特定（比如 .bak）备份文件：

```
sed -i'.bak.2015.12.27' '/ *#/d; /^ *$/d' /etc/apache2/apache2.conf

```

更多信息见参考手册 - [grep(1)](http://www.manpager.com/linux/man1/grep.1.html), [sed(1)](http://www.manpager.com/linux/man1/sed.1.html)。

---

via: <http://www.cyberciti.biz/faq/shell-display-uncommented-lines-only/>

作者：Vivek Gite 译者：[sonofelice](https://github.com/sonofelice) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


理查德·斯托曼经典语录集锦

Summary: Richard Matthew Stallman (RMS) – 神级程序员之一。他是一名程序员，是 GCC、GDB、Emacs 的构建者，软件自由的传教士，GNU Project 和 FSF 的创办人。

Facebook is not your friend, it is a surveillance engine.

Facebook 不是你的朋友，是监控引擎。

Wechat/Weibo/QQ/xx Zone are not your friends, they are a surveillance engine.

微信、微博、QQ、xx空间……不是你的朋友，它们都是监控引擎

我把那个视频上传到我的YouTube频道里了：

https://youtu.be/SZzoFEnFpyI

难道我文章里面的两个视频你看不到么？

&quot;The computer industry is the only industry that is more fashion-driven than women's fashion.

计算机行业是唯一一个比女人们的时装更时髦的行业。&quot;

此处翻译不太恰当，fashion-driven这里做adj讲。建议参考这里(http://www.fortunechina.com/technology/c/2011-11/07/content_77845.htm)中文第五段及其对应的英文。该文的翻译是&quot;计算机行业是唯一一个比女性时装更容易受时尚驱动的行业了&quot;。然而程序社区一般不会用&quot;时尚&quot;这个词，而且&quot;女性时装&quot;也不是很准确。我建议应翻译为&quot;计算机行业是唯一一个比女性时尚业更容易受潮流影响的行业了&quot;

PS：为什么财富那里说是甲骨文老总说的。。。我只是核对翻译的时候偶然发现的- -具体谁说的我也不知道哦~

嗯，经过仔细斟酌，我认为你的意见是对的。

最初译者的翻译是“计算机行业是唯一一个比时尚女装更被时尚驱动的行业。”，个人感觉难以表达，所以我校对成“计算机行业是唯一一个比女人们的时装更时髦的行业。”。

目前看起来，还是你的翻译比较贴切，谢谢，我修改下文章~

也欢迎大家对这篇中的翻译提出更多的宝贵意见！

要浏览网页，我需要给一个守护进程发 mail，然后它会运行 wget 并把页面通过 mail 发还给我。

看来，走在前面的人都不需要WEB，因为他们就在创造WEB的内容。

而走在后面的人，很需要WEB，只有这样才能找到方向。

不然，我认为这是偏执~

纯技术，不谈社会

此处“偏执”无贬义，只是我们都做不到罢了。

能看到

潮流推动你不得不用那些监控引擎，这让人感到沮丧和无力！

![理查德·马修·斯托曼（Richard Matthew Stallman, RMS)](/data/attachment/album/201601/30/155522ah6y3kskr5ek2mzk.jpg)

（题图来自：wikimedia）

<ruby> 理查德·马修·斯托曼 <rp>  （ </rp> <rt>  Richard Matthew Stallman </rt> <rp>  ） </rp></ruby> (RMS) – 神级程序员之一。他是一名程序员，是 GCC、GDB、Emacs 的构建者，软件自由的传教士，[GNU Project](http://www.gnu.org/) 和 [FSF](http://www.fsf.org/) 的创办人。

**GNU** 是 “GNU’s Not Unix!”的递归缩写。GNU 是一系列用于基于 Unix 的操作系统的自由软件集合。它能用于 GNU/Hurd 和 Linux 内核。于1983年9月27日公诸于众。常用组件有：

* GNU Compiler Collection (GCC)
* GNU C library (glibc)
* GNU Core Utilities (coreutils)
* GNU Debugger (GDB)
* GNU Binary Utilities (binutils)
* GNU Bash shell
* GNOME desktop environment

<ruby> 自由软件基金会 <rp>  （ </rp> <rt>  Free Software Foundation </rt> <rp>  ） </rp></ruby> (FSF) – 一个自由软件的非营利组织，致力于推进计算机用户的自由和捍卫他们的权力。于 1985年10月4日成立。阅读[更多](https://www.fsf.org/about/)。

许多人不理解<ruby> 开源代码 <rp>  （ </rp> <rt>  open source code </rt> <rp>  ） </rp></ruby>和<ruby> 自由软件 <rp>  （ </rp> <rt>  free software </rt> <rp>  ） </rp></ruby>的区别。每个程序都应该是自由软件：

* 与目的无关，随心运行程序的自由（自由0）。
* 学习程序如何运作，并改变它为你所用的自由（自由1）。可以访问源码是这一条的前提。
* 重新发布副本的自由，如此你便可以帮助你周围的人（自由 2）。
* 发布自己修改版本给他人的自由（自由 3）。这样能让整个社区有机会从你的改变中受益。可以访问源码是这条的前提。

以上为自由软件的四项自由原则。

以下为理查德·斯托曼关于自由、软件、社交、哲学等方面的名言摘引。

#### **关于 Facebook：**

>
> Facebook is not your friend, it is a surveillance engine.
>
>
>

Facebook 不是你的朋友，是监控引擎。

#### **关于 Android：**

>
> Android is very different from the GNU/Linux operating system because it contains very little of GNU. Indeed, just about the only component in common between Android and GNU/Linux is Linux, the kernel.
>
>
>

Android 和 GNU/Linux 有很大的区别，因为其中几乎没有 GNU。的确，Android 和 GNU/Linux 之间仅有一个共同组件，那就是内核 - Linux。

#### **关于计算机行业：**

>
> The computer industry is the only industry that is more fashion-driven than women's fashion.
>
>
>

计算机行业是唯一一个比女性时尚业更容易受潮流影响的行业了。（LCTT 译注：感谢 BIAOXYZ 的修正意见。）

#### **关于云计算：**

>
> The interesting thing about cloud computing is that we've redefined cloud computing to include everything that we already do.
>
>
>

关于云计算，有趣的是我们已经重新定义了云计算来包含我们曾干过的所有事。

#### **关于伦理：**

>
> Whether gods exist or not, there is no way to get absolute certainty about ethics. Without absolute certainty, what do we do? We do the best we can.
>
>
>

无论神存在与否，都没有绝对的伦理道德。没有这份理所当然，我们该如何？也唯有尽善吧。

#### **关于自由：**

>
> Free software is software that respects your freedom and the social solidarity of your community. So it's free as in freedom.
>
>
>

自由软件是尊重个人自由和社会团结的软件。所以才能如自由般自由自在。

#### **关于目标和理想：**

>
> If you want to accomplish something in the world, idealism is not enough - you need to choose a method that works to achieve the goal.
>
>
>

如果你想为这世界做些什么，仅有理想是不够的，你需要找条通往目标的道路并走完。

#### **关于分享：**

>
> Sharing is good, and with digital technology, sharing is easy.
>
>
>

分享很棒，而且数字化技术也使分享变得容易。

#### **关于 facebook（进阶版）：**

>
> Facebook mistreats its users. Facebook is not your friend; it is a surveillance engine. For instance, if you browse the Web and you see a 'like' button in some page or some other site that has been displayed from Facebook. Therefore, Facebook knows that your machine visited that page.
>
>
>

Facebook 蹂躏它们的用户。它不是你们的朋友；它就是个监控引擎。举个例子，你是否曾在一些网页或网站上看到 Facebook 的 “like” 按键。对，Facebook 知道你的电脑曾访问过那些网页。

#### **关于 web 应用：**

>
> One reason you should not use web applications to do your computing is that you lose control.
>
>
>

给你个为什么不应该使用 web 应用的理由，因为你失去了计算机的控制权。

>
> If you use a proprietary program or somebody else's web server, you're defenceless. You're putty in the hands of whoever developed that software.
>
>
>

如果你使用私有程序或他人的 web 服务器，那么你只能任人鱼肉。被软件的开发者轻易操纵。

#### **关于书：**

>
> With paper printed books, you have certain freedoms. You can acquire the book anonymously by paying cash, which is the way I always buy books. I never use a credit card. I don't identify to any database when I buy books. Amazon takes away that freedom.
>
>
>

印刷出来的书，当然是自由的。你可以付现金匿名买书，这也是我一直买书的方式。我绝不会使用信用卡，我买书时不会被任何数据库记下。是亚马逊把自由夺走了。

#### **关于 MPAA：**

>
> Officially, MPAA stands for Motion Picture Association of America, but I suggest that MPAA stands for Malicious Power Attacking All.
>
>
>

MPAA 其实是<ruby> 美国电影协会 <rp>  （ </rp> <rt>  Motion Picture Association of America </rt> <rp>  ） </rp></ruby>，但我认为叫做<ruby> 攻击万物的邪恶力量 <rp>  （ </rp> <rt>  Malicious Power Attacking All </rt> <rp>  ） </rp></ruby>更为合适。

#### **关于金钱与职业：**

>
> I could have made money this way, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place.
>
>
>

我可以找份工作赚钱，并沉浸在编码的快乐中。但在职业生涯结束后，回首目睹自己筑就的高墙将人与人分隔开，我会觉得我耗尽毕生精力只换来了一个更糟糕的世界。

#### **关于私有软件：**

>
> Proprietary software keeps users divided and helpless. Divided because each user is forbidden to redistribute it to others, and helpless because the users can't change it since they don't have the source code. They can't study what it really does. So the proprietary program is a system of unjust power.
>
>
>

私有软件使用户孤立、无助。因为禁止将软件给他人使用所以孤立，因为无法改变源码所以无助。他们不能学习其中真正的工作方式，所以整个私有软件体系就是一种不公的力量。

#### **关于智能手机：**

>
> A smartphone is a computer - it's not built using a computer - the job it does is the job of being a computer. So, everything we say about computers, that the software you run should be free - you should insist on that - applies to smart phones just the same. And likewise to those tablets.
>
>
>

智能手机就是电脑 —— 虽然做的和常用的电脑不同 —— 但是却能干电脑能干的活。所以我们所说的一切有关于电脑上的软件应该能自由运行 —— 必须坚持这一点 —— 在智能手机上也是这样，当然也包括平板。

#### **关于 CD 和数字内容：**

>
> CD stores have the disadvantage of an expensive inventory, but digital bookshops would need no such thing: they could write copies at the time of sale on to memory sticks, and sell you one if you forgot your own.
>
>
>

CD 商店有一个弱势就是需要昂贵的库存，但是电子商店就没有这方面的需求：他们只需要将售卖的副本写入记忆棒，并在你忘带自己的记忆棒时卖你一个就是了。

#### **关于<ruby> 竞争范式 <rp>  （ </rp> <rt>  paradigm of competition </rt> <rp>  ） </rp></ruby>：**

>
> The paradigm of competition is a race: by rewarding the winner, we encourage everyone to run faster. When capitalism really works this way, it does a good job; but its defenders are wrong in assuming it always works this way.
>
>
>

竞争范式就像是赛跑：奖励胜者，鼓励每一个跑得更快的人。当资本主义真的这样运作时，当然是件好事；但是维护它的人若是假设它一直这样运作的话那就大错特错了。

#### **关于 vi 和 emacs：**

>
> People sometimes ask me if it is a sin in the Church of Emacs to use vi. Using a free version of vi is not a sin; it is a penance. So happy hacking.
>
>
>

有时会有人问我在 Emacs 的阵营使用 vi 是不是一种罪过。使用自由版的 vi 并不是一种罪过；是一种自我惩罚。所以好好享受其中乐趣吧。

#### **关于自由和历史：**

>
> Value your freedom or you will lose it, teaches history. 'Don't bother us with politics', respond those who don't want to learn.
>
>
>

历史告诉我们不珍惜自由便失去自由，然而有的人不懂吸取教训，只知道说“别拿政治烦我们”。（LCTT 译注：感谢 肖岚 的修正意见。）

#### **关于专利：**

>
> Fighting patents one by one will never eliminate the danger of software patents, any more than swatting mosquitoes will eliminate malaria.
>
>
>

和专利一个一个的战斗并不能解决软件专利带来的危害，就像打再多的蚊子也消灭不了疟疾一样。

>
> Software patents are dangerous to software developers because they impose monopolies on software ideas.
>
>
>

软件专利对于软件的开发者来说十分危险，因为它们加剧了对于软件理念的垄断。

#### **关于版权：**

>
> In practice, the copyright system does a bad job of supporting authors, aside from the most popular ones. Other authors' principal interest is to be better known, so sharing their work benefits them as well as readers.
>
>
>

其实，版权制度对作者也没有什么好处，撇开最受欢迎的那个，其他作者的主旨可能更好理解，所以分享无论对他们还是你的读者都是一件好事。

#### **关于工作与报酬：**

>
> There is nothing wrong with wanting pay for work, or seeking to maximize one's income, as long as one does not use means that are destructive.
>
>
>

劳有所得，或寻求收入的最大化并没有什么错，只要不是不择手段。

#### **关于 Chrome OS：**

>
> In essence, Chrome OS is the GNU/Linux operating system. However, it is delivered without the usual applications, and rigged up to impede and discourage installing applications.
>
>
>

Chrome OS 确实是 GNU/Linux 的操作系统。但是，它在发布时没有安装常用应用，并为安装他们设置了阻碍。

#### **关于 Linux 用户：**

>
> Many users of the GNU/Linux system will not have heard the ideas of free software. They will not be aware that we have ideas, that a system exists because of ethical ideals, which were omitted from ideas associated with the term 'open source.'
>
>
>

许多的 GNU/Linux 用户并没有听过自由软件。他们并没有意识到，这个系统是因为道德理想才存在的，与此一起被忽视的还有所谓的“开源”。

#### **关于 facebook 的隐私：**

>
> If there is a Like button in a page, Facebook knows who visited that page. And it can get IP address of the computer visiting the page even if the person is not a Facebook user.
>
>
>

如果页面上有 “like” 按键，Facebook 就能知道谁访问了页面。即使不是 Facebook 的用户，也可以得到访问该页面电脑的 IP 地址。

#### **关于编程：**

>
> Programming is not a science. Programming is a craft.
>
>
>

编程不是科学，编程是手艺。

>
> My favorite programming languages are Lisp and C. However, since around 1992 I have worked mainly on free software activism, which means I am too busy to do much programming. Around 2008 I stopped doing programming projects.
>
>
>

Lisp 和 C 语言是我的最爱。然自 1992 年以来我主要工作在自由软件活动上，导致我太忙了，没法做更多的编程。大概在 2008 年我便停止了做编程项目。

>
> C++ is a badly designed and ugly language. It would be a shame to use it in Emacs.
>
>
>

C++ 设计的真糟糕、真丑陋。在 Emacs 上用它应该觉得羞愧。

#### **关于<ruby> 钻研 <rp>  （ </rp> <rt>  hacking </rt> <rp>  ） </rp></ruby>和学习编程：**

>
> People could no longer learn hacking the way I did, by starting to work on a real operating system, making real improvements. In fact, in the 1980s I often came across newly graduated computer science majors who had never seen a real program in their lives. They had only seen toy exercises, school exercises, because every real program was a trade secret. They never had the experience of writing features for users to really use, and fixing the bugs that real users came across. The things you need to know to do real work.
>
>
>

(时过境迁，)人们没法再像我当初那样通过改进实实在在的操作系统来学习编程了。上世纪 80 年代，我常遇见计算机专业的毕业生，有生以来没见过真正的程序。他们接触的到的只有小玩意和学校的作业，因为每一个程序都是商业机密。他们没有机会为用户去写真正实用的特性，修复用户真正遭遇的问题。而这些正是真正的工作中你需要掌握的(东西)。（LCTT 译注：感谢 肖岚 的改进意见。）

>
> It is hard to write a simple definition of something as varied as hacking, but I think what these activities have in common is playfulness, cleverness, and exploration. Thus, hacking means exploring the limits of what is possible, in a spirit of playful cleverness. Activities that display playful cleverness have "hack value".
>
>
>

对于如“hacking”这般多样化的东西真的很难简单的下定义，不过在我看来诸如此类的行为都会有以下的这些共同点：嬉乐、智慧和探索。因此，hacking 意味着对可能的极限的探索，一颗向往快乐与智慧的心。能带来快乐与智慧的行为就有 “hack 的价值” 。

#### **关于浏览网页：**

>
> For personal reasons, I do not browse the web from my computer. (I also have no net connection much of the time.) To look at page I send mail to a daemon which runs wget and mails the page back to me. It is very efficient use of my time, but it is slow in real time.
>
>
>

出于个人原因，我不会在我的电脑上浏览网页。（大部分时间处于没有网络连接的状态。）要浏览网页，我需要给一个守护进程发 mail，然后它会运行 wget 并把页面通过 mail 发还给我。这对我而言已经是最效率了，但那真的比实时慢太多了。

#### **关于音乐共享：**

>
> Friends share music with each other, they don't allow themselves to be divided by a system that says that nobody is supposed to have copies.
>
>
>

朋友之间彼此分享音乐，绝不会希望因为系统的一句：“禁止私下拷贝！”而生分。

---

via: <https://tlhp.cf/fsf-richard-stallman/>

作者：[Pavlo Rudyi](https://tlhp.cf/fsf-richard-stallman/) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Facebook 将关闭 Parse 服务，并将其代码开源

Facebook 于2013年花费了 8500 万美元收购了 Parse ，这是一家为移动应用提供后台开发云服务的平台。而今，由于 Parse 一直以来未能为 Facebook 提供预期的营收，Facebook 决定一年后将其正式关闭，并将其代码开源。

![](/data/attachment/album/201601/31/100721fu3461getmetmrv4.jpg)

Parse 的 CTO Kevin Lacker [在博客上说](http://blog.parse.com/announcements/moving-on/)：“我们很荣幸帮助了这么多的开发者开发了如此多的优秀移动应用，不过我们今后需要专注在其它的事情上了。”

MBaaS 市场正在不断整合，特别是在 [Facebook 收购了 Parse](http://venturebeat.com/2013/04/25/facebook-acquires-parse-to-enter-world-of-mobile-backend-services/) 之后。 Parse 的许多老员工纷纷辞职，这其中[包括](http://venturebeat.com/2015/08/28/parse-ceo-ilya-sukhar-is-leaving-facebook/) Parse 的前 CEO Ilya Sukhar。不像 Instagram，Facebook 从未将 Parse 从 AWS 上移到自己的数据中心。虽然 Facebook [一直在更新 Parse 的功能](http://venturebeat.com/2015/10/22/facebook-parse-now-lets-you-easily-deploy-apps-to-heroku/)，即使在其[开源了 SDK](http://venturebeat.com/2015/08/13/facebook-is-open-sourcing-its-parse-sdks-starting-with-ios-android-and-mac-os-x/) 之后还是如此，但目前看起来 Facebook 已经对此彻底失望了。

Parse 提供了开发移动应用的后台服务，包括数据存储、消息推送及用户管理等等。这样开发者可专注于客户端的开发商，而不用操心太多服务器端的问题。Parse 的用户包括 Quip 和 Orbitz 等大公司，不过 Parse 并没能为 Facebook 贡献很好的营收。此外，AWS、微软 Azure 和谷歌的 GCP 都为构建和部署移动应用提供了快速交付和增强工具。

在宣布了服务即将关闭之后，Parse 也提供了[数据迁移工具](http://blog.parse.com/announcements/introducing-parse-server-and-the-database-migration-tool/)，以便用户可以将应用迁移到 MongoDB 数据库上去。此外，Parse 还发布了[开源版的 Parse 服务器](http://blog.parse.com/announcements/introducing-parse-server-and-the-database-migration-tool/)，可以运行在你自己的 Node.js 服务器上。这样用户的应用可以在新的数据库上，用自己的 Parse 服务器支持绝大部分原有的 Parse API，对于客户端的影响很小。

参考来源：[parse.com](http://blog.parse.com/announcements/moving-on/)，[venturebeat.com](http://venturebeat.com/2016/01/28/facebook-is-shutting-down-its-parse-cloud-service-on-january-28-2017/)。


Linux/Unix 桌面趣事：终端上的圣诞树

Summary: 给你的Linux或Unix控制台创造一棵圣诞树玩玩吧。在此之前，需要先安装一个Perl模块，命名为Acme::POE::Tree。这是一棵很喜庆的圣诞树，我已经在Linux、OSX和类Unix系统上验证过了。  安装 Acme::POE::Tree 安装perl模块最简单的办法就是使用CPAN（Perl综合典藏网（Comprehensive Perl Archive Network））。打开终端，把下面的指令敲进去便可安装Acme::POE::Tree。 ### 以root身份运行 ### perl -MCPAN -e 'install Acme::POE::Tree'  示例输出： Installing /home/vivek/perl5/man/man3/POE::NFA.3pm Installing /home/vivek/perl5/man/m

有没有直接做成背景的？Ctrl+c  就停止的有些蛋疼。

给你的Linux或Unix控制台创造一棵圣诞树玩玩吧。在此之前，需要先安装一个Perl模块，命名为Acme::POE::Tree。这是一棵很喜庆的圣诞树，我已经在Linux、OSX和类Unix系统上验证过了。

![](/data/attachment/album/201602/01/074714oic0s80gy91swsgn.jpg)

### 安装 Acme::POE::Tree

安装perl模块最简单的办法就是使用CPAN（Perl综合典藏网（Comprehensive Perl Archive Network））。打开终端，把下面的指令敲进去便可安装Acme::POE::Tree。

```
### 以root身份运行 ###
perl -MCPAN -e 'install Acme::POE::Tree'

```

**示例输出：**

```
Installing /home/vivek/perl5/man/man3/POE::NFA.3pm
Installing /home/vivek/perl5/man/man3/POE::Kernel.3pm
Installing /home/vivek/perl5/man/man3/POE::Loop.3pm
Installing /home/vivek/perl5/man/man3/POE::Resource.3pm
Installing /home/vivek/perl5/man/man3/POE::Filter::Map.3pm
Installing /home/vivek/perl5/man/man3/POE::Resource::SIDs.3pm
Installing /home/vivek/perl5/man/man3/POE::Loop::IO_Poll.3pm
Installing /home/vivek/perl5/man/man3/POE::Pipe::TwoWay.3pm
Appending installation info to /home/vivek/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/perllocal.pod
  RCAPUTO/POE-1.367.tar.gz
  /usr/bin/make install  -- OK
  RCAPUTO/Acme-POE-Tree-1.022.tar.gz
  Has already been unwrapped into directory /home/vivek/.cpan/build/Acme-POE-Tree-1.022-uhlZUz
  RCAPUTO/Acme-POE-Tree-1.022.tar.gz
  Has already been prepared
Running make for R/RC/RCAPUTO/Acme-POE-Tree-1.022.tar.gz
cp lib/Acme/POE/Tree.pm blib/lib/Acme/POE/Tree.pm
Manifying 1 pod document
  RCAPUTO/Acme-POE-Tree-1.022.tar.gz
  /usr/bin/make -- OK
Running make test
PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/01_basic.t .. ok
All tests successful.
Files=1, Tests=2,  6 wallclock secs ( 0.09 usr  0.03 sys +  0.53 cusr  0.06 csys =  0.71 CPU)
Result: PASS
  RCAPUTO/Acme-POE-Tree-1.022.tar.gz
Tests succeeded but one dependency not OK (Curses)
  RCAPUTO/Acme-POE-Tree-1.022.tar.gz
  [dependencies] -- NA

```

### 在Shell中显示圣诞树

只需要在终端上运行以下命令：

```
perl -MAcme::POE::Tree -e 'Acme::POE::Tree->new()->run()'

```

**示例输出**

![Gif 01: An animated christmas tree in Perl](/data/attachment/album/201602/01/074728o5nouo5nfljt8515.gif)

Gif 01: 一棵用Perl写的喜庆圣诞树

### 树的定制

以下是我的脚本文件tree.pl的内容：

```
#!/usr/bin/perl

use Acme::POE::Tree;
my $tree = Acme::POE::Tree->new(
{
  star_delay => 1.5,  # shimmer star every 1.5 sec
  light_delay => 2,   # twinkle lights every 2 sec
  run_for => 10,      # automatically exit after 10 sec
}
);
$tree->run();

```

这样就可以通过修改star*delay、run*for和light\_delay参数的值来自定义你的树了。一棵好玩的终端圣诞树就此诞生。

---

via: <http://www.cyberciti.biz/open-source/command-line-hacks/linux-unix-desktop-fun-christmas-tree-for-your-terminal/>

作者：Vivek Gite 译者：[soooogreen](https://github.com/soooogreen) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Mutt 邮件客户端中使用密文密码

Summary: Mutt 是一个 Linux/UNIX 终端环境下的开源的邮件客户端。Mutt 以及 Alpine 在 Linux 命令行爱好者中有着最忠诚的追随者，这不是没有原因的。想一下你所期待邮件客户端应有的功能，Mutt 拥有：多协议支持（例如，POP3、IMAP 和 SMTP），S/MIME 和 PGP/GPG 集成，会话线索，颜色标记，可定制宏/快捷键，等等。另外，基于命令行的 Mutt 相比粗重的基于浏览器的邮件客户端（如：Gmail，Ymail）或图形用户界面的邮件客户端（如：Thunderbird，MS Outlook）而言，是一个使用电子邮件的轻量级替代品。  当你想使用 Mutt 通过公司的 SMTP/IMAP 服

这个很不错！采用了！

守护进程运行的时候，如果别人执行gpg -d ~/.mutt/password.gpg，能获得私密文件的内容吗？

Mutt 是一个 Linux/UNIX 终端环境下的开源的邮件客户端。Mutt 以及 [Alpine](http://xmodulo.com/gmail-command-line-linux-alpine.html) 在 Linux 命令行爱好者中有着最忠诚的追随者，这不是没有原因的。想一下你所期待邮件客户端应有的功能，Mutt 拥有：多协议支持（例如，POP3、IMAP 和 SMTP），S/MIME 和 PGP/GPG 集成，会话线索，颜色标记，可定制宏/快捷键，等等。另外，基于命令行的 Mutt 相比粗重的基于浏览器的邮件客户端（如：Gmail，Ymail）或图形用户界面的邮件客户端（如：Thunderbird，MS Outlook）而言，是一个使用电子邮件的轻量级替代品。

![](/data/attachment/album/201602/01/083701duf08vc9tu0mb5f0.png)

当你想使用 Mutt 通过公司的 SMTP/IMAP 服务器访问或发送邮件，或取代网页邮件服务，可能所关心的一个问题是如何保护您的邮件凭据（如：SMTP/IMAP 密码），它们存储在一个纯文本 Mutt 配置文件（~/.muttrc）中。

对于这些人对安全的担忧，确实有一个容易的方法来**加密 Mutt 配置文件**\*，以防止这种风险。在这个教程中，我描述了如何加密 Mutt 敏感配置，比如使用 GnuPG（GPG）加密 SMTP/IMAP 密码，GPG 是一个开源的 OpenPGP 实现。

### 第一步 （可选）：创建 GPG 密钥

因为我们将要使用 GPG 加密 Mutt 配置文件，如果你没有 GPG 密钥，第一步就是创建一个（公钥/私钥对）。如果有，请忽略这步。

创建一个新 GPG 密钥，输入下面命令：

```
$ gpg --gen-key

```

选择密钥类型（RSA），密钥长度（2048 bits），和过期时间（0 代表不过期）。当出现用户 ID 提示时，输入关联到该公钥/私钥对的名字（Dan Nanni） 和邮箱地址（[myemail@email.com](mailto:myemail@email.com)）。最后，输入一个密码来保护你的私钥。

![](/data/attachment/album/201602/01/083704z2v8tovoo3si83sp.jpg)

生成一个 GPG 密钥需要大量的随机字节来构成熵，所以在生成密钥期间确保在你的系统上执行一些随机行为（如：敲打键盘，移动鼠标或者读写磁盘）。根据密钥长度，生成 GPG 密钥要花几分钟或更多时间。

![](/data/attachment/album/201602/01/083705aaov3g8h6626ahbo.jpg)

### 第二步：加密 Mutt 敏感配置

下一步，在 ~/.mutt 目录创建一个新的文本文件，然后把一些你想隐藏的 Mutt 敏感配置放进去。这个例子里，我指定了 SMTP/IMAP 密码。

```
$ mkdir ~/.mutt
$ vi ~/.mutt/password

```

---

```
set smtp_pass="XXXXXXX"
set imap_pass="XXXXXXX"

```

现在通过 GPG 使用你的公钥加密这个文件如下：

```
$ gpg -r myemail@email.com -e ~/.mutt/password

```

这将创建 ~/.mutt/password.gpg，这是一个原始文件的 GPG 加密版本。

然后删除 ~/.mutt/password，只保留 GPG 加密版本。

### 第三步：创建完整 Mutt 配置文件

现在你已经在一个单独的文件放置了加密的 Mutt 敏感配置，你可以在 ~/.muttrc 指定其余的 Mutt 配置。然后增加下面这行在 ~/.muttrc 末尾。

```
source "gpg -d ~/.mutt/password.gpg |"

```

当你启动 Mutt 时，这行将解密 ~/.mutt/password.gpg ，然后将解密内容应用到你的 Mutt 配置中。

下面展示一个完整 Mutt 配置例子，这可以让你通过 Mutt 访问 Gmail，而没有暴露你的 SMTP/IMAP 密码。用你的 Gmail ID 替代下面的 `yourgmailaccount`，此外你也需要在[你的 Goolgle 账户设置](https://www.google.com/settings/u/1/security)中启用“支持不太安全的应用访问”。

```
set from = "yourgmailaccount@gmail.com"
set realname = "Your Name"
set smtp_url = "smtp://yourgmailaccount@smtp.gmail.com:587/"
set imap_user = "yourgmailaccount@gmail.com"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed = "+[Google Mail]/Drafts"
set trash = "+[Google Mail]/Trash"
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
set move = no
set imap_keepalive = 900

# encrypted IMAP/SMTP passwords
source "gpg -d ~/.mutt/password.gpg |"

```

### 第四步（可选）：配置 GPG 代理

这时候，你将可以使用加密了IMAP/SMTP 密码的 Mutt。然而，每次你运行 Mutt，你都要先被提示输入一个 GPG 密码来使用你的私钥解密 IMAP/SMTP 密码。

![](/data/attachment/album/201602/01/083705a5c41ukuug11c94u.jpg)

如果你想避免这样的 GPG 密码提示，你可以部署一个 gpg-agent。它以后台守护进程方式运行，gpg-agent 可以安全地缓存你的 GPG 密码，无需手工干预，gpg 可以自动从 gpg-agent 获得你的 GPG 密码。如果你正在使用 Linux 桌面，你可以配置使用一些等同于 gpg-agent 的特定的桌面软件，例如，GNOME 桌面的 gnome-keyring-daemon。

你可以在基于 Debian 系统安装 gpg-agent：

```
$ sudo apt-get install gpg-agent

```

gpg-agent 在基于 Red Hat 的系统上是预装好的。

现在增加下面这些到你的 .bashrc 文件中。

```
envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
    eval "$(cat "$envfile")"
else
    eval "$(gpg-agent --daemon --allow-preset-passphrase --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO

```

重载 .bashrc，或简单的登出然后重新登录。

```
$ source ~/.bashrc

```

现在确认 GPG*AGENT*INFO 环境变量已经设置妥当。

```
$ echo $GPG_AGENT_INFO

/tmp/gpg-0SKJw8/S.gpg-agent:942:1

```

并且，当你输入 gpg-agent 命令时，你应该看到下面的信息。

```
$ gpg-agent

gpg-agent: gpg-agent running and available

```

一旦 gpg-agent 启动运行，它将会在第一次提示你输入密码时缓存你的 GPG 密码。随后你多次运行 Mutt ，都不会被提示要 GPG 密码（gpg-agent 一直开着，缓存就不会过期）。

![](/data/attachment/album/201602/01/083705ata698opak9x8pok.jpg)

### 结论

在这个指导里，我提供一个使用 GnuPG 加密如 SMTP/IMAP 密码这样的 Mutt 敏感配置的方法。注意，如果你想在 Mutt 上使用 GnuPG 来加密或签名你的邮件，你可以参考[官方指南](http://dev.mutt.org/trac/wiki/MuttGuide/UseGPG)关于 GPG 与 Mutt 结合的部分。

如果你知道任何使用 Mutt 的安全技巧，欢迎分享它。

---

via: <http://xmodulo.com/mutt-email-client-encrypted-passwords.html>

作者：[Dan Nanni](http://xmodulo.com/author/nanni) 译者：[wyangsun](https://github.com/wyangsun) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用丰富的256色装点你的终端

黑白有黑白的美丽，谁不希望世界是多姿多彩的。

不知道怎么应用啊

有颜色看起来醒目多了

颜色控走起！

怎么下载不了啊

终端并不只是黑白两色，虽然使用终端可以提高效率，但是这并不意味着我们只能面对非黑即白的界面。也许你的终端的某些应用在展示部分内容时已经使用了16色了，但是这在当今难免感觉还不够细腻。其实，很多终端，比如 xterm、urxvt，以及 Mac OSX 中的 Iterm.app 等都可以支持256色，可以在这些终端下看到更加细腻优雅的颜色表现。

这里涉及到了几个重要的程序的配置，供大家参考。注意，不是所有的终端和命令行应用都支持256色。

### vim

![](/data/attachment/album/201602/01/095323ic3hepoxmlpbomeo.png)

能够区分不同的黄色，可以让你的 vim 看起来更加漂亮。[点此下载配色文件](http://avalon.gnuzifer.de/~heipei/linux/files/configs/calmar256-dark.vim)，配色文件可按如下引入到你的 vim 配置中：

```
if $TERM == "xterm" || $TERM == "rxvt" || $TERM == "xterm-256color" || $TERM == "rxvt-unicode" || &term =~ "builtin_gui" || $TERM == "dumb"
	set t_Co=256
	colorscheme calmar256-dark
else
	colorscheme desert
endif

```

### mutt

![](/data/attachment/album/201602/01/095324yt0wlsm022kbrfos.png)

[配色方案在此](http://avalon.gnuzifer.de/~heipei/linux/files/configs/mutt_color_256)，可以通过 source 引入到你的 .muttrc 中：

```
source ~/.mutt/mutt_color_256
```

### slrn

![](/data/attachment/album/201602/01/095324famgmiziwbziwk2w.png)

slrn 支持256色，但是很多元素不支持颜色区分。[配色直接写在配置文件中](http://avalon.gnuzifer.de/~heipei/linux/files/configs/slrnrc)。

### git

![](/data/attachment/album/201602/01/095325ltlfydsyldccyfcc.png)

看看 git log 的输出，是不是更柔和了？[配置文件在此](http://avalon.gnuzifer.de/~heipei/linux/files/configs/gitconfig)。

### man / less

![](/data/attachment/album/201602/01/095325oqbs531mbwfcezwq.png)

对于 Xterm/Urxvt，改变终端的前景/背景/粗体/下划线/斜体的颜色，可以让 less 显示更好的高亮效果。而 less 被用在 man 页面显示中，所以你会发现你的 man 显示更漂亮了。[配置文件在此](http://avalon.gnuzifer.de/~heipei/linux/files/configs/Xdefaults)。

另外，可以在你的 `$LESS` 环境变量中添加 `-J` 选项，这样在搜索某个内容时，结果所在行的前面会显示一个“\*”。

### 窗口状态条

很多人喜欢在终端窗口的下方显示一个状态条，尤其是在使用 screen 将窗口分割成几个子窗口时。

![](/data/attachment/album/201602/01/095326x4hg2yd4g7de4eys.png)

[配置文件在此](http://avalon.gnuzifer.de/~heipei/linux/files/configs/screenrc)。

### ls

![](/data/attachment/album/201602/01/095326opzb4qwhekb6hpzh.png)

ls 的彩色输出也可以更好一些。[配置文件在此](http://avalon.gnuzifer.de/~heipei/linux/files/configs/dircolors)。

### grep

你可以设置 grep 以绿色显示匹配内容：

```
export GREP_COLOR='01;32'	# color grep matches green
alias grep='grep --color'
```

你是不是也有一些配色方案？欢迎分享。


如何将 Debian Linux 中的默认的 Python 版本切换为替代版本

这个挺实用的。

非常使用的文章，收藏了@！～

不错

支持原创有经验的文章，感谢。

5年过去了，让我们用现在 Debian 的方式吧：

sudo apt install python-is-python3

或者

sudo apt install python-is-python2 （现在除了旧项目，还有人在用 Python2 吗？）

![](/data/attachment/album/201602/02/200935ozyiiydviid2igyq.jpg)

当你安装 Debian Linux 时，安装过程有可能同时为你提供多个可用的 Python 版本，因此系统中会存在多个 Python 的可执行二进制文件。你可以按照以下方法使用 `ls` 命令来查看你的系统中都有那些 Python 的二进制文件可供使用。

```
$ ls /usr/bin/python*
/usr/bin/python  /usr/bin/python2  /usr/bin/python2.7  /usr/bin/python3  /usr/bin/python3.4  /usr/bin/python3.4m  /usr/bin/python3m

```

执行如下命令查看默认的 Python 版本信息:

```
$ python --version
Python 2.7.8

```

### 1、基于用户修改 Python 版本：

想要为某个特定用户修改 Python 版本，只需要在其 home 目录下创建一个 `alias`(别名) 即可。打开该用户的 `~/.bashrc` 文件，添加新的别名信息来修改默认使用的 Python 版本。

```
alias python='/usr/bin/python3.4'

```

一旦完成以上操作，重新登录或者重新加载 `.bashrc` 文件，使操作生效。

```
$ . ~/.bashrc

```

检查当前的 Python 版本。

```
$ python --version
Python 3.4.2

```

### 2、 在系统级修改 Python 版本

我们可以使用 `update-alternatives` 来为整个系统更改 Python 版本。以 root 身份登录，首先罗列出所有可用的 python 替代版本信息：

```
# update-alternatives --list python
update-alternatives: error: no alternatives for python

```

如果出现以上所示的错误信息，则表示 Python 的替代版本尚未被 `update-alternatives` 命令识别。想解决这个问题，我们需要更新一下替代列表，将 `python2.7` 和 `python3.4` 放入其中。

```
# update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives: using /usr/bin/python2.7 to provide /usr/bin/python (python) in auto mode
# update-alternatives --install /usr/bin/python python /usr/bin/python3.4 2
update-alternatives: using /usr/bin/python3.4 to provide /usr/bin/python (python) in auto mode

```

`--install` 选项使用了多个参数用于创建符号链接。最后一个参数指定了此选项的优先级，如果我们没有手动来设置替代选项，那么具有最高优先级的选项就会被选中。这个例子中，我们为 `/usr/bin/python3.4` 设置的优先级为2，所以 `update-alternatives` 命令会自动将它设置为默认 Python 版本。

```
# python --version
Python 3.4.2

```

接下来，我们再次列出可用的 Python 替代版本。

```
# update-alternatives --list python
/usr/bin/python2.7
/usr/bin/python3.4

```

现在开始，我们就可以使用下方的命令随时在列出的 Python 替代版本中任意切换了。

```
# update-alternatives --config python

```

![](/data/attachment/album/201602/02/200957z4622lp83l3z0kmr.png)

```
# python --version
Python 2.7.8

```

### 3、移除替代版本

一旦我们的系统中不再存在某个 Python 的替代版本时，我们可以将其从 `update-alternatives` 列表中删除掉。例如，我们可以将列表中的 python2.7 版本移除掉。

```
# update-alternatives --remove python /usr/bin/python2.7
update-alternatives: removing manually selected alternative - switching python to auto mode
update-alternatives: using /usr/bin/python3.4 to provide /usr/bin/python (python) in auto mode

```

---

via: <http://linuxconfig.org/how-to-change-from-default-to-alternative-python-version-on-debian-linux>

译者：[mr-ping](https://github.com/mr-ping) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


10大白帽黑客专用的 Linux 操作系统

Summary: Kali Linux、BackBox、Parrot、deft、Samurai、NST、Bugtraq、NodeZero、Pentoo、Cyborg Hawk

最新BlackArch很火。

是滴，因为blackarch所谓的小，轻并不是最小化安装的那种小和轻，而是系统本身小和轻，而且工具超过13k了

其实少了一种，BlackArch Linux。BlackArch Linux基于Arch Linux，和其他基于Ubuntu发行的渗透系统不同，BlackArch Linux定制化更强。BlackArch Linux所谓的小和轻并不是像其它系统那样基于最小化安装的那种小和轻，而是系统本身就是小和轻，而且工具超过13k了。

那个第三张图片蛮好看的

是的，我看到了另外一篇对它的介绍，但是这篇中没介绍它。

无论怎样，文中提到的主题和桌面都+1

这几个系统确实带劲

好上手吗

准备买个外星人来带这些拉风的系统。。。『黑客界的沙马特』

你看错了吧

来自广西贵港的 Chrome Mobile 40.0|Android 4.4 用户

分摊给发个梵蒂冈

分摊给发个梵蒂冈

分摊给发个梵蒂冈

分摊给发个梵蒂冈

了解了

Black Arch 呢

![](/data/attachment/album/201602/02/233355ylxngf1fg2xm7nmg.jpg)

今天让我们来介绍十个黑客专用的操作系统，它们被白帽黑客用作渗透测试的工具。这里我把 Kali Linux 列为首位，是因为它在渗透测试中非常流行，它的开发团队 Offensive security 同时也是开发 BackTrack 的团队。我们没有列出 BackTrack ，是因为在它的官方站点上已经无法下载了，它已经被 Kali Linux 所取代了。这里列出的操作系统都是基于 Linux 内核的，它们全都是自由的操作系统。

推荐你阅读一下我之前的一篇文章，可以深入了解下与黑客、安全相关的 Linux 发行版：[给黑客或安全人员使用的 Linux 发行版： Kali、Tails 和 Qubes](http://picateshackz.com/2015/04/linux-powerful-distros-for-hacking-or.html)。

### 1. Kali Linux

![](/data/attachment/album/201602/02/142030vxg4k0q0g7wkddnn.png)

Kali Linux 是一个 Debian 衍生发行版，设计用于数字取证和渗透测试。它是由 Offensive Security 公司开发和维护的，该公司的 Mati Aharoni 和 Devon Kearns 对 BackTrack 进行了重写，从而开发了全新的 Kali Linux 。它是最灵活、最先进的渗透测试发行版。Kali 会不断更新其上的工具。它支持许多不同的平台，包括 VMware 和 ARM 等。如果你想了解更多关于 Kali Linux 的信息，推荐你阅读我之前的文章：[黑客级操作系统 Kali Linux 的介绍与安装指引](http://picateshackz.com/2015/01/an-introduction-to-hackers-os-kali.html)。

**[点此直达下载地址。](https://www.kali.org/downloads/)**

### 2. BackBox

![](/data/attachment/album/201602/02/143613shdtjjihpigjopvh.jpg)

它包括了一些经常使用的安全和分析工具，可以用于从 web 应用分析到网络分析，从压力测试到嗅探，以及脆弱性分析、计算机取证分析和破解等等的各种用途。

这个发行版的一大特点是，它的 Launchpad 软件库会持续更新各种工具的最新稳定版，它们都是白帽黑客所熟知常用的。该发行版中的新工具集成和开发遵循了开源社区的标准，特别是 <ruby> Debian 自由软件指导 <rp>  （ </rp> <rt>  Debian Free Software Guidelines </rt> <rp>  ） </rp></ruby>的标准。

**[点此直达下载地址。](http://www.backbox.org/downloads)**

### 3. Parrot Security os

![](/data/attachment/album/201602/02/154834zq5xnpyixeyxwx4z.jpg)

Parrot Security 是一个基于 Debian GNU/Linux 的发行版，并混以 Frozenbox OS 和 Kali linux 的部分特性，以提供最好的渗透和安全测试体验。它是由 Frozenbox Dev Team 开发的。

Parrot 采用 Kali 的软件库来更新大部分工具，不过也有提供其自己的定制软件的软件库。这也是为何它不只是一个简单的 Kali 修改版，而是一个建立在 Kali 工具库之上的新系统，因此，它引入了许多新功能和不同的开发选择。Parrot 使用 MATE 作为桌面环境，这是一个轻量级的、高效的 Gnome 2 家族的衍生品。还有来自 FrozenBox 的高度定制的迷人的图标、特制的主题和墙纸。系统外观是由该社区的成员以及关注该项目进展的 Frozenbox Network 的成员建议并设计的。

**[点此直达下载地址。](http://www.parrotsec.org/download.fx)**

### 4. deft

![](/data/attachment/album/201602/02/172519eccnlw7cdwzdrw9n.jpg)

deft 是一个 Ubuntu 定制版，带有一整套由数以千计的个人、团队和公司所创建的计算机取证程序和文档。它们每一个都可能采用了不同的许可证，它的许可证策略决定了哪些软件会被放到 deft 中和默认放到它的安装光盘中。

**[点此直达下载地址。](http://www.deftlinux.net/download/)**

### 5. Samurai Web 测试框架

![](/data/attachment/album/201602/02/182511zmsk18z6n88swv1m.jpg)

Samurai Web 测试框架是一个<ruby> 即用 <rp>  （ </rp> <rt>  live </rt> <rp>  ） </rp></ruby> Linux 环境，它已经预配置好了 Web 渗透测试环境。这个即用 CD 中包含了最好的针对网站渗透测试和攻击的开源工具。在开发这个环境时，基于我们在安全方面的经验而选择的工具，可以用于 web 渗透测试的四个阶段。

**[点此直达下载地址。](http://sourceforge.net/projects/samurai/files/)**

### 6. 网络安全工具包 (NST)

![](/data/attachment/album/201602/02/183440yka7gymmdykg4t1g.jpg)

网络安全工具包（NST）是一个可引导的<ruby> 即用 <rp>  （ </rp> <rt>  live </rt> <rp>  ） </rp></ruby> CD ，基于 Fedora Core。这个工具包设计用来便于访问最棒的开源网络安全应用，主要运行在 x86 平台上。开发这个网络安全工具包的主要目的是为网络安全管理人员提供一套完备的开源网络安全工具。

NST 最神奇的地方是可以将大多数 x86 机器（奔腾2及以上）转换成一台可以用于网络流量分析、入侵检测、网络数据包生成、无线网络监控的虚拟服务器，当然它也可以当做一套复杂的网络/主机扫描器来使用。

**[点此直达下载地址。](http://sourceforge.net/projects/nst/)**

### 7. Bugtraq

![](/data/attachment/album/201602/02/215500tnjcnvp8g49ff1es.jpg)

Bugtraq 系统是一个很全面的发行版，包括了优化后的、稳定的实时自动服务管理器。该发行版基于 Linux 内核 3.2 和 3.4，支持 32 位和 64 位。Bugtraq 的一大亮点是其放在不同分类中的大量工具，你可以找到移动取证工具、恶意软件测试实验室、Bugtraq 资讯工具、GSM 审计工具，支持无线、蓝牙和 RFID 等，集成了 Windows 工具，以及各种典型的渗透测试和取证工具。

**[点此直达下载地址。](http://bugtraq-team.com/downloads)**

### 8. NodeZero

![](/data/attachment/album/201602/02/221016aggxdv0ttgg0xl0z.jpg)

老话说需求是发明之母，NodeZero Linux 就是这句话的最好例证。这个开发团队是由渗透测试人员和开发人员构成的，他们发现“<ruby> 即用 <rp>  （ </rp> <rt>  live </rt> <rp>  ） </rp></ruby>”系统并不能真正满足他们在安全审计方面的所需。渗透测试发行版一般都是以 Linux “即用”系统方式提供的，这意味着他们并不能对系统做一些永久性的改变。从光盘或 USB 棒中启动运行后，在重启后所有的改变就都丢失了。这对于偶尔的测试也许很有用，但是对于经常性的测试就没什么用了，并不适合需要大量测试的环境。

虽然 NodeZero Linux 可以当做“<ruby> 即用系统 <rp>  （ </rp> <rt>  Live System </rt> <rp>  ） </rp></ruby>”偶尔使用，但是它真正的力量来自于那些需要强有力测试系统的测试人员的需求。它通过持久安装、精选的强大工具、集成于稳定的 Linux 环境来满足了上述需求。

**[点此直达下载地址。](http://www.nodezero-linux.org/downloads)**

### 9. Pentoo

![](/data/attachment/album/201602/02/222824ivvqw77jrbw53vbo.jpg)

Pentoo 是一个用于渗透测试和安全评估的即用 CD 和 USB。它基于 Gentoo Linux ，提供了 32 位和 64 位的即用 CD 。Pentoo 也可以覆盖安装到现有的 Gentoo 环境中。它提供了特色的带有包注入补丁的 WIFI 驱动，GPGPU 破解软件，以及许多渗透测试和安全评估的软件。Pentoo 内核带有 grsecurity 和 PAX 加固补丁，其提供的二进制是由加固工具链编译而成的，其中一些工具还有最新的每日构建版本。

**[点此直达下载地址。](http://www.pentoo.ch/download/)**

### 10. Cyborg Hawk

![](/data/attachment/album/201602/02/231955lwb200b6tz607202.jpg)

迄今以来，最先进的、强大而美观的渗透测试发行版。收集了最完备的工具，可供专业的白帽黑客和网络安全专家使用。它带有700 个以上的工具，而 Kali 仅带了300 多个。这其中包括了移动安全工具和恶意软件分析工具。之所以放到最后是因为笔者并没有测试过它。

Cyborg Hawk 是 Team Cybord 开发的，该组织由来自 Ztrela Knowledge Solutions 的 Vaibhav Singh 和 Shahnawaz Alam 所领导。

**[点此直达下载地址。](http://sourceforge.net/projects/cyborghawk1/files/latest/download)**


Linux 容器技术史话：从 chroot  到未来

趋势很明显。

趋势很明显

![](/data/attachment/album/201602/04/001041qaejsssu4lfk49f5.jpg)

Linux 容器是一个在单一 Linux 主机上提供多个隔离的 Linux 环境的[操作系统级虚拟](https://en.wikipedia.org/wiki/Operating-system-level_virtualization#IMPLEMENTATIONS)技术。不像虚拟机（VM），容器并不需要运行专用的<ruby> 访客 <rp>  （ </rp> <rt>  guest </rt> <rp>  ） </rp></ruby>操作系统。容器们共享<ruby> 宿主机的 <rp>  （ </rp> <rt>  host </rt> <rp>  ） </rp></ruby>操作系统内核，并使用访客操作系统的系统库来提供所需的功能。由于不需要专用的操作系统，因此容器要比虚拟器启动快得多。

![](/data/attachment/album/201602/04/182525u1sn21xzr8lln78r.jpg)

（图片来自: Docker Inc.）

容器借助 Linux 内核的 Namespaces、Apparmor、SELinux <ruby> 情景模式 <rp>  （ </rp> <rt>  profile </rt> <rp>  ） </rp></ruby>、chroot 和 CGroup 等功能来提供类似于虚拟机的隔离环境。Linux 的安全模块可以确保正确地控制容器对宿主机和内核的访问，从而避免各种入侵活动。此外，在宿主机上可以运行不同的 Linux 发行版，只要它们运行在同样的 CPU 架构下。

简单来说，容器提供的是一种基于各种 Linux 发行版创建容器镜像的方法、一套管理容器生命周期的 API、与该 API 交互的客户端工具、保存快照的功能、在宿主机之间迁移容器实例的能力，等等。

### 容器历史

以下是容器简史，内容来自维基百科及其它来源：

#### 1979 — chroot

容器的概念始于 1979 年的 UNIX [chroot](https://en.wikipedia.org/wiki/Chroot)，它是一个 UNIX 操作系统上的系统调用，用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置，让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。其后在 1982年，它被加入到了 BSD 系统中。

#### 2000 — FreeBSD Jails

[FreeBSD Jails](https://en.wikipedia.org/wiki/FreeBSD_jail) 是最早的容器技术之一，它由 R&D Associates 公司的 Derrick T. Woolworth 在 2000 年为 FreeBSD 引入。这是一个类似 chroot 的操作系统级的系统调用，但是为文件系统、用户、网络等的隔离增加了进程沙盒功能。因此，它可以为每个 jail 指定 IP 地址、可以对软件的安装和配置进行定制，等等。

#### 2001 — Linux VServer

[Linux VServer](https://en.wikipedia.org/wiki/Linux-VServer) 是另外一种 jail 机制，它用于对计算机系统上的资源（如文件系统、CPU 处理时间、网络地址和内存等）进行安全地划分。每个所划分的分区叫做一个<ruby> 安全上下文 <rp>  （ </rp> <rt>  security context </rt> <rp>  ） </rp></ruby>，在其中的虚拟系统叫做<ruby> 虚拟私有服务器 <rp>  （ </rp> <rt>  virtual private server，VPS </rt> <rp>  ） </rp></ruby>。

#### 2004 — Solaris Containers

[Solaris Containers](https://en.wikipedia.org/wiki/Solaris_Containers) 支持在 x86 和 SPARC 系统，首次出现在 2004 年 2 月发布的 Solaris 10 的 build 51 beta 上，其后完整发布在 2005 年的 Solaris 10 上。 Solaris Container 是由系统资源控制和通过 zones 提供的<ruby> 边界分离 <rp>  （ </rp> <rt>  boundary separation </rt> <rp>  ） </rp></ruby>所组合而成的。zones 是一个单一操作系统实例中的完全隔离的虚拟服务器。

#### 2005 — OpenVZ

[OpenVZ](https://en.wikipedia.org/wiki/OpenVZ) 类似于 Solaris Containers，它通过对 Linux 内核进行补丁来提供虚拟化、隔离、资源管理和<ruby> 状态检查 <rp>  （ </rp> <rt>  checkpointing </rt> <rp>  ） </rp></ruby>。每个 OpenVZ 容器都有一套隔离的文件系统、用户及用户组、进程树、网络、设备和 IPC 对象。

#### 2006 — Process Containers

[Process Containers](https://en.wikipedia.org/wiki/Cgroups) 是由 Google 在 2006 年实现的，用于对一组进程进行限制、记账、隔离资源使用（CPU、内存、磁盘 I/O、网络等）。后来为了避免和 Linux 内核上下文中的“容器”一词混淆而改名为 Control Groups。它被合并到了 2.6.24 内核中。这表明 Google 很早就参与了容器技术的开发，以及它们是如何回馈到社区的。

#### 2007 — Control Groups

如上面所述，Control Groups （即 cgroups）是由 Google 实现的，并于 2007 年加到了 Linux 内核中。

#### 2008 — LXC

[LXC](https://en.wikipedia.org/wiki/LXC) 的意思是 LinuX Containers，它是第一个最完善的 Linux 容器管理器的实现方案，是通过 cgroups 和 Linux <ruby> 名字空间 <rp>  （ </rp> <rt>  namespace </rt> <rp>  ） </rp></ruby>实现的。LXC 存在于 liblxc 库中，提供了各种编程语言的 API 实现，包括 Python3、Python2、Lua、Go、Ruby 和 Haskell。与其它容器技术不同的是， LXC 可以工作在普通的 Linux 内核上，而不需要增加补丁。现在 [LXC project](https://linuxcontainers.org/lxc/introduction/) 是由 Canonical 公司赞助并托管的。

#### 2011 — Warden

[Warden](https://docs.cloudfoundry.org/concepts/architecture/warden.html) 是由 CloudFoundry 在 2011 年开发的，开始阶段是使用的 LXC，之后替换为他们自己的实现方案。不像 LXC，Warden 并不紧密耦合到 Linux 上，而是可以工作在任何可以提供隔离环境的操作系统上。它以后台守护进程的方式运行，为容器管理提供了 API。请参考 [Warden 文档](https://docs.cloudfoundry.org/concepts/architecture/warden.html)和[这个博客文章](http://blog.altoros.com/cloud-foundry-containers-warden-docker-garden.html)了解更多。

#### 2013 — LMCTFY

[lmctfy](https://github.com/google/lmctfy) 的意思是“<ruby> 让我为你包含 <rp>  （ </rp> <rt>  Let Me Contain That For You </rt> <rp>  ） </rp></ruby>”。这是一个 Google 容器技术的开源版本，提供 Linux 应用容器。Google 启动这个项目旨在提供性能可保证的、高资源利用率的、资源共享的、可超售的、接近零消耗的容器（参考自：[lmctfy 演讲稿](http://www.linuxplumbersconf.org/2013/ocw//system/presentations/1239/original/lmctfy%20(1).pdf)）。现在为 Kubernetes 所用的 cAdvisor 工具就是从 lmctfy 项目的成果开始的。lmctfy 首次发布于 2013 年10月，在 2015 年 Google 决定贡献核心的 lmctfy 概念，并抽象成 libcontainer，因此，lmctfy 现在已经没有活跃的开发了。

lincontainer 项目最初由 [Docker](https://github.com/docker/libcontainer) 发起，现在已经被移交给了<ruby>   开放容器基金会  <rp>  （ </rp> <rt>  Open Container Foundation </rt> <rp>  ） </rp></ruby>。

#### 2013 — Docker

[Docker](https://en.wikipedia.org/wiki/Docker_(software)) 是到现在为止最流行和使用广泛的容器管理系统。它最初是一个叫做 dotCloud 的 PaaS 服务公司的内部项目，后来该公司改名为 Docker。类似 Warden，Docker 开始阶段使用的也是 LXC ，之后采用自己开发的 libcontainer 替代了它。不像其它的容器平台，Docker 引入了一整个管理容器的生态系统，这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的 REST API、命令行等等。稍后的阶段， Docker 推动实现了一个叫做 Docker Swarm 的容器集群管理方案。

#### 2014 — Rocket

[Rocket](https://coreos.com/blog/rocket/) 是由 CoreOS 所启动的项目，非常类似于 Docker，但是修复了一些 Docker 中发现的问题。CoreOS 说他们的目的是提供一个比 Docker 更严格的安全性和产品需求。更重要的是，它是在一个更加开放的标准 App Container 规范上实现的。在 Rocket 之外，CoreOS 也开发了其它几个可以用于 Docker 和 Kubernetes的容器相关的产品，如：[CoreOS 操作系统](https://en.wikipedia.org/wiki/CoreOS)、[etcd](https://coreos.com/etcd/) 和 [flannel](https://github.com/coreos/flannel)。

#### 2016 — Windows Containers

微软 2015 年也在 Windows Server 上为基于 Windows 的应用添加了容器支持，它称之为 [Windows Containers](https://msdn.microsoft.com/en-us/virtualization/windowscontainers/about/about_overview)。它与 Windows Server 2016 一同发布。通过该实现， Docker 可以原生地在 Windows 上运行 Docker 容器，而不需要启动一个虚拟机来运行 Docker（ Windows 上早期运行 Docker 需要使用 Linux 虚拟机）。

### 容器的未来

截止到今天（2016年1月），在行业内有一个显著趋势，部署软件应用从虚拟机逐渐移到了容器。其主要的原因是容器相比于虚拟机而言更加灵活和低消耗。Google 已经使用容器技术好多年了，它在 [Borg 和 Omega](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43438.pdf) 容器集群管理平台上可以成规模地运行 Google 应用。更重要的是，Google 为容器领域贡献了 cgroups 的实现和参与了 libcontainer 项目。Google 也在过去这些年借助容器在性能、资源利用和整体效率方面取得了巨大收益。最近，一直没有操作系统级的虚拟化技术的微软，也在 Window Server 上迅速采取动作实现了对容器的原生支持。

Docker 、Rocket 以及其它的容器平台并不能以一个单一主机运行在产品环境中，原因是这样面临着单点故障。当一组容器运行在一个单一宿主机时，如果宿主机失效，所有运行在该宿主机上的容器也会失效。要避免这个问题，应该使用容器宿主机集群。Google 借助其在 Borg 中取得的经验，开发了一个叫做 [Kubernetes](http://kubernetes.io/) 的开源容器集群管理系统。Docker 也启动了一个叫做 [Docker Swarm](https://docs.docker.com/swarm/) 的解决方案。目前这些解决方案还都处于相当早期的阶段，也许需要几个月或来年才实现完整的功能集合，才能变得稳定，从而广泛应用于行业内的产品环境中。

<ruby>   微服务  <rp>  （ </rp> <rt>  Microservices </rt> <rp>  ） </rp></ruby>是另一个突破性技术，在软件架构上可以将容器用于部署。微服务并不是一个新东西，只是一个相比标准的 Web 服务超快的轻量级 Web 服务。这是通过将功能单元（也许是一个单一服务或 API 方法）打包到一个服务中，并内嵌其到一个轻量级 Web 服务器软件中实现的。

通过对上面的介绍，我们可以预测接下来几年，容器也许会替代虚拟机，某些情况下也许会全部取代。去年我为一些企业在 POC 层面上实现了基于容器的解决方案。也有人想要在产品环境中尝试它们，这一天也许在容器集群管理系统进一步成熟后很快到来。


通过修改 glibc 支持 DNS 加密

Summary: 通过关于尝试将 DNSSEC 更好地集成到 GNU C 库里的讨论，我们知道，确保 DNS 查询信息安全这件事并不是那么简单。

域名解析系统（DNS）是互联网安全的许多薄弱环节之一；可以将应用程序所访问的主机对应的 IP 地址误导到其它地方。也就是说，会连接到错误的位置，从而引发<ruby> 中间人 <rp>  （ </rp> <rt>  man-in-the-middle </rt> <rp>  ） </rp></ruby>攻击等等。而 [DNSSEC](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions) 扩展协议则通过为 DNS 信息建立一条加密的可信通道来解决这个漏洞。在正确地配置好 DNSSEC 后，应用程序将可以得到可靠的主机查询信息。通过关于[尝试将 DNSSEC 更好地集成到 GNU C 库里](http://lwn.net/Articles/664790/)的讨论，我们知道，确保 DNS 查询信息安全这件事并不是那么简单。

![](/data/attachment/album/201602/05/214955zjzfpkspm005pssz.jpg)

从某种意义上来说，这个问题多年以前就解决了，我们可以配置一个本地域名服务实现完整的 DNSSEC <ruby> 校验 <rp>  （ </rp> <rt>  verification </rt> <rp>  ） </rp></ruby>并允许应用程序通过 glibc 函数来使用该服务。DNSSEC 甚至还可以用于提高其他领域的安全性，比如，它可以携带 SSH 或 TLS 密钥指纹，让应用程序可以确认其在与正确的服务器对话。不过，当我们希望确认这条自称带有 DNSSEC 校验的 DNS 结果是不是真的已通过认证的时候 - 也就是说，当我们想依赖 DNSSEC 所承诺的安全的时候，事情变得有点复杂。

### /etc/resolv.conf 问题

从 glibc 的角度来看，这个问题一部分是因为 glibc 本身并没有做 DNSSEC 校验，而是引用 /etc/resolv.conf 文件，从该文件里读出的服务器来做解析以及校验，再将结果返回给应用程序。如果应用程序使用底层 res\_query() 接口，那结果中将会包含“<ruby> 已认证数据 <rp>  （ </rp> <rt>  authenticated data </rt> <rp>  ） </rp></ruby>”（AD）标识（如果域名服务器设定了的话）以表示 DNSSEC 校验已经成功。但是 glibc 却完全不知道提供这些结果的域名服务器的信用，所以它其实并不能告诉应用程序结果是否真的可靠。

由 glibc 的维护者 Carlos O'Donell 提出的建议是在 resolv.conf 文件里增加一个选项（dns-strip-dnssec-ad-bit）告诉 glibc 无条件移除 AD 标识。这个选项可以由各发行版设定，表示 DNSSEC 级别的 DNS 查询结果并不可靠。而一旦建立好合适的环境可以获得可靠的查询结果后，再移除这个选项。这样一来，虽然问题还没有完全解决，至少应用程序有依据来评价从 glibc 获取的 DNS 查询结果的可靠性。

一个可靠的环境配置应该是什么样？标准情况应该和这个差不太多：有一个本地域名服务器，通过<ruby> 环路 <rp>  （ </rp> <rt>  loopback </rt> <rp>  ） </rp></ruby>接口访问，作为访问 /etc/resolv.conf 文件的唯一条目。这个域名服务器应该配置来做校验，而在校验失败后就只是简单地不返回任何结果。绝大多数情况下，应用程序就不再需要关心 AD 标识，如果结果不可靠，应用程序就根本看不到。一些发行版已经倾向于这种模型，不过情况仍然不像一些人所设想的那么简单。

其中一个问题是，这种方式将 /etc/resolv.conf 文件放到整个系统可信任度的中心。但是，在一个典型的 Linux 系统里，有无数的 DHCP 客户端、网络脚本以及其他更多的程序可以修改这个文件。就像 Paul Wouters 所[指出](http://lwn.net/Articles/664794/)的，在短时间内锁定这个文件是不可能的。有时候这种修改是必须的：在一个无盘系统启动的时候，在自身的域名服务器启动之前也是需要域名服务的；一个系统的整个 DNS 环境也会根据所连接的网络不同而有所改变；运行在容器里的系统也最好是配置成使用宿主机的域名服务器；等等。

所以，现在一般认为，现有系统里的 /etc/resolv.conf 文件并不可信。于是有人提出增加另一个配置文件（/etc/secure-resolv.conf 或其他什么），但这并没有从根本上解决问题。除此之外，有些参与者觉得就算有一个运行在环路接口上的域名服务器也不是真正可靠，比如 Zack Weinberg 甚至[建议](http://lwn.net/Articles/664782/)系统管理员可以有意禁用 DNSSEC <ruby> 确认 <rp>  （ </rp> <rt>  validation </rt> <rp>  ） </rp></ruby>。

既然当前系统里的配置不足以信任，那可以这样推断，在情况有改善能够取得可信的结果后，glibc 需要有一种方式来通知应用程序。可以是上面讨论的屏蔽 AD 标识的方式（或者与之相反，增加一个显示的“此域名服务器可以信任”选项）；当然，这都需要一定程度上锁定系统以免 /etc/resolv.conf 受到任何不可预计的修改。按 Petr Spacek 的[建议](http://lwn.net/Articles/664784/)，还有一种引申方式，就是提供一种途径允许应用程序查询 glibc 当前通讯的是不是本地域名服务器。

### 在 glibc 里来处理？

另一种方式是不管域名服务器，而是让 glibc 本身来做 DNSSEC 确认。不过，把这么大一坨加密相关代码放进 glibc 也是有很大阻力。这样将增加库本身的大小，从而感觉会增加使用它的应用程序的受攻击可能性。这个方向再引申一下，由 Zack 提出的[建议](http://lwn.net/Articles/664796/)，可以把确认相关代码放到域名服务缓冲守护进程（nscd）里。因为 nscd 也是 glibc 的一部分，由 glibc 开发人员维护，因此在一定程度上可以相信能正确执行 DNSSEC 确认。而且 nscd 的通讯 socket 所在位置也是公开的，所以可以不考虑 /etc/resolv.conf 问题。不过，Carlos [担心](http://lwn.net/Articles/664786/)这种方式不能让那些不想使用 nscd 缓存功能的用户所接受；在他看来，基本可以排除 nscd 的方式。

所以，至少近期内，glibc 不太可能全部执行 DNSSEC 确认了的整个查询过程。这意味着，如果一个有安全考虑的应用要使用 glibc 库来查询域名，该库将需要提供一个标识来评价从独立域名服务器返回的结果有多大程度的可靠性。这几乎肯定需要发行版或系统管理员做出一些明确的改动。就像 Simo Sorce [说的](http://lwn.net/Articles/664787/)那样：

>
> 如果 glibc 不使用明确的配置选项来通知应用程序它所用的域名解析是可信的，不会有什么用……不改一下还有很大弊端，因为应用程序开发者将马上认识到他们不能信任从 glibc 获取的任何信息，从而在处理 DNSSEC 相关信息时就简单地不用它。
>
>
>

要配置一个系统能正常使用 DNSSEC 需要改动该系统的很多组件 - 这是一个发行版范围的问题，需要时间来完全解决。在这个转变过程中 glibc 所扮演的角色很可能会比较小，但是很重要的一部分：如果应用程序不实现一套自己的域名解析代码，glibc 很可能是保证 DNS 结果可信的唯一方式。在一个系统中运行多个 DNSSEC 实现方式看起来不像是一种安全的方式，所以最好还是把事情做对了。

glibc 项目目前并没有确定用哪种方式来做这个事情，虽然从 /etc/resolv.conf 文件里的某些标记看上去快好了。这种改动应该需要发布新版本；考虑到 glibc 开发的保守天性，很可能来不及加入预计二月份发布的 2.23 版本了。所以 glibc 中暂时还不会有更高安全性的 DNSSEC ，不过在这个方向上也有一些进展了。

---

via: <https://lwn.net/Articles/664776/>

作者：Jonathan Corbet 译者：[zpl1025](https://github.com/zpl1025) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


六款优秀的开源协作编辑工具

Summary: 简而言之，协作编辑（Collaborative Edit）就是多个人进行编辑。协作有好处也有风险。好处之一是更加全面/协调的方式，更好的利用现有资源和一个更加有力一致的声音。对于我来说，最大的好处是极大的透明度。那是当我需要采纳同事的观点。同事之间来来回回地传文件效率非常低，导致不必要的延误还让人（比如，我）对整个协作这件事都感到不满意。有个好的协作软件，我就能实时地或异步地分享笔记，数据和文件，并用评论来分享自己的想法。这样在文档、图片、视频、演示文稿上协作就不会那么的琐碎而无聊。 有很多种方式能在线进行协作，简

感谢推荐，我在onlyoffice基础上用golang语音进行二次开发完成文档管理，轻松部署就可以实现企业文档协作功能，支持word,excel,powerpoint。百度搜onlyoffice golang。

哪个更好？

简而言之，<ruby> 协作编辑 <rp>  （ </rp> <rt>  Collaborative Edit </rt> <rp>  ） </rp></ruby>就是多个人进行编辑。协作有好处也有风险。好处之一是更加全面/协调的方式，更好的利用现有资源和一个更加有力一致的声音。对于我来说，最大的好处是极大的透明度。那是当我需要采纳同事的观点。同事之间来来回回地传文件效率非常低，导致不必要的延误还让人（比如，我）对整个协作这件事都感到不满意。有个好的协作软件，我就能实时地或异步地分享笔记，数据和文件，并用评论来分享自己的想法。这样在文档、图片、视频、演示文稿上协作就不会那么的琐碎而无聊。

有很多种方式能在线进行协作，简直不能更简便了。这篇文章展示了我最喜欢的开源的实时文档协作编辑工具。

Google Docs 是个非常好的高效应用，有着大部分我所需要的功能。它可以作为一个实时地协作编辑文档的工具提供服务。文档可以被分享、打开并被多位用户同时编辑，用户还能看见其他协作者一个字母一个字母的编辑过程。虽然 Google Docs 对个人是免费的，但并不开源。

下面是我带来的最棒的开源协作编辑器，它们能帮你不被打扰的集中精力进行写作，而且是和其他人协同完成。

---

### Hackpad

![](/data/attachment/album/201602/05/230446yj272jt12gn3esat.png)

Hackpad 是个开源的基于网页的实时 wiki，基于开源 EtherPad 协作文档编辑器。

Hackpad 允许用户实时分享你的文档，它还用彩色编码显示各个作者分别贡献了哪部分。它还允许插入图片、清单，由于提供了语法高亮功能，它还能用来写代码。

当2014年4月 Dropbox 收购了 Hackpad 后，就在这个月这款软件以开源的形式发布。让我们经历的等待非常值得。

特性：

* 有类似 wiki 所提供的，一套非常完善的功能
* 实时或者异步地记录协作笔记，共享数据和文件，或用评论分享你们的想法
* 细致的隐私许可让你可以邀请单个朋友、一个十几人的团队或者上千的 Twitter 粉丝
* 智能执行
* 直接从流行的视频分享网站上插入视频
* 表格
* 可对使用广泛的包括 C, C#, CSS, CoffeeScript, Java, 以及 HTML 在内的编程语言进行语法高亮
* 网站：[hackpad.com](https://hackpad.com/)
* 源代码：[github.com/dropbox/hackpad](https://github.com/dropbox/hackpad)
* 开发者：[Contributors](https://github.com/dropbox/hackpad/blob/master/CONTRIBUTORS)
* 许可：Apache License, Version 2.0
* 版本号： -

---

### Etherpad

![](/data/attachment/album/201602/05/230519fm5wgqhxjmsu6iiw.png)

Etherpad 是个基于网页的开源实时协作编辑器，允许多个作者同时编辑一个文本文档，写评论，并与其他作者用群聊方式进行交流。

Etherpad 是用 JavaScript 编写的，运行在 AppJet 平台之上，通过 Comet 流实现实时的功能。

特性：

* 尽心设计的斯巴达界面
* 简单的格式化文本功能
* “滑动时间轴”——浏览一个工程历史版本
* 可以下载纯文本、 PDF、微软的 Word 文档、Open Document 和 HTML 格式的文档
* 每隔一段很短的时间就会自动保存
* 可个性化程度高
* 有客户端插件可以扩展编辑的功能
* 几百个支持 Etherpad 的扩展，包括支持 email 提醒，pad 管理，授权
* 可访问性开启
* 可从 Node 里或通过 CLI（命令行界面）和 EtherPad 的内容交互
* 网站： [etherpad.org](http://etherpad.org/)
* 源代码：[github.com/ether/etherpad-lite](https://github.com/ether/etherpad-lite)
* 开发者：David Greenspan, Aaron Iba, J.D. Zamfiresc, Daniel Clemens, David Cole
* 许可：Apache License, Version 2.0
* 版本号： 1.5.7

---

### Firepad

![](/data/attachment/album/201602/05/230604j8s6so5pmecsn9l1.png)

Firepad 是个开源的协作文本编辑器。它的设计目的是被嵌入到更大的网页应用中对几天内新加入的代码进行批注。

Firepad 是个全功能的文本编辑器，有解决冲突，光标同步，用户属性，用户在线状态检测功能。它使用 Firebase 作为后台，而且不需要任何服务器端的代码。他可以被加入到任何网页应用中。Firepad 可以使用 CodeMirror 编辑器或者 Ace 编辑器提交文本，它的操作转换代码是从 ot.js 上借鉴的。

如果你想要通过添加简单的文档和代码编辑器来扩展你的网页应用能力，Firepad 最适合不过了。

Firepad 已被多个编辑器使用，包括Atlassian Stash Realtime Editor、Nitrous.IO、LiveMinutes 和 Koding。

特性：

* 纯正的协作编辑
* 基于 OT 的智能合并及解决冲突
* 支持多种格式的文本和代码的编辑
* 光标位置同步
* 撤销/重做
* 文本高亮
* 用户属性
* 在线检测
* 版本检查点
* 图片
* 通过它的 API 拓展 Firepad
* 支持所有现代浏览器：Chrome、Safari、Opera 11+、IE8+、Firefox 3.6+
* 网站： [www.firepad.io](http://www.firepad.io/)
* 源代码：[github.com/firebase/firepad](https://github.com/firebase/firepad)
* 开发者：Michael Lehenbauer and the team at Firebase
* 许可：MIT
* 版本号：1.1.1

---

### OwnCloud Documents

![](/data/attachment/album/201602/05/230649wzf00i4zjask40g5.png)

ownCloud Documents 是个可以单独并/或协作进行办公室文档编辑 ownCloud 应用。它允许最多5个人同时在网页浏览器上协作进行编辑 .odt 和 .doc 文件。

ownCloud 是个自托管文件同步和分享服务器。他通过网页界面，同步客户端或 WebDAV 提供你数据的使用权，同时提供一个容易在设备间进行浏览、同步和分享的平台。

特性：

* 协作编辑，多个用户同时进行文件编辑
* 在 ownCloud 里创建文档
* 上传文档
* 在浏览器里分享和编辑文件，然后在 ownCloud 内部或通过公共链接进行分享这些文件
* 有类似 ownCloud 的功能，如版本管理、本地同步、加密、恢复被删文件
* 通过透明转换文件格式的方式无缝支持微软 Word 文档
* 网站：[owncloud.org](https://owncloud.org/)
* 源代码： [github.com/owncloud/documents](http://github.com/owncloud/documents/)
* 开发者：OwnCloud Inc.
* 许可：AGPLv3
* 版本号：8.1.1

---

### Gobby

![](/data/attachment/album/201602/05/230732pleoepbwpbcg6p9z.png)

Gobby 是个支持在一个会话内进行多个用户聊天并打开多个文档的协作编辑器。所有的用户都能同时在文件上进行工作，无需锁定。不同用户编写的部分用不同颜色高亮显示，它还支持多个编程和标记语言的语法高亮。

Gobby 允许多个用户在互联网上实时共同编辑同一个文档。它很好的整合了 GNOME 环境。它拥有一个客户端-服务端结构，这让它能支持一个会话开多个文档，文档同步请求，密码保护和 IRC 式的聊天方式可以在多个频道进行交流。用户可以选择一个颜色对他们在文档中编写的文本进行高亮。

还供有一个叫做 infinoted 的专用服务器。

特性：

* 成熟的文本编辑能力包括使用 GtkSourceView 的语法高亮功能
* 实时、无需锁定、通过加密（包括PFS）连接的协作文本编辑
* 整合了群聊
* 本地组撤销：撤销不会影响远程用户的修改
* 显示远程用户的光标和选择区域
* 用不同颜色高亮不同用户编写的文本
* 适用于大多数编程语言的语法高亮，自动缩进，可配置 tab 宽度
* 零冲突
* 加密数据传输包括完美的正向加密（PFS）
* 会话可被密码保护
* 通过 Access Control Lists (ACLs) 进行精密的权限保护
* 高度个性化的专用服务器
* 自动保存文档
* 先进的查找和替换功能
* 国际化
* 完整的 Unicode 支持
* 网站：[gobby.github.io](https://gobby.github.io/)
* 源代码： [github.com/gobby](https://github.com/gobby)
* 开发者： Armin Burgmeier, Philipp Kern and contributors
* 许可： GNU GPLv2+ and ISC
* 版本号：0.5.0

---

### OnlyOffice

![](/data/attachment/album/201602/05/230826q7kr6hw92nut72h0.png)

ONLYOFFICE（从前叫 Teamlab Office）是个多功能云端在线办公套件，整合了 CRM（客户关系管理）系统、文档和项目管理工具箱、甘特图以及邮件整合器

它能让你整理商业任务和时间表，保存并分享你的协作或个人文档，使用网络社交工具如博客和论坛，还可以和你的队员通过团队的即时聊天工具进行交流。

能在同一个地方管理文档、项目、团队和顾客关系。OnlyOffice 结合了文本，电子表格和电子幻灯片编辑器，他们的功能跟微软桌面应用（Word、Excel 和 PowerPoint）的功能相同。但是他允许实时进行协作编辑、评论和聊天。

OnlyOffice 是用 ASP.NET 编写的，基于 HTML5 Canvas 元素，并且被翻译成21种语言。

特性：

* 当在大文档里工作、翻页和缩放时，它能与桌面应用一样强大
* 文档可以在浏览/编辑模式下分享
* 文档嵌入
* 电子表格和电子幻灯片编辑器
* 协作编辑
* 评论
* 群聊
* 移动应用
* 甘特图
* 时间管理
* 权限管理
* Invoicing 系统
* 日历
* 整合了文件保存系统：Google Drive、Box、OneDrive、Dropbox、OwnCloud
* 整合了 CRM、电子邮件整合器和工程管理模块
* 邮件服务器
* 邮件整合器
* 可以编辑流行格式的文档、电子表格和电子幻灯片：DOC、DOCX、ODT、RTF、TXT、XLS、XLSX、ODS、CSV、PPTX、PPT、ODP
* 网站：[www.onlyoffice.com](https://www.onlyoffice.com/free-edition.aspx)
* 源代码：[github.com/ONLYOFFICE/DocumentServer](https://github.com/ONLYOFFICE/DocumentServer)
* 开发者：Ascensio System SIA
* 许可：GNU GPL v3
* 版本号：7.7

---

via: <http://www.linuxlinks.com/article/20150823085112605/CollaborativeEditing.html>

作者：Frazer Kline 译者：[H-mudcup](https://github.com/H-mudcup) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 系统上安装 Suricata 入侵检测系统

Summary: 一种提升入侵检测系统性能的途径是多线程入侵检测系统，它将 CPU 密集型的深度包检测工作并行的分配给多个并发任务来完成。这样的并行检测可以充分利用多核硬件的优势来轻松提升入侵检测系统的吞吐量。

好腻害

随着安全威胁的不断发生，入侵检测系统（IDS）在如今的数据中心环境中显得尤为必要。然而，随着越来越多的服务器将他们的网卡升级到10GB/40GB以太网，对如此线路上的硬件进行计算密集型的入侵检测越来越困难。其中一种提升入侵检测系统性能的途径是**多线程入侵检测系统**，它将 CPU 密集型的深度包检测工作并行的分配给多个并发任务来完成。这样的并行检测可以充分利用多核硬件的优势来轻松提升入侵检测系统的吞吐量。在这方面有两个知名的开源项目，分别是 [Suricata](http://suricata-ids.org/) 和 [Bro](https://www.bro.org/)。

![](/data/attachment/album/201602/06/201834hv668284gg6miu48.jpg)

这个教程里，我会向大家演示**如何在 Linux 服务器上安装和配置 Suricata 入侵检测系统。**

### 在 Linux 上安装 Suricata IDS

让我们从源文件来构建 Suricata，但在此之前，需要按如下所示先安装几个依赖包。

#### 在 Debian, Ubuntu 或者 Linux Mint 操作系统上安装依赖包

```
$ sudo apt-get install wget build-essential libpcre3-dev libpcre3-dbg automake autoconf libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libjansson-dev

```

#### 在 CentOS, Fedora 或者 RHEL 操作系统上安装依赖包

```
$ sudo yum install wget libpcap-devel libnet-devel pcre-devel gcc-c++ automake autoconf libtool make libyaml-devel zlib-devel file-devel jansson-devel nss-devel

```

一旦将所有依赖包安装完毕，我们就可以继续安装 Suricata 了。

首先从 <http://suricata-ids.org/download/> 下载 Suricata 源代码，然后构建它。撰写这篇文章的时候，其最新版本号为 2.0.8 。

```
$ wget http://www.openinfosecfoundation.org/download/suricata-2.0.8.tar.gz
$ tar -xvf suricata-2.0.8.tar.gz
$ cd suricata-2.0.8
$ ./configure --sysconfdir=/etc --localstatedir=/var

```

以下是配置信息的样例。

```
Suricata Configuration:
  AF_PACKET support:                       yes
  PF_RING support:                         no
  NFQueue support:                         no
  NFLOG support:                           no
  IPFW support:                            no
  DAG enabled:                             no
  Napatech enabled:                        no
  Unix socket enabled:                     yes
  Detection enabled:                       yes

  libnss support:                          yes
  libnspr support:                         yes
  libjansson support:                      yes
  Prelude support:                         no
  PCRE jit:                                yes
  LUA support:                             no
  libluajit:                               no
  libgeoip:                                no
  Non-bundled htp:                         no
  Old barnyard2 support:                   no
  CUDA enabled:                            no

```

现在可以编译、安装了。

```
$ make
$ sudo make install

```

Suricata 源代码带有默认的配置文件。按照如下方法安装这些默认配置文件即可。

```
$ sudo make install-conf

```

正如你所料，如果没有IDS规则集的话，Suricata 什么用也没有。幸好 Makefile 为我们提供了 IDS 规则集的安装选项。安装方法如下。

```
$ sudo make install-rules

```

以上的规则安装命令会从 [EmergingThreats.net](http://rules.emergingthreats.net/) 上下载可用的社区规则集快照，并且将其存储在 /etc/suricata/rules 目录下。

![](/data/attachment/album/201602/06/201839zkpdiz6eeqiibiin.jpg)

### 首次配置 Suricata IDS

现在到了配置 Suricata 的时候了。配置文件的位置是 **/etc/suricata/suricata.yaml**。参照以下命令，用文本编辑器打开这个文件。

```
$ sudo vi /etc/suricata/suricata.yaml

```

文件中有一些运行所需的基本配置。

为`default-log-dir`关键字指定 Suricata 日志文件所在的位置。

```
default-log-dir: /var/log/suricata/

```

在`vars`部分下方，你会发现几项对 Suricata 来说很重要变量。`HOME_NET`变量需要指定 Suricata 检查的网络。被分配给 `EXTERNAL_NET` 变量的 `!$HOME_NET` 代表除本地网络之外的其他网络。`XXX_PORTS`变量用来辨别不同服务所用到的端口号。需要注意的是无论使用什么端口，Suricata 都可以自动检测 HTTP 流量。所以是不是正确指定端口就显得没那么重要了。

```
vars:
    HOME_NET: "[192.168.122.0/24]"
    EXTERNAL_NET: "!$HOME_NET"
    HTTP_PORTS: "80"
    SHELLCODE_PORTS: "!80"
    SSH_PORTS: 22

```

`host-os-policy` 部分用于防御利用操作系统网络栈的自身行为来逃避检测的一些知名攻击手段（例如：TCP reassembly）。作为对策，通过针对目标操作系统而对检测引擎算法进行微调，现代 IDC 提供了“基于目标”的检测手段。因此，如果你知道某台主机运行了什么操作系统的话，将这个信息提供给 Suricata 就可以大幅提高检测的成功率。这就是 `host-os-policy` 存在的意义。本例中，默认的 IDC 策略是 Linux 系统。如果针对某个 IP 地址没有指定操作系统信息，Suricata 会默认应用基于 Linux 系统的检测策略。如下，当捕获到对 192.168.122.0/28 和 192.168.122.155通讯时，Suricata 就会应用基于 Windows 系统的检测策略。

```
host-os-policy:
  # These are Windows machines.
  windows: [192.168.122.0/28, 192.168.122.155]
  bsd: []
  bsd-right: []
  old-linux: []
  # Make the default policy Linux.
  linux: [0.0.0.0/0]
  old-solaris: []
  solaris: ["::1"]
  hpux10: []
  hpux11: []
  irix: []
  macos: []
  vista: []
  windows2k3: []

```

在 `threading` 部分下，你可以为不同的 Suricata 线程指定 CPU 关联。默认状态下，[CPU 关联](http://xmodulo.com/run-program-process-specific-cpu-cores-linux.html) 是被禁止使用的 (`set-cpu-affinity: no`)，这意味着 Suricata 会分配其线程到所有可用的 CPU 核心上。Suricata 会默认为每一个 CPU 核心创建一个检测线程。你可以通过指定 `detect-thread-ratio: N` 来调整此行为。此处会创建 N\*M 个检测线程，M 代表 CPU 核心总数。

```
threading:
  set-cpu-affinity: no
  detect-thread-ratio: 1.5

```

通过以上对线程的设置，Suricata 会创建 1.5\*M 个检测线程，M 是系统的 CPU 核心总数。

如果你想对 Suricata 配置有更多的了解，可以去翻阅默认配置文件。里边配有有大量的注释以供你清晰理解。

### 使用 Suricata 进行入侵监控

现在是时候让 Suricata 跑起来了，但在这之前还有一个步骤需要去完成。

当你使用 pcap 捕获模式的时候，强烈建议关闭 Suricata 监听网卡上的任何的包卸载（例如 LRO/GRO）功能。这些功能会干扰包的实时捕获行为。

按照以下方法关闭 eth0 接口的 LRO/GRO 功能。

```
$ sudo ethtool -K eth0 gro off lro off

```

这里要注意，在使用某些网卡的情况下，你会看到如下警告信息。忽略它们就行了，这些信息只不过告诉你你的网卡不支持 LRO 功能而已。

```
Cannot change large-receive-offload

```

Suricata 支持许多运行模式。运行模式决定着 IDC 会使用何种线程。以下命令可以查看所有 [可用的运行模式](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Runmodes)。

```
$ sudo /usr/local/bin/suricata --list-runmodes

```

![](/data/attachment/album/201602/06/201841gv2d1zk8u16pyud6.jpg)

Suricata 使用的默认运行模式是 autofp（<ruby> auto flow pinned load balancing <rp>  （ </rp> <rt>  自动流绑定负载均衡 </rt> <rp>  ） </rp></ruby> 的缩写）。这个模式下，来自某一个流的包会被分配到一个单独的检测线程中。这些流会根据未被处理的包的最低数量来分配相应的线程。

最后，让我们将 Suricata 运行起来，看看它表现如何。

```
$ sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal

```

![](/data/attachment/album/201602/06/201842j78hx9yh0tyy7y99.jpg)

本例中，我们在一个8核心系统中监控 eth0 网络接口。如上所示，Suricata 创建了13个包处理线程和3个管理线程。包处理线程中包括一个 PCAP 包捕获线程，12个检测线程(由8\*1.5得出)。这表示 IDS 内的1个包捕获线程均衡负载到12个检测线程中。管理线程包括1个流管理和2个计数/统计相关线程。

以下是一个关于Suricata处理的线程截图(由 [htop](http://ask.xmodulo.com/view-threads-process-linux.html) 绘制)。

![](/data/attachment/album/201602/06/201843pf0702clc22hsf28.jpg)

Suricata 检测日志存储在 /var/log/suricata 目录下。

```
$ tail -f /var/log/suricata/fast.log

```

---

```
04/01/2015-15:47:12.559075  [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46997
04/01/2015-15:49:06.565901  [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46317
04/01/2015-15:49:06.566759  [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46317

```

日志也可以提供 Json 格式以便导入：

```
$ tail -f /var/log/suricata/eve.json

```

---

```
{"timestamp":"2015-04-01T15:49:06.565901","event_type":"alert","src_ip":"172.16.253.158","src_port":22,"dest_ip":"172.16.253.1","dest_port":46317,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200074,"rev":1,"signature":"SURICATA TCPv4 invalid checksum","category":"","severity":3}}
{"timestamp":"2015-04-01T15:49:06.566759","event_type":"alert","src_ip":"172.16.253.158","src_port":22,"dest_ip":"172.16.253.1","dest_port":46317,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200074,"rev":1,"signature":"SURICATA TCPv4 invalid checksum","category":"","severity":3}}

```

### 总结

这篇教程中，我为大家演示了如何在一台多核 Linux 服务器上安装 Suricata 入侵检测系统。不同于单线程的 [Snort IDS](http://xmodulo.com/how-to-compile-and-install-snort-from-source-code-on-ubuntu.html) ，Suricata 可以很容易的从多核硬件的多进程特性所带来的好处中获益。定制 Suricata 来最大化其效能和检测范围是一个很好的主意。Suricata 的粉丝们维护着一个 [在线 Wiki](https://redmine.openinfosecfoundation.org/projects/suricata/wiki)，如果你打算将 Suricata 部署到你的环境中，我强烈建议你去那儿取取经。

如果你现在已经开始使用 Suricata 了的话，把你的经验也分享出来吧。

---

via: <http://xmodulo.com/install-suricata-intrusion-detection-system-linux.html>

作者：[Dan Nanni](http://xmodulo.com/author/nanni) 译者：[mr-ping](https://github.com/mr-ping) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Cinnamon 2.8 新变化一览

![](/data/attachment/album/201602/06/205932k8dey0d8q063laai.jpg)

除了Gnome和KDE外，Cinnamon是另一个很多人使用的桌面环境。它是由创作Linux Mint的团队制作的，并且可以被安装在许多其他发行版上。该桌面环境的最新版本 - Cinnamon 2.8 - 于去年底发布，此版本修复了许多的Bug、做了许多改进并添加了一些新功能。

我将仔细介绍该发行版本的主要改进，以及如何更新到Cinnamon 2.8或者第一次安装它。

### 对Applets的改进

在此版本中，对面板中已有的Applets做了若干的改进。

#### 声音 Applet

![cinnamon-28-sound-applet](/data/attachment/album/201602/06/205933xrumy6oprrrrp4vp.jpg)

声音Applet经过修正，目前可以显示音轨信息并且可以在音频文件的艺术家封面上面进行媒体控制。对于支持拖动的音乐播放器来说（例如Banshee），会有一个进度条显示同样的播放进度，您可以用它来改变音轨位置。在applet的面板上右击将显示对输入和输出设备静音的选项。

#### 电源 Applet

电源applet则会使用电池制造商的数据而不是通用名称来显示每一个连接的电池和设备。

#### 窗口缩略图

![cinnamon-2.8-window-thumbnails](/data/attachment/album/201602/06/205933hlml8mma65pfjoy5.png)

在Cinnamon 2.8中，可以在鼠标悬停于面板里窗口列表时展示窗口缩略图。如果您不喜欢该功能，您还可以关闭该选项。

#### 工作区切换 Applet

![cinnamon-2.8-workspace-switcher](/data/attachment/album/201602/06/205933fzmxxnqm80cctnto.png)

添加工作区切换applet到您的面板将为您显示一个代表该工作区的可视化图像，一些矩形嵌套显示在其中，代表您的窗口的位置。

#### 系统托盘

Cinnamon 2.8支持在系统托盘中显示应用程序指示器。您可以很容易地在设置中禁用它，这将强制应用程序到以前使用状态图标的方式。

### 视觉改进

Cinnamon 2.8还做了很多视觉上的改进。经典的切换器和Alt + Tab预览切换器都被精细打磨，有了显著的改进，同时修复了Alt + F2对话框的bug，并赋予了它更好的命令自动补全功能。

而且，传统的最小化窗口时动画效果的问题现已被解决，并可用于多个面板。

### Nemo 的改进

![cinnamon-2.8-nemo](/data/attachment/album/201602/06/205933koobbrc9hoq71ozi.jpg)

Cinnamon默认的文件管理器也修复了一些bug，并有了新的“快速重命名”的功能，用于重命名文件和文件夹。可以通过两次点击文件或文件夹并在两次点击之间进行简短的停顿以重命名文件。

Nemo也会自动地检测缩略图存在的问题，并提示您快速地修复它们。

### 其他值得注意的改进

* Applets如今会在它们被更新的时候自动地重新加载一次。
* 对于多个监视器的支持有了显著的提高。
* 对话框窗口有了改进，并且会附加到它的父窗口上。
* HiDPI检测有了改进。
* QT5应用程序现在看起来更加原生并使用了默认的GTK主题。
* 窗口管理和渲染性能有了提升。
* 修复了许多bug。

### 如何获得 Cinnamon 2.8

如果您在运行Linux Mint，您会在更新Linux Mint 17.3 “Rosa”Cinnamon版本的时候获得Cinnamon 2.8的更新。BETA版本现在已经放出，因此，如果您想立刻尝试新的软件，您可以试试。

对于Arch的用户来说，Cinnamon 2.8已经在Arch的官方仓库了，您可以通过更新软件包和系统级的更新获得Cinnamon的最新版本。

最后，对于Ubuntu用户来说，您可以通过下面的命令安装或更新Cinnamon 2.8：

```
sudo add-apt-repository -y ppa:moorkai/cinnamon
sudo apt-get update
sudo apt-get install cinnamon

```

您已经尝试了Cinnamon 2.8了么？感觉如何呢？

---

via: <https://www.maketecheasier.com/cinnamon-2-8-review/>

作者：[Ayo Isaiah](https://www.maketecheasier.com/author/ayoisaiah/) 译者：[wwy-hust](https://github.com/wwy-hust) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出