可怕的万圣节 Linux 命令

Summary: 什么命令可能会显示鬼、巫婆和僵尸的图像？哪个会鼓励“不给糖果就捣蛋”的精神？

什么命令可能会显示鬼、巫婆和僵尸的图像？哪个会鼓励“不给糖果就捣蛋”的精神？

![](/data/attachment/album/201804/17/001608igdrpdwg2drzptpf.jpg)

虽然现在不是万圣节，也可以关注一下 Linux 可怕的一面。什么命令可能会显示鬼、巫婆和僵尸的图像？哪个会鼓励“不给糖果就捣蛋”的精神？

### crypt

好吧，我们一直看到 `crypt`。尽管名称不同，crypt 不是一个地窖，也不是垃圾文件的埋葬坑，而是一个加密文件内容的命令。现在，`crypt` 通常用一个脚本实现，通过调用一个名为 `mcrypt` 的二进制文件来模拟以前的 `crypt` 命令来完成它的工作。直接使用 `mycrypt` 命令是更好的选择。

```
$ mcrypt x
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:

File x was encrypted.

```

请注意，`mcrypt` 命令会创建第二个扩展名为 `.nc` 的文件。它不会覆盖你正在加密的文件。

`mcrypt` 命令有密钥大小和加密算法的选项。你也可以再选项中指定密钥，但 `mcrypt` 命令不鼓励这样做。

### kill

还有 `kill` 命令 - 当然并不是指谋杀，而是用来强制和非强制地结束进程，这取决于正确终止它们的要求。当然，Linux 并不止于此。相反，它有各种 `kill` 命令来终止进程。我们有 `kill`、`pkill`、`killall`、`killpg`、`rfkill`、`skill`（）读作 es-kill）、`tgkill`、`tkill` 和 `xkill`。

```
$ killall runme
[1] Terminated ./runme
[2] Terminated ./runme
[3]- Terminated ./runme
[4]+ Terminated ./runme

```

### shred

Linux 系统也支持一个名为 `shred` 的命令。`shred` 命令会覆盖文件以隐藏其以前的内容，并确保使用硬盘恢复工具无法恢复它们。请记住，`rm` 命令基本上只是删除文件在目录文件中的引用，但不一定会从磁盘上删除内容或覆盖它。`shred` 命令覆盖文件的内容。

```
$ shred dupes.txt
$ more dupes.txt
▒oΛ▒▒9▒lm▒▒▒▒▒o▒1־▒▒f▒f▒▒▒i▒▒h^}&▒▒▒{▒▒

```

### 僵尸

虽然不是命令，但僵尸在 Linux 系统上是很顽固的存在。僵尸基本上是没有完全清理掉的死亡进程的遗骸。进程*不应该*这样工作 —— 让死亡进程四处游荡，而不是简单地让它们死亡并进入数字天堂，所以僵尸的存在表明了让他们遗留于此的进程有一些缺陷。

一个简单的方法来检查你的系统是否有僵尸进程遗留，看看 `top` 命令的标题行。

```
$ top
top - 18:50:38 up 6 days, 6:36, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 171 total, 1 running, 167 sleeping, 0 stopped, 3 zombie  `< ==`
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2003388 total, 250840 free, 545832 used, 1206716 buff/cache
KiB Swap: 9765884 total, 9765764 free, 120 used. 1156536 avail Mem

```

可怕！上面显示有三个僵尸进程。

### at midnight

有时会在万圣节这么说，死者的灵魂从日落开始游荡直到午夜。Linux 可以通过 `at midnight` 命令跟踪它们的离开。用于安排在下次到达指定时间时运行的作业，`at` 的作用类似于一次性的 cron。

```
$ at midnight
warning: commands will be executed using /bin/sh
at> echo 'the spirits of the dead have left'
at> <EOT>
job 3 at Thu Oct 31 00:00:00 2017

```

### 守护进程

Linux 系统也高度依赖守护进程 —— 在后台运行的进程，并提供系统的许多功能。许多守护进程的名称以 “d” 结尾。这个 “d” 代表<ruby> 守护进程 <rt>  daemon </rt></ruby>，表明这个进程一直运行并支持一些重要功能。有的会用单词 “daemon” 。

```
$ ps -ef | grep sshd
root 1142 1 0 Oct19 ? 00:00:00 /usr/sbin/sshd -D
root 25342 1142 0 18:34 ? 00:00:00 sshd: shs [priv]
$ ps -ef | grep daemon | grep -v grep
message+ 790 1 0 Oct19 ? 00:00:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 836 1 0 Oct19 ? 00:00:02 /usr/lib/accountsservice/accounts-daemon

```

### 万圣节快乐！

在 [Facebook](https://www.facebook.com/NetworkWorld/) 和 [LinkedIn](https://www.linkedin.com/company/network-world) 上加入 Network World 社区来对主题进行评论。

---

via: <https://www.networkworld.com/article/3235219/linux/scary-linux-commands-for-halloween.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


面向企业的最佳 Linux 发行版

![](/data/attachment/album/201804/17/095110szjo7ddjnog2c22o.jpg)

在这篇文章中，我将分享企业环境下顶级的 Linux 发行版。其中一些发行版用于服务器和云环境以及桌面任务。所有这些可选的 Linux 具有的一个共同点是它们都是企业级 Linux 发行版 —— 所以你可以期待更高程度的功能性，当然还有支持程度。

### 什么是企业级的 Linux 发行版？

企业级的 Linux 发行版可以归结为以下内容 —— 稳定性和支持。在企业环境中，使用的 Linux 版本必须满足这两点。稳定性意味着所提供的软件包既稳定又可用，同时仍然保持预期的安全性。

企业级的支持因素意味着有一个可靠的支持机制。有时这是单一的（官方）来源，如公司。在其他情况下，它可能是一个非营利性的治理机构，向优秀的第三方支持供应商提供可靠的建议。很明显，前者是最好的选择，但两者都可以接受。

### Red Hat 企业级 Linux（RHEL）

[Red Hat](https://www.redhat.com/en) 有很多很棒的产品，都有企业级的支持来保证可用。其核心重点如下：

* Red Hat 企业级 Linux 服务器：这是一组服务器产品，包括从容器托管到 SAP 服务的所有内容，还有其他衍生的服务器。
* Red Hat 企业级 Linux 桌面：这些是严格控制的用户环境，运行 Red Hat Linux，提供基本的桌面功能。这些功能包括访问最新的应用程序，如 web 浏览器、电子邮件、LibreOffice 等。
* Red Hat 企业级 Linux 工作站：这基本上是 Red Hat 企业级 Linux 桌面，但针对高性能任务进行了优化。它也非常适合于大型部署和持续管理。

#### 为什么选择 Red Hat 企业级 Linux？

Red Hat 是一家非常成功的大型公司，销售围绕 Linux 的服务。基本上，Red Hat 从那些想要避免供应商锁定和其他相关问题的公司赚钱。这些公司认识到聘用开源软件专家和管理他们的服务器和其他计算需求的价值。一家公司只需要购买订阅来让 Red Hat 做支持工作就行。

Red Hat 也是一个可靠的社会公民。他们赞助开源项目以及像 OpenSource.com 这样的 FoSS 支持网站（LCTT 译注：FoSS 是 Free and Open Source Software 的缩写，意为自由及开源软件），并为 Fedora 项目提供支持。Fedora 不是由 Red Hat 所有的，而是由它赞助开发的。这使 Fedora 得以发展，同时也使 Red Hat 受益匪浅。Red Hat 可以从 Fedora 项目中获得他们想要的，并将其用于他们的企业级 Linux 产品中。 就目前来看，Fedora 充当了红帽企业 Linux 的上游渠道。

### SUSE Linux 企业版本

[SUSE](https://www.suse.com/) 是一家非常棒的公司，为企业用户提供了可靠的 Linux 选择。SUSE 的产品类似于 Red Hat，桌面和服务器都是该公司所关注的。从我自己使用 SUSE 的经验来看，我相信 YaST 已经证明了，对于希望在工作场所使用 Linux 操作系统的非 Linux 管理员而言，它拥有巨大的优势。YaST 为那些需要一些基本的 Linux 命令行知识的任务提供了一个友好的 GUI。

SUSE 的核心重点如下：

* SUSE Linux 企业级服务器（SLES）：包括任务特定的解决方案，从云到 SAP，以及任务关键计算和基于软件的数据存储。
* SUSE Linux 企业级桌面：对于那些希望为员工提供可靠的 Linux 工作站的公司来说，SUSE Linux 企业级桌面是一个不错的选择。和 Red Hat 一样，SUSE 通过订阅模式来对其提供支持。你可以选择三个不同级别的支持。

#### 为什么选择 SUSE Linux 企业版？

SUSE 是一家围绕 Linux 销售服务的公司，但他们仍然通过专注于简化操作来实现这一目标。从他们的网站到其提供的 Linux 发行版，重点是易用性，而不会牺牲安全性或可靠性。尽管在美国毫无疑问 Red Hat 是服务器的标准，但 SUSE 作为公司和开源社区的贡献成员都做得很好。

我还会继续说，SUSE 不会太严肃，当你在 IT 领域建立联系的时候，这是一件很棒的事情。从他们关于 Linux 的有趣音乐视频到 SUSE 贸易展位中使用的 Gecko 以获得有趣的照片机会，SUSE 将自己描述成简单易懂和平易近人的形象。

### Ubuntu LTS Linux

[Ubuntu Long Term Release](http://releases.ubuntu.com/16.04/) （LTS） Linux 是一个简单易用的企业级 Linux 发行版。Ubuntu 看起来比上面提到的其他发行版更新更频繁（有时候也更不稳定）。但请不要误解，Ubuntu LTS 版本被认为是相当稳定的，不过，我认为一些专家可能不太同意它们是安全可靠的。

#### Ubuntu 的核心重点如下：

* Ubuntu 桌面版：毫无疑问，Ubuntu 桌面非常简单，可以快速地学习并运行。也许在高级安装选项中缺少一些东西，但这使得其更简单直白。作为额外的奖励，Ubuntu 相比其他版本有更多的软件包（除了它的父亲，Debian 发行版）。我认为 Ubuntu 真正的亮点在于，你可以在网上找到许多销售 Ubuntu 的厂商，包括服务器、台式机和笔记本电脑。
* Ubuntu 服务器版：这包括服务器、云和容器产品。Ubuntu 还提供了 Juju 云“应用商店”这样一个有趣的概念。对于任何熟悉 Ubuntu 或 Debian 的人来说，Ubuntu 服务器都很有意义。对于这些人来说，它就像手套一样，为你提供了你已经熟知并喜爱的命令行工具。
* Ubuntu IoT：最近，Ubuntu 的开发团队已经把目标瞄准了“物联网”（IoT）的创建解决方案。包括数字标识、机器人技术和物联网网关。我的猜测是，我们将在 Ubuntu 中看到大量增长的物联网用户来自企业，而不是普通家庭用户。

#### 为什么选择 Ubuntu LTS？

社区是 Ubuntu 最大的优点。除了在已经拥挤的服务器市场上的巨大增长之外，它还与普通用户在一起。Ubuntu 的开发和用户社区是坚如磐石的。因此，虽然它可能被认为比其他企业版更不稳定，但是我发现将 Ubuntu LTS 安装锁定到 “security updates only” 模式下提供了非常稳定的体验。

### CentOS 或者 Scientific Linux 怎么样呢？

首先，让我们把 [CentOS](https://www.centos.org/) 作为一个企业发行版，如果你有自己的内部支持团队来维护它，那么安装 CentOS 是一个很好的选择。毕竟，它与 Red Hat 企业级 Linux 兼容，并提供了与 Red Hat 产品相同级别的稳定性。不幸的是，它不能完全取代 Red Hat 支持订阅。

那么 [Scientific Linux](https://www.scientificlinux.org/) 呢？它的发行版怎么样？好吧，它就像 CentOS，它是基于 Red Hat Linux 的。但与 CentOS 不同的是，它与 Red Hat 没有任何隶属关系。 Scientific Linux 从一开始就有一个目标 —— 为世界各地的实验室提供一个通用的 Linux 发行版。今天，Scientific Linux 基本上是 Red Hat 减去所包含的商标资料。

这两种发行版都不能真正地与 Red Hat 互换，因为它们缺少 Red Hat 支持组件。

哪一个是顶级企业发行版？我认为这取决于你需要为自己确定的许多因素：订阅范围、可用性、成本、服务和提供的功能。这些是每个公司必须自己决定的因素。就我个人而言，我认为 Red Hat 在服务器上获胜，而 SUSE 在桌面环境中轻松获胜，但这只是我的意见 —— 你不同意？点击下面的评论部分，让我们来谈谈它。

---

via: <https://www.datamation.com/open-source/best-linux-distros-for-the-enterprise.html>

作者：[Matt Hartley](https://www.datamation.com/author/Matt-Hartley-3080.html) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


自从上个 LTS 版本之后，Ubuntu 18.04 LTS 有什么新变化？

Summary: 让我们回顾一下 Ubuntu 这两年有什么变化。

让我们回顾一下 Ubuntu 这两年有什么变化。

>
> 让我们回顾一下 Ubuntu 这两年有什么变化。
>
>
>

![](/data/attachment/album/201804/17/221345uv1pcuz51ivg355g.jpg)

Canonical 将在这个月末的 26 日发布 Ubuntu 18.04 LTS（Bionic Beaver）操作系统。这是一个 LTS 发布版本，大多数 Ubuntu 16.04 LTS（Xenial Xerus）用户应该进行升级。

2016 年 4 月 21 日发布的 Ubuntu 16.04 LTS（Xenial Xerus）系列已经是两年前的事情了，它已经更新了五个计划维护更新中的四个，而上一个更新 Ubuntu 16.04.4 LTS 发布于 2018 年 3 月 1 日。

Ubuntu 16.04.4 LTS 将会有来自 Ubuntu 17.10（Artful Aardvark）最新的内核和显卡驱动，这和 Ubuntu 16.04 LTS 初次发布相比已经有了很大变化。作为 Ubuntu 16.04 LTS 用户，我想你或许想知道是否值得升级本月底发布的 Ubuntu 18.04 LTS。

![Ubuntu 18.04 LTS apps](/data/attachment/album/201804/17/221349nirzqo6iqmze070r.jpg "Ubuntu 18.04 LTS apps")

### 从 Ubuntu 16.04 LTS 到 Ubuntu 18.04 LTS 有何新变化？

从 Ubuntu 16.04 LTS 到 Ubuntu 18.04 LTS 最显著的变化是我们喜爱的 Unity 用户界面被替换为 GNOME 桌面环境了，虽然 Ubuntu 的开发者们已经尽力将其打造得看起来像 Unity 桌面一样。

GNOME 桌面环境带来了许多视觉变化。最显眼的一个变化是窗口控制按钮现在被移动到了右边。上一个在右边摆放窗口控制按钮的 Ubuntu 版本是 Ubuntu 9.10 （Karmic Koala）。

另一个视觉变化可以在 Nautilus 文件管理器中看到，它现在有个暗色风格的左边栏。LightDM 登录管理器也被替换为 GNOME 的 GDM 显示管理器，并使用了 7 号虚拟终端取代了默认的 1 号虚拟终端。

此外，Ubuntu 18.04 LTS 使用 GNOME 的屏幕虚拟键盘替代了默认的 Onboard 键盘，而预装在现场版 ISO 镜像中的应用也是完全不同的一套，Ubuntu 16.04 LTS 以来新包括在 Ubuntu 18.04 LTS 中应用是 GNOME To Do。

在另一方面，如果你要查看 systemd journal 中的日志的话，“GNOME 日志”替换了原来的系统日志应用；gconf 默认不再安装，它被替换为 gsettings；还有一个变化是从 Ubuntu 16.04 LTS 升级时，Aisleriot 卡牌游戏的记录和设置都会丢失。

其它许多来自 GNOME 家族的应用都进行了 UI 重大重新设计，这包括 “Ubuntu 软件”、“系统设置”、“磁盘用量分析（Baobab）”、Remmina，并且 “GNOME 日历”现在有了周视图和支持重复事件。那些应用现在大多在其应用菜单中有键盘快捷键弹窗。

![Ubuntu 18.04 LTS apps](/data/attachment/album/201804/17/221350ttty0rey4aae02uq.jpg "Ubuntu 18.04 LTS apps")

### Ubuntu 桌面版 32 位镜像没了，Ubuntu GNOME 断篇

现在 GNOME 成为了 Ubunut 默认桌面环境，因此 Ubuntu GNOME 分支就不再继续开发了。Ubuntu GNOME 16.04 用户将自动升级到 Ubuntu 标准版本。如果你安装了 gnome-session 软件包并在登录屏幕选择了 GNOME 的话，仍然可以使用原汁原味的 GNOME 会话。

最后同样重要是的，Canonical 放弃了 Ubuntu 18.04 LTS （Bionic Beaver）版本的 32 位桌面的支持，所以，如果你使用的是 32 位 Ubuntu 16.04 LTS 操作系统，推荐你下载 64 位 Ubuntu 18.04 LTS 镜像并重新安装（当然，你得是 64 位的机器）。

在底层，现在默认安装的是 Python 3，Python 2 不再安装； GPG 二进制现在由 GnuPG2 软件包提供；全新安装的 Ubuntu 系统中用交换文件取代了交换分区；现在是默认的 DNS 解析器是 systemd-resolved；重新打造的图形化安装程序的“加密家目录”选项消失了。

Ubuntu 18.04 LTS （Bionic Beaver）是 Canonical 的第七个长期支持版本，它会得到五年的安全和软件更新支持，直到 2023 年 4 月。最终的 Ubuntu 18.04 LTS 很快就可以下载了，2018 年 4 月 26 日 Ubuntu 16.04 LTS 和 Ubuntu 17.10 用户可以准备升级了。

[![Ubuntu 18.04 LTS apps](/data/attachment/album/201804/17/221350xxp5enaxvlxbo6lo.jpg "Ubuntu 18.04 LTS apps")](https://news-cdn.softpedia.com/images/news2/what-s-new-in-ubuntu-18-04-lts-bionic-beaver-since-ubuntu-16-04-lts-520726-5.jpg "Click to view large image")


什么是 Linux “oops”？

>
> Linux 内核正在盯着你，当它检测到系统上运行的某些东西违反了正常内核行为时，它会关闭系统并发出一个“oops”！
>
>
>

![](/data/attachment/album/201804/18/222759dmq16dgxmjjrrx76.jpg)

如果你检查你的 Linux 系统上运行的进程，你可能会对一个叫做 “kerneloops” 的进程感到好奇。提示一下，它是 “kernel oops”，而不是 “kerne loops”。

坦率地说，“oops” 是 Linux 内核的一部分出现了偏差行为。你有做错了什么吗？可能没有。但有一些不对劲。而那个做了错事的进程可能已经被 CPU 结束。最糟糕的是，内核可能会报错并突然关闭系统。

请注意，“oops” 不是首字母缩略词。它不代表像“<ruby> 面向对象的编程和系统 <rt>  object-oriented programming and systems </rt></ruby>” 或“<ruby> 超出程序规范 <rt>  out of procedural specs </rt></ruby>” 之类的东西。它实际上就是“哎呀” （oops），就像你刚掉下一杯酒或踩在你的猫身上。哎呀！ “oops” 的复数是 “oopses”。

oops 意味着系统上运行的某些东西违反了内核有关正确行为的规则。也许代码尝试采取不允许的代码路径或使用无效指针。不管它是什么，内核 —— 总是在监测进程的错误行为 —— 很可能会阻止特定进程，并将它做了什么的消息写入控制台、 `/var/log/dmesg` 或 `/var/log/kern.log` 中。

oops 可能是由内核本身引起的，也可能是某些进程试图让内核违反在系统上能做的事以及它们被允许做的事。

oops 将生成一个<ruby> 崩溃签名 <rt>  crash signature </rt></ruby>，这可以帮助内核开发人员找出错误并提高代码质量。

系统上运行的 kerneloops 进程可能如下所示：

```
kernoops 881 1 0 Feb11 ? 00:00:01 /usr/sbin/kerneloops

```

你可能会注意到该进程不是由 root 运行的，而是由名为 “kernoops” 的用户运行的，并且它的运行时间极少。实际上，分配给这个特定用户的唯一任务是运行 kerneloops。

```
$ sudo grep kernoops /etc/passwd
kernoops:x:113:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

```

如果你的 Linux 系统不带有 kerneloops（比如 Debian），你可以考虑添加它。查看这个 [Debian 页面](https://packages.debian.org/stretch/kerneloops)了解更多信息。

### 什么时候应该关注 oops？

一般 oops 没什么大不了的。它在一定程度上取决于特定进程所扮演的角色。它也取决于 oops 的类别。

有些 oops 很严重，会导致<ruby> 系统恐慌 <rt>  system panic </rt></ruby>。从技术上讲，系统恐慌是 oops 的一个子集（即更严重的 oops）。当内核检测到的问题足够严重以至于内核认为它（内核）必须立即停止运行以防止数据丢失或对系统造成其他损害时会出现。因此，系统需要暂停并重新启动，以防止任何不一致导致不可用或不可靠。所以系统恐慌实际上是为了保护自己免受不可挽回的损害。

总之，所有的内核恐慌都是 oops，但并不是所有的 oops 都是内核恐慌。

`/var/log/kern.log` 和相关的轮转日志（`/var/log/kern.log.1`、`/var/log/kern.log.2` 等）包含由内核生成并由 syslog 处理的日志。

kerneloops 程序收集并默认将错误信息提交到 <http://oops.kernel.org/>，在那里它会被分析并呈现给内核开发者。此进程的配置详细信息在 `/etc/kerneloops.conf` 文件中指定。你可以使用下面的命令轻松查看设置：

```
$ sudo cat /etc/kerneloops.conf | grep -v ^# | grep -v ^$
[sudo] password for shs:
allow-submit = ask
allow-pass-on = yes
submit-url = http://oops.kernel.org/submitoops.php
log-file = /var/log/kern.log
submit-pipe = /usr/share/apport/kernel_oops

```

在上面的（默认）设置中，内核问题可以被提交，但要求用户获得许可。如果设置为 `allow-submit = always`，则不会询问用户。

调试内核问题是使用 Linux 系统的更高级技巧之一。幸运的是，大多数 Linux 用户很少或从没有经历过 oops 或内核恐慌。不过，知道 kerneloops 这样的进程在系统中执行什么操作，了解可能会报告什么以及系统何时遇到严重的内核冲突也是很好的。

---

via: <https://www.networkworld.com/article/3254778/linux/what-is-a-linux-oops.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


11 个超棒的 Vi 技巧和窍门

Summary: 是否你刚刚接触 Vi 还是想进阶，这些技巧可以很快让你成为高级用户。

是否你刚刚接触 Vi 还是想进阶，这些技巧可以很快让你成为高级用户。

>
> 是否你刚刚接触 Vi 还是想进阶，这些技巧可以很快让你成为高级用户。
>
>
>

![](/data/attachment/album/201804/18/232208rfzo206de393pe3a.jpg)

[Vi](http://ex-vi.sourceforge.net/) 编辑器是 Unix 和像 Linux 这样的类 Unix 系统中 Linux 最流行的编辑器之一。无论您是 vi 新手还是想进阶，这里有 11 个技巧可以增强你使用的方式。

### 编辑

编辑长文本时可能很难受，特别是编辑其中某一行时，需要移动许久才能到这行。这有个很快的方法：

1、 `:set number` 这个命令可是在编辑器左边显示行号。

![](/data/attachment/album/201804/18/232228z4hh6zhlg0dtty6f.png)

您可以在命令行中输入 `vi +26 samp.txt` 命令直接打开文件到达 26 行，在 vi 编辑器中也可以输入 `:26` 跳转到 26 行。

![](/data/attachment/album/201804/18/232228a90mjdmde66r2bc9.png)

### 快速导航

2、 `i` 将工作方式从“命令模式”更改为“输入模式”，并在当前光标位置开始插入内容。

3、 `a` 除了是光标之后开始插入内容，与上面的效果是一样的。

4、 `o` 在光标的下一行位置开始插入内容。

### 删除

如果您发现错误或错别字，能快速的修正是很重要的。好在 Vi 都事先想好了。

了解 Vi 的删除功能，保证你不会意外按下某个键并永久删除一行或多段内容，这点至关重要。

5、 `x` 删除当前光标的字符。

6、 `dd` 删除当前行 （是的，整行内容！)

下面看可怕的部分：`30dd` 从当前行开始删除以下 30 行！使用此命令请慎重。

### 搜索

您可以在“命令模式”搜索关键字，而不用在大量文本内容中手动导航查找特定的单词或内容。

7、 `:/<keyword>` 搜索 `< >` 中的单词并将光标移动到第一个匹配项。

8、 导航到该单词的下一个匹配项，请输入 `n` 并继续按下， 直到找到您要找的内容。

例如，在这个图像中我要搜索包含 `ssh` 的内容， Vi 光标就会突出第一个结果的开始位置。

![](/data/attachment/album/201804/18/232229ybpiss7ubsvubg5p.png)

按下 `n` 之后， Vi 光标就会突出下一个匹配项。

![](/data/attachment/album/201804/18/232229smdfve99gev68zvv.png)

### 保存并退出

开发人员 （或其他人） 可能会发现这个命令很有用。

9、 `:x` 保存您的工作并退出 Vi 。

![](/data/attachment/album/201804/18/232230b8aika8tt4s6tco4.png)

10、 如果你想节省哪怕是纳秒，那么这有个更快的回到终端的方法。不用在键盘上按 `Shift+:` ，而是按下 `Shift+q` （或者大写字母 Q ) 来进入 [Ex 模式](https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes#Ex-mode) 。但是如果你只是想按下 `x` 来保存退出，那就没有什么区别（如上所示）。

### 替换

如果您想将文中的某个单词全部替换为一个单词，这有个很巧妙的招式。例如，如果您想在一个大文件中将 “desktop” 替换为 “laptop” ，那么单调的搜索每个出现的 “desktop” 将其删掉，然后再输入 “laotop” ，是很浪费时间的。

11、 `:%s/desktop/laptop/g` 这个命令将在整个文件中的 “desktop” 用 “laptop” 替换，他就像 Linux 的 `sed` 命令一样。

这个例子中我用 “user” 替换了 “root” ：

![](/data/attachment/album/201804/18/232231m7cg45g55gqauj5c.png)

![](/data/attachment/album/201804/18/232232btht1st8jsltgwzr.png)

这些技巧应该能帮组任何想开始学 Vi 的人。我有遗漏其他巧妙的提示吗？请在评论中分享他们。

---

via: <https://opensource.com/article/18/1/top-11-vi-tips-and-tricks>

作者：[Archit Modi](https://opensource.com/users/architmodi) 译者：[MZqk](https://github.com/MZqk) 校对：[wxy](https://github.com/wxy)

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


如何在Linux的终端测试网速

Summary: 学习如何在 Linux 终端使用命令行工具 speedtest 测试网速，或者仅用一条 python 命令立刻获得网速的测试结果。

直接导致机器卡死，断网也没法恢复，看来只有强制断电重启了

直接导致机器卡死，断网也没法恢复，看来只有强制断电重启了

>
> 学习如何在 Linux 终端使用命令行工具 `speedtest` 测试网速，或者仅用一条 python 命令立刻获得网速的测试结果。
>
>
>

![在Linux终端测试网速](/data/attachment/album/201804/19/011651exdlvgxkssjtjhj3.png)

我们都会在连接到一个新的网络或者 WIFI 的时候去测试网络带宽。 为什么不用我们自己的服务器！下面将会教你如何在 Linux 终端测试网速。

我们多数都会使用 [Ookla 的 Speedtest](http://www.speedtest.net/) 来测试网速。 这在桌面上是很简单的操作，访问他们的网站点击“Go”浏览即可。它将使用最近的服务器来扫描你的本地主机来测试网速。 如果你使用的是移动设备，他们有对应的移动端 APP。但如果你使用的是只有命令行终端，界面的则会有些不同。下面让我们一起看看如何在Linux的终端来测试网速。

如果你只是想偶尔的做一次网速测试而不想去下载测试工具，那么请往下看如何使用命令完成测试。

### 第一步：下载网速测试命令行工具。

首先，你需要从 [GitHub](https://github.com/sivel/speedtest-cli) 上下载 `speedtest` 命令行工具。现在，它也被包含在许多其它的 Linux 仓库中，如果已经在你的库中，你可以直接[在你的 Linux 发行版上进行安装](https://kerneltalks.com/tools/package-installation-linux-yum-apt/)。

让我们继续下载和安装过程，安装的 git 包取决于你的 Linux 发行版。然后按照下面的方法来克隆 Github speedtest 存储库

```
[root@kerneltalks ~]# git clone https://github.com/sivel/speedtest-cli.git
Cloning into 'speedtest-cli'...
remote: Counting objects: 913, done.
remote: Total 913 (delta 0), reused 0 (delta 0), pack-reused 913
Receiving objects: 100% (913/913), 251.31 KiB | 143.00 KiB/s, done.
Resolving deltas: 100% (518/518), done.

```

它将会被克隆到你当前的工作目录，新的名为 `speedtest-cli` 的目录将会被创建，你将在新的目录下看到如下的文件。

```
[root@kerneltalks ~]# cd speedtest-cli
[root@kerneltalks speedtest-cli]# ll
total 96
-rw-r--r--. 1 root root  1671 Oct  7 16:55 CONTRIBUTING.md
-rw-r--r--. 1 root root 11358 Oct  7 16:55 LICENSE
-rw-r--r--. 1 root root    35 Oct  7 16:55 MANIFEST.in
-rw-r--r--. 1 root root  5215 Oct  7 16:55 README.rst
-rw-r--r--. 1 root root    20 Oct  7 16:55 setup.cfg
-rw-r--r--. 1 root root  3196 Oct  7 16:55 setup.py
-rw-r--r--. 1 root root  2385 Oct  7 16:55 speedtest-cli.1
-rw-r--r--. 1 root root  1200 Oct  7 16:55 speedtest_cli.py
-rwxr-xr-x. 1 root root 47228 Oct  7 16:55 speedtest.py
-rw-r--r--. 1 root root   333 Oct  7 16:55 tox.ini

```

名为 `speedtest.py` 的 Python 脚本文件就是用来测试网速的。

你可以将这个脚本链接到 `/usr/bin` 下，以便这台机器上的所有用户都能使用。或者你可以为这个脚本创建一个[命令别名](https://kerneltalks.com/commands/command-alias-in-linux-unix/)，这样就能让所有用户很容易使用它。

### 运行 Python 脚本

现在，直接运行这个脚本，不需要添加任何参数，它将会搜寻最近的服务器来测试你的网速。

```
[root@kerneltalks speedtest-cli]# python speedtest.py
Retrieving speedtest.net configuration...
Testing from Amazon (35.154.184.126)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Spectra (Mumbai) [1.15 km]: 8.174 ms
Testing download speed................................................................................
Download: 548.13 Mbit/s
Testing upload speed................................................................................................
Upload: 323.95 Mbit/s

```

Oh！ 不要被这个网速惊讶道。我在 AWE EX2 的服务器上。那是亚马逊数据中心的网速！

### 这个脚本可以添加有不同的选项。

下面的几个选项对这个脚本可能会很有用处：

**要搜寻你附近的网路测试服务器**，使用 `--list` 和 `grep` 加上地名来列出所有附近的服务器。

```
[root@kerneltalks speedtest-cli]#  python speedtest.py --list | grep -i mumbai
 2827) Bharti Airtel Ltd (Mumbai, India) [1.15 km]
 8978) Spectra (Mumbai, India) [1.15 km]
 4310) Hathway Cable and Datacom Ltd (Mumbai, India) [1.15 km]
 3315) Joister Broadband (Mumbai, India) [1.15 km]
 1718) Vodafone India (Mumbai, India) [1.15 km]
 6454) YOU Broadband India Pvt Ltd. (Mumbai, India) [1.15 km]
 9764) Railtel Corporation of india Ltd (Mumbai, India) [1.15 km]
 9584) Sheng Li Telecom (Mumbai, India) [1.15 km]
 7605) Idea Cellular Ltd. (Mumbai, India) [1.15 km]
 8122) Sify Technologies Ltd (Mumbai, India) [1.15 km]
 9049) I-ON (Mumbai, India) [1.15 km]
 6403) YOU Broadband India Pvt Ltd., Mumbai (Mumbai, India) [1.15 km]

```

然后你就能从搜寻结果中看到，第一列是服务器识别号，紧接着是公司的名称和所在地，最后是离你的距离。

**如果要使用指定的服务器来测试网速**，后面跟上 `--server` 加上服务器的识别号。

```
[root@kerneltalks speedtest-cli]# python speedtest.py --server 2827
Retrieving speedtest.net configuration...
Testing from Amazon (35.154.184.126)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Bharti Airtel Ltd (Mumbai) [1.15 km]: 13.234 ms
Testing download speed................................................................................
Download: 93.47 Mbit/s
Testing upload speed................................................................................................
Upload: 69.25 Mbit/s

```

**如果想得到你的测试结果的分享链接**，使用 `--share`，你将会得到测试结果的链接。

```
[root@kerneltalks speedtest-cli]# python speedtest.py --share
Retrieving speedtest.net configuration...
Testing from Amazon (35.154.184.126)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Spectra (Mumbai) [1.15 km]: 7.471 ms
Testing download speed................................................................................
Download: 621.00 Mbit/s
Testing upload speed................................................................................................
Upload: 367.37 Mbit/s
Share results: http://www.speedtest.net/result/6687428141.png

```

输出中的最后一行就是你的测试结果的链接。下载下来的图片内容如下 :

![](/data/attachment/album/201804/19/011757vecetexm88oxox88.png)

这就是全部的过程！如果你不想了解这些技术细节，你也可以使用如下的一行命令迅速测出你的网速。

### 要想在终端使用一条命令测试网速。

我们将使用 `curl` 工具来在线抓取上面使用的 Python 脚本然后直接用 Python 执行脚本。

```
[root@kerneltalks ~]# curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -

```

上面的脚本将会运行脚本输出结果到屏幕上。

```
[root@kerneltalks speedtest-cli]# curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -
Retrieving speedtest.net configuration...
Testing from Amazon (35.154.184.126)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Spectra (Mumbai) [1.15 km]: 12.599 ms
Testing download speed................................................................................
Download: 670.88 Mbit/s
Testing upload speed................................................................................................
Upload: 355.84 Mbit/s

```

这是在 RHEL 7 上执行的结果，在 Ubuntu、Debian、Fedora 或者 CentOS 上一样可以执行。

---

via: <https://kerneltalks.com/tips-tricks/how-to-test-internet-speed-in-linux-terminal/>

作者：[Shrikant Lavhate](https://kerneltalks.com) 译者：[FelixYFZ](https://github.com/FelixYFZ) 校对：[wxy](https://github.com/wxy)

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


Linux 系统中 sudo 命令的 10 个技巧

Summary: sudo 表示 “superuser do”。 它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而，大部分时候我们用它来以提升的权限来运行命令。

![](/data/attachment/album/201804/19/014018aaiy499x4ygca02x.jpg)

### 概览

`sudo` 表示 “**s**uper**u**ser **do**”。 它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而，大部分时候我们用它来以提升的权限来运行命令。

`sudo` 命令与安全策略配合使用，默认安全策略是 `sudoers`，可以通过文件 `/etc/sudoers` 来配置。其安全策略具有高度可拓展性。人们可以开发和分发他们自己的安全策略作为插件。

### 与 su 的区别

在 GNU/Linux 中，有两种方式可以用提升的权限来运行命令：

* 使用 `su` 命令
* 使用 `sudo` 命令

`su` 表示 “**s**witch **u**ser”。使用 `su`，我们可以切换到 root 用户并且执行命令。但是这种方式存在一些缺点：

* 我们需要与他人共享 root 的密码。
* 因为 root 用户为超级用户，我们不能授予受控的访问权限。
* 我们无法审查用户在做什么。

`sudo` 以独特的方式解决了这些问题。

1. 首先，我们不需要妥协来分享 root 用户的密码。普通用户使用他们自己的密码就可以用提升的权限来执行命令。
2. 我们可以控制 `sudo` 用户的访问，这意味着我们可以限制用户只执行某些命令。
3. 除此之外，`sudo` 用户的所有活动都会被记录下来，因此我们可以随时审查进行了哪些操作。在基于 Debian 的 GNU/Linux 中，所有活动都记录在 `/var/log/auth.log` 文件中。

本教程后面的部分阐述了这些要点。

### 实际动手操作 sudo

现在，我们对 sudo 有了大致的了解。让我们实际动手操作吧。为了演示，我使用 Ubuntu。但是，其它发行版本的操作应该是相同的。

#### 允许 sudo 权限

让我们添加普通用户为 `sudo` 用户吧。在我的情形中，用户名为 `linuxtechi`。

1) 按如下所示编辑 `/etc/sudoers` 文件：

```
$ sudo visudo

```

2) 添加以下行来允许用户 `linuxtechi` 有 sudo 权限：

```
linuxtechi ALL=(ALL) ALL

```

上述命令中：

* `linuxtechi` 表示用户名
* 第一个 `ALL` 指示允许从任何终端、机器访问 `sudo`
* 第二个 `(ALL)` 指示 `sudo` 命令被允许以任何用户身份执行
* 第三个 `ALL` 表示所有命令都可以作为 root 执行

#### 以提升的权限执行命令

要用提升的权限执行命令，只需要在命令前加上 `sudo`，如下所示：

```
$ sudo cat /etc/passwd

```

当你执行这个命令时，它会询问 `linuxtechi` 的密码，而不是 root 用户的密码。

#### 以其他用户执行命令

除此之外，我们可以使用 `sudo` 以另一个用户身份执行命令。例如，在下面的命令中，用户 `linuxtechi` 以用户 `devesh` 的身份执行命令：

```
$ sudo -u devesh whoami
[sudo] password for linuxtechi:
devesh

```

#### 内置命令行为

`sudo` 的一个限制是 —— 它无法使用 Shell 的内置命令。例如， `history` 记录是内置命令，如果你试图用 `sudo` 执行这个命令，那么会提示如下的未找到命令的错误：

```
$ sudo history
[sudo] password for linuxtechi:
sudo: history: command not found

```

**访问 root shell**

为了克服上述问题，我们可以访问 root shell，并在那里执行任何命令，包括 Shell 的内置命令。

要访问 root shell, 执行下面的命令:

```
$ sudo bash

```

执行完这个命令后——您将观察到提示符变为井号（`#`）。

### 技巧

这节我们将讨论一些有用的技巧，这将有助于提高生产力。大多数命令可用于完成日常任务。

#### 以 sudo 用户执行之前的命令

让我们假设你想用提升的权限执行之前的命令，那么下面的技巧将会很有用：

```
$ sudo !4

```

上面的命令将使用提升的权限执行历史记录中的第 4 条命令。

#### 在 Vim 里面使用 sudo 命令

很多时候，我们编辑系统的配置文件时，在保存时才意识到我们需要 root 访问权限来执行此操作。因为这个可能让我们丢失我们对文件的改动。没有必要惊慌，我们可以在 Vim 中使用下面的命令来解决这种情况：

```
:w !sudo tee %

```

上述命令中：

* 冒号 (`:`) 表明我们处于 Vim 的退出模式
* 感叹号 (`!`) 表明我们正在运行 shell 命令
* `sudo` 和 `tee` 都是 shell 命令
* 百分号 (`%`) 表明从当前行开始的所有行

#### 使用 sudo 执行多个命令

至今我们用 `sudo` 只执行了单个命令，但我们可以用它执行多个命令。只需要用分号 (`;`) 隔开命令，如下所示：

```
$ sudo -- bash -c 'pwd; hostname; whoami'

```

上述命令中

* 双连字符 (`--`) 停止命令行切换
* `bash` 表示要用于执行命令的 shell 名称
* `-c` 选项后面跟着要执行的命令

#### 无密码运行 sudo 命令

当第一次执行 `sudo` 命令时，它会提示输入密码，默认情形下密码被缓存 15 分钟。但是，我们可以避免这个操作，并使用 `NOPASSWD` 关键字禁用密码认证，如下所示：

```
linuxtechi ALL=(ALL) NOPASSWD: ALL

```

#### 限制用户执行某些命令

为了提供受控访问，我们可以限制 `sudo` 用户只执行某些命令。例如，下面的行只允许执行 `echo` 和 `ls` 命令 。

```
linuxtechi ALL=(ALL) NOPASSWD: /bin/echo /bin/ls

```

#### 深入了解 sudo

让我们进一步深入了解 `sudo` 命令。

```
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 145040 Jun 13  2017 /usr/bin/sudo

```

如果仔细观察文件权限，则发现 `sudo` 上启用了 setuid 位。当任何用户运行这个二进制文件时，它将以拥有该文件的用户权限运行。在所示情形下，它是 root 用户。

为了演示这一点，我们可以使用 `id` 命令，如下所示：

```
$ id
uid=1002(linuxtechi) gid=1002(linuxtechi) groups=1002(linuxtechi)

```

当我们不使用 `sudo` 执行 `id` 命令时，将显示用户 `linuxtechi` 的 id。

```
$ sudo id
uid=0(root) gid=0(root) groups=0(root)

```

但是，如果我们使用 `sudo` 执行 `id` 命令时，则会显示 root 用户的 id。

### 结论

从这篇文章可以看出 —— `sudo` 为普通用户提供了更多受控访问。使用这些技术，多用户可以用安全的方式与 GNU/Linux 进行交互。

---

via: <https://www.linuxtechi.com/quick-tips-sudo-command-linux-systems/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 译者：[szcf-weiya](https://github.com/szcf-weiya) 校对：[wxy](https://github.com/wxy)

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


八种敏捷团队的提升方法

>
> 在这个列表中，没有项目管理软件，这里不包含清单，也没有与 GitHub 整合，只是几种组织思维和提高团队交流的方法。
>
>
>

![](/data/attachment/album/201804/19/213224wdzr3355oayrfr9i.png)

你也许经常听说下面这句话：工具太多，时间太少。为了节约您的时间，我列出了几款我最常用的提高敏捷团队工作效率的工具。如果你也是一名敏捷主义者，你可能听说过类似的工具，但我这里提到的仅限于开源工具。

**请注意！** 这些工具和你想象的可能有点不同。它们并不是项目管理软件——这领域已经有一篇[好文章](https://opensource.com/business/16/3/top-project-management-tools-2016)了。因此这里不包含清单，也没有与 GitHub 整合，只是几种组织思维和提高团队交流的方法。

### 组建一个充满积极反馈的团队

如果在产业中大部分人都习惯了输出、接收负面消息，就很难有人对同事进行正面反馈的输出。这并不奇怪，当人们乐于给出赞美时，人们就会竞相向别人说“干得漂亮！”、“没有你我们很难完成任务。”赞美别人干的漂亮并不会使你痛苦，它通常能激励大家更好地为团队工作。下面两个软件可以帮助你向同事表达赞扬。

* 对开发团队来说，[Management 3.0](https://management30.com/) 是个有着大量[免费资源](https://management30.com/leadership-resource-hub/)的宝箱，可以尽情使用。其中 Feedback Wraps 的观念最引人注目（不仅仅是因为它让我们联想到墨西哥卷）。 [Feedback Wraps](https://management30.com/en/practice/feedback-wraps/) 是一个经过六步对用户进行反馈的程序，也许你会认为它是为了负面反馈而设计的，但我们发现它在表达积极评论方面十分有效。
* [Happiness Packets](https://happinesspackets.io/) 为用户提供了在开源社区内匿名正面反馈的服务。它尤其适合不太习惯人际交往的用户或是不知道说什么好的情况。Happiness Packets 拥有一份[公开的评论档案](https://www.happinesspackets.io/archive/)（这些评论都已经得到授权分享），你可以浏览大家的评论，从中得到灵感，对别人做出暖心的称赞。它还有个特殊功能，能够屏蔽恶意消息。

### 思考工作的意义

这很难定义。在敏捷领域中，成功的关键包括定义人物角色和产品愿景，还要向整个敏捷团队说明此项工作的意义。产品开发人员和项目负责人能够获得的开源工具数量极为有限，对于这一点我们有些失望。

在 Rat Hat 公司，最受尊敬也最为常用于训练敏捷团队的开源工具之一是 Product Vision Board 。它出自产品管理专家 Roman Pichler 之手，Roman Pichler 提供了[大量工具和模版](http://www.romanpichler.com/tools/)来帮助敏捷团队理解他们工作的意义。（你需要提供电子邮箱地址才能下载这些工具。）

* [Product Vision Board](http://www.romanpichler.com/tools/vision-board/) 的模版通过简单但有效的问题引导团队转变思考方式，将思考工作的意义置于具体工作方法之前。
* 我们也很喜欢 Roman 的 [Product Management Test](http://www.romanpichler.com/tools/romans-product-management-test/)，它能够通过简便快捷的网页表单，引领团队重新定义产品开发人员的角色，并且找出程序漏洞。我们推荐产品开发团队周期性地完成此项测试，重新分析失败原因。

### 对工作内容的直观化

你是否曾为一个大案子焦头烂额，连熟悉的步骤也在脑海中乱成一团？我们也遇到过这种情况。使用思维导图可以梳理你脑海中的想法，使其直观化。你不需要一下就想出整件事该怎么进行，你只需要你的头脑，一块白板（或者是思维导图软件）和一些思考的时间。

* 在这个领域中我们最喜欢的开源工具是 [Xmind3](https://sourceforge.net/projects/xmind3/?source=recommended)。它支持多种平台运行（Linux、MacOS 和 Windows），以便与他人共享文件。如果你对工具的要求很高，推荐使用[其更新版本](http://www.xmind.net/)，提供电子邮箱地址即可免费下载使用。
* 如果你很看重灵活性，Eduard Lucena 在 Fedora Magazine 中提供的 [三个附加选项](https://fedoramagazine.org/three-mind-mapping-tools-fedora/) 就十分适合。你可以在 Fedora 杂志上找到这些软件的获取方式，其他信息可以在它们的项目页找到。

	+ [Labyrinth](https://people.gnome.org/%7Edscorgie/labyrinth.html)
	+ [View Your Mind](http://www.insilmaril.de/vym/)
	+ [FreeMind](http://freemind.sourceforge.net/wiki/index.php/Main_Page)

像我们开头说的一样，提高敏捷团队工作效率的工具有很多，如果你有特别喜欢的相关开源工具，请在评论中与大家分享。

### 作者简介

Jen Krieger ：Red Hat 的首席敏捷架构师，在软件开发领域已经工作超过 20 年，曾在瀑布及敏捷生命周期等领域扮演多种角色。目前在 Red Hat 负责针对 CI/CD 最佳效果的部际 DevOps 活动。最近她在与 Project Atomic & OpenShift 团队合作。她最近在引领公司向着敏捷团队改革，并增加开源项目在公司内的认知度。

---

via: <https://opensource.com/article/18/1/foss-tools-agile-teams>

作者：[Jen Krieger](https://opensource.com/users/jkrieger) 译者：[Valoniakim](https://github.com/Valoniakim) 校对：[wxy](https://github.com/wxy)

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


初识 Python： global 关键字

Summary: 在 Python 中，global 关键字允许你修改当前范围之外的变量。它用于创建全局变量并在本地上下文中更改变量。

![](/data/attachment/album/201804/19/214422wfy7pvmx4c61ykvq.jpg)

在读这篇文章之前，确保你对 [Python 全局、局部和非局部变量](https://www.programiz.com/python-programming/global-local-nonlocal-variables) 有一定的基础。

### global 关键字简介

在 Python 中，`global` 关键字允许你修改当前范围之外的变量。它用于创建全局变量并在本地上下文中更改变量。

### global 关键字的规则

在 Python 中，有关 `global` 关键字基本规则如下：

* 当我们在一个函数中创建一个变量时，默认情况下它是本地变量。
* 当我们在一个函数之外定义一个变量时，默认情况下它是全局变量。你不必使用 `global` 关键字。
* 我们使用 `global` 关键字在一个函数中来读写全局变量。
* 在一个函数外使用 `global` 关键字没有效果。

### 使用 global 关键字（含示例）

我们来举个例子。

#### 示例 1：从函数内部访问全局变量

```
c = 1 # 全局变量
def add():
    print(c)

add()

```

运行程序，输出为：

```
1

```

但是我们可能有一些场景需要从函数内部修改全局变量。

#### 示例 2：在函数内部修改全局变量

```
c = 1 # 全局变量
def add():
    c = c + 2 # 将 c 增加 2
    print(c)
add()

```

运行程序，输出显示错误：

```
UnboundLocalError: local variable 'c' referenced before assignment

```

这是因为在函数中，我们只能访问全局变量但是不能修改它。

解决的办法是使用 `global` 关键字。

#### 示例 3：使用 global 在函数中改变全局变量

```
c = 0 # global variable

def add():
    global c
    c = c + 2 # 将 c 增加 2
    print("Inside add():", c)

add()
print("In main:", c)

```

运行程序，输出为：

```
Inside add(): 2
In main: 2

```

在上面的程序中，我们在 `add()` 函数中定义了 `c` 将其作为全局关键字。

然后，我们给变量 `c` 增加 `2`，即 `c = c + 2`。之后，我们调用了 `add()` 函数。最后，打印全局变量 `c`。

正如我们所看到的，在函数外的全局变量也发生了变化，`c = 2`。

### Python 模块中的全局变量

在 Python 中，我们创建一个单独的模块 `config.py` 来保存全局变量并在同一个程序中的 Python 模块之间共享信息。

以下是如何通过 Python 模块共享全局变量。

#### 示例 4：在Python模块中共享全局变量

创建 `config.py` 文件来存储全局变量

```
a = 0
b = "empty"

```

创建 `update.py` 文件来改变全局变量

```
import config

config.a = 10
config.b = "alphabet"

```

创建 `main.py` 文件来测试其值的变化

```
import config
import update

print(config.a)
print(config.b)

```

运行 `main.py`，输出为：

```
10
alphabet

```

在上面，我们创建了三个文件： `config.py`, `update.py` 和 `main.py`。

在 `config.py` 模块中保存了全局变量 `a` 和 `b`。在 `update.py` 文件中，我们导入了 `config.py` 模块并改变了 `a` 和 `b` 的值。同样，在 `main.py` 文件，我们导入了 `config.py` 和 `update.py` 模块。最后，我们打印并测试全局变量的值，无论它们是否被改变。

### 在嵌套函数中的全局变量

以下是如何在嵌套函数中使用全局变量。

#### 示例 5：在嵌套函数中使用全局变量

```
def foo():
    x = 20
    def bar():
         global x
         x = 25

    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x)

foo()
print("x in main : ", x)

```

输出为：

```
Before calling bar: 20
Calling bar now
After calling bar: 20
x in main : 25

```

在上面的程序中，我们在一个嵌套函数 `bar()` 中声明了全局变量。在 `foo()` 函数中， 变量 `x` 没有全局关键字的作用。

调用 `bar()` 之前和之后， 变量 `x` 取本地变量的值，即 `x = 20`。在 `foo()` 函数之外，变量 `x` 会取在函数 `bar()` 中的值，即 `x = 25`。这是因为在 `bar()` 中，我们对 `x` 使用 `global` 关键字创建了一个全局变量（本地范围）。

如果我们在 `bar()` 函数内进行了任何修改，那么这些修改就会出现在本地范围之外，即 `foo()`。

---

via: <https://www.programiz.com/python-programming/global-keyword>

作者：[programiz](https://www.programiz.com) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


13 个 Git 技巧献给 Git 13 岁生日

Summary: 这 13 个 Git 技巧将使你的版本控制技能 +1、+1、+1……

这 13 个 Git 技巧将使你的版本控制技能 +1、+1、+1……

>
> 这 13 个 Git 技巧将使你的版本控制技能 +1、+1、+1……
>
>
>

![](/data/attachment/album/201804/20/162427h1tuyumjtud0y1zz.jpg)

[Git](https://git-scm.com/) 是一个分布式版本控制系统，它已经成为开源世界中源代码控制的默认工具，在 4 月 7 日这天，它 13 岁了。使用 Git 令人沮丧的事情之一是你需要知道更多才能有效地使用 Git。但这也可能是使用 Git 比较美妙的一件事，因为没有什么比发现一个新技巧来简化或提高你的工作流的效率更令人快乐了。

为了纪念 Git 的 13 岁生日，这里有 13 条技巧和诀窍来让你的 Git 经验更加有用和强大。从你可能忽略的一些基本知识开始，并扩展到一些真正的高级用户技巧！

### 1、 你的 ~/.gitconfig 文件

当你第一次尝试使用 `git` 命令向仓库提交一个更改时，你可能会收到这样的欢迎信息：

```
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"

  git config --global user.name "Your Name"

to set your account's default identity.

```

你可能没有意识到正是这些命令在修改 `~/.gitconfig` 的内容，这是 Git 存储全局配置选项的地方。你可以通过 `~/.gitconfig` 文件来做大量的事，包括定义别名、永久性打开（或关闭）特定命令选项，以及修改 Git 工作方式（例如，`git diff` 使用哪个 diff 算法，或者默认使用什么类型的合并策略）。你甚至可以根据仓库的路径有条件地包含其他配置文件！所有细节请参阅 `man git-config`。

### 2、 你仓库中的 .git/config 文件

在之前的技巧中，你可能想知道 `git config` 命令中 `--global` 标志是干什么的。它告诉 Git 更新 `~/.gitconfig` 中的“全局”配置。当然，有全局配置也意味着会有本地配置，显然，如果你省略 `--global` 标志，`git config` 将改为更新仓库特有的配置，该配置存储在 `.git/config` 中。

在 `.git/config` 文件中设置的选项将覆盖 `~/.gitconfig` 文件中的所有设置。因此，例如，如果你需要为特定仓库使用不同的电子邮件地址，则可以运行 `git config user.email "also_you@example.com"`。然后，该仓库中的任何提交都将使用你单独配置的电子邮件地址。如果你在开源项目中工作，而且希望它们显示自己的电子邮件地址，同时仍然使用自己工作邮箱作为主 Git 配置，这非常有用。

几乎任何你可以在 `~/.gitconfig` 中设置的东西，你也可以在 `.git/config` 中进行设置，以使其作用于特定的仓库。在下面的技巧中，当我提到将某些内容添加到 `~/.gitconfig` 时，只需记住你也可以在特定仓库的 `.git/config` 中添加来设置那个选项。

### 3、 别名

别名是你可以在 `~/.gitconfig` 中做的另一件事。它的工作原理就像命令行中的 shell —— 它们设定一个新的命令名称，可以调用一个或多个其他命令，通常使用一组特定的选项或标志。它们对于那些你经常使用的又长又复杂的命令来说非常有效。

你可以使用 `git config` 命令来定义别名 —— 例如，运行 `git config --global --add alias.st status` 将使运行 `git st` 与运行 `git status` 做同样的事情 —— 但是我在定义别名时发现，直接编辑 `~/.gitconfig` 文件通常更容易。

如果你选择使用这种方法，你会发现 `~/.gitconfig` 文件是一个 [INI 文件](https://en.wikipedia.org/wiki/INI_file)。INI 是一种带有特定段落的键值对文件格式。当添加一个别名时，你将改变 `[alias]` 段落。例如，定义上面相同的 `git st` 别名时，添加如下到文件：

```
[alias]
st = status

```

（如果已经有 `[alias]` 段落，只需将第二行添加到现有部分。）

### 4、 shell 命令中的别名

别名不仅仅限于运行其他 Git 子命令 —— 你还可以定义运行其他 shell 命令的别名。这是一个用来处理一个反复发生的、罕见和复杂的任务的很好方式：一旦你确定了如何完成它，就可以在别名下保存该命令。例如，我有一些<ruby> 复刻 <rt>  fork </rt></ruby>的开源项目的仓库，并进行了一些本地修改。我想跟上项目正在进行的开发工作，并保存我本地的变化。为了实现这个目标，我需要定期将来自上游仓库的更改合并到我复刻的项目中 —— 我通过使用我称之为 `upstream-merge` 的别名来完成。它是这样定义的：

```
upstream-merge = !"git fetch origin -v && git fetch upstream -v && git merge upstream/master && git push"

```

别名定义开头的 `!` 告诉 Git 通过 shell 运行这个命令。这个例子涉及到运行一些 `git` 命令，但是以这种方式定义的别名可以运行任何 shell 命令。

（注意，如果你想复制我的 `upstream-merge` 别名，你需要确保你有一个名为 `upstream` 的 Git 远程仓库，指向你已经分配的上游仓库，你可以通过运行 `git remote add upstream <URL to repo>` 来添加一个。）

### 5、 可视化提交图

如果你在一个有很多分支活动的项目上开发，有时可能很难掌握所有正在发生的工作以及它们之间的相关性。各种图形用户界面工具可让你获取不同分支的图片并在所谓的“提交图表”中提交。例如，以下是我使用 [GitLab](https://gitlab.com/) 提交图表查看器可视化的我的一个仓库的一部分：

![GitLab commit graph viewer](/data/attachment/album/201804/20/162443um677p6j31bq7wmm.png "GitLab commit graph viewer")

如果你是一个专注于命令行的用户或者发现分支切换工具让人分心，那么可以从命令行获得类似的提交视图。这就是 `git log` 命令的 `--graph` 参数出现的地方：

![Repository visualized with --graph command](/data/attachment/album/201804/20/162444d1110dn3bb1t1dn0.png "Repository visualized with --graph command")

以下命令可视化相同仓库可达到相同效果：

```
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

```

`--graph` 选项将图添加到日志的左侧，`--abbrev-commit` 缩短提交的 [SHA](https://en.wikipedia.org/wiki/Secure_Hash_Algorithms) 值，`--date=relative` 以相对方式表示日期，以及 `--pretty` 来处理所有其他自定义格式。我有个 `git lg` 别名用于这个功能，它是我最常用的 10 个命令之一。

### 6、 更优雅的强制推送

有时，你越是想避开越避不开，你会发现你需要运行 `git push --force` 来覆盖仓库远程副本上的历史记录。你可能得到了一些反馈，需要你进行交互式<ruby> 变基 <rt>  rebase </rt></ruby>，或者你可能已经搞砸了，并希望隐藏“罪证”。

当其他人在仓库的远程副本的同一分支上进行更改时，会发生强制推送的危险。当你强制推送已重写的历史记录时，这些提交将会丢失。这就是 `git push --force-with-lease` 出现的原因 -- 如果远程分支已经更新，它不会允许你强制推送，这确保你不会丢掉别人的工作。

### 7、 git add -N

你是否使用过 `git commit -a` 在一次行动中提交所有未完成的修改，但在你推送完提交后才发现 `git commit -a` 忽略了新添加的文件？你可以使用 `git add -N` (想想 “notify”) 来解决这个问题，告诉 Git 在第一次实际提交它们之前，你希望在提交中包含新增文件。

### 8、 git add -p

使用 Git 时的最佳做法是确保每次提交都只包含一个逻辑修改 —— 无论这是修复错误还是添加新功能。然而，有时当你在工作时，你的仓库中的修改最终应该使用多个提交。你怎样才能设法把事情分开，使每个提交只包含适当的修改呢？`git add --patch` 来拯救你了！

这个标志会让 `git add` 命令查看你工作副本中的所有变化，并为每个变化询问你是否想要将它提交、跳过，或者推迟决定（你可以在运行该命令后选择 `?` 来查看其他更强大的选项）。`git add -p` 是生成结构良好的提交的绝佳工具。

### 9、 git checkout -p

与 `git add -p` 类似，`git checkout` 命令也接受 `--patch` 或 `-p` 选项，这会使其在本地工作副本中显示每个“大块”的改动，并允许丢弃它 —— 简单来说就是将本地工作副本恢复到更改之前的状态。

这真的很棒。例如，当你追踪一个 bug 时引入了一堆调试日志语句，修正了这个 bug 之后，你可以先使用 `git checkout -p` 移除所有新的调试日志，然后 `git add -p` 来添加 bug 修复。没有比组合一个优雅的、结构良好的提交更令人满意！

### 10、 变基时执行命令

有些项目有一个规则，即存储库中的每个提交都必须处于可工作状态 —— 也就是说，在每次提交时，应该可以编译该代码，或者应该运行测试套件而不会失败。 当你在分支上工作时，这并不困难，但是如果你最终因为某种原因需要<ruby> 变基 <rt>  rebase </rt></ruby>时，那么需要逐步完成每个变基的提交以确保你没有意外地引入一个中断，而这个过程是乏味的。

幸运的是，`git rebase` 已经覆盖了 `-x` 或 `--exec` 选项。`git rebase -x <cmd>` 将在每个提交在变基中被应用后运行该命令。因此，举个例子，如果你有一个项目，其中使用 `npm run tests` 运行你的测试套件，`git rebase -x npm run tests` 将在变基期间每次提交之后运行测试套件。这使你可以查看测试套件是否在任何变基的提交中失败，以便你可以确认测试套件在每次提交时仍能通过。

### 11、 基于时间的修订引用

很多 Git 子命令都接受一个修订参数来决定命令作用于仓库的哪个部分，可以是某次特定的提交的 SHA1 值，一个分支的名称，甚至是一个符号性的名称如 `HEAD`（代表当前检出分支最后一次的提交），除了这些简单的形式以外，你还可以附加一个指定的日期或时间作为参数，表示“这个时间的引用”。

这个功能在某些时候会变得十分有用。当你处理最新出现的 bug，自言自语道：“这个功能昨天还是好好的，到底又改了些什么”，不用盯着满屏的 `git log` 的输出试图弄清楚什么时候更改了提交，你只需运行 `git diff HEAD@{yesterday}`，看看从昨天以来的所有修改。这也适用于更长的时间段（例如 `git diff HEAD@{'2 months ago'}`），以及一个确切的日期（例如 `git diff HEAD@{'2010-01-01 12:00:00'}`）。

你也可以将这些基于日期的修订参数与使用修订参数的任何 Git 子命令一起使用。在 `gitrevisions` 手册页中有关于具体使用哪种格式的详细信息。

### 12、 全知的 reflog

你是不是试过在变基时干掉过某次提交，然后发现你需要保留那个提交中一些东西？你可能觉得这些信息已经永远找不回来了，只能重新创建。但是如果你在本地工作副本中提交了，提交就会被添加到引用日志（reflog）中 ，你仍然可以访问到。

运行 `git reflog` 将在本地工作副本中显示当前分支的所有活动的列表，并为你提供每个提交的 SHA1 值。一旦发现你变基时放弃的那个提交，你可以运行 `git checkout <SHA1>` 跳转到该提交，复制任何你需要的信息，然后再运行 `git checkout HEAD` 返回到分支最近的提交去。

### 13、 自己清理

哎呦！ 事实证明，我的基本数学技能不如我的 Git 技能。 Git 最初是在 2005 年发布的，这意味着它今年会变成 13 岁，而不是 12 岁（LCTT 译注：本文原来是以 12 岁生日为题的）。为了弥补这个错误，这里有可以让我们变成十三岁的第 13 条技巧。

如果你使用基于分支的工作流，随着在一个长期项目上的工作，除非你在每个分支合并时清理干净，否则你最终会得到一大堆分支。这使得你难于找到想要的分支，分支的森林会让你无从找起。甚至更糟糕的是，如果你有大量活跃的分支，确定一个分支是否被合并（可以被安全删除）或仍然没有被合并而应该留下会非常繁琐。幸运的是，Git 可以帮到你：只需要运行 `git branch --merged` 就可以得到已经被合并到你的当前分支的分支列表，或者 `git branch --no-merged` 找出被合并到其它分支的分支。默认情况下这会列出你本地工作副本的分支，但是如果你在命令行包括 `--remote` 或 `-r` 参数，它也会列出仅存于远程仓库的已合并分支。

重要提示：如果你计划使用 `git branch --merged` 的输出来清理那些已合并的分支，你要小心它的输出也包括了当前分支（毕竟，这个当前的分支就被合并到当前分支！）。确保你在任何销毁动作之前排除了该分支（如果你忘记了，参见第 12 条技巧来学习 reflog 怎样帮你把分支找回来，希望有用……）。

### 以上是全部内容

希望这些技巧中至少有一个能够教给你一些关于 Git 的新东西，Git 是一个有 13 年历史的项目，并且在持续创新和增加新功能中。你最喜欢的 Git 技巧是什么？

---

via: <https://opensource.com/article/18/4/git-tips>

作者：[John SJ Anderson](https://opensource.com/users/genehack) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


Fedora 社区的持续集成

Summary: 持续集成（CI） 是为项目的每一项变更运行测试的过程，如同这是新的交付项目一样。如果持续执行，这意味着软件随时可以发布。

![](/data/attachment/album/201804/20/223151pom3st3qorrbstcr.jpg)

<ruby> 持续集成 <rt>  Continuous Integration </rt></ruby>（CI） 是为项目的每一项变更运行测试的过程，如同这是新的交付项目一样。如果持续执行，这意味着软件随时可以发布。 CI 是整个 IT 行业以及自由开源项目非常成熟的流程。Fedora 在这方面有点落后，但我们正在赶上。阅读以下内容了解进展。

### 我们为什么需要这个？

CI 将全面改善 Fedora。它通过尽早揭示 bug 提供更稳定和一致的操作系统。它让你在遇到问题时添加测试，以免再次发生（避免回归）。CI 可以运行来自上游的项目测试，还有测试集成在发行版中 Fedora 特定的测试。

最重要的是，一致的 CI 能自动化并减少手工劳动。它释放了我们宝贵的志愿者和贡献者，让他们将更多时间花在 Fedora 的新事物上。

### 它看起来如何？

对于初学者，我们将对在 Fedora 包仓库 （dist-git） 的每个提交运行测试。这些测试独立于构建时运行的每个软件包的测试。但是，它们在尽可能接近 Fedora 用户运行环境的环境中测试软件包的功能。除了特定的软件包测试外，Fedora 还运行一些发行版测试，例如从 F27 升级到 F28 或者全新安装。

软件包根据测试结果进行“控制”：测试失败会阻止将更新推送给用户。但是，有时由于各种原因，测试会失败。也许测试本身是错误的，或者不是最新的软件。或者可能发生基础架构问题，并阻止测试正常运行。维护人员能够重新触发测试或放弃测试结果，直到测试更新。

最终，当在 <https://src.fedoraproject.org> 上有合并请求或者更新时，Fedora 的 CI 将运行测试。这将使维护者了解建议的更改对包稳定性的影响，并帮助他们决定如何进行。

### 我们如今有什么？

目前，CI 管道在 Fedora Atomic Host 的部分软件包上运行测试。其他软件包可以在 dist-git 中进行测试，但它们不会自动运行。发行版特定的测试已经在我们所有的软件包上运行。这些测试结果被用于过滤测试失败的软件包。

### 我该如何参与？

最好的入门方法是阅读关于 [Fedora 持续集成](http://fedoraproject.org/wiki/CI)的文档。你应该熟悉[标准测试接口](http://fedoraproject.org/wiki/CI/Standard_Test_Interface)，它描述了很多术语以及如何编写测试和使用现有的测试。

有了这些知识，如果你是一个软件包维护者，你可以开始添加测试到你的软件包。你可以在本地或虚拟机上运行它们。 （对于破坏性测试来说后者是明智的！）

标准测试接口使测试保持一致。因此，你可以轻松地将任何测试添加到你喜欢的包中，并在 [仓库][3](https://src.fedoraproject.org) 提交合并请求给维护人员。

在 irc.freenode.net 上与 #fedora-ci 联系，提供反馈，问题或关于 CI 的一般性讨论。

---

via: <https://fedoramagazine.org/continuous-integration-fedora/>

作者：[Pierre-Yves Chibon](https://fedoramagazine.org) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


迁移到 Linux：命令行环境

Summary: 刚接触 Linux？在这篇教程中将学习如何轻松地在命令行列出、移动和编辑文件。

刚接触 Linux？在这篇教程中将学习如何轻松地在命令行列出、移动和编辑文件。

>
> 刚接触 Linux？在这篇教程中将学习如何轻松地在命令行列出、移动和编辑文件。
>
>
>

![](/data/attachment/album/201804/20/230316yo92hnh3ng7y23c3.jpg)

这是关于迁徙到 Linux 系列的第四篇文章了。如果您错过了之前的内容，可以回顾我们之前谈到的内容 [新手之 Linux](/article-9212-1.html)、[文件和文件系统](/article-9213-1.html)、和 [图形环境](/article-9293-1.html)。Linux 无处不在，它可以用于运行大部分的网络服务器，如 Web、email 和其他服务器；它同样可以在您的手机、汽车控制台和其他很多设备上使用。现在，您可能会开始好奇 Linux 系统，并对学习 Linux 的工作原理萌发兴趣。

在 Linux 下，命令行非常实用。Linux 的桌面系统中，尽管命令行只是可选操作，但是您依旧能看见很多朋友开着一个命令行窗口和其他应用窗口并肩作战。在互联网服务器上和在设备中运行 Linux 时（LCTT 译注：指 IoT），命令行通常是唯一能直接与操作系统交互的工具。因此，命令行是有必要了解的，至少应当涉猎一些基础命令。

在命令行（通常称之为 Linux shell）中，所有操作都是通过键入命令完成。您可以执行查看文件列表、移动文件位置、显示文件内容、编辑文件内容等一系列操作，通过命令行，您甚至可以查看网页中的内容。

如果您在 Windows（CMD 或者 PowerShell） 上已经熟悉关于命令行的使用，您是否想跳转到“Windows 命令行用户”的章节上去？先阅读这些内容吧。

### 导航

在命令行中，这里有一个当前工作目录（文件夹和目录是同义词，在 Linux 中它们通常都被称为目录）的概念。如果没有特别指定目录，许多命令的执行会在当前目录下生效。比如，键入 `ls` 列出文件目录，当前工作目录的文件将会被列举出来。看一个例子：

```
$ ls
Desktop Documents Downloads Music Pictures README.txt Videos

```

`ls Documents` 这条命令将会列出 `Documents` 目录下的文件：

```
$ ls Documents
report.txt todo.txt EmailHowTo.pdf

```

通过 `pwd` 命令可以显示当前您的工作目录。比如：

```
$ pwd
/home/student

```

您可以通过 `cd` 命令改变当前目录并切换到您想要抵达的目录。比如：

```
$ pwd
/home/student
$ cd Downloads
$ pwd
/home/student/Downloads

```

路径中的目录由 `/`（左斜杠）字符分隔。路径中有一个隐含的层次关系，比如 `/home/student` 目录中，home 是顶层目录，而 `student` 是 `home` 的子目录。

路径要么是绝对路径，要么是相对路径。绝对路径由一个 `/` 字符打头。

相对路径由 `.` 或者 `..` 开始。在一个路径中，一个 `.` 意味着当前目录，`..` 意味着当前目录的上级目录。比如，`ls ../Documents` 意味着在此寻找当前目录的上级名为 `Documents` 的目录：

```
$ pwd
/home/student
$ ls
Desktop Documents Downloads Music Pictures README.txt Videos
$ cd Downloads
$ pwd
/home/student/Downloads
$ ls ../Documents
report.txt todo.txt EmailHowTo.pdf

```

当您第一次打开命令行窗口时，您当前的工作目录被设置为您的家目录，通常为 `/home/<您的登录名>`。家目录专用于登录之后存储您的专属文件。

环境变量 `$HOME` 会展开为您的家目录，比如：

```
$ echo $HOME
/home/student

```

下表显示了用于目录导航和管理简单的文本文件的一些命令摘要。

![](/data/attachment/album/201804/20/230316jcmjgzmb7ceam7cm.png)

### 搜索

有时我们会遗忘文件的位置，或者忘记了我要寻找的文件名。Linux 命令行有几个命令可以帮助您搜索到文件。

第一个命令是 `find`。您可以使用 `find` 命令通过文件名或其他属性搜索文件和目录。举个例子，当您遗忘了 `todo.txt` 文件的位置，我们可以执行下面的代码：

```
$ find $HOME -name todo.txt
/home/student/Documents/todo.txt

```

`find` 程序有很多功能和选项。一个简单的例子：

```
find <要寻找的目录> -name <文件名>

```

如果这里有 `todo.txt` 文件且不止一个，它将向我们列出拥有这个名字的所有文件的所有所在位置。`find` 命令有很多便于搜索的选项比如类型（文件或是目录等等）、时间、大小和其他一些选项。更多内容您可以同通过 `man find` 获取关于如何使用 `find` 命令的帮助。

您还可以使用 `grep` 命令搜索文件的特定内容，比如：

```
grep "01/02/2018" todo.txt

```

这将为您展示 `todo` 文件中 `01/02/2018` 所在行。

### 获取帮助

Linux 有很多命令，这里，我们没有办法一一列举。授人以鱼不如授人以渔，所以下一步我们将向您介绍帮助命令。

`apropos` 命令可以帮助您查找需要使用的命令。也许您想要查找能够操作目录或是获得文件列表的所有命令，但是您不知道该运行哪个命令。您可以这样尝试：

```
apropos directory

```

要在帮助文档中，得到一个于 `directiory` 关键字的相关命令列表，您可以这样操作：

```
apropos "list open files"

```

这将提供一个 `lsof` 命令给您，帮助您列出打开文件的列表。

当您明确知道您要使用的命令，但是不确定应该使用什么选项完成预期工作，您可以使用 `man` 命令，它是 manual 的缩写。您可以这样使用：

```
man ls

```

您可以在自己的设备上尝试这个命令。它会提供给您关于使用这个命令的完整信息。

通常，很多命令都能够接受 `help` 选项（比如说，`ls --help`），列出命令使用的提示。`man` 页面的内容通常太繁琐，`--help` 选项可能更适合快速浏览。

### 脚本

Linux 命令行中最贴心的功能之一是能够运行脚本文件，并且能重复运行。Linux 命令可以存储在文本文件中，您可以在文件的开头写入 `#!/bin/sh`，后面的行是命令。之后，一旦文件被存储为可执行文件，您就可以像执行命令一样运行脚本文件，比如，

```
--- contents of get_todays_todos.sh ---
#!/bin/sh
todays_date=`date +"%m/%d/%y"`
grep $todays_date $HOME/todos.txt

```

脚本可以以一套可重复的步骤自动化执行特定命令。如果需要的话，脚本也可以很复杂，能够使用循环、判断语句等。限于篇幅，这里不细述，但是您可以在网上查询到相关信息。

### Windows 命令行用户

如果您对 Windows CMD 或者 PowerShell 程序很熟悉，在命令行输入命令应该是轻车熟路的。然而，它们之间有很多差异，如果您没有理解它们之间的差异可能会为之困扰。

首先，在 Linux 下的 `PATH` 环境与 Windows 不同。在 Windows 中，当前目录被认为是该搜索路径（`PATH`）中的第一个文件夹，尽管该目录没有在环境变量中列出。而在 Linux 下，当前目录不会明确的放在搜索路径中。Linux 下设置环境变量会被认为是风险操作。在 Linux 的当前目录执行程序，您需要使用 `./`（代表当前目录的相对目录表示方式） 前缀。这可能会搞糊涂很多 CMD 用户。比如：

```
./my_program

```

而不是

```
my_program

```

另外，在 Windows 环境变量的路径中是以 `;`（分号） 分割的。在 Linux 中，由 `:` 分割环境变量。同样，在 Linux 中路径由 `/` 字符分隔，而在 Windows 目录中路径由 `\` 字符分割。因此 Windows 中典型的环境变量会像这样：

```
PATH="C:\Program Files;C:\Program Files\Firefox;"

```

而在 Linux 中看起来像这样：

```
PATH="/usr/bin:/opt/mozilla/firefox"

```

还要注意，在 Linux 中环境变量由 `$` 拓展，而在 Windows 中您需要使用百分号（就是这样： `%PATH%`）。

在 Linux 中，通过 `-` 使用命令选项，而在 Windows 中，使用选项要通过 `/` 字符。所以，在 Linux 中您应该：

```
a_prog -h

```

而不是

```
a_prog /h

```

在 Linux 下，文件拓展名并没有意义。例如，将 `myscript` 重命名为 `myscript.bat` 并不会因此而变得可执行，需要设置文件的执行权限。文件执行权限会在下次的内容中覆盖到。

在 Linux 中，如果文件或者目录名以 `.` 字符开头，意味着它们是隐藏文件。比如，如果您申请编辑 `.bashrc` 文件，您不能在家目录中找到它，但是它可能真的存在，只不过它是隐藏文件。在命令行中，您可以通过 `ls` 命令的 `-a` 选项查看隐藏文件，比如：

```
ls -a

```

在 Linux 中，普通的命令与 Windows 的命令不尽相同。下面的表格显示了常用命令中 CMD 命令和 Linux 命令行的差异。

![](/data/attachment/album/201804/20/230317b7jn5q27uw95zjn4.png)

---

via: <https://www.linux.com/blog/learn/2018/1/migrating-linux-command-line>

作者：[John Bonesio](https://www.linux.com/users/johnbonesio) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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


如何像 Linux 专家那样使用 WSL

Summary: 在本 WSL 教程中了解如何执行像挂载 USB 驱动器和操作文件等任务。

在本 WSL 教程中了解如何执行像挂载 USB 驱动器和操作文件等任务。

>
> 在本 WSL 教程中了解如何执行像挂载 USB 驱动器和操作文件等任务。
>
>
>

![WSL](/data/attachment/album/201804/22/010003ra74qj2aqaajqqzm.png "WSL")

在[之前的教程](/article-9545-1.html)中，我们学习了如何在 Windows 10 上设置 WSL。你可以在 Windows 10 中使用 WSL 执行许多 Linux 命令。无论是基于 Linux 的系统还是 macOS，它们的许多系统管理任务都是在终端内部完成的。然而，Windows 10 缺乏这样的功能。你想运行一个 cron 任务么？不行。你想 SSH 进入你的服务器，然后 `rsync` 文件么？没门。如何用强大的命令行工具管理本地文件，而不是使用缓慢和不可靠的 GUI 工具呢？

在本教程中，你将看到如何使用 WSL 执行除了管理之外的任务 —— 例如挂载 USB 驱动器和操作文件。你需要运行一个完全更新的 Windows 10 并选择一个 Linux 发行版。我在[上一篇文章](/article-9545-1.html)中介绍了这些步骤，所以如果你跟上进度，那就从那里开始。让我们开始吧。

### 保持你的 Linux 系统更新

事实上，当你通过 WSL 运行 Ubuntu 或 openSUSE 时，其底层并没有运行 Linux 内核。然而，你必须保持你的发行版完整更新，以保护你的系统免受任何新的已知漏洞的影响。由于在 Windows 应用商店中只有两个免费的社区发行版，所以教程将只覆盖以下两个：openSUSE 和 Ubuntu。

更新你的 Ubuntu 系统：

```
# sudo apt-get update
# sudo apt-get dist-upgrade

```

运行 openSUSE 的更新：

```
# zypper up

```

您还可以使用 `dup` 命令将 openSUSE 升级到最新版本。但在运行系统升级之前，请使用上一个命令运行更新。

```
# zypper dup

```

**注意：** openSUSE 默认为 root 用户。如果你想执行任何非管理员任务，请切换到非特权用户。您可以这篇[文章](/article-9545-1.html)中了解如何在 openSUSE上 创建用户。

### 管理本地文件

如果你想使用优秀的 Linux 命令行工具来管理本地文件，你可以使用 WSL 轻松完成此操作。不幸的是，WSL 还不支持像 `lsblk` 或 `mount` 这样的东西来挂载本地驱动器。但是，你可以 `cd` 到 C 盘并管理文件：

```
/mnt/c/Users/swapnil/Music

```

我现在在 C 盘的 Music 目录下。

要安装其他驱动器、分区和外部 USB 驱动器，你需要创建一个挂载点，然后挂载该驱动器。

打开文件资源管理器并检查该驱动器的挂载点。假设它在 Windows 中被挂载为 S:\。

在 Ubuntu/openSUSE 终端中，为驱动器创建一个挂载点。

```
sudo mkdir /mnt/s

```

现在挂载驱动器：

```
mount -f drvfs S: /mnt/s

```

挂载完毕后，你现在可以从发行版访问该驱动器。请记住，使用 WSL 方式运行的发行版将会看到 Windows 能看到的内容。因此，你无法挂载在 Windows 上无法原生挂载的 ext4 驱动器。

现在你可以在这里使用所有这些神奇的 Linux 命令。想要将文件从一个文件夹复制或移动到另一个文件夹？只需运行 `cp` 或 `mv` 命令。

```
cp /source-folder/source-file.txt /destination-folder/
cp /music/classical/Beethoven/symphony-2.mp3 /plex-media/music/classical/

```

如果你想移动文件夹或大文件，我会推荐 `rsync` 而不是 `cp` 命令：

```
rsync -avzP /music/classical/Beethoven/symphonies/ /plex-media/music/classical/

```

耶！

想要在 Windows 驱动器中创建新目录，只需使用 `mkdir` 命令。

想要在某个时间设置一个 cron 作业来自动执行任务吗？继续使用 `crontab -e` 创建一个 cron 作业。十分简单。

你还可以在 Linux 中挂载网络/远程文件夹，以便你可以使用更好的工具管理它们。我的所有驱动器都插在树莓派或者服务器上，因此我只需 `ssh` 进入该机器并管理硬盘。在本地计算机和远程系统之间传输文件可以再次使用 `rsync` 命令完成。

WSL 现在已经不再是测试版了，它将继续获得更多新功能。我很兴奋的两个特性是 `lsblk` 命令和 `dd` 命令，它们允许我在 Windows 中本机管理我的驱动器并创建可引导的 Linux 驱动器。如果你是 Linux 命令行的新手，[前一篇教程](https://www.linux.com/learn/how-use-linux-command-line-basics-cli)将帮助你开始使用一些最基本的命令。

---

via: <https://www.linux.com/blog/learn/2018/2/how-use-wsl-linux-pro>

作者：[SWAPNIL BHARTIYA](https://www.linux.com/users/arnieswap) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何将字体添加到 Fedora

Summary: Fedora 使安装字体变得简单

Fedora 使安装字体变得简单

![](/data/attachment/album/201804/22/010626bzeetgdlugbrdeo5.jpg)

字体可帮助你通过设计以创意的方式表达你的想法。无论给图片加标题、编写演示文稿，还是设计问候语或广告，字体都可以将你的想法提升到更高水平。很容易仅仅为了它们的审美品质而爱上它们。幸运的是，Fedora 使安装字体变得简单。以下是如何做的。

### 全系统安装

如果你在系统范围内安装字体，那么它可以让所有用户使用。此方式的最佳方法是使用官方软件库中的 RPM 软件包。

开始前打开 Fedora Workstation 中的 “Software” 工具，或者其他使用官方仓库的工具。选择横栏中选择 “Add-ons” 类别。接着在该类别中选择 “Fonts”。你会看到类似于下面截图中的可用字体：

[![](/data/attachment/album/201804/22/010627tolldveg9pe08d3e.png)](https://fedoramagazine.org/wp-content/uploads/2017/11/Software-fonts.png)

当你选择一种字体时，会出现一些细节。根据几种情况，你可能能够预览字体的一些示例文本。点击 “Install” 按钮将其添加到你的系统。根据系统速度和网络带宽，完成此过程可能需要一些时间。

你还可以在字体细节中通过 “Remove” 按钮删除前面带有勾的已经安装的字体。

### 个人安装

如果你以兼容格式：.ttf、 otf 、.ttc、.pfa 、.pfb 或者 .pcf 下载了字体，则此方法效果更好。这些字体扩展名不应通过将它们放入系统文件夹来安装在系统范围内。这种类型的非打包字体不能自动更新。它们也可能会在稍后干扰一些软件操作。安装这些字体的最佳方法是安装在你自己的个人数据目录中。

打开 Fedora Workstation 中的 “Files” 应用或你选择的类似文件管理器应用。如果你使用 “Files”，那么可能需要使用 `Ctrl+H` 组合键来显示隐藏的文件和文件夹。查找 `.fonts` 文件夹并将其打开。如果你没有 `.fonts` 文件夹，请创建它。 （记住最前面的点并全部使用小写。）

将已下载的字体文件复制到 `.fonts` 文件夹中。此时你可以关闭文件管理器。打开一个终端并输入以下命令：

```
fc-cache

```

这将重建字体缓存，帮助 Fedora 可以找到并引用它。你可能还需要重新启动需要使用新字体的应用程序，例如 Inkscape 或 LibreOffice。你重新启动后，新的字体应该就可以使用了。

---

照片由 [Raphael Schaller](https://unsplash.com/photos/GkinCd2enIY?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 发布在 [Unsplash](https://unsplash.com/search/photos/fonts?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 中。

---

作者简介:

Paul W. Frields 自 1997 年以来一直是 Linux 用户和爱好者，并于 2003 年 Fedora 发布不久后加入项目。他是 Fedora 项目委员会的创始成员之一，并从事文档、网站发布、倡导、工具链开发和维护软件工作。他于 2008 年 2 月至 2010 年 7 月在红帽担任 Fedora 项目负责人，现任红帽公司工程部经理。他目前和他的妻子和两个孩子一起住在弗吉尼亚州。

---

via: <https://fedoramagazine.org/add-fonts-fedora/>

作者：[Paul W. Frields](https://fedoramagazine.org/author/pfrields/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


开发者的最佳 GNOME 扩展

Summary: Fedora Magazine 已经介绍了一些很棒的桌面扩展，例如 EasyScreenCast、 gTile 和 OpenWeather ，本文接下来会重点报道这些为开发者而改变的扩展。

![](/data/attachment/album/201804/22/224233k2111a91ad1p6w21.jpg)

扩展给予 GNOME3 桌面环境以非常大的灵活性，这种灵活性赋予了用户在定制化桌面上的优势，从而使他们的工作流程变得更加舒适和有效率。Fedora Magazine 已经介绍了一些很棒的桌面扩展，例如 [EasyScreenCast](https://fedoramagazine.org/screencast-gnome-extension/)、 [gTile](https://fedoramagazine.org/must-have-gnome-extension-gtile/) 和 [OpenWeather](https://fedoramagazine.org/weather-updates-openweather-gnome-shell-extension/) ，本文接下来会重点报道这些为开发者而改变的扩展。

如果你需要帮助来安装 GNOME 扩展，那么可以参考《[如何安装一个 GNOME Shell 扩展](/article-9447-1.html)》这篇文章。

### Docker 集成（Docker Integration）

![Docker Integration extension icon](/data/attachment/album/201804/22/224233s32hgf18rf28oh6z.png)

![Docker Integration extension status menu](/data/attachment/album/201804/22/224234twfmtf42l4lmrrff.png)

对于为自己的应用使用 Docker 的开发者而言，这个 [Docker 集成](https://extensions.gnome.org/extension/1065/docker-status/) 扩展是必不可少的。这个状态菜单提供了一个带着启动、停止、暂停、甚至删除它们的选项的 Docker 容器列表，这个列表会在新容器加入到这个系统时自动更新。

在安装完这个扩展后，Fedora 用户可能会收到这么一条消息：“Error occurred when fetching containers.（获取容器时发生错误）”。这是因为 Docker 命令默认需要 `sudo` 或 root 权限。要设置你的用户权限来运行 Docker，可以参考 [Fedora 开发者门户网站上的 Docker 安装这一页](https://developer.fedoraproject.org/tools/docker/docker-installation.html)。

你可以在该[扩展的站点](https://github.com/gpouilloux/gnome-shell-extension-docker)上找到更多的信息。

### Jenkins CI 服务器指示器（Jenkins CI Server Indicator）

![Jenkins CI Server Indicator icon](/data/attachment/album/201804/22/224234xf8mka8u932k9k3z.png)

![Jenkins CI Server Indicator extension status menu](/data/attachment/album/201804/22/224235rb6gxj8x3w00b8wq.png)

[Jenkins CI 服务器指示器](https://extensions.gnome.org/extension/399/jenkins-ci-server-indicator/)这个扩展可以使开发者在 Jenkins CI 服务器建立应用很简单，它展示了一个菜单，包含有任务列表及那些任务的状态。它也包括了一些如轻松访问 Jenkins 网页前端、任务完成提示、以及触发和过滤任务等特性。

如果想要更多的信息，请去浏览[开发者站点](https://www.philipphoffmann.de/gnome-3-shell-extension-jenkins-ci-server-indicator/)。

### 安卓工具（android-tool）

![android-tool extension icon](/data/attachment/album/201804/22/224235dstousw232esxeg2.png)

![android-tool extension status menu](/data/attachment/album/201804/22/224236eejo9ew33quecbw3.png)

[安卓工具](https://extensions.gnome.org/extension/1232/android-tool/)对于 Android 开发者来说会是一个非常有价值的扩展，它的特性包括捕获错误报告、设备截屏和屏幕录像。它可以通过 usb 和 tcp 连接两种方式来连接 Android 设备。

这个扩展需要 `adb` 的包，从 Fedora 官方仓库安装 `adb` 只需要[运行这条命令](https://fedoramagazine.org/howto-use-sudo/)：

```
sudo dnf install android-tools

```

你可以在这个[扩展的 GitHub 网页](https://github.com/naman14/gnome-android-tool)里找到更多信息。

### GnomeHub

![GnomeHub extension icon](/data/attachment/album/201804/22/224236vphxca2oee2epcp2.png)

![GnomeHub extension status menu](/data/attachment/album/201804/22/224237rmwdamas7wa97w9n.png)

对于自己的项目使用 GitHub 的 GNOME 用户来说，[GnomeHub](https://extensions.gnome.org/extension/1263/gnomehub/) 是一个非常好的扩展，它可以显示 GitHub 上的仓库，还可以通知用户有新提交的拉取请求。除此之外，用户可以把他们最喜欢的仓库加在这个扩展的设置里。

如果想要更多信息，可以参考一下这个[项目的 GitHub 页面](https://github.com/lagartoflojo/gnomehub)。

### gistnotes

![gistnotes extension icon](/data/attachment/album/201804/22/224237myghfognfz8gqtaf.png)

简单地说，[gistnotes](https://extensions.gnome.org/extension/917/gistnotes/) 为 gist 用户提供了一种创建、存储和管理注释和代码片段的简单方式。如果想要更多的信息，可以参考这个[项目的网站](https://github.com/mohan43u/gistnotes)。

![gistnotes window](/data/attachment/album/201804/22/224237nz021k1ferymm0zn.png)

### Arduino 控制器（Arduino Control）

![Arduino Control extension icon](/data/attachment/album/201804/22/224238nekuv7e5lb8c83dk.png)

这个 [Arduino 控制器](https://extensions.gnome.org/extension/894/arduino-control/)扩展允许用户去连接或者控制他们自己的 Arduino 电路板，它同样允许用户在状态菜单里增加滑块或者开关。除此之外，开发者放在扩展目录里的脚本可以通过以太网或者 usb 来连接 Arduino 电路板。

最重要的是，这个扩展可以被定制化来适合你的项目，在器 README 文件里的提供例子是，它能够“通过网络上任意的电脑来控制你房间里的灯”。

你可以从这个[项目的 GitHub 页面](https://github.com/simonthechipmunk/arduinocontrol)上得到更多的产品信息并安装这个扩展。

### Hotel Manager

![Hotel Manager extension icon](/data/attachment/album/201804/22/224238e62yh6to4y654789.png)

![Hotel Manager extension status menu](/data/attachment/album/201804/22/224239ubjqqbspsmq9pms2.png)

使用 Hotel 进程管理器开发网站的开发人员，应该尝试一下 [Hotel Manager](https://extensions.gnome.org/extension/1285/hotel-manager/) 这个扩展。它展示了一个增加到 Hotel 里的网页应用的列表，并给与了用户开始、停止和重启这些应用的能力。此外，还可以通过右边的电脑图标快速打开、浏览这些网页应用。这个扩展同样可以启动、停止或重启 Hotel 的后台程序。

本文发布时，GNOME 3.26 版本的 Hotel Manager 版本 4 没有在该扩展的下拉式菜单里列出网页应用。版本 4 还会在 Fedora 28 (GNOME 3.28) 上安装时报错。然而，版本 3 工作在 Fedora 27 和 Fedora 28。

如果想要更多细节，可以去看这个[项目在 GitHub 上的网页](https://github.com/hardpixel/hotel-manager)。

### VSCode 搜索插件（VSCode Search Provider）

[VSCode 搜索插件](https://extensions.gnome.org/extension/1207/vscode-search-provider/)是一个简单的扩展，它能够在 GNOME 综合搜索结果里展示 Visual Studio Code 项目。对于重度 VSCode 用户来说，这个扩展可以让用户快速连接到他们的项目，从而节省时间。你可以从这个[项目在 GitHub 上的页面](https://github.com/jomik/vscode-search-provider)来得到更多的信息。

![GNOME Overview search results showing VSCode projects.](/data/attachment/album/201804/22/224240h7kpgkf3d775x3gk.png)

在开发环境方面，你有没有一个最喜欢的扩展呢？发在评论区里，一起来讨论下吧。

---

via: <https://fedoramagazine.org/awesome-gnome-extensions-developers/>

作者：[Shaun Assam](https://fedoramagazine.org/author/sassam/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[hopefully2333](https://github.com/hopefully2333) 校对：[wxy](https://github.com/wxy)

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


对进程的监视

![](/data/attachment/album/201804/23/124133aokrocrc5y1fz5co.jpg)

由于复刻了 mon 项目到 [etbemon](https://doc.coker.com.au/projects/etbe-mon/) 中，我花了一些时间做监视脚本。事实上监视一些事情通常很容易，但是决定监视什么才是困难的部分。进程监视脚本 `ps.monitor` 是我重新设计过的一个。

对于进程监视我有一些思路。如果你对进程监视如何做的更好有任何建议，请通过评论区告诉我。

给不使用 mon 的人介绍一下，如果一切 OK 该监视脚本就返回 0，而如果有问题它会返回 1，并使用标准输出显示错误信息。虽然我并不知道有谁将 mon 脚本挂进一个不同的监视系统中，但是，那样做其实很容易实现。我计划去做的一件事情就是，将来实现 mon 和其它的监视系统如 Nagios 之间的互操作性。

### 基本监视

```
ps.monitor tor:1-1 master:1-2 auditd:1-1 cron:1-5 rsyslogd:1-1 dbus-daemon:1- sshd:1- watchdog:1-2

```

我现在计划重写该进程监视脚本的某些部分。现在的功能是在命令行上列出进程名字，它包含了要监视的进程的最小和最大实例数量。上面的示例是一个监视的配置。在这里有一些限制，在这个实例中的 `master` 进程指的是 Postfix 的主进程，但是其它的守护进程使用了相同的进程名（这是那些错误的名字之一，因为它太直白了）。一个显而易见的解决方案是，给一个指定完整路径的选项，这样，那个 `/usr/lib/postfix/sbin/master` 就可以与其它命名为 `master` 的程序区分开了。

下一个问题是那些可能以多个用户身份运行的进程。比如 `sshd`，它有一个以 root 身份运行的单独的进程去接受新的连接请求，以及在每个登入用户的 UID 下运行的进程。因此，作为 root 用户运行的 sshd 进程的数量将比 root 登录会话的数量大 1。这意味着如果一个系统管理员直接以 root 身份通过 `ssh` 登入系统（这是有争议的，但它不是本文的主题—— 只是有些人需要这样做，所以我们必须支持这种情形），然后 master 进程崩溃了（或者系统管理员意外或者故意杀死了它），这时对于该进程丢失并不会产生警报。当然正确的做法是监视 22 号端口，查找字符串 `SSH-2.0-OpenSSH_`。有时候，守护进程的多个实例运行在需要单独监视的不同 UID 下面。因此，我们需要通过 UID 监视进程的能力。

在许多情形中，进程监视可以被替换为对服务端口的监视。因此，如果在 25 号端口上监视，那么有可能意味着，Postfix 的 `master` 在运行着，不用去理会其它的 `master` 进程。但是对于我而言，我可以在方便地进行多个监视，如果我得到一个关于无法向一个服务器发送邮件的 Jabber 消息，我可以通过这个来自服务器的 Jabber 消息断定 `master` 没有运行，而不需要挨个查找才能发现问题所在。

### SE Linux

我想要的一个功能就是，监视进程的 SE Linux 上下文，就像监视 UID 一样。虽然我对为其它安全系统编写一个测试不感兴趣，但是，我很乐意将别人写好的代码包含进去。因此，不管我做什么，都希望它能与多个安全系统一起灵活地工作。

### 短暂进程

大多数守护进程在进程启动期间都有一个相同名字的<ruby> 次级进程 <rt>  second process </rt></ruby>。这意味着如果你为了精确地监视一个进程的一个实例，当 `logrotate` 或者类似的守护进程重启时，你或许会收到一个警报说有两个进程运行。如果在重启期间，恰好在一个错误的时间进行检查，你也或许会收到一个警报说，有 0 个实例。我现在处理这种情况的方法是，在与 `alertafter 2` 指令一起的次级进程失败事件之前我的服务器不发出警报。当监视处于一个失败的状态时，`failure_interval` 指令允许指定检查的时间间隔，将其设置为一个较低值时，意味着在等待一个次级进程失败结果时并不会使提示延迟太多。

为处理这种情况，我考虑让 `ps.monitor` 脚本在一个指定的延迟后再次进行自动检查。我认为使用一个单个参数的监视脚本来解决这个问题比起使用两个配置指令的 mon 要好一些。

### CPU 使用

mon 现在有一个 `loadavg.monitor` 脚本，它用于检查平均负载。但是它并不能捕获一个单个进程使用了太多的 CPU 时间而没有使系统平均负载上升的情况。同样，也没有捕获一个渴望获得 CPU 的进程进入沉默（例如，SETI at Home 停止运行）（LCTT 译注：SETI，由加州大学伯克利分校创建的一项利用全球的联网计算机的空闲计算资源来搜寻地外文明的科学实验计划），而其它的进程进入一个无限循环状态的情况。解决这种问题的一个方法是，让 `ps.monitor` 脚本也配置另外的一个选项去监视 CPU 的使用，但是这也可能会让人产生迷惑。另外的选择是，使用一个独立的脚本，它用来报警任何在它的生命周期或者最后几秒中，使用 CPU 时间超过指定百分比的进程，除非它在一个豁免这种检查的进程或用户的白名单中。或者每个普通用户都应该豁免这种检查，因为你压根就不知道他们什么时候运行一个文件压缩程序。也应该有一个包含排除的守护进程（像 BOINC）和系统进程（像 gzip，有几个定时任务会运行它）的简短列表。

### 对例外的监视

一个常见的编程错误是在 `setgid()` 之前调用 `setuid()`，这意味着那个程序没有权限去调用 `setgid()`。如果没有检查返回代码（而犯这种低级错误的人往往不会去检查返回代码），那么进程会保持较高的权限。检查以 GID 0 而不是 UID 0 运行的进程是很方便的。顺利说一下，对一个 Debian/Testing 工作站运行的一个快速检查显示，一个使用 GID 0 的进程并没有获得较高的权限，但是可以使用一个 `chmod 770` 命令去改变它。

在一个 SE Linux 系统上，应该只有一个进程与 `init_t` 域一起运行。目前在运行守护进程（比如，mysqld 和 tor）的 Debian Stretch 系统中，并不会发生策略与守护进程服务文件所请求的 systemd 的最新功能不匹配的情况。这样的问题将会不断发生，我们需要对它进行自动化测试。

对配置错误的自动测试可能会影响系统安全，这是一个很大的问题，我将来或许写一篇关于这方面的单独的博客文章。

---

via: <https://etbe.coker.com.au/2017/09/28/process-monitoring/>

作者：[Andrew](https://etbe.coker.com.au) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


在 Ubuntu 17.10 上安装 AWFFull Web 服务器日志分析应用程序

![](/data/attachment/album/201804/23/125729f4mx8b49m98b094b.png)

AWFFull 是基于 “Webalizer” 的 Web 服务器日志分析程序。AWFFull 以 HTML 格式生成使用统计信息以便用浏览器查看。结果以柱状和图形两种格式显示，这有利于解释数据。它提供每年、每月、每日和每小时的使用统计数据，并显示网站、URL、referrer、user agent（浏览器）、用户名、搜索字符串、进入/退出页面和国家（如果一些信息不存在于处理后日志中那么就没有）。AWFFull 支持 CLF（通用日志格式）日志文件，以及由 NCSA 等定义的组合日志格式，它还能只能地处理这些格式的变体。另外，AWFFull 还支持 wu-ftpd xferlog 格式的日志文件，它能够分析 ftp 服务器和 squid 代理日志。日志也可以通过 gzip 压缩。

如果检测到压缩日志文件，它将在读取时自动解压缩。压缩日志必须是 .gz 扩展名的标准 gzip 压缩。

### 对于 Webalizer 的修改

AWFFull 基于 Webalizer 的代码，并有许多或大或小的变化。包括：

* 不止原始统计数据：利用已发布的公式，提供额外的网站使用情况。
* GeoIP IP 地址能更准确地检测国家。
* 可缩放的图形
* 与 GNU gettext 集成，能够轻松翻译。目前支持 32 种语言。
* 在首页显示超过 12 个月的网站历史记录。
* 额外的页面计数跟踪和排序。
* 一些小的可视化调整，包括 Geolizer 用量中使用 Kb、Mb。
* 额外的用于 URL 计数、进入和退出页面、站点的饼图
* 图形上的水平线更有意义，更易于阅读。
* User Agent 和 Referral 跟踪现在通过 PAGES 而非 HITS 进行计算。
* 现在支持 GNU 风格的长命令行选项（例如 --help）。
* 可以通过排除“什么不是”以及原始的“什么是”来选择页面。
* 对被分析站点的请求以匹配的引用 URL 显示。
* 404 错误表，并且可以生成引用 URL。
* 生成的 html 可以使用外部 CSS 文件。
* POST 分析总结使得手动优化配置文件性能更简单。
* 可以将指定的 IP 和地址分配给指定的国家。
* 便于使用其他工具详细分析的转储选项。
* 支持检测并处理 Lotus Domin- v6 日志。

### 在 Ubuntu 17.10 上安装 AWFFull

```
sud- apt-get install awffull

```

### 配置 AWFFull

你必须在 `/etc/awffull/awffull.conf` 中编辑 AWFFull 配置文件。如果你在同一台计算机上运行多个虚拟站点，则可以制作多个默认配置文件的副本。

```
sud- vi /etc/awffull/awffull.conf

```

确保有下面这几行：

```
LogFile /var/log/apache2/access.log.1
OutputDir /var/www/html/awffull

```

保存并退出文件。

你可以使用以下命令运行 awffull。

```
awffull -c [your config file name]

```

这将在 `/var/www/html/awffull` 目录下创建所有必需的文件，以便你可以使用 http://serverip/awffull/ 。

你应该看到类似于下面的页面：

![](/data/attachment/album/201804/23/125730u7utna7bc7daaoum.png)

如果你有更多站点，你可以使用 shell 和计划任务自动化这个过程。

---

via: <http://www.ubuntugeek.com/install-awffull-web-server-log-analysis-application-on-ubuntu-17-10.html>

作者：[ruchi](http://www.ubuntugeek.com/author/ubuntufix) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何设置 GNOME 显示自定义幻灯片

Summary: 使用一个简单的 XML，你就可以设置 GNOME 能够在桌面上显示一个幻灯片。

使用一个简单的 XML，你就可以设置 GNOME 能够在桌面上显示一个幻灯片。

>
> 使用一个简单的 XML，你就可以设置 GNOME 能够在桌面上显示一个幻灯片。
>
>
>

![](/data/attachment/album/201804/23/185426i2wml624wwnsowd3.jpg)

在 GNOME 中，一个非常酷、但却鲜为人知的特性是它能够将幻灯片显示为墙纸。你可以从 [GNOME 控制中心](http://manpages.ubuntu.com/manpages/xenial/man1/gnome-control-center.1.html)的 “背景设置” 面板中选择墙纸幻灯片。在预览的右下角显示一个小时钟标志，可以将幻灯片的墙纸与静态墙纸区别开来。

一些发行版带有预装的幻灯片壁纸。 例如，Ubuntu 包含了库存的 GNOME 定时壁纸幻灯片，以及 Ubuntu 壁纸大赛胜出的墙纸。

如果你想创建自己的自定义幻灯片用作壁纸怎么办？虽然 GNOME 没有为此提供一个用户界面，但是在你的主目录中使用一些简单的 XML 文件来创建一个是非常容易的。 幸运的是，GNOME 控制中心的背景选择支持一些常见的目录路径，这样就可以轻松创建幻灯片，而不必编辑你的发行版所提供的任何内容。

### 开始

使用你最喜欢的文本编辑器在 `$HOME/.local/share/gnome-background-properties/` 创建一个 XML 文件。 虽然文件名不重要，但目录名称很重要（你可能需要创建该目录）。 举个例子，我创建了带有以下内容的 `/home/ken/.local/share/gnome-background-properties/osdc-wallpapers.xml`：

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">
<wallpapers>
 <wallpaper deleted="false">
   <name>Opensource.com Wallpapers</name>
   <filename>/home/ken/Pictures/Wallpapers/osdc/osdc.xml</filename>
   <options>zoom</options>
 </wallpaper>
</wallpapers>

```

每一个你需要包含在 GNOME 控制中心的 “背景面板”中的每个幻灯片或静态壁纸，你都要在上面的 XML 文件需要为其增加一个 `<wallpaper>` 节点。

在这个例子中，我的 `osdc.xml` 文件看起来是这样的：

```
<?xml version="1.0" ?>
<background>
  <static>
    <!-- Duration in seconds to display the background -->
    <duration>30.0</duration>
    <file>/home/ken/Pictures/Wallpapers/osdc/osdc_2.png</file>
  </static>
  <transition>
    <!-- Duration of the transition in seconds, default is 2 seconds -->
    <duration>0.5</duration>
    <from>/home/ken/Pictures/Wallpapers/osdc/osdc_2.png</from>
    <to>/home/ken/Pictures/Wallpapers/osdc/osdc_1.png</to>
  </transition>
  <static>
    <duration>30.0</duration>
    <file>/home/ken/Pictures/Wallpapers/osdc/osdc_1.png</file>
  </static>
  <transition>
    <duration>0.5</duration>
    <from>/home/ken/Pictures/Wallpapers/osdc/osdc_1.png</from>
    <to>/home/ken/Pictures/Wallpapers/osdc/osdc_2.png</to>
  </transition>
</background>

```

上面的 XML 中有几个重要的部分。 XML 中的 `<background>` 节点是你的外部节点。 每个背景都支持多个 `<static>` 和 `<transition>` 节点。

`<static>` 节点定义用 `<file>` 节点要显示的图像以及用 `<duration>` 显示它的持续时间。

`<transition>` 节点定义 `<duration>`（变换时长），`<from>` 和 `<to>` 定义了起止的图像。

### 全天更换壁纸

另一个很酷的 GNOME 功能是基于时间的幻灯片。 你可以定义幻灯片的开始时间，GNOME 将根据它计算时间。 这对于根据一天中的时间设置不同的壁纸很有用。 例如，你可以将开始时间设置为 06:00，并在 12:00 之前显示一张墙纸，然后在下午和 18:00 再次更改。

这是通过在 XML 中定义 `<starttime>` 来完成的，如下所示：

```
<starttime>
    <!-- A start time in the past is fine -->
    <year>2017</year>
    <month>11</month>
    <day>21</day>
    <hour>6</hour>
    <minute>00</minute>
    <second>00</second>
</starttime>

```

上述 XML 文件定义于 2017 年 11 月 21 日 06:00 开始动画，时长为 21,600.00，相当于六个小时。 这段时间将显示你的早晨壁纸直到 12:00，12:00 时它会更改为你的下一张壁纸。 你可以继续以这种方式每隔一段时间更换一次壁纸，但确保所有持续时间的总计为 86,400 秒（等于 24 小时）。

GNOME 将计算开始时间和当前时间之间的增量，并显示当前时间的正确墙纸。 例如，如果你在 16:00 选择新壁纸，则GNOME 将在 06:00 开始时间之后显示 36,000 秒的适当壁纸。

有关完整示例，请参阅大多数发行版中由 gnome-backgrounds 包提供的 adwaita-timed 幻灯片。 它通常位于 `/usr/share/backgrounds/gnome/adwaita-timed.xml` 中。

### 了解更多信息

希望这可以鼓励你深入了解创建自己的幻灯片壁纸。 如果你想下载本文中引用的文件的完整版本，那么你可以在 [GitHub](https://github.com/kenvandine/misc/tree/master/articles/osdc/gnome/slide-show-backgrounds/osdc) 上找到它们。

如果你对用于生成 XML 文件的实用程序脚本感兴趣，你可以在互联网上搜索 `gnome-backearth-generator`。

---

via: <https://opensource.com/article/17/12/create-your-own-wallpaper-slideshow-gnome>

作者：[Ken Vandine](https://opensource.com/users/kenvandine) 译者：[Auk7F7](https://github.com/Auk7F7) 校对： [wxy](https://github.com/wxy)

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


给初学者的 fc 示例教程

Summary: fc 是个 shell 内置命令，用于在交互式 shell 里列出、编辑和执行最近输入的命令。

![](/data/attachment/album/201804/23/191012b1p8d6p8h6hhfq6b.png)

`fc` （**F**ix **C**ommands 的缩写）是个 shell 内置命令，用于在交互式 shell 里列出、编辑和执行最近输入的命令。你可以用你喜欢的编辑器编辑最近的命令并再次执行，而不用把它们整个重新输入一遍。除了可以避免重复输入又长又复杂的命令，它对修正拼写错误来说也很有用。因为是 shell 内置命令，大多 shell 都包含它，比如 Bash 、 Zsh 、 Ksh 等。在这篇短文中，我们来学一学在 Linux 中使用 `fc` 命令。

### fc 命令教程及示例

#### 列出最近执行的命令

执行不带其它参数的 `fc -l` 命令，它会列出最近 16 个命令。

```
$ fc -l
507 fish
508 fc -l
509 sudo netctl restart wlp9s0sktab
510 ls -l
511 pwd
512 uname -r
513 uname -a
514 touch ostechnix.txt
515 vi ostechnix.txt
516 echo "Welcome to OSTechNix"
517 sudo apcman -Syu
518 sudo pacman -Syu
519 more ostechnix.txt
520 wc -l ostechnix.txt
521 cat ostechnix.txt
522 clear

```

`-r` 选项用于将输出反向排序。

```
$ fc -lr

```

`-n` 选项用于隐藏行号。

```
$ fc -ln
 nano ~/.profile
 source ~/.profile
 source ~/.profile
 fc -ln
 fc -l
 sudo netctl restart wlp9s0sktab
 ls -l
 pwd
 uname -r
 uname -a
 echo "Welcome to OSTechNix"
 sudo apcman -Syu
 cat ostechnix.txt
 wc -l ostechnix.txt
 more ostechnix.txt
 clear

```

这样行号就不再显示了。

如果想以某个命令开始，只需在 `-l` 选项后面加上行号即可。比如，要显示行号 520 至最近的命令，可以这样：

```
$ fc -l 520
520 ls -l
521 pwd
522 uname -r
523 uname -a
524 echo "Welcome to OSTechNix"
525 sudo apcman -Syu
526 cat ostechnix.txt
527 wc -l ostechnix.txt
528 more ostechnix.txt
529 clear
530 fc -ln
531 fc -l

```

要列出一段范围内的命令，将始、末行号作为 `fc -l` 的参数即可，比如 520 至 525：

```
$ fc -l 520 525
520 ls -l
521 pwd
522 uname -r
523 uname -a
524 echo "Welcome to OSTechNix"
525 sudo apcman -Syu

```

除了使用行号，我们还可以使用字符。比如，要列出最近一个 `pwd` 至最近一个命令之间的所有命令，只需要像下面这样使用起始字母即可：

```
$ fc -l p
521 pwd
522 uname -r
523 uname -a
524 echo "Welcome to OSTechNix"
525 sudo apcman -Syu
526 cat ostechnix.txt
527 wc -l ostechnix.txt
528 more ostechnix.txt
529 clear
530 fc -ln
531 fc -l
532 fc -l 520
533 fc -l 520 525
534 fc -l 520
535 fc -l 522
536 fc -l l

```

要列出所有 `pwd` 和 `more` 之间的命令，你可以都使用起始字母，像这样：

```
$ fc -l p m

```

或者，使用开始命令的首字母以及结束命令的行号：

```
$ fc -l p 528

```

或者都使用行号：

```
$ fc -l 521 528

```

这三个命令都显示一样的结果。

#### 编辑并执行上一个命令

我们经常敲错命令，这时你可以用默认编辑器修正拼写错误并执行而不用将命令重新再敲一遍。

编辑并执行上一个命令：

```
$ fc

```

这会在默认编辑器里载入上一个命令。

![](/data/attachment/album/201804/23/191014cm8zz33ocwz30r0o.png)

你可以看到，我上一个命令是 `fc -l`。你可以随意修改，它会在你保存退出编辑器时自动执行。这在命令或参数又长又复杂时很有用。需要注意的是，它同时也可能是**毁灭性**的。比如，如果你的上一个命令是危险的 `rm -fr <some-path>`，当它自动执行时你可能丢掉你的重要数据。所以，小心谨慎对待每一个命令。

#### 更改默认编辑器

另一个有用的选项是 `-e` ，它可以用来为 `fc` 命令选择不同的编辑器。比如，如果我们想用 `nano` 来编辑上一个命令:

```
$ fc -e nano

```

这个命令会打开 `nano` 编辑器（而不是默认编辑器）编辑上一个命令。

![](/data/attachment/album/201804/23/191016xjtlnmzmnntngujh.png)

如果你觉得用 `-e` 选项太麻烦，你可以修改你的默认编辑器，只需要将环境变量 `FCEDIT` 设为你想要让 `fc` 使用的编辑器名称即可。

比如，要把 `nano` 设为默认编辑器，编辑你的 `~/.profile` 或其他初始化文件： （LCTT 译注：如果 `~/.profile` 不存在可自己创建；如果使用的是 bash ，可以编辑 `~/.bash_profile` ）

```
$ vi ~/.profile

```

添加下面一行：

```
FCEDIT=nano
# LCTT译注：如果在子 shell 中会用到 fc ，最好在这里 export FCEDIT

```

你也可以使用编辑器的完整路径：

```
FCEDIT=/usr/local/bin/emacs

```

输入 `:wq` 保存退出。要使改动立即生效，运行以下命令：

```
$ source ~/.profile

```

现在再输入 `fc` 就可以使用 `nano` 编辑器来编辑上一个命令了。

#### 不编辑而直接执行上一个命令

我们现在知道 `fc` 命令不带任何参数的话会将上一个命令载入编辑器。但有时你可能不想编辑，仅仅是想再次执行上一个命令。这很简单，在末尾加上连字符（`-`）就可以了：

```
$ echo "Welcome to OSTechNix"
Welcome to OSTechNix

$ fc -e -
echo "Welcome to OSTechNix"
Welcome to OSTechNix

```

如你所见，`fc` 带了 `-e` 选项，但并没有编辑上一个命令（例中的 `echo " Welcome to OSTechNix"`）。

需要注意的是，有些选项仅对指定 shell 有效。比如下面这些选项可以用在 zsh 中，但在 Bash 或 Ksh 中则不能用。

#### 显示命令的执行时间

想要知道命令是在什么时候执行的，可以用 `-d` 选项：

```
fc -ld
1 18:41 exit
2 18:41 clear
3 18:42 fc -l
4 18:42 sudo netctl restart wlp9s0sktab
5 18:42 ls -l
6 18:42 pwd
7 18:42 uname -r
8 18:43 uname -a
9 18:43 cat ostechnix.txt
10 18:43 echo "Welcome to OSTechNix"
11 18:43 more ostechnix.txt
12 18:43 wc -l ostechnix.txt
13 18:43 cat ostechnix.txt
14 18:43 clear
15 18:43 fc -l

```

这样你就可以查看最近命令的具体执行时间了。

使用选项 `-f` ，可以为每个命令显示完整的时间戳。

```
 fc -lf
 1 4/5/2018 18:41 exit
 2 4/5/2018 18:41 clear
 3 4/5/2018 18:42 fc -l
 4 4/5/2018 18:42 sudo netctl restart wlp9s0sktab
 5 4/5/2018 18:42 ls -l
 6 4/5/2018 18:42 pwd
 7 4/5/2018 18:42 uname -r
 8 4/5/2018 18:43 uname -a
 9 4/5/2018 18:43 cat ostechnix.txt
 10 4/5/2018 18:43 echo "Welcome to OSTechNix"
 11 4/5/2018 18:43 more ostechnix.txt
 12 4/5/2018 18:43 wc -l ostechnix.txt
 13 4/5/2018 18:43 cat ostechnix.txt
 14 4/5/2018 18:43 clear
 15 4/5/2018 18:43 fc -l
 16 4/5/2018 18:43 fc -ld

```

当然，欧洲的老乡们还可以使用 `-E` 选项来显示欧洲时间格式。

```
 fc -lE
 2 5.4.2018 18:41 clear
 3 5.4.2018 18:42 fc -l
 4 5.4.2018 18:42 sudo netctl restart wlp9s0sktab
 5 5.4.2018 18:42 ls -l
 6 5.4.2018 18:42 pwd
 7 5.4.2018 18:42 uname -r
 8 5.4.2018 18:43 uname -a
 9 5.4.2018 18:43 cat ostechnix.txt
 10 5.4.2018 18:43 echo "Welcome to OSTechNix"
 11 5.4.2018 18:43 more ostechnix.txt
 12 5.4.2018 18:43 wc -l ostechnix.txt
 13 5.4.2018 18:43 cat ostechnix.txt
 14 5.4.2018 18:43 clear
 15 5.4.2018 18:43 fc -l
 16 5.4.2018 18:43 fc -ld
 17 5.4.2018 18:49 fc -lf

```

### fc 用法总结

* 当不带任何参数时，`fc` 将上一个命令载入默认编辑器。
* 当带一个数字作为参数时，`fc` 将数字指定的命令载入默认编辑器。
* 当带一个字符作为参数时，`fc` 将最近一个以指定字符开头的命令载入默认编辑器。
* 当有两个参数时，它们分别指定需要列出的命令范围的开始和结束。

更多细节，请参考 man 手册。

```
$ man fc

```

好了，今天就这些。希望这篇文章能帮助到你。更多精彩内容，敬请期待！

---

via: <https://www.ostechnix.com/the-fc-command-tutorial-with-examples-for-beginners/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Dotcra](https://github.com/Dotcra) 校对：[wxy](https://github.com/wxy)

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


使用 Let's Encrypt 保护你的网站

>
> 未加密的 HTTP 会话暴露于滥用之中，用 Let's Encrypt 把它们保护起来。
>
>
>

![](/data/attachment/album/201804/23/211532baza1a15yozo60o5.jpg)

曾几何时，通过证书授权机构搭建基本的 HTTPS 网站需要每年花费数百美元，而且搭建的过程复杂且容易出错。现在我们免费使用 [Let's Encrypt](https://letsencrypt.org)，而且搭建过程也只需要几分钟。

### 为何进行加密？

为什么要加密网站呢？这是因为未经加密的 HTTP 会话可以被多种方式滥用：

* 窃听用户数据包
* 捕捉用户登录
* 注入[广告](https://www.thesslstore.com/blog/third-party-content-injection/)和[“重要”消息](https://blog.ryankearney.com/2013/01/comcast-caught-intercepting-and-altering-your-web-traffic/)
* 注入[木马](https://www.eff.org/deeplinks/2018/03/we-still-need-more-https-government-middleboxes-caught-injecting-spyware-ads-and)
* 注入 [SEO 垃圾邮件和链接](https://techglimpse.com/wordpress-injected-with-spam-security/)
* 注入[挖矿脚本](https://thehackernews.com/2018/03/cryptocurrency-spyware-malware.html)

网络服务提供商就是最大的代码注入者。那么如何挫败它们的非法行径呢？你最好的防御手段就是 HTTPS。让我们回顾一下 HTTPS 的工作原理。

### 信任链

你可以在你的网站和每个授权访问用户之间建立非对称加密。这是一种非常强的保护：GPG（GNU Privacy Guard， 参考[如何在 Linux 中加密邮件](https://www.linux.com/learn/how-encrypt-email-linux))和 OpenSSH 就是非对称加密的通用工具。它们依赖于公钥-私钥对，其中公钥可以任意分享，但私钥必须受到保护且不能分享。公钥用于加密，私钥用于解密。

但上述方法无法适用于随机的网页浏览，因为建立会话之前需要交换公钥，你需要生成并管理密钥对。HTTPS 会话可以自动完成公钥分发，而且购物或银行之类的敏感网站还会使用第三方证书颁发机构（CA）验证证书，例如 Comodo、 Verisign 和 Thawte。

当你访问一个 HTTPS 网站时，网站给你的网页浏览器返回了一个数字证书。这个证书说明你的会话被强加密，而且提供了该网站信息，包括组织名称、颁发证书的组织和证书颁发机构名称等。你可以点击网页浏览器地址栏的小锁头来查看这些信息（图 1），也包括了证书本身。

![](/data/attachment/album/201804/23/211533f900n5d99900g9lg.png "页面信息")

*图1: 点击网页浏览器地址栏上的锁头标记查看信息*

包括 Opera、 Chromium 和 Chrome 在内的主流浏览器，验证网站数字证书的合法性都依赖于证书颁发机构。小锁头标记可以让你一眼看出证书状态；绿色意味着使用强 SSL 加密且运营实体经过验证。网页浏览器还会对恶意网站、SSL 证书配置有误的网站和不被信任的自签名证书网站给出警告。

那么网页浏览器如何判断网站是否可信呢？浏览器自带根证书库，包含了一系列根证书，存储在 `/usr/share/ca-certificates/mozilla/` 之类的地方。网站证书是否可信可以通过根证书库进行检查。就像你 Linux 系统上其它软件那样，根证书库也由包管理器维护。对于 Ubuntu，对应的包是 `ca-certificates`，这个 Linux 根证书库本身是[由 Mozilla 维护](https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/policy/)的。

可见，整个工作流程需要复杂的基础设施才能完成。在你进行购物或金融等敏感在线操作时，你信任了无数陌生人对你的保护。

### 无处不加密

Let's Encrypt 是一家全球证书颁发机构，类似于其它商业根证书颁发机构。Let's Encrpt 由非营利性组织<ruby> 因特网安全研究小组 <rt>  Internet Security Research Group </rt></ruby>（ISRG）创立，目标是简化网站的安全加密。在我看来，出于后面我会提到的原因，该证书不足以胜任购物及银行网站的安全加密，但很适合加密博客、新闻和信息门户这类不涉及金融操作的网站。

使用 Let's Encrypt 有三种方式。推荐使用<ruby> 电子前沿基金会 <rt>  Electronic Frontier Foundation </rt></ruby>（EFF）开发的 [Cerbot 客户端](https://certbot.eff.org/)。使用该客户端需要在网站服务器上执行 shell 操作。

如果你使用的是共享托管主机，你很可能无法执行 shell 操作。这种情况下，最简单的方法是使用[支持 Let's Encrpt 的托管主机](https://community.letsencrypt.org/t/web-hosting-who-support-lets-encrypt/6920)。

如果你的托管主机不支持 Let's Encrypt，但支持自定义证书，那么你可以使用 Certbot [手动创建并上传你的证书](https://community.letsencrypt.org/t/web-hosting-who-support-lets-encrypt/6920)。这是一个复杂的过程，你需要彻底地研究文档。

安装证书后，使用 [SSL 服务器测试](https://www.ssllabs.com/ssltest/)来测试你的服务器。

Let's Encrypt 的电子证书有效期为 90 天。Certbot 安装过程中添加了一个证书自动续期的计划任务，也提供了测试证书自动续期是否成功的命令。允许使用已有的私钥或<ruby> 证书签名请求 <rt>  certificate signing request </rt></ruby>（CSR），允许创建通配符证书。

### 限制

Let's Encrypt 有如下限制：它只执行域名验证，即只要有域名控制权就可以获得证书。这是比较基础的 SSL。它不支持<ruby> 组织验证 <rt>  Organization Validation </rt></ruby>（OV）或<ruby> 扩展验证 <rt>  Extended Validation </rt></ruby>（EV），因为运营实体验证无法自动完成。我不会信任使用 Let's Encrypt 证书的购物或银行网站，它们应该购买支持运营实体验证的完整版本。

作为非营利性组织提供的免费服务，不提供商业支持，只提供不错的文档和社区支持。

因特网中恶意无处不在，一切数据都应该加密。从使用 [Let's Encrypt](https://letsencrypt.org/) 保护你的网站用户开始吧。

想要学习更多 Linux 知识，请参考 Linux 基金会和 edX 提供的免费课程 [“Linux 入门”](https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux)。

---

via: <https://www.linux.com/learn/intro-to-linux/2018/3/protect-your-websites-lets-encrypt>

作者：[CARLA SCHRODER](https://www.linux.com/users/cschroder) 选题：[lujun9972](https://github.com/lujun9972) 译者：[pinewall](https://github.com/pinewall) 校对：[wxy](https://github.com/wxy)

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


一个基于 Arch 的独立 Linux 发行版 MagpieOS

Summary: MagpieOS 非常简单。它基本上是 GNOME3 桌面环境的 Arch。 MagpieOS 还包括一个自定义的仓库，其中包含图标和主题（据称）在其他基于 Arch 的发行版或 AUR 上都没有。

目前使用的大多数 Linux 发行版都是由欧美创建和开发的。一位来自孟加拉国的年轻开发人员想要改变这一切。

### 谁是 Rizwan？

[Rizwan](https://twitter.com/Linux_Saikat) 是来自孟加拉国的计算机科学专业的学生。他目前正在学习成为一名专业的 Python 程序员。他在 2015 年开始使用 Linux。使用 Linux 启发他创建了自己的 Linux 发行版。他还希望让世界其他地方知道孟加拉国正在升级到 Linux。

他还致力于创建 [LFS 的 live 版本](https://itsfoss.com/linux-from-scratch-live-cd/)。

![MagpieOS Linux](/data/attachment/album/201804/24/174611iid7dld2yvbklv2i.jpg)

### 什么是 MagpieOS？

Rizwan 的新发行版被命名为 MagpieOS。 [MagpieOS](http://www.magpieos.net) 非常简单。它基本上是 GNOME3 桌面环境的 Arch。 MagpieOS 还包括一个自定义的仓库，其中包含图标和主题（据称）在其他基于 Arch 的发行版或 AUR 上都没有。

下面是 MagpieOS 包含的软件列表：Firefox、LibreOffice、Uget、Bleachbit、Notepadqq、SUSE Studio Image Writer、Pamac 软件包管理器、Gparted、Gimp、Rhythmbox、简单屏幕录像机等包括 Totem 视频播放器在内的所有默认 GNOME 软件，以及一套新的定制壁纸。

目前，MagpieOS 仅支持 GNOME 桌面环境。Rizwan 选择它是因为这是他的最爱。但是，他计划在未来添加更多的桌面环境。

不幸的是，MagpieOS 不支持孟加拉语或任何其他当地语言。它支持 GNOME 的默认语言，如英语、印地语等。

Rizwan 命名他的发行为 MagpieOS，因为<ruby> <a href="https://en.wikipedia.org/wiki/Magpie">  喜鹊 </a> <rt>  magpie </rt></ruby> 是孟加拉国的官方鸟。

![MagpieOS Linux](/data/attachment/album/201804/24/174611rc272rrgm7np5r77.jpg)

### 为什么选择 Arch？

和大多数人一样，Rizwan 通过使用 [Ubuntu](https://www.ubuntu.com) 开始了他的 Linux 旅程。一开始，他对此感到满意。但是，有时他想安装的软件在仓库中没有，他不得不通过 Google 寻找正确的 PPA。他决定切换到 [Arch](https://www.archlinux.org)，因为 Arch 有许多在 Ubuntu 上没有的软件包。Rizwan 也喜欢 Arch 是一个滚动版本，并且始终是最新的。

Arch 的问题在于它的安装非常复杂和耗时。所以，Rizwan 尝试了几个基于 Arch 的发行版，并且对任何一个都不满意。他不喜欢 [Manjaro](http://manjaro.org)，因为它们没有权限使用 Arch 的仓库。此外，Arch 仓库镜像比 Manjaro 更快并且拥有更多软件。他喜欢 [Antergos](https://antergos.com)，但要安装需要一个持续的互联网连接。如果在安装过程中连接失败，则必须重新开始。

由于这些问题，Rizwan 决定创建一个简单的发行版，让他和其他人无需麻烦地安装 Arch。他还希望通过使用他的发行版让他的祖国的开发人员从 Ubuntu 切换到 Arch。

### 如何通过 MagpieOS 帮助 Rizwan

如果你有兴趣帮助 Rizwan 开发 MagpieOS，你可以通过 [MagpieOS 网站](http://www.magpieos.net)与他联系。你也可以查看该项目的 [GitHub 页面](https://github.com/Rizwan-Hasan/MagpieOS)。Rizwan 表示，他目前不寻求财政支持。

![MagpieOS Linux](/data/attachment/album/201804/24/174612fsvr4g2wnw30lsht.png)

### 最后的想法

我快速地安装过一次 MagpieOS。它使用 [Calamares 安装程序](https://calamares.io)，这意味着安装它相对快速轻松。重新启动后，我听到一封欢迎我来到 MagpieOS 的音频消息。

说实话，这是我第一次听到安装后的问候。（Windows 10 可能也有，但我不确定）屏幕底部还有一个 Mac OS 风格的应用程序停靠栏。除此之外，它感觉像我用过的其他任何 GNOME 3 桌面。

考虑到这是一个刚刚起步的独立项目，我不会推荐它作为你的主要操作系统。但是，如果你是一个发行版尝试者，你一定会试试看。

话虽如此，对于一个想把自己的国家放在技术地图上的学生来说，这是一个不错的尝试。做得很好，Rizwan。

你有没有听说过 MagpieOS？你最喜欢的地区或本地制作的 Linux 发行版是什么？请在下面的评论中告诉我们。

如果你发现这篇文章有趣，请花点时间在社交媒体上分享。

---

via: <https://itsfoss.com/magpieos/>

作者：[John Paul](https://itsfoss.com/author/john/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


3 个 Linux 命令行密码管理器

Summary: 给在终端窗口花费大量时间的人们的密码管理器。

给在终端窗口花费大量时间的人们的密码管理器。

>
> 给在终端窗口花费大量时间的人们的密码管理器。
>
>
>

![](/data/attachment/album/201804/24/180338w6kvq6h8y2db54kh.jpg)

我们都希望我们的密码安全可靠。为此，许多人转向密码管理应用程序，如 [KeePassX](https://www.keepassx.org/) 和 [Bitwarden](https://opensource.com/article/18/3/managing-passwords-bitwarden)。

如果你在终端中花费了大量时间而且正在寻找更简单的解决方案，那么你需要了解下诸多的 Linux 命令行密码管理器。它们快速，易于使用且安全。

让我们来看看其中的三个。

### Titan

[Titan](https://www.titanpasswordmanager.org/) 是一个密码管理器，也可作为文件加密工具。我不确定 Titan 在加密文件方面效果有多好；我只是把它看作密码管理器，在这方面，它确实做的很好。

![](/data/attachment/album/201804/24/180339zis1bt8io8kgqq2g.png)

Titan 将你的密码存储在加密的 [SQLite 数据库](https://en.wikipedia.org/wiki/SQLite)中，你可以在第一次启动该应用程序时创建并添加主密码。告诉 Titan 增加一个密码，它需要一个用来识别它的名字、用户名、密码本身、URL 和关于密码的注释。

你可以让 Titan 为你生成一个密码，你可以通过条目名称或数字 ID、名称、注释或使用正则表达式来搜索数据库，但是，查看特定的密码可能会有点笨拙，你要么必须列出所有密码滚动查找你想要使用的密码，要么你可以通过使用其数字 ID（如果你知道）列出条目的详细信息来查看密码。

### Gopass

[Gopass](https://www.justwatch.com/gopass/) 被称为“团队密码管理器”。不要因此感到失望，它对个人的使用也很好。

![](/data/attachment/album/201804/24/180340g2o5dj5fc3jbfb56.png)

Gopass 是用 Go 语言编写的经典 Unix 和 Linux [Pass](https://www.passwordstore.org/) 密码管理器的更新版本。安装纯正的 Linux 方式，你可以[编译源代码](https://github.com/justwatchcom/gopass)或[使用安装程序](https://justwatch.com/gopass/#install)以在你的计算机上使用 gopass。

在开始使用 gopass 之前，确保你的系统上有 [GNU Privacy Guard (GPG)](https://www.gnupg.org) 和 [Git](https://git-scm.com/)。前者对你的密码存储进行加密和解密，后者将提交到一个 [Git 仓库](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository)。如果 gopass 是给个人使用，你仍然需要 Git。你不需要担心提交到仓库。如果你感兴趣，你可以[在文档中](https://github.com/justwatchcom/gopass/blob/master/docs/setup.md)了解这些依赖关系。

当你第一次启动 gopass 时，你需要创建一个密码存储库并生成一个[密钥](http://searchsecurity.techtarget.com/definition/private-key)以确保存储的安全。当你想添加一个密码（gopass 中称之为“secret”）时，gopass 会要求你提供一些信息，比如 URL、用户名和密码。你可以让 gopass 为你添加的“secret”生成密码，或者你可以自己输入密码。

根据需要，你可以编辑、查看或删除密码。你还可以查看特定的密码或将其复制到剪贴板，以将其粘贴到登录表单或窗口中。

### Kpcli

许多人选择的是开源密码管理器 [KeePass](https://keepass.info/) 和 [KeePassX](https://www.keepassx.org)。 [Kpcli](http://kpcli.sourceforge.net/) 将 KeePass 和 KeePassX 的功能带到你的终端窗口。

![](/data/attachment/album/201804/24/180340vshhmjirx2hs7pj7.png)

Kpcli 是一个键盘驱动的 shell，可以完成其图形化的表亲的大部分功能。这包括打开密码数据库、添加和编辑密码和组（组帮助你组织密码），甚至重命名或删除密码和组。

当你需要时，你可以将用户名和密码复制到剪贴板以粘贴到登录表单中。为了保证这些信息的安全，kpcli 也有清除剪贴板的命令。对于一个小终端应用程序来说还不错。

你有最喜欢的命令行密码管理器吗？何不通过发表评论来分享它？

---

via: <https://opensource.com/article/18/4/3-password-managers-linux-command-line>

作者：[Scott Nesbitt](https://opensource.com/users/scottnesbitt) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


在 Linux 命令行上使用日历

>
> 通过 Linux 上的日历，不仅仅可以提醒你今天是星期几。诸如 date、cal、 ncal 和 calendar 等命令可以提供很多有用信息。
>
>
>

![](/data/attachment/album/201804/25/101504x3na3h77h26aghhi.jpg)

Linux 系统可以为你的日程安排提供更多帮助，而不仅仅是提醒你今天是星期几。日历显示有很多选项 —— 有些可能很有帮助，有些可能会让你大开眼界。

### 日期

首先，你可能知道可以使用 `date` 命令显示当前日期。

```
$ date
Mon Mar 26 08:01:41 EDT 2018

```

### cal 和 ncal

你可以使用 `cal` 命令显示整个月份。没有参数时，`cal` 显示当前月份，默认情况下，通过反转前景色和背景颜色来突出显示当天。

```
$ cal
     March 2018
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

```

如果你想以“横向”格式显示当前月份，则可以使用 `ncal` 命令。

```
$ ncal
    March 2018
Su     4 11 18 25
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31

```

例如，如果你只想查看特定周几的日期，这个命令可能特别有用。

```
$ ncal | grep Th
Th  1  8 15 22 29

```

`ncal` 命令还可以以“横向”格式显示一整年，只需在命令后提供年份。

```
$ ncal 2018
                                  2018
    January           February          March             April
Su     7 14 21 28        4 11 18 25        4 11 18 25     1  8 15 22 29
Mo  1  8 15 22 29        5 12 19 26        5 12 19 26     2  9 16 23 30
Tu  2  9 16 23 30        6 13 20 27        6 13 20 27     3 10 17 24
We  3 10 17 24 31        7 14 21 28        7 14 21 28     4 11 18 25
Th  4 11 18 25        1  8 15 22        1  8 15 22 29     5 12 19 26
Fr  5 12 19 26        2  9 16 23        2  9 16 23 30     6 13 20 27
Sa  6 13 20 27        3 10 17 24        3 10 17 24 31     7 14 21 28
...

```

你也可以使用 `cal` 命令显示一整年。请记住，你需要输入年份的四位数字。如果你输入 `cal 18`，你将获得公元 18 年的历年，而不是 2018 年。

```
$ cal 2018
                            2018
      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3               1  2  3
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   4  5  6  7  8  9 10
14 15 16 17 18 19 20  11 12 13 14 15 16 17  11 12 13 14 15 16 17
21 22 23 24 25 26 27  18 19 20 21 22 23 24  18 19 20 21 22 23 24
28 29 30 31           25 26 27 28           25 26 27 28 29 30 31

       April                  May                   June
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7         1  2  3  4  5                  1  2
 8  9 10 11 12 13 14   6  7  8  9 10 11 12   3  4  5  6  7  8  9
15 16 17 18 19 20 21  13 14 15 16 17 18 19  10 11 12 13 14 15 16
22 23 24 25 26 27 28  20 21 22 23 24 25 26  17 18 19 20 21 22 23
29 30                 27 28 29 30 31        24 25 26 27 28 29 30

        July                 August              September
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7            1  2  3  4                     1
 8  9 10 11 12 13 14   5  6  7  8  9 10 11   2  3  4  5  6  7  8
15 16 17 18 19 20 21  12 13 14 15 16 17 18   9 10 11 12 13 14 15
22 23 24 25 26 27 28  19 20 21 22 23 24 25  16 17 18 19 20 21 22
29 30 31              26 27 28 29 30 31     23 24 25 26 27 28 29
                                            30

      October               November              December
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3                     1
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   2  3  4  5  6  7  8
14 15 16 17 18 19 20  11 12 13 14 15 16 17   9 10 11 12 13 14 15
21 22 23 24 25 26 27  18 19 20 21 22 23 24  16 17 18 19 20 21 22
28 29 30 31           25 26 27 28 29 30     23 24 25 26 27 28 29
                                            30 31

```

要指定年份和月份，使用 `-d` 选项，如下所示：

```
$ cal -d 1949-03
     March 1949
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

```

另一个可能有用的日历选项是 `cal` 命令的 `-j` 选项。让我们来看看它显示的是什么。

```
$ cal -j
        March 2018
 Su  Mo  Tu  We  Th  Fr  Sa
                 60  61  62
 63  64  65  66  67  68  69
 70  71  72  73  74  75  76
 77  78  79  80  81  82  83
 84  85  86  87  88  89  90

```

你可能会问：“什么鬼？？？” OK， `-j` 选项显示 Julian 日期 -- 一年中从 1 到 365 年的数字日期。所以，1 是 1 月 1 日，32 是 2 月 1 日。命令 `cal -j 2018` 将显示一整年的数字，像这样：

```
$ cal -j 2018 | tail -9

         November                     December
 Su  Mo  Tu  We  Th  Fr  Sa   Su  Mo  Tu  We  Th  Fr  Sa
                305 306 307                          335
308 309 310 311 312 313 314  336 337 338 339 340 341 342
315 316 317 318 319 320 321  343 344 345 346 347 348 349
322 323 324 325 326 327 328  350 351 352 353 354 355 356
329 330 331 332 333 334      357 358 359 360 361 362 363
                             364 365

```

这种显示可能有助于提醒你，自从你做了新年计划之后，你已经有多少天没有采取行动了。

运行类似的命令，对于 2020 年，你会注意到这是一个闰年：

```
$ cal -j 2020 | tail -9

         November                     December
 Su  Mo  Tu  We  Th  Fr  Sa   Su  Mo  Tu  We  Th  Fr  Sa
306 307 308 309 310 311 312          336 337 338 339 340
313 314 315 316 317 318 319  341 342 343 344 345 346 347
320 321 322 323 324 325 326  348 349 350 351 352 353 354
327 328 329 330 331 332 333  355 356 357 358 359 360 361
334 335                      362 363 364 365 366

```

### calendar

另一个有趣但潜在的令人沮丧的命令可以告诉你关于假期的事情，这个命令有很多选项，但我们这里介绍下你想看到即将到来的假期和值得注意的日历列表。日历的 `-l` 选项允许你选择今天想要查看的天数，因此 `0` 表示“仅限今天”。

```
$ calendar -l 0
Mar 26  Benjamin Thompson born, 1753, Count Rumford; physicist
Mar 26  David Packard died, 1996; age of 83
Mar 26  Popeye statue unveiled, Crystal City TX Spinach Festival, 1937
Mar 26  Independence Day in Bangladesh
Mar 26  Prince Jonah Kuhio Kalanianaole Day in Hawaii
Mar 26* Seward's Day in Alaska (last Monday)
Mar 26  Emerson, Lake, and Palmer record "Pictures at an Exhibition" live, 1971
Mar 26  Ludwig van Beethoven dies in Vienna, Austria, 1827
Mar 26  Bonne fête aux Lara !
Mar 26  Aujourd'hui, c'est la St(e) Ludger.
Mar 26  N'oubliez pas les Larissa !
Mar 26  Ludwig van Beethoven in Wien gestorben, 1827
Mar 26  Emánuel

```

对于我们大多数人来说，这庆祝活动有点多。如果你看到类似这样的内容，可以将其归咎于你的 `calendar.all` 文件，该文件告诉系统你希望包含哪些国际日历。当然，你可以通过删除此文件中包含其他文件的一些行来削减此问题。文件看起来像这样：

```
#include <calendar.world>
#include <calendar.argentina>
#include <calendar.australia>
#include <calendar.belgium>
#include <calendar.birthday>
#include <calendar.christian>
#include <calendar.computer>

```

假设我们只通过移除除上面显示的第一个 `#include` 行之外的所有行，将我们的显示切换到世界日历。 我们会看到这个：

```
$ calendar -l 0
Mar 26 Benjamin Thompson born, 1753, Count Rumford; physicist
Mar 26 David Packard died, 1996; age of 83
Mar 26 Popeye statue unveiled, Crystal City TX Spinach Festival, 1937
Mar 26 Independence Day in Bangladesh
Mar 26 Prince Jonah Kuhio Kalanianaole Day in Hawaii
Mar 26* Seward's Day in Alaska (last Monday)
Mar 26 Emerson, Lake, and Palmer record "Pictures at an Exhibition" live, 1971
Mar 26 Ludwig van Beethoven dies in Vienna, Austria, 1827

```

显然，世界日历的特殊日子非常多。但是，像这样的展示可以让你不要忘记所有重要的“大力水手雕像”揭幕日以及在庆祝“世界菠菜之都”中它所扮演的角色。

更有用的日历选择可能是将与工作相关的日历放入特殊文件中，并在 `calendar.all` 文件中使用该日历来确定在运行命令时将看到哪些事件。

```
$ cat /usr/share/calendar/calendar.all
/*
 * International and national calendar files
 *
 * This is the calendar master file.  In the standard setup, it is
 * included by /etc/calendar/default, so you can make any system-wide
 * changes there and they will be kept when you upgrade.  If you want
 * to edit this file, copy it into /etc/calendar/calendar.all and
 * edit it there.
 *
 */

#ifndef _calendar_all_
#define _calendar_all_

#include <calendar.usholiday>
#include <calendar.work>            <==

#endif /* !_calendar_all_ */

```

日历文件的格式非常简单 - `mm/dd` 格式日期，空格和事件描述。

```
$ cat calendar.work
03/26   Describe how the cal and calendar commands work
03/27   Throw a party!

```

### 注意事项和怀旧

注意，有关日历的命令可能不适用于所有 Linux 发行版，你可能必须记住自己的“大力水手”雕像。

如果你想知道，你可以显示一个日历，远至 9999 —— 即使是预言性的 [2525](https://www.youtube.com/watch?v=izQB2-Kmiic)。

在 [Facebook](https://www.facebook.com/NetworkWorld/) 和 [LinkedIn](https://www.linkedin.com/company/network-world) 上加入网络社区，对那些重要的话题发表评论。

---

via: <https://www.networkworld.com/article/3265752/linux/working-with-calendars-on-linux.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


如何在企业中开展开源计划

Summary: 有 65% 的企业在使用开源软件，并非只有互联网企业才能受惠于开源计划。

有 65% 的企业在使用开源软件，并非只有互联网企业才能受惠于开源计划。

>
> 有 65% 的企业在使用开源软件，并非只有互联网企业才能受惠于开源计划。
>
>
>

![](/data/attachment/album/201804/25/234303oaqa86145gqhgrar.png)

很多互联网企业如 Google、 Facebook、 Twitter 等，都已经正式建立了开源计划（有的公司中建立了单独的<ruby> 开源计划部门 <rt>  open source program office </rt></ruby>（OSPO）），这是在公司内部消化和支持开源产品的地方。在这样一个实际的部门中，企业可以清晰透明地执行开源策略，这是企业成功开源化的一个必要过程。开源计划部门的职责包括：制定使用、分配、选择和审查代码的相关政策；培育开源社区；培训开发技术人员和确保法律合规。

互联网企业并不是唯一建立开源计划的企业，有调查发现各种行业中有 [65% 的企业](https://www.blackducksoftware.com/2016-future-of-open-source)的在使用开源和向开源贡献。在过去几年中 [VMware](http://www.cio.com/article/3095843/open-source-tools/vmware-today-has-a-strong-investment-in-open-source-dirk-hohndel.html)、 [Amazon](http://fortune.com/2016/12/01/amazon-open-source-guru/)、 [Microsoft](https://opensource.microsoft.com/) 等企业，甚至连[英国政府](https://www.linkedin.com/jobs/view/169669924)都开始聘用开源管理人员，开展开源计划。可见近年来商业领域乃至政府都十分重视开源策略，在这样的环境下，各界也需要跟上他们的步伐，建立开源计划。

### 怎样建立开源计划

虽然根据企业的需求不同，各开源计划部门会有特殊的调整，但下面几个基本步骤是建立每个公司都会经历的，它们是：

* **选定一位领导者：** 选出一位合适的领导之是建立开源计划的第一步。 [TODO Group](http://todogroup.org) 发布了一份[开源人员基础工作任务清单](https://github.com/todogroup/job-descriptions)，你可以根据这个清单筛选人员。
* **确定计划构架：** 开源计划部门可以根据其服务的企业类型的侧重点，来适应不同种类的企业需求，以在各类企业中成功运行。知识型企业可以把开源计划放在法律事务部运行，技术驱动型企业可以把开源计划放在着眼于提高企业效能的部门中，如工程部。其他类型的企业可以把开源计划放在市场部内运行，以此促进开源产品的销售。TODO Group 发布的[开源计划案例](https://github.com/todogroup/guides/tree/master/casestudies)或许可以给你些启发。
* **制定规章制度：** 开源策略的实施需要有一套规章制度，其中应当具体列出企业成员进行开源工作的标准流程，来减少失误的发生。这个流程应当简洁明了且简单易行，最好可以用设备进行自动化。如果工作人员有质疑标准流程的热情和能力，并提出改进意见，那再好不过了。许多活跃在开源领域的企业中，Google 发布的规章制度十分值得借鉴。你可以参照 [Google 发布的制度](https://opensource.google.com/docs/why/)起草适用于自己企业的规章制度，用 [TODO 提供其它开源策略](https://github.com/todogroup/policies)也可以参考。 ### 建立开源计划是企业发展中的关键一步

建立开源计划部门对很多企业来说是关键一步，尤其是对于那些软件公司或是想要转型进入软件领域的公司。不论雇员的满意度或是开发效率上，在开源计划中企业可以获得巨大的利益，这些利益远远大于对开源计划所需要的长期投资。在开源之路上有很多资源可以帮助你成功，例如 TODO Group 的[《怎样创建开源计划》](https://github.com/todogroup/guides/blob/master/creating-an-open-source-program.md)、[《开源计划的价值评估》](https://github.com/todogroup/guides/blob/master/measuring-your-open-source-program.md)和[《管理开源计划的几种工具》](https://github.com/todogroup/guides/blob/master/tools-for-managing-open-source-programs.md)都很适合初学者阅读。

随着越来越多的企业形成开源计划，开源社区自身的可持续性逐渐加强，这会对这些企业的开源计划产生积极影响，促进企业的发展，这是企业和开源间的良性循环。我希望以上这些信息能够帮到你，祝你在建立开源计划的路上一路顺风。

---

via: <https://opensource.com/article/18/1/how-start-open-source-program-your-company>

作者：[Chris Aniszczyk](https://opensource.com/users/caniszczyk) 译者：[Valoniakim](https://github.com/Valoniakim) 校对：[wxy](https://github.com/wxy)

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


FreeTube：注重隐私的开源桌面 YouTube 播放器

Summary: 如果你不希望 Google 追踪你在 YouTube 上的行为，那么有一个名为 “FreeTube” 的开源 Youtube 播放器。

![](/data/attachment/album/201804/25/235112hpoiilwzrsyqliiz.png)

你已经知道我们需要 Google 帐户才能订阅频道并从 YouTube 下载视频。如果你不希望 Google 追踪你在 YouTube 上的行为，那么有一个名为 **“FreeTube”** 的开源 Youtube 播放器。它能让你无需使用帐户观看、搜索和下载 Youtube 视频并订阅你喜爱的频道，这可以防止 Google 获取你的信息。它为你提供完整的无广告体验。另一个值得注意的优势是它有一个内置的基础的 HTML5 播放器来观看视频。由于我们没有使用内置的 YouTube 播放器，因此 Google 无法跟踪“观看次数”，也无法视频分析。FreeTube 只会发送你的 IP 详细信息，但这也可以通过使用 VPN 来解决。它是完全免费、开源的，可用于 GNU/Linux、Mac OS X 和 Windows。

### 功能

* 观看没有广告的视频。
* 防止 Google 使用 Cookie 或 JavaScript 跟踪你观看的内容。
* 无须帐户订阅频道。
* 本地存储订阅、历史记录和已保存的视频。
* 导入/备份订阅。
* 迷你播放器。
* 亮/暗的主题。
* 免费、开源。
* 跨平台。

### 安装 FreeTube

进入[发布页面](https://github.com/FreeTubeApp/FreeTube/releases)并根据你使用的操作系统获取版本。在本指南中，我将使用 **.tar.gz** 文件。

```
$ wget https://github.com/FreeTubeApp/FreeTube/releases/download/v0.1.3-beta/FreeTube-linux-x64.tar.xz

```

解压下载的归档：

```
$ tar xf FreeTube-linux-x64.tar.xz

```

进入 Freetube 文件夹：

```
$ cd FreeTube-linux-x64/

```

使用命令启动 Freeube：

```
$ ./FreeTub

```

这就是 FreeTube 默认界面的样子。

![](/data/attachment/album/201804/25/235113xnu6d7iovuorro7r.png)

### 用法

FreeTube 目前使用 **YouTube API** 搜索视频。然后，它使用 **Youtube-dl HTTP API** 获取原始视频文件并在基础的 HTML5 视频播放器中播放它们。由于订阅、历史记录和已保存的视频都存储在本地系统中，因此你的详细信息将不会发送给 Google 或其他任何人。

在搜索框中输入视频名称，然后按下回车键。FreeTube 会根据你的搜索查询列出结果。

![](/data/attachment/album/201804/25/235116p49d4qgf79r17l7b.png)

你可以点击任何视频来播放它。

![](/data/attachment/album/201804/25/235120yznn5e3oqq5oq4eb.png)

如果你想更改主题或默认 API、导入/导出订阅，请进入**设置**部分。

![](/data/attachment/album/201804/25/235122twjcfef51zzp6ewd.png)

请注意，FreeTube 仍处于 **beta** 阶段，所以仍然有 bug。如果有任何 bug，请在本指南最后给出的 GitHub 页面上报告。

干杯！

---

via: <https://www.ostechnix.com/freetube-an-open-source-desktop-youtube-player-for-privacy-minded-people/>

作者：[SK](https://www.ostechnix.com/author/sk/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中使用 LVM 创建和扩展交换分区

Summary: 我们使用 LVM 进行灵活的卷管理，为什么我们不能将 LVM 用于交换分区呢？

我们使用 LVM 进行灵活的卷管理，为什么我们不能将 LVM 用于交换分区呢？

![](/data/attachment/album/201804/26/000030yn7mvp87avlh1mmm.jpg)

我们使用 LVM 进行灵活的卷管理，为什么我们不能将 LVM 用于交换分区呢？

这可以让用户在需要时增加交换分区。如果你升级系统中的内存，则需要添加更多交换空间。这有助于你管理运行需要大量内存的应用的系统。

可以通过三种方式创建交换分区

* 创建一个新的交换分区
* 创建一个新的交换文件
* 在现有逻辑卷（LVM）上扩展交换分区

建议创建专用交换分区而不是交换文件。

**建议阅读：**

* [3 种简单的方法在 Linux 中创建或扩展交换空间](https://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/)
* [使用 Shell 脚本在 Linux 中自动创建/删除和挂载交换文件](https://www.2daygeek.com/shell-script-create-add-extend-swap-space-linux/)

Linux 中推荐的交换大小是多少？

### 什么是交换空间

当物理内存 （RAM） 已满时，将使用 Linux 中的交换空间。当物理内存已满时，内存中的非活动页将移到交换空间。

这有助于系统连续运行应用程序，但它不能当做是更多内存的替代品。

交换空间位于硬盘上，因此它不能像物理内存那样处理请求。

### 如何使用 LVM 创建交换分区

由于我们已经知道如何创建逻辑卷，所以交换分区也是如此。只需按照以下过程。

创建你需要的逻辑卷。在我这里，我要创建 `5GB` 的交换分区。

```
$ sudo lvcreate -L 5G -n LogVol_swap1 vg00
 Logical volume "LogVol_swap1" created.

```

格式化新的交换空间。

```
$ sudo mkswap /dev/vg00/LogVol_swap1
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=d278e9d6-4c37-4cb0-83e5-2745ca708582

```

将以下条目添加到 `/etc/fstab` 中。

```
# vi /etc/fstab
/dev/mapper/vg00-LogVol_swap1 swap swap defaults 0 0

```

启用扩展逻辑卷。

```
$ sudo swapon -va
swapon: /swapfile: already active -- ignored
swapon: /dev/mapper/vg00-LogVol_swap1: found signature [pagesize=4096, signature=swap]
swapon: /dev/mapper/vg00-LogVol_swap1: pagesize=4096, swapsize=5368709120, devsize=5368709120
swapon /dev/mapper/vg00-LogVol_swap1

```

测试交换空间是否已正确添加。

```
$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile file      1459804 526336  -1
/dev/dm-0 partition 5242876 0   -2

$ free -g
 total used free shared buff/cache available
Mem: 1 1 0 0 0 0
Swap: 6 0 6

```

### 如何使用 LVM 扩展交换分区

只需按照以下过程来扩展 LVM 交换逻辑卷。

禁用相关逻辑卷的交换。

```
$ sudo swapoff -v /dev/vg00/LogVol_swap1
swapoff /dev/vg00/LogVol_swap1

```

调整逻辑卷的大小。我将把交换空间从 `5GB` 增加到 `11GB`。

```
$ sudo lvresize /dev/vg00/LogVol_swap1 -L +6G
 Size of logical volume vg00/LogVol_swap1 changed from 5.00 GiB (1280 extents) to 11.00 GiB (2816 extents).
 Logical volume vg00/LogVol_swap1 successfully resized.

```

格式化新的交换空间。

```
$ sudo mkswap /dev/vg00/LogVol_swap1
mkswap: /dev/vg00/LogVol_swap1: warning: wiping old swap signature.
Setting up swapspace version 1, size = 11 GiB (11811155968 bytes)
no label, UUID=2e3b2ee0-ad0b-402c-bd12-5a9431b73623

```

启用扩展逻辑卷。

```
$ sudo swapon -va
swapon: /swapfile: already active -- ignored
swapon: /dev/mapper/vg00-LogVol_swap1: found signature [pagesize=4096, signature=swap]
swapon: /dev/mapper/vg00-LogVol_swap1: pagesize=4096, swapsize=11811160064, devsize=11811160064
swapon /dev/mapper/vg00-LogVol_swap1

```

测试逻辑卷是否已正确扩展。

```
$ free -g
 total used free shared buff/cache available
Mem: 1 1 0 0 0 0
Swap: 12 0 12

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile file      1459804 237024  -1
/dev/dm-0 partition 11534332    0   -2

```

---

via: <https://www.2daygeek.com/how-to-create-extend-swap-partition-in-linux-using-lvm/>

作者：[Ramya Nuvvula](https://www.2daygeek.com/author/ramya/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Linux 目录结构：/lib 分析

Summary: 本文中，让我们来看看 /lib 目录都有些什么。

本文中，让我们来看看 /lib 目录都有些什么。

![](/data/attachment/album/201804/26/211418zpv68t7cgn6pff7m.jpg)

我们在之前的文章中已经分析了其他重要系统目录，比如 `/bin`、`/boot`、`/dev`、 `/etc` 等。可以根据自己的兴趣进入下列链接了解更多信息。本文中，让我们来看看 `/lib` 目录都有些什么。

* [目录结构分析：/bin 文件夹](https://www.linuxnix.com/linux-directory-structure-explained-bin-folder/)
* [目录结构分析：/boot 文件夹](https://www.linuxnix.com/linux-directory-structure-explained-boot-folder/)
* [目录结构分析：/dev 文件夹](https://www.linuxnix.com/linux-directory-structure-explained-dev-folder/)
* [目录结构分析：/etc 文件夹](https://www.linuxnix.com/linux-directory-structure-explainedetc-folder/)
* [目录结构分析：/lost+found 文件夹](https://www.linuxnix.com/lostfound-directory-linuxunix/)
* [目录结构分析：/home 文件夹](https://www.linuxnix.com/linux-directory-structure-home-root-folders/)

### Linux 中，/lib 文件夹是什么？

`/lib` 文件夹是 **库文件目录** ，包含了所有对系统有用的库文件。简单来说，它是应用程序、命令或进程正确执行所需要的文件。在 `/bin` 或 `/sbin` 目录中的命令的动态库文件正是在此目录中。内核模块同样也在这里。

以 `pwd` 命令执行为例。执行它需要调用一些库文件。让我们来探索一下 `pwd` 命令执行时都发生了什么。我们需要使用 [strace 命令](https://www.linuxnix.com/10-strace-command-examples-linuxunix/) 找出调用的库文件。

示例：

```
root@linuxnix:~# strace -e open pwd
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
/root
+++ exited with 0 +++
root@linuxnix:~#

```

如果你注意到的话，会发现我们使用的 `pwd` 命令的执行需要调用两个库文件。

### Linux 中 /lib 文件夹内部信息

正如之前所说，这个文件夹包含了目标文件和一些库文件，如果能了解这个文件夹的一些重要子文件，想必是极好的。下面列举的内容是基于我自己的系统，对于你的来说，可能会有所不同。

```
root@linuxnix:/lib# find . -maxdepth 1  -type d
./firmware
./modprobe.d
./xtables
./apparmor
./terminfo
./plymouth
./init
./lsb
./recovery-mode
./resolvconf
./crda
./modules
./hdparm
./udev
./ufw
./ifupdown
./systemd
./modules-load.d

```

`/lib/firmware` - 这个文件夹包含了一些硬件、<ruby> 固件 <rt>  Firmware </rt></ruby>代码。

>
> **硬件和固件之间有什么不同？**
>
>
> 为了使硬件正常运行，很多设备软件由两部分软件组成。加载到实际硬件的代码部分就是固件，用于在固件和内核之间通讯的软件被称为驱动程序。这样一来，内核就可以直接与硬件通讯，并确保硬件完成内核指派的工作。
>
>
>

`/lib/modprobe.d` - modprobe 命令的配置目录。

`/lib/modules` - 所有的可加载内核模块都存储在这个目录下。如果你有多个内核，你会在这个目录下看到代表美国内核的目录。

`/lib/hdparm` - 包含 SATA/IDE 硬盘正确运行的参数。

`/lib/udev` - 用户空间 /dev 是 Linux 内核设备管理器。这个文件夹包含了所有的 udev 相关的文件和文件夹，例如 `rules.d` 包含了 udev 规范文件。

### /lib 的姊妹文件夹：/lib32 和 /lib64

这两个文件夹包含了特殊结构的库文件。它们几乎和 `/lib` 文件夹一样，除了架构级别的差异。

### Linux 其他的库文件

`/usr/lib` - 所有软件的库都安装在这里。但是不包含系统默认库文件和内核库文件。

`/usr/local/lib` - 放置额外的系统文件。这些库能够用于各种应用。

`/var/lib` - 存储动态数据的库和文件，例如 rpm/dpkg 数据和游戏记录。

---

via: <https://www.linuxnix.com/linux-directory-structure-lib-explained/>

作者：[Surendra Anne](https://www.linuxnix.com/author/surendra/) 译者：[CYLeft](https://github.com/CYLeft) 校对：[wxy](https://github.com/wxy)

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