用 Python、 RabbitMQ 和 Nameko 实现微服务

写的一般般

微服务是个挺宽的概念，实现模式和方法无定式。作者只是通过一个特定案例来给我们一个大概印象。我们可以根据自己需求换用其他消息中间件，或者干脆用celery这样的任务分发来代替消息队列，甚至不需要Nameko这种框架，自己实现RPC。更甚不用RPC全程http。等等等等。

# 用 Python、 RabbitMQ 和 Nameko 实现微服务

>
> "微服务是一股新浪潮" - 现如今，将项目拆分成多个独立的、可扩展的服务是保障代码演变的最好选择。在 Python 的世界里，有个叫做 “Nameko” 的框架，它将微服务的实现变得简单并且强大。
>
>
>

### 微服务

>
> 在最近的几年里，“微服务架构”如雨后春笋般涌现。它用于描述一种特定的软件应用设计方式，这种方式使得应用可以由多个独立部署的服务以服务套件的形式组成。 - M. Fowler
>
>
>

推荐各位读一下 [Fowler 的文章](http://martinfowler.com/articles/microservices.html) 以理解它背后的原理。

#### 好吧，那它究竟意味着什么呢？

简单来说，**微服务架构**可以将你的系统拆分成多个负责不同任务的小的（单一上下文内）<ruby> 功能块 <rp>  （ </rp> <rt>  responsibilities blocks </rt> <rp>  ） </rp></ruby>，它们彼此互无感知，各自只提供用于通讯的<ruby> 通用指向 <rp>  （ </rp> <rt>  common point </rt> <rp>  ） </rp></ruby>。这个指向通常是已经将通讯协议和接口定义好的消息队列。

#### 这里给大家提供一个真实案例

>
> 案例的代码可以通过 github: <http://github.com/rochacbruno/nameko-example> 访问，查看 service 和 api 文件夹可以获取更多信息。
>
>
>

想象一下，你有一个 REST API ，这个 API 有一个端点（LCTT 译注：REST 风格的 API 可以有多个端点用于处理对同一资源的不同类型的请求）用来接受数据，并且你需要将接收到的数据进行一些运算工作。那么相比阻塞接口调用者的请求来说，异步实现此接口是一个更好的选择。你可以先给用户返回一个 "OK - 你的请求稍后会处理" 的状态，然后在后台任务中完成运算。

同样，如果你想要在不阻塞主进程的前提下，在计算完成后发送一封提醒邮件，那么将“邮件发送”委托给其他服务去做会更好一些。

#### 场景描述

### 用代码说话

让我们将系统创建起来，在实践中理解它：

#### 环境

我们需要的环境：

* 运行良好的 RabbitMQ（LCTT 译注：[RabbitMQ](http://rabbitmq.mr-ping.com/description.html) 是一个流行的消息队列实现）
* 由 VirtualEnv 提供的 Services 虚拟环境
* 由 VirtualEnv 提供的 API　虚拟环境

#### Rabbit

在开发环境中使用 RabbitMQ 最简单的方式就是运行其官方的 docker 容器。在你已经拥有 Docker 的情况下，运行：

```
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

```

在浏览器中访问 <http://localhost:15672> ，如果能够使用 guest:guest 验证信息登录 RabbitMQ 的控制面板，说明它已经在你的开发环境中运行起来了。

#### 服务环境

现在让我们创建微服务来满足我们的任务需要。其中一个服务用来执行计算任务，另一个用来发送邮件。按以下步骤执行：

在 Shell 中创建项目的根目录

```
$ mkdir myproject
$ cd myproject

```

用 virtualenv 工具创建并且激活一个虚拟环境（你也可以使用 virtualenv-wrapper）

```
$ virtualenv service_env
$ source service_env/bin/activate

```

安装 nameko 框架和 yagmail

```
(service_env)$ pip install nameko
(service_env)$ pip install yagmail

```

#### 服务的代码

现在我们已经准备好了 virtualenv 所提供的虚拟环境（可以想象成我们的服务是运行在一个独立服务器上的，而我们的 API 运行在另一个服务器上），接下来让我们编码，实现 nameko 的 RPC 服务。

我们会将这两个服务放在同一个 python 模块中，当然如果你乐意，也可以把它们放在单独的模块里并且当成不同的服务运行：

在名为 `service.py` 的文件中

```
import yagmail
from nameko.rpc import rpc, RpcProxy

class Mail(object):
    name = "mail"

    @rpc
    def send(self, to, subject, contents):
        yag = yagmail.SMTP('myname@gmail.com', 'mypassword')
        # 以上的验证信息请从安全的地方进行读取
        # 贴士: 可以去看看 Dynaconf 设置模块
        yag.send(to=to.encode('utf-8),
                 subject=subject.encode('utf-8),
                 contents=[contents.encode('utf-8)])

class Compute(object):
    name = "compute"
    mail = RpcProxy('mail')

    @rpc
    def compute(self, operation, value, other, email):
        operations = {'sum': lambda x, y: int(x) + int(y),
                      'mul': lambda x, y: int(x) * int(y),
                      'div': lambda x, y: int(x) / int(y),
                      'sub': lambda x, y: int(x) - int(y)}
        try:
            result = operations[operation](value, other)
        except Exception as e:
            self.mail.send.async(email, "An error occurred", str(e))
            raise
        else:
            self.mail.send.async(
                email,
                "Your operation is complete!",
                "The result is: %s" % result
            )
            return result

```

现在我们已经用以上代码定义好了两个服务，下面让我们将 Nameko RPC service 运行起来。

>
> 注意：我们会在控制台中启动并运行它。但在生产环境中，建议大家使用 supervisord 替代控制台命令。
>
>
>

在 Shell 中启动并运行服务

```
(service_env)$ nameko run service --broker amqp://guest:guest@localhost
starting services: mail, compute
Connected to amqp://guest:**@127.0.0.1:5672//
Connected to amqp://guest:**@127.0.0.1:5672//

```

#### 测试

在另外一个 Shell 中（使用相同的虚拟环境），用 nameko shell 进行测试：

```
(service_env)$ nameko shell --broker amqp://guest:guest@localhost
Nameko Python 2.7.9 (default, Apr  2 2015, 15:33:21)
[GCC 4.9.2] shell on linux2
Broker: amqp://guest:guest@localhost
>>>

```

现在你已经处在 RPC 客户端中了，Shell 的测试工作是通过 n.rpc 对象来进行的，它的使用方法如下：

```
>>> n.rpc.mail.send("name@email.com", "testing", "Just testing")

```

上边的代码会发送一封邮件，我们同样可以调用计算服务对其进行测试。需要注意的是，此测试还会附带进行异步的邮件发送。

```
>>> n.rpc.compute.compute('sum', 30, 10, "name@email.com")
40
>>> n.rpc.compute.compute('sub', 30, 10, "name@email.com")
20
>>> n.rpc.compute.compute('mul', 30, 10, "name@email.com")
300
>>> n.rpc.compute.compute('div', 30, 10, "name@email.com")
3

```

### 在 API 中调用微服务

在另外一个 Shell 中（甚至可以是另外一台服务器上），准备好 API 环境。

用 virtualenv 工具创建并且激活一个虚拟环境（你也可以使用 virtualenv-wrapper）

```
$ virtualenv api_env
$ source api_env/bin/activate

```

安装 Nameko、 Flask 和 Flasgger

```
(api_env)$ pip install nameko
(api_env)$ pip install flask
(api_env)$ pip install flasgger

```

>
> 注意： 在 API 中并不需要 yagmail ，因为在这里，处理邮件是服务的职责
>
>
>

创建含有以下内容的 `api.py` 文件：

```
from flask import Flask, request
from flasgger import Swagger
from nameko.standalone.rpc import ClusterRpcProxy

app = Flask(__name__)
Swagger(app)
CONFIG = {'AMQP_URI': "amqp://guest:guest@localhost"}

@app.route('/compute', methods=['POST'])
def compute():
    """
    Micro Service Based Compute and Mail API
    This API is made with Flask, Flasgger and Nameko
    ---
    parameters:
      - name: body
        in: body
        required: true
        schema:
          id: data
          properties:
            operation:
              type: string
              enum:
                - sum
                - mul
                - sub
                - div
            email:
              type: string
            value:
              type: integer
            other:
              type: integer
    responses:
      200:
        description: Please wait the calculation, you'll receive an email with results
    """
    operation = request.json.get('operation')
    value = request.json.get('value')
    other = request.json.get('other')
    email = request.json.get('email')
    msg = "Please wait the calculation, you'll receive an email with results"
    subject = "API Notification"
    with ClusterRpcProxy(CONFIG) as rpc:
        # asynchronously spawning and email notification
        rpc.mail.send.async(email, subject, msg)
        # asynchronously spawning the compute task
        result = rpc.compute.compute.async(operation, value, other, email)
        return msg, 200

app.run(debug=True)

```

在其他的 shell 或者服务器上运行此文件

```
(api_env) $ python api.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

```

然后访问 <http://localhost:5000/apidocs/index.html> 这个 url，就可以看到 Flasgger 的界面了，利用它可以进行 API 的交互并可以发布任务到队列以供服务进行消费。

>
> 注意： 你可以在 shell 中查看到服务的运行日志，打印信息和错误信息。也可以访问 RabbitMQ 控制面板来查看消息在队列中的处理情况。
>
>
>

Nameko 框架还为我们提供了很多高级特性，你可以从 <https://nameko.readthedocs.org/en/stable/> 获取更多的信息。

别光看了，撸起袖子来，实现微服务!

---

via: <http://brunorocha.org/python/microservices-with-python-rabbitmq-and-nameko.html>

作者: [Bruno Rocha](http://facebook.com/rochacbruno) 译者: [mr-ping](http://www.mr-ping.com) 校对: [wxy](https://github.com/wxy)

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


Cassandra 和 Spark 数据处理一窥

# Cassandra 和 Spark 数据处理一窥

Apache Cassandra 数据库近来引起了很多的兴趣，这主要源于现代云端软件对于可用性及性能方面的要求。

那么，Apache Cassandra 是什么？它是一种为高可用性及线性可扩展性优化的分布式的联机交易处理 (OLTP) 数据库。具体说到 Cassandra 的用途时，可以想想你希望贴近用户的系统，比如说让我们的用户进行交互的系统、需要保证实时可用的程序等等，如：产品目录，物联网，医疗系统，以及移动应用。对这些程序而言，下线时间意味着利润降低甚至导致其他更坏的结果。Netfilix 是这个在 2008 年开源的项目的早期使用者，他们对此项目的贡献以及带来的成功让这个项目名声大噪。

Cassandra 于2010年成为了 Apache 软件基金会的顶级项目，并从此之后就流行起来。现在，只要你有 Cassadra 的相关知识，找工作时就能轻松不少。想想看，NoSQL 语言和开源技术能达到企业级 SQL 技术的高度，真让人觉得十分疯狂而又不可思议的。这引出了一个问题。是什么让它如此的流行？

由于采用了[亚马逊发表的 Dynamo 论文](http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf)中率先提出的设计，Cassandra 有能力在大规模的硬件及网络故障时保持实时在线。由于采用了点对点模式，在没有单点故障的情况下，我们能幸免于机架故障甚至全网中断。我们能在不影响用户体验的前提下处理数据中心故障。一个能考虑到故障的分布式系统才是一个没有后顾之忧的分布式系统，因为老实说，故障是迟早会发生的。有了 Cassandra， 我们可以直面残酷的生活并将之融入数据库的结构和功能中。

我们能猜到你现在在想什么，“但我只有关系数据库相关背景，难道这样的转变不会很困难吗？”这问题的答案介于是和不是之间。使用 Cassandra 建立数据模型对有关系数据库背景的开发者而言是轻车熟路。我们使用表格来建立数据模型，并使用 CQL （ Cassandra 查询语言）来查询数据库。然而，与 SQL 不同的是，Cassandra 支持更加复杂的数据结构，例如嵌套和用户自定义类型。举个例子，当要储存对一个小猫照片的点赞数目时，我们可以将整个数据储存在一个包含照片本身的集合之中从而获得更快的顺序查找而不是建立一个独立的表。这样的表述在 CQL 中十分的自然。在我们照片表中，我们需要记录名字，URL以及给此照片点赞过的人。

在一个高性能系统中，毫秒级处理都能对用户体验和客户维系产生影响。昂贵的 JOIN 操作制约了我们通过增加不可预见的网络调用而扩容的能力。当我们将数据反范式化使其能通过尽可能少的请求就可获取时，我们即可从磁盘空间成本的降低中获益并获得可预期的、高性能应用。我们将反范式化同 Cassandra 一同介绍是因为它提供了很有吸引力的的折衷方案。

很明显，我们不会局限于对于小猫照片的点赞数量。Canssandra 是一款为高并发写入优化的方案。这使其成为需要时常吞吐数据的大数据应用的理想解决方案。实时应用和物联网方面的应用正在稳步增长，无论是需求还是市场表现，我们也会不断的利用我们收集到的数据来寻求改进技术应用的方式。

这就引出了我们的下一步，我们已经提到了如何以一种现代的、性价比高的方式储存数据，但我们应该如何获得更多的动力呢？具体而言，当我们收集到了所需的数据，我们应该怎样处理呢？如何才能有效的分析几百 TB 的数据呢？如何才能实时的对我们所收集到的信息进行反馈，并在几秒而不是几小时的时间利作出决策呢？Apache Spark 将给我们答案。

Spark 是大数据变革中的下一步。 Hadoop 和 MapReduce 都是革命性的产品，它们让大数据界获得了分析所有我们所取得的数据的机会。Spark 对性能的大幅提升及对代码复杂度的大幅降低则将大数据分析提升到了另一个高度。通过 Spark，我们能大批量的处理计算，对流处理进行快速反应，通过机器学习作出决策，并通过图遍历来理解复杂的递归关系。这并非只是为你的客户提供与快捷可靠的应用程序连接（Cassandra 已经提供了这样的功能），这更是能洞悉 Canssandra 所储存的数据，作出更加合理的商业决策并同时更好地满足客户需求。

你可以看看 [Spark-Cassandra Connector](https://github.com/datastax/spark-cassandra-connector) (开源) 并动手试试。若想了解更多关于这两种技术的信息，我们强烈推荐名为 [DataStax Academy](https://academy.datastax.com/) 的自学课程

---

via: <https://opensource.com/life/16/5/basics-cassandra-and-spark-data-processing>

作者：[Jon Haddad](https://twitter.com/rustyrazorblade),[Dani Traphagen](https://opensource.com/users/dtrapezoid) 译者：[KevinSJ](https://github.com/KevinSJ) 校对：[wxy](https://github.com/wxy)

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


awk 系列：如何使用 awk 和正则表达式过滤文本或文件中的字符串

awk简单易学，但是学好awk很有用啊。

这样做等于把awk当做sed/grep在用,没必要

楼主是用的是mint？

赞一个。

可以挺好

AWK 以前看的时候一直不容易看懂，这篇文章简单易懂，收藏了

给力，通俗易懂，感谢

如何快速找到下一篇文章？我想学高阶。。

系统的找本书或手册，要比这样随便找篇文章要强。

# awk 系列：如何使用 awk 和正则表达式过滤文本或文件中的字符串

当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时，我们经常需要过滤输出以得到感兴趣的部分。这时正则表达式就派上用场了。

### 什么是正则表达式?

正则表达式可以定义为代表若干个字符序列的字符串。它最重要的功能之一就是它允许你过滤一条命令或一个文件的输出、编辑文本或配置文件的一部分等等。

### 正则表达式的特点

正则表达式由以下内容组合而成：

* **普通字符**，例如空格、下划线、A-Z、a-z、0-9。
* 可以扩展为普通字符的**元字符**，它们包括：
	+ `(.)` 它匹配除了换行符外的任何单个字符。
	+ `(*)` 它匹配零个或多个在其之前紧挨着的字符。
	+ `[ character(s) ]` 它匹配任何由其中的字符/字符集指定的字符，你可以使用连字符(-)代表字符区间，例如 [a-f]、[1-5]等。
	+ `^` 它匹配文件中一行的开头。
	+ `$` 它匹配文件中一行的结尾。
	+ `\` 这是一个转义字符。

你必须使用类似 awk 这样的文本过滤工具来过滤文本。你还可以把 awk 自身当作一个编程语言。但由于这个指南的适用范围是关于使用 awk 的，我会按照一个简单的命令行过滤工具来介绍它。

awk 的一般语法如下：

```
# awk 'script' filename

```

此处 `'script'` 是一个由 awk 可以理解并应用于 filename 的命令集合。

它通过读取文件中的给定行，复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。

该脚本 `'script'` 中内容的格式是 `'/pattern/ action'`，其中 `pattern` 是一个正则表达式，而 `action` 是当 awk 在该行中找到此模式时应当执行的动作。

### 如何在 Linux 中使用 awk 过滤工具

在下面的例子中，我们将聚焦于之前讨论过的元字符。

#### 一个使用 awk 的简单示例：

下面的例子打印文件 /etc/hosts 中的所有行，因为没有指定任何的模式。

```
# awk '//{print}' /etc/hosts

```

*awk 打印文件中的所有行*

#### 结合模式使用 awk

在下面的示例中，指定了模式 `localhost`，因此 awk 将匹配文件 `/etc/hosts` 中有 `localhost` 的那些行。

```
# awk '/localhost/{print}' /etc/hosts

```

*awk 打印文件中匹配模式的行*

#### 在 awk 模式中使用通配符 (.)

在下面的例子中，符号 `(.)` 将匹配包含 loc、localhost、localnet 的字符串。

这里的正则表达式的意思是匹配 **l一个字符c**。

```
# awk '/l.c/{print}' /etc/hosts

```

*使用 awk 打印文件中匹配模式的字符串*

#### 在 awk 模式中使用字符 (\*)

（LCTT 译者注：此处原文作者理解有误，感谢微信读者“止此而已”的提醒，`*` 在此处表示其前一个字符重复零次或多次，所以实际上相当于 `*` 及前面的字符是无用的。）

在下面的例子中，将匹配包含 localhost、localnet、lines, capable 的字符串。将匹配带有 `c` 字符的字符串。

```
# awk '/l*c/{print}' /etc/localhost

```

*使用 awk 匹配文件中的字符串*

你可能也意识到 `(*)` 将会尝试匹配它可能检测到的最长的匹配。

让我们看一看可以证明这一点的例子，正则表达式 `t*t` 的意思是在下面的行中匹配以 `t` 开始和 `t` 结束的字符串：将匹配带有 t 字符的字符串：

```
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.

```

当你使用模式 `/t*t/` 时，会得到如下可能的结果：以下字符串只是有 t 字符而已：

```
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

```

在 `/t*t/` 中的通配符 `(*)` 将使得 awk 选择匹配的最后一项：以下字符串只是有 t 字符而已：

```
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

```

#### 结合集合 [ character(s) ] 使用 awk

以集合 [al1] 为例，awk 将匹配文件 /etc/hosts 中所有包含字符 a 或 l 或 1 的字符串。

```
# awk '/[al1]/{print}' /etc/hosts

```

*使用 awk 打印文件中匹配的字符*

下一个例子匹配以 `K` 或 `k` 开始（非指行首是该字母），后面跟着一个 `T` 的字符串：

```
# awk '/[Kk]T/{print}' /etc/hosts

```

*使用 awk 打印文件中匹配的字符*

#### 以范围的方式指定字符

awk 所能理解的字符：

* `[0-9]` 代表一个单独的数字
* `[a-z]` 代表一个单独的小写字母
* `[A-Z]` 代表一个单独的大写字母
* `[a-zA-Z]` 代表一个单独的字母
* `[a-zA-Z 0-9]` 代表一个单独的字母或数字

让我们看看下面的例子：

```
# awk '/[0-9]/{print}' /etc/hosts

```

*使用 awk 打印文件中匹配的数字*

在上面的例子中，文件 /etc/hosts 中的所有行都至少包含一个单独的数字 [0-9]。

#### 结合元字符 (^) 使用 awk

在下面的例子中，它匹配所有以给定模式开头的行：

```
# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts

```

*使用 awk 打印与模式匹配的行*

#### 结合元字符 ($) 使用 awk

它将匹配所有以给定模式结尾的行：

```
# awk '/ab$/{print}' /etc/hosts
# awk '/ost$/{print}' /etc/hosts
# awk '/rs$/{print}' /etc/hosts

```

*使用 awk 打印与模式匹配的字符串*

#### 结合转义字符 (\) 使用 awk

它允许你将该转义字符后面的字符作为文字，即理解为其字面的意思。

在下面的例子中，第一个命令打印出文件中的所有行，第二个命令中我想匹配具有 $25.00 的一行，但我并未使用转义字符，因而没有打印出任何内容。

第三个命令是正确的，因为一个这里使用了一个转义字符以转义 $，以将其识别为 '$'（而非元字符）。

```
# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '/\$25.00/{print}' deals.txt

```

*结合转义字符使用 awk*

### 总结

以上内容并不是 awk 命令用做过滤工具的全部，上述的示例均是 awk 的基础操作。在下面的章节中，我将进一步介绍如何使用 awk 的高级功能。感谢您的阅读，请在评论区贴出您的评论。

---

via: <http://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[wwy-hust](https://github.com/wwy-hust) 校对：[wxy](https://github.com/wxy)

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


awk 系列：如何使用 awk 输出文本中的字段和列

Summary: 在 Awk 系列的这一节中，我们将看到 awk 最重要的特性之一，字段编辑。

提个建议,代码框能否改成等款字体? 代码对不齐看起来很别扭.

代码框必须是等宽字体啊，难道说你那边显示不是等宽？

果然是我自己的问题......<br />
前段时间把droid卸了,改成source code,忘了同步改chrome的默认字体,直接回落到非等宽.

在 Awk 系列的这一节中，我们将看到 awk 最重要的特性之一，字段编辑。

# awk 系列：如何使用 awk 输出文本中的字段和列

在 Awk 系列的这一节中，我们将看到 awk 最重要的特性之一，字段编辑。

首先我们要知道，Awk 能够自动将输入的行，分隔为若干字段。每一个字段就是一组字符，它们和其他的字段由一个内部字段分隔符分隔开来。

*Awk 输出字段和列*

如果你熟悉 Unix/Linux 或者懂得 [bash shell 编程](http://www.tecmint.com/category/bash-shell/)，那么你应该知道什么是内部字段分隔符（IFS）变量。awk 中默认的 IFS 是制表符和空格。

awk 中的字段分隔符的工作原理如下：当读到一行输入时，将它按照指定的 IFS 分割为不同字段，第一组字符就是字段一，可以通过 $1 来访问，第二组字符就是字段二，可以通过 $2 来访问，第三组字符就是字段三，可以通过 $3 来访问，以此类推，直到最后一组字符。

为了更好地理解 awk 的字段编辑，让我们看一个下面的例子：

**例 1**：我创建了一个名为 tecmintinfo.txt 的文本文件。

```
# vi tecmintinfo.txt
# cat tecmintinfo.txt

```

*在 Linux 上创建一个文件*

然后在命令行中，我试着使用下面的命令从文本 tecmintinfo.txt 中输出第一个，第二个，以及第三个字段。

```
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe

```

从上面的输出中你可以看到，前三个字段的字符是以空格为分隔符输出的：

* 字段一是 “TecMint.com”，可以通过 `$1` 来访问。
* 字段二是 “is”，可以通过 `$2` 来访问。
* 字段三是 “the”，可以通过 `$3` 来访问。

如果你注意观察输出的话可以发现，输出的字段值并没有被分隔开，这是 print 函数默认的行为。

为了使输出看得更清楚，输出的字段值之间使用空格分开，你需要添加 (,) 操作符。

```
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt

TecMint.com is the

```

需要记住而且非常重要的是，`($)` 在 awk 和在 shell 脚本中的使用是截然不同的！

在 shell 脚本中，`($)` 被用来获取变量的值。而在 awk 中，`($)` 只有在获取字段的值时才会用到，不能用于获取变量的值。

**例 2**：让我们再看一个例子，用到了一个名为 my\_shoping.list 的包含多行的文件。

```
No    Item_Name                 Unit_Price  Quantity    Price
1     Mouse                     #20,000     1           #20,000
2     Monitor                   #500,000    1           #500,000
3     RAM_Chips                 #150,000    2           #300,000
4     Ethernet_Cables           #30,000     4           #120,000

```

如果你只想输出购物清单上每一个物品的`单价`，你只需运行下面的命令：

```
$ awk '//{print $2, $3 }' my_shopping.txt

Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000

```

可以看到上面的输出不够清晰，awk 还有一个 `printf` 的命令，可以帮助你将输出格式化。

使用 `printf` 来格式化 Item\_Name 和 Unit\_Price 的输出：

```
$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt

Item_Name  Unit_Price
Mouse      #20,000
Monitor    #500,000
RAM_Chips  #150,000
Ethernet_Cables #30,000

```

### 总结

使用 awk 过滤文本或字符串时，字段编辑的功能是非常重要的。它能够帮助你从一个表的数据中得到特定的列。一定要记住的是，awk 中 `($)` 操作符的用法与其在 shell 脚本中的用法是不同的！

希望这篇文章对您有所帮助。如有任何疑问，可以在评论区域发表评论。

---

via: <http://www.tecmint.com/awk-print-fields-columns-with-space-separator/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[Cathon](https://github.com/Cathon)，[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

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


Linus Torvalds 是一个糟糕的老板吗？

linus是个老板么？

他是个仁慈独裁者——或许不仁慈。。。

翻译得狗屁不通

别在这瞎BB，嫌别人的差你来。

感觉他是个直白又仁慈的独裁者

我觉得这就是一个“女权主义者”写的脑残文。文中多次提到“如果你是一个女性，你的这个身份就是对你不利的”，这种思想简直有病，你是女性怎么了？就骂不得说不得了是不？就要讲特权了吗？你代码写得烂，你就活该挨骂，忍受不了就退出，谁也不会说你。男性成员也被骂过，不是男女平等吗？怎么的女性就受不了？而不是在这里瞎扯些如果你是女性就咋咋的，我就不信google,微软等企业里没有骂过女员工？<br />
文章巧妙地把事件的焦点，从“提交了烂代码”转变成“以不善的语气警告团队成员（还强调了下是个女性）”，真是会转移话题。你不提交烂代

这事都是一个公案了。。具体可以翻阅一下当时的各种报道。不过，我倒是感觉本文作者有偏袒 Linus 的倾向。

这种情况下，我更希望你来具体指正我们的谬误——或者劳您大驾发布一篇校对稿。

对英语来说，我不如对计算机更有把握——这篇我也觉得有些地方有存疑和不确定的地方，只是尽力去做好。我想译者也是这样想的。肯定会有词不达意的地方，因此，希望能切实指正，而不是一句“狗屁不通”就好了。

Steve Jobs也是出了名的臭脾氣，看來有個完美主義 + 臭脾氣的項目管理者才能使手下的project成功

重要的是有技术能力，没有水品的完美主义+臭脾气，我可不想共事

请看评论。-#_#

# Linus Torvalds 是一个糟糕的老板吗？

*1999 年 8 月 10 日，加利福尼亚州圣何塞市，在 LinuxWorld Show 上 Linus Torvalds 在一个坐满 Linux 爱好者的礼堂中发表了一篇演讲。图片来自：James Niccolai*

>
> **这取决于所处的领域。在软件开发的世界中，他也是个普通人。问题是，这种情况是否应该继续下去？**
>
>
>

我认识 Linux 的发明人 Linus Torvalds 已经超过 20 年了。我们不是密友，但是我们欣赏彼此。

最近，因为 Linus Torvalds 的管理风格，他正遭到严厉的炮轰。Linus 无法忍受胡来的人。“代码的质量有多好？”这是他在 Linux 内核的开发过程中评判人的一种方式。

没有什么比这个更重要了。正如 Linus 今年（2015年）早些时候在 Linux.conf.au 会议上说的那样，“我不是一个友好的人，我也不在意你。对我重要的是‘[我所关心的技术和内核](http://www.computerworld.com/article/2874475/linus-torvalds-diversity-gaffe-brings-out-the-best-and-worst-of-the-open-source-world.html)’。”

现在我也可以和这种只关心技术的人打交道了。如果你不能，你应当避免参加 Linux 内核会议，因为在那里你会遇到许多有这种精英思想的人。这不代表我认为在 Linux 领域所有东西都是极好的，并且不应该受到其他影响而带来改变。我能够和一个精英相处；而在一个男性做主导的大城堡中遇到的问题是，女性经常受到蔑视和无礼的对待。

这就是我看到的最近关于 Linus 管理风格所引发争论的原因 —— 或者更准确的说，他对于个人管理方面是完全冷漠的 —— 就像是在软件开发世界的标准操作流程一样。与此同时，我看到揭示了这个事情需要改变的另外一个证据。

第一次是在 [Linux 4.3 发布](http://www.zdnet.com/article/linux-4-3-released-after-linus-torvalds-scraps-brain-damage-code/)的时候出现的这个情况，Linus 使用 Linux 内核邮件列表狠狠的数落了一个插入了一些网络方面的代码的开发者——这些代码很“烂”、“[生成了如此烂的代码](http://lkml.iu.edu/hypermail/linux/kernel/1510.3/02866.html)。这看起来太糟糕了，并且完全没有理由这样做。”他继续地咆哮了半天。这里使用“烂”这个词，相对他早期使用的“愚蠢的”这个同义词来说还算好的。

但是，事情就是这样。Linus 是对的。我读了代码后，发现代码确实很烂，并且开发者只是为了用新“overflow\_usub()” 函数而用。

现在，一些人把 Linus 的这种谩骂的行为看作他脾气不好而且恃强凌弱的证据。我也见过一个完美主义者，在他的领域中，他无法忍受这种糟糕。

许多人告诉我，这不是一个专业的程序员应当有的行为。群众们，你曾经和最优秀的开发者一起工作过吗？据我所知道的，在 Apple，Microsoft，Oracle ，这就是他们的行为。

我曾经听过 Steve Jobs 攻击一个开发者，就像要把他撕成碎片那样。我也被一个 Oracle 的高级开发者责骂一屋子的新开发者吓到过，就像食人鱼穿过一群金鱼那样。

在 Robert X. Cringely 关于 PC 崛起的经典书籍《<ruby>   意外帝国  <rp>  （ </rp> <rt>  Accidental Empires </rt> <rp>  ） </rp></ruby>》，中，他这样描述了微软的软件管理风格，比尔·盖茨像计算机系统一样管理他们，“比尔·盖茨是最高等级，从他开始每一个等级依次递减，上级会向下级叫嚷，刺激他们，甚至羞辱他们。”

Linus 和所有大型的商业软件公司的领导人不同的是，Linus 说在这里所有的东西都是向全世界公开的。而其他人是在自己的会议室中做东西的。我听有人说 Linus 在那种公司中可能会被开除。这是不可能的。他会处于他现在所处的地位，他在编程世界的最顶端。

但是，这里有另外一个不同。如果 Larry Ellison （Oracle 的首席执行官）向你发火，你就别想在这里干了。如果 Linus 向你发火，你会在邮件中收到他的责骂。这就是差别。

你知道的，Linus 不是任何人的老板。他完全没有雇佣和解聘的权利，他只是负责着有着 10000 个贡献者的一个项目而已。他仅仅能做的就是从心理上伤害你。

这说明，在开源软件开发圈和商业软件开发圈中同时存在一个非常严重的问题。不管你是一个多么好的编程者，如果你是一个女性，你的这个身份就是对你不利的。

这种情况并没有在 Sarah Sharp 的身上有任何好转，她现在是一个 Intel 的开发者，以前是一个顶尖的 Linux 程序员。[在她博客上10月份的一个帖子中](http://sarah.thesharps.us/2015/10/05/closing-a-door/)，她解释道：“我最终发现，我不能够再为 Linux 社区做出贡献了。因为在那里，我虽然能够得到技术上的尊重，却得不到个人的尊重……我不想专职于同那些有着点性别歧视或开同性恋玩笑的人一起工作。”

谁会责怪她呢？我不会。很抱歉，我必须说，Linus 就像所有我见过的软件经理一样，是他造成了这种不利的工作环境。

他可能会说，确保 Linux 的贡献者都表现出专业精神和相互尊重不应该是他的工作。除了代码以外，他不关心任何其他事情。

就像 Sarah Sharp 写的那样：

>
> 我对于 Linux 内核社区做出的技术努力表示最大的尊重。他们在那维护一些最高标准的代码，以此来平衡并且发展一个项目。他们专注于优秀的技术，以及超过负荷的维护人员，他们有不同的文化背景和社会规范，这意味着这些 Linux 内核维护者说话非常直率、粗鲁，或者为了完成他们的任务而不讲道理。顶尖的 Linux 内核开发者经常为了使别人改正行为而向他们大喊大叫。
>
>
> 这种事情发生在我身上，但它不是一种有效的沟通方式。
>
>
> 许多高级的 Linux 内核开发者支持那些技术上和人性上不讲道理的维护者的权利，即使他们自己是非常友好的一个人，他们不想看到 Linux 内核交流方式改变。
>
>
>

她是对的。

我和其他观察者不同的是，我不认为这个问题对于 Linux 或开源社区在任何方面有特殊之处。作为一个从事技术商业工作超过五年和有着 25 年技术工作经历的记者，我见多了这种不成熟的小孩子行为。

这不是 Linus 的错误。他不是一个经理，他是一个有想象力的技术领导者。看起来真正的问题是，在软件开发领域没有人能够以一种支持的语气来对待团队和社区。

展望未来，我希望像 Linux 基金会这样的公司和组织，能够找到一种方式去授权社区经理或其他经理来鼓励并且强制实施民主的行为。

非常遗憾的是，我们不能够在我们这种纯技术或纯商业的领导人中找到这种管理策略。它不存在于这些人的基因中。

---

via: <http://www.computerworld.com/article/3004387/it-management/how-bad-a-boss-is-linus-torvalds.html>

作者：[Steven J. Vaughan-Nichols](http://www.computerworld.com/author/Steven-J.-Vaughan_Nichols/) 译者：[FrankXinqi](https://github.com/FrankXinqi) 校对：[wxy](https://github.com/wxy)

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


IT 运行在云端，而云运行在 Linux 上

云只是“处处有数据”，还是代替不了“处处有软件”、“处处有IT（硬件）”

所谓的云是指通过因特网连接起来的计算机而已,由于位于因特网的边缘部分,因此形象的称为云。

# IT 运行在云端，而云运行在 Linux 上

>
> IT 正在逐渐迁移到云端。那又是什么驱动了云呢？答案是 Linux。 当连微软的 Azure 都开始拥抱 Linux 时，你就应该知道这一切都已经改变了。
>
>
>

<img src="content_image/album_201607_18_114128j2xdp85rlcl5jkyl.jpg" alt="" title="">

*图片： ZDNet*

不管你接不接受， 云正在接管 IT 已经成为现实。 我们这几年见证了  [云在内部 IT 的崛起](http://www.zdnet.com/article/2014-the-year-the-cloud-killed-the-datacenter/)  。 那又是什么驱动了云呢？ 答案是 Linux 。

[Uptime Institute](https://uptimeinstitute.com/) 最近对 1000 个 IT 决策者进行了调查，发现约 50% 左右的资深企业 IT 决策者认为在将来[大部分的 IT 工作应该放在云上](http://www.zdnet.com/article/move-to-cloud-accelerating-faster-than-thought-survey-finds/)  或托管网站上。在这个调查中，23% 的人认为这种改变即将发生在明年，有 70% 的人则认为这种情况会在四年内出现。

这一点都不奇怪。 我们中的许多人仍热衷于我们的物理服务器和机架， 但一般运营一个自己的数据中心并不会产生任何的经济效益。

很简单， 只需要对比你[运行在你自己的硬件上的资本费用（CAPEX）和使用云的业务费用（OPEX）](http://www.zdnet.com/article/rethinking-capex-and-opex-in-a-cloud-centric-world/)即可。 但这并不是说你应该把所有的东西都一股脑外包出去，而是说在大多数情况下你应该把许多工作都迁移到云端。

相应地，如果你想充分地利用云，你就得了解 Linux 。

[亚马逊的 AWS](https://aws.amazon.com/)、 [Apache CloudStack](https://cloudstack.apache.org/)、 [Rackspace](https://www.rackspace.com/en-us)、[谷歌的 GCP](https://cloud.google.com/) 以及  [OpenStack](http://www.openstack.org/)  的核心都是运行在 Linux 上的。那么结果如何？截至到 2014 年， [在 Linux 服务器上部署的应用达到所有企业的 79%](http://www.zdnet.com/article/linux-foundation-finds-enterprise-linux-growing-at-windows-expense/) ，而 在 Windows 服务器上部署的则跌到 36%。从那时起， Linux 就获得了更多的发展动力。

即便是微软自身也明白这一点。

Azure 的技术主管 Mark Russinovich 曾说，仅仅在过去的几年内微软就从[四分之一的 Azure 虚拟机运行在 Linux 上](http://news.microsoft.com/bythenumbers/azure-virtual) 变为[将近三分之一的 Azure 虚拟机运行在 Linux 上](http://www.zdnet.com/article/microsoft-nearly-one-in-three-azure-virtual-machines-now-are-running-linux/)。

试想一下。微软，一家正逐渐将[云变为自身财政收入的主要来源](http://www.zdnet.com/article/microsofts-q3-azure-commercial-cloud-strong-but-earnings-revenue-light/) 的公司，其三分之一的云产业依靠于 Linux 。

即使是到目前为止， 这些不论喜欢或者不喜欢微软的人都很难想象得到[微软会从一家以商业软件为基础的软件公司转变为一家开源的、基于云服务的企业](http://www.zdnet.com/article/why-microsoft-is-turning-into-an-open-source-company/) 。

Linux 对于这些专用服务器机房的渗透甚至比它刚开始的时候更深了。 举个例子， [Docker 最近发行了其在 Windows 10 和 Mac OS X 上的公测版本](http://www.zdnet.com/article/new-docker-betas-for-azure-windows-10-now-available/)  。 这难道是意味着 [Docker](http://www.docker.com/) 将会把其同名的容器服务移植到 Windows 10 和 Mac 上吗？ 并不是的。

在这两个平台上， Docker 只是运行在一个 Linux 虚拟机内部。 在 Mac OS 上是 HyperKit ，在 Windows 上则是 Hyper-V 。 在图形界面上可能看起来就像另一个 Mac 或 Windows 上的应用， 但在其内部的容器仍然是运行在 Linux 上的。

所以，就像大量的安卓手机和 Chromebook 的用户压根就不知道他们所运行的是 Linux 系统一样。这些 IT 用户也会随之悄然地迁移到 Linux 和云上。

---

via: <http://www.zdnet.com/article/it-runs-on-the-cloud-and-the-cloud-runs-on-linux-any-questions/>

作者：[Steven J. Vaughan-Nichols](http://www.zdnet.com/meet-the-team/us/steven-j-vaughan-nichols/) 译者：[chenxinlong](https://github.com/chenxinlong) 校对：[wxy](https://github.com/wxy)

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


开源新闻速递：Fedora 项目寻求帮助，将一些包移植到 Python 3

Summary: 更多：美军的升级 Windows 10 计划延期

更多：美军的升级 Windows 10 计划延期

# 开源新闻速递：Fedora 项目寻求帮助，将一些包移植到 Python 3

### 今日关注

Fedora 项目大使及打包者 Miro Hrončok 向社区[发出倡议](https://communityblog.fedoraproject.org/port-python-package/)，希望社区人员能够帮助他们移植一些软件包到最新的 Python 3 上。Fedora 项目总是在支持新技术方面走在前列，在 Python 3 方面也是。有许多使用 Python 写的应用都已经支持了 Python 3，但是不幸的是，它们通常没有为 Fedora 做好打包，所以 Fedora 项目需要更多的志愿者来帮忙做一些[移植和打包工作](http://fedora.portingdb.xyz/)。

参与这个工作很容易，你只需要懂得一些 Python 3 语言，然后从 [Fedora Python 3 移植数据库](http://fedora.portingdb.xyz/)中选择你要移植的包，在 Bugzilla 上申明你要移植即可开始。具体的移植工作，你需要提交可以使软件包兼容 Python 3 的 spec 文件，创建补丁并附加到 Bugzilla bug 报告中。完成这一切之后，你的每个补丁都可以为你[赢得一枚 Fedora 徽章](https://badges.fedoraproject.org/)！

[](http://fedora.portingdb.xyz/)

*加入 Python 3 移植团队*

### 图文摘要

*美军原计划将其 400 万台设备升级到 Windows 10，但是现在由于资金问题，显然没法按照原计划的升级时限进行，目前计划得到明年第二季度才能完成。*


PHP 、Python 等网站应用惊爆远程代理漏洞：httpoxy

Summary: 这是一个针对 PHP、Go、Python 等语言的 CGI 应用的漏洞。这个缺陷会导致远程攻击。如果你正在运行着 PHP 或 CGI 程序，你应该马上封挡 Proxy 头部！马上！

谁还用CGI啊

你想不到 PHP 在 nginx+FastCGI 下是以 CGI 模式运行的吧。。。

意思是只要发个 Proxy 的请求头，CGI 就会自动去请求 Proxy 后面带着的 url，晕死，这个是某个大神故意留的后门吧

哥,我是写python的,一直用WSGI

# PHP 、Python 等网站应用惊爆远程代理漏洞：httpoxy

<img src="content_image/album_201607_19_212732vobtmd2b7j3x3z33.jpg" alt="" title="">

>
> 这是一个针对 PHP、Go、Python 等语言的 CGI 应用的漏洞。
>
>
>

httpoxy 是一系列影响到以 CGI 或类 CGI 方式运行的应用的漏洞名称。简单的来说，它就是一个名字空间的冲突问题。

* RFC 3875 （CGI）中定义了从 HTTP 请求的 `Proxy` 头部直接填充到环境变量 `HTTP_PROXY` 的方式
* `HTTP_PROXY` 是一个常用于配置外发代理的环境变量

这个缺陷会导致远程攻击。**如果你正在运行着 PHP 或 CGI 程序，你应该马上封挡 Proxy 头部！马上！** 具体做法参见下面。httpoxy 是一个服务器端 web 应用漏洞，如果你没有在服务器端部署这些代码，则不用担心。

### 如果我的 Web 应用存在这种漏洞会怎么样？

当一个利用了此漏洞的 HTTP 客户端发起请求时，它可以做到：

* 通过你的 Web 应用去代理请求别的 URL
* 直接让你的服务器打开指定的远程地址及端口
* 浪费服务器的资源，替攻击者访问指定的资源

httpoxy 漏洞非常容易利用。希望安全人员尽快扫描该漏洞并快速修复。

### 哪些受到影响？

以下情况会存在安全漏洞：

* 代码运行在 CGI 上下文中，这样 `HTTP_PROXY` 就会变成一个真实的或模拟的环境变量
* 一个信任 `HTTP_PROXY`的 HTTP 客户端，并且支持代理功能
* 该客户端会在请求内部发起一个 HTTP（或 HTTPS）请求

下列情形是已经发现存在该缺陷的环境：

| 语言 | 环境 | HTTP 客户端 |
| --- | --- | --- |
| PHP | php-fpm mod\_php | Guzzle 4+ Artax |
| Python | wsgiref.handlers.CGIHandler twisted.web.twcgi.CGIScript | requests |
| Go | net/http/cgi | net/http |

肯定还有很多我们没有确定是否存在缺陷的语言和环境。

#### PHP

* 是否存在缺陷依赖于你的应用代码和 PHP 库，但是影响面看起来似乎非常广泛
* 只要在处理用户请求的过程中使用了一个带有该缺陷的库，就可能被利用
* 如果你使用了有该缺陷的库，该缺陷会影响任意 PHP 版本
	+ 甚至会影响到替代的 PHP 运行环境，比如部署在 FastCGI 模式下的 HHVM
* 确认影响 Guzzle、Artax 等库，可能还有很多很多的库也受影响
	+ Guzzle 4.0.0rc2 及其以后版本受影响，Guzzle 3 及更低版本不受影响
	+ 其它的例子还有 Composer 的 StreamContextBuilder 工具类

举个例子说，如果你在 Drupal 中使用 Guzzle 6 模块发起外发请求（比如请求一个天气 API），该模块发起的请求就存在这个 httpoxy 缺陷。

#### Python

* Python 代码只有部署在 CGI 模式下才存在缺陷，一般来说，存在缺陷的代码会使用类似 `wsgiref.handlers.CGIHandler` 的 CGI 控制器
	+ 正常方式部署的 Python web 应用不受影响（大多数人使用 WSGI 或 FastCGI，这两个不受影响），所以受到影响的 Python 应用要比 PHP 少得多
	+ wsgi 不受影响，因为 os.environ 不会受到 CGI 数据污染
* 存在缺陷的 requests 库必须信任和使用 `os.environ['HTTP_PROXY']`，并且不做内容检查

#### Go

* Go 代码必须部署在 CGI 下才受影响。一般来说受到影响的代码会使用 `net/http/cgi` 包
	+ 像 Python 一样，这并不是部署 Go 为一个 Web 应用的通常方式。所以受到影响的情形很少
	+ 相较而言，Go 的 `net/http/fcgi` 包并不设置实际的环境变量，所以不受影响
* 存在缺陷的 `net/http` 版本需要在外发请求中信任并使用 `HTTP_PROXY` ，并不做内容检查

### 马上修复

最好的修复方式是在他们攻击你的应用之前尽早封挡 `Proxy` 请求头部。这很简单，也很安全。

* 说它安全是因为 IETF 没有定义 `Proxy` 请求头部，也没有列在 [IANA 的消息头部注册](http://www.iana.org/assignments/message-headers/message-headers.xhtml)中。这表明对该头部的使用是非标准的，甚至也不会临时用到
* 符合标准的 HTTP 客户端和服务器绝不应该读取和发送这个头部
* 你可以从请求中去掉这个头部或者干脆整个封挡使用它的请求
* 你可以在上游没有发布补丁时自己来解决这个问题
	+ 当 HTTP 请求进来时就检查它，这样可以一次性修复好许多存在缺陷的应用
	+ 在反向代理和应用防火墙之后的应用剔除 `Proxy` 请求头部是安全的

如何封挡 `Proxy` 请求头部依赖于你的配置。最容易的办法是在你的 Web 应用防火墙上封挡该头部，或者直接在 Apache 和 Nginx 上做也行。以下是一些如何做的指导：

#### Nginx/FastCGI

使用如下语句封挡传递给 PHP-FPM、PHP-PM 的请求头，这个语句可以放在 fastcgi.conf 或 fastcgi\_param 中（视你使用了哪个配置文件）：

```
fastcgi_param HTTP_PROXY "";

```

在 FastCGI 模式下，PHP 存在缺陷（但是大多数使用 Nginx FastCGI 的其它语言则不受影响）。

#### Apache

对于 Apache 受影响的具体程度，以及其它的 Apache 软件项目，比如 Tomcat ，推荐参考 [Apache 软件基金会的官方公告](https://www.apache.org/security/asf-httpoxy-response.txt)。 以下是一些主要信息：

如果你在 Apache HTTP 服务器中使用 `mod_cgi`来运行 Go 或 Python 写的脚本，那么它们会受到影响（这里 `HTTP_PROXY` 环境变量是“真实的”）。而 `mod_php` 由于用于 PHP 脚本，也存在该缺陷。

如果你使用 **mod\_headers** 模块，你可以通过下述配置在进一步处理请求前就 unset 掉 `Proxy` 请求头部：

```
RequestHeader unset Proxy early

```

如果你使用 **mod\_security** 模块，你可以使用一个 `SecRule` 规则来拒绝带有 `Proxy` 请求头部的请求。下面是一个例子，要确保 `SecRuleEngine` 打开了。你可以根据自己的情况调整。

```
SecRule &REQUEST_HEADERS:Proxy "@gt 0" "id:1000005,log,deny,msg:'httpoxy denied'"

```

最后，如果你使用 Apache Traffic Server 的话，它本身不受影响。不过你可以用它来剔除掉 Proxy 请求头部，以保护其后面的其它服务。具体可以参考 [ASF 指导](https://www.apache.org/security/asf-httpoxy-response.txt)。

#### HAProxy

通过下述配置剔除该请求头部：

```
http-request del-header Proxy

```

#### Varnish

通过下述语句取消该头部，请将它放到已有的 vcl\_recv 小节里面：

```
sub vcl_recv {
    [...]
    unset req.http.proxy;
    [...]
}

```

#### OpenBSD relayd

使用如下语句移除该头部。把它放到已有的过滤器里面：

```
http protocol httpfilter {
    match request header remove "Proxy"
}

```

#### lighttpd （<= 1.4.40）

弹回包含 `Proxy` 头部的请求。

* 创建一个 `/path/to/deny-proxy.lua`文件，让它对于 lighttpd 只读，内容如下：

```
if (lighty.request["Proxy"] == nil) then return 0 else return 403 end

```
* 修改 `lighttpd.conf` 以加载 `mod_magnet` 模块，并运行如上 lua 代码：

```
server.modules += ( "mod_magnet" )
magnet.attract-raw-url-to = ( "/path/to/deny-proxy.lua" )

```

#### lighttpd2 (开发中)

从请求中剔除 `Proxy` 头部。加入如下语句到 `lighttpd.conf`中：

```
req_header.remove "Proxy";
```

### 用户端的 PHP 修复没有作用

用户端的修复不能解决该缺陷，所以不必费劲：

* 使用 `unset($_SERVER['HTTP_PROXY'])` 并不会影响到 `getenv()` 返回的值，所以无用
* 使用 `putenv('HTTP_PROXY=')` 也没效果（putenv 只能影响到来自实际环境变量的值，而不是来自请求头部的）

### httpoxy 的历史

该漏洞首次发现与15年前。

2001 年 3 月
Randal L. Schwartz 在 libwww-perl 发现该缺陷并修复。

2001 年 4 月
Cris Bailiff 在 curl 中发现该缺陷并修复。

2012 年 7 月
在`Net::HTTP` 的 `HTTP_PROXY` 实现中， Ruby 团队的 Akira Tanaka 发现了该缺陷

2013 年 11 月
在 nginx 邮件列表中提到了该缺陷。发现者 Jonathan Matthews 对此不太有把握，不过事实证明他是对的。

2015 年 2 月
Stefan Fritsch 在 Apache httpd-dev 邮件列表中提到了它。

2016 年 7 月
Vend 安全团队的 Scott Geary 发现了对该缺陷，并且它影响到了 PHP 等许多现代的编程语言和库。

所以，这个缺陷已经潜伏了许多年，许多人都在不同方面发现了它的存在，但是没有考虑到它对其它语言和库的影响。安全研究人员为此专门建立了一个网站： <https://httpoxy.org/> ，可以在此发现更多内容。


带有已知安全漏洞的开源组件仍被广泛使用

这个太普遍了。

# 带有已知安全漏洞的开源组件仍被广泛使用

提供 Maven 中央仓库托管服务的 Sonatype 公司说， Java 组件下载中，有 1/16 的下载组件中包含了已知的安全问题。

Sonatype 声称，开发者们每年要下载超过 310 亿个/次 Java 组件，每天也会新增超过 1 千个新组件以及超过 1 万个的组件新版本。

现在企业都采用托管式的中央组件仓库来存储他们的代码。这些代码中有一些来自私有项目，而更多的则来自于开源代码，在多数情况下，他们只是下载开源代码并导入到其项目中，而不做必要的安全审计。

Sonatype 发现现在企业中的百分之八、九十的代码都是由开源组件构成的，它们直接来自公开的代码导入。

由于这些安全缺陷都是公开的，而且 Sonatype 能够访问到其托管服务的服务器统计数据，相比其他人来说他们得到的数据会更多，因此他们警告开发者们要注意在他们的代码中使用不安全的或过期的组件所带来的风险。

这个警告对于公司来说更加严重，因为如果攻击者对采用有缺陷的组件创建的应用进行攻击，结果就可能导致更多的经济损失。

### 更老的组件的缺陷率高达三倍

在分析了来自几个不同行业的三千家机构的两万五千个以上的企业应用之后，Sonatype 发现平均每年每个企业都会下载大约五千个不同的组件。

组件越老，就越有可能包含安全缺陷。甚至更糟糕的是， 其中 97% 的下载的组件不能很方便的跟踪和审计。而如果公司仅仅是要修复两千个应用中的 10% 的安全漏洞，就大约需要 742 万美金的巨额投入。

这些问题说明企业需要对软件供应链进行管理，以避免将来出现的缺陷问题。花费在组件安全审计上的时间，将在该项目的以后出现安全漏洞后得到回报。

从这种托管的中央代码仓库中移除有缺陷的组件也应该成为这些项目背后的社区的最高优先级的工作。

[软件供应链报告](http://www.sonatype.com/hubfs/SSC/2016_State_of_the_Software_Supply_Chain_Report.pdf)中包含了当今软件供应链的更多信息。


国产开源 Web shell 威胁到了网络世界的安全

Summary: 两名中国的安全研究人员开发了一个新的 Web shell，并把它开源到 GitHub 上了，任何人都可以使用它，或基于它改造成自己的黑客工具。

无心插柳

然而并没有什么卵用，逼近类似的web shell还有很多，比如WSO, C99，和B374K。而且只是影响管理不当，有漏洞或配置弱点的服务器。逼近web shell只能被利用于：跨站点脚本; SQL注入; 应用/服务漏洞（例如，在WordPress或其他CMS应用）; 文件处理漏洞（例如，上传过滤或文件分配的权限）; 远程文件包含（RFI）和本地文件包含（LFI）漏洞; 暴露管理接口（有可能发现上述漏洞）。

这些在美国计算机应急准备小组网站上都有说明Alert (TA15-314A)

holy high 的样子

C刀好牛掰

# 国产开源 Web shell 威胁到了网络世界的安全

两名中国的安全研究人员开发了一个新的 Web shell，并把它开源到 [GitHub](https://github.com/Chora10/Cknife) 上了，任何人都可以使用它，或基于它改造成自己的黑客工具。

这个 Web Shell 的名字是 “<ruby> C刀 <rp>  （ </rp> <rt>  Cknife </rt> <rp>  ） </rp></ruby>”——中国小刀的意思。它首次出现在 2015 年底，以 Java 开发，包括一个可以让它连接到 Java、PHP、ASP 和 ASP.NET 等服务器的服务器端组件。

两位作者是来自 MS509Team 的 Chora 和 MelodyZX，其中 MelodyZX 曾向阿里安全应急响应提交过漏洞，并应邀参加过2016 网络安全年会专题演讲。

### “<ruby> 中国菜刀 <rp>  （ </rp> <rt>  China Copper </rt> <rp>  ） </rp></ruby>”之后的复刻版

据 [Recorded Future 的调查](https://www.recordedfuture.com/web-shell-analysis-part-2/)显示，这两位作者想要创造一个“中国菜刀”的复刻版。“中国菜刀”是一个非常有效的，但是已经过时的 Web Shell，它发布于 2013 年，曾经是中国红客的首选工具。

在“C刀”和“中国菜刀”之间有一些相同的地方，比如图标和发起 HTTP 请求的行为，但是两个工具也有根本性的不同，“C刀”采用 Java 编写，而“中国菜刀”则以 C++ 编写。此外，“C刀”在 Web Shell 的客户端和被入侵的服务器之间的通讯使用 HTTP，而“中国菜刀”则使用的是 HTTPS。Recorded Future 说“C刀”的作者承诺或在未来几个月内增加 HTTPS 支持。

### Recorded Future：“C刀”是 Web 服务器的远程管理木马（RAT）

目前，“C刀”允许使用者同时连接多台服务器，比如同时连接到 Web 服务器和数据库，以及运行一个远程命令行。

由于其大量的功能和甚至支持替换显示样式的漂亮界面，Recorded Future 认为它更像是一个“Web 服务器的远程管理木马（RAT）”而不是传统的 Web Shell。

尽管两位作者作为安全人员的职业很成功，但是这种开源了 Web Shell 的行为似乎跨越了白帽子和黑帽子之间的界限，相对于网络安全从业人员而言，这种工具对于网络攻击者更有用处。


awk 系列：如何使用 awk 按模式筛选文本或字符串

# awk 系列：如何使用 awk 按模式筛选文本或字符串

作为 awk 命令系列的第三部分，这次我们将看一看如何基于用户定义的特定模式来筛选文本或字符串。

在筛选文本时，有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式，去标记某个文件或数行字符串中的某几行。使用 awk 来完成这个任务是非常容易的，这也正是 awk 中可能对你有所帮助的几个功能之一。

让我们看一看下面这个例子，比方说你有一个写有你想要购买的食物的购物清单，其名称为 food\_prices.list，它所含有的食物名称及相应的价格如下所示：

```
$ cat food_prices.list
No  Item_Name       Quantity    Price
1   Mangoes            10       $2.45
2   Apples             20       $1.50
3   Bananas            5        $0.90
4   Pineapples         10       $3.46
5   Oranges            10       $0.78
6   Tomatoes           5        $0.55
7   Onions             5        $0.45

```

然后，你想使用一个 `(*)` 符号去标记那些单价大于 $2 的食物，那么你可以通过运行下面的命令来达到此目的：

```
$ awk '/ *\$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

```

*打印出单价大于 $2 的项目*

从上面的输出你可以看到在含有<ruby> 芒果 <rp>  （ </rp> <rt>  mangoes </rt> <rp>  ） </rp></ruby>和<ruby> 菠萝 <rp>  （ </rp> <rt>  pineapples </rt> <rp>  ） </rp></ruby>的那行末尾都已经有了一个 `(*)` 标记。假如你检查它们的单价，你可以看到它们的单价的确超过了 $2 。

在这个例子中，我们已经使用了两个模式：

* 第一个模式: `/ *\$[2-9]\.[0-9][0-9] */` 将会得到那些含有食物单价大于 $2 的行，
* 第二个模式: `/*\$[0-1]\.[0-9][0-9] */` 将查找那些食物单价小于 $2 的那些行。

上面的命令具体做了什么呢？这个文件有四个字段，当模式一匹配到含有食物单价大于 $2 的行时，它便会输出所有的四个字段并在该行末尾加上一个 `(*)` 符号来作为标记。

第二个模式只是简单地输出其他含有食物单价小于 $2 的行，按照它们出现在输入文件 food\_prices.list 中的样子。

这样你就可以使用模式来筛选出那些价格超过 $2 的食物项目，尽管上面的输出还有些问题，带有 `(*)` 符号的那些行并没有像其他行那样被格式化输出，这使得输出显得不够清晰。

我们在 awk 系列的第二部分中也看到了同样的问题，但我们可以使用下面的两种方式来解决：

1、可以像下面这样使用 printf 命令，但这样使用又长又无聊：

```
$ awk '/ *\$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list

```

*使用 Awk 和 Printf 来筛选和输出项目*

2、 使用 `$0` 字段。Awk 使用变量 **0** 来存储整个输入行。对于上面的问题，这种方式非常方便，并且它还简单、快速：

```
$ awk '/ *\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

```

*使用 Awk 和变量来筛选和输出项目*

### 结论

这就是全部内容了，使用 awk 命令你便可以通过几种简单的方法去利用模式匹配来筛选文本，帮助你在一个文件中对文本或字符串的某些行做标记。

希望这篇文章对你有所帮助。记得阅读这个系列的下一部分，我们将关注在 awk 工具中使用比较运算符。

---

via: <http://www.tecmint.com/awk-filter-text-or-string-using-patterns/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[FSSlc](https://github.com/FSSlc) 校对：[wxy](https://github.com/wxy)

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


Summary: 逻辑卷管理 （LVM）相较于传统的分区管理有许多优点，已经成为大多数（如果不能说全部的话） Linux 发行版安装时的默认选择。LVM 最大的优点应该是能方便的按照你的意愿调整（减小或增大）逻辑分区的大小。

LVM2分区空间是动态扩展的吗？？！！

貌似不是

说真的lvm是套落后的东西了，很多现代的fs实现替代了lvm几乎所有功能，并且少了一层layer更高效稳定。

ZFS嗎？我記得Linux還沒有對ZFS提供native support

# LFCS 系列第十一讲：如何使用命令 vgcreate、lvcreate 和 lvextend 管理和创建 LVM

由于 LFCS 考试中的一些改变已在 2016 年 2 月 2 日生效，我们添加了一些必要的专题到 [LFCS 系列](/article-7161-1.html)。我们也非常推荐备考的同学，同时阅读 [LFCE 系列](http://www.tecmint.com/installing-network-services-and-configuring-services-at-system-boot/)。

*LFCS：管理 LVM 和创建 LVM 分区*

在安装 Linux 系统的时候要做的最重要的决定之一便是给系统文件、home 目录等分配空间。在这个地方犯了错，再要扩大空间不足的分区，那样既麻烦又有风险。

**逻辑卷管理** （**LVM**）相较于传统的分区管理有许多优点，已经成为大多数（如果不能说全部的话） Linux 发行版安装时的默认选择。LVM 最大的优点应该是能方便的按照你的意愿调整（减小或增大）逻辑分区的大小。

LVM 的组成结构：

* 把一块或多块硬盘或者一个或多个分区配置成物理卷（PV）。
* 一个用一个或多个物理卷创建出的卷组（**VG**）。可以把一个卷组想象成一个单独的存储单元。
* 在一个卷组上可以创建多个逻辑卷。每个逻辑卷相当于一个传统意义上的分区 —— 优点是它的大小可以根据需求重新调整大小，正如之前提到的那样。

本文，我们将使用三块 **8 GB** 的磁盘（**/dev/sdb**、**/dev/sdc** 和 **/dev/sdd**）分别创建三个物理卷。你既可以直接在整个设备上创建 PV，也可以先分区在创建。

在这里我们选择第一种方式，如果你决定使用第二种（可以参考本系列[第四讲：创建分区和文件系统](/article-7187-1.html)）确保每个分区的类型都是 `8e`。

### 创建物理卷，卷组和逻辑卷

要在 **/dev/sdb**、**/dev/sdc** 和 **/dev/sdd**上创建物理卷，运行：

```
# pvcreate /dev/sdb /dev/sdc /dev/sdd

```

你可以列出新创建的 PV ，通过：

```
# pvs

```

并得到每个 PV 的详细信息，通过：

```
# pvdisplay /dev/sdX

```

（**X** 即 b、c 或 d）

如果没有输入 `/dev/sdX` ，那么你将得到所有 PV 的信息。

使用 /dev/sdb`和`/dev/sdc`创建卷组 ，命名为`vg00`(在需要时是可以通过添加其他设备来扩展空间的，我们等到说明这点的时候再用，所以暂时先保留`/dev/sdd`）：

```
# vgcreate vg00 /dev/sdb /dev/sdc

```

就像物理卷那样，你也可以查看卷组的信息，通过：

```
# vgdisplay vg00

```

由于 `vg00` 是由两个 **8 GB** 的磁盘组成的，所以它将会显示成一个 **16 GB** 的硬盘：

*LVM 卷组列表*

当谈到创建逻辑卷，空间的分配必须考虑到当下和以后的需求。根据每个逻辑卷的用途来命名是一个好的做法。

举个例子，让我们创建两个 LV，命名为 `vol_projects` （**10 GB**） 和 `vol_backups` （剩下的空间）， 在日后分别用于部署项目文件和系统备份。

参数 `-n` 用于为 LV 指定名称，而 `-L` 用于设定固定的大小，还有 `-l` （小写的 L）在 VG 的预留空间中用于指定百分比大小的空间。

```
# lvcreate -n vol_projects -L 10G vg00
# lvcreate -n vol_backups -l 100%FREE vg00

```

和之前一样，你可以查看 LV 的列表和基础信息，通过：

```
# lvs

```

或是查看详细信息，通过：

```
# lvdisplay

```

若要查看单个 **LV** 的信息，使用 **lvdisplay** 加上 **VG** 和 **LV** 作为参数，如下：

```
# lvdisplay vg00/vol_projects

```

*逻辑卷列表*

如上图，我们看到 LV 已经被创建成存储设备了（参考 LV Path 那一行）。在使用每个逻辑卷之前，需要先在上面创建文件系统。

这里我们拿 ext4 来做举例，因为对于每个 LV 的大小， ext4 既可以增大又可以减小（相对的 xfs 就只允许增大）：

```
# mkfs.ext4 /dev/vg00/vol_projects
# mkfs.ext4 /dev/vg00/vol_backups

```

我们将在下一节向大家说明，如何调整逻辑卷的大小并在需要的时候添加额外的外部存储空间。

### 调整逻辑卷大小和扩充卷组

现在设想以下场景。`vol_backups` 中的空间即将用完，而 `vol_projects` 中还有富余的空间。由于 LVM 的特性，我们可以轻易的减小后者的大小（比方说 **2.5 GB**），并将其分配给前者，与此同时调整每个文件系统的大小。

幸运的是这很简单，只需：

```
# lvreduce -L -2.5G -r /dev/vg00/vol_projects
# lvextend -l +100%FREE -r /dev/vg00/vol_backups

```

*减小逻辑卷和卷组*

在调整逻辑卷的时候，其中包含的减号 `(-)` 或加号 `(+)` 是十分重要的。否则 LV 将会被设置成指定的大小，而非调整指定大小。

有些时候，你可能会遭遇那种无法仅靠调整逻辑卷的大小就可以解决的问题，那时你就需要购置额外的存储设备了，你可能需要再加一块硬盘。这里我们将通过添加之前配置时预留的 PV （`/dev/sdd`），用以模拟这种情况。

想把 `/dev/sdd` 加到 `vg00`，执行：

```
# vgextend vg00 /dev/sdd

```

如果你在运行上条命令的前后执行 vgdisplay `vg00` ，你就会看出 VG 的大小增加了。

```
# vgdisplay vg00

```

*查看卷组磁盘大小*

现在，你可以使用新加的空间，按照你的需求调整现有 LV 的大小，或者创建一个新的 LV。

### 在启动和需求时挂载逻辑卷

当然，如果我们不打算实际的使用逻辑卷，那么创建它们就变得毫无意义了。为了更好的识别逻辑卷，我们需要找出它的 `UUID` （用于识别一个格式化存储设备的唯一且不变的属性）。

要做到这点，可使用 blkid 加每个设备的路径来实现：

```
# blkid /dev/vg00/vol_projects
# blkid /dev/vg00/vol_backups

```

*寻找逻辑卷的 UUID*

为每个 LV 创建挂载点：

```
# mkdir /home/projects
# mkdir /home/backups

```

并在 `/etc/fstab` 插入相应的条目（确保使用之前获得的UUID）：

```
UUID=b85df913-580f-461c-844f-546d8cde4646 /home/projects    ext4 defaults 0 0
UUID=e1929239-5087-44b1-9396-53e09db6eb9e /home/backups ext4    defaults 0 0

```

保存并挂载 LV：

```
# mount -a
# mount | grep home

```

*挂载逻辑卷*

在涉及到 LV 的实际使用时，你还需要按照曾在本系列[第八讲：管理用户和用户组](/article-7418-1.html)中讲解的那样，为其设置合适的 `ugo+rwx`。

### 总结

本文介绍了 [逻辑卷管理](/article-3965-1.html)，一个用于管理可扩展存储设备的多功能工具。与 RAID（曾在本系列讲解过的 [第六讲：组装分区为RAID设备——创建和管理系统备份](/article-7229-1.html)）结合使用，你将同时体验到（LVM 带来的）可扩展性和（RAID 提供的）冗余。

在这类的部署中，你通常会在 `RAID` 上发现 `LVM`，这就是说，要先配置好 RAID 然后它在上面配置 LVM。

如果你对本问有任何的疑问和建议，可以直接在下方的评论区告诉我们。

---

via: <http://www.tecmint.com/manage-and-create-lvm-parition-using-vgcreate-lvcreate-and-lvextend/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

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


使用 OpenCV 识别图片中的猫咪

太高大上   完全 不敢动手。。。。

强悍啊，mark

goodo(￣▽￣)d

# 使用 OpenCV 识别图片中的猫咪

你知道 OpenCV 可以识别在图片中小猫的脸吗？而且是拿来就能用，不需要其它的库之类的。

之前我也不知道。

但是在 [Kendrick Tan 曝出这个功能](http://kendricktan.github.io/find-cats-in-photos-using-computer-vision.html)后，我需要亲自体验一下……去看看到 OpenCV 是如何在我没有察觉到的情况下，将这一个功能添加进了他的软件库（就像一只悄悄溜进空盒子的猫咪一样，等待别人发觉）。

下面，我将会展示如何使用 OpenCV 的猫咪检测器在图片中识别小猫的脸。同样的，该技术也可以用在视频流中。

### 使用 OpenCV 在图片中检测猫咪

如果你查找过 [OpenCV 的代码仓库](https://github.com/Itseez/opencv)，尤其是在 [haarcascades 目录](https://github.com/Itseez/opencv/tree/master/data/haarcascades)里（OpenCV 在这里保存处理它预先训练好的 Haar 分类器，以检测各种物体、身体部位等）， 你会看到这两个文件:

* haarcascade\_frontalcatface.xml
* haarcascade\_frontalcatface\_extended.xml

这两个 Haar Cascade 文件都将被用来在图片中检测小猫的脸。实际上，我使用了相同的 cascades 分类器来生成这篇博文顶端的图片。

在做了一些调查工作之后，我发现这些 cascades 分类器是由鼎鼎大名的 [Joseph Howse](http://nummist.com/) 训练和贡献给 OpenCV 仓库的，他写了很多很棒的教程和书籍，在计算机视觉领域有着很高的声望。

下面，我将会展示给你如何使用 Howse 的 Haar cascades 分类器来检测图片中的小猫。

### 猫咪检测代码

让我们开始使用 OpenCV 来检测图片中的猫咪。新建一个叫 cat\_detector.py 的文件，并且输入如下的代码:

```
# import the necessary packages
import argparse
import cv2

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
    help="path to the input image")
ap.add_argument("-c", "--cascade",
    default="haarcascade_frontalcatface.xml",
    help="path to cat detector haar cascade")
args = vars(ap.parse_args())

```

第 2 和第 3 行主要是导入了必要的 python 包。6-12 行用于解析我们的命令行参数。我们仅要求一个必需的参数 `--image` ，它是我们要使用 OpenCV 检测猫咪的图片。

我们也可以（可选的）通过 `--cascade` 参数指定我们的 Haar cascade 分类器的路径。默认使用 `haarcascades_frontalcatface.xml`，假定这个文件和你的 `cat_detector.py` 在同一目录下。

注意：我已经打包了猫咪的检测代码，还有在这个教程里的样本图片。你可以在博文原文的 “下载” 部分下载到。如果你是刚刚接触 Python+OpenCV（或者 Haar cascade），我建议你下载这个 zip 压缩包，这个会方便你跟着教程学习。

接下来，就是检测猫的时刻了：

```
# load the input image and convert it to grayscale
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# load the cat detector Haar cascade, then detect cat faces
# in the input image
detector = cv2.CascadeClassifier(args["cascade"])
rects = detector.detectMultiScale(gray, scaleFactor=1.3,
    minNeighbors=10, minSize=(75, 75))

```

在 15、16 行，我们从硬盘上读取了图片，并且进行灰度化（这是一个在将图片传给 Haar cascade 分类器之前的常用的图片预处理步骤，尽管不是必须的）

20 行，从硬盘加载 Haar casacade 分类器，即猫咪检测器，并且实例化 `cv2.CascadeClassifier` 对象。

在 21、22 行通过调用 `detector` 的 `detectMultiScale` 方法使用 OpenCV 完成猫脸检测。我们给 `detectMultiScale` 方法传递了四个参数。包括：

1. 图片 `gray`，我们要在该图片中检测猫脸。
2. 检测猫脸时的[图片金字塔](http://www.pyimagesearch.com/2015/03/16/image-pyramids-with-python-and-opencv/) 的检测粒度 `scaleFactor` 。更大的粒度将会加快检测的速度，但是会对检测<ruby> 准确性 <rp>  （ </rp> <rt>  true-positive </rt> <rp>  ） </rp></ruby>产生影响。相反的，一个更小的粒度将会影响检测的时间，但是会增加<ruby> 准确性 <rp>  （ </rp> <rt>  true-positive </rt> <rp>  ） </rp></ruby>。但是，细粒度也会增加<ruby> 误报率 <rp>  （ </rp> <rt>  false-positive </rt> <rp>  ） </rp></ruby>。你可以看这篇博文的“ Haar cascades 注意事项”部分来获得更多的信息。
3. `minNeighbors` 参数控制了检定框的最少数量，即在给定区域内被判断为猫脸的最少数量。这个参数可以很好的排除<ruby> 误报 <rp>  （ </rp> <rt>  false-positive </rt> <rp>  ） </rp></ruby>结果。
4. 最后，`minSize` 参数不言自明。这个值描述每个检定框的最小宽高尺寸（单位是像素），这个例子中就是 75\*75

`detectMultiScale` 函数会返回 `rects`，这是一个 4 元组列表。这些元组包含了每个检测到的猫脸的 (x,y) 坐标值，还有宽度、高度。

最后，让我们在图片上画下这些矩形来标识猫脸：

```
# loop over the cat faces and draw a rectangle surrounding each
for (i, (x, y, w, h)) in enumerate(rects):
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv2.putText(image, "Cat #{}".format(i + 1), (x, y - 10),
        cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)

# show the detected cat faces
cv2.imshow("Cat Faces", image)
cv2.waitKey(0)

```

给我们这些框（比如，rects）的数据，我们在 25 行依次遍历它。

在 26 行，我们在每张猫脸的周围画上一个矩形。27、28 行展示了一个整数，即图片中猫咪的数量。

最后，31，32 行在屏幕上展示了输出的图片。

### 猫咪检测结果

为了测试我们的 OpenCV 猫咪检测器，可以在原文的最后，下载教程的源码。

然后，在你解压缩之后，你将会得到如下的三个文件/目录:

1. cat\_detector.py：我们的主程序
2. haarcascade\_frontalcatface.xml： 猫咪检测器 Haar cascade
3. images：我们将会使用的检测图片目录。

到这一步，执行以下的命令：

```
$ python cat_detector.py --image images/cat_01.jpg

```

*图 1. 在图片中检测猫脸，甚至是猫咪部分被遮挡了。*

注意，我们已经可以检测猫脸了，即使它的其余部分是被遮挡的。

试下另外的一张图片:

```
python cat_detector.py --image images/cat_02.jpg

```

*图 2. 使用 OpenCV 检测猫脸的第二个例子，这次猫脸稍有不同。*

这次的猫脸和第一次的明显不同，因为它正在发出“喵呜”叫声的当中。这种情况下，我们依旧能检测到正确的猫脸。

在下面这张图片的结果也是正确的：

```
$ python cat_detector.py --image images/cat_03.jpg

```

*图 3. 使用 OpenCV 和 python 检测猫脸*

我们最后的一个样例就是在一张图中检测多张猫脸:

```
$ python cat_detector.py --image images/cat_04.jpg

```

*图 4. 在同一张图片中使用 OpenCV 检测多只猫*

注意，Haar cascade 返回的检定框不一定是以你预期的顺序。这种情况下，中间的那只猫会被标记成第三只。你可以通过判断他们的 (x, y) 坐标来自己排序这些检定框。

#### 关于精度的说明

在这个 xml 文件中的注释非常重要，Joseph Hower 提到了这个猫脸检测器有可能会将人脸识别成猫脸。

这种情况下，他推荐使用两种检测器（人脸 & 猫脸），然后将出现在人脸识别结果中的结果剔除掉。

#### Haar cascades 注意事项

这个方法首先出现在 Paul Viola 和 Michael Jones 2001 年出版的 [Rapid Object Detection using a Boosted Cascade of Simple Features](https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf) 论文中。现在它已经成为了计算机识别领域引用最多的论文之一。

这个算法能够识别图片中的对象，无论它们的位置和比例。而且最令人感兴趣的或许是它能在现有的硬件条件下实现实时检测。

在他们的论文中，Viola 和 Jones 关注在训练人脸检测器；但是，这个框架也能用来检测各类事物，如汽车、香蕉、路标等等。

#### 问题是？

Haar cascades 最大的问题就是如何确定 `detectMultiScale` 方法的参数正确。特别是 `scaleFactor` 和 `minNeighbors` 参数。你很容易陷入一张一张图片调参数的坑，这个就是该对象检测器很难被实用化的原因。

这个 `scaleFactor` 变量控制了用来检测对象的图片的各种比例的[图像金字塔](http://www.pyimagesearch.com/2015/03/16/image-pyramids-with-python-and-opencv/)。如果 `scaleFactor` 参数过大，你就只需要检测图像金字塔中较少的层，这可能会导致你丢失一些在图像金字塔层之间缩放时少了的对象。

换句话说，如果 `scaleFactor` 参数过低，你会检测过多的金字塔图层。这虽然可以能帮助你检测到更多的对象。但是他会造成计算速度的降低，还会**明显**提高误报率。Haar cascades 分类器就是这样。

为了避免这个，我们通常使用 [Histogram of Oriented Gradients + 线性 SVM 检测](http://www.pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/) 替代。

上述的 HOG + 线性 SVM 框架的参数更容易调优。而且更好的误报率也更低，但是唯一不好的地方是无法实时运算。

### 对对象识别感兴趣？并且希望了解更多？

*图 5. 在 PyImageSearch Gurus 课程中学习如何构建自定义的对象识别器。*

如果你对学习如何训练自己的自定义对象识别器感兴趣，请务必要去了解下 PyImageSearch Gurus 课程。

在这个课程中，我提供了 15 节课，覆盖了超过 168 页的教程，来教你如何从 0 开始构建自定义的对象识别器。你会掌握如何应用 HOG + 线性 SVM 框架来构建自己的对象识别器来识别路标、面孔、汽车（以及附近的其它东西）。

要学习 PyImageSearch Gurus 课程（有 10 节示例免费课程），点此： <https://www.pyimagesearch.com/pyimagesearch-gurus/?src=post-cat-detection>

### 总结

在这篇博文里，我们学习了如何使用 OpenCV 默认就有的 Haar cascades 分类器来识别图片中的猫脸。这些 Haar casacades 是由 [Joseph Howse](http://www.pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/) 训练兵贡献给 OpenCV 项目的。我是在 Kendrick Tan 的[这篇文章](http://kendricktan.github.io/find-cats-in-photos-using-computer-vision.html)中开始注意到这个。

尽管 Haar cascades 相当有用，但是我们也经常用 HOG + 线性 SVM 替代。因为后者相对而言更容易使用，并且可以有效地降低误报率。

我也会[在 PyImageSearch Gurus 课程中](https://www.pyimagesearch.com/pyimagesearch-gurus/)详细的讲述如何构建定制的 HOG + 线性 SVM 对象识别器，来识别包括汽车、路标在内的各种事物。

不管怎样，我希望你喜欢这篇博文。

---

via: <http://www.pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/>

作者：[Adrian Rosebrock](http://www.pyimagesearch.com/author/adrian/) 译者：[MikeCoder](https://github.com/MikeCoder) 校对：[wxy](https://github.com/wxy)

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


awk 系列：如何使用 awk 比较操作符

# awk 系列：如何使用 awk 比较操作符

<img src="content_image/album_201607_22_135932oyzgzq5ma9dqiiq2.png" alt="" title="">

对于 使用 awk 命令的用户来说，处理一行文本中的数字或者字符串时，使用比较运算符来过滤文本和字符串是十分方便的。

在 awk 系列的此部分中，我们将探讨一下如何使用比较运算符来过滤文本或者字符串。如果你是程序员，那么你应该已经熟悉了比较运算符；对于其它人，下面的部分将介绍比较运算符。

### awk 中的比较运算符是什么？

awk 中的比较运算符用于比较字符串和或者数值，包括以下类型：

* `>` – 大于
* `<` – 小于
* `>=` – 大于等于
* `<=` – 小于等于
* `==` – 等于
* `!=` – 不等于
* `some_value ~ / pattern/` – 如果 some\_value 匹配模式 pattern，则返回 true
* `some_value !~ / pattern/` – 如果 some\_value 不匹配模式 pattern，则返回 true

现在我们通过例子来熟悉 awk 中各种不同的比较运算符。

在这个例子中，我们有一个文件名为 food\_list.txt 的文件，里面包括不同食物的购买列表。我想给食物数量小于或等于 30 的物品所在行的后面加上`(**)`

```
File – food_list.txt
No      Item_Name               Quantity        Price
1       Mangoes                    45           $3.45
2       Apples                     25           $2.45
3       Pineapples                 5            $4.45
4       Tomatoes                   25           $3.45
5       Onions                     15           $1.45
6       Bananas                    30           $3.45

```

Awk 中使用比较运算符的通用语法如下：

```
# 表达式 { 动作; }

```

为了实现刚才的目的，执行下面的命令：

```
# awk '$3 <= 30 { printf "%s\t%s\n", $0,"**" ; } $3 > 30 { print $0 ;}' food_list.txt

No  Item_Name`      Quantity    Price
1   Mangoes            45       $3.45
2   Apples             25       $2.45   **
3   Pineapples         5        $4.45   **
4   Tomatoes           25       $3.45   **
5   Onions             15       $1.45   **
6   Bananas            30       $3.45   **

```

在刚才的例子中，发生如下两件重要的事情：

* 第一个“表达式 {动作;}”组合中， `$3 <= 30 { printf “%s\t%s\n”, $0,”**” ; }` 打印出数量小于等于30的行，并且在后面增加`(**)`。物品的数量是通过 `$3` 这个域变量获得的。
* 第二个“表达式 {动作;}”组合中， `$3 > 30 { print $0 ;}` 原样输出数量小于等于 `30` 的行。

再举一个例子：

```
# awk '$3 <= 20 { printf "%s\t%s\n", $0,"TRUE" ; } $3 > 20  { print $0 ;} ' food_list.txt

No    Item_Name     Quantity    Price
1     Mangoes          45       $3.45
2     Apples           25       $2.45
3     Pineapples        5       $4.45 TRUE
4     Tomatoes         25       $3.45
5     Onions           15       $1.45 TRUE
6     Bananas          30       $3.45

```

在这个例子中，我们想通过在行的末尾增加 (TRUE) 来标记数量小于等于20的行。

### 总结

这是一篇对 awk 中的比较运算符介绍性的指引，因此你需要尝试其他选项，发现更多使用方法。

如果你遇到或者想到任何问题，请在下面评论区留下评论。请记得阅读 awk 系列下一部分的文章，那里我将介绍组合表达式。

---

via: <http://www.tecmint.com/comparison-operators-in-awk/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[chunyang-wen](https://github.com/chunyang-wen) 校对：[wxy](https://github.com/wxy)

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


awk 系列：如何使用 awk 复合表达式

Summary: awk 的复合表达式可由表示“与”的组合操作符 && 和表示“或”的 || 构成。

# awk 系列：如何使用 awk 复合表达式

<img src="content_image/album_201607_22_141405d36gufemq2kkbse0.png" alt="" title="">

一直以来在查对条件是否匹配时，我们使用的都是简单的表达式。那如果你想用超过一个表达式来查对特定的条件呢？

本文中，我们将看看如何在过滤文本和字符串时，结合多个表达式，即复合表达式，用以查对条件。

awk 的复合表达式可由表示“与”的组合操作符 `&&` 和表示“或”的 `||` 构成。

复合表达式的常规写法如下：

```
( 第一个表达式 ) && ( 第二个表达式 )

```

这里只有当“第一个表达式” 和“第二个表达式”都是真值时整个表达式才为真。

```
( 第一个表达式 ) || ( 第二个表达式)

```

这里只要“第一个表达式” 为真或“第二个表达式”为真，整个表达式就为真。

**注意**：切记要加括号。

表达式可以由比较操作符构成，具体可查看 [awk 系列的第四节](/article-7602-1.html)。

现在让我们通过一个例子来加深理解：

此例中，有一个文本文件 `tecmint_deals.txt`，文本中包含着一张随机的 Tecmint 交易清单，其中包含了名称、价格和种类。

```
TecMint Deal List
No      Name                                    Price           Type
1       Mac_OS_X_Cleanup_Suite                  $9.99           Software
2       Basics_Notebook                         $14.99          Lifestyle
3       Tactical_Pen                            $25.99          Lifestyle
4       Scapple                                 $19.00          Unknown
5       Nano_Tool_Pack                          $11.99          Unknown
6       Ditto_Bluetooth_Altering_Device         $33.00          Tech
7       Nano_Prowler_Mini_Drone                 $36.99          Tech

```

我们只想打印出价格超过 $20 且其种类为 “Tech” 的物品，在其行末用 (\*) 打上标记。

我们将要执行以下命令。

```
# awk '($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/) && ($4=="Tech") { printf "%s\t%s\n",$0,"*"; } ' tecmint_deals.txt

6   Ditto_Bluetooth_Altering_Device     $33.00      Tech    *
7   Nano_Prowler_Mini_Drone         $36.99          Tech     *

```

此例，在复合表达式中我们使用了两个表达式：

* 表达式 1：`($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/)` ；查找交易价格超过 `$20` 的行，即只有当 `$3` 也就是价格满足 `/^\$[2-9][0-9]*\.[0-9][0-9]$/` 时值才为真值。
* 表达式 2：`($4 == “Tech”)` ；查找是否有种类为 “`Tech`”的交易，即只有当 `$4` 等于 “`Tech`” 时值才为真值。 切记，只有当 `&&` 操作符的两端状态，也就是两个表达式都是真值的情况下，这一行才会被打上 `(*)` 标志。

### 总结

有些时候为了真正符合你的需求，就不得不用到复合表达式。当你掌握了比较和复合表达式操作符的用法之后，复杂的文本或字符串过滤条件也能轻松解决。

希望本向导对你有所帮助，如果你有任何问题或者补充，可以在下方发表评论，你的问题将会得到相应的解释。

---

via: <http://www.tecmint.com/combine-multiple-expressions-in-awk/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

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


轻松挂载：<br />
nautilus+gvfs-google

# 教你用 google-drive-ocamlfuse 在 Linux 上挂载 Google Drive

>
> 如果你在找一个方便的方式在 Linux 机器上挂载你的 Google Drive 文件夹， Jack Wallen 将教你怎么使用 google-drive-ocamlfuse 来挂载 Google Drive。
>
>
>

*图片来源: Jack Wallen*

Google 还没有发行 Linux 版本的 Google Drive 应用，尽管现在有很多方法从 Linux 中访问你的 Drive 文件。

如果你喜欢界面化的工具，你可以选择 Insync。如果你喜欢用命令行，有很多像 Grive2 这样的工具，以及更容易使用的以 Ocaml 语言编写的基于 FUSE 的文件系统。我将会用后面这种方式演示如何在 Linux 桌面上挂载你的 Google Drive。尽管这是通过命令行完成的，但是它的用法会简单到让你吃惊。它太简单了以至于谁都能做到。

这个系统的特点：

* 对普通文件/文件夹有完全的读写权限
* 对于 Google Docs，sheets，slides 这三个应用只读
* 能够访问 Drive 回收站（.trash）
* 处理重复文件功能
* 支持多个帐号

让我们接下来完成 google-drive-ocamlfuse 在 Ubuntu 16.04 桌面的安装，然后你就能够访问云盘上的文件了。

### 安装

1. 打开终端。
2. 用 `sudo add-apt-repository ppa:alessandro-strada/ppa` 命令添加必要的 PPA
3. 出现提示的时候，输入你的 root 密码并按下回车。
4. 用 `sudo apt-get update` 命令更新应用。
5. 输入 `sudo apt-get install google-drive-ocamlfuse` 命令安装软件。

### 授权

接下来就是授权 google-drive-ocamlfuse，让它有权限访问你的 Google 账户。先回到终端窗口敲下命令 `google-drive-ocamlfuse`，这个命令将会打开一个浏览器窗口，它会提示你登陆你的 Google 帐号或者如果你已经登陆了 Google 帐号，它会询问是否允许 google-drive-ocamlfuse 访问 Google 账户。如果你还没有登录，先登录然后点击“允许”。接下来的窗口（在 Ubuntu 16.04 桌面上会出现，但不会出现在 Elementary OS Freya 桌面上）将会询问你是否授给 gdfuse 和 OAuth2 Endpoint 访问你的 Google 账户的权限，再次点击“允许”。然后出现的窗口就会告诉你等待授权令牌下载完成，这个时候就能最小化浏览器了。当你的终端提示如下图一样的内容，你就能知道令牌下载完了，并且你已经可以挂载 Google Drive 了。

*应用已经得到授权，你可以进行后面的工作。*

### 挂载 Google Drive

在挂载 Google Drive 之前，你得先创建一个文件夹，作为挂载点。在终端里，敲下`mkdir ~/google-drive`命令在你的家目录下创建一个新的文件夹。最后敲下命令`google-drive-ocamlfuse ~/google-drive`将你的 Google Drive 挂载到 google-drive 文件夹中。

这时你可以查看本地 google-drive 文件夹中包含的 Google Drive 文件/文件夹。你可以把 Google Drive 当作本地文件系统来进行工作。

当你想卸载 google-drive 文件夹，输入命令 `fusermount -u ~/google-drive`。

### 没有 GUI，但它特别好用

我发现这个特别的系统非常容易使用，在同步 Google Drive 时它出奇的快，并且这可以作为一种本地备份你的 Google Drive 账户的巧妙方式。（LCTT 译注：然而首先你得能使用……）

试试 google-drive-ocamlfuse，看看你能用它做出什么有趣的事。

---

via: <http://www.techrepublic.com/article/how-to-mount-your-google-drive-on-linux-with-google-drive-ocamlfuse/>

作者：[Jack Wallen](http://www.techrepublic.com/search/?a=jack+wallen)  译者：[GitFuture](https://github.com/GitFuture) 校对：[wxy](https://github.com/wxy)

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


如何在 Ubuntu 上搭建网桥

这篇文章(原文)不是有病吗？在系统默认有 NetworkManager 服务，iproute2 包，还安装了 bridge-utils 的情况下，居然还选择直接编辑配置文件。对于这种直接编辑配置文件的做法，一不直观友好，二如同在 Windows 下直接编辑注册表一样是存在相当大误操作的可能，三，不一定编辑后就能立即生效，比如修改 systemd 的 service 文件后，需要 systemctl daemon-reload 。

想必这篇作者是那种老古板，知识没更新。

ubuntu server版可能是没有network mananger的吧？

新版应该是默认安装的。而且专门为 Linux 而开发的 iproute2，就是用来配置网络的。

新版指的至少是 14.04。

# 如何在 Ubuntu 上搭建网桥

>
> 作为一个 Ubuntu 16.04 LTS 的初学者。如何在 Ubuntu 14.04 和 16.04 的主机上搭建网桥呢？
>
>
>

顾名思义，网桥的作用是通过物理接口连接内部和外部网络。对于虚拟端口或者 LXC/KVM/Xen/容器来说，这非常有用。网桥虚拟端口看起来是网络上的一个常规设备。在这个教程中，我将会介绍如何在 Ubuntu 服务器上通过 bridge-utils (brctl) 命令行来配置 Linux 网桥。

### 网桥化的网络示例

*图 01: Kvm/Xen/LXC 容器网桥示例 (br0)*

在这个例子中，eth0 和 eth1 是物理网络接口。eth0 连接着局域网，eth1 连接着上游路由器和互联网。

### 安装 bridge-utils

使用 [apt-get 命令](%E3%80%80http://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html) 安装 bridge-utils：

```
$ sudo apt-get install bridge-utils

```

或者

```
$ sudo apt install bridge-utils

```

样例输出:

*图 02: Ubuntu 安装 bridge-utils 包*

### 在 Ubuntu 服务器上创建网桥

使用你熟悉的文本编辑器修改 `/etc/network/interfaces` ，例如 vi 或者 nano ：

```
$ sudo cp /etc/network/interfaces /etc/network/interfaces.bakup-1-july-2016
$ sudo vi /etc/network/interfaces

```

接下来设置 eth1 并且将它映射到 br1 ，输入如下（删除或者注释所有 eth1 相关配置）：

```
### br1 使用静态公网 IP 地址，并以 ISP 的路由器作为网关
auto br1
iface br1 inet static
        address 208.43.222.51
        network 255.255.255.248
        netmask 255.255.255.0
        broadcast 208.43.222.55
        gateway 208.43.222.49
        bridge_ports eth1
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

```

接下来设置 eth0 并将它映射到 br0，输入如下（删除或者注释所有 eth0 相关配置）：

```
auto br0
iface br0 inet static
        address 10.18.44.26
        netmask 255.255.255.192
        broadcast 10.18.44.63
        dns-nameservers 10.0.80.11 10.0.80.12
        # set static route for LAN
        post-up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.18.44.1
        post-up route add -net 161.26.0.0 netmask 255.255.0.0 gw 10.18.44.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

```

### 关于 br0 和 DHCP 的一点说明

如果使用 DHCP ，配置选项是这样的：

```
auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

```

保存并且关闭文件。

### 重启服务器或者网络服务

你需要重启服务器或者输入下列命令来重启网络服务（在 SSH 登录的会话中这可能不管用）：

```
$ sudo systemctl restart networking

```

如果你证使用 Ubuntu 14.04 LTS 或者更老的没有 systemd 的系统，输入：

```
$ sudo /etc/init.d/restart networking

```

### 验证网络配置成功

使用 ping/ip 命令来验证 LAN 和 WAN 网络接口运行正常：

```
### 查看 br0 和 br1
ip a show
### 查看路由信息
ip r
### ping 外部站点
ping -c 2 cyberciti.biz
### ping 局域网服务器
ping -c 2 10.0.80.12

```

样例输出：

*图 03: 验证网桥的以太网连接*

现在，你就可以配置 br0 和 br1 来让 XEN/KVM/LXC 容器访问因特网或者私有局域网了。再也没有必要去设置特定路由或者 iptables 的 SNAT 规则了。

---

via: <http://www.cyberciti.biz/faq/how-to-create-bridge-interface-ubuntu-linux/>

作者：[VIVEK GITE](https://twitter.com/nixcraft) 译者：[MikeCoder](https://github.com/MikeCoder) 校对：[wxy](https://github.com/wxy)

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


微软要干掉点对点 Skype，Linux 和 Mac 原生客户端将消亡

用Web没问题，重点是功能和易用性。

所有的APP都要统一到只有一个外壳——浏览器吗？

文章重点是安全性

# 微软要干掉点对点 Skype，Linux 和 Mac 原生客户端将消亡

前两天我们报道过，[微软为 Linux 带来了全新的 Skype 客户端](/article-7574-1.html)，功能与 Windows 下的最新客户端保持看齐。但是，这个新的 Linux 客户端是基于 WebRTC 的，其事实上宣告了在 Linux 和 OS X 下的原生客户端的终结——虽然它们相对于 Windows 下的客户端比较老旧了，无论是界面和功能。

这是因为，Skype 整个重构了，用以云为中心的代码架构替代了之前的点对点架构。现在的 Windows、iOS、Android 和 Web 浏览器下的 Skype 客户端都已经是基于新的云架构，因此，这次发布的 Linux 客户端也采用了同样的架构。

微软并没有向 Mac 和 Linux 用户宣布原生客户端终结的日期，你现在仍然可以下载到这些应用。但是很显然，微软将不会再为这些臃肿的 OS X 和 Linux 原生客户端投入更多金钱和精力。

<img src="content_image/album_201607_23_120820rho361o93b3csssz.jpg" alt="" title="">

在 Skype 博客上的[一篇博文](http://blogs.skype.com/2016/07/20/skype-the-journey-weve-been-on/)中，微软提到了它将更关注于“核心平台”，换言之，就是“更新的发布、更轻、更快的在 Windows 10、iPhone、iPad 和 Android 下的应用。”Linux、OS X 下的客户端 （以及旧式 Windows 版本）最终将会被“基于 Web 的原生版本 Skype ”所取代，“得益于最新的 ORTC / WebRTC 技术”，它会运行在浏览器里。

发布于 2003 年的 Skype 原本由于其可以穿透防火墙的 VoIP 技术而得到了快速发展，从而先后被 eBay 和微软收购。然而当微软完成了向云迈进的转型之后，它就只剩下一个牌子和外壳了，它之前的点对点网络、各种特色的服务，终将消逝。

微软认为他们需要重构 Skype 以改进其通话品质：当语音数据传送到微软的云端时，他们可以对进出的数据进行处理，也就是说，可以控制语音质量。当然，用户的体验仍然与其带宽、ISP 等有关。那些特色服务也会有新的解决方案，现在已经是一个轻量、移动优先的时代了，这些功能都可以放到云端，而不是每个客户端里面。因此，微软可以向这些用户提供新的、增强的功能，比如更好的文件共享服务、视频通话、群聊、翻译以及机器人等等。

没有理由认为微软会取消 Skype 的加密通讯机制，但是离开了点对点模式，显然会增加用户在隐私方面的忧虑。

如今，其点对点 IM 使用的是 AES 256 加密，而通过云传输时则使用的是 TLS。当通话双方都是在网络上时，他们都是通过 TLS 传输的，而拨到电话时则仍旧采用 AES 256。

然而，并不清楚是否是端到端加密，由客户端之间进行加密协商，这一点上微软并没有给出明确的答案。如果加密只是在微软和客户端之间协商建立，用户肯定会面临着其传输的数据被协助司法调查。这一点不像 WhatsApp，微软将有能力做到监听。


共享的未来：Pydio 与 ownCloud 的联合

Summary: 在支持联合共享（Federated sharing）标准的服务器之间分享文件和文件夹，比如说 Pydio 和 ownCloud。

臃肿的 OS X 和 Linux 原生客户端，来linux中国也又一段时间了，觉得吧，还是改名叫叫windows中国好，或者虚拟机linux中国好

少侠何出此言？

# 共享的未来：Pydio 与 ownCloud 的联合

*图片来源 : opensource.com*

开源共享生态圈内容纳了许多各异的项目，它们每一个都给出了自己的解决方案，且每一个都不按套路来。有很多原因导致你选择开源的解决方案，而非 Dropbox、Google Drive、iCloud 或 OneDrive 这些商业的解决方案。这些商业的解决方案虽然能让你不必为如何管理数据担心，但也理所应当的带着种种限制，其中就包括对于原有基础结构的控制和整合不足。

对于用户而言仍有相当一部分可供选择的文件分享和同步的替代品，其中就包括了 Pydio 和 ownCloud。

### Pydio

Pydio （<ruby> 把你的数据放上轨道 <rp>  （ </rp> <rt>  Put your data in orbit </rt> <rp>  ） </rp></ruby>） 项目由一位作曲家 Charles du Jeu 发起，起初他只是需要一种与乐队成员分享大型音频文件的方法。[Pydio](https://pydio.com/) 是一种文件分享与同步的解决方案，综合了多存储后端，设计时还同时考虑了开发者和系统管理员两方面。在世界各地有逾百万的下载量，已被翻译成 27 种语言。

项目在刚开始的时候便开源了，先是在 [SourceForge](https://sourceforge.net/projects/ajaxplorer/) 上茁壮的成长，现在已在 [GitHub](https://github.com/pydio/) 上安了家。

用户界面基于 Google 的 [Material 设计风格](https://www.google.com/design/spec/material-design/introduction.html)。用户可以使用现有的传统文件基础结构或是根据预估的需求部署 Pydio，并通过 web、桌面和移动端应用随时随地地管理自己的东西。对于管理员来说，细粒度的访问权限绝对是配置访问时的利器。

在 [Pydio 社区](https://pydio.com/en/community)，你可以找到许多让你增速的资源。Pydio 网站 [对于如何为 Pydio GitHub 仓库贡献](https://pydio.com/en/community/contribute) 给出了明确的指导方案。[论坛](https://pydio.com/forum/f)中也包含了开发者板块和社区。

### ownCloud

[ownCloud](https://owncloud.org/) 在世界各地拥有逾 8 百万的用户，它是一个开源、自行管理的文件同步共享技术。同步客户端支持所有主流平台并支持 WebDAV 通过 web 界面实现。ownCloud 拥有简单的使用界面，强大的管理工具，和大规模的共享及协作功能——以满足用户管理数据时的需求。

ownCloud 的开放式架构是通过 API 和为应用提供平台来实现可扩展性的。迄今已有逾 300 款应用，功能包括处理像日历、联系人、邮件、音乐、密码、笔记等诸多数据类型。ownCloud 由一个数百位贡献者的国际化的社区开发，安全，并且能做到为小到一个树莓派大到好几百万用户的 PB 级存储集群量身定制。

### <ruby> 联合共享 <rp>  （ </rp> <rt>  Federated sharing </rt> <rp>  ） </rp></ruby>

文件共享开始转向团队合作时代，而标准化为合作提供了坚实的土壤。

<ruby> 联合共享 <rp>  （ </rp> <rt>  Federated sharing </rt> <rp>  ） </rp></ruby>——一个由 [OpenCloudMesh](https://wiki.geant.org/display/OCM/Open+Cloud+Mesh) 项目提供的新的开放标准，就是在这个方向迈出的一步。先不说别的，在支持该标准的服务器之间分享文件和文件夹，比如说 Pydio 和 ownCloud。

ownCloud 7 率先引入该标准，这种服务器到服务器的分享方式可以让你挂载远程服务器上共享的文件，实际上就是创建你自己的云上之云。你可以直接为其它支持联合共享的服务器上的用户创建共享链接。

实现这个新的 API 允许存储解决方案之间更深层次的集成，同时保留了原有平台的安全，控制和特性。

“交换和共享文件是当下和未来不可或缺的东西。”ownCloud 的创始人 Frank Karlitschek 说道：“正因如此，采用联合和分布的方式而非集中的数据孤岛就显得至关重要。联合共享的设计初衷便是在保证安全和用户隐私的同时追求分享的无缝、至简之道。”

### 下一步是什么呢？

正如 OpenCloudMesh 做的那样，将会通过像 Pydio 和 ownCloud 这样的机构和公司，合作推广这一文件共享的新开放标准。ownCloud 9 已经引入联合的服务器之间交换用户列表的功能，让你的用户们在你的服务器上享有和你同样的无缝体验。将来，一个中央地址簿服务（联合的）集合，用以检索其他联合云 ID 的构想可能会把云间合作推向一个新的高度。

这一举措无疑有助于日益开放的技术社区中的那些成员方便地讨论，开发，并推动“OCM 分享 API”作为一个厂商中立协议。所有领导 OCM 项目的合作伙伴都全心致力于开放 API 的设计原则，并欢迎其他开源的文件分享和同步社区参与并加入其中。

---

via: <https://opensource.com/business/16/5/sharing-files-pydio-owncloud>

作者：[ben van 't ende](https://opensource.com/users/benvantende) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

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


awk 系列：如何使用 awk 的 ‘next’ 命令

Summary: 我们来看一下next命令 ，它告诉 awk 跳过你所提供的所有剩下的模式和表达式，直接处理下一个输入行。

printf后面的参量表不用（）？？ 我在2.6内核下 不用（）会报错呀？？

非常感谢,赞

# awk 系列：如何使用 awk 的 ‘next’ 命令

<img src="content_image/album_201607_24_182654td00pzrdarrpjafw.png" alt="" title="">

在 awk 系列的第六节，我们来看一下`next`命令 ，它告诉 awk 跳过你所提供的所有剩下的模式和表达式，直接处理下一个输入行。

`next` 命令帮助你阻止运行命令执行过程中多余的步骤。

要明白它是如何工作的, 让我们来分析一下 food\_list.txt 它看起来像这样：

```
Food List Items
No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

```

运行下面的命令，它将在每个食物数量小于或者等于 20 的行后面标一个星号:

```
# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt

No    Item_Name     Price      Quantity
1     Mangoes       $3.45       5    *
2     Apples        $2.45      25
3     Pineapples    $4.45      55
4     Tomatoes      $3.45      25
5     Onions        $1.45      15   *
6     Bananas       $3.45      30

```

上面的命令实际运行如下:

* 首先，它用`$4 <= 20`表达式检查每个输入行的第四列（数量（Quantity））是否小于或者等于 20，如果满足条件，它将在末尾打一个星号 `(*)`。
* 接着，它用`$4 > 20`表达式检查每个输入行的第四列是否大于20，如果满足条件，显示出来。

但是这里有一个问题, 当第一个表达式用`{ printf "%s\t%s\n", $0,"**" ; }`命令进行标注的时候在同样的步骤第二个表达式也进行了判断这样就浪费了时间.

因此当我们已经用第一个表达式打印标志行的时候就不再需要用第二个表达式`$4 > 20`再次打印。

要处理这个问题, 我们需要用到`next` 命令：

```
# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No  Item_Name       Price           Quantity
1     Mangoes       $3.45               5   *
2     Apples        $2.45              25
3     Pineapples    $4.45              55
4     Tomatoes      $3.45              25
5     Onions        $1.45              15   *
6     Bananas       $3.45              30

```

当输入行用`$4 <= 20` `{ printf "%s\t%s\n", $0,"*" ; next ; }`命令打印以后，`next`命令将跳过第二个`$4 > 20` `{ print $0 ;}`表达式，继续判断下一个输入行，而不是浪费时间继续判断一下是不是当前输入行还大于 20。

`next`命令在编写高效的命令脚本时候是非常重要的，它可以提高脚本速度。本系列的下一部分我们将来学习如何使用 awk 来处理标准输入（STDIN）。

希望这篇文章对你有帮助，你可以给我们留言。

---

via: <http://www.tecmint.com/use-next-command-with-awk-in-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[kokialoves](https://github.com/kokialoves) 校对：[wxy](https://github.com/wxy)

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


awk 系列：awk 怎么读取标准输入（STDIN）

Summary: 你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入。

下一节还没出来呢，期待中

看了前面几节，觉得基础好重要啊

没有了。。

你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入。

# awk 系列：awk 怎么读取标准输入（STDIN）

在 awk 系列的前几节，我们看到大多数操作都是从一个文件或多个文件读取输入，或者你想要把标准输入作为 awk 的输入。

在 awk 系列的第七节中，我们将会看到几个例子，你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入。

我们首先从使用 [dir 命令](http://www.tecmint.com/linux-dir-command-usage-with-examples/)开始，它类似于 [ls 命令](http://www.tecmint.com/15-basic-ls-command-examples-in-linux/)，在第一个例子下面，我们使用 `dir -l` 命令的输出作为 awk 命令的输入，这样就可以打印出文件拥有者的用户名，所属组组名以及在当前路径下他／她拥有的文件。

```
# dir -l | awk '{print $3, $4, $9;}'

```

*列出当前路径下的用户文件*

再来看另一个例子，我们[使用 awk 表达式](/article-7599-1.html) ，在这里，我们想要在 awk 命令里使用一个表达式筛选出字符串来打印出属于 root 用户的文件。命令如下：

```
# dir -l | awk '$3=="root" {print $1,$3,$4, $9;} '

```

*列出 root 用户的文件*

上面的命令包含了 `(==)` 来进行比较操作，这帮助我们在当前路径下筛选出 root 用户的文件。这是通过使用 `$3=="root"` 表达式实现的。

让我们再看另一个例子，我们使用一个 [awk 比较运算符](/article-7602-1.html) 来匹配一个确定的字符串。

这里，我们使用了 [cat 命令](http://www.tecmint.com/13-basic-cat-command-examples-in-linux/) 来浏览文件名为 tecmint\_deals.txt 的文件内容，并且我们想要仅仅查看有字符串 Tech 的部分，所以我们会运行下列命令：

```
# cat tecmint_deals.txt
# cat tecmint_deals.txt | awk '$4 ~ /tech/{print}'
# cat tecmint_deals.txt | awk '$4 ~ /Tech/{print}'

```

*用 Awk 比较运算符匹配字符串*

在上面的例子中，我们已经用了参数为 `~ /匹配字符/` 的比较操作，但是上面的两个命令给我们展示了一些很重要的问题。

当你运行带有 tech 字符串的命令时终端没有输出，因为在文件中没有 tech 这种字符串，但是运行带有 Tech 字符串的命令，你却会得到包含 Tech 的输出。

所以你应该在进行这种比较操作的时候时刻注意这种问题，正如我们在上面看到的那样，awk 对大小写很敏感。

你总是可以使用另一个命令的输出作为 awk 命令的输入来代替从一个文件中读取输入，这就像我们在上面看到的那样简单。

希望这些例子足够简单到可以使你理解 awk 的用法，如果你有任何问题，你可以在下面的评论区提问，记得查看 awk 系列接下来的章节内容，我们将关注 awk 的一些功能，比如变量，数字表达式以及赋值运算符。

---

via: <http://www.tecmint.com/read-awk-input-from-stdin-in-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[vim-kakali](https://github.com/vim-kakali) 校对：[wxy](https://github.com/wxy)

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


Terminix：一个很赞的基于 GTK3 的平铺式 Linux 终端模拟器

不翻墙下载不了，一看s3.amazon.com我就准知道用不了，不过机智的我用了蓝灯直接从浏览器上下在，哈哈

# Terminix：一个很赞的基于 GTK3 的平铺式 Linux 终端模拟器

现在，你可以很容易的找到[大量的 Linux 终端模拟器](http://www.tecmint.com/linux-terminal-emulators/)，每一个都可以给用户留下深刻的印象。

但是，很多时候，我们会很难根据我们的喜好来找到一款心仪的日常使用的终端模拟器。这篇文章中，我们将会推荐一款叫做 Terminix 的令人激动的终端模拟机。

*Terminix Linux 终端模拟器*

Terminix 是一个使用 VTE GTK+ 3 组件的平铺式终端模拟器。使用 GTK 3 开发的原因主要是为了符合 GNOME HIG（<ruby> 人机接口 <rp>  （ </rp> <rt>  Human Interface Guidelines </rt> <rp>  ） </rp></ruby>) 标准。另外，Terminix 已经在 GNOME 和 Unity 桌面环境下测试过了，也有用户在其他的 Linux 桌面环境下测试成功。

和其他的终端模拟器一样，Terminix 有着很多知名的特征，列表如下：

* 允许用户进行任意的垂直或者水平分屏
* 支持拖拽功能来进行重新排布终端
* 支持使用拖拽的方式终端从窗口中将脱离出来
* 支持终端之间的输入同步，因此，可以在一个终端输入命令，而在另一个终端同步复现
* 终端的分组配置可以保存在硬盘，并再次加载
* 支持透明背景
* 允许使用背景图片
* 基于主机和目录来自动切换配置
* 支持进程完成的通知信息
* 配色方案采用文件存储，同时支持自定义配色方案

### 如何在 Linux 系统上安装 Terminix

现在来详细说明一下在不同的 Linux 发行版本上安装 Terminix 的步骤。首先，在此列出 Terminix 在 Linux 所需要的环境需求。

#### 依赖组件

为了正常运行，该应用需要使用如下库：

* GTK 3.14 或者以上版本
* GTK VTE 0.42 或者以上版本
* Dconf
* GSettings
* Nautilus 的 iNautilus-Python 插件

如果你已经满足了如上的系统要求，接下来就是安装 Terminix 的步骤。

#### 在 RHEL/CentOS 7 或者 Fedora 22-24 上

首先，你需要通过新建文件 `/etc/yum.repos.d/terminix.repo` 来增加软件仓库，使用你最喜欢的文本编辑器来进行编辑：

```
# vi /etc/yum.repos.d/terminix.repo

```

然后拷贝如下的文字到我们刚新建的文件中：

```
[heikoada-terminix]
name=Copr repo for terminix owned by heikoada
baseurl=https://copr-be.cloud.fedoraproject.org/results/heikoada/terminix/fedora-$releasever-$basearch/
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/heikoada/terminix/pubkey.gpg
enabled=1
enabled_metadata=1

```

保存文件并退出。

然后更新你的系统，并且安装 Terminix，步骤如下：

```
---------------- On RHEL/CentOS 7 ----------------
# yum update
# yum install terminix

---------------- On Fedora 22-24 ----------------
# dnf update
# dnf install terminix

```

#### 在 Ubuntu 16.04-14.04 和 Linux Mint 18-17

虽然没有基于 Debian/Ubuntu 发行版本的官方的软件包，但是你依旧可以通过如下的命令手动安装。

```
$ wget -c https://github.com/gnunn1/terminix/releases/download/1.1.1/terminix.zip
$ sudo unzip terminix.zip -d /
$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas/

```

#### 其它 Linux 发行版

OpenSUSE 用户可以从默认仓库中安装 Terminix，Arch Linux 用户也可以安装 [AUR Terminix 软件包](https://aur.archlinux.org/packages/terminix)。

### Terminix 截图教程

*Terminix 终端*

*Terminix 终端设置*

*Terminix 多终端界面*

### 如何卸载删除 Terminix

如果你是手动安装的 Terminix 并且想要删除它，那么你可以参照如下的步骤来卸载它。从 [Github 仓库](https://github.com/gnunn1/terminix)上下载 uninstall.sh，并且给它可执行权限并且执行它：

```
$ wget -c https://github.com/gnunn1/terminix/blob/master/uninstall.sh
$ chmod +x uninstall.sh
$ sudo sh uninstall.sh

```

但是如果你是通过包管理器安装的 Terminix，你可以使用包管理器来卸载它。

在这篇介绍中，我们在众多优秀的终端模拟器中发现了一个重要的 Linux 终端模拟器。你可以尝试着去体验下它的新特性，并且可以将它和你现在使用的终端进行比较。

重要的一点，如果你想得到更多信息或者有疑问，请使用评论区，而且不要忘了，给我一个关于你使用体验的反馈。

---

via: <http://www.tecmint.com/terminix-tiling-terminal-emulator-for-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[MikeCoder](https://github.com/MikeCoder) 校对：[wxy](https://github.com/wxy)

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


LFCS 系列第十二讲：如何使用 Linux 的帮助文档和工具

Summary: 另一个你必须熟悉命令行帮助工具的理由是，在LFCS 和 LFCE 考试中，它们是你唯一能够使用的信息来源，没有互联网也没有百度。你只能依靠你自己和命令行。

# LFCS 系列第十二讲：如何使用 Linux 的帮助文档和工具

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 [LFCS 系列](/article-7161-1.html)系列添加了一些必要的内容。为了考试的需要，我们强烈建议你看一下[LFCE 系列](http://www.tecmint.com/installing-network-services-and-configuring-services-at-system-boot/)。

*LFCS: 了解 Linux 的帮助文档和工具*

当你习惯了在命令行下进行工作，你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档。

另一个你必须熟悉命令行帮助工具的理由是，在[LFCS](/article-7161-1.html) 和 [LFCE](http://www.tecmint.com/installing-network-services-and-configuring-services-at-system-boot/) 考试中，它们是你唯一能够使用的信息来源，没有互联网也没有百度。你只能依靠你自己和命令行。

基于上面的理由，在这一章里我们将给你一些建议来可以让你有效的使用这些安装的文档和工具，以帮助你通过**Linux 基金会认证**考试。

### Linux <ruby> 帮助手册 <rp>  （ </rp> <rt>  man </rt> <rp>  ） </rp></ruby>

man 手册是 manual 手册的缩写，就是其名字所揭示的那样：一个给定工具的帮助手册。它包含了命令所支持的选项列表（以及解释），有些工具甚至还提供一些使用范例。

我们用 **man 命令** 跟上你想要了解的工具名称来打开一个帮助手册。例如：

```
# man diff

```

这将打开`diff`的手册页，这个工具将逐行对比文本文件（如你想退出只需要轻轻的点一下 q 键）。

下面我来比较两个文本文件 `file1` 和 `file2`。这两个文本文件包含了使用同一个 Linux 发行版相同版本安装的两台机器上的的安装包列表。

输入`diff` 命令它将告诉我们 `file1` 和`file2` 有什么不同:

```
# diff file1 file2

```

*在Linux中比较两个文本文件*

`<` 这个符号是说`file2`缺失的行。如果是 `file1`缺失，我们将用 `>` 符号来替代指示。

另外，**7d6** 意思是说`file1`的第**7**行要删除了才能和`file2`一致（**24d22** 和 **41d38** 也是同样的意思） **65,67d61** 告诉需要删除从第 **65** 行到 **67** 行。我们完成了以上步骤，那么这两个文件将完全一致。

此外，根据 man 手册说明，你还可以通过 `-y` 选项来以两路的方式显示文件。你可以发现这对于你找到两个文件间的不同根据方便容易。

```
# diff -y file1 file2

```

*比较并列出两个文件的不同*

此外，你也可以用`diff`来比较两个二进制文件。如果它们完全一样，`diff` 将什么也不会输出。否则，它将会返回如下信息：“**Binary files X and Y differ**”。

### –help 选项

`--help`选项，大多数命令都支持它（并不是所有）， 它可以理解为一个命令的简短帮助手册。尽管它没有提供工具的详细介绍，但是确实是一个能够快速列出程序的所支持的选项的不错的方法。

例如，

```
# sed --help

```

将显示 sed （流编辑器）的每个支持的选项。

`sed`命令的一个典型用法是替换文件中的字符。用 `-i` 选项（意思是 “**原地编辑编辑文件**”），你可以编辑一个文件而且并不需要打开它。 如果你想要同时备份一个原始文件，用 `-i` 选项加后缀来创建一个原始文件的副本。

例如，替换 `lorem.txt` 中的`Lorem` 为 `Tecmint`（忽略大小写），并且创建一个原文件的备份副本，命令如下：

```
# less lorem.txt | grep -i lorem
# sed -i.orig 's/Lorem/Tecmint/gI' lorem.txt
# less lorem.txt | grep -i lorem
# less lorem.txt.orig | grep -i lorem

```

请注意`lorem.txt`文件中`Lorem` 都已经替换为 `Tecmint`，并且原文件 `lorem.txt` 被保存为`lorem.txt.orig`。

*替换文件中的文本*

### /usr/share/doc 内的文档

这可能是我最喜欢的方法。如果你进入 `/usr/share/doc` 目录，并列出该目录，你可以看到许多以安装在你的 Linux 上的工具为名称的文件夹。

根据 [文件系统层级标准](/article-6132-1.html)，这些文件夹包含了许多帮助手册没有的信息，还有一些可以使配置更方便的模板和配置文件。

例如，让我们来看一下 `squid-3.3.8` （不同发行版的版本可能会不同），这还是一个非常受欢迎的 HTTP 代理和 [squid 缓存服务器](http://www.tecmint.com/configure-squid-server-in-linux/)。

让我们用`cd`命令进入目录：

```
# cd /usr/share/doc/squid-3.3.8

```

列出当前文件夹列表：

```
# ls

```

*使用 ls 列出目录*

你应该特别注意 `QUICKSTART` 和 `squid.conf.documented`。这些文件分别包含了 Squid 详细文档及其经过详细备注的配置文件。对于别的安装包来说，具体的名字可能不同（有可能是 **QuickRef** 或者**00QUICKSTART**），但意思是一样的。

对于另外一些安装包，比如 Apache web 服务器，在`/usr/share/doc`目录提供了配置模板，当你配置独立服务器或者虚拟主机的时候会非常有用。

### GNU 信息文档

你可以把它看做帮助手册的“开挂版”。它不仅仅提供工具的帮助信息，而且还是超级链接的形式（没错，在命令行中的超级链接），你可以通过箭头按钮从一个章节导航到另外章节，并按下回车按钮来确认。

一个典型的例子是：

```
# info coreutils

```

因为 coreutils 包含了每个系统中都有的基本文件、shell 和文本处理工具，你自然可以从 coreutils 的 info 文档中得到它们的详细介绍。

*Info Coreutils*

和帮助手册一样，你可以按 q 键退出。

此外，GNU info 还可以显示标准的帮助手册。 例如：

```
# info tune2fs

```

它将显示 **tune2fs**的帮助手册, 这是一个 ext2/3/4 文件系统管理工具。

我们现在看到了，让我们来试试怎么用**tune2fs**：

显示 **/dev/mapper/vg00-vol\_backups** 文件系统信息：

```
# tune2fs -l /dev/mapper/vg00-vol_backups

```

修改文件系统标签（修改为 Backups）：

```
# tune2fs -L Backups /dev/mapper/vg00-vol_backups

```

设置文件系统的自检间隔及挂载计数（用`-c` 选项设置挂载计数间隔， 用 `-i` 选项设置自检时间间隔，这里 **d 表示天，w 表示周，m 表示月**)。

```
# tune2fs -c 150 /dev/mapper/vg00-vol_backups # 每 150 次挂载检查一次
# tune2fs -i 6w /dev/mapper/vg00-vol_backups # 每 6 周检查一次

```

以上这些内容也可以通过 `--help` 选项找到，或者查看帮助手册。

### 摘要

不管你选择哪种方法，知道并且会使用它们在考试中对你是非常有用的。你知道其它的一些方法吗? 欢迎给我们留言。

---

via: <http://www.tecmint.com/explore-linux-installed-help-documentation-and-tools/>

作者：[Gabriel Cánepa](http://www.tecmint.com/author/gacanepa/) 译者：[kokialoves](https://github.com/kokialoves) 校对：[wxy](https://github.com/wxy)

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


玩转 Windows 10 中的 Linux 子系统

Summary: 首先，我会展示 WSL 所集成的那些主要命令（比如 ssh）是如何操作服务器和设备的。其次，我会演示使用 Bash 脚本是如何以简明的方式来自动化执行任务的。其三，我会利用极棒的命令行编译器、一些其它工具以及对 *nix 兼容的能力来玩一个轻量级的古典黑客级游戏： NetHack。最后，我会展示如何使用已有的 Python 脚本和其它来自网上的脚本。

天啊。Windows里可以运行原生linux，但反过来却完全不行

WINE

是shell命令，又不是软件。

是应该WIN中有LIN还是LIN中有WIN？？？？

难道不是软件吗？就算是 busybox 也是软件。

到底怎么安装？

必须是Windows 10 Redstone 1

你看看人家爸，十岁送服务器。我他妈上大学上了大二才买电脑，怎么能可能不输在起跑线上？

wine project 表示你在说啥？大声点！我听不见！

大神的SSD好大啊！都上1TB了！

Linux的应用越来越广泛，最后终于应用到了windows上。。。

对于一部分负责运维的用户来说，能用SSH和SCP就够了，不需要Putty之类的软件了

UAC 权限提升 -> cmd ->

dism -online -get-features -format:table | more

dism -online -enable-feature -featurename:???

我反而觉得，运维更需要这类远程工具，别告诉我一个公司才一两台服务器，多个服务器一个一个输ssh命令不输死，用工具就输个用户名密码就好

ansible挺好的

闲得蛋疼，不如使用 ssh 登陆远程原生 linux。

微软想干掉linux，还是微软爱 linux？这都不好说。

这玩意儿就像cgwin，重建了代码，但是 API 还是那一套。

想法不错。但是我不会用，更不想尝试。

cmd 權限提升 -> cmd -> 輸入命令

dism -online -enable-feature -featurename:Microsoft-Windows-Subsystem-Linux

来自四川成都的 Microsoft Edge 14.14393|Windows 10 用户

作为一个没用过ｗｉｎｄｏｗｓ上的阉割版ｌｉｎｕｘ的人，我想问下你们使用的感受是什么？谢谢～

这个功能不错，期待

用虚拟机的感受会好些（就这么多）

# 玩转 Windows 10 中的 Linux 子系统

在今年的 Build 2016 上，微软向全世界[介绍了](/article-7177-1.html)他们还处于 Beta 阶段的 <ruby> Windows 下的 Linux 子系统 <rp>  （ </rp> <rt>  Windows Subsystem for Linux </rt> <rp>  ） </rp></ruby>（WSL），它可以让开发者们在 Windows 10 下通过 Bash shell 运行原生的 Ubuntu 用户态二进制程序。如果你参与了 Windows Insider 计划，你就可以在最新的 Windows 10 年度升级版的 Insider 构建版中体验这个功能了。

Web 开发人员们不用再苦恼所用的 Windows 开发平台上没有合适的 Linux 工具和库了。WSL 是由 Windows 内核团队与 Canonical 合作设计和开发的，可以让 Windows 10 下的开发者们在拥有 Windows 中那些强力支持之外，还能使用 Linux 下丰富的开发环境与工具，而不用启动到另外的操作系统或者使用虚拟机。这绝对是一个“来自开发者，服务开发者”的 Windows 10 特色，它的目的是让开发者们每天的开发工作都变得顺畅而便捷。

在本文中，我会展示给你一些我认为非常有趣的功能，以及告诉你一些可以让你找到更多信息的资源。首先，我会展示 WSL 所集成的那些主要命令（比如 ssh）是如何操作服务器和设备的。其次，我会演示使用 Bash 脚本是如何以简明的方式来自动化执行任务的。其三，我会利用极棒的命令行编译器、一些其它工具以及对 \*nix 兼容的能力来玩一个轻量级的古典黑客级游戏： NetHack。最后，我会展示如何使用已有的 Python 脚本和其它来自网上的脚本。

>
> 从我的第一台 286 上运行的 Windows 3.0 开始，Windows 就一直是我的主要操作系统和开发环境。不过，我身边也有很多 Linux 服务器和设备。从树莓派和路由器/网关设备这样的物联网设备，到 Minecraft 服务器，它们堆满了我的办公室的每个角落。而我经常要从我的主工作站中去管理和配置这些 Linux 计算机。
>
>
>

### 管理服务器和设备

我在我的家中运行着一台无显示器的 Ubuntu Minecraft 服务器，这是我去年给我十岁大的儿子的圣诞礼物，但是它已经变成了我的玩具而不是他的（好吧，主要是我的玩具）。我以前在我的 Windows 10 电脑上使用几个客户端来管理它，不过我现在想使用 Windows 中的 Bash 里面的 ssh 命令行来管理它。使用类似 PuTTY 或来自 Cygwin 的 Tera Term 这样的应用当然也可以，但是我想试试真正原生而自然的体验也是一种不错的选择。Cygwin 就像是在披萨店订购的披萨一样，好吃，但是没有那种氛围。

我已经使用 WSL 中的 `ssh-keygen` 和 `ssh-copy-id` 设置好了公私密钥对，所以使用 ssh 只需要如下简单输入即可：

```
$ ssh <username>@<server>
```

我还为此创建了一个别名，以便更快一些。这是一个标准的 Linux/Bash 功能：

```
$ alias mc='ssh <user>@<server>'
```

现在，我要访问我的 Minecraft 服务器只需要在 Windows 10 下的 Bash 中输入“mc”即可。

当然，同样的方法你也可以用于任何 Linux 上的 Web 或数据库服务器上，甚至树莓派或其它的物联网设备也可以。

>
> 在终端里面进行 ssh 只是为了方便而已，不过当你在 shell 中工作时，如果还有类似 apt、node、Ruby、Python 等等工具时，你就有了自动化各种工作的可能。
>
>
>

### 远程脚本

假如说你有一大堆 Linux 服务器和设备，而你要在它们上面执行一个远程命令的话，如果已经配置好公私密钥对，你就可以在 Bash 中直接远程执行命令。

举个例子说，想知道远程服务器自从上次重启后已经运行了多长时间了，你只需要输入：

```
$ ssh <user>@<server> 'last -x|grep reboot'
```

ssh 会连接到该服务器并执行 `last -x` 命令，然后搜索包含“reboot”的一行。我在我的 Ubuntu Minecraft 服务器上运行的结果如下：

```
reboot   system boot  4.4.0-28-generic Thu Jul  7 08:14   still running
```

这只是一台服务器，如果你有许多服务器的话，你可以自动化这个过程。我在 WSL 里我的主目录下创建了一个名为 servers.txt 的文件，它包含了一系列 Linux 服务器/设备的名称，每个一行。然后我就可以创建一个脚本来读取这个文件。

在使用了很多年像树莓派这样的设备之后，我已经变成了一个 nano 人（在 VMS 上我是一个 LSEdit 人），下面是我用我喜爱的 nano 编辑器打开的脚本。

当然，你也可以使用 vim 、 emacs 或者其它可以用在 Ubuntu 终端上的编辑器。

该脚本是 Bash 脚本，要执行该脚本，输入：

```
$ ./foreachserver.sh 'last -x|grep reboot'
```

它将迭代输出文件中的每个服务器/设备，然后通过 ssh 远程执行该命令。当然，这个例子非常简单，但是你可以像这样把你的本地脚本或其它命令变成远程的。Bash 脚本语言足够丰富，所以你可以使用它来完成你的大多数远程管理任务。你可以用你下载到 WSL 或远程系统中的其它应用来扩展它的使用。

>
> 你是否需要在工作中把本地的 Windows 文件或资源用于其它的 Linux 计算机吗？或者，你根本不使用 Linux ？Bash 可以操作本地的 Windows 文件或资源，还是说它就是一个完全独立的环境？
>
>
>

### 使用 Windows 文件

WSL 系统可以通过 `/mnt/<盘号>/` 目录（挂载点）来访问你计算机上的文件系统。举个例子，你的 Windows 上的 C:\ 和 D:\ 根目录可以在 WSL 中相应地通过 /mnt/c 和 /mnt/d 访问。当你要把你的 Windows 下的项目文件、下载的内容和其它文件用到 Linux/Bash 之中时这很有用。

上图显示的两个目录分别对应于我的计算机上的 SSD 和硬盘：

这是逻辑挂载，所以当你在 shell 中使用类似 `mount` 这样的命令时它们不会显示。但是它们可以如你预期的那样工作。举个例子，在 Windows 中，我在我的 C 盘根目录下放了一个名为 test.txt 的文件，我可以在 WSL 中如下访问它：

在 Build Tour 大会期间，我们要确保所有的演示都可以在没有互联网时也能正常工作（你绝不会知道会场的网络是什么样子的） ，所以为了让 Bash/WSL 可以演示 Git 操作，该演示访问的是本地计算机上的 Windows 文件，我在 Windows 上的 C:\git\NetHack 下设置一个本地仓库。 要在 WSL 中进行 clone 操作，我执行了如下命令：

```
$ git –clone file:///mnt/c/git/NetHack
```

该命令告诉 git 使用 `file://` 协议，并 clone 了位于 /mnt/c/git/NetHack 下的仓库。你可以以类似的方式来访问你的 Windows 下的所有文件。

警示：就像在其它终端中一样，如果你不小心的话，你可以在 Bash 中修改/删除 Windows 文件系统中的文件。举个例子，你可以像下面这样来干掉你的 Windows ，假如你有合适的权限的话。

```
$ rm -rf /mnt/c/  [千万别试！][千万别试！][千万别试！]
```

我之所以郑重提醒是因为我们很多人都是刚刚接触 Linux 命令，它们不是 Windows 命令。

这种可以让文件系统集成到一起的魔法来自 DrvFs。如果你希望了解该文件系统的更多细节，以及它是如何工作在 WSL 中的，WSL 团队为此写了一篇[详细的文章](https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/)。

>
> 当然， 文件系统访问只是 WSL 其中的一部分功能而已，许多开发任务还需要通过 HTTP 或其它网络协议访问远程资源。
>
>
>

### 发起 HTTP 请求

从脚本或命令行而不是从一个编译好的程序或 Web 页面上发起 REST 或其它 HTTP（或 FTP）请求是很有用的。就像在大多数 Linux 发行版一样，WSL 也包括了类似 curl 或 wget 获取资源这样的标准功能，它们可以用来发起 HTTP 或者其它网络请求。举个例子，下面是使用 curl 对 Github 发起 REST 请求来获取我个人的属性信息：

```
$ curl -i https://api.github.com/users/Psychlist1972
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 13 Jul 2016 02:38:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1319
Status: 200 OK
...
{
  "login": "Psychlist1972",
  "avatar_url": "https://avatars.githubusercontent.com/u/1421146?v=3",
  "url": "https://api.github.com/users/Psychlist1972",
  "name": "Pete Brown",
  "company": "Microsoft",
   ...
}
$

```

你可以用它和 Bash 脚本来创建一个 REST API 的快速测试客户端，也可以用来探测一个 Web 页面或服务器并报告其返回的状态。它用来从网上下载文件也很棒，你可以简单地重定向输出到一个文件而不是在屏幕上显示它：

```
$ curl -i https://api.github.com/users/Psychlist1972 > pete.json
```

我也是一个 PowerShell 用户，甚至还使用 [Windows 10 MIDI in PowerShell](https://github.com/Psychlist1972/Windows-10-PowerShell-MIDI) 创建了一些有趣的扩展，也[修复](https://github.com/Psychlist1972/Fix-SoundDevices-File-Corruption)过出现在特定的录音硬件设备上的一些文件问题。作为长时间的 .NET 开发者和爱好者，我经常使用和扩展 PowerShell 以满足我的项目需求。但是 PowerShell 并不是一个可以运行所有的那些 Bash 脚本和针对 Linux 的开源工具的地方。我希望以一种最简单、最舒服的方式来完成这些任务，在某种意义上，这意味着我们需要在 Bash 中完成它们。

>
> 我已经一掠而过的介绍了 Bash、Bash 脚本以及你可以在 shell 中完成的任务。到目前为止，我谈论的都是有助于开发工作的那些功能。但是在 WSL 中实际的开发和编译工作是怎样的？我在 Build Tour 大会上演示了下面这个部分。
>
>
>

### Build Tour 大会上的演示：NetHack

这个夏初，来自微软的讲演者们向大家演示了一些来自 Windows 和微软云上的很酷的开发者新功能。作为其中的一部分，我以一种好玩的方式来演示了 WSL，而且这是一种和开发者们相关的方式。

我个人想要展示使用 git 和一些传统的终端开发工具，我已经写好了 Bash 的演示程序，包括了这些基础的东西（用 Python 和 Ruby 写的“Hello World”），不过我还是想要更有冲击力一些。

我回想起我在大学的时光，那时我们在 Unix（DEC Ultrix 及 SunOS）和 VAX/VMS 之间折腾，Unix 几乎全是命令行环境。在我们学校，绝大多数使用图形工作站的用户只是为了在不同的窗口打开多个终端会话而已，当然，会在桌面背景放上一张超酷的月相图。大部分学生都是使用 VT-220 终端来打开他们的会话（学校离波士顿不远，所以我们有很多 DEC 设备）。

那时，计算机系的学生们主要玩两大游戏：MUD （主要是 lpMUD 和当时刚出的 DikuMUD）和 [NetHack](https://en.wikipedia.org/wiki/NetHack)。NetHack 和其它的 [Roguelikes](https://en.wikipedia.org/wiki/Roguelike) 类游戏被视为历史上最有影响力的游戏之一，它们是许多现在流行的地牢冒险和角色扮演类游戏的鼻祖。

NetHack 有很长的历史，现在的它包含了来自几十年前的几十万行 \*nix 代码，以及后来补充的一些代码。该游戏使用 [curses](https://en.wikipedia.org/wiki/Curses_(programming_library)) （及其替代品）作为终端交互方式，需要通过 lex、 yacc（或 flex 和 bison）和 cc（或 gcc），以及一堆其它的开发工具构建。

它是由 C 语言编写的，并包括了一些用 [Bourne shell](https://en.wikipedia.org/wiki/Bourne_shell) 编写的复杂的脚本配置功能。我觉得它是一个体现 WSL 和 Bash on Windows 10 的开发者能力的不错而有趣的方式。由于使用了 curses（在 Linux 和 WSL 中是 libncurses 库），它也可以用来展示 Windows 10 中命令行窗口中的终端模拟能力。

以前，在我们的分时 Ultrix 服务器上从源代码构建 NetHack 要花费掉我们很多时间，而现在我的个人计算机上只需要几分钟就可以搞定。我喜欢这种技术进步。在 Linux 或 WSL 上配置和编译 NetHack 有容易和复杂两种方式。为了节省时间，我们会以容易的方式来进行。

#### 前置需求

首先，更新你的 WSL 环境，确保你的软件是最新的。在安装新的软件包之前，这是一个好的做法。

```
$ sudo apt update
$ sudo apt upgrade
```

然后，安装必须的开发工具。最简单的办法就是使用 build-essential 软件包，它包括了 Linux 开发者构建以 C/C++ 开发的软件时所需的绝大部分程序。

```
$ sudo apt install build-essential
```

这要花几分钟。如果你想更加深入地了解，你可以分别安装 gcc、gdb、make、flex、bison 以及 NetHack 文档中提到的其它工具。不过如果你是一位开发者，有时候你可能还需要一些其它工具。 build-essential 基本上提供了你所需的工具集。

然后，安装 git。如你所想，很容易：

```
$ sudo apt install git
```

就像在 Linux 中一样，你可以添加一个 git 的 PPA 来获取较新的版本，不过这里我们有一个就行了。

最后，我们需要安装 curses（实际上是 ncurses）来进行终端屏幕交互。

```
$ sudo apt install libncurses-dev
```

当我们完成这些步骤之后，就可以开始构建 NetHack 了。

#### 构建 NetHack

官方的 NetHack 仓库放在 [GitHub](https://github.com/NetHack/NetHack) 上，首先我们需要把它抓取下来放到我们的主目录里面。

```
$ cd ~$ git clone http://github.com/NetHack/NetHack
```

因为 NetHack 支持很多种操作系统，所以我们需要做一些基础配置来告诉它我们使用的是 Linux，并且用开源的 gcc 代替了了 Unix 上 cc 的作用。

如我所提到的，这有好几种办法可以实现。有些人想很周到，将这些配置信息放到了 hints 文件中。相信我，使用 hints 文件会避免遇到该 GitHub 仓库中提到的很多麻烦。在 README 文件和其它文档中并没有着重提到如何使用 hints 文件，我们可以这样做：

```
$ cd NetHack/sys/unix
$ ./setup.sh hints/linux
```

这将会设置 Makefile 正确的使用 Linux 下的工具、库及其路径。这个设置脚本很强大，它做了大量的配置工作，很高兴它在 WSL 中工作的也很好。如果你很好奇这个脚本是如何写的，你可以使用你的编辑器打开它一窥究竟。

然后，开始最终的构建：

```
$ cd ~/NetHack
$ make all
```

构建完成之后，你需要安装它。这其实就是将可执行文件复制到目标位置：

```
$ make install
```

它会安装到你的 ~/nh 文件夹下， NetHack 放在 ~/nh/install/games 目录，名为 nethack。要运行它，切换到该目录（或输入完整路径）并输入：

```
$ cd ~/nh/install/games
$ nethack
```

然后，屏幕会清屏并显示你可以玩 NetHack 了。注意，所有的东西都是在这个 Ubuntu Linux 环境中完成的，根本不需要任何 Windows 特有的东西。

#### 玩 NetHack

由于终端游戏的局限性和 NetHack 的复杂性，这里只能一带而过。对于初次接触它的人来说，还有一些神秘的地方，不过我觉得我们程序员们从来不怕挑战未知。

方向键和 vi（vim）中的一样，HJKL 是左、下、上、右。要退出游戏，你可以在地下城顶层找到楼梯出口然后使用它就可以，或者直接按下 CTRL-C 强制退出。

在 NetHack 中， @ 符号代表你自己，每一层都由房间、走廊、门，和向上及向下的楼梯组成。[怪物](https://nethackwiki.com/wiki/Monster)、[宝箱和物品](https://nethackwiki.com/wiki/Item)以各种 ASCII 字符组成，你慢慢就会熟悉它们。为了符合 Roguelikes 游戏规范，并没有存盘功能，你只有一条命。如果你死了就只能重玩，地下城环境是随机生成的，各种物品也是打乱放置的。

NetHack 游戏的目的是在地下城生存，收集金子和物品，尽可能的干掉各种怪物。除了这些目的之外，你就是不断在其中玩来找它们。规则大致遵循“龙与地下城（DnD）”的武器、技能等规则。

下面的 NetHack 截屏上可以看到有三个房间和两个走廊。向上的楼梯在左上角的房间里，我现在在右上角的房间，还有一些宝箱和其它物品。

如果在你的游戏中没有显示颜色，可以创建一个名为 ~/.nethackrc 的文件，并放入如下内容：

```
OPTIONS=color:true,dark_room:true,menucolors:true
```

注：如果 ASCII 字符图形不是你的菜，但是你喜欢这种类型的游戏，你可以在微软商店搜索“roguelike”来找到视觉上更好看的这种游戏。

当然，NetHack 很古老了，可能只有特定年龄段的人们喜欢它。不过，构建它用到了大量重要的开发工具和 \*nix 操作系统功能，也包括终端模拟功能。从这里可以看到，从 gcc、gdb、make、bison 和 flex 到更现代一些的 git，都在 WSL 里面工作的很好。

如果你想看看 Build Tour 大会上的演示，你可以在 Build Tour 加拿大大会上看到这个讲演。WSL 的这部分演示在 6:20 开始。

希望你能喜欢在 NetHack 地下城中的探险。

>
> C 和 C++ 都很伟大，就像其他的那些经典的开发工具一样。你甚至还可以用普通的 Bash 脚本做到很多。不过，也有很多开发者喜欢用 Python 做为他们的脚本语言。
>
>
>

### Python

你可以在网上找到很多 Python 脚本的例子，这意味着 Python 越来越流行，也越来越有用了。当然，大多数情况下这些例子都是运行在 Linux 下的。在过去，这就需要我们有另外一台安装着 Linux 的机器来运行它们，或者使用虚拟机和多引导，否则就需要修改一些东西才能让他们运行在 Windows 下的 Python 环境中。

这是都不是无法解决的问题，但是它会日渐消磨开发人员每天的生活。通过 WSL，不用折腾你就拥有了一个兼容的、具有 Python 功能和 shell 变量的子系统。

要安装最新的 Python 开发版本和 Python 包安装器 pip，在 Bash 中执行如下命令：

```
$ sudo apt install python-pip python-dev
$ sudo pip install --upgrade pip
```

现在 Python 安装好了，我要展示给你如何从网上获取一个典型的 Linux 下的 Python 例子并让它直接工作起来。我去 [Activestate Python 菜谱站](http://code.activestate.com/recipes/langs/python/?query_start=1)找一个排名第一的 Python 例子。好吧，我走眼了，排名第一的是打印出整数名称的脚本，这看起来没啥意思，所以我选择了第二名：俄罗斯方块。我们每天都能看到 Python 出现在各种地方，所以这次让我们去玩另外一个游戏。

我打开了 nano 编辑器，从 Windows 上的浏览器中打开的页面上复制了这 275 行 Python 代码，然后粘贴到我的 WSL 终端窗口终端中的 nano 中，并保存为 tetris.py ，然后执行它：

```
$ python tetris.py
```

它马上就清屏并出现了俄罗斯方块的游戏。同 NetHack 一样，你可以使用同样的 vi 标准的方向键来移动（以前是使用鼠标和 WSAD 键来移动，而右手使用 HJKL 键更方便）。

如我所提到的，你当然可以不用 WSL 就在 Windows 中运行 Python。然而，要想快速简便，不用修改 Linux 下的 Python 代码，只需要简单的复制粘贴代码即可运行，则可以极大的提高开发者的效率。

这是真的。这并不是要替代 Windows 原生的工具，比如 Python、PowerShell、C# 等等，而是当你需要在现代的开发工作流程中快速而有效地完成一些事情时，可以避免种种折腾。

包括 Bash、Python 以及其它所有的 Linux 原生的命令行开发工具，WSL 为我的开发工作提供了所有需要的工具。这不是一个 Linux 服务器，甚至也不是一个完整的客户端，相反，它就是一个可以让我避免每天折腾，让我在 Windows 上开发更有效率、更有快感的一个东西！

---

### 重置你的 WSL 环境

随便去试吧，如果你搞坏了你的 WSL 环境，它很容易重新安装。在进行之前，请确保做好了任何重要内容的备份。

```
C:\> lxrun.exe /uninstall /full
C:\> lxrun.exe /install
```

### 你使用 Bash 和 WSL 的感觉如何？

我们希望 WSL ，特别是 Bash 可以在 Windows 10 中帮你带来更高的效率，减少每天的开发中的折腾。

你对 Windows 10 上的 WSL 怎么看？你喜欢使用它吗？

开发团队做了大量的工作希望让 WSL 成为一个为开发者提供的强大的终端工具。如果你有任何反馈或运行出现问题，我们推荐你查看一下 [GitHub 反馈页面](https://github.com/Microsoft/BashOnWindows/issues)，以及 [用户之声的反馈和投票站点](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo)。我们真的希望听到你的声音。

### 更多参考与延伸阅读

Linux shell 编程是一个庞大的话题，在网上有很多这方面的内容。如果你还不够熟悉它们，想要了解更多，可以看看各种 Bash 教程。[可以从这一份开始](https://help.ubuntu.com/community/Beginners/BashScripting)。

还有一些其他的参考资料也许对你有用：

* [Build Tour videos](https://channel9.msdn.com/Events/Build/Build-Tour-2016-Toronto)
* [Bash Scripting 101](https://help.ubuntu.com/community/Beginners/BashScripting)
* [WSL Home](https://msdn.microsoft.com/commandline/wsl/)
* [WSL Overview](https://blogs.msdn.microsoft.com/commandline/2016/06/02/learn-more-about-bash-on-ubuntu-on-windows-and-the-windows-subsystem-for-linux/)
* [WSL FAQ](https://msdn.microsoft.com/en-us/commandline/wsl/faq#how-do-i-update-bash-on-ubuntu-on-windows-)
* [WSL System Calls](https://blogs.msdn.microsoft.com/wsl/2016/06/08/wsl-system-calls/)
* [Scott Hanselman’s video on how to run WSL](http://www.hanselman.com/blog/VIDEOHowToRunLinuxAndBashOnWindows10AnniversaryUpdate.aspx)

哦，当然，要更多的了解 NetHack，请访问 [NetHack 主站](http://www.nethack.org/)。


开源新闻速递： Ubuntu 16.04.1 LTS 发布

Summary:
更多：Linux Kernel 4.7 发布；
AngularJS 分拆出 Dart 版的 AngularDart。

下载看看

# 开源新闻速递： Ubuntu 16.04.1 LTS 发布

### 今日关注

Canonical [宣布](http://ubuntu-news.org/2016/07/21/ubuntu-16-04-1-lts-released/) Ubuntu 16.04 LTS （Xenial Xerus） 的第一个维护版本 16.04.1 发布，包括 Kubuntu 、Xubuntu、 Lubuntu、Mythbuntu、Ubuntu Studio、Ubuntu MATE、Ubuntu GNOME、Ubuntu Kylin 等分支也同样更新其安装镜像。如果你还在使用旧的 Ubuntu 14.04.4 等版本，你会收到一个升级提示——这是最后的安全地升级到 16.04 的机会了。

### 图文摘要

*VirtualBox 5.1.2 发布，对 RedHat 企业版 Linux 5 提供了更好支持。*

*在出去玩了一周之后，Linus 正式[宣布](http://lkml.iu.edu/hypermail/linux/kernel/1607.3/00150.html) Linux Kernel 4.7 的发布。这一版本最大的新功能是提供了对 AMD 新发布的 Radeon RX 480 GPU 的支持。*

*经过漫长时间的等待，Mozilla Thunderbird 45 终于登陆 Ubuntu 了，你现在可以从 Ubuntu 官方仓库中下载安装了。*

*Google 本周以前都是用 TypeScript 来编写其著名的 AngularJS JavaScript 框架，不过从现在开始，它[创建](http://news.dartlang.org/2016/07/angulardart-is-going-all-dart.html)了一个使用 Dart 语言开发的 AngularJS 分支 [AngularDart](https://github.com/dart-lang/angular2)，用于内部的 AdWords 等。这种分拆对于 AngularJS 和 AngularDart 来说应该都是个好消息。*


出版商统计出最受欢迎的编程语言：Python 居首

自由开源的魅力！！！

PYTHON确实不错，国内教程好找，“汉化”资料也多~

要找时间研究下！！！

虽然python很不错，但是由出版商来统计也不太准确吧，毕竟许多人还是通过网络资料来学的

轻松喜+1,怎能不喜欢

学习，学习

在中国，年薪24w人民币的编程岗位也不多吧（以所有中国开发人员作为基数）。

应该是码代码的都不是很高吧，因为人员太滥了，有点儿像90年代末的厨师行大泛滥似的，而且中国企业注重的是收益，只要能给他赚到钱就行，什么代码注视啦，编程守则啦，有没有都行，所以啦，就这德行，最主要的是中国技术企业的老板一般不懂技术，健康行业的老板一般都挺个大肚子

来自北京的 Microsoft Edge 12.10240|Windows 10 用户

它们是在它们网站上放的调查——调查样本应该是买计算机编程书的人。

# 出版商统计出最受欢迎的编程语言：Python 居首

世界上编程方面的最大的出版商 Packt Publishing 最近对 11000 名访客进行了调查，根据调查结果，Python 和 JavaScript 是当今最流行的编程语言，而 Java 紧随其后，排名第三。

调查内容包括开发者使用的编程语言、喜欢的框架、薪酬信息等。调查显示，如果就编程人员每天都要使用的语言来看，当今前10名的编程语言排名是 Python、JavaScript、Java、PHP、HTML（虽然不算编程语言）、 C#、SQL、CSS（也不算） 、C++ 和 R。

从之前的类似调查中可以发现，所有的调查均显示 Python 和 JavaScript 得到了极大流行。

Packt Publishing 的调查发现，编程人员薪水和以上排名完全不同，诸如 bash、Perl 和 Scala 语言编程人员获得的年薪平均超过了 8 万美元，甚至 Bash 编程语言人员的薪酬达到了 10 万美元，而 PHP 和 C 语言编程人员年薪几乎没有到达 4 万美元。

而在 Web 开发人员使用的工具方面，AngularJS 取得了第一，其次是 Facebook 的 React.js 框架、Node.js、Docker、Laravel、 Bootstrap、WordPress 和 AWS。

过去几年最流行的新编程语言排行榜当中，毫无疑问 Swift 高居榜首，其次是 C#、Go、Rust 和 Elixir。

新的框架方面， Docker 也如预期的那样得到第一，Apache Spark 和 AWS 分列二、三名。

更多的调查结果，可以看看 Packt Publishing 的[报告](https://www.packtpub.com/skill-up-2016)（需注册）。


LXD 2.0 系列（一）：LXD 入门

# LXD 2.0 系列（一）：LXD 入门

<img src="content_image/album_201612_28_225205saiogcac1io6i1aj.jpg" alt="" title="">

这是 LXD 2.0 系列介绍文章的第一篇。

1. [LXD 入门](/article-7618-1.html)
2. [安装与配置](/article-7687-1.html)
3. [你的第一个 LXD 容器](/article-7706-1.html)
4. [资源控制](/article-8072-1.html)
5. [镜像管理](/article-8107-1.html)
6. [远程主机及容器迁移](/article-8169-1.html)
7. [LXD 中的 Docker](/article-8235-1.html)
8. [LXD 中的 LXD](/article-8257-1.html)
9. [实时迁移](/article-8263-1.html)
10. [LXD 和 Juju](/article-8273-1.html)
11. [LXD 和 OpenStack](/article-8274-1.html)
12. [调试，及给 LXD 做贡献](/article-8282-1.html)

### 关于 LXD 几个常见问题

#### 什么是 LXD ?

简单地说， LXD 就是一个提供了 REST API 的 LXC 容器管理器。

LXD 最主要的目标就是使用 Linux 容器而不是硬件虚拟化向用户提供一种接近虚拟机的使用体验。

#### LXD 和 Docker/Rkt 又有什么关系呢 ?

这是一个最常被问起的问题，现在就让我们直接指出其中的不同吧。

LXD 聚焦于系统容器，通常也被称为架构容器。这就是说 LXD 容器实际上如在裸机或虚拟机上运行一般运行了一个完整的 Linux 操作系统。

这些容器一般基于一个干净的发布镜像并会长时间运行。传统的配置管理工具和部署工具可以如在虚拟机、云实例和物理机器上一样与 LXD 一起使用。

相对的， Docker 关注于短期的、无状态的、最小化的容器，这些容器通常并不会升级或者重新配置，而是作为一个整体被替换掉。这就使得 Docker 及类似项目更像是一种软件发布机制，而不是一个机器管理工具。

这两种模型并不是完全互斥的。你完全可以使用 LXD 为你的用户提供一个完整的 Linux 系统，然后他们可以在 LXD 内安装 Docker 来运行他们想要的软件。

#### 为什么要用 LXD?

我们已经持续开发并改进 LXC 好几年了。 LXC 成功的实现了它的目标，它提供了一系列很棒的用于创建和管理容器的底层工具和库。

然而这些底层工具的使用界面对用户并不是很友好。使用它们需要用户有很多的基础知识以理解它们的工作方式和目的。同时，向后兼容旧的容器和部署策略也使得 LXC 无法默认使用一些安全特性，这导致用户需要进行更多人工操作来实现本可以自动完成的工作。

我们把 LXD 作为解决这些缺陷的一个很好的机会。作为一个长时间运行的守护进程， LXD 可以绕开 LXC 的许多限制，比如动态资源限制、无法进行容器迁移和高效的在线迁移；同时，它也为创造新的默认体验提供了机会：默认开启安全特性，对用户更加友好。

### LXD 的主要组件

LXD 是由几个主要组件构成的，这些组件都出现在 LXD 目录结构、命令行客户端和 API 结构体里。

#### 容器

LXD 中的容器包括以下及部分：

* 根文件系统（rootfs）
* 配置选项列表，包括资源限制、环境、安全选项等等
* 设备：包括磁盘、unix 字符/块设备、网络接口
* 一组继承而来的容器配置文件
* 属性（容器架构、暂时的还是持久的、容器名）
* 运行时状态（当用 CRIU 来中断/恢复时）

#### 快照

容器快照和容器是一回事，只不过快照是不可修改的，只能被重命名，销毁或者用来恢复系统，但是无论如何都不能被修改。

值得注意的是，因为我们允许用户保存容器的运行时状态，这就有效的为我们提供了“有状态”的快照的功能。这就是说我们可以使用快照回滚容器的状态，包括快照当时的 CPU 和内存状态。

#### 镜像

LXD 是基于镜像实现的，所有的 LXD 容器都是来自于镜像。容器镜像通常是一些纯净的 Linux 发行版的镜像，类似于你们在虚拟机和云实例上使用的镜像。

所以可以「发布」一个容器：使用容器制作一个镜像并在本地或者远程 LXD 主机上使用。

镜像通常使用全部或部分 sha256 哈希码来区分。因为输入长长的哈希码对用户来说不方便，所以镜像可以使用几个自身的属性来区分，这就使得用户在镜像商店里方便搜索镜像。也可以使用别名来一对一地将一个用户好记的名字映射到某个镜像的哈希码上。

LXD 安装时已经配置好了三个远程镜像服务器（参见下面的远程一节）：

* “ubuntu”：提供稳定版的 Ubuntu 镜像
* “ubuntu-daily”：提供 Ubuntu 的每日构建镜像
* “images”： 社区维护的镜像服务器，提供一系列的其它 Linux 发布版，使用的是上游 LXC 的模板

LXD 守护进程会从镜像上次被使用开始自动缓存远程镜像一段时间（默认是 10 天），超过时限后这些镜像才会失效。

此外， LXD 还会自动更新远程镜像（除非指明不更新），所以本地的镜像会一直是最新版的。

#### 配置

配置文件是一种在一个地方定义容器配置和容器设备，然后将其应用到一系列容器的方法。

一个容器可以被应用多个配置文件。当构建最终容器配置时（即通常的扩展配置），这些配置文件都会按照他们定义顺序被应用到容器上，当有重名的配置键或设备时，新的会覆盖掉旧的。然后本地容器设置会在这些基础上应用，覆盖所有来自配置文件的选项。

LXD 自带两种预配置的配置文件：

* “default”配置是自动应用在所有容器之上，除非用户提供了一系列替代的配置文件。目前这个配置文件只做一件事，为容器定义 eth0 网络设备。
* “docker”配置是一个允许你在容器里运行 Docker 容器的配置文件。它会要求 LXD 加载一些需要的内核模块以支持容器嵌套并创建一些设备。

#### 远程

如我之前提到的， LXD 是一个基于网络的守护进程。附带的命令行客户端可以与多个远程 LXD 服务器、镜像服务器通信。

默认情况下，我们的命令行客户端会与下面几个预定义的远程服务器通信：

* local：默认的远程服务器，使用 UNIX socket 和本地的 LXD 守护进程通信
* ubuntu：Ubuntu 镜像服务器，提供稳定版的 Ubuntu 镜像
* ubuntu-daily：Ubuntu 镜像服务器，提供 Ubuntu 的每日构建版
* images：images.linuxcontainers.org 的镜像服务器

所有这些远程服务器的组合都可以在命令行客户端里使用。

你也可以添加任意数量的远程 LXD 主机，并配置它们监听网络。匿名的开放镜像服务器，或者通过认证可以管理远程容器的镜像服务器，都可以添加进来。

正是这种远程机制使得与远程镜像服务器交互及在主机间复制、移动容器成为可能。

### 安全性

我们设计 LXD 时的一个核心要求，就是在不修改现代 Linux 发行版的前提下，使容器尽可能的安全。

LXD 通过使用 LXC 库实现的主要安全特性有：

* 内核名字空间。尤其是用户名字空间，它让容器和系统剩余部分完全分离。LXD 默认使用用户名字空间（和 LXC 相反），并允许用户在需要的时候以容器为单位关闭（将容器标为“特权的”）。
* Seccomp 系统调用。用来隔离潜在危险的系统调用。
* AppArmor。对 mount、socket、ptrace 和文件访问提供额外的限制。特别是限制跨容器通信。
* Capabilities。阻止容器加载内核模块，修改主机系统时间，等等。
* CGroups。限制资源使用，防止针对主机的 DoS 攻击。

为了对用户友好，LXD 构建了一个新的配置语言把大部分的这些特性都抽象封装起来，而不是如 LXC 一般直接将这些特性暴露出来。举了例子，一个用户可以告诉 LXD 把主机设备放进容器而不需要手动检查他们的主/次设备号来手动更新 CGroup 策略。

和 LXD 本身通信是基于使用 TLS 1.2 保护的链路，只允许使用有限的几个被允许的密钥算法。当和那些经过系统证书认证之外的主机通信时， LXD 会提示用户验证主机的远程指纹（SSH 方式），然后把指纹缓存起来以供以后使用。

### REST 接口

LXD 的工作都是通过 REST 接口实现的。在客户端和守护进程之间并没有其他的通讯渠道。

REST 接口可以通过本地的 unix socket 访问，这只需要经过用户组认证，或者经过 HTTP 套接字使用客户端认证进行通信。

REST 接口的结构能够和上文所说的不同的组件匹配，是一种简单、直观的使用方法。

当需要一种复杂的通信机制时， LXD 将会进行 websocket 协商完成剩余的通信工作。这主要用于交互式终端会话、容器迁移和事件通知。

LXD 2.0 附带了 1.0 版的稳定 API。虽然我们在 1.0 版 API 添加了额外的特性，但是这不会在 1.0 版 API 端点里破坏向后兼容性，因为我们会声明额外的 API 扩展使得客户端可以找到新的接口。

### 容器规模化

虽然 LXD 提供了一个很好的命令行客户端，但是这个客户端并不能管理多个主机上大量的容器。在这种使用情况下，我们可以使用 OpenStack 的 nova-lxd 插件，它可以使 OpenStack 像使用虚拟机一样使用 LXD 容器。

这就允许在大量的主机上部署大量的 LXD 容器，然后使用 OpenStack 的 API 来管理网络、存储以及负载均衡。

### 额外信息

LXD 的主站在: <https://linuxcontainers.org/lxd>

LXD 的 GitHub 仓库: <https://github.com/lxc/lxd>

LXD 的邮件列表: <https://lists.linuxcontainers.org>

LXD 的 IRC 频道: #lxcontainers on irc.freenode.net

如果你不想或者不能在你的机器上安装 LXD ，你可以在 web 上[试试在线版的 LXD](https://linuxcontainers.org/lxd/try-it) 。

---

作者简介：我是 Stéphane Graber。我是 LXC 和 LXD 项目的领导者，目前在加拿大魁北克蒙特利尔的家所在的Canonical 有限公司担任 LXD 的技术主管。

---

via: <https://www.stgraber.org/2016/03/11/lxd-2-0-introduction-to-lxd-112/>

作者：[Stéphane Graber](https://www.stgraber.org/author/stgraber/) 译者：[ezio](https://github.com/oska874) 校对：[PurlingNayuki](https://github.com/PurlingNayuki)

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


《数字身份验证指南》草案中提议禁用基于短信的双因子认证

Summary: 据最新的《数字身份验证指南》草案，NIST 正式地不建议公司继续使用基于短信的认证，甚至说将来考虑在该指南中将基于短信的双因子认证视作不安全的。

生物识别像指纹这样的是不是更容易被盗而且被盗后还很麻烦，因为没法换掉指纹啊。如果有恶意人士想要取得某人的指纹，也许不会特别难吧，用过的东西也许会留下，那是不是说，如果单独用指纹验证的项目多了，出门得带上手套呀。

生物识别？安全问题更可怕~一旦被盗用，基本没防护吧，总不能去换个虹膜、指纹

安卓的指纹锁各种不好用.....还是先发展发展干货再说应用吧，感觉手稍微脏点，稍微按歪点就不识别。

# 《数字身份验证指南》草案中提议禁用基于短信的双因子认证

美国<ruby> 国家标准和技术协会 <rp>  （ </rp> <rt>  National Institute of Standards and Technology </rt> <rp>  ） </rp></ruby>（NIST）发布了《<ruby>   数字身份验证指南  <rp>  （ </rp> <rt>  Digital Authentication Guideline </rt> <rp>  ） </rp></ruby>（DAG）》的最新草案，其中暗示将来会禁用基于短信的<ruby> 双因子认证方案 <rp>  （ </rp> <rt>  Two-Factor Authentication </rt> <rp>  ） </rp></ruby>（2FA）。

《<ruby> 数字身份验证指南 <rt>  Digital Authentication Guideline </rt></ruby>（DAG）》是一系列用于软件商构建安全服务的规则，也被政府和私人机构用于评估其服务和软件的安全性。

NIST 的专家们一直不断地更新该指南，以便应对 IT 领域的快速变化。

### 基于短信的双因子认证仍然可以用，但是不会太久了

据[最新的《数字身份验证指南》草案](https://pages.nist.gov/800-63-3/sp800-63b.html)，NIST 正式地不建议公司继续使用基于短信的认证，甚至说将来考虑在该指南中将基于短信的双因子认证视作不安全的。NIST 在该草案中说：

“如果使用基于公共移动电话网络的短信作为带外验证，验证者必须**验证其**预注册的手机号码是基于移动网络的，而非 VoIP（或者其它基于软件的），然后才能发送短信到预注册手机号码。修改预注册手机号码时如果没有双因子验证是不能进行的。不推荐使用短信进行带外验证，本指南的将来版本中将不再允许这种方式。”

NIST 的指南当中认为基于短信的双因子认证是不安全的，因为用户不会总是带着电话。

在该指南中，推荐软件应用应该使用令牌和软件加密验证器，这可能是手机应用或硬件设备的形式，但是就像手机一样，也可能被偷走或“临时借走”。但该指南认为这种风险是可接受的，而不像令牌或软件加密验证器那样，短信在 VoIP 服务之下是一个影响到了联合信任因子的缺陷。

### 短信是不安全的，特别是在 VoIP 连接下

因为一些 VoIP 服务允许劫持短信，所以 NIST 建议厂商在基于短信的双因子系统在发送短信验证码之前，对使用 VoIP 连接的访问进行特别检查。

短信是一个广泛使用的不安全协议，仅在上周，Context Information Security 的安全研究人员就[披露](http://www.contextis.com/resources/blog/binary-sms-old-backdoor-your-new-thing/)了又一起依赖于短信协议而危及到了其用户和设备的攻击。随着对这种攻击类型的越来越多的研究，软件厂商、公司以及用户会逐渐认识到应该换到更安全的验证方式上。

当前的 NIST 指南仍在讨论之中，但是基本上可以确定，该指南的将来版本不会再将使用基于短信的认证方式推荐为带外验证的安全方式。

### 生物识别技术是一个新兴发展方向

在该指南草案中，也提到了生物特征识别技术在特定条件下是可以作为一个验证方式的：

“因此，对生物识别技术的验证是支持的，只需要遵循如下准则：生物识别技术**应该**与其他（你知道的或你拥有的）认证因子配合使用。”


Summary: 在之前的 OpenBSD 版本中，Linux 应用可以通过一个兼容层直接运行在 BSD 中，但是在最新的 OpenBSD 6.0 的发布公告中称，由于“安全改进”而移走了该子系统。

这标题，满满的全班倒数第一嘲笑尖子生没拿满分的感觉

事实上，OpenBSD比Linux安全多了。

事实上，用linux比用openbsd多多了

这有什么好争论的，OPENBSD就是强调安全，跟鄙视不鄙视没关系。取舍而已，楼上也拿这个系统的优点比别人的短处了，NAIVE！！！

但没OpenBSD安全

笑哈哈

支持openbsd，希望以后linux也可以在安全上做出更多努力，比如最近的kspp项目。

来自江苏南京的 Internet Explorer 11.0|Windows 7 用户

实际上用mac和win的比linux多多了<br />
linux又不是个只有安全性的系统，没必要死扣一个方面吧?

linux已经算是安全的了吧？

OpenBSD的确安全，但那时牺牲了无数特性、排除了大量软件包才做到的。。。。<br />
可以Google看看OpenBSD的与其它*nix的比较，基本上OpenBSD无论什么性能测试都是垫底/倒数，这样的系统只能适合少数极端环境，大部分应用场景还是适合性能优秀、安全性始终的Linux。

OpenBSD也就只剩下安全性了┑(￣Д ￣)┍

# Linux 安全性被鄙视，OpenBSD 6.0 为了安全而抛弃了 Linux 兼容层

>
> 最新版本的 OpenBSD 6.0 将关闭潜在的安全漏洞——比如其 Linux 兼容层。
>
>
>

OpenBSD，这个 BSD 家族里面最重要的变种之一将在今年九月份[发布](https://www.openbsd.org/60.html)新的 6.0 版本。它通常被视作 Linux 的一个替代品，以没有专有软件而闻名，并由于其默认情况下比其它的操作系统更安全，以及对[用户安全](http://www.infoworld.com/article/2624916/government/openbsd-chief-believes-contractor-tried-to-write-back-doors.html)的[高度警惕](http://www.infoworld.com/article/2617852/open-source-software/openbsd-founder-calls-red-hat-and-canonical--traitors--to-open-source.html)而广泛受到赞誉。由于其在开发过程中的安全理念，许多软件路由器和防火墙项目都是基于 OpenBSD 而开发的。

<img src="content_image/album_201607_27_175705d47mme5e0gag45nm.jpg" alt="" title="">

在这次 OpenBSD 新版本中安全相关的最大变化是其移除了对 Linux 模拟的支持。在之前的 OpenBSD 版本中，Linux 应用可以通过一个[兼容层](https://www.openbsd.org/papers/slack2k11-on_compat_linux.pdf)直接运行在 BSD 中，但是在最新的 OpenBSD 6.0 的[发布公告](https://www.openbsd.org/60.html)中称，由于“安全改进”而移走了该子系统。

OpenBSD 中有一些软件是以附加的二进制软件包方式提供的，OpenBSD 的维护者们会尽量提供对这些软件的支持，但是他们不会像对待其操作系统一样对这些软件的安全性进行筛选。由于现在很多流行应用的最新版本都可以直接运行在 OpenBSD 中，比如说 Chromium 和 Firefox 浏览器，这意味没有 Linux 兼容层也不要紧。

出于安全考虑，OpenBSD 还抛弃了 [systrace](http://man.openbsd.org/OpenBSD-5.9/systrace) 系统安全实施策略工具。之前版本的 OpenBSD 包括它，但是并没有用它来管理任何重要的东西。[systrace](http://man.openbsd.org/OpenBSD-5.9/systrace) 被[视为不安全已经有段时间](https://www.lightbluetouchpaper.org/2007/08/06/usenix-woot07-exploiting-concurrency-vulnerabilities-in-system-call-wrappers-and-the-evil-genius/)了，所以在这次的 OpenBSD 发行版中它也将被抛弃。

作为安全增强的一部分，还[移除了“usermount”选项](http://undeadly.org/cgi?action=article&sid=20160715125022)，它允许非特权用户挂载文件系统。OpenBSD 项目负责人 Theo de Raadt 说 usermount “允许任何不当的程序调用 mount/umount 系统调用”，这意味着“在提供该功能的前提下，任何用户都没有办法保持其系统的安全性和可靠性的预期。”

在发布于今年三月份的 OpenBSD 的前一个版本 5.9 中，它提供了一些自己的安全改进。比如以特权用户身份运行程序的 sudo 被替换成 [doas](http://www.openbsd.org/faq/faq10.html#doas)，这个新的程序使用了更简化和潜在问题更少的配置机制。这种为了安全而做的改变在 Linux 世界会更难见到，而 OpenBSD 则通过让其[代码不断采用新的技术](http://www.openbsd.org/papers/pruning.html)而展示了其在安全方面的努力和进步。


怎样在 Ubuntu 中修改默认程序

Summary: 这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序

水文

真的很水

水文。<br />
谁知道怎样在Xubuntu下用python改默认程序（不是改MIME Type，是改默认的文件管理器等等）？

这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序

# 怎样在 Ubuntu 中修改默认程序

>
> 简介: 这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序
>
>
>

对于我来说，安装 [VLC 多媒体播放器](http://www.videolan.org/vlc/index.html)是[安装完 Ubuntu 16.04 该做的事](/article-7453-1.html)中最先做的几件事之一。为了能够使我双击一个视频就用 VLC 打开，在我安装完 VLC 之后我会设置它为默认程序。

作为一个新手，你需要知道如何在 Ubuntu 中修改任何默认程序，这也是我今天在这篇指南中所要讲的。

### 在 Ubuntu 中修改默认程序

这里提及的方法适用于所有的 Ubuntu 12.04，Ubuntu 14.04 和Ubuntu 16.04。在 Ubuntu 中，这里有两种基本的方法可以修改默认程序：

* 通过系统设置
* 通过右键菜单

#### 1.通过系统设置修改 Ubuntu 的默认程序

进入 Unity 面板并且搜索<ruby> 系统设置 <rp>  （ </rp> <rt>  System Settings </rt> <rp>  ） </rp></ruby>：

在<ruby> 系统设置 <rp>  （ </rp> <rt>  System Settings </rt> <rp>  ） </rp></ruby>中，选择<ruby> 详细选项 <rp>  （ </rp> <rt>  Details </rt> <rp>  ） </rp></ruby>：

在左边的面板中选择<ruby> 默认程序 <rp>  （ </rp> <rt>  Default Applications </rt> <rp>  ） </rp></ruby>，你会发现在右边的面板中可以修改默认程序。

正如看到的那样，这里只有少数几类的默认程序可以被改变。你可以在这里改变浏览器、邮箱客户端、日历、音乐、视频和相册的默认程序。那其他类型的默认程序怎么修改？

不要担心，为了修改其他类型的默认程序，我们会用到右键菜单。

#### 2.通过右键菜单修改默认程序

如果你使用过 Windows 系统，你应该看见过右键菜单的“打开方式”，可以通过这个来修改默认程序。我们在 Ubuntu 中也有相似的方法。

右键一个还没有设置默认打开程序的文件，选择“<ruby> 属性 <rp>  （ </rp> <rt>  properties </rt> <rp>  ） </rp></ruby>”

*从右键菜单中选择属性*

在这里，你可以选择使用什么程序打开，并且设置为默认程序。

*在 Ubuntu 中设置打开 WebP 图片的默认程序为 gThumb*

小菜一碟不是么？一旦你做完这些，所有同样类型的文件都会用你选择的默认程序打开。

我很希望这个新手指南对你在修改 Ubuntu 的默认程序时有帮助。如果你有任何的疑问或者建议，可以随时在下面评论。

---

via: <https://itsfoss.com/change-default-applications-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 译者：[Locez](https://github.com/locez) 校对：[wxy](https://github.com/wxy)

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