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

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

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

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

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

[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/) 提交图表查看器可视化的我的一个仓库的一部分：

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

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

```
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） 是为项目的每一项变更运行测试的过程，如同这是新的交付项目一样。如果持续执行，这意味着软件随时可以发布。

# Fedora 社区的持续集成

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

<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：命令行环境

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

这是关于迁徙到 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

```

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

### 搜索

有时我们会遗忘文件的位置，或者忘记了我要寻找的文件名。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 命令行的差异。

---

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 驱动器和操作文件等任务。

# 如何像 Linux 专家那样使用 WSL

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

<img src="content_image/album_201804_22_010003ra74qj2aqaajqqzm.png" alt="WSL" title="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 使安装字体变得简单

# 如何将字体添加到 Fedora

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

### 全系统安装

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

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

[](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 ，本文接下来会重点报道这些为开发者而改变的扩展。

# 开发者的最佳 GNOME 扩展

扩展给予 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 的开发者而言，这个 [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 服务器指示器](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）

[安卓工具](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

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

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

### gistnotes

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

### Arduino 控制器（Arduino Control）

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

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

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

### Hotel Manager

使用 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)来得到更多的信息。

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

---

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/) 荣誉推出


对进程的监视

# 对进程的监视

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

由于复刻了 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 服务器日志分析应用程序

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/ 。

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

如果你有更多站点，你可以使用 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 能够在桌面上显示一个幻灯片。

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

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

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

在 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 里列出、编辑和执行最近输入的命令。

# 给初学者的 fc 示例教程

`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

```

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

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

#### 更改默认编辑器

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

```
$ fc -e nano

```

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

如果你觉得用 `-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 保护你的网站

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

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

曾几何时，通过证书授权机构搭建基本的 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），也包括了证书本身。

*图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 上都没有。

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

目前使用的大多数 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？

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>   喜鹊  <rt>  magpie </rt></ruby> 是孟加拉国的官方鸟。

### 为什么选择 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。它使用 [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: 给在终端窗口花费大量时间的人们的密码管理器。

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

# 3 个 Linux 命令行密码管理器

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

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

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

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

### Titan

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

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

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

### Gopass

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

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 的功能带到你的终端窗口。

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 命令行上使用日历

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

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

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% 的企业在使用开源软件，并非只有互联网企业才能受惠于开源计划。
>
>
>

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

很多互联网企业如 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 播放器。

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

你已经知道我们需要 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 默认界面的样子。

### 用法

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

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

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

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

请注意，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 用于交换分区呢？

# 如何在 Linux 中使用 LVM 创建和扩展交换分区

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

我们使用 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 目录都有些什么。

# Linux 目录结构：/lib 分析

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

我们在之前的文章中已经分析了其他重要系统目录，比如 `/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/) 荣誉推出


如何在 Linux 系统中防止文件和目录被意外的删除或修改

Summary: 有时，我会不小心的按下 SHIFT+DELETE来删除我的文件数据。是的，我是个笨蛋，没有再次确认下我实际准备要删除的东西。

# 如何在 Linux 系统中防止文件和目录被意外的删除或修改

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

有时，我会不小心的按下 `SHIFT+DELETE`来删除我的文件数据。是的，我是个笨蛋，没有再次确认下我实际准备要删除的东西。而且我太笨或者说太懒，没有备份我的文件数据。结果呢？数据丢失了！在一瞬间就丢失了。

这种事时不时就会发生在我身上。如果你和我一样，有个好消息告诉你。有个简单又有用的命令行工具叫`chattr`（**Ch**ange **Attr**ibute 的缩写），在类 Unix 等发行版中，能够用来防止文件和目录被意外的删除或修改。

通过给文件或目录添加或删除某些属性，来保证用户不能删除或修改这些文件和目录，不管是有意的还是无意的，甚至 root 用户也不行。听起来很有用，是不是？

在这篇简短的教程中，我们一起来看看怎么在实际应用中使用 `chattr` 命令，来防止文件和目录被意外删除。

### Linux中防止文件和目录被意外删除和修改

默认，`chattr` 命令在大多数现代 Linux 操作系统中是可用的。

默认语法是：

```
chattr [operator] [switch] [file]

```

`chattr` 具有如下操作符：

* 操作符 `+`，追加指定属性到文件已存在属性中
* 操作符 `-`，删除指定属性
* 操作符 `=`，直接设置文件属性为指定属性

`chattr` 提供不同的属性，也就是 `aAcCdDeijsStTu`。每个字符代表一个特定文件属性。

* `a` – 只能向文件中添加数据
* `A` – 不更新文件或目录的最后访问时间
* `c` – 将文件或目录压缩后存放
* `C` – 不适用写入时复制机制（CoW）
* `d` – 设定文件不能成为 `dump` 程序的备份目标
* `D` – 同步目录更新
* `e` – extend 格式存储
* `i` – 文件或目录不可改变
* `j` – 设定此参数使得当通过 `mount` 参数：`data=ordered` 或者 `data=writeback` 挂载的文件系统，文件在写入时会先被记录在日志中
* `P` – project 层次结构
* `s` – 安全删除文件或目录
* `S` – 即时更新文件或目录
* `t` – 不进行尾部合并
* `T` – 顶层目录层次结构
* `u` – 不可删除

在本教程中，我们将讨论两个属性的使用，即 `a`、`i` ，这个两个属性可以用于防止文件和目录的被删除。这是我们今天的主题，对吧？来开始吧！

### 防止文件被意外删除和修改

我先在我的当前目录创建一个`file.txt`文件。

```
$ touch file.txt

```

现在，我将给文件应用 `i` 属性，让文件不可改变。就是说你不能删除或修改这个文件，就算你是文件的拥有者和 root 用户也不行。

```
$ sudo chattr +i file.txt

```

使用`lsattr`命令检查文件已有属性：

```
$ lsattr file.txt

```

输出：

```
----i---------e---- file.txt

```

现在，试着用普通用户去删除文件：

```
$ rm file.txt

```

输出：

```
# 不能删除文件，非法操作
rm: cannot remove 'file.txt': Operation not permitted

```

我来试试 `sudo` 特权：

```
$ sudo rm file.txt

```

输出：

```
# 不能删除文件，非法操作
rm: cannot remove 'file.txt': Operation not permitted

```

我们试试追加写内容到这个文本文件：

```
$ echo 'Hello World!' >> file.txt

```

输出：

```
# 非法操作
bash: file.txt: Operation not permitted

```

试试 `sudo` 特权：

```
$ sudo echo 'Hello World!' >> file.txt

```

输出：

```
# 非法操作
bash: file.txt: Operation not permitted

```

你应该注意到了，我们不能删除或修改这个文件，甚至 root 用户或者文件所有者也不行。

要撤销属性，使用 `-i` 即可。

```
$ sudo chattr -i file.txt

```

现在，这不可改变属性已经被删除掉了。你现在可以删除或修改这个文件了。

```
$ rm file.txt

```

类似的，你能够限制目录被意外删除或修改，如下一节所述。

### 防止目录被意外删除和修改

创建一个 `dir1` 目录，放入文件 `file.txt`。

```
$ mkdir dir1 && touch dir1/file.txt

```

现在，让目录及其内容（`file.txt` 文件）不可改变：

```
$ sudo chattr -R +i dir1

```

命令中，

* `-R` – 递归使 `dir1` 目录及其内容不可修改
* `+i` – 使目录不可修改

现在，来试试删除这个目录，要么用普通用户，要么用 `sudo` 特权。

```
$ rm -fr dir1
$ sudo rm -fr dir1

```

你会看到如下输出：

```
# 不可删除'dir1/file.txt'：非法操作
rm: cannot remove 'dir1/file.txt': Operation not permitted

```

尝试用 `echo` 命令追加内容到文件，你成功了吗？当然，你做不到。

撤销此属性，输入：

```
$ sudo chattr -R -i dir1

```

现在你就能想平常一样删除或修改这个目录内容了。

### 防止文件和目录被意外删除，但允许追加操作

我们现已知道如何防止文件和目录被意外删除和修改了。接下来，我们将防止文件被删除但仅仅允许文件被追加内容。意思是你不可以编辑修改文件已存在的数据，或者重命名这个文件或者删除这个文件，你仅可以使用追加模式打开这个文件。

为了设置追加属性到文件或目录，我们像下面这么操作：

针对文件：

```
$ sudo chattr +a file.txt

```

针对目录：

```
$ sudo chattr -R +a dir1

```

一个文件或目录被设置了 `a` 这个属性就仅仅能够以追加模式打开进行写入。

添加些内容到这个文件以测试是否有效果。

```
$ echo 'Hello World!' >> file.txt
$ echo 'Hello World!' >> dir1/file.txt

```

查看文件内容使用cat命令

```
$ cat file.txt
$ cat dir1/file.txt

```

输出：

```
Hello World!

```

你将看到你现在可以追加内容。就表示我们可以修改这个文件或目录。

现在让我们试试删除这个文件或目录。

```
$ rm file.txt

```

输出：

```
# 不能删除文件'file.txt'：非法操作
rm: cannot remove 'file.txt': Operation not permitted

```

让我们试试删除这个目录：

```
$ rm -fr dir1/

```

输出：

```
# 不能删除文件'dir1/file.txt'：非法操作
rm: cannot remove 'dir1/file.txt': Operation not permitted

```

删除这个属性，执行下面这个命令：

针对文件：

```
$ sudo chattr -R -a file.txt

```

针对目录：

```
$ sudo chattr -R -a dir1/

```

现在，你可以想平常一样删除或修改这个文件和目录了。

更多详情，查看 man 页面。

```
man chattr

```

### 总结

保护数据是系统管理人员的主要工作之一。市场上有众多可用的免费和收费的数据保护软件。幸好，我们已经拥有这个内置命令可以帮助我们去保护数据被意外的删除和修改。在你的 Linux 系统中，`chattr` 可作为保护重要系统文件和数据的附加工具。

然后，这就是今天所有内容了。希望对大家有所帮助。接下来我将会在这提供其他有用的文章。在那之前，敬请期待。再见！

---

via: <https://www.ostechnix.com/prevent-files-folders-accidental-deletion-modification-linux/>

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

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


为什么微服务是一个安全问题

Summary: 你可能并不想把所有的遗留应用全部分解为微服务，或许你可以考虑从安全功能开始。

你可能并不想把所有的遗留应用全部分解为微服务，或许你可以考虑从安全功能开始。

# 为什么微服务是一个安全问题

>
> 你可能并不想把所有的遗留应用全部分解为微服务，或许你可以考虑从安全功能开始。
>
>
>

我为了给这篇文章起个标题，使出 “洪荒之力”，也很担心这会变成标题党。如果你点击它，是因为它激起了你的好奇，那么我表示抱歉    注1  。我当然是希望你留下来阅读的    注2  ：我有很多有趣的观点以及很多    注3  脚注。我不是故意提出微服务会导致安全问题——尽管如同很多组件一样都有安全问题。当然，这些微服务是那些安全方面的人员的趣向所在。进一步地说，我认为对于那些担心安全的人来说，它们是优秀的架构。

为什么这样说？这是个好问题，对于我们这些有[系统安全](https://aliceevebob.com/2017/03/14/systems-security-why-it-matters/) 经验的人来说，此时这个世界才是一个有趣的地方。我们看到随着带宽便宜了并且延迟降低了，分布式系统在增长。加上部署到云愈加便利，越来越多的架构师们开始意识到应用是可以分解的，不只是分成多个层，并且层内还能分为多个组件。当然，均衡负载可以用于让一个层内的各个组件协同工作，但是将不同的服务输出为各种小组件的能力导致了微服务在设计、实施和部署方面的增长。

所以，[到底什么是微服务呢](https://opensource.com/resources/what-are-microservices)？我同意[维基百科的定义](https://en.wikipedia.org/wiki/Microservices)，尽管没有提及安全性方面的内容   注4  。 我喜欢微服务的一点是，经过精心设计，其符合 Peter H. Salus 描述的 [UNIX 哲学](https://en.wikipedia.org/wiki/Unix_philosophy) 的前俩点：

1. 程序应该只做一件事，并尽可能把它做好。
2. 让程序能够互相协同工作。
3. 应该让程序处理文本数据流，因为这是一个通用的接口。

三者中最后一个有点不太相关，因为 UNIX 哲学通常被用来指代独立应用，它常有一个实例化的命令。但是，它确实包含了微服务的基本要求之一：必须具有“定义明确”的接口。

这里的“定义明确”，我指的不仅仅是可外部访问的 API 的方法描述，也指正常的微服务输入输出操作——以及，如果有的话，还有其副作用。就像我之前的文章描述的，“[良好的系统架构的五个特征](https://opensource.com/article/17/10/systems-architect)”，如果你能够去设计一个系统，数据和主体描述是至关重要的。在此，在我们的微服务描述上，我们要去看看为什么这些是如此重要。因为对我来说，微服务架构的关键定义是可分解性。如果你要分解    注5  你的架构，你必须非常、非常地清楚每个细节（“组件”）要做什么。

在这里，就要开始考虑安全了。特定组件的准确描述可以让你：

* 审查您的设计
* 确保您的实现符合描述
* 提出可重用测试单元来审查功能
* 跟踪实施中的错误并纠正错误
* 测试意料之外的产出
* 监视不当行为
* 审核未来可能的实际行为

现在，这些微服务能用在一个大型架构里了吗？是的。但如果实体是在更复杂的配置中彼此链接或组合在一起，它们会随之越来越难。当你让一小部分可以彼此配合工作时，确保正确的实施和行为是非常、非常容易的。并且如果你不能确定单个组件正在做它们应该作的，那么确保其衍生出来的复杂系统的正确行为及不正确行为就困难的多了。

而且还不止于此。如我已经在许多[以往场合](https://opensource.com/users/mikecamel)提过的，写足够安全的代码是困难的   注7  ，证实它应该做的更加困难。因此，有理由限制有特定安全要求的代码——密码检测、加密、加密密钥管理、授权等等——将它们变成小而定义明确的代码块。然后你就可以执行我上面提及所有工作，以确保正确完成。

还有，我们都知道并不是每个人都擅长于编写与安全相关的代码。通过分解你的体系架构，将安全敏感的代码限制到定义明确的组件中，你就可以把你最棒的安全人员放到这方面，并限制了 J.佛系.码奴    注8  绕过或降级一些关键的安全控制措施的危险。

它可以作为学习的机会：它对于设计/实现/测试/监视的兄弟们都是好的，而且给他们说：“听、读、标记、学习，并且引为己用    注9  。这是应该做的。”

是否应该将所有遗留应用程序分解为微服务？ 不一定。 但是考虑到其带来的好处，你可以考虑从安全入手。

---

* 注1、有一点——有读者总是好的。
* 注2、这是我写下文章的意义。
* 注3、可能没那么有趣。
* 注4、在我写这篇文章时。我或你们中的一个可能会去编辑改变它。
* 注5、这很有趣，听起来想一个园艺术语。并不是说我很喜欢园艺，但仍然...    注6
* 注6、有意思的是，我最先写的 “如果你要分解你的架构....” 听起来想是一个 IT 主题的谋杀电影标题。
* 注7、长期读者可能会记得提到的优秀电影 “The Thick of It”
* 注8、其他的什么人：请随便选择。
* 注9、不是加密<ruby> 摘要 <rt>  digest </rt></ruby>：我不认同原作者的想法。

这篇文章最初出在[爱丽丝、伊娃与鲍伯](https://zh.wikipedia.org/zh-hans/%E6%84%9B%E9%BA%97%E7%B5%B2%E8%88%87%E9%AE%91%E4%BC%AF)——一个安全博客上，并被许可转载。

---

via: <https://opensource.com/article/17/11/microservices-are-security-issue>

作者：[Mike Bursell](https://opensource.com/users/mikecamel) 译者：[erlinux](https://itxdm.me) 校对：[wxy](https://github.com/wxy)

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


Ubuntu 18.04 LTS（仿生河狸）发布！

Summary: Canonical 今天正式发布了可用于计算机、IoT 和云环境的 Ubuntu 18.04 LTS （仿生河狸 Bionic Beaver） 操作系统。

# Ubuntu 18.04 LTS（仿生河狸）发布！

Canonical 今天正式发布了可用于计算机、IoT 和云环境的 Ubuntu 18.04 LTS （<ruby> 仿生河狸 <rp>  （ </rp> <rt>  Bionic Beaver </rt> <rp>  ） </rp></ruby>） 操作系统。

经过六个月的努力工作，被称之为（<ruby> 仿生河狸 <rp>  （ </rp> <rt>  Bionic Beaver </rt> <rp>  ） </rp></ruby>）的 Ubnutu 18.04 LTS 正式发布了，这也是 Ubuntu 的第七个长期支持版（LTS）。在直到 2023 年 4 月的五年内 Canonical 将为其提供安全和软件的更新，这期间将至少会有 5 个维护性更新版本，会将以后发布的 Ubuntu 中的新内核和显卡驱动更新到这个 LTS 版本当中。

正如预期的那样，Ubuntu 18.04 LTS 带来了几个新功能和变化，它开始使用 X.Org 服务器作为默认显示服务器来再次取代在 Ubuntu 17.10 中使用的 Wayland。另一方面，Canonical 计划在 Ubuntu 20.04 LTS 中再次启用 Wayland 作为默认的显示服务器，而现在它将以技术预览版的方式提供，在登录屏幕上可以选择。

另一个很酷的新功能是图形化安装器中的“[最小安装](https://news.softpedia.com/news/ubuntu-18-04-lts-will-let-users-choose-between-normal-and-minimal-installation-520640.shtml)”方式，用户可以安装一个仅有 Mozilla 浏览器和一些方便的标准功能的操作系统。说到了图形安全器，它在这个新版本中进行了重新打造，所以你可以看到它添加了一些不同的选项，也有一些被移去了。

Ubuntu 18.04 LTS 也有了由微软合作开发的新的 Hyper-V 优化镜像，它是 Windows 桌面上最快的 Ubuntu 桌面环境。对于云环境，Ubuntu 18.04 LTS 云镜像集成了 Nvidia GPU 硬件加速功能。

Canonical CEO 及 Ubuntu 的创始人 Mark Shuttleworth 说，“多云操作现在是新业态，优化了启动时间和性能的 Ubuntu 18.04 LTS 在各个主流云平台上将成为用于云计算的最快、最高效的操作系统，特别是在存储和像机器学习这样的计算密集型任务方面。”

### GNOME 3.28 作为默认桌面

同 Ubuntu 17.10 一样，仿生河使用最新的 GNOME 桌面作为默认环境。除了 Nautilus 文件管理器仍旧是 3.26 之外，GNOME 所提供的所有应用都更新到了 3.28，因为事实上当前该版本不再由 GNOME 桌面管理。另外，在 Ubuntu 18.04 LTS 当中，Nautilus 以暗色风格重新进行了装扮。

如果你从使用 GNOME 3.26 的 Ubuntu 17.10 升级的话就会发现，**[GNOME 3.28 自身也带来了许多变化](https://news.softpedia.com/news/gnome-3-28-desktop-environment-officially-released-here-s-what-s-new-520231.shtml)**。一个需要重点提出的功能是 GNOME Shell 界面现在支持雷雳 3 连接。另外，GNOME 3.28 新打造的 GNOME To Do 应用也被默认包括在 Ubuntu 18.04 LTS 当中了。

在所选用的应用当中，我们能注意到 GNOME 日历现在支持气候预报，所包括的 GNOME 字符应用替换了老的字符映射功能，GNOME Boxes 现在使用 spice-vdagent 为 Spice 客户端提供了更好的性能。LibreOffice 6.0 是默认办公套件，Mozilla FireFox 59.0.2 是默认浏览器，OpenJDK 10 是默认 JRE/JDK。

### 多个应用以 Snap 的方式提供

由于 Canonical 在推广其 Snappy 技术，它提供了更好的隔离性和安全，以及贯穿整个 LTS 生命周期的持续升级支持，毫无疑问 Ubuntu 18.04 LTS 将预装几个默认采用 Snap 统一封装包的应用。

这些应用包括 GNOME 日历、GNOME 字符、GNOME 日志和 GNOME 系统监视器等。为了使用户更易于安装 Snap 软件包，Ubuntu 软件应用现在可以让你轻松切换不同的 Snap 商店。有超过 3000 个 Snap 可以从 Snap 商店安装，包括 Firefox、Spotify、Skype 和 Slack 等流行应用。

其它值得一提的还有，在大多数应用中支持彩色 emoji 字符。触摸板支持双指右击，而无需物理按键（可以在 GNOME 设置功能中修改该设置）。鼠标和触摸板有了新的驱动，即 libinput，如果你觉得它不适合你，你仍然可以通过设置来切换回 Synapics 驱动，但是 Canonical 将在以后版本移除它。最后，如果在电池供电时 20 分钟不操作的话，Ubuntu 18.04 LTS 将会自动休眠笔记本。

### Ubuntu 18.04 LTS 底层情况

在底层，Ubuntu 18.04 LTS 使用的是 Linux 4.15 系列的内核，该系列内核最近将结束支持期。不过，我们认为 Canonical 将会继续支持它，直到今年年底发布的第一个维护版本 Ubuntu 18.04.1 LTS 为止——它将使用新的内核和图形驱动。

Canonical 在[发布公告](https://wiki.ubuntu.com/BionicBeaver/ReleaseNotes)中称，“在 Ubuntu 18.04 LTS 中，gcc 现在默认编译程序为即时绑定的<ruby> 独立定位的可执行程序 <rp>  （ </rp> <rt>  position independent executable </rt> <rp>  ） </rp></ruby>（PIE），以更有效的利用<ruby> 地址空间布局随机化 <rp>  （ </rp> <rt>  Address Space Layout Randomization </rt> <rp>  ） </rp></ruby>（ASLR）技术。除了几个例外之外，所有主要的软件包都将重构以获得该能力。”对于 Meltdown 和 Spectre 安全漏洞的缓解措施也已经到位。

从 Ubuntu 17.10 以来有一些新的功能，不过如果你计划从更旧的版本升级，你应该看看“[从 Ubuntu 16.04 LTS 以来的新变化](/article-9183-1.html)”这篇文章。Ubuntu 18.04 LTS 现在可以下载了，在升级前，你应该看看如何[从之前的版本升级](https://news.softpedia.com/news/how-to-upgrade-ubuntu-17-10-or-ubuntu-16-04-lts-to-ubuntu-18-04-lts-520854.shtml)。

### Ubuntu 18.04 LTS 下载

* Ubuntu 桌面版和服务器版 <http://releases.ubuntu.com/18.04/>
* 其它架构的 Ubuntu 服务器 <http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/>
* Ubuntu 云镜像 <https://www.ubuntu.com/download/cloud/>
* Ubuntu 物联网 <https://www.ubuntu.com/download/iot/>
*


“开箱即用” 的 Kubernetes 集群

Summary: 当你想在云上创建一个集群或者尽可能快地构建基础设施时，你可能会用到它。

当你想在云上创建一个集群或者尽可能快地构建基础设施时，你可能会用到它。

# “开箱即用” 的 Kubernetes 集群

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

这是我以前的 [10 分钟内配置 Kubernetes](https://www.youtube.com/watch?v=6xJwQgDnMFE) 教程的精简版和更新版。我删除了一些我认为可以去掉的内容，所以，这个指南仍然是通顺的。当你想在云上创建一个集群或者尽可能快地构建基础设施时，你可能会用到它。

### 1.0 挑选一个主机

我们在本指南中将使用 Ubuntu 16.04，这样你就可以直接拷贝/粘贴所有的指令。下面是我用本指南测试过的几种环境。根据你运行的主机，你可以从中挑选一个。

* [DigitalOcean](https://www.digitalocean.com/) - 开发者云
* [Civo](https://www.civo.com/) - UK 开发者云
* [Packet](https://packet.net/) - 裸机云
* 2x Dell Intel i7 服务器 —— 它在我家中

>
> Civo 是一个相对较新的开发者云，我比较喜欢的一点是，它开机时间只有 25 秒，我就在英国，因此，它的延迟很低。
>
>
>

### 1.1 准备机器

你可以使用一个单台主机进行测试，但是，我建议你至少使用三台机器，这样你就有一个主节点和两个工作节点。

下面是一些其他的指导原则：

* 最好选至少有 2 GB 内存的双核主机
* 在准备主机的时候，如果你可以自定义用户名，那么就不要使用 root。例如，Civo 通常让你在 `ubuntu`、`civo` 或者 `root` 中选一个。

现在，在每台机器上都运行以下的步骤。它将需要 5-10 钟时间。如果你觉得太慢了，你可以使用我[放在 Gist](https://gist.github.com/alexellis/e8bbec45c75ea38da5547746c0ca4b0c) 的脚本 ：

```
$ curl -sL https://gist.githubusercontent.com/alexellis/e8bbec45c75ea38da5547746c0ca4b0c/raw/23fc4cd13910eac646b13c4f8812bab3eeebab4c/configure.sh | sh

```

### 1.2 登入和安装 Docker

从 Ubuntu 的 apt 仓库中安装 Docker。它的版本可能有点老，但是，Kubernetes 在老版本的 Docker 中是测试过的，工作的很好。

```
$ sudo apt-get update \
  && sudo apt-get install -qy docker.io

```

### 1.3 禁用 swap 文件

这是 Kubernetes 的强制步骤。实现它很简单，编辑 `/etc/fstab` 文件，然后注释掉引用 swap 的行即可。

保存它，重启后输入 `sudo swapoff -a`。

>
> 一开始就禁用 swap 内存，你可能觉得这个要求很奇怪，如果你对这个做法感到好奇，你可以去 [这里阅读它的相关内容](https://github.com/kubernetes/kubernetes/issues/53533)。
>
>
>

### 1.4 安装 Kubernetes 包

```
$ sudo apt-get update \
  && sudo apt-get install -y apt-transport-https \
  && curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" \
  | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \
  && sudo apt-get update

$ sudo apt-get update \
  && sudo apt-get install -y \
  kubelet \
  kubeadm \
  kubernetes-cni

```

### 1.5 创建集群

这时候，我们使用 `kubeadm` 初始化主节点并创建集群。这一步仅在主节点上操作。

>
> 虽然有警告，但是 [Weaveworks](https://weave.works/) 和 Lucas（他们是维护者）向我保证，`kubeadm` 是可用于生产系统的。
>
>
>

```
$ sudo kubeadm init

```

如果你错过一个步骤或者有问题，`kubeadm` 将会及时告诉你。

我们复制一份 Kube 配置：

```
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

```

确保你一定要记下如下的加入 `token` 的命令。

```
$ sudo kubeadm join --token c30633.d178035db2b4bb9a 10.0.0.5:6443 --discovery-token-ca-cert-hash sha256:<hash>

```

### 2.0 安装网络

许多网络提供商提供了 Kubernetes 支持，但是，默认情况下 Kubernetes 都没有包括。这里我们使用来自 [Weaveworks](https://weave.works/) 的 Weave Net，它是 Kebernetes 社区中非常流行的选择之一。它近乎不需要额外配置的 “开箱即用”。

```
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

```

如果在你的主机上启用了私有网络，那么，你可能需要去修改 Weavenet 使用的私有子网络，以便于为 Pod（容器）分配 IP 地址。下面是命令示例：

```
$ curl -SL "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')&env.IPALLOC_RANGE=172.16.6.64/27" \
| kubectl apply -f -

```

>
> Weave 也有很酷的称为 Weave Cloud 的可视化工具。它是免费的，你可以在它上面看到你的 Pod 之间的路径流量。[这里有一个使用 OpenFaaS 项目的示例](https://www.weave.works/blog/openfaas-gke)。
>
>
>

### 2.2 在集群中加入工作节点

现在，你可以切换到你的每一台工作节点，然后使用 1.5 节中的 `kubeadm join` 命令。运行完成后，登出那个工作节点。

### 3.0 收获

到此为止 —— 我们全部配置完成了。你现在有一个正在运行着的集群，你可以在它上面部署应用程序。如果你需要设置仪表板 UI，你可以去参考 [Kubernetes 文档](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/)。

```
$ kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION
openfaas1   Ready     master    20m       v1.9.2
openfaas2   Ready     <none>    19m       v1.9.2
openfaas3   Ready     <none>    19m       v1.9.2

```

如果你想看到我一步一步创建集群并且展示 `kubectl` 如何工作的视频，你可以看下面我的视频，你可以订阅它。

你也可以在你的 Mac 电脑上，使用 Minikube 或者 Docker 的 Mac Edge 版本，安装一个 “开箱即用” 的 Kubernetes 集群。[阅读在这里的我的评估和第一印象](https://blog.alexellis.io/docker-for-mac-with-kubernetes/)。

---

via: <https://blog.alexellis.io/your-instant-kubernetes-cluster/>

作者：[Alex Ellis](https://blog.alexellis.io/author/alex/) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中查找文件

Summary: 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。

使用简单的命令在 Linux 下基于类型、内容等快速查找文件。

# 如何在 Linux 中查找文件

>
> 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。
>
>
>

如果你是 Windows 或 OSX 的非资深用户，那么可能使用 GUI 来查找文件。你也可能发现界面受限，令人沮丧，或者两者兼而有之，并学会了组织文件并记住它们的确切顺序。你也可以在 Linux 中做到这一点 —— 但你不必这样做。

Linux 的好处之一是它提供了多种方式来处理。你可以打开任何文件管理器或按下 `Ctrl+F`，你也可以使用程序手动打开文件，或者你可以开始输入字母，它会过滤当前目录列表。

*使用 Ctrl+F 在 Linux 中查找文件的截图*

但是如果你不知道你的文件在哪里，又不想搜索整个磁盘呢？对于这个以及其他各种情况，Linux 都很合适。

### 按命令名查找程序位置

如果你习惯随心所欲地放文件，Linux 文件系统看起来会让人望而生畏。对我而言，最难习惯的一件事是找到程序在哪里。

例如，`which bash` 通常会返回 `/bin/bash`，但是如果你下载了一个程序并且它没有出现在你的菜单中，那么 `which` 命令就是一个很好的工具。

一个类似的工具是 `locate` 命令，我发现它对于查找配置文件很有用。我不喜欢输入程序名称，因为像 `locate php` 这样的简单程序通常会提供很多需要进一步过滤的结果。

有关 `locate` 和 `which` 的更多信息，请参阅 `man` 页面：

* `man which`
* `man locate`

### find

`find` 工具提供了更先进的功能。以下是我安装在许多服务器上的脚本示例，我用于确保特定模式的文件（也称为 glob）仅存在五天，并且所有早于此的文件都将被删除。 （自上次修改以来，分数用于保留最多 240 分钟的偏差）

```
find ./backup/core-files*.tar.gz -mtime +4.9 -exec rm {} \;

```

`find` 工具有许多高级用法，但最常见的是对结果执行命令，而不用链式地按照类型、创建日期、修改日期过滤文件。

`find` 的另一个有趣用处是找到所有有可执行权限的文件。这有助于确保没有人在你昂贵的服务器上安装比特币挖矿程序或僵尸网络。

```
find / -perm /+x

```

有关 `find` 的更多信息，请使用 `man find` 参考 `man` 页面。

### grep

想通过内容中查找文件？ Linux 已经实现了。你可以使用许多 Linux 工具来高效搜索符合模式的文件，但是 `grep` 是我经常使用的工具。

假设你有一个程序发布代码引用和堆栈跟踪的错误消息。你要在日志中找到这些。 `grep` 不总是最好的方法，但如果文件是一个给定的值，我经常使用 `grep -R`。

越来越多的 IDE 正在实现查找功能，但是如果你正在访问远程系统或出于任何原因没有 GUI，或者如果你想在当前目录递归查找，请使用：`grep -R {searchterm}` 或在支持 `egrep` 别名的系统上，只需将 `-e` 标志添加到命令 `egrep -r {regex-pattern}`。

我在去年给 [Raspbian](https://www.raspbian.org/) 中的 `dhcpcd5` 打补丁时使用了这种技术，这样我就可以在[树莓派基金会](https://www.raspberrypi.org/)发布新的 Debian 时继续操作网络接入点了。

哪些提示可帮助你在 Linux 上更有效地搜索文件？

---

via: <https://opensource.com/article/18/4/how-find-files-linux>

作者：[Lewis Cowles](https://opensource.com/users/lewiscowles1986) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


查看 Linux 发行版名称和版本号的 8 种方法

能不能出一个对比 让大家能比对一下啊

能不能出一个对比 让大家能比对一下啊

能不能出一个对比 让大家能比对一下啊

能不能出一个对比 让大家能比对一下啊

收藏了

# 查看 Linux 发行版名称和版本号的 8 种方法

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

如果你加入了一家新公司，要为开发团队安装所需的软件并重启服务，这个时候首先要弄清楚它们运行在什么发行版以及哪个版本的系统上，你才能正确完成后续的工作。作为系统管理员，充分了解系统信息是首要的任务。

查看 Linux 发行版名称和版本号有很多种方法。你可能会问，为什么要去了解这些基本信息呢？

因为对于诸如 RHEL、Debian、openSUSE、Arch Linux 这几种主流发行版来说，它们各自拥有不同的包管理器来管理系统上的软件包，如果不知道所使用的是哪一个发行版的系统，在软件包安装的时候就会无从下手，而且由于大多数发行版都是用 systemd 命令而不是 SysVinit 脚本，在重启服务的时候也难以执行正确的命令。

下面来看看可以使用那些基本命令来查看 Linux 发行版名称和版本号。

### 方法总览

* `lsb_release` 命令
* `/etc/*-release` 文件
* `uname` 命令
* `/proc/version` 文件
* `dmesg` 命令
* YUM 或 DNF 命令
* RPM 命令
* APT-GET 命令

### 方法 1： lsb\_release 命令

LSB（<ruby> Linux 标准库 <rt>  Linux Standard Base </rt></ruby>）能够打印发行版的具体信息，包括发行版名称、版本号、代号等。

```
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

```

### 方法 2： /etc/\*-release 文件

release 文件通常被视为操作系统的标识。在 `/etc` 目录下放置了很多记录着发行版各种信息的文件，每个发行版都各自有一套这样记录着相关信息的文件。下面是一组在 Ubuntu/Debian 系统上显示出来的文件内容。

```
# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# cat /etc/issue.net
Ubuntu 16.04.3 LTS

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"

# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# cat /etc/debian_version
9.3

```

下面这一组是在 RHEL/CentOS/Fedora 系统上显示出来的文件内容。其中 `/etc/redhat-release` 和 `/etc/system-release` 文件是指向 `/etc/[发行版名称]-release` 文件的一个连接。

```
# cat /etc/centos-release
CentOS release 6.9 (Final)

# cat /etc/fedora-release
Fedora release 27 (Twenty Seven)

# cat /etc/os-release
NAME=Fedora
VERSION="27 (Twenty Seven)"
ID=fedora
VERSION_ID=27
PRETTY_NAME="Fedora 27 (Twenty Seven)"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:fedoraproject:fedora:27"
HOME_URL="https://fedoraproject.org/"
SUPPORT_URL="https://fedoraproject.org/wiki/Communicating_and_getting_help"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=27
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=27
PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy"

# cat /etc/redhat-release
Fedora release 27 (Twenty Seven)

# cat /etc/system-release
Fedora release 27 (Twenty Seven)

```

### 方法 3： uname 命令

uname（unix name 的意思） 是一个打印系统信息的工具，包括内核名称、版本号、系统详细信息以及所运行的操作系统等等。

* **建议阅读：** [6种查看系统 Linux 内核的方法](https://www.2daygeek.com/check-find-determine-running-installed-linux-kernel-version/)

```
# uname -a
Linux localhost.localdomain 4.12.14-300.fc26.x86_64 #1 SMP Wed Sep 20 16:28:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

```

以上运行结果说明使用的操作系统版本是 Fedora 26。

### 方法 4： /proc/version 文件

这个文件记录了 Linux 内核的版本、用于编译内核的 gcc 的版本、内核编译的时间，以及内核编译者的用户名。

```
# cat /proc/version
Linux version 4.12.14-300.fc26.x86_64 ([email protected]) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Wed Sep 20 16:28:07 UTC 2017

```

### 方法 5： dmesg 命令

dmesg（<ruby> 展示信息 <rt>  display message </rt></ruby> 或<ruby> 驱动程序信息 <rt>  driver message </rt></ruby>）是大多数类 Unix 操作系统上的一个命令，用于打印内核的消息缓冲区的信息。

```
# dmesg | grep "Linux"
[ 0.000000] Linux version 4.12.14-300.fc26.x86_64 ([email protected]) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC) ) #1 SMP Wed Sep 20 16:28:07 UTC 2017
[ 0.001000] SELinux: Initializing.
[ 0.001000] SELinux: Starting in permissive mode
[ 0.470288] SELinux: Registering netfilter hooks
[ 0.616351] Linux agpgart interface v0.103
[ 0.630063] usb usb1: Manufacturer: Linux 4.12.14-300.fc26.x86_64 ehci_hcd
[ 0.688949] usb usb2: Manufacturer: Linux 4.12.14-300.fc26.x86_64 ohci_hcd
[ 2.564554] SELinux: Disabled at runtime.
[ 2.564584] SELinux: Unregistering netfilter hooks

```

### 方法 6： Yum/Dnf 命令

Yum（<ruby> Yellowdog 更新器修改版 <rt>  Yellowdog Updater Modified </rt></ruby>）是 Linux 操作系统上的一个包管理工具，而 `yum` 命令被用于一些基于 RedHat 的 Linux 发行版上安装、更新、查找、删除软件包。

* **建议阅读：** [在 RHEL/CentOS 系统上使用 yum 命令管理软件包](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/)

```
# yum info nano
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: centos.zswap.net
 * extras: mirror2.evolution-host.com
 * updates: centos.zswap.net
Available Packages
Name : nano
Arch : x86_64
Version : 2.3.1
Release : 10.el7
Size : 440 k
Repo : base/7/x86_64
Summary : A small text editor
URL : http://www.nano-editor.org
License : GPLv3+
Description : GNU nano is a small and friendly text editor.

```

下面的 `yum repolist` 命令执行后显示了 yum 的基础源仓库、额外源仓库、更新源仓库都来自 CentOS 7 仓库。

```
# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: centos.zswap.net
 * extras: mirror2.evolution-host.com
 * updates: centos.zswap.net
repo id repo name status
base/7/x86_64 CentOS-7 - Base 9591
extras/7/x86_64 CentOS-7 - Extras 388
updates/7/x86_64 CentOS-7 - Updates 1929
repolist: 11908

```

使用 `dnf` 命令也同样可以查看发行版名称和版本号。

* **建议阅读：** [在 Fedora 系统上使用 DNF（YUM 的一个分支）命令管理软件包](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/)

```
# dnf info nano
Last metadata expiration check: 0:01:25 ago on Thu Feb 15 01:59:31 2018.
Installed Packages
Name : nano
Version : 2.8.7
Release : 1.fc27
Arch : x86_64
Size : 2.1 M
Source : nano-2.8.7-1.fc27.src.rpm
Repo : @System
From repo : fedora
Summary : A small text editor
URL : https://www.nano-editor.org
License : GPLv3+
Description : GNU nano is a small and friendly text editor.

```

### 方法 7： RPM 命令

RPM（<ruby> 红帽包管理器 <rt>  RedHat Package Manager </rt></ruby>）是在 CentOS、Oracle Linux、Fedora 这些基于 RedHat 的操作系统上的一个强大的命令行包管理工具，同样也可以帮助我们查看系统的版本信息。

* **建议阅读：** [在基于 RHEL 的系统上使用 RPM 命令管理软件包](https://www.2daygeek.com/rpm-command-examples/)

```
# rpm -q nano
nano-2.8.7-1.fc27.x86_64

```

### 方法 8： APT-GET 命令

Apt-Get（<ruby> 高级打包工具 <rt>  Advanced Packaging Tool </rt></ruby>）是一个强大的命令行工具，可以自动下载安装新软件包、更新已有的软件包、更新软件包列表索引，甚至更新整个 Debian 系统。

* **建议阅读：** [在基于 Debian 的系统上使用 Apt-Get 和 Apt-Cache 命令管理软件包](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/)

```
# apt-cache policy nano
nano:
 Installed: 2.5.3-2ubuntu2
 Candidate: 2.5.3-2ubuntu2
 Version table:
 * 2.5.3-2ubuntu2 500
 500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
 100 /var/lib/dpkg/status
 2.5.3-2 500
 500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

```

---

via: <https://www.2daygeek.com/check-find-linux-distribution-name-and-version/>

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

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


gdb 如何调用函数？

# gdb 如何调用函数？

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

（之前的 gdb 系列文章：[gdb 如何工作（2016）](/article-9491-1.html) 和[三步上手 gdb（2014）](/article-9276-1.html)）

在这周，我发现我可以从 gdb 上调用 C 函数。这看起来很酷，因为在过去我认为 gdb 最多只是一个只读调试工具。

我对 gdb 能够调用函数感到很吃惊。正如往常所做的那样，我在 [Twitter](https://twitter.com/b0rk/status/948060808243765248) 上询问这是如何工作的。我得到了大量的有用答案。我最喜欢的答案是 [Evan Klitzke 的示例 C 代码](https://github.com/eklitzke/ptrace-call-userspace/blob/master/call_fprintf.c)，它展示了 gdb 如何调用函数。代码能够运行，这很令人激动！

我（通过一些跟踪和实验）认为那个示例 C 代码和 gdb 实际上如何调用函数不同。因此，在这篇文章中，我将会阐述 gdb 是如何调用函数的，以及我是如何知道的。

关于 gdb 如何调用函数，还有许多我不知道的事情，并且，在这儿我写的内容有可能是错误的。

### 从 gdb 中调用 C 函数意味着什么？

在开始讲解这是如何工作之前，我先快速的谈论一下我是如何发现这件令人惊讶的事情的。

假如，你已经在运行一个 C 程序（目标程序）。你可以运行程序中的一个函数，只需要像下面这样做：

* 暂停程序（因为它已经在运行中）
* 找到你想调用的函数的地址（使用符号表）
* 使程序（目标程序）跳转到那个地址
* 当函数返回时，恢复之前的指令指针和寄存器

通过符号表来找到想要调用的函数的地址非常容易。下面是一段非常简单但能够工作的代码，我在 Linux 上使用这段代码作为例子来讲解如何找到地址。这段代码使用 [elf crate](https://cole14.github.io/rust-elf)。如果我想找到 PID 为 2345 的进程中的 `foo` 函数的地址，那么我可以运行 `elf_symbol_value("/proc/2345/exe", "foo")`。

```
fn elf_symbol_value(file_name: &str, symbol_name: &str) -> Result<u64, Box<std::error::Error>> {
    // 打开 ELF 文件
    let file = elf::File::open_path(file_name).ok().ok_or("parse error")?;
    // 在所有的段 & 符号中循环，直到找到正确的那个
    let sections = &file.sections;
    for s in sections {
        for sym in file.get_symbols(&s).ok().ok_or("parse error")? {
            if sym.name == symbol_name {
                return Ok(sym.value);
            }
        }
    }
    None.ok_or("No symbol found")?
}

```

这并不能够真的发挥作用，你还需要找到文件的内存映射，并将符号偏移量加到文件映射的起始位置。找到内存映射并不困难，它位于 `/proc/PID/maps` 中。

总之，找到想要调用的函数地址对我来说很直接，但是其余部分（改变指令指针，恢复寄存器等）看起来就不这么明显了。

### 你不能仅仅进行跳转

我已经说过，你不能够仅仅找到你想要运行的那个函数地址，然后跳转到那儿。我在 gdb 中尝试过那样做（`jump foo`），然后程序出现了段错误。毫无意义。

### 如何从 gdb 中调用 C 函数

首先，这是可能的。我写了一个非常简洁的 C 程序，它所做的事只有 `sleep` 1000 秒，把这个文件命名为 `test.c` ：

```
#include <unistd.h>

int foo() {
    return 3;
}
int main() {
    sleep(1000);
}

```

接下来，编译并运行它：

```
$ gcc -o test  test.c
$ ./test

```

最后，我们使用 gdb 来跟踪 `test` 这一程序：

```
$ sudo gdb -p $(pgrep -f test)
(gdb) p foo()
$1 = 3
(gdb) quit

```

我运行 `p foo()` 然后它运行了这个函数！这非常有趣。

### 这有什么用？

下面是一些可能的用途：

* 它使得你可以把 gdb 当成一个 C 应答式程序（REPL），这很有趣，我想对开发也会有用
* 在 gdb 中进行调试的时候展示/浏览复杂数据结构的功能函数（感谢 [@invalidop](https://twitter.com/invalidop/status/949161146526781440)）
* [在进程运行时设置一个任意的名字空间](https://github.com/baloo/setns/blob/master/setns.c)（我的同事 [nelhage](https://github.com/nelhage) 对此非常惊讶）
* 可能还有许多我所不知道的用途

### 它是如何工作的

当我在 Twitter 上询问从 gdb 中调用函数是如何工作的时，我得到了大量有用的回答。许多答案是“你从符号表中得到了函数的地址”，但这并不是完整的答案。

有个人告诉了我两篇关于 gdb 如何工作的系列文章：[原生调试：第一部分](https://www.cl.cam.ac.uk/%7Esrk31/blog/2016/02/25/#native-debugging-part-1)，[原生调试：第二部分](https://www.cl.cam.ac.uk/%7Esrk31/blog/2017/01/30/#native-debugging-part-2)。第一部分讲述了 gdb 是如何调用函数的（指出了 gdb 实际上完成这件事并不简单，但是我将会尽力）。

步骤列举如下：

1. 停止进程
2. 创建一个新的栈框（远离真实栈）
3. 保存所有寄存器
4. 设置你想要调用的函数的寄存器参数
5. 设置栈指针指向新的<ruby> 栈框 <rt>  stack frame </rt></ruby>
6. 在内存中某个位置放置一条陷阱指令
7. 为陷阱指令设置返回地址
8. 设置指令寄存器的值为你想要调用的函数地址
9. 再次运行进程！

（LCTT 译注：如果将这个调用的函数看成一个单独的线程，gdb 实际上所做的事情就是一个简单的线程上下文切换）

我不知道 gdb 是如何完成这些所有事情的，但是今天晚上，我学到了这些所有事情中的其中几件。

#### 创建一个栈框

如果你想要运行一个 C 函数，那么你需要一个栈来存储变量。你肯定不想继续使用当前的栈。准确来说，在 gdb 调用函数之前（通过设置函数指针并跳转），它需要设置栈指针到某个地方。

这儿是 Twitter 上一些关于它如何工作的猜测：

>
> 我认为它在当前栈的栈顶上构造了一个新的栈框来进行调用！
>
>
>

以及

>
> 你确定是这样吗？它应该是分配一个伪栈，然后临时将 sp （栈指针寄存器）的值改为那个栈的地址。你可以试一试，你可以在那儿设置一个断点，然后看一看栈指针寄存器的值，它是否和当前程序寄存器的值相近？
>
>
>

我通过 gdb 做了一个试验：

```
(gdb) p $rsp
$7 = (void *) 0x7ffea3d0bca8
(gdb) break foo
Breakpoint 1 at 0x40052a
(gdb) p foo()
Breakpoint 1, 0x000000000040052a in foo ()
(gdb) p $rsp
$8 = (void *) 0x7ffea3d0bc00

```

这看起来符合“gdb 在当前栈的栈顶构造了一个新的栈框”这一理论。因为栈指针（`$rsp`）从 `0x7ffea3d0bca8` 变成了 `0x7ffea3d0bc00` —— 栈指针从高地址往低地址长。所以 `0x7ffea3d0bca8` 在 `0x7ffea3d0bc00` 的后面。真是有趣！

所以，看起来 gdb 只是在当前栈所在位置创建了一个新的栈框。这令我很惊讶！

#### 改变指令指针

让我们来看一看 gdb 是如何改变指令指针的！

```
(gdb) p $rip
$1 = (void (*)()) 0x7fae7d29a2f0 <__nanosleep_nocancel+7>
(gdb) b foo
Breakpoint 1 at 0x40052a
(gdb) p foo()
Breakpoint 1, 0x000000000040052a in foo ()
(gdb) p $rip
$3 = (void (*)()) 0x40052a <foo+4>

```

的确是！指令指针从 `0x7fae7d29a2f0` 变为了 `0x40052a`（`foo` 函数的地址）。

我盯着输出看了很久，但仍然不理解它是如何改变指令指针的，但这并不影响什么。

#### 如何设置断点

上面我写到 `break foo` 。我跟踪 gdb 运行程序的过程，但是没有任何发现。

下面是 gdb 用来设置断点的一些系统调用。它们非常简单。它把一条指令用 `cc` 代替了（这告诉我们 `int3` 意味着 `send SIGTRAP` [https://defuse.ca/online-x86-assembler.html](https://defuse.ca/online-x86-assembler.htm)），并且一旦程序被打断了，它就把指令恢复为原先的样子。

我在函数 `foo` 那儿设置了一个断点，地址为 `0x400528` 。

`PTRACE_POKEDATA` 展示了 gdb 如何改变正在运行的程序。

```
// 改变 0x400528 处的指令
25622 ptrace(PTRACE_PEEKTEXT, 25618, 0x400528, [0x5d00000003b8e589]) = 0
25622 ptrace(PTRACE_POKEDATA, 25618, 0x400528, 0x5d00000003cce589) = 0
// 开始运行程序
25622 ptrace(PTRACE_CONT, 25618, 0x1, SIG_0) = 0
// 当到达断点时获取一个信号
25622 ptrace(PTRACE_GETSIGINFO, 25618, NULL, {si_signo=SIGTRAP, si_code=SI_KERNEL, si_value={int=-1447215360, ptr=0x7ffda9bd3f00}}) = 0
// 将 0x400528 处的指令更改为之前的样子
25622 ptrace(PTRACE_PEEKTEXT, 25618, 0x400528, [0x5d00000003cce589]) = 0
25622 ptrace(PTRACE_POKEDATA, 25618, 0x400528, 0x5d00000003b8e589) = 0

```

#### 在某处放置一条陷阱指令

当 gdb 运行一个函数的时候，它也会在某个地方放置一条陷阱指令。这是其中一条。它基本上是用 `cc` 来替换一条指令（`int3`）。

```
5908  ptrace(PTRACE_PEEKTEXT, 5810, 0x7f6fa7c0b260, [0x48f389fd89485355]) = 0
5908  ptrace(PTRACE_PEEKTEXT, 5810, 0x7f6fa7c0b260, [0x48f389fd89485355]) = 0
5908 ptrace(PTRACE_POKEDATA, 5810, 0x7f6fa7c0b260, 0x48f389fd894853cc) = 0

```

`0x7f6fa7c0b260` 是什么？我查看了进程的内存映射，发现它位于 `/lib/x86_64-linux-gnu/libc-2.23.so` 中的某个位置。这很奇怪，为什么 gdb 将陷阱指令放在 libc 中？

让我们看一看里面的函数是什么，它是 `__libc_siglongjmp` 。其他 gdb 放置陷阱指令的地方的函数是 `__longjmp` 、`___longjmp_chk` 、`dl_main` 和 `_dl_close_worker` 。

为什么？我不知道！也许出于某种原因，当函数 `foo()` 返回时，它调用 `longjmp` ，从而 gdb 能够进行返回控制。我不确定。

### gdb 如何调用函数是很复杂的！

我将要在这儿停止了（现在已经凌晨 1 点），但是我知道的多一些了！

看起来“gdb 如何调用函数”这一问题的答案并不简单。我发现这很有趣并且努力找出其中一些答案，希望你也能够找到。

我依旧有很多未回答的问题，关于 gdb 是如何完成这些所有事的，但是可以了。我不需要真的知道关于 gdb 是如何工作的所有细节，但是我很开心，我有了一些进一步的理解。

---

via: <https://jvns.ca/blog/2018/01/04/how-does-gdb-call-functions/>

作者：[Julia Evans](https://jvns.ca/) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)

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


构建开源硬件的 5 个关键点

Summary: 最大化你的项目影响。

# 构建开源硬件的 5 个关键点

>
> 最大化你的项目影响。
>
>
>

科学社区正在加速拥抱<ruby> 自由及开源硬件 <rt>  Free and Open Source Hardware </rt></ruby>（[FOSH](https://opensource.com/business/16/4/how-calculate-open-source-hardware-return-investment)）。 研究员正忙于[改进他们自己的装备](https://opensource.com/node/16840)并创造数以百计的基于分布式数字制造模型的设备来推动他们的研究。

热衷于 FOSH 的主要原因还是钱： 有研究表明，和专用设备相比，FOSH 可以[节省 90% 到 99% 的花费](http://www.appropedia.org/Open-source_Lab)。基于[开源硬件商业模式](https://www.academia.edu/32004903/Emerging_Business_Models_for_Open_Source_Hardware)的科学 FOSH 的商业化已经推动其快速地发展为一个新的工程领域，并为此定期[举行 GOSH 年会](http://openhardware.science/)。

特别的是，不止一本，而是关于这个主题的[两本学术期刊]：[Journal of Open Hardware] （由 Ubiquity 出版，一个新的自由访问出版商，同时出版了 [Journal of Open Research Software](https://openresearchsoftware.metajnl.com/) ）以及 [HardwareX](https://www.journals.elsevier.com/hardwarex)（由 Elsevier 出版的一种[自由访问期刊](https://opensource.com/node/30041)，它是世界上最大的学术出版商之一）。

由于学术社区的支持，科学 FOSH 的开发者在获取制作乐趣并推进科学快速发展的同时获得学术声望。

### 科学 FOSH 的5个步骤

Shane Oberloier 和我在名为 Designs 的自由访问工程期刊上共同发表了一篇关于设计 FOSH 科学设备原则的[文章](https://www.academia.edu/35603319/General_Design_Procedure_for_Free_and_Open-Source_Hardware_for_Scientific_Equipment)。我们以滑动式烘干机为例，制造成本低于 20 美元，仅是专用设备价格的三百分之一。[科学](https://opensource.com/business/16/4/how-calculate-open-source-hardware-return-investment)和[医疗](https://www.academia.edu/35382852/Maximizing_Returns_for_Public_Funding_of_Medical_Research_with_Open_source_Hardware)设备往往比较复杂，开发 FOSH 替代品将带来巨大的回报。

我总结了 5 个步骤（包括 6 条设计原则），它们在 Shane Oberloier 和我发表的文章里有详细阐述。这些设计原则也可以推广到非科学设备，而且制作越复杂的设计越能带来更大的潜在收益。

如果你对科学项目的开源硬件设计感兴趣，这些步骤将使你的项目的影响最大化。

1. 评估类似现有工具的功能，你的 FOSH 设计目标应该针对实际效果而不是现有的设计（LCTT 译注：作者的意思应该是不要被现有设计缚住手脚）。必要的时候需进行概念证明。
2. 使用下列设计原则：
	* 在设备生产中，仅使用自由和开源的软件工具链（比如，开源的 CAD 工具，例如 [OpenSCAD](http://www.openscad.org/)、 [FreeCAD](https://www.freecadweb.org/) 或 [Blender](https://www.blender.org/)）和开源硬件。
	* 尝试减少部件的数量和类型并降低工具的复杂度
	* 减少材料的数量和制造成本。
	* 尽量使用能够分发的部件或使用方便易得的工具（比如 [RepRap 3D 打印机](http://reprap.org/)）进行部件的数字化生产。
	* 对部件进行[参数化设计](https://en.wikipedia.org/wiki/Parametric_design)，这使他人可以对你的设计进行个性化改动。相较于特例化设计，参数化设计会更有用。在未来的项目中，使用者可以通过修改核心参数来继续利用它们。
	* 所有不能使用现有的开源硬件以分布式的方式轻松且经济地制造的零件，必须选择现货产品以方便采购。
3. 验证功能设计。
4. 提供关于设计、生产、装配、校准和操作的详尽设备文档。包括原始设计文件而不仅仅是用于生产的。<ruby> 开源硬件协会 <rt>  Open Source Hardware Association </rt></ruby>对于开源设计的发布和文档化有额外的[指南](https://www.oshwa.org/sharing-best-practices/)，总结如下：
	* 以通用的形式分享设计文件。
	* 提供详尽的材料清单，包括价格和采购信息。
	* 如果涉及软件，确保代码对大众来说清晰易懂。
	* 作为生产时的参考，必须提供足够的照片，以确保没有任何被遮挡的部分。
	* 在描述方法的章节，整个制作过程必须被细化成简单步骤以便复制此设计。
	* 在线上分享并指定许可证。这为用户提供了合理使用该设计的信息。
5. 主动分享！为了使 FOSH 发扬光大，设计必须被广泛、频繁和有效地分享以提升它们的存在感。所有的文档应该在自由访问文献中发表，并与适当的社区共享。<ruby>   开源科学框架  <rt>  Open Science Framework </rt></ruby>是一个值得考虑的优雅的通用存储库，它由<ruby> 开源科学中心 <rt>  Center for Open Science </rt></ruby>主办，该中心设置为接受任何类型的文件并处理大型数据集。

这篇文章得到了 [Fulbright Finland](http://www.fulbright.fi/en) 的支持，该公司赞助了芬兰 Fulbright-Aalto 大学的特聘校席 Joshua Pearce 在开源科学硬件方面的研究工作。

---

via: <https://opensource.com/article/18/2/5-steps-creating-successful-open-hardware>

作者：[Joshua Pearce](https://opensource.com/users/jmpearce) 译者：[kennethXia](https://github.com/kennethXia) 校对：[wxy](https://github.com/wxy)

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