初识 HTTP/2（二）

# 初识 HTTP/2（二）

>
> HTTP/2 时代的开启为前端开发带来了最佳体验。
>
>
>

如果你对 HTTP/2 有所了解，那你可能用过它，或者至少想过怎样能把它融入你的项目中。尽管有很多关于它如何改变工作流程，提高 Web 速度和效率等方面的猜想，但最佳使用方式还没有定下来。这里我想讲的就是我在之前的项目中所发现的 HTTP/2 的最佳实践。

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

如果你还不确定什么是 HTTP/2，或者为什么它能改进你的工作，可以先看看我[介绍背景方面的第一篇文章](/article-8111-1.html)。

记住：开始之前，我要告诉你，尽管你的浏览器可能支持 HTTP/2，但你的服务器可能不支持。检查你的主机托管服务，看看他们是否提供 HTTP/2 的支持。否则你可能要建立你自己的服务器。这篇文章并不会涉及这方面该如何做，但你可以查看 [http2 github](https://github.com/http2/http2-spec/wiki/Tools) 页面，找一找这方面的工具。

### 热身工作

首先组织好你的文件。看一看下面的文件树结构，作为组织你的样式表的起点：

```
/styles
|── /setup
|     /* 变量、混入（minin）和函数 */
|── /global
|     /* 能放在任何组件和部分中的可重用组件 */
|── /components
|     /* 特殊组件和部分 */
|── setup.scss // setup 样式索引
|── global.scss // 全局样式索引

```

这会把你的样式分到三个目录下面：`setup`、`global` 和 `componenets`。接下来我会说明这些目录对你的项目有什么用。

### setup 目录

`setup` 目录保存所有的变量、函数、<ruby> 混入 <rp>  （ </rp> <rt>  minin </rt> <rp>  ） </rp></ruby>以及一些正常编译需要的其它文件的定义。要想让这个目录物尽其用，把这个目录下所有内容导入到 `setup.scss` 文件中是个很不错的主意，这样这个文件就会像下面所展示的一样：

```
/* setup.scss */

/* 变量 */
@import "setup/variables/colors";

/* 混入 */
@import "setup/mixins/color";

/* 函数 */
@import "setup/functions/color";

... 等等

```

现在我们能快速引用这个站点中的所有定义，应该确保在所有的样式文件顶部包含我们这里创建的这个文件。

### global 目录

接下来的目录，global 目录，应该包含可在当前站点的多个部分或者每一个页面中重复使用的组件。像按钮、文本、主要样式，以及你的浏览器默认设置应该放在这里。我不建议把页面的头部或底部样式放在这儿，因为某些项目中没有头部，或者不同页面头部不同。而且，底部永远是页面的最后一个元素，所以在用户加载完当前站点的其它东西前，不必过分优先考虑加载底部样式。

记住，如果没有那些定义在 setup 目录下的东西，你的 global 样式就可能没有作用，你的 global 文件看起来应该像这样：

```
/* global.scss */

/* 应用定义 */
@import "setup";

/* 全局样式 */
@import "global/reset";
@import "global/buttons";
@import "global/typography";
@import "global/grid";

... 等等

```

注意，首先要做的就是导入 setup 样式。这样的话，之后的文件都可以引用这个样式里的定义。

由于站点内的每个页面都需要 global 样式，我们可以用典型的方式，在 `<head>` 标签内用一个 `<link>` 标签来加载它们。你所看到的将是一个十分小巧的 css 文件，或者说理论上小巧的，这取决于你需要多少全局样式。

### 最后，你的组件

注意，我没有在上述目录树中的 components 目录里包含索引文件。这是 HTTP/2 所带来的效用。直到现在，我们已经按照标准步骤构建了一个典型的站点，保持相当简单的结构，仅选择全局化那些最重要的样式。组件充当它们自己的索引文件。

大多数开发者有独特的组织组件的方式，因此我并不想影响你的策略。但是，你所有的组件看起来应该像这样：

```
/* header.scss */

/* 应用定义 */
@import "../setup";

header {
  // 样式
}

... 等等

```

同样的，你要把 setup 样式包含进来，确保所有东西在编译时都定义过。除了编译这些文件，以及可能要把他们放到 `/assets` 目录，以便很容易找到模版，对这些文件你不必 <ruby> 拼接 <rt>  concatenate </rt></ruby>、<ruby> 压缩 <rt>  minify </rt></ruby> 它们或者改变什么。

现在样式表已经差不多了，构建站点应该很简单。

### 构建组件

或许对于模板语言你有自己的选择，这取决于你的项目，有可能是 Twig、Rails、Jade 或者 Handlebars。我认为考虑组件最好的方式是它是否有自己的模版文件，它该有个与名字相应的样式。这样你的项目中，模版和样式的比例就会是个不错的 1:1 的比例，而且你知道哪个文件有哪些东西，哪里有哪个文件，因为它们的命名是有规律的。

现在它正步入正轨，用好 HTTP/2 的多种功能十分简单，让我们做一个模版：

```
{# header.html #}

{# compiled header styles #}
<link href="assets/components/header.css" rel="stylesheet" media="all">

<header>
  <h1>This Awesome HTTP/2 Site</h1>
  ... 等等

```

非常好！在模版里你可能有更简单的方式链接到资源，但这里显示你所要做的仅是在开始构建时，在模版文件中链接一个小小的头部样式。这将允许你的站点仅仅加载特定资源到任意给定页面的组件中，而且，能够设定页面从头到脚的组件的优先级。

### 结合在一起

现在所有的组件都有结构，浏览器将会类似以下方式来渲染它们：

```
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" media="all" href="/assets/global.css">
  </head>
  <body>

    <link rel="stylesheet" media="all" href="/assets/components/header.css">
    <header>
      ... etc
    </header>

    <link rel="stylesheet" media="all" href="/assets/components/title.css">
    <section class="title">
      ... etc
    </section>

    <link rel="stylesheet" media="all" href="/assets/components/image-component.css">
    <section class="image-component">
      ... etc
    </section>

    <link rel="stylesheet" media="all" href="/assets/components/text-component.css">
    <section class="text-component">
      ... etc
    </section>

    <link rel="stylesheet" media="all" href="/assets/components/footer.css">
    <footer>
      ... etc
    </footer>

  </body>
</html>

```

这是一个高级别方法，但你的项目中可能有调整的更细致的组件。例如，在头部的 `<nav>` 组件可能要加载自己的样式表。尽你所能地自由发挥，让组件更有作用 - HTTP/2 不会因这些需求而阻碍你！

### 结论

这只是一个关于如何在前端用 HTTP/2 构建项目的基本介绍，仅是皮毛而已。你可能注意到我上面所用的方法有的还有改进的空间。请不吝赐教！正如我在第一篇文章中所说的，HTTP/2 可能颠覆自 HTTP/1 以来我们所熟知的某些标准，所以要慎重思考和实践，以便高效使用 HTTP/2 的开发环境。

---

via: <https://www.viget.com/articles/getting-started-with-http-2-part-2>

作者：[Ben](https://www.viget.com/about/team/btinsley) 译者：[GitFuture](https://github.com/GitFuture) 校对：[jasminepeng](https://github.com/jasminepeng)

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


Linux 系统管理员 2017 年的 10 个新决心

Summary: 当我们告别 2016 时，也到时间定下我们的 新年决心 了。不管你身为 Linux 系统管理员的经验水平如何，我们认为，制定接下来 12 个月的成长目标是很值得的。

其他的都很好！

但是

“6、 每月尝试一个新的发行版“  这个是否有必要？

大部分发行版大同小异

因人而异啦

不必要，完全浪费时间。

来自河北沧州的 Internet Explorer 11.0|Windows 7 用户

能实现一半就谢天谢地了。。

这个要是完成了，年终可以写个发行版对比了

开心就好

作为一个刚入门的菜鸟看看前辈们的目标也是对自己的一种鼓励！

# Linux 系统管理员 2017 年的 10 个新决心

当我们告别 2016 时，也到时间定下我们的 **新年决心** 了。不管你身为 Linux 系统管理员的经验水平如何，我们认为，制定接下来 12 个月的成长目标是很值得的。

如果你还没什么想法，我们将会在这篇文章分享 10 个简单的专业提升决心，你可以为 2017 年考虑一下。

### 1、 决定更自动化

你没必要忙得像头无头苍蝇，每天忙于解决可预见的问题。如果你发现自己每天都花费时间在执行重复的任务，你有必要现在就停下来。

在了解了所有基于 Linux 而且开源的工具后，你可以尽可能地[自动化你的 Linux 任务](/article-6526-1.html)来给自己一些休闲的时间。

你会发现，接下来的几个决心会帮你在工作上朝着这个目标前进。所以继续看下去吧。

### 2、 学习一门新的脚本语言

虽然每一个系统管理员应该熟练地使用 Bash 写脚本，但考虑一下其它更现代化、健壮性更强的工具也是很重要的，例如 Python。

不要只是相信我们说的话 —— 看看不久前我们发布的[两篇关于 Python 的系列文章](/article-7693-1.html)。你将会意识到，与其它语言相比，Python 带来了面向对象编程的力量，使您写出更短、健壮性更强的脚本。

### 3、 学习一门新的编程语言

除了学习一门新的脚本语言，（你也可以）决定花费点时间来开始学习或者提升你的编程技能。不确定从何处开始？今年的 [Stackoverflow 开发者调查](http://stackoverflow.com/research/developer-survey-2016#technology)表明 Javascript 连续第三年引领最流行语言的榜单。

其他经典例如 Java 和 C 也值得考虑。

### 4、 注册一个 Github 账户并且定期更新

特别是如果你是一个编程新手，你应该考虑一下在 Github 上展示你的成果。通过允许别人去复刻你的脚本或者程序，你就能提高知识水平，并通过别人的帮助创造出更复杂的软件。

在[《如何安装和注册 Github 帐号》](/article-5458-1.html)一文中了解更多。

### 5、 向一个开源项目做贡献

在 Github 上向一个开源项目做贡献，这是另一个学习或者提高一门新脚本语言或者编程语言能力的好办法。

如果这吸引到了你的兴趣，点击 [Explore Github](https://help.github.com/articles/where-can-i-find-open-source-projects-to-work-on/) 页面。这里你能按热度或者编程语言浏览仓库，你能在这里面找到一些有趣的事情来做。

在此基础上，你将因回馈社区而获得满足感。

### 6、 每月尝试一个新的发行版

经常会有新的发行版或者分支出现，你有不同的选项以供选择。谁知道你梦想中的发行版是否就在近前，而你还没发现它？每个月去一次 [Distrowatch](http://www.distrowatch.com) 然后选择一个新的发行版。

如果你想要尝试一个新的发行版，希望我们的评论能帮你做出决定。也可以点击我们这里关于最好的 Linux 发行版的文章：

* [5 个值得了解的 Linux 服务器发行版](/article-7813-1.html)
* [面向 Linux 新用户的八款最佳 Linux 发行版](/article-7738-1.html)
* [Linux 最佳选择：总有一款桌面发行版适合你](/article-7172-1.html)
* [5个你应该知道的 Live Linux 桌面发行版](/article-7052-1.html)
* [2016：如何选择 Linux 发行版](/article-7039-1.html)
* [为亲朋好友挑选一款合适的 Linux 发行版](/article-7026-1.html)
* [最适合和最不适合新手使用的几款 Linux 发行版](/article-6942-1.html)
* [2015年最流行的十大 Linux 发行版](/article-6856-1.html)
* [2016年值得期待的几大 Linux 发行版](/article-6844-1.html)

### 7、 参加一个 Linux 或者开源会议。

如果你住在由 Linux 基金会赞助的会议举办地附近，我强烈建议你去参加会议。

这不仅将会给你一个提高 Linux 知识的机会，而且将是个见见其他开源专家的机会。

### 8、 从 Linux 基金会的免费或付费课程中学习

Linux 基金会分别通过 **edX.org** 和他们自己的门户，不断地提供免费或付费课程。

免费课程的话题包括（但不仅限于）Linux 介绍、云基础设施技术介绍和 OpenStack 介绍。

另一方面，付费课程包括 [LFCS 认证](/article-7161-1.html) 和 LFCE 认证考试的准备，给开发者的 Linux ，内核内部构件，Linux 安全，性能试验，高可用性及其他。

另外，他们对企业课程有折扣，所以尝试去说服你上司来为你和你同事的训练付费。还有，也会提供周期性的免费在线研讨会，所以别忘了订阅他们的 newsletters！

你也可以考虑下看看我们最棒的[在线 Linux 训练课程](http://www.tecmint.com/linux-online-training-courses/)。

### 9、 每周在 Linux 论坛上回答特定数量的问题

另一个回馈社区的好方法是帮助那些刚开始使用 Linux 的人。你将会发现网上的 Linux 论坛上有许多人正在寻找着答复。

牢记你曾经也是像他们那样是个新手，试着换位思考。

### 10、 教一个孩子或少年使用 Linux

如果我能回到 20 年前，我希望我能有台电脑，有个能在青年时学习 Linux 的机会。

我也希望我能比当年还早很多地开始编程。毫无疑问，这样事情就会简单许多。我认为给孩子和青年教授至少是基础的 Linux 和编程技巧（我对我的孩子这样做）是个重要的尝试。

教育成长中的一代如何有效地使用开源技术将会给他们选择的自由，而他们会因此永远感激你。

### 总结

在这篇文章里我们分享了 10 个适合系统管理员的可能新年决心。我们祝你在朝着目标的工作顺顺利利，希望你能在 2017 年成为我们网站的常客。

如果你有关于这篇文章的问题或者评论，请不要犹豫使用下面的表格提交。我们期待着收到您的信息。

---

作者简介：

 Gabriel Cánepa 是个 GNU/Linux 系统管理员和网页开发者，他来自阿根廷圣路易斯的 Villa Mercedes 。他供职于全球领先的消费品公司，享受在日常工作的方方面面使用 FOSS（自由及开源软件） 工具来提高生产效率。.

---

via: <http://www.tecmint.com/linux-system-administrators-new-years-resolutions-ideas/>

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

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


Powerline：给 Vim 和 Bash 提供更棒的状态行和提示信息

Summary: Powerline 是一个极棒的 Vim 编辑器的状态行插件，这个插件是使用 Python 开发的，主要用于显示状态行和提示信息，适用于很多软件，比如 bash、zsh、tmux 等等。

Bash下面的powerline的显示效果差强人意，没有其他的比如zsh下好看，一些图标也没有，不建议bash下使用。<br />
vim的powerline插件是用的比较多，效果比较好的。

加了powerline以后好看是好看了，但是性能会下降很多，尤其是启动了git插件的时候，如果仓库比较大，很耗时

一年前用过这个东西，会损失一些性能

还是airline比较好,不会卡,不用装这么多插件,就装一个字体就好了

fish能用这个吗？该怎么弄呢

我查看了/usr/lib/python3.6/site-packages/powerline/bindings/文件夹里面，有个fish文件，然后里面的文件是powerline-setup.fish，我安装上面的格式写进去，把=那两段换成set，保存后重新打开没有报错，但是也没有powerline的效果。。。

# Powerline：给 Vim 和 Bash 提供更棒的状态行和提示信息

Powerline 是一个极棒的 [Vim 编辑器](http://www.tecmint.com/vi-editor-usage/)的状态行插件，这个插件是使用 Python 开发的，主要用于显示状态行和提示信息，适用于很多软件，比如 bash、zsh、tmux 等等。

### 特色

1. 使用 python 编写，使其更具扩展性且功能丰富
2. 稳定易测的代码库，兼容 python 2.6+ 和 python 3
3. 支持多种 Linux 功能及工具的提示和状态栏
4. 通过 JSON 保存配置和颜色方案
5. 快速、轻量级，具有后台守护进程支持，提供更佳的性能

### Powerline 效果截图

*Vim 中 Powerline 状态行效果*

在本文中，我会介绍如何安装 Powerline 及其字体，以及如何在 RedHat 和 Debian 类的系统中使 Bash 和 Vim 支持 Powerline。

### 第一步：准备好安装 Powerline 所需的软件

由于和其它无关项目之间存在命名冲突，因此 powerline 只能放在 PyPI（Python Package Index）中的 `powerline-status` 包下.

为了从 PyPI 中安装该包，需要先准备好 `pip`（该工具专门用于 Python 包的管理）工具。所以首先要在 Linux 系统下安装好 `pip` 工具。

#### 在 Debian、Ubuntu 和 Linux Mint 中安装 pip

```
# apt-get install python-pip

```

**示例输出：**

```
Reading package lists... Done
Building dependency tree
Reading state information... Done
Recommended packages:
python-dev-all python-wheel
The following NEW packages will be installed:
python-pip
0 upgraded, 1 newly installed, 0 to remove and 533 not upgraded.
Need to get 97.2 kB of archives.
After this operation, 477 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe python-pip all 1.5.4-1ubuntu3 [97.2 kB]
Fetched 97.2 kB in 1s (73.0 kB/s)
Selecting previously unselected package python-pip.
(Reading database ... 216258 files and directories currently installed.)
Preparing to unpack .../python-pip_1.5.4-1ubuntu3_all.deb ...
Unpacking python-pip (1.5.4-1ubuntu3) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up python-pip (1.5.4-1ubuntu3) ...

```

#### 在 CentOS、RHEL 和 Fedora 中安装 pip

在 Fedora 类系统中，需要先打开 [epel 仓库](/article-2324-1.html)，然后按照如下方法安装 pip 包。

```
# yum install python-pip
# dnf install python-pip                     [Fedora 22+ 以上]

```

**示例输出：**

```
Installing:
python-pip          noarch          7.1.0-1.el7             epel          1.5 M
Transaction Summary
=================================================================================
Install  1 Package
Total download size: 1.5 M
Installed size: 6.6 M
Is this ok [y/d/N]: y
Downloading packages:
python-pip-7.1.0-1.el7.noarch.rpm                         | 1.5 MB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : python-pip-7.1.0-1.el7.noarch                                 1/1
Verifying  : python-pip-7.1.0-1.el7.noarch                                 1/1
Installed:
python-pip.noarch 0:7.1.0-1.el7
Complete!

```

### 第二步：在 Linux 中安装 Powerline

现在可以从 Git 仓库中安装 Powerline 的最新开发版。在此之前系统需要安装好 Git 工具以便可以从仓库拉下代码。

```
# apt-get install git
# yum install git
# dnf install git

```

然后你可以通过 `pip` 命令安装 Powerline。

```
# pip install git+git://github.com/powerline/powerline

```

**示例输出：**

```
Cloning git://github.com/powerline/powerline to /tmp/pip-WAlznH-build
Running setup.py (path:/tmp/pip-WAlznH-build/setup.py) egg_info for package from git+git://github.com/Lokaltog/powerline
warning: no previously-included files matching '*.pyc' found under directory 'powerline/bindings'
warning: no previously-included files matching '*.pyo' found under directory 'powerline/bindings'
Installing collected packages: powerline-status
Found existing installation: powerline-status 2.2
Uninstalling powerline-status:
Successfully uninstalled powerline-status
Running setup.py install for powerline-status
warning: no previously-included files matching '*.pyc' found under directory 'powerline/bindings'
warning: no previously-included files matching '*.pyo' found under directory 'powerline/bindings'
changing mode of build/scripts-2.7/powerline-lint from 644 to 755
changing mode of build/scripts-2.7/powerline-daemon from 644 to 755
changing mode of build/scripts-2.7/powerline-render from 644 to 755
changing mode of build/scripts-2.7/powerline-config from 644 to 755
changing mode of /usr/local/bin/powerline-config to 755
changing mode of /usr/local/bin/powerline-lint to 755
changing mode of /usr/local/bin/powerline-render to 755
changing mode of /usr/local/bin/powerline-daemon to 755
Successfully installed powerline-status
Cleaning up...

```

### 第三步：在 Linux 中安装 Powerline 的字体

Powerline 使用特殊的符号来为开发者显示特殊的箭头效果和符号内容。因此你的系统中必须要有符号字体或者补丁过的字体。

通过下面的 [wget](http://www.tecmint.com/10-wget-command-examples-in-linux/) 命令下载最新的系统字体及字体配置文件。

```
# wget https://github.com/powerline/powerline/raw/develop/font/PowerlineSymbols.otf
# wget https://github.com/powerline/powerline/raw/develop/font/10-powerline-symbols.conf

```

然后你将下载的字体放到字体目录下 `/usr/share/fonts` 或者 `/usr/local/share/fonts`，或者你可以通过 `xset q` 命令找到一个有效的字体目录。

```
# mv PowerlineSymbols.otf /usr/share/fonts/

```

接下来你需要通过如下命令更新你系统的字体缓存。

```
# fc-cache -vf /usr/share/fonts/

```

其次安装字体配置文件。

```
# mv 10-powerline-symbols.conf /etc/fonts/conf.d/

```

注意：如果相应的符号没有出现，可以尝试关闭终端会话并重启 X window，这样就会生效了。

### 第四步：给 Bash Shell 和 Vim 状态行设置 Powerline

在这一节将介绍 bash shell 和 vim 编辑器中关于 Powerline 的配置。首先通过在 `~/.bashrc` 中添加如下内容以便设置终端为 256 色。

```
export TERM="screen-256color"

```

#### 打开 Bash Shell 中的 Powerline

如果希望在 bash shell 中默认打开 Powerline，可以在 `~/.bashrc` 中添加如下内容。

首先通过如下命令获取 powerline 的安装位置。

```
# pip show powerline-status
Name: powerline-status
Version: 2.2.dev9999-git.aa33599e3fb363ab7f2744ce95b7c6465eef7f08
Location: /usr/local/lib/python2.7/dist-packages
Requires:

```

一旦找到 powerline 的具体位置后，根据你系统的情况替换到下列行中的 `/usr/local/lib/python2.7/dist-packages` 对应的位置。

```
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/local/lib/python2.7/dist-packages/powerline/bindings/bash/powerline.sh

```

然后退出后重新登录，现在 powerline 的状态行应该如下显示了。

 [](http://www.tecmint.com/wp-content/uploads/2015/10/Bash-Powerline-Statuslines.gif)

现在切换目录并注意显示你当前路径的面包屑导航提示的变化。

如果远程 Linux 服务器上安装了 powerline，你能看到后台挂起的任务，当你用 ssh 登录上去时，会看到该提示增加了主机名。

#### 在 Vim 中打开 Powerline

如果你喜欢使用 vim，正好有一个 vim 的强力插件。可以在 `~/.vimrc` 中添加如下内容打开该插件（LCTT 译注：注意同样需要根据你的系统情况修改路径）。

```
set rtp+=/usr/local/lib/python2.7/dist-packages/powerline/bindings/vim/
set laststatus=2
set t_Co=256

```

然后你打开 vim 后会看到一个新的状态行:

 [](http://www.tecmint.com/wp-content/uploads/2015/10/Vim-Powerline-Statuslines.gif)

### 总结

Powerline 可以在某些软件中提供颜色鲜艳、很优美的状态行及提示内容，这对编程环境有利。希望这篇指南对您有帮助，如果您需要帮助或者有任何好的想法，请留言给我。

---

作者简介：

 我是Ravi Saive，TecMint的作者。一个喜欢分享诀窍和想法的电脑极客及Linux专家。我的大部分服务都运行在开源平台Linux中。关注我的Twitter，Facebook和Google+。

---

via: <http://www.tecmint.com/powerline-adds-powerful-statuslines-and-prompts-to-vim-and-bash/>

作者：[Ravi Saive](http://www.tecmint.com/author/admin/) 译者：[beyondworld](https://github.com/beyondworld) 校对：[wxy](https://github.com/wxy)

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


你值得了解的 10 个有趣的 Linux 命令行小技巧

# 你值得了解的 10 个有趣的 Linux 命令行小技巧

我非常喜欢使用命令，因为它们比 GUI（图形用户界面）应用程序对 Linux 系统提供更多的控制，因此，我一直在寻找一些有趣的方法[让 Linux 的操作变得简单好玩](/article-5816-1.html)，主要是基于终端操作。

当我们发现使用 Linux 的新技巧时，尤其是像我这样的命令行极客，我们总会感到非常来劲。

**建议阅读：** [5 有趣的 Linux 命令行技巧 - 第一部分](/article-5485-1.html)

而且我们也会很想与数百万 Linux 用户分享新学到的实践或命令，特别是那些还在使用自己的方式操作这个令人兴奋的操作系统的新手们。

**建议阅读：** [10 个对新手有用的 Linux 命令行技巧 - 第二部分](/article-6314-1.html)

在这篇文章中，我们将回顾一系列[有用的命令行小技巧](/article-6314-1.html)，它们可以显著地提高你的 Linux 使用技能。

### 1、 在 Linux 中锁定或隐藏文件或目录

锁定文件或目录最简单的方法是使用 Linux 文件权限。如果你是文件或目录的所有者，你可以阻止其他用户和组访问（删除、读取、写入、执行）它，如下所示：

```
$ chmod 700 tecmint.info
或
$ chmod go-rwx tecmint.info

```

想要了解更多有关 Linux 文件权限的内容，请阅读这篇文章[在 Linux 中管理用户和组，文件权限和属性](/article-7418-1.html)。

为了实现对系统中的其他用户隐藏文件或目录，可以通过在文件或目录开头添加 `.` 的方式重命名：

```
$ mv filename .tecmint.info

```

### 2、 在 Linux 中将 rwx 权限转为八进制格式

默认情况下，当你运行 [ls 命令](/article-5531-1.html)之后，它会使用 `rwx` 格式显示文件权限，为了了解 rwx 格式和八进制格式的等同性，你可以学习如何[在 Linux 中将 rwx 权限转为八进制格式](/article-4067-1.html)。

### 3、 当 `sudo` 命令执行失败时怎么使用 `su` 命令

虽然 [sudo 命令](/article-7418-1.html)被用来以超级用户权限执行命令，但是在某些情况下它也会执行失败，如下所示。

在这里，我想[清空一个大文件的内容](/article-8024-1.html)，其文件名为 `uptime.log`，但是即便我是使用 sudo 命令也执行失败了。

```
$ cat /dev/null >/var/log/uptime.log
$ sudo cat /dev/null >/var/log/uptime.log

```

*在 Linux 中清空大文件的内容*

遇到这种情况，你需要使用 `su` 命令切换到 `root` 用户，然后像下面这样去执行清空操作：

```
$ su
$ sudo cat /dev/null >/var/log/uptime.log
$ cat /var/log/uptime.log

```

*切换到超级用户*

尝试理解 [su 和 sudo 之间的区别](http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/)，另外，通过阅读它们的手册页以了解更多的使用指南：

```
$ man sudo
$ man su

```

### 4、 在 Linux 中结束一个进程

有些时候，当你想[使用 kill、killall、pkill 命令结束一个进程](/article-5557-1.html)时，它们有可能无法生效，你可能会看到该进程仍然还在系统上运行。

如果要强制结束一个进程，可以发送 `-KILL` 信号给该进程。

首先[获取指定进程 ID](/article-5051-1.html)，然后像下面这样结束该进程：

```
$ pidof vlc
$ sudo kill -KILL 10279

```

*在 Linux 中查找和结束进程*

查看 [kill 命令](/article-2116-1.html)以获取更多的使用选项和信息。

### 5、 在 Linux 中永久删除文件

一般情况下，我们通过使用 `rm` 命令将文件从 Linux 系统中删除。然而，这些文件并没有被真正的删除，它们仍被存储在那里并隐藏在你的硬盘中，其他用户仍然可以[在 Linux 中恢复删除的文件](/article-7974-1.html)并查看。

为了防止这种情况发生，我们可以使用 `shred` 命令来覆写文件内容，并在覆盖完成后选择删除文件。

```
$ shred -zvu tecmint.pdf

```

上述命令中所使用的选项说明：

1. `-z` – 最后一次使用 0 进行覆盖以隐藏覆写动作。
2. `-u` – 覆写后截断并移除文件。
3. `-v` – 显示详细过程。

*在 Linux 中永久删除文件*

阅读 `shred` 手册以获取更多的使用信息。

```
$ man shred

```

### 6、 在 Linux 中重命名多个文件

你可以通过使用 `rename` 命令随时[在 Linux 中重命名多个文件](/article-4905-1.html)。

`rename` 命令会根据第一个参数中的规则重命名指定文件。

以下命令会将所有 `.pdf` 文件重命名为 `.doc` 文件，使用的规则为 `'s/\.pdf$/\.doc/'`：

```
$ rename -v 's/\.pdf$/\.doc/' *.pdf

```

*在 Linux 中重命名多个文件*

在接下来的例子中，我们将通过重命名所有匹配 `"*.bak"` 的文件来移除其拓展名，使用的规则是 `'s/\e.bak$//'`：

```
$ rename -v 's/\e.bak$//' *.bak

```

### 7、 在 Linux 中检查单词拼写

`look` 命令用于显示文件中以指定字符串为前缀的任意行，同时它也可以帮你检查命令行中给定单词的拼写。尽管它并不是那么有效和可靠，但它仍然算得上是其他强大的拼写检查工具的有用替代品。

```
$ look linu
$ look docum

```

*在 Linux 中检查单词拼写*

### 8、 按关键字搜索手册页

`man` 命令用于显示命令的手册页，当使用 `-k` 选项时，它会将关键字 `printf`（或者如下命令中的关键字 `adjust`、`apache`、`php` ）作为正则表达式，来搜索所有匹配该名称手册页，并显示其简介。

```
$ man -k adjust
$ man -k apache
$ man -k php

```

*按关键字搜索手册页*

### 9、 在 Linux 中实时监测日志

`watch` 命令可以[定期执行另一个 Linux 命令](/article-5765-1.html)并全屏显示该命令的执行结果。当 `watch` 命令与 [tail 命令](http://www.tecmint.com/view-contents-of-file-in-linux/)（用于查看文件结尾的 Linux 命令）配合使用时，可以监测到日志文件的日志记录情况。

在以下示例中，你将实时监测系统认证日志文件。打开两个终端窗口，在第一个窗口中实时监测该日志文件，如下：

```
$ sudo watch tail /var/log/auth.log

```

你也可以使用 [tail 命令](http://www.tecmint.com/view-contents-of-file-in-linux/)（显示文件结尾的 Linux 命令）的 `-f` 选项实时监测文件变化。这样，我们就可以在日志文件中看到日志的生成情况。

```
$ sudo tail -f /var/log/auth.log

```

接着，在第二个终端窗口中运行以下命令，之后，你就可以在第一个终端窗口中观察日志文件内容：

```
$ sudo mkdir -p /etc/test
$ sudo rm -rf /etc/test

```

### 10、 列出所有 Shell 内置命令

shell 内置命令是一个命令或者函数，从内部调用并直接在 shell 里执行，而不是从硬盘加载外部的可执行程序来执行。

列出所有 shell 内置命令及其语法，执行如下命令：

```
$ help

```

作为结束语，[命令行小技巧](http://www.tecmint.com/tag/linux-tricks/)不仅能派得上用场，而且让学习和使用 Linux 变得更加简单有趣，尤其是对新手来讲。

你也可以通过留言给我们分享其他在 Linux 中[有用有趣的命令行小技巧](/article-5485-1.html)。

---

作者简介：

Aaron Kili 是一名 Linux 和 F.O.S.S 的爱好者，未来的 Linux 系统管理员、网站开发人员，目前是 TecMint 的写作者，他喜欢用电脑工作，并且乐于分享知识。

---

via: <http://www.tecmint.com/linux-command-line-tricks-and-tips-worth-knowing/>

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

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


如何在 Shell 脚本中跟踪调试命令的执行

我用这个就行了

kashu:/tmp/linux$ echo $PS4

+{$LINENO:${FUNCNAME[0]}}

# 如何在 Shell 脚本中跟踪调试命令的执行

在 [shell 脚本调试系列](/article-8028-1.html) 中，本文将解释第三种 shell 脚本调试模式，即 shell 跟踪，并查看一些示例来演示它如何工作以及如何使用它。

本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式：详细模式和语法检查模式，并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。

1. [如何在 Linux 中启用 Shell 脚本的调试模式](/article-8028-1.html)
2. [如何在 Shell 脚本中执行语法检查调试模式](/article-8045-1.html)

shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪，请使用 `-x` 调试选项。

这会让 shell 在终端上显示所有执行的命令及其参数。

我们将使用下面的 `sys_info.sh` shell 脚本，它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过，脚本中包含我们需要查找和更正的语法错误。

```
#!/bin/bash
# script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME
}
check_root
print_sys_info
exit 0

```

保存文件并执行脚本。脚本只能用 root 用户运行，因此如下使用 [sudo 命令](http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/)运行：

```
$ chmod +x sys_info.sh
$ sudo bash -x sys_info.sh

```

*shell 跟踪 - 显示脚本中的错误*

从上面的输出我们可以观察到，首先执行命令，然后其输出做为一个变量的值。

例如，先执行 `date`，其输出做为变量 `DATE` 的值。

我们可以执行语法检查来只显示其中的语法错误，如下所示：

```
$ sudo bash -n sys_info.sh

```

*脚本中语法检查*

如果我们审视这个 shell 脚本，我们就会发现 `if` 语句缺少了封闭条件的 `fi` 关键字。因此，让我们加上它，新的脚本应该看起来像这样：

```
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME
}
check_root
print_sys_info
exit 0

```

再次保存文件并以 root 执行，同时做语法检查：

```
$ sudo bash -n sys_info.sh

```

*在 shell 脚本中执行语法检查*

上面的语法检查操作的结果仍然显示在脚本的第 21 行还有一个错误。所以，我们仍然要纠正一些语法。

再一次分析脚本，会发现第 21 行的错误是由于在 `print_sys_info` 函数内最后一个 [echo 命令](http://www.tecmint.com/echo-command-in-linux/)中没有闭合双引号 `"`。

我们将在 `echo` 命令中添加闭合双引号并保存文件。修改过的脚本如下：

```
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME"
}
check_root
print_sys_info
exit 0

```

现在再一次检查语法。

```
$ sudo bash -n sys_info.sh

```

上面的命令不会产生任何输出，因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行，它应该工作得很好：

```
$ sudo bash -x sys_info.sh

```

*跟踪 shell 脚本执行*

现在运行脚本。

```
$ sudo ./sys_info.sh

```

*用 shell 脚本显示日期、时间和运行时间*

### shell 跟踪执行的重要性

shell 脚本跟踪可以帮助我们识别语法错误，更重要的是识别逻辑错误。例如，在 `sys_info.sh` shell 脚本中的 `check_root` 函数，它用于确定用户是否为 root，因为脚本只允许由超级用户执行。

```
check_root(){
  if [ "$UID" -ne "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

```

这里的魔法是由 `if` 语句表达式 `["$ UID" -ne "$ ROOT_ID"]` 控制的，一旦我们不使用合适的数字运算符（示例中为 `-ne`，这意味着不相等），我们最终可能会出一个逻辑错误。

假设我们使用 `-eq` （意思是等于），这将允许任何系统用户以及 root 用户运行脚本，因此是一个逻辑错误。

```
check_root(){
  if [ "$UID" -eq "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}

```

注意：我们在本系列开头介绍过，`set` 这个 shell 内置命令可以在 shell 脚本的特定部分激活调试。

因此，下面的行将帮助我们通过跟踪脚本的执行在其中找到这个逻辑错误：

具有逻辑错误的脚本：

```
#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){
  if [ "$UID" -eq "$ROOT_ID" ]; then
    echo "You are not allowed to execute this program!"
    exit 1;
  fi
}
print_sys_info(){
  echo "System Time    : $DATE"
  echo "Number of users: $NO_USERS"
  echo "System Uptime  : $UPTIME"
}
#turning on and off debugging of check_root function
set -x ; check_root;  set +x ;
print_sys_info
exit 0

```

保存文件并调用脚本，在输出中，我们可以看到一个普通系统用户可以在未 sudo 的情况下运行脚本。 这是因为 `USER_ID` 的值为 100，不等于为 0 的 root 的 `ROOT_ID` 。

```
$ ./sys_info.sh

```

**未 sudo 的情况下运行 shell 脚本**

那么，现在我们已经完成了 [shell 脚本调试系列](/article-8028-1.html)，可以在下面的反馈栏里给我们关于本篇或者本系列提出问题或反馈。

---

作者简介：

 Aaron Kili 是 Linux 和 F.O.S.S 爱好者，将来的 Linux SysAdmin、web 开 发人员，目前是 TecMint 的内容创作者，他喜欢用电脑工作，并坚信分享知识。

---

via: <http://www.tecmint.com/trace-shell-script-execution-in-linux/>

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

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


Summary: 虽然并非微软官方出品，不过你现在可以在 Windows 10 的  Linux 子系统（WSL）中使用 openSUSE Leap 或 SUSE Linux 企业版（SLES）了。此外，其它发行版也可以了。

我选择手动滑稽

好，好，好！ 我也想试试Arch、Fedora。

微软和Ubuntu的合作关系还是挺紧密的

能装GNOME 吗？

我认为是ubuntu给开发者带来了很多便利，相比之下才选择的

已经在笔记本上安装了Ubuntu操作系统……

在桌面用户中，还是ubuntu用户量大

每当看到linux发行版的问题，都不敢说话，无论多么有道理，都会引起一场血雨腥风。但是还是要说一下自己的观点。

不安装图形界面，不考虑维护周期，不考虑版权， 不追究开源贡献，ubuntu做的确不错。

如果以上四个都考虑的话，那么在所有发行版中，任何一个版本都比ubuntu做的好。

在我10年linux生涯中，既稳定，维护周期又久，能胜任我每天工作的发行版，只有两个，一个是debian,一个是openSUSE.  CentＯＳ现在都不及格，尤其是CentOS 7.

其实在使用开源软件的同时，其代价也是非常巨大的，比如我们在众多的发行版中，付出的时间成本

微软，请你不要偷懒。否则你的市场份额肯定越来越小。<br />
以前你的份额大多是靠DB出来的。

欣赏一下

用了一下，openSuse Firefox启动报错。

# 微软选择 Ubuntu 放到 Windows 10 的 Linux 子系统中，或许“错”了

>
> 虽然并非微软官方出品，不过你现在可以在 Windows 10 的 Linux 子系统（WSL）中使用 openSUSE Leap 或 SUSE Linux 企业版（SLES）了。
>
>
>

正如你所知道的，最新的 Windows 10 版本中含有一个完整的、基于 Ubuntu 的 Bash，开发者们可以在 Windows 桌面中直接运行 Linux 软件或命令。这被称为“Bash on Ubuntu on Windows”——一个啰嗦的名字——现在可以从 Windows 的开始菜单直接访问到了。

不过，SUSE 的资深产品经理 Hannes Kühnemund 却表示，[以他自己的观点来看](https://www.suse.com/communities/blog/make-windows-green-part-1/)，微软在选择 Linux 发行版时选“错”了——明显应该选 openSUSE 嘛。

“在 Windows 上原生地运行 Linux 二进制程序……这听起来真棒！然而，十分不幸是，微软在 WSL 里面选用了一个错误的 Linux（当然，这是我个人的看法），而现在是我们让它回到轨道上的时候了。” Hannes Kühnemund 说到，“为啥选 SUSE？因为 SUSE 从 1992 年开始就在做 Linux 发行版了。想找一个资格更老的 Linux 厂商（也可以叫发行版），对不起，你找不到，根本就木有！”

好吧，不管怎么说，如果你也对此感兴趣的话，他还写了篇文章教给你如何在 Windows 10 的 WSL 中安装 SUSE。

### 在 Windows 10 中安装 openSUSE Leap 42.2

如果你是 SUSE 粉，而你又想在 Windows 10 中使用你喜爱的 SUSE，但是又厌倦了使用虚拟机或配置双引导，那么就跟着 Kühnemund 先生一起来吧，他会教给你如何在 WSL 中安装最新的 openSUSE Leap 42.2。

首先，你需要按照[微软的说明](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)启用 WSL，也可以参考我们[之前的介绍](/article-7613-1.html)。确保在安装过程中创建了一个普通用户（带口令）。

这些步骤也同样适用于 SUSE Linux 企业版（SLES） 12 SP2，不过你需要下载另外一个文件。

运行如下命令下载 openSUSE Leap 42.2 的 docker 用户空间：

```
wget -O openSUSE-42.2.tar.xz https://github.com/openSUSE/docker-containers-build/blob/openSUSE-42.2/docker/openSUSE-42.2.tar.xz?raw=true
```

然后从开始菜单中打开 Linux bash shell，并执行如下命令来解压，然后退出 shell：

```
sudo mkdir rootfs
sudo tar -C rootfs -Jxf openSUSE-42.2.tar.xz
exit
```

如果在运行这些命令时出现一些警告，可以忽略。

完成之后，备份当前的“Bash on Ubuntu on Window” 安装：

```
cd %localappdata%\lxss\
rename rootfs rootfs.ubuntu
```

然后复制新的 openSUSE Leap 42.2 的根文件系统 rootfs：

```
move .\home\rootfs .\
```

最后，设置 root 为默认用户：

```
lxrun /setdefaultuser root
```

这样，下次你再访问 bash 时，你就用的是运行在 WSL 中的 openSUSE 或 SLES 啦。

当然，你还可以再做的完美些。用[这个绿绿的 SUSE 图标](http://www.iconarchive.com/show/nuoveXT-icons-by-saki/Apps-suse-icon.html)替换 “Bash on Ubuntu on Window” 默认的橘红 Ubuntu 图标：

```
cd %localappdata%\lxss\
rename bash.ico Ubuntu.ico
rename Saki-NuoveXT-Apps-suse.ico bash.ico
```

*在 Windows 10 中运行 SUSE Linux shell*

哦，除了图标，启动菜单中的名字 “Bash on Ubuntu on Window” 显然你也想换过来，进到 `%AppData%\Microsoft\Windows\Start Menu\Programs`，把默认项改成“Bash on SUSE on Windows” 或其它你想要的什么名字。

### 其它发行版呢？

如果你喜欢其它 Linux 发行版，比如 Arch Linux，那么你可以看看[这篇文章](/article-7857-1.html)。

还能支持别的 Linux 发行版吗？你别说，还真有人做出了一个[工具](https://github.com/RoliSoft/WSL-Distribution-Switcher)，可以在 WSL 中支持大多数的 Linux 发行版，并可以在这些发行版之间切换自如。

这个工具是由 RoliSoft 贡献到 GitHub 上的，名为 [WSL-Distribution-Switcher](https://github.com/RoliSoft/WSL-Distribution-Switcher) 。其思路类似于上面 openSUSE 的思路，都是采用容器作为 WSL 中的根文件系统。

你可以通过该工具中的 `get-prebuilt.py` 或 `get-source.py` 从 Docker Hub 上下载各个发行版的官方镜像或 tar 包，然后用 `install.py` 安装即可。最后，你还可以通过 `switch.py` 在你下载安装的 WSL 中进行切换。具体的操作，请参考其[说明](https://github.com/RoliSoft/WSL-Distribution-Switcher)。

由于它使用的是 Docker Hub 官方镜像，因此，它可以支持大多数 Linux 发行版，比如：

* [debian](https://hub.docker.com/_/debian/)
* [ubuntu](https://hub.docker.com/_/ubuntu/)
* [fedora](https://hub.docker.com/_/fedora/)
* [centos](https://hub.docker.com/_/centos/)
* [opensuse](https://hub.docker.com/_/opensuse/)
* [mageia](https://hub.docker.com/_/mageia/)
* [oraclelinux](https://hub.docker.com/_/oraclelinux/)
* [alpine](https://hub.docker.com/_/alpine/)
* [crux](https://hub.docker.com/_/crux/)
* [clearlinux](https://hub.docker.com/_/clearlinux/)
* ……

怎么样，你有试过在 Windows 10 中的 WSL 里面运行 Linux 吗？

via：[softpedia](http://news.softpedia.com/news/it-s-now-possible-to-use-opensuse-inside-windows-10-here-s-how-to-install-it-511844.shtml)，[suse](https://www.suse.com/communities/blog/make-windows-green-part-1/)，[github](https://github.com/RoliSoft/WSL-Distribution-Switcher)，[microsoft](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)


Summary: 我们将阐明如何在 Linux 系统中使用 TestDisk 来恢复硬盘上已删除或丢失的文件，它是非常优秀的修复工具，随一款免费的叫做 PhotoRec 的工具发布。

SSD不行吧？

像这种情况，/tmp目录挂载在tmpfs（内存）里，在/tmp里被误删的重要文件如何恢复？求教

kashu:/tmp$ df -hT /tmp

Filesystem     Type   Size  Used Avail Use% Mounted on

tmpfs          tmpfs  8.8G  3.2G  5.6G  37% /tmp

# 在 Linux 系统下使用 PhotoRec & TestDisk 工具来恢复文件

当你在系统中有意或无意地使用 `shift + delete` 组合键、删除选项，或是清空回收站的方式来[删除](/article-5473-1.html)一个文件时，该文件的内容并没有从硬盘（或是其它存储设备）上直接销毁。

它仅仅是从系统的目录结构中被移除，然后你在删除文件的目录下就看不到该文件了，但是这个文件仍然存在你磁盘中的某个位置上。

如果你有一个合适的工具和相关的专业知识，你就可以[从电脑中恢复已丢失的文件](/article-7974-1.html)。然而，随着你存储的文件越来越多，删除的文件将会被覆盖，你可能只能恢复最近删除的文件了。

在这篇文章中，我们将阐明如何在 Linux 系统中使用 **TestDisk** 来恢复硬盘上已删除或丢失的文件，它是非常优秀的修复工具，随一款免费的叫做 **PhotoRec** 的工具发布。

**PhoteRec** 工具用于从存储介质比如硬盘，数码相机和 cdrom 设备中恢复丢失的文件。（LCTT 译注：PhotoRec 的意思是 Photo Recovery，不是 Photo Recorder。）

### 在 Linux 系统中安装 TestDisk（PhotoRec）

在系统中执行以下相关的命令来安装 **TestDisk**：

```
------- On Debian/Ubuntu/Linux Mint -------
$ sudo apt-get install testdisk
------- On CentOS/RHEL/Fedora -------
$ sudo yum install testdisk
------- On Fedora 22+ -------
$ sudo dnf install testdisk
------- On Arch Linux -------
$ pacman -S testdisk
------- On Gentoo -------
$ emerge testdisk

```

如果你的 Linux 系统仓库中没有这个安装包，可以从 [这里](http://www.cgsecurity.org/wiki/TestDisk_Download) 下载然后在 Live CD 中运行即可。

这个安装包也可以在应急修复 CD 工具中找到，比如 Gparted LiveCD 、 Parted Magic 、 Ubuntu Boot CD 、 Ubuntu-Rescue-Remix 及其它工具等。

安装完成之后，使用 root 账号权限打开文本窗口，启动 **PhotoRec**，并指定已删除文件的分区：

```
$ sudo photorec /dev/sda3

```

你将会看到下面的交互界面：

*Linux 系统 PhotoRec 数据恢复工具*

使用左右箭头选择菜单选项，按回车键确认。要继续恢复操作，选择 `[Proceed]` 并单击 Enter。

你将看到下面的界面：

*选择分区进行文件恢复*

选择 `[Options]` 来查看可用的恢复选项，如下图所示：

*Linux 系统文件恢复选项*

按 `Q` 返回，在下图界面，你可以指定你想要查询并恢复的文件扩展名。因此，选择 `[File Opt]`，按回车键确认。

按 `s` 来选择或取消选择所有的文件扩展名，如果你已经取消选择了所有的文件扩展名，只需要使用向右箭头选择你想要恢复的文件类型即可（或者按向左箭头取消选择）。

例如，我想恢复所有系统中丢失的 `.mov` 类型的文件：

*指定恢复文件类型*

按 `b` 键保存设置，之后你应该看到如下图所示信息。单击回车键返回（或者按 `Q` 键），再按 `Q` 键返回到主界面。

*保存文件恢复设置*

现在选择 `[Search]` 开始文件恢复。在下图中，选择存储文件分区的文件系统类型，然后按回车键。

*选择文件系统类型来恢复删除的文件*

下一步，如下图所示，选择是仅对空闲空间还是整个分区进行分析。注意选择整个分区将会让操作过程变得更长更慢。选择合适的选项后，按回车键继续。

*选择文件系统进行分析*

选择一个目录用于存储将要恢复的文件，选择完成之后，按 `C` 键继续。选择不同分区的目录，以避免当更多的文件存储在这个分区时覆盖掉已删除的文件。

按向左箭头返回到根分区下。

*选择要保存恢复文件的目录*

下图显示正在被恢复的指定类型的已删除文件。你可以按回车键来停止操作。

**注意**：在恢复的过程中，你的系统会变得很慢，很可能会卡住一段时间，请耐心等待直至恢复完成。

*在 Linux 系统中恢复已删除的文件*

最后， **Photorec** 工具将会显示出已恢复文件的数量及保存的路径。

*Linux 文件恢复情况汇总*

默认情况下，已恢复的文件将会以 root 账号权限保存，因此，你需要以提升权限的方式打开文件管理器来访问这些文件。

使用如下命令（指定你的文件管理器）：

```
$ gksudo nemo
或
$ gksudo nautilus

```

想了解更多的信息，访问 PhotoRec 官网： <http://www.cgsecurity.org/wiki/PhotoRec>。

到此为止吧！在这篇文章中，我们阐明了使用 PhotoRec 工具来恢复磁盘中已删除或丢失文件每一个步骤。这是目前为止我使用过的最可靠和有效的恢复工具，如果你知道还有其它相似的工具，请在评论中跟大家分享。

---

作者简介：

Aaron Kili 是一个 Linux 系统及 F.O.S.S 爱好者，即将成为一名系统管理员及 Web 开发人员，他现在是 TecMint 网站的内容创建者，他喜欢使用电脑来工作，并且他坚信分享知识是一种美德。

---

via: <http://www.tecmint.com/photorec-recover-deleted-lost-files-in-linux/>

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

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


3 个在 Linux 中永久并安全删除文件和目录的方法

Summary: 在大多数情况下，我们习惯于使用 Delete 键、垃圾箱或 rm 命令从我们的计算机中删除文件，但这不是永久安全地从硬盘中（或任何存储介质）删除文件的方法。

SWAP 还可以不启用，或者设置为文件，这样就可以按照一般安全删除文件方式进行，就不需要专门的 SWAP 清除工具，当然删除时禁用 SWAP 还是必须的。

RSS里打开文章变样了？<br />
干净，赞！

嗯，因为考虑到 RSS 过来的用户有可能是在 RSS 阅读器，或者屏幕受限，因此采用了打印版式。当然，可以随时在这个页面里面按 ESC 或点击右上角关闭按钮，返回完整页面。

# 3 个在 Linux 中永久并安全删除文件和目录的方法

在大多数情况下，我们习惯于使用 `Delete` 键、垃圾箱或 `rm` 命令[从我们的计算机中删除文件](/article-7954-1.html)，但这不是永久安全地从硬盘中（或任何存储介质）删除文件的方法。

该文件只是对用户隐藏，它驻留在硬盘上的某个地方。它有可能被数据窃贼、执法取证或其它方式来恢复。

假设文件包含密级或机密内容，例如安全系统的用户名和密码，具有必要知识和技能的攻击者可以轻松地[恢复删除文件的副本](/article-8122-1.html)并访问这些用户凭证（你可以猜测到这种情况的后果）。

在本文中，我们将解释一些命令行工具，用于永久并安全地删除 Linux 中的文件。

### 1、 shred – 覆盖文件来隐藏内容

`shred` 会覆盖文件来隐藏它的内容，并且也可以选择删除它。

```
$ shred -zvu -n  5 passwords.list

```

在下面的命令中，选项有：

1. `-z` - 用零覆盖以隐藏碎片
2. `-v` - 显示操作进度
3. `-u` - 在覆盖后截断并删除文件
4. `-n` - 指定覆盖文件内容的次数（默认值为3）

*shred - 覆盖文件来隐藏它的内容*

你可以在 `shred` 的帮助页中找到更多的用法选项和信息：

```
$ man shred

```

### 2、 wipe – 在 Linux 中安全删除文件

`wipe` 命令可以安全地擦除磁盘中的文件，从而不可能[恢复删除的文件或目录内容](/article-7974-1.html)。

首先，你需要安装 `wipe` 工具，运行以下适当的命令：

```
$ sudo apt-get install wipe   [Debian 及其衍生版]
$ sudo yum install wipe       [基于 RedHat 的系统]

```

下面的命令会销毁 private 目录下的所有文件。

```
$ wipe -rfi private/*

```

当使用下面的标志时：

1. `-r` - 告诉 `wipe` 递归地擦除子目录
2. `-f` - 启用强制删除并禁用确认查询
3. `-i` - 显示擦除进度

*wipe – 在 Linux 中安全擦除文件*

注意：`wipe` 仅可以在磁性存储上可以可靠地工作，因此对固态磁盘（内存）请使用其他方法。

阅读 `wipe` 手册以获取其他使用选项和说明：

```
$ man wipe

```

### 3、 Linux 中的安全删除工具集

secure-delete 是一个安全文件删除工具的集合，它包含用于安全删除文件的 `srm`（secure\_deletion）工具。

首先，你需要使用以下相关命令安装它：

```
$ sudo apt-get install secure-delete   [Debian 及其衍生版]
$ sudo yum install secure-delete       [基于 RedHat 的系统]

```

安装完成后，你可以使用 `srm` 工具在 Linux 中安全地删除文件和目录。

```
$ srm -vz private/*

```

下面是使用的选项：

1. `-v` – 启用 verbose 模式
2. `-z` – 用0而不是随机数据来擦除最后的写入

*srm – 在 Linux 中安全删除文件*

阅读 srm 手册来获取更多的使用选项和信息：

```
$ man srm

```

### 4、 sfill -安全免费的磁盘 / inode 空间擦除器

`sfill` 是 secure-deletetion 工具包的一部分，是一个安全免费的磁盘和 inode 空间擦除器，它以安全的方法删除可用磁盘空间中的文件。 `sfill` 会[检查指定分区上的可用空间](/article-8024-1.html)，并使用来自 `/dev/urandom` 的随机数据填充它。

以下命令将在我的根分区上执行 `sfill`，使用 `-v' 选项启用 verbose 模式：

```
$ sudo sfill -v /home/aaronkilik/tmp/

```

假设你创建了一个单独的分区 `/home` 来存储正常的系统用户主目录，你可以在该分区上指定一个目录，以便在其上应用 `sfill`：

```
$ sudo sfill -v /home/username

```

你可以在 sfill 的手册上看到一些限制，你也可以看到额外的使用标志和命令：

```
$ man sfill

```

注意：secure-deletetion 工具包中的另外两个工具（`sswap` 和 `sdmem`）与本指南的范围不直接相关，但是，为了将来的使用和传播知识的目的，我们会在下面介绍它们。

### 5、 sswap – 安全 swap 擦除器

它是一个安全的分区擦除器，`sswap` 以安全的方式删除 swap 分区上存在的数据。

警告：请记住在使用 `sswap` 之前卸载 swap 分区！ 否则你的系统可能会崩溃！

要找到交换分区（并检查分页和交换设备/文件是否已经使用，请使用 `swapon` 命令），接下来，使用 `swapoff` 命令禁用分页和交换设备/文件（使 swap 分区不可用）。

然后在（关闭的） swap 分区上运行 `sswap` 命令：

```
$ cat /proc/swaps
$ swapon
$ sudo swapoff /dev/sda6
$ sudo sswap /dev/sda6    #这个命令要花费一些时间，默认要进行 38 遍擦除

```

*sswap – 安全 swap 擦除器*

阅读 `sswap` 的手册来获取更多的选项和信息：

```
$ man sswap

```

### 6、 sdmem – 安全内存擦除器

`sdmem` 是一个安全的内存擦除器，其设计目的是以安全的方式删除存储器（RAM）中的数据。

它最初命名为 [smem](/article-7681-1.html)，但是因为在 Debain 系统上存在另一个包 [smem - 报告每个进程和每个用户的内存消耗](/article-7681-1.html)，开发人员决定将它重命名为 `sdmem`。

```
$ sudo sdmem -f -v

```

关于更多的使用信息，阅读 `sdmen` 的手册：

```
$ man sdmem

```

**推荐阅读：** [在 Linux 系统下使用 PhotoRec & TestDisk 工具来恢复文件](/article-8122-1.html)。

就是这样了！在本文中，我们查看了一系列可以永久安全地删除 Linux 中的文件的工具。像往常一样，通过下面的评论栏发表你对本篇文章的想法或建议。

---

作者简介：

Aaron Kili 是一个 Linux 系统及 F.O.S.S 爱好者，即将成为一名系统管理员及 Web 开发人员，他现在是 TecMint 网站的内容创建者，他喜欢使用电脑来工作，并且他坚信分享知识是一种美德。

---

via: <http://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/admin/) 译者：[geekpi](https://github.com/geekpi) 校对：[jasminepeng](https://github.com/jasminepeng)

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


4 个 Linux 下最好的命令行下载管理器/加速器

# 4 个 Linux 下最好的命令行下载管理器/加速器

我们经常由于不同需求使用下载管理器从互联网下载文件，它给我和其他人提供了很多帮助。我们都想要一个超级快速的下载管理器来完成下载尽可能多的任务，以便我们可以节省时间来进一步地工作。有很多可以加速下载的下载管理器和加速器可用（图形化界面和命令行界面）。

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

所有的下载工具做着同样的任务，但它们的处理方式和功能是不同的，比如，单线程和多线程、交互和非交互。 在这里，我们将列出 4 个最好的我们日常工作使用的命令行下载加速器。

### #1 Aria2

[Aria2](https://aria2.github.io/) 是一个用于 Linux、Windows 和 Mac OSX 的轻量级、多协议和多源的命令行下载管理器/实用程序。它支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink。aria2 可以通过内置的 JSON-RPC 和 XML-RPC 接口操作。

它支持多线程，可以使用多个源或协议下载文件，确实可以加速并尽可能多的完成下载。

它非常轻量级，不需要太多的内存和 CPU。我们可以使用它作为 BitTorrent 客户端，因为它有所有你想要的 BitTorrent 客户端的功能。

#### Aria2 功能

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

有关 Aria2 的进一步用法，请参阅以下文章：[如何在 Linux 中安装和使用 Aria2](/article-7982-1.html)。

### #2 Axel

[Axel](https://axel.alioth.debian.org/) 是一个轻量级下载程序，它如其他加速器那样做着同样的事情。它可以为一个文件打开多个连接，每个连接下载单独的文件片段以更快地完成下载。

Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点来下载单个文件。 所以，Axel 可以为下载加速高达 40％（大约，我个人认为）。 它非常轻量级，因为没有依赖，而且使用非常少的 CPU 和内存。

Axel 使用一个单线程将所有数据直接下载到目标文件。

注意：没有可以在单条命令中下载两个文件的选项。

有关 Axel 的更多使用，请参阅以下文章：[如何在 Linux 中安装和使用 Axel](/article-8129-1.html)。

### #3 Wget

[wget](https://www.gnu.org/software/wget/)（以前称为 Geturl）是一个免费的、开源的命令行下载程序，它使用 HTTP、HTTPS 和 FTP 这些最广泛使用的 Internet 协议来获取文件。它是一个非交互式命令行工具，其名字是意思是从万维网中获取文件。

相比其它工具，wget 将下载处理得相当好，即使它不支持多线程以及包括后台工作、递归下载、多个文件下载、恢复下载、非交互式下载和大文件下载在内的功能。

默认情况下，所有的 Linux 发行版都包含 wget，所以我们可以从官方仓库轻松安装，也可以安装到 windows 和 Mac 操作系统。

wget 可在慢速或不稳定的网络连接下保持健壮性，如果由于网络问题下载失败，它将继续重试，直到整个文件下载完成。如果服务器支持重新获取，它将指示服务器从中断的地方继续下载。

#### wget 功能

* 可以使用 REST 和 RANGE 恢复中止的下载
* 可以使用文件名通配符和递归来对目录进行镜像同步
* 基于 NLS 消息文件，提供许多不同语言支持
* 可选将下载的文档中的绝对链接转换为相对链接，以便下载的文档可以在本地链接到彼此
* 可在大多数类 UNIX 操作系统以及 Microsoft Windows 上运行
* 支持 HTTP 代理
* 支持 HTTP cookie
* 支持持久 HTTP 连接
* 无人值守/后台操作
* 使用本地文件时间戳来确定是否需要在镜像时重新下载文档

有关 wget 的进一步用法，请参阅以下文章：[如何在 Linux 中安装和使用 wget](/article-4129-1.html)。

### #4 Curl

[curl](https://curl.haxx.se/) 类似于 wget，但是不支持多线程，但令人惊讶的是，与 wget 相比，它的下载速度更快。

curl 是一个向服务器上传或下载的数据传输工具，支持的协议有 DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、TELNET 和 TFT 等。

该命令无需用户交互即可工作。此外，curl 支持代理、用户身份验证、FTP 上传、HTTP POST、SSL 连接、Cookie、恢复文件传输、Metalink 等。curl 由 libcurl 为所有相关传输功能提供支持。

如果指定的 URL 没有 `protocol://` 前缀，curl 将尝试猜测你可能需要什么协议。例如，以 “ftp.” 开头的主机名 curl 将假定你要使用 FTP。如果没有找到特定的协议，那么默认为 HTTP。

参考下面的文章来进一步使用 curl：[如何在 Linux 中安装和使用 curl](http://www.2daygeek.com/curl-command-line-download-manager/)。

---

via: <http://www.2daygeek.com/best-4-command-line-download-managers-accelerators-for-linux/>

作者：[Magesh Maruthamuthu](http://www.2daygeek.com/author/magesh/) 译者：[geekpi](https://github.com/geekpi) 校对：[jasminepeng](https://github.com/jasminepeng)

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


Linux I/O 重定向基础

Summary: Linux 管理的一个最重要并且有趣的话题是 I/O 重定向。此功能在命令行中使你能够将命令的输入输出取自或送到文件中，或者可以使用管道将多个命令连接在一起以形成所谓的“命令管道”。

stdin, stdout, stderr 这三个描述符在 Windows 的 command.com 和 cmd.exe 也是支持的。对于一个 Linux 程序是可以自行决定其进程以及子进程是否具有打开这三种描述的能力，某些即可作为命令行程序也可以作为守护进程的程序只打开 stdin, stderr，而关闭 stdout，强行重定向到 stdout，会报资源临时不可用。

终端配色很喜欢，搞个教程学习匣子！！！

logo可以玩了，啊哈哈哈！

哈哈哈

# Linux I/O 重定向基础

Linux 管理的一个最重要并且有趣的话题是 I/O 重定向。此功能在命令行中使你能够将命令的输入输出取自或送到文件中，或者可以使用管道将多个命令连接在一起以形成所谓的“**命令管道**”。

我们运行的所有命令基本上产生两种输出：

* 命令结果 - 程序产生的数据，以及
* 程序状态和错误消息，用来通知用户程序的执行细节。

在 Linux 和其他类 Unix 系统中，有三个默认文件（名称如下），这些文件也由 shell 使用文件描述符号标识：

* stdin 或 0 - 它连接键盘，大多数程序从此文件读取输入。
* stdout 或 1 - 它连接屏幕，并且所有程序将其结果发送到此文件
* stderr 或 2 - 程序将状态/错误消息发送到此文件，它也连接到屏幕上。

因此，I/O 重定向允许你更改命令的输入源以及将输出和错误消息发送到其他地方。这可以通过 `<` 和 `>` 重定向操作符来实现。

### 如何在 Linux 中重定向标准输出到文件中

如下面的示例所示，你可以重定向标准输出，这里，我们要存储 [top 命令](/article-2290-1.html)的输出以供以后检查：

```
$ top -bn 5 >top.log

```

其中标志的含义：

* `-b` - 让 `top` 以批处理模式运行，以便你可以将其输出重定向到一个文件或另一个命令。
* `-n` - 指定命令终止前的迭代次数。

你可以使用 [cat 命令](/article-2137-1.html)来查看 `top.log` 文件的内容：

```
$ cat top.log

```

要将命令输出**附加**在文件后面，请使用 `>>` 操作符。

例如，要将 [top 命令](/article-2352-1.html)的输出追加在上面的 `top.log` 文件中，特别是在脚本（或命令行）中，请输入下面的那行：

```
$ top -bn 5 >>top.log

```

**注意**： 也可以使用文件描述符数字，上面的重定向命令等同于：

```
$ top -bn 5 1>top.log

```

### 如何在 Linux 中重定向标准错误到文件中

要重定向命令的标准错误，你需要明确指定文件描述符 `2`，以便让 shell 了解你正在尝试做什么。

例如，下面的 [ls 命令](/article-2535-1.html)将在没有 root 权限的普通系统用户执行时产生错误：

```
$ ls -l /root/

```

你可以重定向标准错误到文件中：

```
$ ls -l /root/ 2>ls-error.log
$ cat ls-error.log

```

*重定向标准错误到文件中*

为了将标准错误附加在文件后，使用下面的命令：

```
$ ls -l /root/ 2>>ls-error.log

```

### 如何重定向标准输出及标准错误到一个文件中

还可以将命令的所有输出（包括标准输出和标准错误）捕获到单个文件中。这可以用两种可能的方式，通过指定文件描述符来完成：

1、 第一种是相对较旧的方法，其工作方式如下：

```
$ ls -l /root/ >ls-error.log 2>&1

```

上面的命令意思是 shell 首先将 [ls 命令](/article-2535-1.html)的输出发送到文件 `ls-error.log`（使用 `>ls-error.log`），然后将所有写到文件描述符 `2`（标准错误）的错误消息重定向到文件 `ls-error.log`（使用`2>＆1`）中。（LCTT 译注：此处原文有误，径改。）这表示标准错误也被发送到与标准输出相同的文件中。

2、 第二种并且更直接的方法是：

```
$ ls -l /root/ &>ls-error.log

```

你也可以这样将标准输出和标准错误附加到单个文件后：

```
$ ls -l /root/ &>>ls-error.log

```

### 如何将标准输入重定向到文件中

大多数（如果不是全部）命令从标准输入获得其输入，并且标准输入默认连接到键盘。

要从键盘以外的文件重定向标准输入，请使用 `<` 操作符，如下所示：

```
$ cat <domains.list

```

*重定向文件到标准输入中*

### 如何重定向标准输入/输出到文件中

你可以如下在 [sort 命令](/article-5372-1.html)中同时执行标准输入、标准输出的重定向：

```
$ sort <domains.list >sort.output

```

### 如何使用管道进行 I/O 重定向

要将一个命令的输出重定向为另一个命令的输入，你可以使用管道，这是用于构建复杂操作命令的有力方法。

例如，以下命令将[列出最近修改的前五个文件](/article-8093-1.html)。

```
$ ls -lt | head -n 5

```

选项的意思是：

* `-l` - 启用长列表格式
* `-t` - [最新修改的文件](/article-8093-1.html)首先显示
* `-n` - 指定要显示的标题行数

### 构建管道的重要命令

在这里，我们将简要回顾一下构建命令管道的两个重要命令，它们是：

`xargs` 用于从标准输入构建和执行命令行。下面是使用 `xargs` 的管道示例，此命令用于[将文件复制到 Linux 中的多个目录](/article-8041-1.html)：

```
$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh

```

*复制文件到多个目录*

选项含义：

* `-n 1` - 让 `xargs` 对每个命令行最多使用一个参数，并发送到 [cp命令](http://www.tecmint.com/progress-monitor-check-progress-of-linux-commands/)
* `cp` - 复制文件
* `-v` - [显示 `cp` 命令的进度](http://www.tecmint.com/monitor-copy-backup-tar-progress-in-linux-using-pv-command/)。

有关更多的使用选项和信息，请阅读 `xargs` 手册页：

```
$ man xargs

```

`tee` 命令从标准输入读取，并写入到标准输出和文件中。我们可以演示 `tee` 如何工作：

```
$ echo "Testing how tee command works" | tee file1

```

*tee 命令示例*

文件或文本过滤器通常与管道一起用于有效地操作 Linux 文件，来以强大的方式来处理信息，例如命令的重组输出（这对于[生成有用的 Linux 报告](http://www.tecmint.com/linux-performance-monitoring-and-file-system-statistics-reports/)是必不可少的）、修改文件中的文本和其他的 Linux 系统管理任务。

要了解有关 Linux 过滤器和管道的更多信息，请阅读这篇文章[查找前十个访问 Apache 服务器的 IP 地址](http://www.tecmint.com/find-top-ip-address-accessing-apache-web-server/)，这里展示了使用过滤器和管道的一个例子。

在本文中，我们解释了 Linux 中 I/O 重定向的基本原理。请通过下面的反馈栏分享你的想法。

---

作者简介：

Aaron Kili 是 Linux 和 F.O.S.S 爱好者，将来的 Linux SysAdmin、web 开发人员，目前是 TecMint 的内容创建者，他喜欢用电脑工作，并坚信分享知识。

---

via: <http://www.tecmint.com/linux-io-input-output-redirection-operators/>

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

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


让 sudo 在你输入错误的密码时“嘲讽”你

Summary: 在本文中，我们将解释一个 sudoers 配置参数，以允许个人或系统管理员设置 sudo 命令，当系统用户输入错误密码时“嘲讽”他们。

支持中文不？

“老子问你，你他（自行脑补）的就是老子的master吗？”

“放他（自行脑补）的狗屁！密码还能当饭吃吗？”

“捅他master的腚眼子”

# 让 sudo 在你输入错误的密码时“嘲讽”你

**sudoers** 是 Linux 中的默认 sudo 安全策略插件，但是经验丰富的系统管理员可以自定义安全策略以及输入输出日志记录的插件。它由 `/etc/sudoers` 这个文件驱动，或者也可在 LDAP 中。

你可以在上面的文件中定义 **sudoers** <ruby> 嘲讽 <rt>  insults </rt></ruby> 或其他选项。它在 `defaults` 部分下设置。请阅读我们的上一篇文章[在 Linux 中设置 sudo 时 10 个有用的 sudoers 配置](http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/)。

在本文中，我们将解释一个 sudoers 配置参数，以允许个人或系统管理员设置 [sudo 命令](http://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/)，当系统用户输入错误密码时“嘲讽”他们。

首先打开文件 `/etc/sudoers`，如下所示：

```
$ sudo visudo

```

进入 `defaults` 部分，并添加下面的行：

```
Defaults   insults

```

下面是我系统中 `/etc/sudoers` 默认展示的 `defaults` 部分。

*设置 sudo insults 参数*

从上面的截图中，你可以看到 `defaults` 中还有许多其他默认值定义，例如，每次用户输入错误的密码时发送邮件到 root、设置安全路径、配置自定义 sudo 日志文件等。

保存并关闭文件。

运行 `sudo` 命令并输入错误的密码，然后观察 insults 选项是如何工作的：

```
$ sudo visudo

```

*实践 sudo insult*

**注意**：当配置 insults 参数时，它会禁用 `badpass_message` 参数，该参数在用户输入错误的密码时，会在命令行中输出特定的消息（默认消息为 “**sorry, try again**”）。

要修改该消息，请将 `badpass_message` 参数添加到 `/etc/sudoers` 文件中，如下所示。

```
Defaults  badpass_message="Password is wrong, please try again"  #try to set a message of your own

```

*设置 sudo 错误密码消息*

保存并关闭文件，然后调用 `sudo` 查看它是如何工作的，你设置的 `badpass_message` 消息会在每次你或任何系统用户输入错误的密码的时候打印出来。

```
$ sudo visudo

```

*sudo 密码错误消息*

就是这样了，在本文中，我们回顾了如何在用户输入错误的密码时将 `sudo` 设置为显示嘲讽。请通过下面的评论栏分享你的想法。

---

作者简介：

Aaron Kili 是 Linux 和 F.O.S.S 爱好者，将来的 Linux SysAdmin、web 开发人员，目前是 TecMint 的内容创建者，他喜欢用电脑工作，并坚信分享知识。

---

via: <http://www.tecmint.com/sudo-insult-when-enter-wrong-password/>

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

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


使用 Axel 命令行下载器/加速器加速下载

Summary: Axel 是一个轻量级下载程序，它和其他加速器一样，对同一个文件建立多个连接，每个连接下载单独的文件片段以更快地完成下载。

# 使用 Axel 命令行下载器/加速器加速下载

[Axel](https://axel.alioth.debian.org/) 是一个轻量级下载程序，它和其他加速器一样，对同一个文件建立多个连接，每个连接下载单独的文件片段以更快地完成下载。

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

Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点下载单个文件，所以，Axel 可以加速下载高达 40％（大约，我个人认为）。它非常轻量级，因为它没有依赖并且使用非常少的 CPU 和内存。

Axel 一步到位地将所有数据直接下载到目标文件（LCTT 译注：而不是像其它的下载软件那样下载成多个文件块，然后拼接）。

**注意**：不支持在单条命令中下载两个文件。

你还可以尝试其他命令行下载管理器/加速器。

* [aria2 - 超快速下载程序](http://www.2daygeek.com/aria2-command-line-download-utility-tool/)
* [wget - 标准命令行下载程序](http://www.2daygeek.com/wget-command-line-download-utility-tool/)
* [curl - 命令行下载程序](http://www.2daygeek.com/aria2-command-line-download-utility-tool/)
* [Linux 下的最好的 4 个命令行下载管理器/加速器](/article-8124-1.html)

大多数发行版（Debian、Ubuntu、Mint、Fedora、suse、openSUSE、Arch Linux、Manjaro、Mageia 等）都有 axel 包，所以我们可以从发行版官方仓库轻松安装。对于 CentOS/RHEL，我们需要启用 [EPEL Repository](/article-2324-1.html)。

```
[在 Debian/Ubuntu/LinuxMint 上安装 Axel]
$ sudo apt-get install axel

[在 RHEL/CentOS 上安装 Axel]
$ sudo yum install axel

[在 Fedora 上安装 Axel]
$ sudo dnf install axel

[在 openSUSE 上安装 Axel]
$ sudo zypper install axel

[在 Mageia 上安装 Axel]
$ sudo urpmi axel

[在基于 Arch Linux 的发行版安装 Axel]
$ sudo pacman -S axel

```

### 1) 下载单个文件

以下命令将从给定的 URL 下载文件并存储在当前目录中，下载文件时，我们可以看到文件的信息（建立的连接数、下载速度、下载进度、完成下载所花费的时间以及连接完成的时间）。

```
# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

[  0%]  .......... .......... .......... .......... ..........  [ 146.7KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 267.0KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 373.9KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 406.9KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 487.5KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 572.6KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 650.7KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 649.3KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 718.1KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 769.3KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 838.7KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 866.0KB/s]
Connection 0 finished
.
.
[ 99%]  .......... .......... .......... .......... ..........  [5721.0KB/s]
Connection 2 finished
[ 99%]  .......... .......... .......... .......... ..........  [5733.4KB/s]
Connection 1 finished
[ 99%]  .......... .......... .......... .......... ..........  [5745.4KB/s]
[100%]  .......... .......... .......... .......... ......

Downloaded 21.6 megabytes in 3 seconds. (5755.94 KB/s)

```

### 2) 用不同的名称保存文件

要使用其他名称来保存文件，启动下载时可以添加 `-o`（小写字母）选项和文件名。这里我们使用文件名 `owncloud.tar.bz2` 来保存文件。

```
# axel -o cloud.tar.bz2 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file cloud.tar.bz2
Starting download

[  0%]  .......... .......... .......... .......... ..........  [ 143.0KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 264.1KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 309.8KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 406.3KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 495.4KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 586.3KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 673.1KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 647.1KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 721.1KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 781.3KB/s]
Connection 2 finished
.
.
Connection 0 finished
[ 98%]  .......... .......... .......... .......... ..........  [6221.9KB/s]
[ 98%]  .......... .......... .....
Connection 1 finished
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,..... .......... ..........  [6145.6KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [6159.2KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [6172.0KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [5977.9KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [5989.6KB/s]
[100%]  .......... .......... .......... .......... ......

Downloaded 21.6 megabytes in 3 seconds. (6001.05 KB/s)

```

### 3) 限制下载速度

默认情况下 axel 以字节/秒为单位设置下载文件的最大速度。当我们的网络连接速度较慢时，可以使用此选项。只需添加 `-s` 选项，后面跟字节值。这里我们要限速 `512 KB/s` 下载一个文件。

```
# axel -s 512000 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

[  0%]  .......... .......... .......... .......... ..........  [ 141.5KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 266.1KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 308.0KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 405.9KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 496.7KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 526.4KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 507.0KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 505.6KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 504.8KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 503.9KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 503.4KB/s]
.
.
[ 99%]  .......... .......... .......... .......... ..........  [ 497.0KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [ 496.9KB/s]
[100%]  .......... ..
Connection 0 finished
        ,,,,,,,,,, ,,.....
Connection 1 finished
Connection 3 finished
        ,,,,,,,,,, ,,,,,,,... .......... .......... ......

Downloaded 21.6 megabytes in 44 seconds. (494.54 KB/s)

```

### 4) 限制连接数

axel 默认建立 4 个连接以从不同的镜像获取文件。此外，我们可以通过使用 `-n` 选项添加更多的连接，后跟连接数 `10` 来提高下载速度。保险起见，我们添加了十个连接，但不幸的是，它花了更多时间来下载文件。

```
# axel -n 10 https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

[  0%]  .......... .......... .......... .......... ..........  [ 140.8KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 265.7KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 305.4KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 402.1KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 496.3KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 522.1KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 567.5KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 640.5KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 710.8KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 780.5KB/s]
.
.
[ 98%]  .......... .......... .......... .......... ..........  [7544.9KB/s]
[ 98%]  .......... .......... .......... .......... ..........  [7557.9KB/s]
[ 98%]  .......... .......... .......... .......... ..........  [7570.4KB/s]
[ 98%]  .......... .......... .......... .......... ..........  [7495.3KB/s]
[ 99%]  .......... .......... .......... .......... ......
Connection 2 finished
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,....  [7311.6KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [7318.9KB/s]
[ 99%]  .......... .......... .......... .......... ..........
Connection 9 finished
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,  [7331.0KB/s]
[ 99%]  .......... .......... .......... ..........
Connection 3 finished
        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ..........  [4300.7KB/s]
[100%]  .......... .......... .......... .......... ......

Downloaded 21.6 megabytes in 5 seconds. (4109.41 KB/s)

```

### 5) 恢复未完成的下载

axel 默认具有恢复未完成的下载的行为。Axel 在下载文件时定期更新状态文件（扩展名为 `.st`）。由于某些原因，下载中途停止了？不用担心，只要使用相同的 axel 命令，它将会检查 `file` 和 `file.st`，如果找到，它会从停止处恢复下载。

```
# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

[  0%]  .......... .......... .......... .......... ..........  [ 140.8KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 265.7KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 305.4KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 402.1KB/s]
[  0%]  .......... .......... .......... .......... ..........  [ 496.3KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 522.1KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 567.5KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 640.5KB/s]
[  1%]  .......... .......... .......... .......... ..........  [ 710.8KB/s]
[  2%]  .......... .......... .......... .......... ..........  [ 780.5KB/s]
.
.
[ 84%]  .......... .......... .......... .......... ..........  [7100.7KB/s]
[ 84%]  .......... .......... .......... .......... ..........  [7104.3KB/s]
[ 84%]  .......... .......... .......... .^C

Downloaded 18.3 megabytes in 2 seconds. (7009.79 KB/s)

```

上面的输出清晰地显示了在下载断开时有两个文件 `owncloud-9.0.0.tar.bz2` 和 `owncloud-9.0.0.tar.bz2.st`。当重新开始下载时，它会从停止处开始下载。

```
# ls -lh
total 19M
-rw------- 1 root root 22M Dec 27 08:33 owncloud-9.0.0.tar.bz2
-rw------- 1 root root  44 Dec 27 08:33 owncloud-9.0.0.tar.bz2.st

# axel https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
State file found: 19180828 bytes downloaded, 3497380 to go.
Starting download

        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,......... ..........  [  66.5KB/s]
[ 84%]  .......... .......... .......... .......... ..........  [ 186.0KB/s]
[ 85%]  .......... .......... .......... .......... ..........  [ 241.7KB/s]
[ 85%]  .......... .......... .......... .......... ..........  [ 335.6KB/s]
[ 85%]  .......... .......... .......... .......... ..........  [ 351.5KB/s]
[ 85%]  .......... .......... .......... .......... ..........  [ 427.1KB/s]
[ 85%]  .......... .......... .......... .......... ..........  [ 427.4KB/s]
[ 86%]  .......... .......... .......... .......... ..........  [ 491.5KB/s]
.
.
[ 98%]  ...
Connection 0 finished
        ,,,....... .......... .......... .......... ..........  [2106.6KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [2140.5KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [2172.4KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [2203.2KB/s]
[ 99%]  .......... .......... .......... .......... ..........  [2236.2KB/s]
[100%]  .......... .......... .......... .......... ......

Downloaded 3415.4 kilobytes in 1 second. (2264.93 KB/s)

```

### 6) 不显示文件下载进度

如果你不想要看到文件的下载进度，只要在 axel 命令中加入 `-q` 选项。

```
# axel -q https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2

```

### 7) 替换进度条

如果你不喜欢默认的进度条，你可以使用 `-a` 选项来替换进度条。

```
# axel -a https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
Initializing download: https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

[ 66%] [......0      ...1        ..........2  ...........3] [   5.8MB/s] [00:01]^C

Downloaded 14.3 megabytes in 2 seconds. (5916.11 KB/s)

```

我们中断了上面的下载，以便在下载文件时能清楚地显示替代进度条状态。一旦文件成功下载后，你可以看到相同的输出，如下所示。

```
# axel -a https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2
File size: 22678208 bytes
Opening output file owncloud-9.0.0.tar.bz2
Starting download

Connection 2 finished                                                          ]
Connection 1 finished                                                          ]
Connection 3 finished                                                          ]
Connection 0 finished                                                          ]

Downloaded 21.6 megabytes in 4 seconds. (5062.32 KB/s)

```

### 8) 了解关于 axel 的更多信息

如果你想要了解更多关于 axel 的选项，只需要进入它的手册。

```
# man axel
或者
# axel --help

```

享受吧……

---

via: <http://www.2daygeek.com/axel-command-line-downloader-accelerator-for-linux/>

作者：[Magesh Maruthamuthu](http://www.2daygeek.com/author/magesh/) 译者：[geekpi](https://github.com/geekpi) 校对：[jasminepeng](https://github.com/jasminepeng)

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


LinuxCon 今年夏天将首次在华举办

Summary: 致力于专业化开源协作的非盈利组织 Linux 基金会The Linux Foundation今天宣布，其 LinuxCon + ContainerCon + CloudOpen （LC3）会议将首次来到中国，将于 2017 年 6 月 19 - 20 日，在北京的国家会议中心召开。

哎哟，希望可以跟大神合个影

这个那些大软件对LINUX支持极度差，都要WINE才行

请各位参会人员自带口罩

# LinuxCon 今年夏天将首次在华举办

>
> 领袖级的开源会议将于六月份在华亮相。
>
>
>

旧金山，1 月 17 日讯：致力于专业化开源协作的非盈利组织 <ruby> Linux 基金会 <rp>  （ </rp> <rt>  The Linux Foundation </rt> <rp>  ） </rp></ruby>今天宣布，其 [LinuxCon + ContainerCon + CloudOpen](http://events.linuxfoundation.org/events/linuxcon-containercon-cloudopen-china) （LC3）会议将首次来到中国，将于 2017 年 6 月 19 - 20 日，在北京的国家会议中心召开。

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

LinuxCon + ContainerCon + CloudOpen （LC3）其宗旨是让参会者可以彼此协作、共享和学习到最新、最有趣的开源技术，包括 Linux、容器、云技术、网络、微服务等等。该会议还将向你展示如何引领开源社区的发展运作。

* LinuxCon 汇聚了全世界 Linux 社区中的领袖级维护者、开发者和项目负责人，是为 Linux 生态发展寻求改进、教育和解决方案的会议。
* ContainerCon 是一个学习如何发挥容器技术优势的大会，这种革命性的技术，从自动化、部署和负载扩展，从硬件虚拟化、存储到软件定义网络，容器推动了云技术的发展。
* CloudOpen 召集了顶级的专家来讨论云平台、自动化管理工具、DevOps、虚拟化、软件定义网络、存储和文件系统、大数据工具和平台、开源最佳实践等等方面的主题。

LC3 覆盖了许多开源领域最热门的话题，包括开放网络、区块链、合规性问题和开源的商业化和专业化等等。

参会者一次注册即可参加这三场会议。活动包括了超过 70 场次的教育课程、行业领袖演讲，以及展览与网络、黑客马拉松、社交活动等展厅场所。

“中国的开发者和企业积极拥抱开源，在各种广泛的项目中贡献了大量代码，”Linux 基金会执行董事 Jim Zemlin 说到，“我们听到了要求把更多的开源活动带到中国的呼声，在中国成功举办了 Linux 基金会的其它活动之后，比如 MesosCon Asia 和 Cloud Foundry Summit Asia，我们决定在中国召开我们旗舰级的峰会 LinuxCon、ContainerCon 和 CloudOpen。这些活动将有助于我们传播开源、提升与全世界的开源专家之间的协作和分享。”

演讲申请将于 3 月 18 日开始[接受申请](http://events.linuxfoundation.org/events/linuxcon-containercon-cloudopen-china/program/cfp)，参会报名会在未来几周开始。

希望出席的新闻界人士可以联络 Dan Brown （[dbrown@linuxfoundation.org](mailto:dbrown@linuxfoundation.org)）。

非常感谢本次会议的战略级赞助商华为和钻石级赞助商 Intel。


moz://a 终于选定了新 Logo

Summary: 经过七个月的艰难历程，著名的火狐浏览器FireFox背后的厂家 Mozilla 终于选定了新 Logo。

好看？？？

想多了吧

看了关于当年Netscape、Mozilla的纪录片code rush感觉当年那帮大牛好酷，而现在换个logo也搞这么多名堂~！Chrome大法好！

Mozilla 的影响力跟巅峰时期相比或许要衰弱很多，但是不变的是 Mozilla 的信仰：

"Mozilla 是一个全球社区，致力于让互联网保持开放、公开且人人可用"。

而这是诸如 Chrome/Edge/safri 之类从未承诺过的。

火狐越来越流畅了，支持

没错，其实这篇的精髓是这个啊！

是挺好看的，挺有内涵的，纯文字更有代码风格

说实话，我不知道和普通大英文字体有什么不同

好象都一样

原谅我见识太少~

(A.R.Sans:) whoops, looks like "moz://a" this logo is pretty good!

# moz://a 终于选定了新 Logo

经过七个月的漫长历程，著名的<ruby> 火狐浏览器 <rt>  FireFox </rt></ruby>背后的厂家 Mozilla 终于选定了新 Logo。这次评选始于去年六月的 Mozilla 品牌重建活动，在八月份时已经[圈定了七种设计](/article-7703-1.html)，然后经过了上千封电子邮件、近百场会议、讨论了十几种理念，又经过了三轮研究之后，终于——[选定了最初就被大家看好 Logo 设计](https://blog.mozilla.org/opendesign/arrival/)：

*moz://a*

**这个项目的核心是 Mozilla 需要让其目标与品牌更好地被更多人了解。Mozilla 希望引领一个健康的互联网，可以自由探索、发现和创新，而没有任何障碍和限制；让权力掌握在更多人手中，而不是少数人手里；让互联网成为一个安全、隐私和身份得到保护的地方。**

[Mozilla 称](https://blog.mozilla.org/opendesign/arrival/)：

>
> 今天，我们相信，这些准则比以往更加重要。作为一个非盈利组织，我们正在产品构建、技术和程序方面为建设一个不断增长的、健康的互联网而努力。
>
>
> 我们的品牌标识，包括 Logo、声音和设计，都是传递我们的理念和我们当前任务的重要信号。我们致力于确保互联网成为一个健康的全球公共资源，公开而自由，所以我们以互联网语言设计了我们的品牌标识。
>
>
>

Mozilla 的新 Logo，采用 URL 范式，这代表了 Mozilla 的核心是 Internet，致力于达成“链接”的本意：无过滤、无中介地感受 Internet 丰富的内容。

新的 Logo 十分巧妙地将 “mozilla” 这个单词中的 “ill” 变形为 URL 的资源定位符号“://”， 这个 Logo 的设计得到了互联网上的广泛赞誉。

顺便提一句，这个 Logo 的字体叫做 Zilla ，是由 Mozilla 的长期合作伙伴 Typotheque 专门设计的，这个字体是自由开放的。


2016 年编程语言发展趋势

编程语言其实有点像linux 各种各样的发行版，其本质并没有质的改变。

学好C语言是基础

看了一天elm,感觉还可以。Task文档不全，还有点模糊。想玩函数式编程，可以看下erlang

有质的改变不如重新造轮子

# 2016 年编程语言发展趋势

>
> 回顾年度最热门的 AI 项目和容器的编程语言、新出现的编程语言，和更多编程趋势。
>
>
>

技术在不断前进 - 可能不总是向前，但总是在变动。但即使对于那些关注发展趋势及其对程序员的影响的人来说，确切地了解技术的方向也是一个挑战。我们总是在每年秋季才能够清晰地看出当年开源编程趋势，那时我与我的同事，Kelsey Hightower 和 Scott Hanselman，以及我们非常棒的编程委员会，正在筹备来年的 [OSCON](http://conferences.oreilly.com/oscon/oscon-tx)（O'Reilly 开源大会）。我们获得的建议和对特定主题的关注数量是反映开源世界热门趋势的良好指标。以下是我们在 2016 年看到的顶级编程趋势的概述。

### 编程语言驱动 AI

走出 20 世纪 90 年代的人工智能冬季，人工智能随着它所依赖的计算能力的提升再次出现，它影响着我们如何构建软件。机器学习、深度学习、自然语言处理和自动语音识别覆盖了世界各地 - 从 GitHub 的项目和工作岗位，到新公司成立背后的原因，以及清除我们杂乱的台面（Hey, Alexa!）。（LCTT 译注：Alexa 是预装在亚马逊 Echo 内的个人虚拟助手，可以接收及响应语音命令，可被看成是亚马逊版的 Siri 语音助手。用户只需要说一声“Alexa”，就可以创建各种任务，还可以和各种智能家居设备进行交互。） 是的，即使像 OSCON 这样的会议都处处提及 <ruby> “万物皆智能” <rt>  all things AI </rt></ruby> 。虽然计算能力的提升已经铺平了道路，所有关于 all things AI 的开源已经引起了行业广泛开放的创新和竞争。谷歌的 [TensorFlow](https://www.tensorflow.org/)、[OpenAI](https://openai.com/blog/) 和 [Apache Spark](http://spark.apache.org/) 使用强大框架成为行业领导者，但也有较小的参与者，如 [Nervana](https://www.nervanasys.com/) 的 [Neon](https://github.com/NervanaSystems/neon) 和 [Theano](https://github.com/benanne/nervana_theano)。

AI 的兴起已经影响到了软件开发者的前景？没错，现在是了解 Python 的好时机 - 它给数据工程师和科学家带来的敏捷性和流行性使它成为最流行的 AI 编程语言，其次是 R、Java 和 Scala。

### 容器和 Go 的结合就像花生、黄油和果冻

（花生、黄油和果冻 —— LCTT译注：最佳组合）

[Go 1.0 发布](https://blog.golang.org/go-version-1-is-released)于 2012 年 3 月。紧接着 [Docker](https://opensource.com/resources/what-docker) 在一年后发布，[Kubernetes](https://opensource.com/resources/what-is-kubernetes) 在另外一年后发布。总之，Go 并不是如我们所知的那样专为基础设施的未来而设计的，但 Go 似乎是为了填充编程世界的一个主要的空洞而出现。对于一个高度联网的世界、一个必须拥有一流并发性的世界而言，Go 是以 Java 或 C++ 永远不会有的方式专门设计的。如果你在做运维或者类似的事，你应该至少稍微了解下 Go ，因为它正在发展中，它将会被使用多年，并成为许多程序的骨干。

### Swift 超越了 Apple 的生态系统

Swift 是 [Apple 在 2015 年启动该编程语言不久之后就开源的](/article-6689-1.html)。Swift 已经成为 iOS 和 Mac OS X 开发人员的热门话题。这种语言很容易理解，因此很快流行起来，并且它比它要取代的语言 - Objective-C 和 C++ 赢得了一个[更安全的声誉](http://www.infoworld.com/article/2920333/mobile-development/swift-vs-objective-c-10-reasons-the-future-favors-swift.html)。在 [JavaScript 框架](https://opensource.com/article/16/11/15-javascript-frameworks-libraries)和其他新语言的世界中，Swift 是否成功仍有待观察，但如果它能继续获得苹果忠实用户的欢迎，Swift 将有机会成为伟大的网络世界中最有望成功的竞争者和超越者。

### Java 8 vs 使用 JVM 的函数式语言

Java 8 的函数式能力（即引入 Lambdas ）的出现使得 JVM 语言（如 Scala 和 Clojure）得到了关注。最近，很大程度上由于 Apache Spark 的增长使得 Scala 有一点小爆发。现在，因为新、老开发人员都在积极关注 Java 8 所带来的东西，至少目前，Scala 和 Clojure 似乎被搁置了。Java 现在能够解决并发和大数据相关的事，而那些专门为满足此方面要求而构建的其他编程语言已经做了多年。在 2017 年，OSCON 几乎没有 Scala 和 Clojure 的提案，不是因为我们这样计划的，而是那些提交提案的发言者似乎没有什么兴趣。

### 新兴语言

和往常一样，世上总是在不停出现新兴语言，目的是比之前的语言做得更好，可以响应从前的语言出现时没有的需求，或者开始只是疯狂思想，最终却改变了我们对编程的看法。今年有五种语言即将进入大时代：Rust、Elixir、Elm、Kotlin 和 Perl 6。

这 5 个热门会给行业带来什么？

* [Rust](https://www.rust-lang.org/en-US/)：兼顾速度和一定安全的系统编程语言。
* [Elixir](http://elixir-lang.org/)：函数式、动态和容错，适用于那些规模越来越大的应用程序。
* [Elm](http://elm-lang.org/)：更多函数式的乐趣，使用 JavaScript，学习成为一种乐趣。
* [Kotlin](https://kotlinlang.org/)：这一个是为使用 Java 和 JVM 的人设计的语言 - 静态类型、安全，此外我提到 Java 兼容了吗？
* [Perl 6](https://perl6.org/)：它还活着！Perl 6 碰巧是一种新的语言，它胜在富有表现力和功能丰富。

时间会告诉他们是否会如约发布。尝试他们，为他们贡献，成为未来的一部分！

---

作者简介：

Rachel Roumeliotis - O'Reilly Media，Inc. 的战略内容总监，领导了一个编辑团队，其涵盖各种各样的编程主题，从全栈 web 开发到企业中的开源到新兴的编程语言。她是 OSCON（O'Reilly 软件架构会议）和 Fluent 的编程主席。 她从事技术出版工作超过 10 年，出版了许多领域的内容，包括移动编程、UX、计算机安全。

---

via: <https://opensource.com/article/16/12/yearbook-top-programming-trends-2016>

作者：[Rachel Roumeliotis](https://opensource.com/users/rroumeliotis) 译者：[geekpi](https://github.com/geekpi) 校对：[jasminepeng](https://github.com/jasminepeng)

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


Linux 4.9 内核终被“扶正”，落实说好的 LTS 待遇

Summary: Linux 内核维护者 Greg Kroah-Hartman 19 日在他的 Google+ 上确认，Linux 4.9 分支现在是“长期”的了，也就是我们说的 LTS （长期支持）。

很公司还是在用2.6内核

那是因为服务器还是RHEL6 的天下

2.6神一般长度的支持周期

其实不是这样，2.6 之后的版本号规则变了。

# Linux 4.9 内核终被“扶正”，落实说好的 LTS 待遇

Linux 内核维护者 Greg Kroah-Hartman 19 日在[他的 Google+ 上](https://plus.google.com/+gregkroahhartman/posts/dBWUjQipE72)确认，Linux 4.9 分支现在是“长期”的了，也就是我们说的 LTS （长期支持）。

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

去年 12 月 11 日时， Linus Torvalds [正式宣布 Linux 4.9 内核发布](/article-8031-1.html)，而 Linux 4.9 内核的是否成为 LTS 的故事则发生在这之前。

其时，2016 年 8 月 12 日，著名的 Linux 内核维护者 Greg Kroah-Hartman 在他的 Google+ 上说，“4.9 == next LTS kernel.”，然而很快，在媒体开始纷纷报道 Linux 4.9 内核就是下一个长期支持内核时，Kroah-Hartman 反悔了，在一个月之后， 9 月 6 日，他说他要保留把 Linux 4.9 内核标为长期支持的权力。

“我保留不选择 4.9 支持两年的权力，如果你感觉不舒服，那是人们滥用了这个通知。如果这样做的话，我可能会返回 4.8 系列，或者等待 4.10 发布。到了那个时候，我会发布在 kernel.org 上，让大家知道的。”他在自己的博客的[后继文章](http://kroah.com/log/blog/2016/09/06/4-dot-9-equals-equals-next-lts-kernel/)上说到。

### Linux 4.9 内核将支持两年，直到 2019 年 1 月

时间转到今天，在 Linux 4.9 内核都已经发布了 4 个小版本之后，Greg Kroah-Hartman 终于宣布他准备将 Linux 4.9 标为“长期”：

>
> 是的，4.9 就是下一个长期内核。我已经说过了，但是不知道怎么回事，如果不在 kernel.org 上，就没人信我。
>
>
>

当然，这对于 GNU/Linux 用户来说是个大新闻，因为 Linux 4.9 内核增加了几个令人兴奋的新特性，特别是初步支持了从老式 GNC 1.0 / Southern Islands 系列到开源 AMDGPU 图形驱动的 AMD Radeon GPU，这其中包括了 AMD Radeon HD 7xxx 和 8xxx 系列。

据 Greg Kroah-Hartman，Linux 4.9 内核的支持期将到 2019 年 1 月，也就是从此时算起的两年。因此，建议各个 Linux 发行版都采用这个分支，特别是采用了这个月结束支持的 Linux 4.8 内核的发行版。


50 种系统免遭黑客侵袭的方法 [2017 年版]

Summary: 当我还是小孩子，耳畔萦绕着 Paul Simon 的流行歌“与爱人分手的 50 法”。当我渐渐地长大，突然受歌的启发，收集了 50 种方法，免得你——门内汉和门外汉——遭受黑客侵袭啊

不要上黄网

我们说1024时，它是一个进率<br />
而你却把它说成是 黄网……

# 50 种系统免遭黑客侵袭的方法 [2017 年版]

>
> Paul Simon 概括了“与爱人分手的 50 法”，而这里，我们提供了提高系统安全性的 50 种方法。
>
>
>

当我还是小孩子，耳畔萦绕着 Paul Simon 的流行歌“[与爱人分手的 50 法](https://www.youtube.com/watch?v=0H5chfbcWtY)”。当我渐渐地长大，突然受歌的启发，收集了 50 种方法，免得你——门内汉和门外汉——遭受黑客侵袭啊：

### “你刚刚从后头溜出去了，杰克”

1、 备份你的数据。如果你不幸被勒索软件光顾，那么你就不用支付赎金，因为你做了备份。

2、 当你需要在公共场所为你的手机充电，那就使用 [sysncstop](http://syncstop.com/)吧，或者你也可以用你的备份电池。（LCTT 译注：sysncstop 是一种可以在公共场所安全充电的 USB 设备。在公共场所充电的风险，你知道的。）

3、 利用好你的审计系统，里头有好多很酷的工具可以帮助你监控系统。如果你确实遭到了入侵，那么审计系统也许就可以告诉你发生了什么，以及攻击者做了些什么。

4、 说到日志，把日志定向到集中式服务器上总是一个不错的想法，因为如果某个黑客侵入你的系统里，他首先要攻击的就是日志系统以便隐藏他的踪迹。构建一个好的入侵检测系统来监控日志，这对于防范黑客也很有帮助。

### “做份新的计划吧，斯坦”

5、 以强制模式运行 SELinux（见 [StopDisablingSelinux.com](http://stopdisablingselinux.com/)）。不要觉得我现在还在喋喋不休地说这个可笑。SELinux 可以防止 0day 漏洞的影响。当[破壳](http://danwalsh.livejournal.com/71122.html)漏洞出现的时候，SELinux 曾是唯一的防护手段。

6、 如果可能，在 [SELinux 沙盒](http://danwalsh.livejournal.com/31146.html)中运行应用程序吧——在容器火遍全球前，它就已经是容器了。同时，请关注 [Flatpack](http://flatpak.org/) 开发，这个工具很快会开发沙盒功能。

7、 不要安装或者使用 Flash。Firefox 不再支持它了，同时也希望大多数 web 服务器正在远离它。

8、 使用[受约束的 SELinux 用户](http://danwalsh.livejournal.com/37404.html)来控制用户在你的系统中所能做的事。如果你正运行着一台共享登录的系统，设置用户为 `guest_t`。

### “你不必害羞，罗伊”

9、 利用 [systemd 工具的能力](http://0pointer.de/blog/projects/security.html)来帮助你提升系统安全。大多数系统攻击是通过那些监听着网络的服务来实现的，而 Systemd 提供了一些很棒的方法来锁定服务。例如，使用 [PrivateTmp=yes](http://danwalsh.livejournal.com/51459.html) 。Privatemp 利用挂载命名空间来为服务器的 `/tmp` 设置一个私有的 **tmpfs** 挂载，这可以阻止被入侵的服务访问到主机 `/tmp` 中的内容，以及针对系统中基于监听 `/tmp` 的服务的潜在攻击。

10、 `InaccessibleDirectories=/home` 是一个 systemd 单元的选项，它使用挂载命名空间的方式使从服务的角度看不到 `/home` 目录（或者其它任何目录），这会使得被入侵的服务攻击到数据更为困难。

11、 `ReadOnlyDirectories=/var` 是另外一个 systemd 单元的选项，它使用挂载命名空间的方式来将目录内容变成只读模式。基本上你总是可以让 `/usr` 运行在**只读模式**。这可以阻止一个被入侵的应用程序重写二进制文件，因为那可以在下次服务重启时，该服务依旧是被入侵的。

12、 降低服务权限（`CapabilityBoundingSet=CAP_CHOWN CAP_KILL`）。在内核中，特权服务被分解成一些列不同的权限。大多数服务不需要很多权限（如果需要一些的话），而 systemd 提供了一个简单的开关来从服务中剥离这些权限。

13、 如果服务不使用网络，那么你可以使用 `PrivateNetwork=yes` 来为该服务关闭网络功能。只需在服务的单元文件中开启该选项，就可以享受它带来的好处，关闭服务所有可用的网络。黑客常常并不是真的想破坏你的机器——他只是想用它作为攻击服务器来攻击其它机器。如果服务连不上网络，那么就不会受到攻击。

14、 控制服务可用的设备。 Systemd 提供了 `DeviceAllow` 配置，它控制了该服务可用的设备。`DeviceAllow=/dev/null rw` 将访问限制为 `/dev/null`，且仅可访问该设备节点，不允许对其它任何设备节点的访问。该功能实现于设备的 cgroup 控制器顶端。

15、 Systemd 系统即将迎来的一个新功能是 [`ProtectSystem Strict`](https://www.phoronix.com/scan.php?page=news_item&px=systemd-New-Protect-Tunables)，该功能可以开启所有这些命名空间以完全锁定服务运行的环境。

### “刚刚重获自由”

16、 不要使用没有运行着 SELinux（[SEAndroid](https://source.android.com/security/selinux/)）强制模式的手机。幸运的是，我听说目前超过 90% 的安卓手机都运行着 SEAndroid 的强制模式，这真让我高兴。现在要是我们能让那些果粉们使用 SELinux 就好了。

17、 只从受信源安装软件。不要安装你从因特网找来的危险东西，对于你的手机、计算机系统、虚拟机以及容器等等也一样。

18、 我不会在我的手机上进行网上银行操作——我只在我的 Linux 计算机上做这事儿。如果黑客偷了我的信用卡，也许我就丢了那么 50 美元；而如果他黑进我的银行账户，那我丢的钱就会更多。我想我是个老古板。（“滚出我的地盘。”——那些老古板都会这样说。）

19、 我用我手机做的一件很酷的事情，就是设置让我的信用卡公司每次在我的信用卡消费时给我发送短信。那样的话，如果账号被盗，我会更快地知道。

20、 当你需要安全地通讯，请使用 [Signal 安全信息应用](https://whispersystems.org/)。

### “搭个便车，格斯”

21、 在你的计算机系统上运行 Linux。当我第一次想用计算机联络我的父亲时，在他的计算机中毒前，我很少回家。我回去给他的系统安了个 Linux，而他从那以后就一直运行着它。我相信 Linux 大体上说是一个更加安全的系统，因为它的设计方式。而且我也相信这个桌面被黑的可能性也相对较小，因为用它的人相对较少。有些人或许要持反对意见了，他们会说 Windows 在过去几年中已经有了很大的改进了，但对于我而言，我仍然坚持己见。

22、 只运行那些有[安全响应团队](https://access.redhat.com/blogs/766093/posts/2695561)进行安全监管的发行版。企业软件及其重要。

23、 运行一个企业级内核。在容器中，单点故障往往是内核。如果你想要保证它安全，那么就使用一个企业级内核，即便它不是一个最新的版本，但也包含了最新的安全补丁。记住，最新的内核虽然带来了最新的安全补丁，但是它也带来了大量的新代码，这些代码可能存在漏洞。

### “你不要说太多”

24、 大多数非法入侵都是通过社会工程学实施的——例如，电子邮件链接、web 浏览器攻击，以及电话。对于此，最好的选择是接受相关教育，并且对一切留个心眼儿。没有哪个来自尼日利亚的家伙会给你钱，国税局也不会打电话到你家问你要钱。如果你电子邮件收到了来自你银行的电子邮件，里面包含有到某个网站的链接，那么不要直接去点击那个链接，在 web 浏览器中输入那个地址来打开。

25、 总是把你的系统打上最新的安全补丁。已知有安全漏洞以及过时的系统的数量十分可怕，脚本小子们依赖于你**不**更新系统。

26、 当连接到网络上的服务时，请始终使用 HTTPS。Chrome 和 Firefox 现在有个强制开启 HTTPS 的模式。到 2016 年为止，那些还不支持安全通讯的网站可能就不值得你们访问。

27、 在你的容器中使用 [seccomp](https://lwn.net/Articles/656307/)，这会将攻击限制在内核之外，内核是个单点故障。限制什么进程可以具体讨论。

### “就把那钥匙丢下吧，李”

28、 使用 [YubiKey](https://www.yubico.com/) 来存储私钥。

29、 加密你系统上的数据。至少对于笔记本而言，应该把**家目录**以及你的其它数据目录加密。几年前，我正乘坐在伦敦的地铁上，我的笔记本就成了某些人的目标——我下了车，车门关上了，而我发现我的笔记本不见了。此时，地铁已经驶出了站台。幸运的是，我把磁盘加密了。

30、 给你的所有网站用上 [Let's Encrypt](https://letsencrypt.org/) 吧，没有任何理由不再运行 HTTPS 了。

31、 绝不要在不同 web 服务器上使用相同的密码。虽然这个很难不落入陷阱，但是像 [Let's Encrypt](https://letsencrypt.org/) 这样的工具会有很大帮助。如果你使用 ssh 密钥来登录进系统，这会更好。

32、 使用双因素认证（2FA）。密码变得无关紧要，使用 Yubikey 以及诸如此类的工具可以使得双因素认证很方便，我们都有手机。在大脑中记一个密码，并在手机中生成一个密钥，总是比一个密码来得更好。

33、 网站总要我注册个帐号，没有比这更激怒我的事情了——我们就不能做得更好点？对于网站密码，始终都要使用密码生成工具来生成。我是个保守派：我使用 [Password Safe](https://pwsafe.org/) 来生成密码，然后剪切粘贴到 web 浏览器中。我听说，其他人使用 [LastPass](https://www.lastpass.com/)，或者其它整合在手机和 web 服务中的工具也用着不错。

34、 配置像 [FreeIPA](https://www.freeipa.org/page/Main_Page) 之类的服务用于身份认证。使用像 [Kerberos](https://web.mit.edu/kerberos/) 之类的工具来认证和授权，会使得跟踪雇员及其对系统的访问更为简便（而且它也有很酷的加密服务）。使用活动目录也很不错，或许我有点偏颇。

35、 如果你经常输入密码，那就使用一个容易记忆的句子，而不是一个单词。我所偏好的用于记忆密码的方式，就是使用有几个单词并且易于输入的词组。

### “让自己自由”

36、 使用 [USBGuard](https://github.com/dkopecek/usbguard) 来保护你的系统免遭流氓 USB 设备破坏。

37、 在过去几年中，我一直工作于容器方面，让我们来说说容器的安全吧。首先，让它们在开启强制模式的 SELinux 的系统中运行。如果你的系统不支持 SELinux，那就换个支持它的版本吧。SELinux 是使用文件系统来保护容器免遭破坏的最佳工具。

38、 如果可能，在容器中跑你的服务吧。我相信，使用 [OCI 镜像格式](https://www.opencontainers.org/) 和 Linux 容器技术是应用的未来。用 [runC](https://runc.io/)、OCID、RKT、Systemd-nspawn 等等来启动这些容器。虽然我常常说“容器并不包容“，但是不要在容器外面运行这些服务更好一些。

39、 在虚拟机中运行容器。虚拟机提供比容器更好的隔离机制，在虚拟机中跑像容器之类的东西，更加灵活有弹性，并且互相隔离。

40、 在不同的虚拟机中，按不同的安全需求跑容器应用。你可以在 DMZ 中的虚拟机上跑 web 服务容器，而在 DMZ 外的虚拟机上跑数据容器。

41、 同时，记得在不同的物理机上跑需要最高安全性的虚拟机，并且容器放在不同虚拟机上（这也叫深度防护）（LCTT 译注：此处原文有误，根据理解修改）。

42、 以[只读模式](http://www.projectatomic.io/blog/2015/12/making-docker-images-write-only-in-production/)跑容器。开发环境中的容器需要能够写入到 `/usr`，但是生产环境中的容器只能写入到 `tmpfs`，并且将卷挂载到容器中。

43、 [降低容器权限](http://rhelblog.redhat.com/2016/10/17/secure-your-containers-with-this-one-weird-trick/)。不管是在容器中，还是在容器外，我们都以比它们所需的更多的“权限”跑它们的进程，你可以通过降低权限来让你的进程更加安全。

44、 [不要以 root 身份在容器中跑进程](https://www.projectatomic.io/blog/2016/01/how-to-run-a-more-secure-non-root-user-container/)。大多数服务都不需要 root 特权，或者它们需要该权限来绑定到低于 1024 的端口，然后切换到非 root 用户。我建议你始终以非 root 身份来跑应用。

45、 给你的容器打上最新的 CVE 补丁。使用像 OpenShift 这样的工具来构建并维护你的容器镜像是个不错的主意，因为它会在新的安全补丁出现时自动重构容器镜像。

46、 我的一个同事说 “Docker 就是用来在你的主机上以 root 身份运行来自因特网的随机代码的。”从一个受信源获取软件，不要抓取你在 docker.io 上随便找到的第一个 Apache 应用。[操作系统有重要关系](https://opensource.com/16/12/yearbook-why-operating-system-matters)。

47、 在一台受限的容器化优化的主机上跑生产环境容器，例如在一台[原子主机](https://access.redhat.com/articles/rhel-atomic-getting-started)上，它开启了所有安全特性，为运行中的容器而优化，带有限制攻击层和原子级更新。有什么不喜欢的吗？

48、 使用像 [OpenScap](https://www.open-scap.org/) 这样的工具来扫描你系统的漏洞。糟糕的是，新的漏洞总是层出不穷，所以你得时刻更新你的扫描器。（也可以看看 [原子扫描](https://developers.redhat.com/blog/2016/05/02/introducing-atomic-scan-container-vulnerability-detection/)，用于扫描你的容器。）

49、 OpenScap 也具有扫描[安全配置](https://www.open-scap.org/security-policies/scap-security-guide/)的功能，如 STIG（安全技术部署指南）。

50、 为你孩子收到的所有那些圣诞物联网设备设置一个特别的客户网络。我钟爱我的 Amazon Echo，还有自动化灯以及电源开关（“Alexa，打开圣诞灯“），但是所有这些都是由可能存在安全问题的 Linux 操作系统控制。

### “一定还有着另外 50 种免遭黑客侵害的方法”

你会为这个列表添加点什么呢？在下面的评论中告诉我们吧。

*Josh Bressers 对本文作出贡献。*

---

作者简介：

Daniel J Walsh - Daniel Walsh 已经致力于计算机安全领域将近 30 年。Dan 在 2001 年 8 月份加入 Red Hat。

---

via: <https://opensource.com/article/17/1/yearbook-50-ways-avoid-getting-hacked>

作者：[Daniel J Walsh](https://opensource.com/users/rhatdan) 译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

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


Summary: 更多：Unity 8 将不再支持 Scope；Intel Haswell GPU 现在 Ubuntu 上支持 OpenGL 4.5；Fedora 26 Linux 可能发布 LXQt Flavor

# 一周开源新闻：Canonical 2017 将发布 Mir 1.0，并实施 Vulkan 支持计划

### Canonical: 2017 将发布 Mir 1.0，并实施 Vulkan 支持计划

Canonical 最近为他们的 Mir 显示服务器技术发布了“年度回顾”。

大多数人可能知道，Canonical 在 Ubuntu 上开发自己的显示服务器， 称为 Mir，在某些方面类似 X.Org 服务器和 Wayland 技术。

虽然 Ubuntu 桌面仍使用 X.Org 服务器组件，Mir 目前在 Unity 8 上紧锣密鼓的测试中，Canonical 计划在 Ubuntu Linux 桌面未来版本中作为缺省实施。

但是直到现在，Mir 只是在移动设备上成功部署，支持 Ubuntu Touch mobile 系统，用于各种官方和非官方的 Ubuntu 电话和平板。

据 [Alan Griffiths](http://insights.ubuntu.com/2017/01/17/mir-2016-end-of-year-review/)（ Canonical 的软件工程师）讲，对 Mir 来说2016 是成果丰硕的一年，2017 年公司计划发布该显示服务器的里程碑的 1.0 版本，它将实施人们期待已久的 Vulkan 支持。

目前，公司没有透露 Mir 1.0 发布的具体日期，我们猜测应在 [Ubuntu 17.04 (Zesty Zapus)](http://news.softpedia.com/news/ubuntu-17-04-skips-first-alpha-for-opt-in-flavors-gcc-6-3-0-hits-the-repository-511456.shtml) 发布前后，也就是 4 月中旬。

### Canonical 将从 Ubuntu 中移除旧的 Unity 7 Scopes ，Unity 8 将不再支持它们

Canonical的 Will Cooke 最近[告知](https://lists.ubuntu.com/archives/ubuntu-desktop/2017-January/004845.html)，公司计划从 Ubuntu Linux 中移除一些老的，不再维护的 Unity 7 Scopes，因为它们可能会威胁到整个操作系统的安全。

今年 4 月将发布 Ubuntu 17.04（Zesty Zapus）系统，这也是 Unity 用户界面使用的第五年，它是在 Ubuntu 11.04 (Natty Narwhal) 版本中第一次引入的。

Canonical 的工程师们目前集中精力在下一代 Unity 8 用户界面上，当前 Ubuntu Linux 发布版仍[使用 Unity 7](http://news.softpedia.com/news/canonical-will-soon-make-it-easier-to-enable-unity-7-low-graphics-mode-in-ubuntu-511760.shtml)，Ubuntu 17.04 也是。

不过，看起来 Ubuntu 仓库中仍包含一些老的，不再维护的 Scopes，它们有一些安全问题，如果安装或使用的话会给整个系统带来安全隐患。很多与一些流行的音乐播放 app 相关，包括 unity-scope-audacious， unity-scope-clementine，unity-scope-gmusicbrowser，unity-scope-guayadeque，unity-scope-musique，unity-scope-gourmet 等等。

因此，Canonical 计划将它们从官方仓库中移除，如果它们的维护者不再跟进那些安全问题并提供补丁的话，而且 Unity 8 也不再支持它们。

如果您之前提交过 Unity 7 Scope ，而且不再提供安全修复，请尽快将其从仓库中移除，Unity 7 还将存在一些年，但应尽可能的安全。

### 忘记 OpenGL 4.2 吧，Intel Haswell GPU 现在 Ubuntu 上支持 OpenGL 4.5

玩家可以通过 Padoka 或 Oibaf PPA 更新到 Mesa 17-git。

最近，Paulo Miguel Dias 更新了 Ubuntu 16.04 LTS 和 Ubuntu 16.10 系统上他的 Padoka PPA (Personal Package Archive) 到最新的 Mesa 17.0.0-git，从而实现 Intel Haswell GPUs 对 OpenGL 4.5 支持。

由于 Intel 的高级图形软件工程师 Kenneth Graunke 为开源 Intel i965 图形驱动器[发布](https://lists.freedesktop.org/archives/mesa-dev/2017-January/140908.html)了一个新的补丁， 在 Intel Haswell GPUs 上可启用 OpenGL 4.5，而且，它很快在 Mesa Git 上出现，你可以在 Ubuntu 上使用它了。

怎么用呢？ 很简单，安装 [Padoka](https://launchpad.net/%7Epaulo-miguel-dias/+archive/ubuntu/mesa) 或 [Oibaf](https://launchpad.net/%7Eoibaf/+archive/ubuntu/graphics-drivers/) PPA，它们在 Ubuntu 游戏社区很有名，为 Intel, AMD Radeon, and Nvidia GPUs 提供最新的开源图形驱动。这些 PPA 为最新 Mesa 17.0.0-git 3D 图形库提供频繁更新。

### Fedora 26 Linux 可能发布 LXQt Flavor，不会代替 LXDE Spin

即将于 2017 年 6 月 6 日到来的 Fedora 26 版本有了一点[变化](https://fedoraproject.org/wiki/Changes/LXQt_Spin)，也就是一个围绕轻型的，基于 Qt 的 LXQT 桌面环境而构建的新的 flavor。

红帽子的 Fedora 开发经理 Jan Kurik 在 Fedora 的[邮件列表](https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/E2Z7365TH64DZCPM7VYE66VCYVJPV26F/)中公布的此消息，告知社区 Fedora 项目在考虑向已经很庞大的 Fedora Spins 家族添加新成员，Fedora LXQt Spin。

“ 鉴于 LXQt 已经完善多了，是时候为用户提供 spin 了。现已准备好提交一个正式 spin ，” Jan Kurik 说到，他是 Red Hat 的 平台 & Fedora 开发经理。

LXQt flavor 不会取代已有的 LXDE spin。

### Debian 发布 Debian GNU/Linux 9 "Stretch" Installer RC1 版

为即将发布的 Debian GNU/Linux 9 "Stretch" 操作系统相关的工作正在进行中，Debian 项目的 Cyril Brulebois 1 月 16 日[宣布](https://lists.debian.org/debian-devel-announce/2017/01/msg00004.html)，Debian Installer for Stretch 的 RC1 版已可用。

在 Debian Stretch Installer 的第八版和 Alpha 开发版发布后,已经进行了很多改进。

此 RC1 版本的显著变化包括 HTTPS 支持，GNU wget udebs，使用fonts-dejavu-udeb 为默认字体，为 Sinhalese 语言使用 fonts-noto-hinted-udeb 字体包，以及将 Linux 核心提高到 4.8 版本。

你可以在这里下载 [Debian Stretch Installer RC1 版](http://linux.softpedia.com/get/System/Installer-Setup/Debian-Installer-94459.shtml).


如何将 Linux 命令的输出赋值给变量

Summary: 有些时候，你可能想要将某个命令的输出内容存储在一个变量中，以待在后续操作中取出来使用。这对于 shell 脚本编程是特别有用的。

变量名='命令'

变量名='命令 [命令选项 ...] 参数1 参数2 ...'

这两行不是单引号，而是反引号`(数字1左边那个)。后面的例子中反引号都对了。

汗，没细看出来。。

# 如何将 Linux 命令的输出赋值给变量

运行一条命令时，它都会产生某种输出：要么是该命令的期望结果，或者是该命令执行细节的状态/错误消息。有些时候，你可能想要将某个命令的输出内容存储在一个变量中，以待在后续操作中取出来使用。

本文将介绍将 shell 命令赋值给变量的不同方法，这对于 shell 脚本编程是特别有用的。

可以使用如下形式的 shell 命令置换特性，将命令的输出存储到变量中：

```
变量名=$(命令)
变量名=$(命令 [命令选项 ...] 参数1 参数2 ...)
或者：
变量名=`命令`
变量名=`命令 [命令选项 ...] 参数1 参数2 ...`

```

以下是使用命令置换特性的示例：

本例，我们将 `who` (显示当前登录系统的用户) 的输出值存储到 `CURRENT_USERS` 变量中：

```
$ CURRENT_USERS=$(who)

```

然后，我们可以使用 [echo 命令](http://www.tecmint.com/echo-command-in-linux/) 显示一个句子并使用上述变量，如下：

```
$ echo -e "以下为登录到系统中的用户：\n\n $CURRENT_USERS"

```

上面的命令中：`-e` 标记表示解释所有的转义序列 (如 `\n` 为换行)。为节约时间和内存，通常在 [echo 命令](http://www.tecmint.com/echo-command-in-linux/) 中直接使用命令置换特性，如下：

```
$ echo -e "以下为登录到系统中的用户：\n\n $(who)"

```

*在 Linux 中显示当前登录系统的用户*

接下来，为了演示上面提到的第二种形式，我们以把当前工作目录下文件数存储到变量 `FILES` ，然后使用 **echo** 来输出，如下：

```
$ FILES=`sudo find . -type f -print | wc -l`
$ echo "当前目录有 $FILES 个文件。"

```

*显示目中包含文件的数量*

就是这些了。我们展示了将 shell 命令的输出赋值给变量的方法。你可以在下边的评论反馈区留下你的想法。

---

作者简介：

Aaron Kili 是一名 Linux 和 F.O.S.S 忠实拥护者、未来的 Linux 系统管理员、Web 开发者，目前是 TecMint 的原创作者，热衷于计算机并乐于知识分享。

 译者简介：

[GHLandy](http://GHLandy.com) —— <ruby> 欲得之，则为之奋斗。 <rp>  （ </rp> <rt>  If you want it, work for it. </rt> <rp>  ） </rp></ruby>

---

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

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


给 Linux 新手的最佳发行版

Summary: 这次，我将要花费一定时间来说明对于来自不同环境的用户哪种版本才是最适合的。

ubuntu全家……

Linux的精髓是命令行！

每次 写这种文章 都不推荐deepin？  如果是 linux.cn 受众是中国人的话 就应该好好的正式推荐下deepin吧！

不吹不黑   中国人入门 linux 就应该是deepin。

这是老外写的，翻译过来的。

曾经有人说，为什么你们翻译的文章都是介绍 Ubuntu 的。<br />
话说，你们在国内见过深度自己或网友写的推荐深度的文章么?

说明deepin的粉丝都不是真爱粉。哈哈，开个玩笑。

话说回来，他们的确应该不遗余力的推广和分享。酒香也怕巷子深嘛。

linux最大的好处就是各取所需，所以这种强推的宣传可以歇歇了，因为你们一不留神就有流向流氓软软件危险。

从winxp到linux

mint

ubuntu MATE

说实话 新人还是openSuse省心。

好歹也介绍一下opensuse<br />
吧！你敢说Ubuntu很稳定？

既然面对的是中国的用户，翻译者何不加上deepin呢？deepin也是开箱即用，而且本土化做得很好，新手也很容易上手啊！

深度怕是没有在国内普通用户群体（爱好者）里推广的心思，你可看到他们写过或发表过的推广、推荐深度 OS 的文章？除了每年一次内部自己圈子开的深度开发者及用户大会，还听说过任何线下线上活动？正经是做做 DistroWatch  打榜、招徕点国外的本地化志愿者还有点兴趣——大抵也是因为这可以算是成绩？

为什么？因为普通用户带不来收入，而政府采购才有钱。

不止深度，其它几家国内的 Linux/操作系统厂商也如此。

您这说的真是滑天下之大稽,现在上次他们老总都上知乎留言回答大家关于深度的看法,自己没看见不等于他们不重视.

知乎就是世界了？

你可以在搜索引擎搜索一下他们的员工或者爱好者写的任何关于深度 OS 的文章，看看多少，看看近年来有几篇，除了寥寥无几的新版本发布消息，有几篇特性介绍（哪怕是吹牛）？有几篇用户写的各种经验、问答、推荐？有几场和他们相关的线下活动、演讲？

就算我们这里发的深度的内容少， 你可以在国内其它开源和 Linux 站点看看有几篇？

有时间并且精力旺盛的新手应该弄弄LFS什么的，被虐个几十遍就什么都记住了-_-

需要有颗强大的心脏

这次，我将要花费一定时间来说明对于来自不同环境的用户哪种版本才是最适合的。

# 给 Linux 新手的最佳发行版

Jack Wallen 为来自不同环境的新手们挑选出了专门为他们设计的发行版。

一个很古老的问题，找到适合的 Linux 发行版比简单的指出哪种 Linux 版本受欢迎更重要。为什么这么说？

让我们设置一个情景：你有一位用户，很有可能，他过去大多数时候都是在 Windows 或者 Mac 系统上工作，他们想让你给他们一个选择的替代品。现在，你想要在很短的时间里直截了当的说明 Linux 系统的工作方式并突出它的强大性和灵活性。

但是，请记住，最重要的一个方面是他们必须能够 *get it*，即开箱即用。

这就是为什么我们经常需要花费时间来找出哪种版本是最适合新手的 —— 因为把新手们带入 Linux 系统是传播 Linux 并增加 Linux 用户的最好方式。

对于新手来说最好的版本是什么？这次，我将要花费一定时间来说明对于来自不同环境的用户哪种版本才是最适合的。此外，你也可以查看我在 [2017 最好的发行版](https://www.linux.com/news/learn/sysadmin/best-linux-distributions-2017)中列出的发行版。

### 从 Windows 7 到 Linux：ZorinOS

当 Windows 8 发布以后，有一个理由让如此多的用户依然坚持使用 Windows 7， 那就是熟悉度。用户们已经在相同的桌面环境上工作了十几年，他们不想转移到 Windows 8 这种更以触摸屏为主的平台上。所以，你会去选择哪种版本呢？你首先必须要考虑的是桌面环境。为什么？因为这是你能够立刻吸引上这些 Windows 7 用户的地方。对于这个任务，还有什么版本会比 [ZorinOS](https://zorinos.com/) 更好呢？

ZorinOS 就是专门作为 Windows 和 Mac 系统的替代品而设计的，所以它下了很大的功夫来模仿 Windows 和 Mac 桌面的外观和感觉。事实上，除了 ZorinOS 以外，你很难找到一个别的 Linux 版本，能够完美的从 Windows 7 转移到 Linux 系统上，同时保留 Linux 系统如此强大、灵活的平台。

除了桌面环境（图片 1）以外， 因为 ZorinOS 完全基于 Ubuntu 系统，所以在其“外表”下面， ZorinOS 和 Ubuntu 以同样的方式工作（所以基本不用去担心硬件不能够被检测到）。同时伴有已经就绪的软件，你便有了针对来自 Windows 7 用户的最完美的 Linux 版本。

*图片 1：类 Windows 7 的 ZorinOS 桌面，准备开始服务。*

请注意：然而， ZorinOS 有两个版本： Zorin Ultimate 和 Zorin Core 。 Zorin Core 是免费的，但它不包含几乎所有你能够在 Zorin Ultimate 中找到的软件。如果你想要一个适合于所有来自 Windows 7 用户的开箱即用的版本，那么我强烈推荐购买 [Zorin Ultimate](https://zorinos.com/download/#ultimate)（大约需要花费 20 美元）。当然，如果你不想花钱购买 Ultimate 版本，你也可以从 Core 版本包含的软件包管理工具中安装几乎所有你需要的东西。

### 从 Windows 8 到 Linux ： Ubuntu GNOME

让我们来看看 Windows 8， 它带来了一个以触摸屏为中心的环境，改变了用户与电脑互动的方式。老式的启动菜单、面板、系统托盘桌面已经被触摸屏环境界面所取代。如果你正在找一个能给 Linux 新手们带来不同体验的最好环境，同时功能也要是最好的，那么没有比 [Ubuntu GNOME](https://ubuntugnome.org/) 更合适的了。

Ubuntu GNOME 是 Ubuntu 和 GNOME（图 2）这两个世界之间最好的融合。用一个现代、优雅、简洁并且用户友好的桌面代替了 Unity 界面， 因此 Ubuntu GNOME 不会给任何来自 Windows 8 的用户造成太多的麻烦。该版本不仅基于最新的长期支持版的 Ubuntu 发行版（支持期会很长），同时使用了 GNOME 桌面的最新稳定版本 － 这意味着用户将能够享受到难以置信的稳定体验。

*图片 2 ：在 Ubuntu GNOME 中可以发现，在优雅而又简洁。*

### 从 Mac 到 Linux ： Elementary OS

毫无疑问，这一场的绝对赢家是 [Elementary OS](https://elementary.io/)。尽管 Elementary OS 在外观和感觉上所达到的效果和 OS X 桌面非常相似，但实际还有更多优秀的地方。 Elementary OS 同样是基于 Linux 系统的，只不过是它采取了很多 Mac X 桌面的设计元素。

任何的 Mac 用户使用 Elementary OS 的桌面环境（图片 3）都会感觉就像是“在家一样”（使用 Mac 一样）。伴有如此熟悉的文档，同时包含一个熟悉的应用菜单， Elementary OS 总是位于我的‘最佳发行版列表’的顶部。如果我们正在和 Mac 用户讨论迁移，那么没有比 Elementary OS 更好的 Mac 替代品了。

*图片 3 ：Elementary OS 桌面的荣耀。*

有一件事情 Mac 用户们将会非常感激，那就是 Elementary OS 的开发者们很好的保持了桌面的一致性。从 dock， 到面板、菜单、到包括的应用，你找不到任何一个看起来或感觉没有归属感的单一元素。

我将在这儿说一个关于 Elementary OS 的预警。你需要安装一个好的浏览器（因为它自带安装的 Epiphany-a 浏览器没有得到许多常用站点的支持），同时，你需要从官方的 [LibreOffice 网站](http://www.libreoffice.org/download/libreoffice-fresh/)下载安装包来安装 LibreOffice （因为在 Elementary OS 的软件中心找到的安装包已经有些过时了）。

### 从 Android 到 Linux：Ubuntu

这似乎有点像是一个延伸话题，但考虑到 Android 在全球市场中占主导地位，所以你可能遇到一个来自以移动设备为中心的用户，他可能需要一个 Linux 桌面，从而让他一直感觉像是‘在家’一样。对于我来说， [Ubuntu](https://www.ubuntu.com/) 是最显然的赢家。为什么？和其他系统相比， Ubuntu Unity 在桌面上做出了很杰出的工作，它使得桌面感觉像是一个包罗万象的界面。如果你愿意，那么可以包含在线搜索结果（默认情况下禁用），这是在几乎每个移动环境中均可找到的东西。同样， Unity HUD 菜单系统（图片 4）是在任何界面系统中所能找到的最独一无二的菜单系统之一。通过 Unity HUD 菜单系统，用户可以更少的依赖鼠标（就像他们过去在 Android 支持的移动设备上工作一样）。

*图片 4： 使用中的 Unity HUD 。*

当然， Ubuntu 也提供了市场上最稳定的桌面平台，所以用户体验近乎完美。

### 总有一款 Linux 发行版适合你

有一件很重要的事情需要记住，那就是总有一款 Linux 发行版适合你。但是对于那些来自特殊环境的人，我强烈推荐找到一个最喜爱的 Linux 版本，从而能够帮助他们无缝过渡。给自己一个机会尝试一下，看看你是否可以轻松体验到开源和 Linux 的强大。

---

via: <https://www.linux.com/news/best-linux-distributions-new-users>

作者：[JACK WALLEN](https://www.linux.com/users/jlwallen) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)

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


为你在 Bash 历史中执行过的每一项命令设置时间和日期

Summary: 每个命令相关的日期和时间可以记录到历史文件中，用 HISTTIMEFORMAT 环境变量的设置作为命令历史的备注记录。

export HISTTIMEFORMAT='%F %T '<br />
多个空格效果更好嘛

这个功能待验证。以前每次使用history都感觉有点怪，但是说不上来。现在明白了，原来是没有显示日期与时间的关系。。。。

# 为你在 Bash 历史中执行过的每一项命令设置时间和日期

在默认情况下，所有通过 Bash 在命令行中执行过的命令都被存储在历史缓存区或者一个叫做 `~/.bash_history` 的文件里。这意味着系统管理员可以看到系统上用户执行过的命令清单，或者用户可以通过像 [history 命令](/article-1143-1.html)这样的选项来看他或她自己的命令历史。

```
$ history

```

*Linux 历史命令*

从上面 [history 命令](http://www.tecmint.com/history-command-examples/)的输出可知，命令被执行的日期和时间并没有显示出来。基本上所有的 Linux 发行版的默认设置都是这样的。

在这篇文章里，我们将解释当在 Bash 中执行 `history` 命令显示每个命令时，如何配置显示时间戳信息。

每个命令相关的日期和时间可以记录到历史文件中，用 `HISTTIMEFORMAT` 环境变量的设置作为命令历史的备注记录。

这里有两种可行的方式来达到目的：一种是暂时的效果，一种是永久的效果。

要临时设置 `HISTTIMEFORMAT` 环境变量，在命令行这样输出它：

```
$ export HISTTIMEFORMAT='%F %T'

```

在上面的输出命令当中，时间戳格式如下：

1、`％F`－展开为完整日期，即 `％Y-％m-％d`（年-月-日）。

2、`％T`－展开为时间，即 `％H:％M:％S`（时:分:秒）。

通读 [date 命令](http://www.tecmint.com/sort-ls-output-by-last-modified-date-and-time/)的 man 手册来获得更多使用说明：

```
$ man date

```

然后如下检查你的命令历史：

```
$ history

```

*显示带有日期和时间的 Linux 命令历史。*

（LCTT 译注：注意：这个功能只能用在当 HISTTIMEFORMAT 这个环境变量被设置之后，之后的那些新执行的 bash 命令才会被打上正确的时间戳。在此之前的所有命令，都将会显示成设置 HISTTIMEFORMAT 变量的时间。）

然而，如果你想永久地配置该变量，用你最喜欢的编辑器打开文件 `~/.bashrc`。

```
$ vi ~/.bashrc

```

然后在下方添加（用注释将其标记为你自己的配置）：

```
# 我的配置
export HISTTIMEFORMAT='%F %T'

```

保存文件并退出，然后，运行下面的命令以便改动当即生效：

```
$ source ~/.bashrc

```

就是这些！请通过下方的评论区来与我们分享一些有趣的历史命令的小技巧以及你对这篇文章的想法。

>
>
>
>
> 作者简介：
> 我是 Ravi Saive，TecMint 的创建者。一个爱在网上分享的技巧和提示的电脑极客和 Linux 专家。我的大多数服务器运行在名为 Linux 的开源平台上。请在 Twitter、 Facebook 和 Google 等上关注我。
>
>
>

---

via: <http://www.tecmint.com/display-linux-command-history-with-date-and-time/>

作者：[Ravi Saive](http://www.tecmint.com/author/admin/) 译者：[Hymantin](https://github.com/Hymantin) 校对：[wxy](https://github.com/wxy)

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


Linux 上搭建 Minecraft 服务器

有用

screen要装的吧

客户端在哪里下载

想要不是同一个局域网的客户端连接的话还应该要公网ip或内网穿透吧

来自广东茂名的 Chrome Mobile iOS 86.0|iOS 12.5 用户

# Linux 上搭建 Minecraft 服务器

“<ruby> 我的世界 <rp>  （ </rp> <rt>  Minecraft </rt> <rp>  ） </rp></ruby>”是一个人们可以在各种游戏主机和计算机上玩的主流游戏。 截止至 2016 年 6 月，在各种平台上已经售出了超过十亿六千万份。因其受欢迎，你可能想在家里举办一个“我的世界”派对，那么你就需要安装一个 “我的世界” 服务器，让所有的玩家连接到同一个世界中一起玩。

### 系统要求

要开始的话，你需要一个有相当数量内存的 Linux 操作系统。你要在服务器上容纳的玩家越多，你就需要越多的内存。硬盘空间倒不是需求很大，只要足够去安装 Java 以及“我的世界”服务器 Java 文件就行。Minecraft 服务器需要有一个稳定的网络连接，不管是有线还是无线网络。

让我们看看 “我的世界”服务器最低要求：

* **CPU：**双核或更好。
* **内存：** 2 GB （20-40 用户量)，3 GB（30-60 用户量），8 GB（60+ 用户量）。
* **系统：** 不需要图形化用户接口，可以留出更多的空闲资源。

**备注：** 这是“我的世界” 服务端程序的需求，而不是一个完整的操作系统的需求。如果可以给我的世界服务器分配更多的资源，它将运行得更好。

### 安装 Java

如果你用 Linux 操作系统运行它的话，你需要安装最新版本的 Java 环境。

为了验证你的 Java 版本，位于终端输入以下命令：`java -version`。结果应该是：

```
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode)

```

如果你当前的 Java 版本不是 1.8 或者更高，则通过在 Ubuntu 系统的终端下执行以下操作来安装 Java 版本 8：

```
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

```

**注意：**如果 `add-apt-repository` 命令无法找到，运行 `sudo apt-get install software-properties-common` 来安装。 您还可以将第三个命令中更改为 `oracle-java9-installer` 来安装最新的 java 版本。

对于 Redhat 系统（如 CentOS），请使用以下命令：

```
sudo yum install java-1.8.0-openjdk

```

安装后，核实键入版本命令 `java-version` ，并且核实输出。这样你就有了一个适当的 Java 版本，你可以继续进行接下来的安装。

### “我的世界”服务器版本下载

接下来做的事就是去检查用户将运行的“我的世界”的版本。图 1 显示了一个正在运行的 ”我的世界“ ，注意左下角的版本号。

*图 1*

请记住“我的世界”客户端版本号。每个客户端应该是相同的版本才行。

您接下来要做的是下载客户端所需要的“我的世界”的服务器版本。为了下载该版本你需要知道它的位置。得到所需的文件的命令是：

```
sudo wget https://s3.amazonaws.com/Minecraft.Download/versions/[version]/minecraft_server.[version].jar

```

在 图1 看到，版本号是 1.10.2。那么这个命令就该变成：

```
sudo wget https://s3.amazonaws.com/Minecraft.Download/versions/1.10.2/minecraft_server.1.10.2.jar

```

当你下载好文件，会保存到你当前目录下。使用命令 `pwd` 确定当前位置。

一旦你有了该文件，知道它所保存的文件夹就可以继续了。

### 服务器信息

在启动“我的世界”服务器之前，您必须知道当前系统上能被你使用的可用内存大小。 当启动“我的世界”服务器时，你将需要指定起始内存量和当更多玩家加入时最大分配的内存量。 再次提示，重要的是要有足够的内存。 如果可以，使用最小化安装操作系统来留出更多的内存，例如最小化安装的 Ubuntu。

一旦你有了所需的“我的世界”服务器文件，就可以确定分配给“我的世界”的内存数量。 要确定可用内存，打开一个终端并键入以下命令 ，示例输出如图 2 所示：

```
free -h

```

*图 2*

如图 2 所示，在这个低端系统上你可以看到那只有 684 MB 空闲内存。这不是一个可以用于搭建一个 “我的世界” 服务器的系统。在另一个服务器上我有 2.8 GB 内存可供给“我的世界” 使用。

在我们启动服务器之前，我们需要找到服务器的 IP 地址。 为此，请运行命令 `ifconfig`。 如图 3 所示，应该列出了网络连接，显示 `Internet Address` 或 `inet addr`，这里是 `192.168.0.2`。 在我的服务器系统上，它列出的地址是 `192.168.0.14`，这个地址是客户端系统将要使用的地址。

*图 3*

### 启动“我的世界”服务器

下一步才是真正的启动“我的世界”服务器。在我们实际开始前，会涉及到几个选项。当启动“我的世界”服务器时，你需要指定用多少内存来初始化“我是世界”。 您还将指定使用的最大内存量。

如果我的系统有 3.7GB 闲置内存，我知道会有不到 40 位玩家，于是我只需要划出 2GB。当然，我可以增加些以允许用户增长。如果需要的话，我还可以留一点内存给系统运行。我将最小值设置为 2 GB，最大值设置为 3 GB。 由于最大值设置为 3 GB，如果需要的话，还可以至少留给系统 700 MB 内存，但这只有在“我的世界”服务器使用超过最初分配的2 GB 时才会发生。

启动服务器的命令行是：

```
sudo java -Xms# -Xmx# -jar [path]/minecraft_server.[version].jar nogui

```

现在解释一下命令结构：

* -Xms# - 初始启动分配的内存（`-Xms2048m`）
* -Xmx# - 最大分配的内存（`-Xmx3096m`）
* [path] – “我的世界” 服务器文件路径（ `/home/tux/MCS/`）
* [version] – 下载的“我的世界” 服务器的版本（`1.10.2`）
* nogui – 用于以基于文本的界面来显示，可以减少内存使用。如果你使用图形化界面，那么移除 `nogui` 选项。

一个使用 2GB 内存以及最大 3GB、位置为 `/home/tux/MCS`、 版本号为 `1.10.2` 的系统的完整命令实例是：

```
sudo java -Xms2048m -Xmx3096m -jar /home/tux/MCS/minecraft_server.1.10.2.jar nogui

```

**注意：** 这里内存容量的大小是兆字节单位。容量要乘以 1024。举个例子，2GB 的内存使 2 与 1024 相乘，容量为 2048。但别忘小写字母 `m` 是特指兆字节。你可以简单地使用特指的 `2g` 和 `3g` 来表示 2GB 和 3GB。

在你首次运行服务器时会发成一些错误。开始之前，它表明需要同意 “最终用户许可协议 EULA”。

要同意 “最终用户许可协议 EULA”，你需要编辑与“我的世界”服务器 JAR 文件同一文件夹下的的 `eula.txt` 文件。

使用一个类似 `nano` 的文件编辑器打开文件 `eula.txt` 文件。确定你进行这步时使用的是 root 权限。将行 `eula = false` 更改为 `eula = true`，并保存文件。

现在，再次输入上述命令以启动服务器。 应该滚过满屏幕信息，然后一个状态行将显示它的创建过程。 当其这个初始世界创建好之后，状态行将显示 100％。 有关系统时间更改的任何错误消息是正常的，因此忽略它们。

此时，你可以打开客户端程序并且看到如上图 1 的界面。点击“Multiplayer”按钮。在下一屏幕，如图 4，选择 “Direct Connect”，这将提示您输入服务器地址，因此键入“我的世界”服务器的 IP 地址。你现在应该已经连接到游戏了。

*图 4*

### 连接的某些麻烦

如果一些客户端无法连接到服务器，那么你需要按下 `CTRL+Z` 退出 Java 程序。打开文件 `server.propertices`， 使用一个 nano 之类的编辑器进行编辑。记住要 root 权限。编辑 `online-mode` 行，它应该设置为 `true` ，修改为 `false` 并保存。重启服务器并打开“我的世界”服务器。使用客户端重新连接到服务器，现在应该一切都好了。

建设快乐！

---

via: <https://www.linuxforum.com/threads/minecraft-server-on-linux.3202/>

作者：[Jarret](https://www.linuxforum.com/members/jarret.268/) 译者：[erlinux](http://www.itxdm.me) 校对：[wxy](https://github.com/wxy)

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


CentOS 与 Ubuntu：哪个更适合做服务器？

Summary: 已经决定买一台虚拟服务器，但还不能决定使用哪个 Linux 发行版？我们都经历过这种困扰。对于 Linux 发行版来说，要在这么多的发行版和种种支派flavors中选择一个，那简直能让人崩溃。

国内基本上都用centos吧

选服务器……把Ubuntu拉出来是做反面教材吗

CentOS(RHEL)是Oracle数据的认证平台，基本都是CentOS吧。

Ubuntu似乎不太适合做服务器

云服务器上的ubuntu server还不错的啊

中小企业和机构，选CentOS、Debian或者openSUSE就可以了。另，Linux.cn的回复各种高亮的绿色、黄色背景条能不能去掉？太刺眼了。

Centos和其他linux发行版的补丁数量完全是两个次元的。ubuntu那边虽然也不少，但是仍然不是一个级别

如果是服务器，我肯定不会选ubuntu。

和没写一样

没专门用过服务器，没有发言权，哈哈

或许黄绿色太影响主体内容的查看了——本意是区分游客发言和注册用户发言的。我再考虑考虑、调整下。

建議可以採用同樣的色系，不同深淺就好，否則畫面一整個很花，當然也不要刺眼的顏色，太影響閱讀。

有道理！

也不能这样说， Ubuntu 做服务器，在国外还是有相当数量的。

你知道Ubuntu有Ubuntu桌面版<br />
还有专业的Ubuntu Server版吗？

https://w3techs.com/technologies/details/os-linux/all/all

Ubuntu is used by 35.2% of all the websites who use Linux.（26 January 2017）

不懂别乱说，小心全球的Ubuntu用户和粉丝骂你

（如果楼上这位看不懂英文没事，你只要看那个图表的比例就可以，我相信这个你应该能看懂。）

离线服务器如何解？

没有特别明显的差异，选那个看自己的对那个操作经验比较丰富咯。

如果要装一些特殊的硬件和软件用于比较重要的应用，比如装在ibm、hp等大厂的服务器上，安装oracle之类的服务，用于生产环境，那么我会选择centos，我「估计」驱动、补丁、文档等方面的支持会比较好点。如果你只是建一个简单的ftp、web、samba服务器，你选tinycorelinux都可以（11M到100多M：http://mirrors.163.com/tinycorelinux/downloads.html）<br />
刚装了两个centos7 Minimal 版，然后开始尝试搭建freeradius双服务器，如果测试完成 ，今后就会正式用于生产环境，这是我的思路。

如果是服务器，我肯定不会选ubuntu server。这样说你该懂了吧

作为一个数据分析远程用户来说超级烦国内大量服务器都是cent/suse一流的，服务器对我来说就是一个提供强劲运算能力的平台，cent/suse上的软件老的要命，特别是给很多最新代码提供依赖的库，实在是太老了，你不提供最新版本就算了，好歹提供次新版本吧……最后实际上还是要我通过conda，brew等平台单独安装使用新版本，并不能保证所谓的旧版本经过测试更安全，因为我不会用它们……有些仍然无法成功替换，无形中给其他专业的使用者造成很大麻烦，也降低了效率……大概这也是为啥国外很多ubuntu服务器的原因吧，国内cent多应该是历史惰性。

如果是Docker集群我会选择Ubuntu，毕竟支持效果相对与CentOS要好很多

来自223.104.64.175的 Chrome Mobile 62.0|Android 8.0 用户

要注意：国内和国外情况不一样，国内CentOS在服务器端的市场确实比Ubuntu多，虽然我找不出具体的【权威数据】，但是情况貌似确实如此！

非常同意你。

# CentOS 与 Ubuntu：哪个更适合做服务器？

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

已经决定买一台虚拟服务器，但还不能决定使用哪个 Linux 发行版？我们都经历过这种困扰。对于 Linux 发行版来说，要在这么多的发行版和种种<ruby> 支派 <rp>  （ </rp> <rt>  flavors </rt> <rp>  ） </rp></ruby>中选择一个，那简直能让人崩溃。不过，对于服务器而言，有两个主流的 Linux 发行版，那就是 CentOS 和 Ubuntu。但如何从这两个之中选择，这是摆在管理员、初学者和专业人士面前的主要问题。在对这两个（和更多）发行版有了一定的经验之后，我们决定对这两个发行版用于服务器时做个比较。

**利益相关：本文译自 thishosting.rocks，根据国内情况替换了相应推荐的云服务商的链接，有需求者可点击。**

### 概览

|  CentOS |  Ubuntu |
| --- | --- |
| 基于 Red Hat Linux Enterprise | 基于 Debian |
| 更新频度较少 | 经常更新 |
| 更稳定和更安全一些，因为不经常更新。 | 更新的软件包可能不稳定，不安全？不会，因为他们在发布到正式版本前进行了大量测试。 |
| 没有足够的教程和用户群较少（LCTT 译注：可能是由于国内外情况不同，在国内，相对 Ubuntu 来说，人们更喜欢用 CentOS 做服务器） | 丰富的文档，活跃的社区和大量的在线教程 |
| 对初学者困难，因为基于 Red Hat 桌面发行版不流行 | 更容易为已经熟悉桌面版 Ubuntu 的初学者使用 |
| 支持 cPanel | 不支持 cPanel |
| .rpm 软件包和 “yum” 软件包管理器 | .deb 软件包和 “apt-get” 软件包管理器 |
| 在[阿里云](http://click.aliyun.com/m/9419/)和 [Ucloud](https://ucloud.cn/site/free.html) 免费试用 CentOS 服务器 | 在[阿里云](http://click.aliyun.com/m/9419/)和 [Ucloud](https://ucloud.cn/site/free.html) 免费试用 Ubuntu 服务器 |

### 哪个更适合新手？

Ubuntu。

一如往常那样，它主要取决于你的需求和以前的经验，但一般来说，Ubuntu 对于初学者来说是更好的选择。主要是因为这两个原因：

* Ubuntu 有一个庞大的社区，随时可以免费提供帮助。我指的是真正的大。数以千计的用户分布在数百个不同的在线论坛和兴趣组内。甚至有现实生活中的大会。你也可以为 CentOS 找到很多教程和帮助，特别是对于简单的 LAMP 栈和流行的应用程序而言。
* Ubuntu 服务器对于以前使用过 Ubuntu 桌面的人来说会容易得多。同样的情况也存在于 CentOS 和 Fedora 之间，但是 Ubuntu 桌面版比任何其他基于 Linux 的家用桌面更受欢迎。

所以，如果你是一个初学者，而且没有任何特殊要求，那就去使用 Ubuntu 服务器。 更好的是，你可以从一个[便宜的托管服务提供商](https://ucloud.cn/site/free.html)那购买服务，这样你就可以在你的服务器上进行实验，还有一个[专业的 24/7 支持团队](https://ucloud.cn/site/free.html)准备好帮助你。

### 哪个更适合商用？

CentOS。

同样，你仍然可以使用 Ubuntu 作为商用网站或公司内部服务器，但 CentOS 有它的优势：

* CentOS（可以说）更稳定以及更安全。由于 CentOS 的更新频率较低，这意味着软件测试的时间更长，并且只有真正稳定的版本才会得到发布。如果你使用 CentOS，你不会因新的有 bug 的应用程序版本而遇到任何稳定性问题，因为你不会得到那个新的有 bug 的版本。
* 大多数控制面板（包括最受欢迎的控制面板 - cPanel）仅支持 CentOS。所以这意味着如果你是一个网站托管公司，或者如果你是一个有很多客户的网站服务代理商，并且需要一个控制面板 - CentOS 是一个更好的选择。

### 尝试一下它们并选择一个

如果你还是不能决定，你可以免费试试它们。你可以在本地安装或使用 live 镜像。你还可以从[阿里云](http://click.aliyun.com/m/7604/)和 [Ucloud](https://ucloud.cn/site/free.html) 这样的地方买到便宜的虚拟专用服务器。你可以在几秒钟内启动 CentOS/Ubuntu 服务器。

### 哪个更快？

它们在速度方面是相同的。它们和运行在你自己的硬件上一样快。它们将如你配置的一样快。不管怎样，你都应该正确配置并且保护所有的服务器、配置和应用程序。

你会使用哪个发行版？想告诉我们你是哪个发行版的拥趸么？请随时留下评论。

---

**文末评论**

W. Anderson：

>
> 我的大多数 Linux 服务器部署都是针对企业客户的，所以我对文章作者以 GUI 客户端版本来反映任何服务器的管理功能感到困惑。通常，许多服务提供商也会在 CentOS、Ubuntu，或经常部署的 OpenSuse Leap 和 FreeBSD 10+ 服务器操作系统上提供 WebMin、VirtualAdmin 或类似工具作为控制面板，即使是在虚拟专用服务器（VPS）环境中。
>
>
> CentOS 在许多商业应用以及高级网络/虚拟化和云计算环境方面具有明显优于 Ubuntu 的优势，并且 CentOS 充分利用 SELinux 框架用于加强的安全层，而目前在 Ubuntu 中则不可用（或不容易）。
>
>
> 这种类型的比较通常是多余的，因为几乎总是有特定的和细微的要求，和需要服务器实现的需求，这将决定哪个发行版具有更多的优势或用途 - 基于技术专家/托管公司的专业知识和广泛的经验。
>
>
>

VAN DER BEKEN：

>
> 正确的比较应该是对 Debian 和 CentOS 进行比较。
>
>
> 以我的经验，我使用 CentOS 和 Debian 作为服务器，稍微偏爱 Debian 一点点，因为它的社区。
>
>
>

---

via: <https://thishosting.rocks/centos-vs-ubuntu-server/>

作者：[thishosting.rocks](https://thishosting.rocks/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


aria2 与 wget ：选择你的下载管理器

# aria2 与 wget ：选择你的下载管理器

任何没有下载管理器的 Linux 操作系统是不完整的。多年来，基于 Linux 的发行版使用 wget 作为默认下载管理器。它是一个很棒的小程序，可以在命令行下工作，如果你需要安装东西、下载东西、运行 shell 脚本等，某种程度上都可以在 wget 中完成任务。在过去的很多年里，我们发现 wget 缺乏一些高级的功能，而它的替代品 **aria2** ，由于满足了高级 Linux 用户的渴望而受到了许多用户的关注。我们将在本文中回顾 **aria2** 的安装过程以及 wget 和 aria2 之间的区别，因此你可以决定哪个下载管理器最符合你的需要。

### 安装 aria2

**在 Ubuntu/Debian 中安装 aria2：**

只要在 Ubuntu 中运行下面的命令安装：

```
sudo apt-get install aria2

```

**在 Fedora/RHEL/Centos 中安装 aria2：**

运行下面的命令在 Fedora/RHEL 和基于 Centos 的系统中安装：

```
sudo yum install aria2

```

**在 Arch Linux 中安装 aria2：**

运行下面的命令在基于 Arch Linux 的系统中安装。

```
sudo pacman -Sy aria2

```

### aria2 的重要功能

让我们来讨论 aria2 中使它如此受欢迎的重要功能：

* 通过使用多个连接下载文件，最大限度地利用可用带宽。
* 同时下载多个文件和同时下载的能力。
* torrent 客户端提供的所有功能都可以在这个小程序中找到。
* 它提供 meta 链接下载。
* 支持使用 JSON-RPC 和 XML-RPC 协议的远程过程调用。
* 无需等待当前下载完成，轻松批量下载文件。

### aria2 的一些副作用:

aria2 的多线程机制可能会使目标服务器过载。相比下来 wget 就轻量级多了，wget 比 aria2 消耗资源少 20％。aria2 尚未经受 wget 那样巨大的使用规模的测试，因此可能完全准备好成为默认下载管理器。

### wget 的重要特性

* 当然它是最广泛使用和测试的下载管理器。
* 它是一个简单的程序，具有较少的功能，但稳定工作了几十年。
* 默认所有 Linux 发行版上都有，不需要繁重的安装。
* 与 aria2 相比更轻量级。

### 总结

虽然 wget 没有丰富的功能，但仍然工作得相当不错，然而，高级用户肯定会喜欢 aria2，因为它满足更快和并发下载的需要。aria2 可能需要很长时间来取代 wget 成为默认下载管理器，而目前 wget 用在几乎所有 linux 发行版的安装程序脚本中。

---

via: <http://linuxpitstop.com/aria-2-vs-wget/>

作者：[Aun](http://linuxpitstop.com/author/aun/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Vim 初学者入门指南

我每次都是输入命令：vi       >_<

中文版Vim快捷键速查表:ctolib.com/cheatsheets-Vim-command.html

# Vim 初学者入门指南

这篇文章是 VIM 用户指南 系列文章中的一篇：

* Vim 初学者入门指南
* [Vim 快捷键速查表](/article-8144-1.html)
* [5 个针对有经验用户的 Vim 技巧](/article-8148-1.html)
* [3 个针对高级用户的 Vim 编辑器有用技巧](/article-8149-1.html)

对一个程序员来说，选择一个文本编辑器是一件非常重要的事。因为不同编辑器之间有着不少的差异：图形界面或者非图形界面、不同的快捷键、不同的编程语言支持、不同的插件以及自定义设置等等。我建议不是去搜索最棒的编辑器，而是去选择最适合你的习惯且最适应你的任务的那一个。假如你打算在一个团体中工作，那么最好和你的共事者选择一样的编辑器。这样的话，一旦你在使用中遇到问题，你就可以去向他们寻求帮助。

这正是我在几年之前开始使用 Vim 的原因。通常来说，Vim 会被置于传说中的 Emacs 的对立面。我承认我对 Emacs 知之甚少，但是对于它俩，你需要知道的是它们都可以被深度定制，并且在初学时也都非常令人困惑。这个教程并不会介绍有关 Vim 的所有内容，而是将介绍一些基础以使你在最初就能正确使用它，随后还会展示一些小技巧，借此（希望能）让你有能力自己去探索学习。

Vim 一词来源于 “Vi IMproved”。Vi 是一个被广泛安装于 Unix 系统的非图形界面文本编辑器，并且它也被默认安装在了 Linux 系统中。Vim 是这个原始编辑器的增强版，但是不同于 Vi，并不是每个发行版都默认安装了它。

### 安装

在 Ubuntu 中可以使用如下命令来安装 Vim：

```
sudo apt-get install vim

```

如果你已经对某些插件有了兴趣，使用以下命令：

```
sudo apt-cache search vim

```

这命令将给你输出一个很长的和 Vim 有关的包列表。在这之中，有针对不同编程语言的工具，有插件管理器，等等。

在这系列教程中，我将会在 Ubuntu 上使用最新版的 Vim（7.3.154，LCTT 译注：现在最新版为 8.0）。当然你也可以使用其它任何版本。

### 热身

在终端输入 `vim` 命令，你将会看到一个非常棒的欢迎界面。

（LCTT 译注：看到了欢迎界面中那行“Help poor children in Uganda!” 了吗？）

如果你之前从未使用过 Vi 或者 Vim，那么你很可能甚至不知道该怎么退出它... 是的，这是事实。**任何你常用的快捷键在 Vim 中都将失去原有的效果**。（LCTT 译注：网上有个流传的笑话——“如何制造乱码”，“让新手退出 vi”）

首先，要使用任何命令式的功能，像<ruby> 保存 <rp>  （ </rp> <rt>  save </rt> <rp>  ） </rp></ruby>或者<ruby> 退出 <rp>  （ </rp> <rt>  exit </rt> <rp>  ） </rp></ruby>，你都先得输入一个冒号（`:`）。保存是 `:w` 而退出是 `:q`。如果你想不保存文件就退出，那么就要使用强制退出命令 `:q!`。Vim 中非常棒的一点是你不需要分开输入各个命令，换言之，如果你想保存然后退出，你就可以直接使用 `:wq`。

现在，我们退出 Vim 再打开一个文本文件。为此，你只需把想要编辑的文件名加在命令后面即可：

```
vim [文本文件名]

```

一般而言，当你打开一个文本文件，你将会处在查看模式。这使得 Vim 与众不同并且最初会让人感到困惑。Vim 主要由两种模式构成：查看模式和编辑模式。查看模式用于查看内容并且使用一些命令。想要进入编辑模式，只需按 `i` 键进行<ruby> 插入 <rp>  （ </rp> <rt>  insert </rt> <rp>  ） </rp></ruby>或者 `a` 键进行<ruby> 添加 <rp>  （ </rp> <rt>  add </rt> <rp>  ） </rp></ruby>。想要返回到查看模式或者进行命令式功能的操作，按 `Escape` 键即可。<ruby> 插入 <rp>  （ </rp> <rt>  insert </rt> <rp>  ） </rp></ruby>和<ruby> 添加 <rp>  （ </rp> <rt>  add </rt> <rp>  ） </rp></ruby>的差异仅仅在于你是想在光标位置之前还是在光标之后进入编辑模式并进行文字输入。要想彻底地明白，你应该亲自去尝试一下。我的建议是：仅在行尾使用<ruby> 添加 <rp>  （ </rp> <rt>  add </rt> <rp>  ） </rp></ruby>，而在其它时候使用<ruby> 插入 <rp>  （ </rp> <rt>  insert </rt> <rp>  ） </rp></ruby>。

（LCTT 译注：此段落中“查看模式”原文是 “visual mode”，疑为“view mode”，在此模式下可以查看文本，但是不能进行编辑；而“visual mode” 是编辑模式的一种，可以按 `v` 键进入，然后就可以用方向键从当前光标位置开始进行选择，并以反白的视觉效果显示，通常选择后可以按 `y` 进行复制、按 `d` 进行剪切等操作。此外， 本文作者的用语并不标准，按照 Vim 自己的用语来说，此处所谓的“查看模式”，应该称之为“普通模式”，“编辑模式”应该称之为“插入模式”，不过意思是一致的。）

要想在文本之中移动光标，你通常可以使用键盘上的方向键，它们无论是在查看模式还是在编辑模式都可以生效。不过，一个真正的纯粹主义者将会告诉你使用按键 `h` 向左，`j` 向下，`k` 向上，`l` 向右来（在查看模式）进行移动。

现在你已经明白了如何和简单地控制 Vim，我们再来更加深入一些。

### 一些简单命令

现在你已经熟悉了在正常模式和插入模式之间进行切换，下面是一些可以在正常模式中使用的命令：

* `x`：删除一个字符
* `u`：撤销一个操作（相当与 `Ctrl+z`）
* `dd`：删除一行内容
* `dw`：删除一个单词
* `yy`：复制一行内容
* `yw`：复制一个单词
* `p`：粘贴一个之前删除或复制的行或者单词
* `e`：跳到下个单词（LCTT 译注：词尾）（比单纯用方向键更快）
* `r`：替换一个字母（按 `r`，松开，然后再按新字母）

当然不止这些，不过这些对现在来说已经足够了。如果你掌握了上面的全部，你将能你很顺溜地使用 Vim 了。

对于那些还想知道更多的人，我再多提一下。你可以在任何这些命令之前加上一个数值，那么这个命令将被重复执行相应的次数。例如，`5x` 将在当前行连续删除 5 个字母，而 `3p` 将会粘贴 3 次。

### 高级命令

最后，作为对你自己继续探索的鼓励和示例，这里给出几个高级且常用的命令：

* `/所搜索的内容`：在文中搜索特定内容
* `:sp 文本文件名`：将屏幕水平分割成上下两半，新文件展示在另一半。想要在两侧切换焦点，可以使用 `Ctrl+w` 快捷键。

* `:vsp 文本文件名`：同上，但是是垂直分割屏幕
* `Ctrl+Shift+C` 和 `Ctrl+Shift+V`：在终端中复制和粘贴文本
* `:! 命令名`：在 Vim 中运行 Vim 外的终端命令，直接发送给 shell。例如，`:! ls` 将在不退出编辑器的同时，显示你当前目录内的文件。

### 结论

我觉得你现在应该已经有了足够的准备来开始使用 Vim。你还可以通过安装各种插件，编辑 `~.vimrc` 文件，或者在 shell 中输入 `vimtutor` 命令来使用交互式教程以学到更多。

如果你有任何你想分享的关于 Vim 的其它命令，请在评论中告知我们。

---

via: <https://www.maketecheasier.com/start-with-vim-linux/>

作者：[Himanshu Arora](https://www.maketecheasier.com/author/himanshu/) 译者：[Yinr](https://github.com/Yinr) 校对：[jasminepeng](https://github.com/jasminepeng)

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