Lua 值得学习吗？

“路啊”

“鹿啊”

![](/data/attachment/album/202211/12/111937y0kior1oyf44tttt.jpg)

>
> Lua 是一个有趣而强大的语言，随着各个版本的推进，功能愈发的强大，开发者群体也在不断的增长。这篇文章我们将探索一下它的各种前景。
>
>
>

Lua 是一个脚本语言，它面向过程、函数式编程，甚至可以是 [面向对象的](https://opensource.com/article/22/10/object-oriented-lua%20)。它使用类 C 语言的语法，但却是动态类型，具有自动内存管理和垃圾回收功能，使用基于寄存器的虚拟机来解释字节码。这些特点使得它对于初学者来说是个很好的语言，同时也是经验丰富的程序员的强大工具。

虽然与 [Python](https://opensource.com/resources/python) 和 [JavaScript](https://opensource.com/article/22/9/javascript-glossary) 相比，Lua 现在已经有点儿黯然失色了，但是 Lua 拥有的一些优点使得它在许多的重大软件项目中很受欢迎。Lua 很容易嵌入到其他语言当中， 这意味着你可以在（例如）Java 编写的代码中包含 Lua 文件，就像原生的 Java 代码一样运行。这听起来就像魔法一般，现在有许多项目如 [luaj](https://github.com/luaj/luaj) 使得其成为可能，之所以可以实现，正是因为 Lua 就是为此而设计的。部分出于这种灵活性，你可以在许多游戏、图形应用的程序中发现 Lua 脚本的身影。

就像其他任何事情一样，做到完美是需要时间的，但 Lua 是很易于学习（并且有趣）的语言。它是一种一致的语言、一种带有有用的错误消息的友好的语言，并且可以在网上轻松找到许多有用的资料。那么就让我们开始吧！

### 安装 Lua

在 Linux 下，你可以使用发行版自带的包管理来安装 Lua。例如，在 Fedora、CentOS、 Mageia、OpenMandriva 以及类似发行版中：

```
$ sudo dnf install lua

```

在 Debian 以及基于 Debian 的系统中：

```
$ sudo apt install lua

```

对于 Mac，你可以使用 [MacPorts](https://opensource.com/article/20/11/macports) 或者 [Homebrew](https://opensource.com/article/20/6/homebrew-linux)：

```
$ sudo port install lua

```

对于 Windows，可以使用 [Chocolatey](https://opensource.com/article/20/3/chocolatey) 安装 Lua。

完成安装后，可以在终端中输入 `lua` 来在交互式解释器中使用 Lua。

### 函数

如许多编程语言一样，Lua 的语法通常是一个内建的函数或关键字，后面跟着参数。例如，`print` 函数显示你传给它的所有参数。

```
$ lua
Lua 5.4.2  Copyright (C) 1994-2020 Lua.org，PUC-Rio

> print('hello')
hello

```

Lua 的 `string` 库可以操作单词（在编程中称为“字符串”）。例如，要统计字符串中的字母数量，你可以使用 `string` 库中 `len` 函数：

```
> string.len('hello')
5

```

### 变量

变量允许你在计算机内存中为临时的数据创建一个指定的空间。Lua 中创建变量的方法是赋予变量一个名字，接着将数据放入其中。

```
> foo = "hello world"
> print(foo)
hello world
> bar = 1+2
> print(bar)
3

```

### 表

在编程中，数组的使用频率仅次于变量。“数组”这个词的字面意思就是一种排列，而这就是程序中数组的意义了。它是数据的一种排列，因为有排列，所有数组具有结构化的优势。本质上，数组通常用于和变量相同的目的，只不过数组会给对其中的数据进行排序。在 Lua 中，数组被称为“表”。（LCTT 译注：使用过其它编程语言的同学可以发现，Lua 的表相当于其它语言中的关联数组、哈希。）

创建表和创建变量类似，区别仅在于它的初始化内容被设置为 `{}`:

```
> mytable = {}

```

当往表中增加数据时，它就如同创建变量一样，区别在于这里的变量之前总是以表名开头，中间使用 `.` 来连接:

```
> mytable.foo = "hello world"
> mytable.bar = 1+2
> print(mytable.foo)
hello world
> print(mytable.bar)
3

```

### 使用 Lua 编写脚本

在终端交互环境中运行 Lua 可以得到良好的反馈，但是将 Lua 作为脚本运行会更为有用。Lua 脚本就是包含 Lua 代码的文本文件，Lua 命令可以解析并执行此文件。

在刚刚开始学习一门编程语言时，一个永恒的问题是你怎么知道该写什么。这篇文章将提供一个不错的开端，截至目前，你仅知道了两三个 Lua 函数。懂得查阅文档是很关键的。Lua 并不是一个复杂的语言，可以通过 [Lua 文档网站](http://www.lua.org/docs.html) 很方便的获取关键字以及函数的用法。

下面是一个练习题。

假设你想编写一个 Lua 脚本来统计句子中的单词数量。与众多的编程挑战一样，有许多方法可以解决这个问题，假设你在 Lua 文档中找到的第一个相关的函数是 `string.gmatch`，此函数可以搜索字符串中的特定字符。单词通常通过空格分隔开来，所以你决定计算空格数并加 1 来作为单词的数量。

下面是实现的代码：

```
function wc(words,delimiter)
  count=1
  for w in string.gmatch(words，delimiter) do
    count = count + 1
  end

  return count
end

```

下面是这个样例代码的解释：

* `function`：这是声明函数开始的关键字。自定义函数的工作方式与内置函数（如 `print` 和 `string.len`）基本相同。
* `words` 和 `delimiter`：这是函数运行所需的参数。正如 `print('hello')` 当中，`hello` 是一个参数。
* `counter`：一个变量，且被初始化为 `1`。
* `for`：在循环中使用 `string.gmatch` 作为迭代器遍历 `words`，并且在其中搜索`delimiter`。
* `count = count + 1`：当搜索到了 `delimiter`，则对 `count` 进行自增 1 的操作。
* `end`：`for` 循环的结束关键字。
* `return count`：这个函数输出（或返回）`count` 变量的内容。
* `end`：函数结束的关键字。

现在你已经创建了一个函数，你可以使用它。需要记住，函数不会自动运行，而是等待你在代码中调用它。

将下面的代码写入文件并保存为 `words.lua`：

```
function wc(words,delimiter)
  count=1
  for w in string.gmatch(words，delimiter) do
    count = count + 1
  end
  return count
end

result = wc('zombie apocalypse'，' ')
print(result)

result = wc('ice cream sandwich'，' ')
print(result)

result = wc('can you find the bug? '，' ')
print(result)

```

你现在创建了一个 Lua 脚本。你可以使用 Lua 运行它。随后你会发现统计单词的结果有些问题：

```
$ lua ./words.lua
2
3
6

```

你也许已经注意到了最后一个句子的单词统计不正确，因为在句子的最后带有一个额外的空格。Lua正确的检测到了空格，并将其计入 `count` 中，但是单子的统计是错误的，因为有个空格并没有作为单词的分隔出现。我把这个问题留给你来解决，或者去发现其他方法，即使方法不太理想。编程中有很多需要思考的地方。有时是纯粹学术性的思考，有时也许是应用是否运训正常的思考。

### 学习 Lua

Lua 是一个有趣且强大的语言，随着版本的推进，功能愈发的强大，开发者群体也在不断的增长。你可以将 Lua 作为实用性的个人脚本使用，或者在工作中使用，或者仅仅是体验一下一个新的语言。尝试一下，看看 Lua 能给你带来什么吧。

（LCTT 译注：顺便问一句，你知道 “Lua” 怎么发音吗？ ?）

---

via: <https://opensource.com/article/22/11/lua-worth-learning>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lkxed](https://github.com/lkxed) 译者：[MuggleWei](https://github.com/MuggleWei) 校对：[wxy](https://github.com/wxy)

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


使用 GNOME Boxes 将虚拟机镜像移动到另一台主机

竟然没有export和import命令

![](/data/attachment/album/202211/12/113707ewb6ope663w86e5e.jpg)

>
> 本指南介绍了使用 GNOME Boxes 将虚拟机镜像移动到另一台主机所需的步骤。
>
>
>

GNOME Boxes 是由 GNOME 项目创建的虚拟化程序。此程序用作 libvirt 的前端。libvirt 是用于管理平台虚拟化的开源 API、守护进程和管理工具。它支持不同的虚拟化技术，如 KVM、Xen、VMware ESXi、QEMU 等。

如果你想使用 GNOME Boxes 创建虚拟机，[请参阅本指南](https://www.debugpoint.com/2020/05/install-use-gnome-boxes/)。

在本教程中，我将解释如何将任何虚拟机镜像文件（已使用 GNOME Boxes 创建并运行）移动到不同的主机并运行它。

这样，你不再需要从操作系统重新安装虚拟机。此外，它是便携式的，你可以将虚拟机镜像放在 U 盘中。

### 如何使用 GNOME Boxes 将虚拟机镜像移动到另一台主机

我希望你已经在 GNOME Boxes 中创建了一个虚拟机。如果没有，请查看 [本指南](https://www.debugpoint.com/2020/05/install-use-gnome-boxes/)。

GNOME Boxes 和 [libvert](https://libvirt.org/) 使用以下目录存储虚拟机镜像和配置。如下所述，你需要仔细备份每个文件。

GNOME Boxes 将虚拟机的物理镜像（通常为数 GB 大小）保存在以下路径中。对于你的每个虚拟机，你都会在其中找到一个镜像。

```
~/.local/share/gnome-boxes/images/

```

![机器镜像](/data/attachment/album/202211/12/113711fd914s9xz1ej6xtt.png)

将图像文件复制到新主机的路径：`~/.local/share/gnome-boxes/images/`。

将 libvirt 的 XML 配置从以下路径复制到新主机的相同位置。

```
~/.config/libvirt/qemu/

```

![镜像 XML](/data/attachment/album/202211/12/113711qzv44l4k4kviqzhp.png)

在上述路径中，你应该会看到每个虚拟机的单独 xml 文件。复制你需要的那个。

在你当前的系统中打开以下文件。

```
~/.config/gnome-boxes/sources/'QEMU Session'

```

复制属于你的虚拟机的部分（从 `[display` ... 到本部分的末尾）。你可以使用名称轻松找到它（看下面的 `last-seen-name`）。

![QEMU 会话文件](/data/attachment/album/202211/12/113711l18hw61q26c2zlta.png)

在另一台主机上打开相同的上述文件并将复制的内容附加到末尾。保存文件。

关闭新主机中的所有应用，包括 GNOME Boxes。

现在打开 GNOME Boxes，你应该会看到你的虚拟机和它的内容一起被移动到新主机中。

你现在可以拥有一个可以轻松携带和移动的便携式虚拟机。请记住，目标机器应该安装了 GNOME Boxes 才能完成这项工作。

---

via: <https://www.debugpoint.com/move-virtual-machine-image-another-host/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #818  Linux 帮助 Windows 11 支持旧打印机

Summary: • Linux 帮助 Windows 11 支持旧打印机 • DeviantArt 为作品添加 AI 许可标签 • 一根普通光纤传输全球互联网流量

说反了，Linux还需要windows桥来接打印机，例子：UOS

![](/data/attachment/album/202211/12/162047vjcibmom7jx579ia.jpg)

![](/data/attachment/album/202211/12/162057t6o2ybr1hzdrcohn.jpg)

### Linux 帮助 Windows 11 支持旧打印机

也许你有一些古老的激光打印机或一体机，但是它们没有 Windows 11 驱动程序。而 Linux 在支持旧硬件方面明显更好，如果驱动程序仍然可以编译，它就不会被删除。现在你可以通过在 WSL 内运行的 OpenPrinting 中使用旧打印机进行打印。这之所以可以实现，还要感谢 WSL2 支持了 systemd，从而支持 Canonical 的 Snap 版的打印机应用。

>
> **[消息来源：The Register](https://www.theregister.com/2022/11/10/openprinting_keeps_old_printers_working/)**
>
>
>

>
> 老王点评：没想到 WSL 还有这种好处！
>
>
>

![](/data/attachment/album/202211/12/162115rbbcujkvw8g8jwxb.jpg)

### DeviantArt 为作品添加 AI 许可标签

著名艺术网站 DeviantArt 推出了自己的 AI 艺术生成器 DreamUp。为了让艺术家控制他们的作品，DeviantArt 让他们可以选择该工具是否可以使用他们的风格作为直接灵感。并在不允许 AI 使用的作品页面添加特定的标签。DeviantArt 也鼓励其他创作者平台采用这种方法，以确保艺术家仍然能够与在线观众分享他们的作品。

>
> **[消息来源：Engadget](https://www.engadget.com/deviant-art-is-launching-its-own-ai-art-generator-140006449.html)**
>
>
>

>
> 老王点评：确实应该形成一种行业规范，或者新的许可证惯例。
>
>
>

![](/data/attachment/album/202211/12/162130spm4ehsz44pepssf.jpg)

### 一根普通光纤传输全球互联网流量

通过将 55 种模式的信号射入单芯光纤，该团队能够以每秒 1.53 Pbps 的数据速率进行传输。1Pbps 相当于 100 万 Gbps。据估计，整个全球互联网的带宽只有不到 1Pbps，这意味着这根光纤足够处理全球所有的互联网带宽。虽然这不是最快的传输速率，之前有日本研究机构达到了 1.84 Pbps 的速率，但这个纪录的意义在于，它是使用标准覆层直径为 0.125 毫米的光纤实现的，很大程度上与现有的基础设施兼容。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/news/standard-fiber-optic-tech-achieves-record-153-petabit-per-second-transmissions)**
>
>
>

>
> 老王点评：带宽扩展的太快，说不准以后个人设备也需要几个 G 的带宽了。
>
>
>


使用这个多功能的 Linux 命令转换音频文件

Summary: SoX Sound Exchange 甚至可以为你的音频文件添加特效。

SoX Sound Exchange 甚至可以为你的音频文件添加特效。

>
> SoX Sound Exchange 甚至可以为你的音频文件添加特效。
>
>
>

![](/data/attachment/album/202211/13/104314skttlizoioyeaw3w.jpg "HiFi vintage stereo")

我工作需要使用音视频媒体，不管你处理哪种媒体，你肯定知道标准化是一种有价值的工具。就像你不会试图把一个分数加到一个小数上而不转换其中一个一样，我已经知道，把不同格式的媒体组合起来并不理想。为了方便用户，大多数爱好者级应用程序使转换过程不可见。然而，对于那些需要控制媒体细节的用户的灵活软件，会通常让你自己提前将媒体转换为所需的格式。我有一些最喜欢的音频转换工具，其中之一就是号称“音频的瑞士军刀” —— [SoX](http://sox.sourceforge.net/sox.html)。

### 安装

在 Linux 或 BSD 上，可以从软件存储库或 Ports 树中安装 `sox` 命令（，以及一些有用的符号链接）。

你也可以从 [Sourceforge.net](http://sox.sourceforge.net) 上安装 SoX。它不经常发布，但它的代码库往往是稳定的，所以如果你想要最新的功能（如 Opus 支持），构建它是容易和安全的。

SoX 主要提供了 `sox` 命令，但是创建了一些有用的符号链接：`play`、`rec` 和 `soxi`。

### 使用 SoX 获取文件信息

SoX 可以读取和重写音频数据。它是否存储重写的音频数据取决于你。在有些情况下，你不需要存储转换后的数据，例如，当你将输出直接发送到扬声器进行回放时。然而，在进行任何转换之前，最好首先确定要处理的是什么。

使用 `soxi` 命令也可以收集音频文件信息。`soxi` 会符号链接到 `soxi --info`。

```
$ soxi countdown.mp3
Input File（输入文件）    : '/home/tux/countdown.mp3'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.21 = 494185 samples...（11.21 秒 = 494185 采样点）
File Size（文件大小）      : 179k
Bit Rate（比特率）       : 128k
Sample Encoding（编码格式）: MPEG audio (layer I, II or III)

```

这个输出可以让你很好地了解音频文件的编码方式、文件长度、文件大小、采样率和通道数。其中一些你可能*认为*你已经知道了，但当客户把媒体带到我面前时，我从不相信这些假设。使用 `soxi` 验证媒体属性。

### 转换文件

在本例中，，一个游戏节目倒计时的音频是以MP3文件的形式提供的。虽然几乎所有的编辑应用程序都接受压缩音频，但它们并不是在压缩的数据上进行编辑。转换是在某个地方发生的，可能是一个秘密的后台任务，也可能提示让你保存一份副本。我通常喜欢自己提前完成转换。这样，我可以控制使用的格式。我可以在夜间批量处理大量的媒体，而不是浪费宝贵的制作时间，等待编辑应用程序按需处理它们。

`sox` 命令用于转换音频文件。在 `sox` 流程中有几个阶段：

* 输入
* 合并
* 特效
* 输出

但在命令语法中，特效步骤令人困惑地放到了*最后一步*。这意味着 `sox` 流程是这样组成的:

```
输入 → 合并 → 输出 → 特效

```

### 编码

最简单的转换命令只涉及一个输入文件和一个输出文件。下面是转换 MP3 文件为无损 FLAC 文件的命令：

```
$ sox countdown.mp3 output.flac
$ soxi output.flac

Input File（输入文件）     : 'output.flac'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.18 = 493056 samples...（11.18 秒 = 493056 采样点）
File Size（文件大小）      : 545k
Bit Rate（比特率）       : 390k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

```

#### 特效

特效可以在命令末尾指定。它可以在将数据发送到最终目的地之前更改音频。例如，有时声音太大会在转换过程中造成问题：

```
$ sox bad.wav bad.ogg
sox WARN sox: `bad.ogg' output clipped 126 samples; decrease volume?

```

应用**增益**（`gain`）效果通常可以解决此问题：

```
$ sox bad.wav bad.ogg gain -1

```

#### 淡入淡出

另一个常用的效果是**淡入淡出**（`fade`）。此效果允许你定义淡入或淡出的类型，以及你希望淡入淡出效果持续的时间。

下面是一个使用倒抛物线的 6 秒淡入示例：

```
$ sox intro.ogg intro.flac fade p 6

```

这将对音频的头部应用 3 秒的淡入，并从 8 秒标记开始淡出（这段音乐只有 11 秒，因此在这种情况下淡出也是 3 秒）：

```
$ sox intro.ogg intro.flac fade p 3 8

```

`sox` 手册页中列出了不同类型的淡入淡出（正弦、线性、倒抛物线等）以及淡入淡出提供的选项。

#### 特效语法

每个特效插件都有自己的语法，因此请参阅手册页了解如何调用每个特效插件的详细信息。

效果可以在一个命令中以菊花链的方式进行，至少在你想组合它们的范围内是如此。换句话说，没有语法可以只在六秒钟的淡出期间应用一个镶边效果。对于如此精确的东西，你需要一个图形声波编辑器或数字音频工作站，例如 [LMMS](https://opensource.com/life/16/2/linux-multimedia-studio) 或 [Rosegarden](https://opensource.com/article/18/3/make-sweet-music-digital-audio-workstation-rosegarden)。但是，如果你只想应用一次特效，可以在同一命令中将它们一起列出。

此命令应用了一个 -1 的**增益**效果、1.35 的节奏**拉伸**和**淡出**：

```
$ sox intro.ogg output.flac gain -1 stretch 1.35 fade p 0 6
$ soxi output.flac

Input File（输入文件）     : 'output.flac'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）        : 00:00:15.10 = 665808 samples...（15.10 秒 = 665808 采样点）
File Size（文件大小）      : 712k
Bit Rate（比特率）       : 377k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

```

### 组合音频

SoX 还可以通过连接或混合音频文件来组合音频文件。

要连接（或者说*拼接*）文件合并为一个文件，请在命令中提供多个输入文件：

```
$ sox countdown.mp3 intro.ogg output.flac

```

在本例中，`output.flac` 现在包含 `countdown.mp3` 音频，紧接着是 `intro.ogg` 音乐。

但是，如果你希望两首曲目同时播放，可以使用 `--combine mix` 选项：

```
$ sox --combine mix countdown.mp3 intro.ogg output.flac

```

然而，想象一下，这两个输入文件的不同之处不仅仅在于它们的编解码器。人声音轨用单声道（一个声道）录制并不少见，但音乐至少要用立体声（至少两个声道）来录制。SoX 不会给出默认的解决方案，因此你必须首先自己标准化这两个文件的格式。

#### 更改音频文件

选项与后面列出文件名有关。例如，此命令中的 `--channels` 选项将*仅仅*应用于 `input.wav`，而*不被*应用于 `example.ogg` 和 **output.flac**：

```
$ sox --channels 2 input.wav example.ogg output.flac

```

这意味着在 SoX 中，选项的位置非常重要。如果你在命令开始时指定一个选项，那么实际上只会覆盖 SoX 自己从输入文件中收集的内容。然而，在*输出文件*名前的选项决定了 SoX 如何写入音频数据。

要解决前面的通道不兼容问题，你可以首先标准化输入，然后混合：

```
$ sox countdown.mp3 --channels 2 countdown-stereo.flac gain -1
$ soxi countdown-stereo.flac

Input File（输入文件）     : 'countdown-stereo.flac'
Channels（通道数）       : 2
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.18 = 493056 samples...（11.18 秒 = 493056 采样点）
File Size（文件大小）      : 545k
Bit Rate（比特率）       : 390k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

$ sox --combine mix \
  countdown-stereo.flac \
  intro.ogg \
  output.flac

```

SoX 绝对需要多个命令来执行复杂的操作，因此根据需要创建几个临时和中间文件是正常的。

### 多通道音频

当然，并非所有音频都被限制在一个或两个声道。如果你想将多个音频通道组合成一个文件，可以使用 SoX 的 `--combine merge` 选项：

```
$ sox --combine merge countdown.mp3 intro.ogg output.flac
$ soxi output.flac

Input File     : 'output.flac'
Channels       : 3
[...]

```

### 简单的音频操作

在没有视觉界面的情况下操作音频似乎很奇怪，而且对于某些任务来说，SoX 绝对不是最好的工具。然而，对于许多任务，SoX 提供了一个简单而轻量级的工具包。SoX 是一个具有强大潜力的简单命令。有了它，你可以转换音频，操纵通道和波形，甚至生成自己的声音。本文仅简要概述了其功能，因此请阅读其手册页或 [在线文档](http://sox.sourceforge.net/sox.html)，然后看看你能创造什么。

---

via: <https://opensource.com/article/20/2/linux-sox>

作者：[Klaatu](https://opensource.com/users/klaatu) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS) 校对：[wxy](https://github.com/wxy)

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


如何从 Ubuntu 21.10 及以后版本中删除 Firefox Snap

我选择不用Ubuntu，直接转回Debian

来自湖北武汉武汉大学测绘学院的 Firefox 106.0|Windows 7 用户

同楼上，直接逃去Debian了

来自广西南宁的 Chrome Mobile 107.0|Android 13 用户

同楼上，直接逃去Debian了

![](/data/attachment/album/202211/13/112531vis11sa2z1jbs215.jpg)

>
> Ubuntu 21.10 “Impish Indri” 及之后的版本将 Firefox Snap 设为默认浏览器。如果你不喜欢 Snap，可以通过以下方式将其删除并使用库存版本。
>
>
>

关于 Snap 是否是 APT 的更好替代品，一直存在争议。而许多用户更喜欢 Snap 系统，也有一些人非常讨厌它。Ubuntu 和 Canonical 认为它是 Linux 的最佳安装仓库和包管理工具之一。 Snap 被讨厌的主要原因是它的启动很慢。然而，这个论点是另一篇文章的内容。

### 从 Ubuntu 中删除 Firefox Snap 版本

所以，如果你还没有 [听说过这件事](https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/1943840)，Ubuntu 21.10（和所有后续版本）默认提供 Firefox Snap 包。因此，当你从 Ubuntu 21.10 开始安装时，默认的左侧停靠区的快捷方式是 Firefox 的 Snap 版本。你可以使用以下各种方法对其进行验证。

![snap 列表 - Firefox](/data/attachment/album/202211/13/112540mwrtizzikf47rk4f.jpg)

![Firefox snap 桌面快捷方式](/data/attachment/album/202211/13/112540scepewawo11qwhcl.jpg)

如果你因为 [性能](https://www.debugpoint.com/2021/03/clean-up-snap/) 和存储问题而不喜欢 Snap，可以通过以下命令将其删除。

如果已经打开，那么关闭所有 Firefox 实例。

打开一个终端。然后运行以下命令：

```
sudo snap remove firefox

```

等待命令完成。这将从你的系统中删除它的 Snap 可执行文件，并断开 Firefox 与各种系统服务的连接。但是主目录下的 Snap 目录仍然存在。你可以使用以下命令手动删除它：

```
cd ~/snap
rm -r firefox

```

### 安装 Firefox 替代方法

现在，当你删除了 Firefox，你可以通过以下方式来使用此浏览器。

#### 方法 1 – 使用 PPA（推荐）

在使用此方法之前，请确保如上删除了 Firefox 的 Snap 版本。

有一个 [官方 Firefox PPA](https://launchpad.net/~mozillateam/+archive/ubuntu/ppa)，由其开发团队维护。你可以将此 PPA 添加到你的软件源中，并使用它来安装最新的 Firefox。

确保使用文本编辑器创建一个首选项文件，以阻止 Ubuntu 在运行 `apt update` 命令时获取 Firefox 的 Snap 版本：

```
sudo gedit /etc/apt/preferences.d/firefox-no-snap

```

将以下行添加到上面的文件并保存：

```
Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1

```

依次使用以下命令。第一个命令将其从你的系统中完全清除它：

```
sudo apt purge firefox
sudo add-apt-repository ppa:mozillateam/firefox
sudo apt-get update
sudo apt install firefox

```

安装完成后，请确保使用以下命令启用自动升级：

```
echo 'Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";' | sudo tee /etc/apt/apt.conf.d/51unattended-upgrades-firefox

```

重启系统（可选）并使用 deb 版本的 Firefox。

#### 方法 2 – 使用 Firefox 的压缩可执行文件

你可以从官方网站（链接如下）下载适用于 Ubuntu 和其他 Linux 的 Firefox 可执行文件压缩包。然后解压并双击运行 Firefox 可执行文件。这是最安全的方法。如果你使用此方法，你仍然可以获得更新。

>
> **[下载 Firefox](https://www.mozilla.org/en-US/firefox/new/)**
>
>
>

![下载 Firefox 并解压](/data/attachment/album/202211/13/112540q40fwwb45z977zwu.jpg)

![然后运行可执行文件](/data/attachment/album/202211/13/112540e25eok0zjeejkekj.jpg)

#### 方法 3 – 使用 Flatpak 版本的 Firefox

你也可以使用 [Flatpak 版本的 Firefox](https://flathub.org/apps/details/org.mozilla.firefox)，这在 [Ubuntu 中设置 Flatpak](https://www.debugpoint.com/2018/07/how-to-install-flatpak-apps-ubuntu-linux/) 后可用。然后你可以运行以下命令进行安装：

```
flatpak install flathub org.mozilla.firefox

```

#### 方法 4 – 使用与系统耦合更少的 Snap 版本 Firefox

如果你认为你仍然可以继续使用 Snap 版本，但希望在系统中减少沙盒化，那么你可能需要使用以下命令和 [classic 开关](https://snapcraft.io/docs/snap-confinement) 重新安装 Firefox：

```
sudo snap install firefox --classic

```

### 结束语

因此，这是从 Ubuntu 21.10 开始删除 firefox Snap 版本的步骤，以及一些替代方案。我很想知道 Linux Mint 采取了什么措施，因为他们不支持 Snap。此外，这些发行版依赖于 Firefox 的 Ubuntu 上游仓库，看看它们会做什么很有趣。Debian 维护自己的仓库，但主要是 ESR 版本。

---

via: <https://www.debugpoint.com/remove-firefox-snap-ubuntu/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


我使用的 4 款开源编辑器

Summary: 分享一些我最喜欢的开源写作工具。

分享一些我最喜欢的开源写作工具。

![](/data/attachment/album/202211/13/153838gs7u2z33qxxfigx3.jpg)

>
> 分享一些我最喜欢的开源写作工具。
>
>
>

在我的职业生涯中，我已经写过很多东西，主要是作为一名 IT 顾问，创建产品文档作为给的客户可交付成果。这些文档通常针对不同操作系统和软件产品提供说明。

自 2018 年，我开始在 [www.opensource.com](http://www.opensource.com) 上发表关于开源软件的文章。当然，我使用开源软件进行协作。接下来我将介绍我使用过的四款开源编辑器。

### 1、Vi

[Vi](https://opensource.com/article/20/12/vi-text-editor) 也被称为 `Vim`（LCTT 校注：此外不确，Vi 和 Vim 是两个软件，只是 Vim 取代了 Vi，并以 `vi` 的名字运行。），是我学习的第一款开源编辑器。这是我在计算机科学课程中学习的编辑器，并且我所有的 C 语言编程都是通过它完成的。自 1995 年以来，实际上我一直使用它作为命令行编辑器。这款工具有多个迭代版本，以至于我都可以为之写一系列文章了。我只想说，在我的日常使用中，我坚持使用它的基本命令行形式，并进行最小的定制。

### 2、LibreOffice Writer

Writer 是 LibreOffice 开源办公套件的一部分。它是由<ruby> 文档基金会 <rt>  Document Foundation </rt></ruby>维护的全功能文字处理器。它支持行业标准格式，例如开放文档格式 （ODF）、Open XML 和 MS Office DOC、DOCX。可以在其官方网站上 [了解有关 Writer 的更多信息](https://www.libreoffice.org/discover/writer/)。

### 3、Ghostwriter

Ghostwriter 是一个用于 [Markdown 的文本编辑器](https://opensource.com/article/21/10/markdown-editors)。它有一个很好的实时查看器和语法指南或备忘单功能。[访问官方网站](https://github.com/KDE/ghostwriter) 了解更多内容。

### 4、Gedit

Gedit 是许多 Linux 发行版中的基本图形编辑器，被描述为“用于 GNOME 桌面的小型轻量级文本编辑器”。我最近开始使用它来创建 Asciidoc 格式的文章。使用 Asciidoc 的好处是语法易于管理并可导入到 Drupal 等 Web 渲染系统中。通过 [Gedit Wiki](https://wiki.gnome.org/Apps/Gedit) 了解许多提示和技巧。

### 编辑文本

开源世界中有大量编辑软件。随着我继续写作，这个列表可能会增加。我的主要目标是格式简单。我希望我的文章易于在互联网平台上导入、转换和发布。

你的写作风格、功能需求和目标受众将指导你确定首选工具。

---

via: <https://opensource.com/article/22/10/open-source-editors>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss) 选题：[lkxed](https://github.com/lkxed) 译者：[Donkey-Hao](https://github.com/Donkey-Hao) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #819 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅

Summary: • 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅 • 苹果自带的应用无视用户隐私设置 • 谷歌继续资助 GlobalFoundries 提供开源芯片免费制造服务

快进到集体诉讼美政府收集公民隐私，然后律师收集集体信息打官司，再快进到集体诉讼律师收集公民隐私, 然后律师收集集体信息打官司，再快进到集体诉讼律师收集公民隐私...

buff叠满，绕晕了

![](/data/attachment/album/202211/13/173249gkjywjs36lkvgyc8.jpg)

![](/data/attachment/album/202211/13/173256uj885go985f5h48q.jpg)

### 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅

挪威大众汽车公司声称已经制造了一把办公椅，它不仅看起来配得上《星际迷航》中的船长，而且还能用自己的五个轮子在办公室里行驶，速度高达每小时 20 公里。它的可更换电池可以行驶 12 公里。而且，它还有很多装备：360 度防撞传感器、“倒车”摄像头、带加热的刺绣座椅、派对灯、触摸屏显示器、USB 充电器、口袋式的“后备箱”，甚至还有拖车。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/11/11/23453665/volkswagen-star-trek-office-chair-video)**
>
>
>

>
> 老王点评：也许只是营销噱头，如果是真的，就可以买来在办公室开车了~
>
>
>

![](/data/attachment/album/202211/13/173549prujvxzzwzlonoxn.jpg)

### 苹果自带的应用无视用户隐私设置

有专家发现苹果应用商店向该公司发送用户在应用中的几乎所有信息，尽管 iPhone 的隐私设置声称在关闭时 “完全禁用设备分析的共享”。研究人员发现，这个问题在苹果的大部分内置 iPhone 应用套件中都存在。测试发现，苹果在收到这些数据的同时，还能识别你和你的设备，包括 ID、手机类型、联网方式等等。有用户已经于周四在加州联邦法院提起集体诉讼。

>
> **[消息来源：Gizmodo](https://gizmodo.com/apple-iphone-privacy-analytics-class-action-suit-1849774313)**
>
>
>

>
> 老王点评：果然规矩都是给别人定的。
>
>
>

![](/data/attachment/album/202211/13/173602hm3368m93w2zu2pp.jpg)

### 谷歌继续资助 GlobalFoundries 提供开源芯片免费制造服务

谷歌资助 GlobalFoundries，为开源项目开放了资源并承担了费用，在 130 纳米工艺上制造其早期芯片，并计划将升级到 90 纳米工艺。他们已经为 350 个独特的芯片设计提供了实现，其中约 240 个得以成功制造。

>
> **[消息来源：phoronix](https://www.phoronix.com/news/Google-GloFo-Sponsored-Si)**
>
>
>

>
> 老王点评：这才是气魄啊。
>
>
>


如何提高 Ubuntu 和其他 Linux 系统中的扬声器音量

ubuntu每次开机都无法识别已经插好的耳机，还要拔出再插才能识别

![](/data/attachment/album/202211/14/082359euz72h2utucf2v5u.jpg)

>
> 以下是如何在 Ubuntu 和其他 Linux 发行版中提高笔记本和桌面的音量的方法。
>
>
>

你有没有觉得你的 Ubuntu 笔记本的音量太小，尽管你把音量调到了 100%？我相信你有过。主要原因是：很明显，笔记本电脑的扬声器输出强度比大型扬声器要低。

此外，Ubuntu 和其他发行版将默认的最大音量设置为 100%，也就是 0dB（分贝）。0dB 是最大音量的参考值。做个比较，如果你把音量设置为 -10dB，这意味着你的音量比最大的 0dB 安静。

VLC 和一些媒体播放器允许你将音量提高到 200%。在最新的 Ubuntu 中使用一些设置，你可以将音量进一步提高。

>
> **注意**：在你尝试和使用以下方法之前，请记住，每个扬声器都有其制造商设定的硬件限制。偶尔一次，播放超过 100% 的音频是可以的。但是，连续放大到更高的分贝可能会使输出的音频失真，并且从长远来看可能会损坏你的扬声器。因此，在使用时要小心谨慎，并有所限制。
>
>
>

### 在 Ubuntu 和其他发行版中提高扬声器音量

#### 对于最新的 Ubuntu 22.04 及以上版本（GNOME）

从应用菜单中打开“<ruby> 设置 <rt>  Settings </rt></ruby>”，进入“<ruby> 声音 <rt>  Sound </rt></ruby>”标签。

启用 “<ruby> 过度放大 <rt>  Over Amplification </rt></ruby>” 开关。在你启用的那一刻，你应该看到音量条被扩大了。

![在 Ubuntu 中提升音量超过 100%](/data/attachment/album/202211/14/082411p732f0dhaz6zvdp5.jpg)

现在你可以享受音量提升来听音乐了。

#### Fedora、Arch Linux 和其他发行版

如果你使用带有 GNOME 的 Fedora 工作站，你将看不到上述选项，因为这是 Ubuntu 特有的设置。见下面。

![在 Fedora (GNOME)中，扬声器音量最大为 100%](/data/attachment/album/202211/14/082411nbnzxpeeuxjpf3iv.jpg)

因此，对于任何其他 Linux 发行版（Arch、Fedora、RedHat 等）或桌面（KDE、Xfce、LXQt 等），打开终端并安装 [PulseAudio 音量控制器](https://freedesktop.org/software/pulseaudio/pavucontrol/)。

Fedora、RedHat Linux、OpenSUSE 等基于 RPM 的发行版：

```
sudo dnf install pavucontrol

```

对于 Arch Linux、Manjaro：

```
sudo pacman -S pavucontrol

```

基于 Ubuntu 的非 GNOME 发行版：

```
sudo apt install pavucontrol

```

### 如何使用

安装后，从应用菜单中打开 `pavucontrol`，它应该有个 “PulseAudio Volume Control” 菜单项。

![使用 PulseAudio 音量控制增加音量](/data/attachment/album/202211/14/082411m6a9tra73rmsrnn7.jpg)

### 总结

记住，上述方法可以提高整个系统的扬声器音量。这意味着系统的声音和警报也会受到影响。所以，要记住这一点。正如我前面提到的，如果连续使用，提升扬声器音量超过 100% 可能会导致扬声器变形或损坏。

我希望这个教程能帮助你提高系统音量。如果你遇到问题，请在评论栏里告诉我。

---

via: <https://www.debugpoint.com/boost-speaker-volume-ubuntu/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


13 个从头开始构建的独立 Linux 发行版

Summary: 在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

![](/data/attachment/album/202211/14/095522os6236zrzcgs79e9.jpg)

时至今日，世界上已经有成百上千种不同的 Linux 发行版。

它们中的大多数都可以被划归为三个大类 : Debian、Red Hat（Fedora）以及 Arch Linux。

使用基于 Debian/Ubuntu、Red Hat/SUSE 或者 Arch 的 Linux 发行版自然有它们的优势。它们很受大众欢迎，因此它们的包管理器能够提供大量的软件包。

然而，有一些用户更倾向于使用从头开始构建、独立于 DEB/RPM 这类包管理系统之外的发行版。

在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

>
> **注意 :** 显然，下面的列表显然不会包括一些广受欢迎，通常作为创建新发行版的基础的发行版，如 Debian、Ubuntu 和 Fedora 等。此外，列表顺序不分先后，没有特定的排名。
>
>
>

### 1、NixOS

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095524duob1kvcnzz9ku46.png)

NixOS 最初发布于 2003 年，NixOS 建立在 Nix 包管理器之上。它每年发布两个版本，通常是在 5 月和 11 月。

NixOS 可能不是一个直接面向新用户或普通用户的发行版。然而，其独特的 [包管理](https://itsfoss.com/package-manager/) 方法吸引了各种用户。

此外，它仍然支持 32 位系统。

其他特性：

* 构建隔离的包
* 可靠的升级，并且具有回滚功能
* 可重现的系统配置

>
> **[NixOS](https://nixos.org/)**
>
>
>

### 2、Gentoo Linux

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095526ixkrk1ugju5rczbg.jpg)

Geetoo Linux 是一个主要针对操作系统专家的独立 Linux 发行版。它是为那些希望自由定制、微调和优化操作系统以满足其要求的用户而构建。

Gentoo 使用 [Portage 包管理器](https://wiki.gentoo.org/wiki/Portage) 来创建和安装软件包，通常还允许你针对你的硬件来优化它们。Chrome 的开源版本 **Chromium OS** 便是使用 Gentoo 作为其核心的。

不要忘记，Gentoo 是 [仍然支持 32 位架构的发行版](https://itsfoss.com/32-bit-linux-distributions/) 之一。

其他特性：

* 增量更新
* 基于源码的软件管理方法
* 支持 GURU（Gentoo 用户仓库）的<ruby> 层叠 <rt>  Overlay </rt></ruby>仓库的概念，允许用户添加 Gentoo 尚未提供的软件包

>
> **[Gentoo Linux](https://www.gentoo.org/)**
>
>
>

### 3、Void Linux

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095526y3nonllwwmll9lzu.jpg)

Void Linux 是一个 [滚动发布的发行版](https://itsfoss.com/rolling-release/)，使用 X 二进制软件包系统（XBPS）来安装和删除软件。它由前 NetBSD 开发者 Juan Romero Pardines 创建。

它使用 runit 而不是 systemd 作为其初始化系统。此外，它还让你可以选择使用多个 [桌面环境](https://itsfoss.com/best-linux-desktop-environments/)。

其他特性：

* 最小化的系统要求
* 官方库也提供非自由软件包
* 支持树莓派
* 集成 OpenBSD 的 LibreSSL
* 支持 musl C 库
* 支持 32 位系统

>
> **[Void Linux](https://voidlinux.org/)**
>
>
>

### 4、Solus Linux

![solus budgie 2022](/data/attachment/album/202211/14/095526da5o5tjsgpe276ps.jpg)

Solus 的前身是 EvolveOS，它从头开始构建并提供了一些令人兴奋的特性。Solus 的旗舰版本使用自己打造的 Budgie 作为桌面环境。

与本篇文章介绍的其他系统相比，Solus 对于新手较为友好。它设法成为 [最好的 Linux 发行版](https://itsfoss.com/best-linux-distributions/) 之一。

它使用 eopkg 作为其包管理系统，支持版滚动发布模型。按照开发人员的说法，开发 Solus 的目标是用于个人电脑。

其他特性：

* 支持 Budgie、Gnome、MATE 和 KDE Plasma
* 各种开箱即用的软件，从而减少设置工作

>
> **[Solus Linux](https://getsol.us/home/)**
>
>
>

### 5、Mageia

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095527n9dvvzhpjmlfcdhd.jpg)

Mageia 始于 2010 年，它是 Mandriva Linux 的一个分支。它的目标是成为稳定且安全的桌面和服务器操作系统。

Mageia 是一个社区驱动的项目，由非营利组织和贡献者支持。每年会发布一个大版本。

其他特性：

* 支持 32 位系统
* 支持 KDE Plasma、Gnome 和 XFCE
* 最低的系统要求

>
> **[Mageia](https://www.mageia.org/en/)**
>
>
>

### 6、Clear Linux

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095528jxztketkkskkef2k.png)

Clear Linux 是一个由英特尔发布的发行版，主要设计考虑是性能和云服务的使用。

有趣的是，Clear Linux 升级时是作为一个整体而非去升级单个的软件包。所以，即使你不小心弄乱了系统设置，它也可以正确的启动，执行恢复出厂设置，并让用户重新设置。

它不太适合个人用户使用。但可以作为一个独特的选择而尝试一下。

其他特性：

* 针对英特尔平台的高度调优
* 用户和系统文件之间严格分离
* 持续的漏洞扫描

>
> **[Clear Linux OS](https://clearlinux.org/)**
>
>
>

### 7、PCLinuxOS

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095530kgzac0gcu6z85m08.png)

PCLinuxOS 是一个 x86\_64 的 Linux 发行版，使用 APT/RPM 包管理。你可以使用 KDE Plasma、Mate 以及 XFCE 桌面，它同时还提供了更多特性的社区版本的桌面。

得益于 [Synaptic 包管理器](https://itsfoss.com/synaptic-package-manager/)，本地安装的 PCLinuxOS 采用了 APT 包管理系统。但你也可以从它的仓库中找到 RPM 包。

其他特性：

* mylivecd 脚本允许用户去生成一个当前已安装的硬件驱动的“快照”（所有的配置、应用、文档等）并且将它压缩为 ISO CD/DVD/USB 镜像
* 额外支持超过 85 种语言

>
> **[PCLinuxOS](https://www.pclinuxos.com/)**
>
>
>

### 8、4MLinux

![4m linux 2022](/data/attachment/album/202211/14/095530m3llwswe3egpglit.jpg)

[4MLinux](https://itsfoss.com/4mlinux-review/) 是一个通用的 Linux 发行版，重点聚焦于下面四个 **“M”**

* <ruby> 维护 <rt>  Maintenance </rt></ruby>（系统救援 Live CD）
* <ruby> 多媒体 <rt>  Multimedia </rt></ruby>（支持大量的图形、音频和视频格式）
* <ruby> 微服务器 <rt>  Miniserver </rt></ruby>（支持 DNS、FTP、HTTP、MySQL、NFS、Proxy、SMTP、SSH 和 Telnet）
* <ruby> 神秘 <rt>  Mystery </rt></ruby>（包含了经典 Linux 游戏的集合）

它具有最低的系统要求，可作为桌面和服务器版本使用.

其他特性：

* 支持大量的图形、音频和视频格式
* 是小型并且通用的 Linux 发行版

>
> **[4MLinux](http://4mlinux.com/)**
>
>
>

### 9、Tiny Core Linux

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095531iiaaqhp3clhpg3cl.jpg)

Tiny Core Linux 专注于使用 BusyBox 和 FLTK 提供一个基础的系统。它不是一个完备的桌面，所以，并不能保证它可以运行于任何系统。

它只是一个启动到非常精简的 X 桌面所需的核心，通常带有有线互联网访问权限。

用户可以很好的控制一切，但对于新 Linux 用户来说，它并不是一个轻松的开箱即用的系统。

其他特性：

* 旨在从启动时创建的内存副本中运行
* 默认情况下，其操作就像像云端 / 互联网客户端一样
* 用户可以使用 appbrowser 来游览库以及下载应用

>
> **[Tiny Core Linux](http://www.tinycorelinux.net/)**
>
>
>

### 10、Linux From Scratch（LFS）

![Image Credit: Reddit](/data/attachment/album/202211/14/095531wqxajmjn2j9ajnni.png)

Linux From Scratch（LFS）并不是一个系统，而是通过手动构建所有组件来安装 Linux 的一种方法。一旦完成，它提供了一个紧凑、灵活和安全的系统，并且可以很好的理解一个基于 Linux 的操作系统内部是如何工作的。

如果你希望去深入理解 Linux 是如何工作的并且探寻其具体细节，那么 Linux From Scratch（LFS） 是你一定要去尝试，不能错过的一个项目。

其他特性

* 完全从头开始，定制化的构建 Linux 系统
* 极度的灵活性
* 由于从源码开始编译，提供了额外的安全性

>
> **[Linux From Scratch](https://www.linuxfromscratch.org/)**
>
>
>

### 11、Slackware

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095532rech3hyll45hzhc9.jpg)

Slackware 是现今还在维护的最古老的发行版。最初创建于 1993 年，以 Softlanding Linux 系统为基础，随后，许多的 Linux 发行版都是基于 Slackware。

Slackware 目标是称为最类似于 UNIX 的 Linux 发行版，同时保持简单和稳定。

其他特性：

* 支持 32 位和 64 位系统
* 大量的在线文档
* 从奔腾处理器到最新的机器，它都可以运行

>
> **[Slackware](http://www.slackware.com/)**
>
>
>

### 12、Alpine Linux

![alpine linux xfce 2022](/data/attachment/album/202211/14/095533blh999x4vv4zhf0r.png)

Alpine Linux 是一个社区开发的操作系统，专为路由器、防火墙、VPN、VoIP 盒子和服务器而设计。它是 LEAF 项目的一个分支。

Alpine Linux 使用 apk-tools 包管理器，最初由 shell 脚本编写，而后使用 c 语言重构。它是最小的 Linux 发行版之一，仍然支持 32 位系统，并且是一个可以完全从电脑内存运行的操作系统。

其他特性：

* 提供大小仅为 5MB 的最小容器镜像
* 对于主库，提供 2 年的支持；对于社区库，在下一个稳定版本发布前提供支持
* 使用 musl libc 制作，Busybox 使用资源效率高的容器

>
> **[Alpine Linux](https://www.alpinelinux.org/)**
>
>
>

### 13、KaOS

![Image Credits: Distrowatch](/data/attachment/album/202211/14/095533d369e3v1h3u8h888.png)

KaOS 是一个受到 Arch 启发，从头开始构建的 Linux 发行版。它使用 [pacman 包管理器](https://itsfoss.com/pacman-command/)。它是按照"*一个桌面环境（KDE Plasma），一个工具包（Qt），一个架构（X86\_64）*"的理念构建的。

它的软件库比较有限，但依然为普通用户提供了许多工具。

其他特性：

* 最新的 Plasma 桌面
* 紧密集成的滚动和透明的现代桌面发行版

>
> **[KaOS](https://kaosx.us/)**
>
>
>

### 总结

如果你需要一些独特的体验，那么这些独立 Linux 发行版应该能很好的满足你。

然而，如果你想要用其来替换如 Ubuntu 这样主流的 Linux 发行版作为你的桌面系统……你也许需要三思而后行，上面大多数的发行版（并不代表所有）都不是一个日常使用的桌面系统的理想的选项。

但是话又说回来，如果你对 Linux 发行版充满了经验，那么毫无疑问，你会享受这项冒险的任务的。

*如果你想尝试这些独立发行版的其中一种，哪一个会是你的优先选择呢 ? 请在评论中与我们分享。*

---

via: <https://itsfoss.com/independent-linux-distros/>

作者：[sreenath](https://itsfoss.com/author/sreenath/) 选题：[lkxed](https://github.com/lkxed) 译者：[MuggleWei](https://github.com/MuggleWei) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #820 英伟达采用形式验证来验证软件安全性

Summary: • 英伟达采用形式验证来验证软件安全性 • JavaScript、Java、Python、Kotlin 和 Rust 开发者增长惊人 • 密码学家建议考虑非晶格的后量子密码算法

![](/data/attachment/album/202211/14/171325wh1xp2kj0mc13mzl.jpg)

![](/data/attachment/album/202211/14/171335rq9ur5uzzuu9ttgl.jpg)

### 英伟达采用形式验证来验证软件安全性

英伟达软件安全副总裁说，“面向测试的软件验证对安全来说根本不起作用，你可以对提供给用户的功能的质量有一个衡量标准，但对于安全问题，就没有什么作用，……很难知道你是否已经完成了。”幸运的是，有可能用数学方法证明你的代码的行为与它的规范精确一致。这个过程被称为“形式验证”。英伟达采用软件形式验证行业解决方案 SPARK 来证明软件的安全性。在几年前进行过概念验证后，现在许多英伟达产品在使用 SPARK 组件发布。

>
> **[消息来源：AdaCore](https://blog.adacore.com/nvidia-security-team-what-if-we-just-stopped-using-c)**
>
>
>

>
> 老王点评：形式验证是个好方法，但是不是那么容易掌握和推行。
>
>
>

![](/data/attachment/album/202211/14/171346w1qw21q1m2p7nn2n.jpg)

### JavaScript、Java、Python、Kotlin 和 Rust 开发者增长惊人

根据 SlashData 去年夏天从 163 个国家的 26000 多名开发者调查统计而成的第 23 期《开发者国家报告》，JavaScript 仍然是最大的编程语言社区，全球估计有 1960 万开发者每天都在使用 JavaScript；在过去的两年里，Java 社区的规模已经从 830 万增加到 1650 万，而同期开发者只增加了 50%；Python 在过去两年中增加了约 800 万新的开发人员；Kotlin 和 Rust 社区的规模在过去两年里都翻了一番。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/software-development-is-evolving-and-so-is-what-developers-are-interested-in/)**
>
>
>

>
> 老王点评：开发人员越来越倾向于使用主流开发工具，所以流行的越发流行，但是这样就会扼杀一些创新。
>
>
>

![](/data/attachment/album/202211/14/171424sjere5d9erq4q435.jpg)

### 密码学家建议考虑非晶格的后量子密码算法

目前许多密码学系统的安全性是基于大数的因数分解的，但因数分解的一个怪癖使其容易受到量子计算机的攻击。因此人们对上世纪 90 年代提出的“晶格密码学”寄予厚望，美国 NIST 选择的四个后量子密码学标准有三个采用晶格密码学。RSA 算法名称中的 S，Adi Shamir 对此表示担忧，“从某种意义上说，我们是把所有鸡蛋放在同一个篮子里”。今年夏天早些时候，一个有前途的后量子密码学方案不是用量子计算机，而是用一台普通的笔记本电脑破解的。

>
> **[消息来源：Slashdot](https://it.slashdot.org/story/22/11/13/2042250/cryptographys-future-will-be-quantum-safe-heres-how)**
>
>
>

>
> 老王点评：确实如此，只有一种抗量子的密码理论，很难说会不会被发现潜在的弱点。
>
>
>


如何在没有互联网连接的情况下离线更新 Ubuntu

Summary: 本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。

本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。

![](/data/attachment/album/202211/14/232951blxmbe6wn5eympxq.jpg)

>
> 本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。
>
>
>

在很多情况下，你可能需要在没有互联网连接的情况下更新你的 Ubuntu 系统。你可能在外地不方便上网，也可能你需要更新一堆未联网的 Ubuntu，不管是哪种情况，保持你的系统更新最新的软件包总是需要的。

当然，始终建议通过联网来更新系统。

但有时，出于安全考虑，这是不行的。连接到互联网可能需要给你的系统进行额外的加固，以保护它们免受黑客和恶意软件的攻击。

以下的方法使用 [apt-offline](https://github.com/rickysarraf/apt-offline) 来解决这些问题，并概述了在没有互联网的情况下离线更新 Ubuntu 的步骤。

### 准备环节

* 一台能连接到网络的 Ubuntu（你朋友的、咖啡馆、实验室系统）
* 存储了软件包的 U 盘
* 两个系统都安装了 `apt-offline`：一个系统离线，另一个系统联网

### 安装 apt-offline

在两个系统下安装 `apt-offline`。你可以使用以下命令安装：

```
sudo apt install apt-offline

```

如果你想在离线的目标系统安装 `apt-offline`，你可以提前下载到 U 盘里，然后复制到目标系统，再使用下面的命令安装。

Ubuntu 22.04 LTS 和其他版本的下载链接如下所示。你可以选择一个镜像并下载 deb 文件。

>
> **[下载 .deb 文件 – apt-offline](https://packages.ubuntu.com/focal/all/apt-offline/download)**
>
>
>

```
sudo dpkg -i name_of_package.deb

```

### 如何更新 Ubuntu

在离线的目标系统上打开终端，使用以下命令创建一个 .sig 签名文件：

```
sudo apt-offline set ~/offline-data.sig

```

![创建签名文件](/data/attachment/album/202211/14/232953ul5oqm5e4mqkqyq8.jpg)

在这个刚创建的签名文件中，包含下载所需的软件包的路径和详细信息。

![签名文件的内容](/data/attachment/album/202211/14/232954khbk4t9lk21f1t8s.jpg)

把签名文件复制到 U 盘中，再插到联网的 Ubuntu 系统上。

在联网的 Ubuntu 上创建一个目录（参见下面）来存放这些文件。

打开一个终端，运行以下命令来下载所需的软件包。记得根据你的系统，更改下载目录和 .sig 签名文件的路径。

```
apt-offline get -d ~/offline-data-dir offline-data.sig

```

![下载软件包以离线安装](/data/attachment/album/202211/14/232954nic476w2s2zx2z24.jpg)

你可以看到文件相应下载，然后复制整个下载目录到 U 盘，再插到离线的 Ubuntu 系统。

运行以下命令将下载的软件包安装到离线系统，记得根据你的系统更改目录路径。

```
sudo apt-offline install offline-data-dir/

```

![安装软件包](/data/attachment/album/202211/14/232954dvw3pt3m3wweks4y.jpg)

如果一切顺利，你将获得一个更新完的 Ubuntu。

重复以上步骤，就可以保持你的离线 Ubuntu 为最新版本。

希望以上教程能帮到你更新离线的 Ubuntu 系统，如果你遇到任何问题，请在下面的评论框中告诉我。

---

via: <https://www.debugpoint.com/how-to-update-or-upgrade-ubuntu-offline-without-internet/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[littlebirdnest](https://github.com/littlebirdnest) 校对：[wxy](https://github.com/wxy)

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


为什么有时候域名的末尾有个点？

Summary: 但是为什么末尾的点是有用且重要的呢？

为什么后缀名前有一点并且很重要呢？因为没人关心它

点应该是表示根域，然后是一级子域名（例如 .com), 再是子域名（例如 example), 最后是主机名(例如 www). root -> com -> example -> www

但是为什么末尾的点是有用且重要的呢？

![](/data/attachment/album/202211/15/001222ytut3qvtau32f2p2.jpg)

大家好！今年早些时候，我在写《[DNS 是如何工作的](https://wizardzines.com/zines/dns/)》 时，有人问我——为什么人们有时在域名的末尾加一个点？例如，如果你通过运行 `dig example.com` 查询 `example.com` 的 IP，你会看到一下内容：

```
$ dig example.com
example.com.        5678    IN  A   93.184.216.34

```

执行完 `dig` 命令后，`example.com` 有一个 `.` ——变成了 `example.com.`！发生了什么？

有些 DNS 工具也要求传给它的域名后加一个 `.`：如果你在使用 [miekg/dns](https://github.com/miekg/dns) 时传给它 `example.com`，它会报错：

```
// trying to send this message will return an error
m := new(dns.Msg)
m.SetQuestion("example.com", dns.TypeA)

```

最初我以为我知道这个问题的答案（“呃，末尾的点意味着域名是完全限定的？”）。这是对的 —— 一个<ruby> 完全限定域名 <rt>  fully qualified domain name </rt></ruby>（FQDN）是一个末尾有 `.` 的域名！

但是*为什么*末尾的点是有用且重要的呢？

### 在 DNS 的请求/响应中，域名的末尾并没有 “.”

我曾经（错误地）认为 “为什么末尾有一个点？”的答案可能是 “在 DNS 请求/响应中，域名末尾有一个 `.`，所以我们把它放进去，以匹配你的计算机实际发送/接收的内容”。但事实并不是这样！

当计算机发送 DNS 请求/响应时，域名的末尾并没有点。实际上，域名中*没有*点。

域名会被编码成一系列的长度/字符串对。例如，域名 `example.com` 被编码为这 13 个字节。

```
7example3com0

```

编码后的内容一个点也没有。一个 ASCII 域名（如 `example.com`）被转成了各种 DNS 软件的 DNS 请求/响应中使用的格式。

今天我们来讨论域名被转成 DNS 响应的一个地方：区域文件。

### 区域文件中域名末尾的 “.”

一些人管理域名的 DNS 记录的方法是创建一个被称为 “区域文件” 的文本文件，然后配置一些 DNS 服务器软件（如 `nsd` 或 `bind`）来为该区域文件中指定的 DNS 记录提供服务。

下面是一个对应 `example.com` 的示例区域文件：

```
orange  300   IN    A     1.2.3.4
fruit   300   IN    CNAME orange
grape   3000  IN    CNAME example.com.

```

在这个文件中，任何不以 `.` 结尾的域名（比如 `orange`）后都会自动加上 `.example.com`。所以 `orange` 成了 `orange.example.com` 的简称。DNS 服务器从它的配置中得知这是一个 `example.com` 的区域文件，所以它知道在所有不以点结尾的名字后面自动添加 `example.com`。

我想这里的想法只是为了少打几个字符——如果要打出全称，区域文件会是这样：

```
    orange.example.com.  300   IN    A     1.2.3.4
    fruit.example.com.   300   IN    CNAME orange.example.com.
    grape.example.com.   3000  IN    CNAME example.com.

```

确实多了很多字符。

### 你也可以不通过区域文件来使用 DNS

尽管官方的 DNS RFC（[RFC 1035](https://www.rfc-editor.org/rfc/rfc1035#section-4.1.1)）中定义了区域文件格式，但你也可以不通过区域文件来使用 DNS。例如，AWS Route 53 就不用区域文件来存储 DNS 记录！你可以通过 Web 界面或 API 来创建记录，我猜他们是用某种数据库而不是一堆文本文件来存储记录。

不过，Route 53（像许多其他 DNS 工具一样）确实支持导入和导出区域文件，这个功能或许在你更换 DNS 提供商时很有用。

### dig 命令输出中末尾的 “.”

现在我们来讨论下 `dig` 命令的输出：

```
$ dig example.com
; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> +all example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10712
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        81239   IN  A   93.184.216.34

```

有一件奇怪的事是，几乎每一行都以 `;;` 开头，这是怎么回事？`;` 是区域文件中的注释字符！

我想 `dig` 以这种奇怪的方式输出的原因可能是为了方便你粘贴这些内容到区域文件时，不用修改就可以直接用。

这也是 `example.com` 末尾有个 `.` 的原因 —— 区域文件要求域名末尾必须有点（否则它们会被解释为是相对于该区域的）。因此 `dig` 也这么处理了。

我真的希望 dig 有一个 `+human` 选项，以更人性化的方式打印出这些信息，但现在我太懒了，懒得花工夫去实际贡献代码来做这件事（而且我并不擅长 C），所以我只能在我的博客上抱怨一下 :smiley:

### curl 命令输出中末尾的 “.”

我们来看下另一个末尾有 `.` 的例子：`curl`！

我家里有台计算机名为 `grapefruit`，其上运行着 Web 服务器。当我执行 `curl grapefruit` 时，会输出：

```
$ curl grapefruit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
......

```

这样运行没问题！但是如果我在域名后加一个 `.` 会怎样呢？它报错了：

```
$ curl grapefruit.
curl: (6) Could not resolve host: grapefruit.

```

发生了什么？为了搞清楚，我们需要先来学习下搜索域：

### 初识搜索域

当我执行 `curl grapefrult` 时，它是怎么被转成一个 DNS 请求的？你可能会认为我的计算机会向域名 `grapefruit` 发送一个请求，对吗？但事实并不是这样。

让我们用 `tcpdump` 来看看到底是什么域名在被查询。

```
$ sudo tcpdump -i any port 53
[...] A? grapefruit.lan. (32)

```

实际上是向 `grapefruit.lan.` 发送的请求。为什么呢？

解释一下：

1. `curl` 调用函数 `getaddrinfo` 来查询 `grapefruit`
2. `getaddrinfo` 查询了我计算机上的文件 `/etc/resolv.conf`
3. `/etc/resolv.conf` 包含两行内容：

```
nameserver 127.0.0.53
search lan

```
4. 因为有 `search lan` 这行内容，所以 `getaddrinfo` 在 `grapefruit` 的末尾添加了一个 `lan`，去查询 `grapefruit.lan`

### 什么时候搜索域被使用?

现在我们知道了一些奇怪的事情：当我们查询一个域名时，有时会有一个额外的东西（如 `lan`）被加到最后。但是什么时候会发生这种情况呢？

1. 如果我们在域名**末尾**添加一个 `.`，那么这时不会用到搜索域
2. 如果域名**中间包含**一个 `.`（如 `example.com`），那么默认也不会用到搜索域。但是可以通过修改配置来改变处理逻辑（在 [ndots](https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html) 里有更详细的说明）

我们现在知道了 `curl grapefruit.` 与 `curl grapefruit` 结果不一样的原因——因为一个查询的是 `grapefruit.`，而另一个查询的是 `grapefruit.lan.`。

### 我的计算机怎么知道使用哪个搜索域呢？

当我连接路由时，它会通过 DHCP 告诉我它的搜索域是 `lan` —— 它也是通过这个方式给我的计算机分配 IP。

### 所以为什么要在域名末尾加一个点呢？

现在我们已经了解了区域文件和搜索域，下面是我认为的人们要在域名末尾加点的原因：

有两种情况下，域名会被修改，并在末尾添加其他东西。

* 在 `example.com` 的区域文件中，`grapefruit` 会被转为 `grapefruit.example.com`
* 在我的本地网络（我的计算机已经配置了使用搜索域 `lan`），`grapefruit` 被转为 `grapefruit.lan`

因此，由于域名在某些情况下实际上可能被转成其他名字，人们就在结尾处加一个 `.`，以此来表示 “**这是域名，末尾不需要添加任何东西，这就是全部内容**”。否则会引起混乱。

“这就是全部内容”的技术术语是\*\*“完全限定域名”**，简称为**“FQDN”\*\*。所以 `google.com.` 是一个完全限定域名，而 `google.com` 不是。

我总是要提醒自己这样做的原因，因为我很少使用区域文件和搜索域，所以我经常觉得——“我当然是指 `google.com` 而不是 `google.com.something.else`! 我为什么要指其他东西？那太傻了！”

但是有些人确实在使用区域文件和搜索域（例如 Kubernetes 中使用了搜索域！），所以结尾的 `.` 很有用，可以让人确切的知道，不应该再添加其他东西。

### 什么时候在末尾添加 “.”？

以下是关于何时在域名末尾加 ". " 的几个简单说明：

**需要添加：配置 DNS 时**

在配置 DNS 时，使用完全限定域名从来都不是坏事。你不一定要这样做：非完全限定域名通常也能正常工作，但我从来没有遇到过不接受完全限定域名的 DNS 软件。

有些 DNS 软件需要这样做：现在我为 `jvns.ca` 使用的 DNS 服务器让我在域名的末尾加上 `.`（例如在 CNAME 记录中），并提示如果我不添加，它将在我输入的内容末尾加上 `.jvns.ca`。我不同意这个设计决定，但这不是什么大问题，我只是在最后加一个 `.`。

**不需要加：在浏览器中**

令人困惑的是，在浏览器中，在域名结尾处加一个 `.` *不能*正常运行。例如，如果我在浏览器中输入 `https://twitter.com.`，它就会报错。它会返回 404。

我认为这里发生的事情是，它将 HTTP `Host` 标头设置为 `Host：twitter.com.`，而对端的 Web 服务器则期望 `Host：twitter.com`。

同样地，`https://jvns.ca.` 由于某种原因，返回了一个 SSL 错误。

### 我认为相对域名在过去是比较常见的

最后一件事：我认为“相对”域名（比如我用 `grapefruit` 来指代我家的另一台计算机 `grapefruit.lan`）在过去更常用，因为 DNS 是在大学或其他有大型内部网络的大机构中开发的。

在今天的互联网上，使用“绝对”域名（如 `example.com`）似乎更为普遍。

---

via: <https://jvns.ca/blog/2022/09/12/why-do-domain-names-end-with-a-dot-/>

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

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


硬核观察 #821 手写代码导致美国宇航局的水手号探测器失败

Summary: • 手写代码导致美国宇航局的水手号探测器失败 • 一个简单的安卓锁屏漏洞获得了 7 万美元 • 英特尔推出深度伪造实时检测工具

快进到以入侵计算机罪名被谷歌起诉，索赔7万美元

![](/data/attachment/album/202211/15/164648rncea6ga6are4knk.jpg)

![](/data/attachment/album/202211/15/164732p28iz73781e726h6.jpg)

### 手写代码导致美国宇航局的水手号探测器失败

1962 年夏天，美国宇航局启动了水手 1 号任务，这是一项无人驾驶的任务，该装置将飞过金星并探测数据。当时的工程师通常在纸上写出他们的代码。然后这些代码通过一个复杂的系统被翻译成计算机可读的卡片，然后通过计算机执行该程序。这种手工使得意外错误率变得很高。缺失的符号与字符最终导致了水手 1 号任务的彻底失败。这次任务在当时花费了大约 1800 万美元，相当于今天的 1.5 亿美元。

>
> **[消息来源：Slash Gear](https://www.slashgear.com/1101785/this-simple-programing-error-cost-nasa-18-million/)**
>
>
>

>
> 老王点评：计算机发展早期，不说流程，就是工具也很简陋。但是就是这样，也送上天那么多飞行器。
>
>
>

![](/data/attachment/album/202211/15/164658hqsu4a9du8uaqw0i.jpg)

### 一个简单的安卓锁屏漏洞获得了 7 万美元

研究人员发现，任何能拿到谷歌 Pixel 手机的人都可以通过换上自己的 SIM 卡，并输入预设的恢复代码，从而绕过安卓操作系统的锁屏保护。这个漏洞的利用非常简单，但谷歌花了大约五个月的时间来修复。谷歌为此向他支付了 7 万美元的奖金。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/11/14/android-lock-screen-bypass-google-pixel/)**
>
>
>

>
> 老王点评：看似这个钱挣的容易，但是实际上研究人员投入了大量精力才可能遇到这样一块“狗头金”。
>
>
>

![](/data/attachment/album/202211/15/164715on222a2x0za20bu2.jpg)

### 英特尔推出深度伪造实时检测工具

深度伪造视频现在无处不在，你可能见过名人做或说他们实际上从未做过的事情的视频。英特尔开发了 FakeCatcher，这项技术能够以 96% 的准确率检测虚假人脸视频。这是世界上第一个实时深度伪造检测器，它可以在几毫秒内返回结果。该工具是通过检测视频像素中微妙的“血流”信号，在真实视频中寻找真实的线索。当心脏泵血时，人的静脉会改变颜色，这些血流信号是可以从面部各处收集的，算法将这些信号翻译成时空图。然后，利用深度学习，就可以立即检测出一个视频是真的还是假的。

>
> **[消息来源：PC Gamer](https://www.pcgamer.com/intels-fakecatcher-tech-can-detect-deepfakes-instantly-with-96-accuracy/)**
>
>
>

>
> 老王点评：果然魔高一尺，道高一丈。不过我想深度伪造可能很快就会学会添加血流信号。
>
>
>


如何在 Linux 中确定运行的是那种初始化系统

![](/data/attachment/album/202211/15/183009zafv77ru1afwprr7.jpg)

>
> 你可以通过以下方式确定你的 Linux 发行版中是否正在运行 systemd 或其它初始化系统。
>
>
>

首个进程在你启动 Linux 发行版时开始运行，它称为初始化进程 init（<ruby> 初始化 <rt>  initialization </rt></ruby>的缩写）。它的进程标识符为 1（即 pid=1）。基于 Unix 的系统中的所有进程和应用程序都是这个初始化进程的后代。

根据功能和特性，存在不同类型的初始化进程。例如，[systemd](https://www.debugpoint.com/tag/systemd)、Runit、OpenRC、sysVinit 等。其中，systemd 是最流行和最现代的一种，被包括 Ubuntu 和 Fedora 在内的所有现代 Linux 发行版使用和采用。

与传统的基于 Unix 的初始化系统相比，systemd 及其性能一直存在争议。但这就是另外一个话题了。

让我们看看如何确定在 Linux 发行版中运行的是 systemd 还是其它初始化系统。

### systemd 还是其它初始化系统？

不幸的是，没有直接的命令可以找到它。你可以从初始化进程追溯它，它基本上是到 `/sbin/init` 的符号链接，即 pid=1。

使用 [strings](https://linux.die.net/man/1/strings) 命令打印嵌入在二进制文件 `/sbin/init` 中的文本并使用以下命令搜索 `init`：

```
strings /sbin/init | grep init

```

#### 示例 1

在下面的输出中，它是一个运行 Debian（Peppermint OS）的 sysVinit 系统。如你所见，它清楚地显示了 `init` 进程名称。

```
strings /sbin/init | grep init

```

![显示使用 sysVinit 而不是 systemd 的示例](/data/attachment/album/202211/15/183014plepgljmpjbzdktl.jpg)

如果在上述同一个系统中找 `systemd`，那么不会有任何结果。因此，你可以得出结论，你正在运行 sysVinit 而不是 systemd。

#### 示例 2

如果你在 systemd 系统中运行上述命令，你可以在输出的第一行轻松看到 systemd 及其版本。

```
strings /sbin/init | grep systemd

```

![显示它使用 systemd 的示例](/data/attachment/album/202211/15/183014bd8niin4miginidz.jpg)

#### 示例 3

你也可以尝试使用 `pstree` 命令打印进程树，它应该会显示第一个进程名称。它应该是 `systemd` 或 `init`，如下例所示。

```
pstree

```

![pstree 显示使用 systemd](/data/attachment/album/202211/15/183014ff1sciebf7inmmu7.jpg)

![pstree 显示使用 init](/data/attachment/album/202211/15/183014kg7a09lhas8l9z3e.jpg)

这就好了。这样你就可以轻松找出你的发行版是使用 systemd 还是其他的。

---

via: <https://www.debugpoint.com/systemd-or-init/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Linux Mint 的更新管理器现在支持 Flatpak

Summary: Linux Mint 的更新管理器变得更有用了！

Linux Mint 的更新管理器变得更有用了！

>
> Linux Mint 的更新管理器变得更有用了！
>
>
>

![Linux Mint's Update Manager Now Supports Flatpak](/data/attachment/album/202211/16/090150jwoolucc6zywynsy.png)

Linux Mint 的更新管理器是该发行版的一个重要组成部分，它使新用户可以获得更为方便简易的体验。

最近的一次更新 Linux Mint 21 推出了许多改进，包括更新管理器对 Flatpak 的支持。

**你只需要更新你的系统就可以获得这些改进。**

### ⭐ 更新管理器中支持 Flatpak

![linux mint 21 flatpak support in update manager](/data/attachment/album/202211/16/090150oddvdclecqttqbjl.png)

是的，你没看错。这终于实现了。

Flatpak 支持已被添加到更新管理器中，用户只需单击几下就能更新 Flatpak 应用程序和运行时。

这将为进一步改善用户体验的统一更新体验提供了帮助。

这对新用户来说很有好处，他们不需要熟悉终端命令就能更新 Flatpak。此外，你不需要将 Flatpak 与软件中心集成（对于 GNOME 而言）。

换句话说，Linux Mint 团队增强了你使用 Flatpak 应用程序的体验。

**除了对 Flatpak 的支持，本次更新还包括对 Linux Mint 21 的更多增强，这是一个开箱即用的更新。**

这些改进包括：

### 对角栏的改进

![linux mint 21 updated corner bar](/data/attachment/album/202211/16/090151w869d6ibdt89t246.png)

Linux Mint 21 中的 <ruby> 角栏 <rt>  Corner Bar </rt></ruby> 添加了两项新特性：

* 能够在角栏设置左键点击和中键点击的动作；你可以配置它以显示桌面、工作区选择器或桌面。
* 一个允许你将鼠标悬停在角栏上以显示桌面的新选项。

### Nemo 的更新

![linux mint 21 updated nemo file manager](/data/attachment/album/202211/16/090151vg9e922o194djd19.png)

Nemo 文件管理器做了一些调整；现在，当文件被选中时，只会高亮显示文件名，而不是图标和文件名。

**如果你还不知道**, 你也可以通过我们建议的一些调整来增强 Nemo 文件管理器的体验：

>
> **[调整 Linux 中的 Nemo 文件管理器，让它更好用的 15 种方法](https://itsfoss.com/nemo-tweaks/)**
>
>
>

此外，桌面图标被垂直翻转，桌面上下文菜单中添加了一个新的快捷方式，可以快速打开显示设置。

### 更少的密码提示

这是很多人可能喜欢的另一个用户体验调整。

当删除 Flatpak 或任何快捷方式或本地应用程序时，它将不再要求你输入密码。

类似地，在新立得（LCTT 译注：Linux 下的一个包管理工具）和更新管理器的情况下，将使用 pkexec 来记住密码。

这样，用户就不需要每次执行多个操作时都输入密码。

你可以浏览 [Linux Mint 月度博客](https://blog.linuxmint.com/?p=4424) 以了解其它变化。

---

via: <https://news.itsfoss.com/linux-mint-update-manager/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lkxed](https://github.com/lkxed) 译者：[qfzy1233](https://github.com/qfzy1233) 校对：[wxy](https://github.com/wxy)

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


Fedora Linux 37 发布

Summary: 今天我很兴奋地与大家分享成千上万的 Fedora 项目贡献者的辛勤工作成果

今天我很兴奋地与大家分享成千上万的 Fedora 项目贡献者的辛勤工作成果

![](/data/attachment/album/202211/16/100324s55ub59dtnyxttuu.jpg)

今天我很兴奋地与大家分享成千上万的 Fedora 项目贡献者的辛勤工作成果：Fedora Linux 37 版本来了！让我们看看这个最新版本给你带来了什么。一如既往，在从以前的版本升级之前，你应该确保你的系统是完全最新的。迫不及待地想开始了吗？在你阅读的同时 [下载](https://getfedora.org)！

>
> **[下载 Fedora Linux 37](https://getfedora.org)**
>
>
>

### 两个新的版本

Fedora 的各个“<ruby> 版本 <rt>  Edition </rt></ruby>”是针对某一特定“市场”的旗舰产品。在 Fedora Linux 37 中，我们增加了两个新版本：Fedora CoreOS 是你可能还记得的 Atomic Host 的后续版本。从 Project Atomic 和 CoreOS 的初始的工作中汲取营养，它提供了一种自动更新机制，以托管基于容器的工作负载。通过原子更新和简单的回滚，它为你的基础设施增加了安全感。

Fedora Cloud 也作为一个版本回来了。云计算工作组的活动已经重新开始了。Cloud 版本提供了一个很棒的 Fedora 基础，可以在你喜欢的公共或私有云中运行。AMI 将在本周晚些时候在 AWS 市场上提供，在社区频道上现在已经可以使用。请查看 [此网站](https://getfedora.org/en/cloud/) 以了解可以在其他云供应商或你自己的云上运行的镜像！

### 桌面的改进

Fedora Workstation 专注于桌面体验。像往常一样，Fedora Workstation 采用了最新的 GNOME 版本。[GNOME 43](https://release.gnome.org/43/) 在设置中包括一个新的设备安全面板，为用户提供关于系统中硬件和固件的安全信息。在上一个版本的基础上，更多的 GNOME 核心应用程序被移植到了最新版本的 GTK 工具包，提供了更好的性能和现代的外观。

在这个版本中，我们做了一些改变，让你的安装变得更精简。我们把 Firefox 浏览器的语言包分成了子包。这意味着如果你不需要本地化，你可以删除 `firefox-langpacks` 包。gettext 的运行包（帮助其他包产生多语言文本的工具）被分割成一个单独的、可选择的子包。

当然，我们生产的不仅仅是“版本”。Fedora <ruby>   定制版  <rt>  Spins </rt></ruby> 和 <ruby>   实验室  <rt>  Labs </rt></ruby> 针对的是不同的受众和使用情况，包括 [Fedora Comp Neuro](https://labs.fedoraproject.org/en/comp-neuro/) ，它为计算神经科学提供工具，以及像 [Fedora LXQt](https://spins.fedoraproject.org/en/lxqt/) 这样的桌面环境，它提供一个轻量级桌面环境。而且，别忘了我们的备用架构。[ARM AArch64、Power 和 S390x](https://alt.fedoraproject.org/alt/)。

### 系统管理方面的改进

Fedora Server 现在可以生成一个 KVM 磁盘镜像，使在虚拟机中运行 Server 更加容易。如果你已经禁用了 SELinux（没关系 —— 我们仍然爱你！），你可以在影响较小的情况下重新开启它。自动标签现在以并行方式运行，使 “fixfiles” 操作更快。

为了跟上密码学的发展，这个版本引入了一个 `TEST-FEDORA39` 策略，预览了计划在未来版本中的变化。新策略之一是不再使用 SHA-1 签名。研究人员早就知道这种哈希值（就像之前的 MD5 一样）在许多安全方面的使用是不安全的。

在未来，我们可能会将 SHA-1 从 Fedora Linux 可接受的安全算法列表中移除。（正如 `TEST-FEDORA39` 这个名字所暗示的那样，也许最快也要到明年。）不过我们知道如今 SHA-1 哈希值仍然在使用。新的策略可以帮助你现在就测试你的关键应用程序，这样你就可以做好准备。请尝试一下，并让我们知道你在哪里遇到了问题。

说到密码学，openssl1.1 包现在已经废弃了。它还能用，但我们建议你更新你的代码，以使用 openssl 3。

### 其他更新

树莓派 4 现在在 Fedora Linux 中得到了正式支持，包括图形加速。在 ARM 的其他方面，Fedora Linux 37 放弃了对 ARMv7 架构（也被称为 arm32 或 armhfp）的支持。

在我们的“[First](https://docs.fedoraproject.org/en-US/project/#_first)”基础上，我们已经更新了关键的编程语言和系统库包，包括 Python 3.11、Golang 1.19、glibc 2.36 和 LLVM 15。

我们很高兴你能试用这个新版本！请到 <https://getfedora.org/> 下载。或者如果你已经在运行 Fedora Linux，请按照 [简易升级说明](https://docs.fedoraproject.org/en-US/quick-docs/upgrading/)。更多关于 Fedora Linux 37 的新功能的信息，请看 [发行说明](https://docs.fedoraproject.org/en-US/fedora/f37/release-notes/)。

### 在不太可能发生的情况下...

如果你遇到了问题，请访问我们的 [Ask Fedora](https://ask.fedoraproject.org/) 用户支持论坛。这里有一个 [常见问题](https://ask.fedoraproject.org/c/common-issues/141/none) 的分类。

### 谢谢大家

感谢在这个发布周期为 Fedora 项目做出贡献的成千上万的人。我们很高兴 Fedora 社区有你们。

---

via: <https://fedoramagazine.org/announcing-fedora-37/>

作者：[Matthew Miller](https://fedoramagazine.org/author/mattdm/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #822 电子书的“磨损”速度快于实体书

Summary: ❶ 电子书的“磨损”速度快于实体书 ❷ 16 台晶圆级芯片计算机集群组成千万核超算 ❸ 美国的 Frontier 超算继续占据 TOP500 榜首

十年前主流还是txt和pdf，现在过时了吗？

没有，还是主流

pdf也有版本之分。新版格式支持3d交互。

txt其实也有编码问题。gbk，big5，utf-8，utf-16，unicode。更还有字节序。。。换行符linux与win也不一样。。。tab符默认宽度也很头疼。。。

p.s. emoji对于早期软件也是个问题。真实

当当网的电子书不是PDF的，国内都不走寻常路

![](/data/attachment/album/202211/16/172717v1vtwp3ko1wwd1p1.jpg)

![](/data/attachment/album/202211/16/172726jfa4ykfzxf9k3ft4.jpg)

### 电子书的“磨损”速度快于实体书

一百年前的实体书如果保存良好，可以正常阅读。但十年前的电子书今天去阅读极有可能会遇到各种问题。电子书需要不断维护，从文件格式到存储介质的不断变化，需要不断重新处理。电子书是脆弱且受到威胁的。

>
> **[消息来源：Archive](http://blog.archive.org/2022/11/15/digital-books-wear-out-faster-than-physical-books/)**
>
>
>

>
> 老王点评：这是一个违反直觉的事情，但是确实如此，所以，我们应该用一种明文的开放格式来承载这些电子书。
>
>
>

![](/data/attachment/album/202211/16/172822gmvh4uhu4b1wmb9w.jpg)

### 16 台晶圆级芯片计算机集群组成千万核超算

制造世界上最大的芯片 —— 晶圆级引擎 2（WSE-2）的公司 Cerebras 今天公布了其仙女座超级计算机。仙女座是由 16 个 WSE-2 芯片组成的，共有 1350 万个计算核心，比世界顶级超级计算机 Frontier 系统多出百分之六十，AI 算力与 Frontier 相当。全套系统功耗 500 千瓦，这比同等级的超级计算机的功率要低得多。

>
> **[消息来源：Venture Beat](https://venturebeat.com/ai/cerebrass-andromeda-supercomputer-has-13-5m-cores-that-can-do-an-exaflop-in-ai-computing/)**
>
>
>

>
> 老王点评：16 块脸盆大的芯片组成的超算，在 AI 算力上与世界第一超算相当。
>
>
>

![](/data/attachment/album/202211/16/172835f1x7oxe4n2nt71z1.jpg)

### 美国的 Frontier 超算继续占据 TOP500 榜首

第 60 版 TOP500 显示，Frontier 系统仍然是名单上唯一拥有 Exaflop 级别算力的超级计算机。Frontier 的 HPL 分数和之前一样，1.102 EFlop/s，但是确是第二名的三倍。之前连续两年占据榜首的日本富岳超级计算机依旧保持第二名。中国排名前十的两台超算依旧是神威-太湖之光和天河-2A。

>
> **[消息来源：Top500](https://www.top500.org/lists/top500/2022/11/)**
>
>
>

>
> 老王点评：很多超算是不参加排名的。
>
>
>


如何在 RHEL 9 上安装 Node.js

Summary: 在这篇文章中，我们将逐步解释如何在 RHEL 9 系统上安装 Node.js。

在这篇文章中，我们将逐步解释如何在 RHEL 9 系统上安装 Node.js。

![](/data/attachment/album/202211/17/092223tdodvvfdnsjiezxv.jpg)

>
> 在这篇文章中，我们将逐步解释如何在 RHEL 9 系统上安装 Node.js。
>
>
>

[Node.js](https://nodejs.org/en/about/) 基于谷歌的 V8 JavaScript 引擎构建，它是一个自由开源的跨平台 JavaScript 运行时环境，主要用于构建服务器端应用。它使用事件驱动和异步模型，帮助开发人员构建高度可扩展的数据密集型的实时应用（RTA）。你可以使用 NodeJS 来构建前端和后端应用。

Node.js 通常用于构建以下应用：

* 聊天应用
* 流媒体应用
* 浏览器游戏
* 命令行工具
* 嵌入式系统

在其技术栈中使用 NodeJS 的顶级公司包括 PayPal、NetFlix 和 Uber 等等。

安装 Node.js 主要有以下三种方式：

* 从 NodeSource 仓库安装 Node.js
* 从发行版的官方仓库安装 Node.js
* 使用 NVM 安装 Node.js

让我们看看如何使用这些方法在 RHEL 9 上安装 Node.js。

先决条件：

* 最小化安装的 RHEL 9 系统
* 具有管理员权限的 [sudo 用户](https://www.linuxtechi.com/create-sudo-user-on-rhel-rocky-linux-almalinux/)
* 互联网连接
* Red Hat 订阅或本地配置的仓库

### 从 NodeSource 存储库安装 Node.js

[NodeSource](https://nodesource.com/) 是一家技术公司，旨在帮助组织运行生产就绪的 Node.js 应用，关注资源使用以及增强的安全性和应用程序性能。它提供了最新版本的 Node.js 和 NPM。

要从 NodeSource 安装 Node.js，首先，按如下所示更新系统包。

```
$ sudo dnf update -y

```

![](/data/attachment/album/202211/17/092231siytzmdiydtml9t0.png)

接下来，安装这期间所需的构建工具。其中包括 GCC C/C++ 编译器、Perl 和 Python 调试器等等。

```
$ sudo dnf groupinstall 'Development Tools' -y

```

![](/data/attachment/album/202211/17/092232ejjqzwx7yyg7wlgb.png)

接下来，我们将从 NodeSource 安装 Node.js 18.x。为此，请下载并运行 NodeSource 设置脚本，如下所示。

```
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -

```

该脚本在其他任务中将 NodeSource 仓库添加到你的系统。

![](/data/attachment/album/202211/17/092233zx952zwz297vvvba.png)

在输出的末尾，你将看到一些关于如何安装 Node.js 和 NPM 的附加说明。

![](/data/attachment/album/202211/17/092234swnpfa2waaw2aosp.png)

因此，要安装 Node.js 和 NPM（Node 包管理器），请运行以下命令：

```
$ sudo dnf install nodejs -y

```

![](/data/attachment/album/202211/17/092235q7uv3nprzvpo5hpd.png)

安装完成后，按如下所示验证 Node.js 和 NPM 的版本。

```
$ node -v
$ npm -v

```

![](/data/attachment/album/202211/17/092236eo6ih6e96576q66c.png)

输出显示我们正在运行 Node v18.12，它是最新的 LTS 版本和 NPM 8.19.2。

### 从官方 RHEL 仓库安装 Node.js

安装 NodeJS 和 NPM 的另一种方法是从发行版的官方仓库中安装它们。但是，这种方法不提供最新版本。

如果你不介意不安装最新版本的 Node 和 NPM。 那么在命令行上运行以下命令。

```
$ sudo dnf update -y
$ sudo dnf install nodejs npm -y

```

![](/data/attachment/album/202211/17/092236ky3a33a22hbvqiaa.png)

### 使用 NVM 安装 Node.js

最后，你可以使用 NVM（Node 版本管理器）安装 Node.js，这是一种用于管理系统上 Node 版本的工具。该工具可帮助开发人员在需要不同版本 Node.js 的不同项目上高效工作。

默认情况下没安装 NVM。你需要通过运行 [官方 GitHub 页面](https://github.com/nvm-sh/nvm) 上提供的 Shell 脚本来安装它。

```
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

```

这会下载 NVM 并将其保存在主目录的 `.nvm` 目录中。

![](/data/attachment/album/202211/17/092237vaac91cjfhsf5rca.png)

安装后，关闭终端会话并打开一个新终端。然后运行以下命令确认 NVM 已经安装。

```
$ command -v nvm

```

![](/data/attachment/album/202211/17/092237regs0qdlsejzzrlq.png)

接下来，你可以使用以下命令列出所有可用的 Node.js 版本：

```
$ nvm ls-remote

```

![](/data/attachment/album/202211/17/092238ditrrh98ot8kdn9k.png)

或者，你可以列出 Node.js 版本的所有最新 LTS 版本，如图所示。

```
$ nvm ls-remote | grep -i latest

```

![](/data/attachment/album/202211/17/092240agf0c6gc1svv5o7s.png)

要安装最新版本的 Node.js（当前为 v19.0.0），请运行以下命令：

```
$ nvm install node

```

![](/data/attachment/album/202211/17/092240nttt7jnnatysjst7.png)

然后，你可以验证安装的 Node.js 版本，如下所示。

```
$ node -v

```

![](/data/attachment/album/202211/17/092241a95qtajtstqns0lj.png)

此外，你可以安装特定版本的 Node.js。例如，要安装 v18.2.0，请运行以下命令：

```
$ nvm install v18.12.0

```

![](/data/attachment/album/202211/17/092242tek7f7p6zmk7u7ad.png)

要列出系统上所有已安装的 NodeJS 版本，请运行以下命令：

```
$ nvm ls

```

第一行带有 “->” 符号的条目指向当前使用的 Node.js 版本。然后是其他版本。

![](/data/attachment/album/202211/17/092242jz6bcbry6bsbdmdr.png)

要切换到另一个版本的 Node.js，请使用以下语法：

```
$ nvm use <version>

```

例如，要使用 Node 版本 19.0.0，请运行以下命令：

```
$ nvm use 19.0.0

```

![](/data/attachment/album/202211/17/092243ck6o6q8q4lqtq8ik.png)

再次检查已安装的 Node.js 版本，这次“->” 符号将指向 v19.0.0。

![](/data/attachment/album/202211/17/092243eprirn7n0ejbeill.png)

### 总结

在本指南中，我们演示了如何使用三种不同的方法安装 Node.js。此外，我们还提供了几种使用 NVM 管理 Node 版本的方法。我们希望可以帮助你轻松地在 RHEL 上安装 NodeJS，并选择你想要在项目中使用的版本。

---

via: <https://www.linuxtechi.com/how-to-install-nodejs-on-rhel/>

作者：[James Kiarie](https://www.linuxtechi.com/author/james/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 VS Code 和 Codium 中编写 Python 程序

![](/data/attachment/album/202211/17/100909py38rj0tqxlyrq0t.jpg)

>
> 如果你正在寻找一个优秀的、通用的、开源的、带有 Python 集成的代码编辑器，那么你可以尝试一下 Codium。
>
>
>

在过去几年内，我有幸和中学生们一起，并带他们入门 [Python 开发](https://opensource.com/article/22/8/math-python-raspberry-pi) 和树莓派 400。这一切都很有趣，树莓派对于学生和我来说都是一个很好的平台。我们使用了 [Code with Mu](https://codewith.mu/)，并且一切都很成功。我们的 Python 技能随着经验的增长而增长，因此最近我开始寻找给这些学生提供更多东西的方法。

我参与了一个 Python 课程并在课程中接触了微软的 Visual Studio Code。我在课程中学到了很多关于如何为 Python 设置虚拟环境，以及如何为 Python 编程配置 VS Code 的知识。在学习过程中，我也认识了 [Codium](https://opensource.com/article/20/6/open-source-alternatives-vs-code)，它基本上是没有微软品牌和遥测的 VS Code。

如果你正在寻找一个优秀的、通用的、开源的、带有 Python 集成的代码编辑器，那么你可以尝试一下 Codium。下面是我在 Linux 系统上为 Python 设置 Codium 的方法。

### 在 Linux 上安装或更新 Python

首先，确保你正在运行最新版本的 Python。你可以使用你的软件包管理器来完成这项工作。在 Debian 和基于 Debian 的系统上：

```
$ sudo apt install python3-pip

```

在 Fedora、CentOS、Mageia、OpenMandriva 和类似的系统上：

```
$ sudo dnf update python3

```

在某些系统上，你可能还需要安装创建 Python 虚拟环境的软件：

```
$ sudo apt install python3.10-venv

```

### 安装 Codium

接下来，在你的电脑上 [安装 Codium](https://github.com/VSCodium/vscodium/releases)。在 Linux 上，你可以下载一个包并使用你的包管理器安装它，或者 [使用 Flatpak](https://flathub.org/apps/details/com.vscodium.codium)。

在安装好 Codium 之后，打开你的应用程序或活动菜单，输入 `code` 以启动它。

### 安装 VS Code Python 扩展

代码其实不是什么特别的东西。它只是一些其他应用程序（编译器或运行时）解释的纯文本。你可以在 Codium 中编写 Python 代码而不需要特殊的扩展。但是，有一个 Python 扩展可以为你带来一些方便的功能。

点击“<ruby> 文件 <rt>  File </rt></ruby>”菜单，选择“<ruby> 首选项 <rt>  Preferences </rt></ruby>”，然后选择“<ruby> 扩展 <rt>  Extensions </rt></ruby>”。在“<ruby> 扩展 <rt>  Extensions </rt></ruby>”面板中，搜索 Python IntelliSense 扩展。

![VS Code 和 Codium 都有一个扩展管理器，它会在页面左侧打开，允许你安装附加模块](/data/attachment/album/202211/17/100932lzbgu5frgf5gtwzd.jpg)

你已经在 Codium 中设置了 Python。剩下的就是把它用起来。

### 为 VS Code 或 Codium 设置虚拟环境

我们可以创建一个项目目录，并将其添加到 Codium 中，这样在工作时，你创建和保存的文件都将默认保存到活动项目目录。这是一种快速的管理方式，可以让你不必经常点击文件保存和打开对话框。

在你创建一个虚拟 Python 环境作为工作目录时，Codium 会检测到它（因为你已经安装了 Python 扩展）。当你激活一个虚拟环境文件夹作为活动项目目录时，Codium 会自动运行使用虚拟环境所需的激活代码。

要为 Python 创建一个虚拟环境，请打开终端并输入：

```
$ python3 -m venv ~/PythonCoding

```

### 添加项目目录

在 Codium 中，点击“<ruby> 文件 <rt>  File </rt></ruby>”菜单，选择“<ruby> 将文件夹添加到工作区 <rt>  Add Folder to Workspace </rt></ruby>”。打开你刚刚设置的虚拟环境（对我来说，是 `/home/don/PythonCoding`）。

现在你已经准备好写一些 Python 代码了！在你的工作区中创建一个新的 Python 文件并插入一些基本代码。当你输入时，你可能会注意到，Codium 会为环境包含的 Python 模块提供自动补齐建议。

```
import sys
print("Codium running Python " + sys.version)

```

现在点击 Codium 窗口右上角的“运行”按钮。这会在窗口底部打开一个控制台面板显示你的代码的输出：

```
(PythonCode) sh-5.1$ /home/bogus/PythonCode/bin/python
/home/bogus/PythonCode/app.py
Codium running Python 3.10.6 (main…)[GCC 12.1.0]
(PythonCode) sh-5.1$

```

就像你从输出中看到的，Codium 在 `PythonCode` 环境中运行，并成功运行了你的 Python 代码。

### Codium 和 Python

使用 Codium 编写 Python 代码比以往任何时候都更容易，但 Python 并不是 Codium 支持的唯一语言。你可以轻松地从 [Open VSX Registry](https://open-vsx.org/) 中找到并安装其他扩展，这是一个中立的开源 VS Code 扩展 “市场”。

Codium 的界面比一些基本的编辑器更复杂，但它有我在学习过程中所需要的东西。如果你需要一个更专业的编辑器，或者你想从当前的编辑器切换到新的编辑器，那么试试 Codium 吧。

---

via: <https://opensource.com/article/22/11/python-vs-code-codium>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lkxed](https://github.com/lkxed) 译者：[Cubik65536](https://github.com/Cubik65536) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #823 Evernote 被出售

Summary: ❶ Evernote 被出售 ❷ AlmaLinux 9.1 紧随 RHEL 9.1 发布 ❸ KDE 宣布新的社区目标：可访问性、环境可持续性、自动化

![](/data/attachment/album/202211/17/155147wll3lmtmdmtw382d.jpg)

![](/data/attachment/album/202211/17/155157rbbtbbm4tgbbslvs.jpg)

### Evernote 被出售

意大利移动应用开发商 Bending Spoons 公司今天宣布收购 Evernote。在收购的新闻稿中说，“Evernote 拥有约 1 亿美元的经常性收入，数百万付费客户，以及使用其跨平台应用程序创建的近 110 亿条笔记。”Evernote 曾经是最流行的笔记应用之一，但在 2016 年开始限制免费用户的使用。在同一年还宣布开发了可以审查用户笔记的 AI，以及让其员工可以访问用户笔记，虽然在招致巨大反对后取消了计划，但也导致了大量用户流失。如今，在 iOS 上，它甚至没有跻身生产力应用程序的前 100 名。收购宣告没有公开收购金额等细节。

>
> **[消息来源：The Register](https://www.theregister.com/2022/11/17/evernotes_fall_from_grace_ends/)**
>
>
>

>
> 老王点评：这个曾经兴盛一时的应用，也算是画上了一个逗号，或者，句号。还有人在用它吗？
>
>
>

![](/data/attachment/album/202211/17/155205z8giiqlylwwjq5dg.jpg)

### AlmaLinux 9.1 紧随 RHEL 9.1 发布

红帽企业 Linux（RHEL）9.1 今天正式发布，RHEL 9.1 将 PHP 8.1 作为支持的应用流，扩展了多级安全支持，支持将容器嵌入到镜像构建器蓝图中等等一系列更新增强。而仅仅半天后，作为 RHEL 9.1 的自由构建版本，AlmaLinux 9.1 就发布了。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Red-Hat-Enterprise-Linux-9.1)**
>
>
>

>
> 老王点评：我觉得 CentOS 的结束至少有一个好处，RHEL 的自由版本发布的更快了，以前都需要几周。
>
>
>

![](/data/attachment/album/202211/17/155218nutudug8htectthd.jpg)

### KDE 宣布新的社区目标：可访问性、环境可持续性、自动化

在今年的 KDE 年度开发者大会上，KDE 宣布了新的社区目标。他们希望把重点放在确保 KDE 软件对所有人都是无障碍的。之前的 KDE 社区目标是围绕着一致性、对 KDE 应用程序的关注和 Wayland 支持。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/KDE-Community-Goals-2022)**
>
>
>

>
> 老王点评：我还是觉得之前的目标更务实一些，目前的 KDE 虽然已经很棒了，但是距离最好还有一些距离。
>
>
>

### 回音

* Fedora Linux [获准](https://www.phoronix.com/news/Fedora-Modern-C-Approved) 进行现代 C 语言的 [移植工作](/article-15184-1.html)，这些变化包括删除隐式函数声明、删除隐式整型、删除旧式函数声明等不符合 C99 规范的部分。


通过 SSH 在远程 Linux 系统上执行命令

Summary: 通过安全的网络连接在远程计算机上调用命令或程序。

通过安全的网络连接在远程计算机上调用命令或程序。

![](/data/attachment/album/202211/17/163910g9u42ssfcuk9c290.jpg)

>
> 通过安全的网络连接在远程计算机上调用命令或程序。
>
>
>

有一天，我正在测试如何在 [将文件或目录复制到多个位置和系统时保持完整的文件权限](https://ostechnix.com/how-to-keep-ownership-and-file-permissions-intact-when-copying-files-or-directories/)。当我想检查远程系统上的文件权限时，我必须通过 SSH 登录它并检查属性。从远程系统多次登录和注销的过程让我有点烦，我想，如果我可以**在远程 Linux 系统上通过 SSH 执行命令**就好了。

幸运的是，在浏览了 `ssh` 命令的手册页后，我找到了一个解决办法。

如果你想知道如何本地运行远程系统上运行命令或脚本，而不登录到远程系统，下面的内容会告诉你如何做。

### 1、通过 SSH 在远程 Linux 系统上执行命令

从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是：

```
$ ssh <username@IP_Address-or-Doman_name> <Command-or-Script>

```

允许我给你们举几个例子：

#### 1.1、通过 SSH 在远程系统上运行单个命令

假设你想要 [查找远程 Linux 系统的内核详细信息](https://ostechnix.com/find-out-the-linux-distribution-name-version-and-kernel-details/)。为此，只需运行：

```
$ ssh sk@192.168.225.22 uname -a

```

这里，

* `sk` 是远程系统的用户名，
* `192.168.225.22` 是远程系统的 IP 地址，
* `uname -a` 是我想在远程系统上运行的命令。

示例输出：

![通过 SSH 在远程 Linux 系统上执行命令](/data/attachment/album/202211/17/163913a9tuxt1uvxvmmkvg.gif)

看到没？我并没有实际登录到远程系统，但通过 SSH 在远程系统上执行了 `uname` 命令，并在本地系统的终端上显示了输出。

你还可以像下面这样用引号指定命令。

```
$ ssh sk@192.168.225.22 "uname -a"

```

或者，

```
$ ssh sk@192.168.225.22 'uname -a'

```

如果你已经 [更改了 SSH 协议的默认端口](https://ostechnix.com/how-to-change-apache-ftp-and-ssh-default-port-to-a-custom-port-part-3/)，只需使用 `-p` 参数指定它。

```
$ ssh -p 2200 sk@192.168.225.22 uname -a

```

#### 1.2、通过 SSH 在远程主机上执行多个命令

你还可以在远程主机上运行多个命令，方法是将它们放在引号中。

```
$ ssh sk@192.168.225.22 "uname -r && lsb_release -a"

```

或者：

```
$ ssh sk@192.168.225.22 "uname -r ; lsb_release -a"

```

上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。

示例输出：

![在 Linux 上通过 SSH 在远程主机上运行多个命令](/data/attachment/album/202211/17/163913kvwqbzpp3ozp2w24.png)

正如一位读者在下面的评论部分提到的那样，你应该用引号指定多个命令。如果不使用引号，第一个命令将在远程系统上执行，第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。

>
> **提示：** 了解 `&&` 和 `;` 在命令中的区别：
>
>
> `&&` 操作符只有在第一个命令成功时才执行第二个命令。
>
>
> 示例：
>
>
>
> ```
> sudo apt-get update && sudo apt-get upgrade
>
> ```
>
> 在上述示例中，如果第一个命令成功，才会执行 `sudo apt-get upgrade`。否则，它将不会运行。
>
>
> `;` 操作符会执行第二个命令，无论第一个命令是成功还是失败。
>
>
> 示例：
>
>
>
> ```
> sudo apt-get update ; sudo apt-get upgrade
>
> ```
>
> 在上述示例中，即使第一个命令失败，`sudo apt-get upgrade` 也会执行。
>
>
>

#### 1.3、通过 SSH 在远程机器上调用有 sudo 权限的命令

有些命令需要 `sudo` 权限才能运行。例如，以下命令将在我的远程系统上安装 `apache2`。

```
$ ssh -t sk@192.168.225.22 sudo apt install apache2

```

示例输出：

![通过 SSH 在远程机器上运行有 Sudo 权限的命令](/data/attachment/album/202211/17/163913rgzg1jmqiwhx1lh5.png)

注意到了吗？我在上面的命令中使用了 `-t` 标志，我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序，这非常有用。例如，在实现菜单服务时。

另外，我输入了**两次**密码。第一次是远程用户的密码，以便从本地系统通过 SSH 访问远程系统，第二次是为了向远程用户赋予 sudo 权限，以便安装应用程序（在本例中为 apache2）。

让我们用以下命令检查 Apache 服务是否正在运行：

```
$ ssh -t sk@192.168.225.22 sudo systemctl status apache2
sk@192.168.225.22's password:
[sudo] password for sk:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start

Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

```

同样的，我们可以通过 SSH 在本地系统上运行远程系统上的任何命令或脚本。

#### 1.4、通过 SSH 在远程系统上运行本地脚本

让我们在本地系统上创建一个简单的脚本来显示关于远程系统的发行版名称、包管理和基本细节等。

```
$ vi system_information.sh

```

添加以下行：

```
#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

```

按下 `ESC` 键，输入 `:wq` 保存退出。

现在，通过 SSH 命令在远程系统上运行这个脚本：

```
$ ssh sk@192.168.225.22 'bash -s' < system_information.sh

```

示例输出：

```
sk@192.168.225.22's password:
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

```

如果你没有在上面的命令中指定 `bash -s`，你将获得远程系统的详细信息，但伪终端不会被分配。

#### 1.5、将远程主机的命令输出保存到本地主机

如果你希望与支持团队或同事共享远程系统上运行的命令输出，那么这非常有用。

以下命令将通过 SSH 在远程系统运行 `du -ah`，并将输出保存在本地系统的 `diskusage.txt` 文件中。

```
$ ssh sk@192.168.225.22 du -ah > diskusage.txt

```

然后，你可以通过使用 `cat` 命令或文本编辑器查看 `diskusage.txt` 文件来分析磁盘使用细节。

```
$ cat diskusage.txt
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .

```

#### 1.6、配置 SSH 密钥认证，避免输入密码

如果你经常在远程系统上运行命令，你可能需要配置基于 SSH 密钥的身份验证，以便每次跳过密码输入。更多细节可以在以下链接中找到。

>
> **[Linux 系统下如何配置 SSH 密钥认证](https://ostechnix.com/configure-ssh-key-based-authentication-linux/)**
>
>
>

配置了基于 SSH 密钥的认证后，我们可以通过 SSH 在远程机器上执行命令，从而不需要输入密码：

```
$ ssh sk@192.168.225.22 sudo apt update

```

### 2、通过 sshpass 在远程机器上运行命令

如果你不想配置基于 SSH 密钥的身份验证，你可以使用 `sshpass` 实用程序。

#### 2.1、什么是 sshpass?

`sshpass` 是为使用键盘交互密码身份验证模式运行 ssh 而设计的，但它以非交互的方式。简单来说，`sshpass` 提供了非交互式的方式来验证 SSH 会话。

SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。`sshpass` 在一个专用 tty 中运行 SSH，让它误以为从交互用户那里获得了密码。

#### 2.2、在 Linux 中安装 sshpass

在许多 Linux 发行版的默认仓库中都有 `sshpass` 实用程序。例如，在 Debian、Ubuntu 及其衍生版本中，你可以使用下面的命令来安装 `sshpass`：

```
$ sudo apt install sshpass

```

#### 2.3、通过 SSH 和 sshpass 在远程机器上执行命令

`sshpass` 可以通过参数接受密码，或者通过环境变量读取密码，也可以从文本文件中读取密码。

**警告：** 所有这些方法都是 **高度不安全的**。所有系统用户都可以通过 `ps` 命令看到命令中的密码。**不建议**在生产中使用这些方法。最好使用基于密钥的身份验证。

让我们看看每种方法的示例。

##### 将密码作为参数提供

将密码作为参数提供，使用 `-p` 选项，如下所示：

```
$ sshpass -p <remote-password> ssh remoteuser@ip-address <command-to-execute>

```

示例输出：

```
$ sshpass -p ubuntu ssh ostechnix@192.168.1.30 uname -a

```

其中，

* `-p ubuntu` - 提供远程系统的密码。
* `ostechnix@192.168.1.30` - 远程系统用户名和地址。
* `uname -a` - 要在远程计算机上执行的命令。

示例输出：

```
Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux

```

##### 密码作为环境变量提供

在这个方法中，我们声明一个名为 `SSHPASS` 的环境变量，用远程环境的密码作为其值。然后我们使用 `-e` 标志，如下所示：

```
$ SSHPASS=ubuntu sshpass -e ssh ostechnix@192.168.1.30 uname -a

```

##### 从文本文件中读取密码

使用 `echo` 命令在文本文件中追加密码：

```
$ echo "ubuntu" > mypassword.txt

```

现在，将密码文件传递给带有 `-f` 标志的 `sshpass`，如下所示：

```
$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.30 uname -a

```

![通过 SSH 和 sshpass 在远程机器上执行命令](/data/attachment/album/202211/17/163914gmids5kiqqcq10io.png)

### 总结

在本教程中，我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中，`sshpass` 方法是最不安全的，建议用户避免在生产系统中使用它。

---

via: <https://ostechnix.com/execute-commands-on-remote-linux-systems-via-ssh/>

作者：[sk](https://ostechnix.com/author/sk/) 选题：[lkxed](https://github.com/lkxed) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


在 Linux 上使用 Checksec 识别二进制文件的安全属性

>
> 这篇文章能让你了解如何使用 Checksec ，来识别一个可执行文件的安全属性，了解安全属性的含义，并知道如何使用它们。
>
>
>

![](/data/attachment/album/202211/18/095702dzvm482460vnrv6y.jpg)

编译源代码会生成一个二进制文件（LCTT 译注：即 `.o` 文件）。在编译期间，你可以向 `gcc` 编译器提供 <ruby> 标志 <rt>  flags </rt></ruby>，以启用或禁用二进制文件的某些属性，这些属性与安全性相关。

Checksec 是一个漂亮的小工具，同时它也是一个 shell 脚本。Checksec 可以识别编译时构建到二进制文件中的安全属性。编译器可能会默认启用一些安全属性，你也可以提供特定的标志，来启用其他的安全属性。

本文将介绍如何使用 Checksec ，来识别二进制文件的安全属性，包括：

1. Checksec 在查找有关安全属性的信息时，使用了什么**底层的命令**
2. 在将源代码编译成二进制文件时，如何使用<ruby> GNU 编译器套件 <rt>  GNU Compiler Collection </rt></ruby>（即 GCC）来**启用安全属性**。

### 安装 checksec

要在 Fedora 和其他基于 RPM 的 Linux 系统上，安装 Checksec，请使用以下命令：

```
$ sudo dnf install checksec

```

对于基于 Debian 的 Linux 发行版，使用对应的 `apt` 命令，来安装 Checksec。

```
$ sudo apt install checksec

```

### shell 脚本

在安装完 Checksec 后，能够发现 Checksec 是一个**单文件**的 shell 脚本，它位于 `/usr/bin/checksec`，并且这个文件挺大的。Checksec 的一个优点是你可以通过快速通读这个 shell 脚本，从而了解 Checksec 的执行原理、明白所有能查找有关二进制文件或可执行文件的安全属性的**系统命令**：

```
$ file /usr/bin/checksec
/usr/bin/checksec: Bourne-Again shell script, ASCII text executable, with very long lines

$ wc -l /usr/bin/checksec
2111 /usr/bin/checksec

```

以下的命令展示了如何对你每天都会使用的：`ls` 命令的二进制文件运行 Checksec。Checksec 命令的格式是：`checksec --file=`，后面再跟上二进制文件的绝对路径：

```
$ checksec --file=/usr/bin/ls
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable     FILE
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   No Symbols        Yes   5       17              /usr/bin/ls

```

当你在终端中对某个二进制文件运行 Checksec 时，你会看到安全属性有颜色上的区分，显示什么是好的安全属性（绿色），什么可能不是好的安全属性（红色）。我在这里说 **“可能”** 是因为即使有些安全属性是红色的，也不一定意味着这个二进制文件很糟糕，它可能只是表明发行版供应商在编译二进制文件时做了一些权衡，从而舍弃了部分安全属性。

Checksec 输出的第一行提供了二进制文件的各种安全属性，例如 `RELRO`、`STACK CANARY`、`NX` 等（我将在后文进行详细解释）。第二行打印出给定二进制文件（本例中为 `ls`）在这些安全属性的状态（例如，`NX enabled` 表示为堆栈中的数据没有执行权限）。

### 示例二进制文件

在本文中，我将使用以下的 “hello world” 程序作为示例二进制文件。

```
#include <stdio.h>

int main()
{
        printf("Hello World\n");
        return 0;
}

```

请注意，在编译源文件 `hello.c` 的时候，我没有给 `gcc` 提供任何额外的标志：

```
$ gcc hello.c -o hello

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=014b8966ba43e3ae47fab5acae051e208ec9074c, for GNU/Linux 3.2.0, not stripped

$ ./hello
Hello World

```

使用 Checksec 运行二进制文件 `hello`，打印的某些安全属性的状态，与上面的 `ls` 二进制文件的结果不同（在你的屏幕上，某些属性可能显示为红色）：

```
$ checksec --file=./hello
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable     FILE
Partial RELRO   No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   85) Symbols       No    0       0./hello
$

```

（LCTT 译注：在我的 Ubuntu 22.04 虚拟机，使用 11.3.0 版本的 `gcc`，结果与上述不太相同，利用默认参数进行编译，会得到 RELRO、PIE、NX 保护是全开的情况。）

### 更改 Checksec 的输出格式

Checksec 允许自定义各种输出格式，你可以使用 `--output` 来自定义输出格式。我将选择的输出格式是 JSON 格式，并将输出结果通过管道传输到 `jq` 实用程序，来得到漂亮的打印。

接下来，确保你已安装好了 [jq](https://stedolan.github.io/jq/download/)，因为本教程会使用 `jq` 从 Checksec 的输出结果中，用 `grep` 来快速得到某一特定的安全属性状态，并报告该安全属性是否启动（启动为 `yes`，未启动为 `no`）：

```
$ checksec --file=./hello --output=json | jq
{
  "hello": {
    "relro": "partial",
    "canary": "no",
    "nx": "yes",
    "pie": "no",
    "rpath": "no",
    "runpath": "no",
    "symbols": "yes",
    "fortify_source": "no",
    "fortified": "0",
    "fortify-able": "0"
  }
}

```

### 看一看所有的安全属性

上面的二进制文件 `hello` 包括几个安全属性。我将该二进制文件与 `ls` 的二进制文件进行比较，以检查启用的安全属性有何不同，并解释 Checksec 是如何找到此信息。

#### 1、符号（Symbol）

我先从简单的讲起。在编译期间，某些 <ruby> 符号 <rt>  symbols </rt></ruby>包含在二进制文件中，这些符号主要用作于调试。开发软件时，需要用到这些符号，来调试和修复错误。

这些符号通常会从供用户普遍使用的最终二进制文件中删除。删除这些符号不会影响到二进制文件的执行。删除符号通常是为了节省空间，因为一旦符号被删除了，二进制文件就会稍微小一些。在闭源或专有软件中，符号通常都会被删除，因为把这些符号放在二进制文件中，可以很容易地推断出软件的内部工作原理。

根据 Checksec 的结果，在二进制文件 `hello` 中有符号，但在 `ls` 的二进制文件中不会有符号。同样地，你还可以用 `file` 命令，来找到符号的信息，在二进制文件 `hello` 的输出结果的最后，看到 `not stripped`，表明二进制文件 `hello` 有符号：

```
$ checksec --file=/bin/ls --output=json | jq | grep symbols
    "symbols": "no",

$ checksec --file=./hello --output=json | jq | grep symbols
    "symbols": "yes",

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=014b8966ba43e3ae47fab5acae051e208ec9074c, for GNU/Linux 3.2.0, not stripped

```

Checksec 是如何找到符号的信息呢？Checksec 提供了一个方便的 `--debug` 选项，来显示运行了哪些函数。因此，运行以下的命令，会显示在 shell 脚本中运行了哪些函数：

```
$ checksec --debug --file=./hello

```

在本教程中，我试图寻找 Checksec 查找安全属性信息时，使用了什么**底层命令**。由于 Checksec 是一个 shell 脚本，因此你始终可以使用 Bash 功能。以下的命令将输出从 shell 脚本中运行的每个命令：

```
$ bash -x /usr/bin/checksec --file=./hello

```

如果你滚动浏览上述的输出结果的话，你会看到 `echo_message` 后面有各个安全属性的类别。以下显示了 Checksec 检测二进制文件是否包含符号时，运行的底层命令：

```
+ readelf -W --symbols ./hello
+ grep -q '\\.symtab'
+ echo_message '\033[31m96) Symbols\t\033[m  ' Symbols, ' symbols="yes"' '"symbols":"yes",'

```

上面的输出显示，Checksec 利用 `readelf`，来读取二进制文件，并提供一个特殊 `--symbols` 标志，来列出二进制文件中的所有符号。然后它会查找一个特殊值：`.symtab`，它提供了所能找到的条目的计数（即符号的个数）。你可以在上面编译的测试二进制文件 `hello` 上，尝试以下命令，得到与 Checksec 查看二进制文件类似的符号信息：

```
$ readelf -W --symbols ./hello
$ readelf -W --symbols ./hello | grep -i symtab

```

（LCTT 译注：也可以通过直接查看 `/usr/bin/checksec` 下的 Checksec 源文件。）

##### 如何删除符号

你可以在编译后或编译时删除符号。

* **编译后：** 在编译后，你可以使用 `strip`，手动地来删除二进制文件的符号。删除后，使用 `file` 命令，来检验是否还有符号，现在显示 `stripped`，表明二进制文件 `hello` 无符号了：

```
$ gcc hello.c -o hello
$
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=322037496cf6a2029dcdcf68649a4ebc63780138, for GNU/Linux 3.2.0, not stripped
$
$ strip hello
$
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=322037496cf6a2029dcdcf68649a4ebc63780138, for GNU/Linux 3.2.0, stripped
$

```
* **编译时：** 你也可以在编译时，用 `-s` 参数让 gcc 编译器帮你自动地删除符号：

```
$ gcc -s hello.c -o hello
$
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=247de82a8ad84e7d8f20751ce79ea9e0cf4bd263, for GNU/Linux 3.2.0, stripped
$

```

重新运行 Checksec，你可以看到现在二进制文件 `hello` 的 `symbols` 这一属性的值是`no`：

```
$ checksec --file=./hello --output=json | jq | grep symbols
    "symbols": "no",
$

```

#### 2、Canary（堆栈溢出哨兵）

Canary 是放置在缓冲区和 <ruby> 栈 <rt>  stack </rt></ruby> 上的控制数据之间的已知值，它用于监视缓冲区是否溢出。当应用程序执行时，会为其分配两种内存，其中之一就是 *栈*。栈是一个具有两个操作的数据结构：第一个操作 `push`，将数据压入堆栈；第二个操作 `pop`，以后进先出的顺序从栈中弹出数据。恶意的输入可能会导致栈溢出，或使用特制的输入破坏栈，并导致程序崩溃：

```
$ checksec --file=/bin/ls --output=json | jq | grep canary
    "canary": "yes",
$
$ checksec --file=./hello --output=json | jq | grep canary
    "canary": "no",
$

```

Checksec 是如何确定二进制文件是否启用了 Canary 的呢？使用上述同样的方法，得到 Checksec 在检测二进制文件是否启用 Canary 时，运行的底层命令：

```
$ readelf -W -s ./hello | grep -E '__stack_chk_fail|__intel_security_cookie'

```

##### 启用 Canary

为了防止栈溢出等情况，编译器提供了 `-stack-protector-all` 标志，它向二进制文件添加了额外的代码，来检查缓冲区是否溢出：

```
$ gcc -fstack-protector-all hello.c -o hello

$ checksec --file=./hello --output=json | jq | grep canary
    "canary": "yes",

```

Checksec 显示 Canary 属性现已启用。你还可以通过以下方式，来验证这一点：

```
$ readelf -W -s ./hello | grep -E '__stack_chk_fail|__intel_security_cookie'
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail@GLIBC_2.4 (3)
    83: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail@@GLIBC_2.4
$

```

#### 3、位置无关可执行文件（PIE）

<ruby> 位置无关可执行文件 <rt>  Position-Independent Executable </rt></ruby>（PIE），顾名思义，它指的是放置在内存中某处执行的代码，不管其绝对地址的位置，即代码段、数据段地址随机化（ASLR）：

```
$ checksec --file=/bin/ls --output=json | jq | grep pie
    "pie": "yes",

$ checksec --file=./hello --output=json | jq | grep pie
    "pie": "no",

```

通常，PIE 仅对 <ruby> 库 <rt>  libraries </rt></ruby>启用，并不对独立命令行程序启用 PIE。在下面的输出中，`hello` 显示为 `LSB executable`，而 `libc` 标准库（`.so`） 文件被标记为 `LSB shared object`：

```
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=014b8966ba43e3ae47fab5acae051e208ec9074c, for GNU/Linux 3.2.0, not stripped

$ file /lib64/libc-2.32.so
/lib64/libc-2.32.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4a7fb374097fb927fb93d35ef98ba89262d0c4a4, for GNU/Linux 3.2.0, not stripped

```

Checksec 查找是否启用 PIE 的底层命令如下：

```
$ readelf -W -h ./hello | grep EXEC
  Type:                              EXEC (Executable file)

```

如果你在共享库上尝试相同的命令，你将看到 `DYN`，而不是 `EXEC`：

```
$ readelf -W -h /lib64/libc-2.32.so | grep DYN
  Type:                              DYN (Shared object file)

```

##### 启用 PIE

要在测试程序 `hello.c` 上启用 PIE，请在编译时，使用以下命令：

```
$ gcc -pie -fpie hello.c -o hello`

```

你可以使用 Checksec，来验证 PIE 是否已启用：

```
$ checksec --file=./hello --output=json | jq | grep pie
    "pie": "yes",
$

```

现在，应该会显示为 “<ruby> PIE 可执行 <rt>  pie executable </rt></ruby>”，其类型从 `EXEC` 更改为 `DYN`：

```
$ file hello
hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bb039adf2530d97e02f534a94f0f668cd540f940, for GNU/Linux 3.2.0, not stripped

$ readelf -W -h ./hello | grep DYN
  Type:                              DYN (Shared object file)

```

#### 4、NX（堆栈禁止执行）

NX 代表 <ruby> 不可执行 <rt>  non-executable </rt></ruby>。它通常在 CPU 层面上启用，因此启用 NX 的操作系统可以将某些内存区域标记为不可执行。通常，缓冲区溢出漏洞将恶意代码放在堆栈上，然后尝试执行它。但是，让堆栈这些可写区域变得不可执行，可以防止这种攻击。在使用 `gcc` 对源程序进行编译时，默认启用此安全属性：

```
$ checksec --file=/bin/ls --output=json | jq | grep nx
    "nx": "yes",

$ checksec --file=./hello --output=json | jq | grep nx
    "nx": "yes",

```

Checksec 使用以下底层命令，来确定是否启用了 NX。在尾部的 `RW` 表示堆栈是可读可写的；因为没有 `E`，所以堆栈是不可执行的：

```
$ readelf -W -l ./hello | grep GNU_STACK
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10

```

##### 演示如何禁用 NX

我们不建议禁用 NX，但你可以在编译程序时，使用 `-z execstack` 参数，来禁用 NX：

```
$ gcc -z execstack hello.c -o hello

$ checksec --file=./hello --output=json | jq | grep nx
    "nx": "no",

```

编译后，堆栈会变为可读可写可执行（`RWE`），允许在堆栈上的恶意代码执行：

```
$ readelf -W -l ./hello | grep GNU_STACK
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10

```

#### 5、RELRO（GOT 写保护）

RELRO 代表 “<ruby> 重定位只读 <rt>  Relocation Read-Only </rt></ruby>”。可执行链接格式（ELF）二进制文件使用全局偏移表（GOT）来动态地解析函数。启用 RELRO 后，会设置二进制文件中的 GOT 表为只读，从而防止重定位攻击：

```
$ checksec --file=/bin/ls --output=json | jq | grep relro
    "relro": "full",

$ checksec --file=./hello --output=json | jq | grep relro
    "relro": "partial",

```

Checksec 使用以下底层命令，来查找是否启用 RELRO。在二进制文件 `hello` 仅启用了 RELRO 属性中的一个属性，因此，在 Checksec 验证时，显示 `partial`：

```
$ readelf -W -l ./hello | grep GNU_RELRO
  GNU_RELRO      0x002e10 0x0000000000403e10 0x0000000000403e10 0x0001f0 0x0001f0 R   0x1

$ readelf -W -d ./hello | grep BIND_NOW

```

##### 启用全 RELRO

要启用全 RELRO，请在 `gcc` 编译时，使用以下命令行参数：

```
$ gcc -Wl,-z,relro,-z,now hello.c -o hello

$ checksec --file=./hello --output=json | jq | grep relro
    "relro": "full",

```

现在， RELRO 中的第二个属性也被启用，使程序变成全 RELRO：

```
$ readelf -W -l ./hello | grep GNU_RELRO
  GNU_RELRO      0x002dd0 0x0000000000403dd0 0x0000000000403dd0 0x000230 0x000230 R   0x1

$ readelf -W -d ./hello | grep BIND_NOW
 0x0000000000000018 (BIND_NOW)

```

#### 6、Fortify

Fortify 是另一个安全属性，但它超出了本文的范围。Checksec 是如何在二进制文件中验证 Fortify，以及如何在 `gcc` 编译时启用 Fortify，作为你需要解决的课后练习。

```
$ checksec --file=/bin/ls --output=json | jq  | grep -i forti
    "fortify_source": "yes",
    "fortified": "5",
    "fortify-able": "17"

$ checksec --file=./hello --output=json | jq  | grep -i forti
    "fortify_source": "no",
    "fortified": "0",
    "fortify-able": "0"

```

### 其他的 Checksec 功能

关于安全性的话题是永无止境的，不可能在本文涵盖所有关于安全性的内容，但我还想提一下 Checksec 命令的一些其他功能，这些功能也很好用。

#### 对多个二进制文件运行 Checksec

你不必对每个二进制文件都进行一次 Checksec。相反，你可以提供多个二进制文件所在的目录路径，Checksec 将一次性为你验证所有文件：

```
$ checksec --dir=/usr

```

#### 对进程运行 Checksec

Checksec 除了能检查二进制文件的安全属性，Checksec 还能对程序起作用。以下的命令用于查找你系统上所有正在运行的程序的安全属性。如果你希望 Checksec 检查所有正在运行的进程，可以使用 `--proc-all`，或者你也可以使用进程名称，选择特定的进程进行检查：

```
$ checksec --proc-all

$ checksec --proc=bash

```

#### 对内核运行 Checksec

除了本文介绍的用 Checksec 检查用户态应用程序的安全属性之外，你还可以使用它来检查系统内置的 <ruby> 内核属性 <rt>  kernel properties </rt></ruby>：

```
$ checksec --kernel

```

### 快来试一试 Checksec 吧

Checksec 是一个能了解哪些用户空间和内核的安全属性被启用的好方法。现在，你就可以开始使用 Checksec，来了解每个安全属性是什么，并明白启用每个安全属性的原因，以及它能阻止的攻击类型。

---

via: <https://opensource.com/article/21/6/linux-checksec>

作者：[Gaurav Kamathe](https://opensource.com/users/gkamathe) 选题：[lujun9972](https://github.com/lujun9972) 译者：[chai001125](https://github.com/chai001125) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 上安装 AWS 命令行工具

Summary: 本文讲述如何一步步在 Linux 上安装 AWS CLI（命令行工具）。

本文讲述如何一步步在 Linux 上安装 AWS CLI（命令行工具）。

![](/data/attachment/album/202211/18/112836c2d0bekaxu75ffbx.jpg)

>
> 本文讲述如何一步步在 Linux 上安装 AWS CLI（命令行工具）。
>
>
>

AWS CLI 是一个能够和 AWS 账户进行交互的命令行程序。开发者和系统管理员用它管理日常的活动和自动化。

### 准备环节

* 安装好的 Linux 系统
* 具有管理员权限的 sudo 账户
* 能够联网

现在让我们开始安装：

### 1、下载安装文件

打开终端使用 `curl` 命令下载 AWS CLI 的安装文件：

```
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

```

![](/data/attachment/album/202211/18/113031k15evvlbgv9bbm1m.png)

以上命令会在当前工作目录下载一个 `awscliv2.zip` 的文件。

使用 [ls 命令](https://www.linuxtechi.com/linux-ls-command-examples-beginners/) 确认当前下载下来的文件：

```
$ ls -l awscliv2.zip
-rw-rw-r-- 1 linuxtechi linuxtechi 47244662 Oct 20 10:53 awscliv2.zip
$

```

### 2、解压缩下载的文件

使用 [unzip 命令](https://www.linuxtechi.com/linux-zip-unzip-command-examples/) 解压安装包：

```
$ unzip awscliv2.zip

```

它会在当前目录创建一个 `aws` 文件夹，把解压好的文件放进去：

```
$ ls -ld aws
drwxr-xr-x 3 linuxtechi linuxtechi 4096 Oct 19 17:18 aws
$

```

### 3、运行安装脚本

使用以下命令运行安装脚本：

```
$ sudo ./aws/install

```

![](/data/attachment/album/202211/18/113032h032rc2us6sasgr1.png)

脚本会把所有安装的文件放到 `/usr/local/aws-cli` 目录下，然后创建一个链接文件到 `/usr/local/bin` 目录。

### 4、检查 AWS CLI 的版本

运行以下脚本检查版本：

```
$ aws --version
aws-cli/2.8.4 Python/3.9.11 Linux/5.15.0-48-generic exe/x86_64.ubuntu.22 prompt/off
$

```

### 5、配置 AWS CLI

为了验证 AWS CLI 是否安装正确，开始配置 AWS CLI：

登录你的 AWS 管理控制台，取得 AWS <ruby> 访问密钥 ID <rt>  Access Key ID </rt></ruby> 和 <ruby> 安全访问密钥 <rt>  Secret Access Key </rt></ruby>。

如果还没完成创建，请先创建，并把它们复制到安全的地方。

![](/data/attachment/album/202211/18/113032dmle77exmsf8mv4s.png)

然后回到命令行，运行以下命令：

```
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxx
Default region name [None]: us-west-2
Default output format [None]: json
$

```

以上的证书会被保存到这个文件：

```
$ cat  ~/.aws/credentials

```

上面的命令的输出：

![](/data/attachment/album/202211/18/113033n8tc03kgskasknni.png)

运行 `aws` 命令列出你账户中的 s3 储存和 VPC：

```
$ aws s3 ls
$ aws ec2 describe-vpcs

```

输出如下：

![](/data/attachment/album/202211/18/113033vpkpdjcjj5corf1k.png)

成功输出内容，说明你的 AWS CLI 已经配置完成。

这就是这篇文章的全部内容，请在下面的评论区发表你的疑问和反馈。

---

via: <https://www.linuxtechi.com/how-to-install-aws-cli-on-linux/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 选题：[lkxed](https://github.com/lkxed) 译者：[littlebirdnest](https://github.com/littlebirdnest) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #824 一半的 macOS 恶意软件都来自一个“杀毒软件”

Summary:
❶ 一半的 macOS 恶意软件都来自一个“杀毒软件”
❷ 开源推动 5G 占据了 50% 的电信市场
❸ Mozilla 收入更多样，但仍然主要依靠谷歌

老王点评：这可真够讽刺的，一个杀毒软件反而是最大的黑窝。

大胆刁民

![](/data/attachment/album/202211/18/200356vol57xrdzs8ml88d.jpg)

![](/data/attachment/album/202211/18/200408gh8kxzh9c1j9f9hh.jpg)

### 一半的 macOS 恶意软件都来自一个“杀毒软件”

Elastic 安全实验室发现，一半 macOS 恶意软件来自 MacKeeper。讽刺的是，MacKeeper 声称 “以零努力保持你的 Mac 清洁和安全”。该程序可以被威胁者滥用，因为它有广泛的权限和对进程和文件的访问。这意味着，一个旨在保持 Mac 安全不受网络威胁的程序可能使你的系统处于危险之中。 MacKeeper 也以难以完全卸载而著称。然而，Mac 仍然是恶意软件最少的操作系统，研究发现只有 6.2% 的恶意软件出现在 macOS 上，而 Windows 和 Linux 上则分别为 54.4% 和 39.4%。

>
> **[消息来源：Neowin](https://www.neowin.net/news/study-almost-50-of-macos-malware-only-comes-from-one-app/)**
>
>
>

>
> 老王点评：这可真够讽刺的，一个杀毒软件反而是最大的黑窝。
>
>
>

![](/data/attachment/album/202211/18/200419n4etf3ee4mg9rrrn.jpg)

### 开源推动 5G 占据了 50% 的电信市场

5G 部署现在已经超过 50% 的电信市场规模，这得益于开源。Linux 基金会称，在这一切的背后，“是向开放网络和框架的彻底转变。无论经济和政治风向如何，这种转变都在继续。事实上，开源可能是唯一没有受到影响的领域，因为它有能力跨越国界和边界来做需要做的事情。”据一些分析师的说法，到 2030 年，5G 的经济价值将达到 7 万亿美元。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/thanks-to-open-source-5g-cracks-50-of-the-telecom-market/)**
>
>
>

>
> 老王点评：开源居然对 5G 的推广有这么大的作用，这是有些想不到。
>
>
>

![](/data/attachment/album/202211/18/200429b1vmugvgtaudctgg.jpg)

### Mozilla 收入更多样，但仍然主要依靠谷歌

Mozilla 今天发布了其年度《Mozilla 状况》报告，2021 年，Mozilla 公司从搜索合作、订阅和广告收入中获得了 5.85 亿美元，比前一年增长了 25%。除了主要来自谷歌的搜索合作的收入之外，来自 Mozilla VPN、Mozilla MDN Plus、Pocket 等新产品的收入为 5700 万美元，与前一年相比增长了 125%。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/11/17/mozilla-looks-to-its-next-chapter/)**
>
>
>

>
> 老王点评：虽然 Mozilla 也有一些让人批评的地方，但是这已经是自由开源世界不多的重要旗舰了。
>
>
>


学习 Python：我最喜欢的 7 个资源

Summary: 这些年来，我通过这些开源资源提高了我的 Python 技能。

这些年来，我通过这些开源资源提高了我的 Python 技能。

![](/data/attachment/album/202211/19/105720mfgygbzyg3ccttce.jpg)

>
> 这些年来，我通过这些开源资源提高了我的 Python 技能。
>
>
>

我最近决定进一步学习 Python，以便提高我的教学技能，拓宽我的学生的视野。在这个过程中，我发现了这些优秀的资源，让我学习新的代码，并提高了对 Python 的整体理解。

### 1、《教孩子学编程 Python 语言版》

我的 Python 之旅大约是 7 年前开始的，当时我发现了 Apple LOGO 和 Python 中的 [Turtle 模块](https://opensource.com/article/21/9/logo-python-turtle) 之间的联系。当时使用的 Linux 计算机的默认 Python 版本为 Python 2.7，我很快发现我想使用 Python 3。我成功地安装了它，并开始使用 Turtle 模块编写一些简单的程序。在阅读 Dr. Bryson Payne 的 《[教孩子学编程 Python 语言版](https://opensource.com/education/15/9/review-bryson-payne-teach-your-kids-code)》 之后，我意识到 Python 不仅仅是 Turtle。那时我安装了 [IDLE](https://docs.python.org/3/library/idle.html)。

### 2、IDLE

在使用 IDLE 工作的过程中，交互式界面优化了我的体验，并让我有足够的信心来考虑向学生教授 Python。我志愿帮助我社区中的一群在家学习的孩子，很快我发现自己在教授一个有十六个孩子的班级！我很高兴他们的父母同意帮助我，否则我想我会被压垮。这个经历激发了我学习更多的欲望，以便我可以教授更多。

### 3.、Mu 编辑器

2018 年春天，我参加了 PyConUS。我听了一场由中学老师 [Nicholas Tollervey](https://us.pycon.org/2018/speaker/profile/194/) 主讲的演讲，他为学龄前儿童编写了一个 Python 开发环境。[Mu 编辑器](https://opensource.com/article/20/9/teach-python-mu) 内置了一个可以帮助我找到代码中的错误的 <ruby> 质检工具 <rt>  Linter </rt></ruby>。Mu 帮助我提高了我的编码技能，我也能够与学生分享这些技能，他们也从中受益。

我的自信和经验增长后，我希望与更多的学生分享 Python 之旅。我与其他人合作撰写了一个申请书，以教授一个使用树莓派 4 和 Python 的课程。疫情打断了这个计划。在此期间，树莓派基金会发布了树莓派 400。2021 年春天，我使用了前一年开发的材料和一个来自当地图书馆的慷慨的资助，来 [教授两组](https://opensource.com/article/21/6/teach-python-raspberry-pi) 学生如何编程。这个活动非常成功并在今年再次举办。

### 4、Codium

几年前，我了解到微软的 VS Code 是一个可以在 Linux 上使用的开源代码编辑器。我最近才了解到，如何在 VS Code 中配置和使用 Python 虚拟环境。我的问题在一篇 [关于虚拟环境的文章](https://opensource.com/article/20/10/venv-python) 中得到了解答，这让我可以知道如何在 Linux 计算机上设置和配置 Python 虚拟环境。大约在同一时间，我发现了 [Codium](https://opensource.com/article/22/11/python-vs-code-codium)，一个围绕 VS Code 构建的社区项目。

现在我希望与我的学生分享 VS Codium 的体验，并让他们对 Python 的理解不再局限于 Turtle 模块。这种学习的热情让我寻找开源且可以在互联网上随意获得的教学资源。

### 5、《Python 编程练习，简单解释》

《[Python 编程快速上手 让繁琐工作自动化](https://automatetheboringstuff.com/#toc)》 这本书是我最喜欢的一本书。现在，作者已经发布了 《[Python 编程练习，简单解释](https://inventwithpython.com/pythongently/)》。这两本书都可以免费在线阅读，并且都采用了知识共享许可证。

### 6、《每个人都可以使用 Python》

Dr. Charles Severance 在 2017 年发布了 《[每个人都可以使用 Python](https://www.py4e.com/lessons)》，我非常推荐这本书。他为像我这样的有抱负的程序员提供了简短的课程。课程的代码可以在 [GitHub](https://github.com/csev/py4e) 上找到，所以你可以下载它并在自己的计算机或学校网络上安装它。

### 7. Python 视频

最近，我了解到 [Jay LaCroix](https://opensource.com/users/jlacroix) 在 YouTube 上有一系列精彩的视频，其中包括 28 个免费视频，从 Python 基础开始，涵盖了 [Python 编程](https://youtube.com/playlist?list=PLT98CRl2KxKGIazPd2nQEPbG7sQpT8LEj) 的全面介绍。最重要的是，他使用的是 Linux 计算机，因此他的课程特别适合 Linux 编程环境。这些视频的其中一个收获是学习如何使用 [nano](https://opensource.com/article/20/12/gnu-nano) 作为编程环境，它默认情况下包含在大多数 Linux 发行版中。

### 你的学习之路

此处提到的这七个资源帮助我成长为一名程序员，它们都是开源的并可以与其他人分享。你是如何提高编程技能的？你有什么要分享的吗？在评论中告诉我们。

---

via: <https://opensource.com/article/22/11/learn-python>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lkxed](https://github.com/lkxed) 译者：[Cubik65536](https://github.com/Cubik65536) 校对：[wxy](https://github.com/wxy)

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


使用 ImageMagick 修复扫描图像

Summary: 使用这个开源工具，即使是批量校正图像也很容易。

使用这个开源工具，即使是批量校正图像也很容易。

![](/data/attachment/album/202211/19/155829valiu5lulmhuuhiz.jpg)

>
> 使用这个开源工具，即使是批量校正图像也很容易。
>
>
>

多年前，在翻阅一家旧书店的书架上的内容时，我偶然发现了一本名为 《UNIX System Command Summary for Berkeley 4.2 & 4.3 BSD》 的小册子，由 Specialized Systems Consultants 出版。我买它是出于好奇，因为它已经有将近 20 年的历史了，但仍然在很大程度上适用于现代 Linux 和 BSD。

无论是当时还是现在，我都很开心。一本写于 1986 年的小册子在 2016 年仍然很重要，而同一个书架上关于专有操作系统的书籍并不值得印刷它们的纸张。（想一想：你认为什么技术可以在僵尸末日中幸存下来？）这本小册子已经放在我自己的书架上好几年了，但我突然想到可能值得对这个作品做一点数字保存，所以我决定扫描这本小册子来创建一本 [CBZ 电子书](https://opensource.com/article/19/3/comic-book-archive-djvu)。

使用 [Skanlite](https://opensource.com/article/22/2/scan-documents-skanlite-linux-kde) 进行扫描很容易，但很耗时。然而，当我完成后，我发现有些页面不是很平整。

![A page of text, including a table of contents and a glossary, that is crooked and distorted](/data/attachment/album/202211/19/155831dgyuw6cmq4uzk6gd.png)

在打印中，这称为配准问题，这意味着打印内容的位置在页面上的方向不正确。

### ImageMagick

[ImageMagick](https://opensource.com/article/17/8/imagemagick) 是基于终端的非交互式图形编辑器。尝试在无图形环境（如纯文本终端）中编辑图形似乎违反直觉，但实际上很常见。例如，当你将图像上传到 Web 应用用作个人资料图片时，应用服务器上的脚本可能会使用 ImageMagick 或其库处理你的图像。非交互式编辑器的优点是你可以制定需要对示例图像执行的操作，然后只需按一下按钮即可将这些效果应用于数百个其他图像。

ImageMagick 通常与其他图形编辑器一样强大，只要你花时间了解它的许多功能以及如何组合它们以实现所需的效果。在这种情况下，我想旋转歪斜的页面。在搜索了 ImageMagick 的文档后，我发现我需要的解决方案的 ImageMagick 术语称为纠偏。将你的术语与其他人的术语保持一致对于你不知道的任何事情都是一个挑战，因此当你使用 ImageMagick（或其他任何东西）时，请记住，你描述问题或解决方案的用词可能和别人不一样。

要使用 ImageMagick 对带有弯曲文本的图像进行校正：

```
$ convert page_0052.webp -deskew25% fix_0052.webp

```

`-deskew` 选项表示可接受偏差的阈值。通过跟踪看似字母的对象的峰谷来确定倾斜。根据扫描的弯曲程度，你可能需要多于或少于 25% 的阈值。我已经达到了 80%，到目前为止，低于 25% 没用效果。

结果如下：

![The same page of text, now with the text properly aligned](/data/attachment/album/202211/19/155831a9s7dszm2srfdk37.png)

修复了！将其应用于文档的剩余 55 页以修复倾斜的页面，而对已经笔直的页面不做任何事情。换句话说，由于我的阈值设置，在不需要调整的页面上运行此命令是安全的。

### 使用 ImageMagick 裁剪图像

在纠正了歪斜之后，因为我扫描每一页都比必要的范围要多，以防止意外切断单词，我认为裁剪我纠正的页面是有意义的。我很高兴在页边空白处保留一些空间，但没有以前那么多。我经常使用 ImageMagick 的“裁剪”功能来处理这个网站上的图像，所以我很熟悉这个选项。但是，我需要确定如何裁剪每一页。

首先，我需要图像的大小：

```
$ identify fixed_0052.webp
WEBP 1128x2593 1128x2593+0+08-bit sRGB 114732B 0.020u 0:00.021

```

知道尺寸后，我能够对我可以承受的丢失多少像素做出一些估计。经过几次试运行，我得到了这个：

```
convert fix_0052.webp -gravity Center -crop 950x2450+0+0 crop_0052.webp

```

这并不完全适合，但当我将它应用于册子中的其他图像时，它被证明很重要。这些页面的内容和扫描仪位置各不相同，所以我很高兴给每一页一点空余空间。

这是校正和裁剪的图像：

![The same page of text, with the previous fixes applied and crooked white margins around the page cropped out.](/data/attachment/album/202211/19/155831va5izzgtlazticif.png)

### 使用开源批量编辑图像

ImageMagick 的美妙之处在于，当你确定了修复图像的公式，你就可以将该修复应用于需要相同修复的所有图像。我使用 [GNU Parallel](http://LINK-TO-SETH-GNU-PARALLEL-REDHAT.COM/SYSADMIN) 执行此操作，它使用我所有的 CPU 内核来完成数百页的图像校正。这并不需要很长时间，而且结果不言而喻。更重要的是，我已经有了一个 UNIX 历史上有趣作品的数字档案。

---

via: <https://opensource.com/article/22/11/fixing-scanned-images-imagemagick>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Ubuntu 和其他 Linux 发行版中安装 FFmpeg

如果你的软件装的够多，那么 ffmpeg 会作为依赖装进系统。

至少在 Arch 上，只要装了以下软件，ffmpeg 就有了：

blender, chromium, electron, firefox, mplayer, mpv, obs-studio, openshot, scrcpy...........

![](/data/attachment/album/202211/19/162251wxt2kaajvvayar8c.jpg)

>
> 本教程讲述了在 Ubuntu 和其他 Linux 系统中安装 FFmpeg 所需的步骤。
>
>
>

FFmpeg 是一系列用于操作多媒体文件的库和软件程序。整个 FFmpeg 是一组强大的库，允许你转换、推流和操作音频和视频文件。许多前端 Linux 应用程序将其用作后端并依赖它。例如，屏幕录制应用程序可能需要 FFmpeg 将录制的流转换为 Gif 图像。

主流的应用程序和服务，如 VLC 媒体播放器、YouTube、Blender、Kodi、Shotcut 和 Handbrake 等，都使用 FFmpeg。

>
> 趣事：NASA 2020 年发射的毅力号火星探测器使用 FFmpeg 完成和处理图像和视频，然后将其发送回地球！
>
>
>

### 关于 FFmpeg 包

[FFmped](https://ffmpeg.org/) 是一个强大的命令行工具。它支持 Linux、Windows 和 macOS，并支持多种架构。它是用 C 和汇编编写的，提供了强大的性能和跨平台实用性。

#### 核心

FFmpeg 的核心是命令行实用程序。它们可以在命令行上使用，也可以从任何编程语言中调用。例如，你可以从 Shell 程序、Python 脚本等程序中使用它们。

* `ffmpeg`：用于转换音频和视频流，包括来自 TV 卡等实时流的源
* `ffplay`：此软件包中捆绑的媒体播放器，用于播放媒体
* `ffprobe`：命令行工具，用于显示媒体信息 - 可以以 txt、csv、xml、json 格式输出

### FFmpeg 安装

在 Ubuntu 和其他 Linux 发行版中安装 FFmpeg 很容易。打开终端并运行以下命令以安装。

#### Ubuntu 以及相似的发行版

```
sudo apt install ffmpeg

```

#### Fedora

对于 Fedora Linux，你需要添加 [RPM Fusion repo](https://www.debugpoint.com/2020/07/enable-rpm-fusion-fedora-rhel-centos/)。Fedora 官方仓库没有 FFmpeg 包。

```
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm

```

```
sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-

```

```
sudo dnf install ffmpeg

```

#### Arch Linux

```
pacman -S ffmpeg

```

在安装完成后，你可以使用以下命令验证安装。

```
ffmpeg --version

```

![Ubuntu Linux 中安装的 FFmpeg](/data/attachment/album/202211/19/162301dqqqxqsu2926wtdz.jpg)

### 示例：ffmpeg 的基础用法

首先，让我给你一个简单的例子。考虑以下示例。它只是将 mp4 文件转换为 mkv 文件。

1、转换一个基本的视频文件

```
ffmpeg -i big_buck_bunny.mp4 big_buck_bunny.mkv

```

当然，这是最简单的方法，但它不完整，因为它没有转换所需的视频文件的比特率、分辨率和其他属性。

2、转换一个音频文件

其次，你可以使用类似的命令转换音频文件。

```
ffmpeg -i sunny_day.ogg sunny_day.mp3

```

3、使用音频和视频编解码器转换

最后，以下示例可以使用指定的编解码器转换视频文件。参数 `-c` 带有的 `a` 或 `v` 分别定义音频和视频。下面的命令使用 `libvpx` 视频和 `libvorbis` 音频编解码器进行转换。

```
ffmpeg -i big_buck_bunny.mp4 -c:v libvpx -c:a libvorbis big_buck_bunny.webm

```

### 如何找出系统中可用的编解码器，编码器和解码器？

#### 列出所有编解码器

要列出所有可用的编解码器，请运行以下命令：

```
ffmpeg -codecs

```

该命令列出了所有可用的编解码器及其功能，是否支持解码或编码等。此外，它们根据下表的位置进行标识。

```
D..... = Decoding supported
.E.... = Encoding supported
..V... = Video codec
..A... = Audio codec
..S... = Subtitle codec
...I.. = Intra frame-only codec
....L. = Lossy compression
.....S = Lossless compression

```

![FFmpeg 编解码器列表](/data/attachment/album/202211/19/162301xtkdtt0fzkqyjfyp.jpg)

#### 列出所有编码器

通过以下命令列出所有编码器：

```
ffmpeg -encoders

```

#### 列出所有解码器

同样的，你可以通过以下命令获取解码器列表：

```
ffmpeg -decoders

```

#### 详细信息

你还可以使用参数 `-h` 获取编码器或解码器的更多详细信息。

```
ffmpeg -h decoder=mp3

```

### 总结

我希望你学会了 FFmpeg 和它的命令的基础知识。你可以通过 [官方文档](https://ffmpeg.org/documentation.html) 了解更多有关该程序的信息。

---

via: <https://www.debugpoint.com/install-ffmpeg-ubuntu/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[Cubik65536](https://github.com/Cubik65536) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #825 Meta 公司最新的大型语言模型仅在网上生存了三天

Summary:
❶ Meta 公司最新的大型语言模型仅在网上生存了三天
❷ 中国在全球顶级芯片峰会上发表的论文数超越美国
❸ 对多因素认证的攻击正在增加

切，凑数而已，什么？日经？那没事了，考虑到日本还在用软盘。。。还能喷什么？！

![](/data/attachment/album/202211/19/192626ombuehxzep8xoraw.jpg)

![](/data/attachment/album/202211/19/192638nmj9vg3gjguj24uk.jpg)

### Meta 公司最新的大型语言模型仅在网上生存了三天

11 月 15 日，Meta 公司发布了一个名为 Galactica 的新的大型语言模型。它是一个用于科学的大型语言模型，由 4800 万篇科学文章、网站文章、教科书、讲义和维基等训练而成。Meta 公司将其模型宣传为研究人员和学生的捷径，说它“可以总结学术论文，解决数学问题，生成维基文章，编写科学代码，为分子和蛋白质做注解，等等。”但是，像所有的语言模型一样，Galactica 只是一个无意识的机器人，无法区分事实与虚构。几小时内，科学家们就在社交媒体上分享了它有偏见和不正确的结果。三天后，Meta 撤下了它的在线演示版本。

>
> **[消息来源：Technology Review](https://www.technologyreview.com/2022/11/18/1063487/meta-large-language-model-ai-only-survived-three-days-gpt-3-science/)**
>
>
>

>
> 老王点评：这可能是最短命的 AI。不过抛开夸大的宣传，它或许会有一些更务实的用途。
>
>
>

![](/data/attachment/album/202211/19/192654oji0ivs3mmfvlyqo.jpg)

### 中国在全球顶级芯片峰会上发表的论文数超越美国

国际固态电路会议（ISSCC）将于明年初在旧金山举行。据会议委员会称，本次会议通过了筛选的 198 篇论文中有 59 篇来自中国，42 篇来自美国，32 篇来自韩国。中国论文数从第三位上升到第一位，中国在每个类别的入选研究论文数量都有所增加。ISSCC 于 1954 年首次举行，它是该领域最大和最著名的国际会议。

>
> **[消息来源：日经新闻](https://asia.nikkei.com/Business/Tech/Semiconductors/China-tops-U.S.-to-take-research-crown-at-global-chip-conference)**
>
>
>

>
> 老王点评：我们的芯片行业在进步，虽然这条路还很长。
>
>
>

![](/data/attachment/album/202211/19/192707iid1gdntyr0ds8zg.jpg)

### 对多因素认证的攻击正在增加

三年前，针对多因素认证（MFA）的攻击非常罕见，因为很少有机构启用 MFA。但随着微软、谷歌等开始推行多因素认证，对它的攻击开始增加。在这些攻击中，攻击者破坏了发给已经完成多因素认证的人的令牌，并复制该令牌以获得不同设备的访问。令牌是 OAuth 2.0 身份平台的核心，其目的是使用户的身份验证更简单、更快速，并能抵御密码攻击。微软的检测和响应团队发现攻击者为此目的利用令牌盗窃的情况有所增加。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/microsoft-hackers-are-using-this-concerning-tactic-to-dodge-multi-factor-authentication/)**
>
>
>

>
> 老王点评：道高一尺魔高一丈，安全的关键其实不是技术，是人。
>
>
>


使用 Linux 的 ping 命令诊断网络连接问题

Summary: 在本文中，我们将讨论网络连接最基本的诊断工具之一：ping 命令。

在本文中，我们将讨论网络连接最基本的诊断工具之一：ping 命令。

>
> 在本文中，我们将讨论网络连接最基本的诊断工具之一：`ping` 命令。
>
>
>

![](/data/attachment/album/202211/20/094045mhhkqhepke4qebks.jpg)

如今，联网计算机变得十分普遍，以至于我们大多数人都理所当然地认为，房间一侧的计算机可以连接上房间另一侧的计算机，更不用说能连接上世界的另一端的计算机了。如此，网络使互联网、云、文件共享、媒体流、远程管理、打印等服务成为可能。但是当网络出现问题时，有时很难诊断到底是其中哪一环节出现了问题。下面，我们就来介绍：网络连接最基本的诊断工具之一—— `ping` 命令。

### 基本的 ping 命令

当你无法访问本地网络上的计算机或互联网上的服务器时，你可以 `ping` 它的 IP 地址。`ping` 将 <ruby> 互联网控制报文协议 <rt>  Internet Control Message Protocol </rt></ruby>（ICMP）数据包发送到目标 IP 地址。当我们要对网路连接状况进行判断时，ICMP 是个非常有用的协议，本质上 ICMP 是一个响应和应答信号。

让我们由近及远地进行故障排除。请先 `ping` 你自己的计算机，以确保你的计算机正在运行 <ruby> 网络栈 <rt>  networking stack </rt></ruby>。你正在操作的计算机称为 <ruby> 主机 <rt>  localhost </rt></ruby>，本地回环地址是：`127.0.0.1`。

`ping` 命令能用主机的 <ruby> 主机名 <rt>  hostname </rt></ruby>、IP 地址（即 `127.0.0.1`）或者仅仅用简写 `0` 来表示 “主机”。

你可以使用 `-c` 选项，来控制发送数据包的 <ruby> 次数 <rt>  count </rt></ruby>。

```
$ ping 0 -c 1
PING 0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.069 ms

--- 0 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms

```

在你确认本地网络栈已启动并运行后，接下来，你可以 `ping` 你的路由器的 IP 地址。路由器的 IP 地址通常以 `192.168` 或 `10` 开头。实际的 IP 地址取决于路由器的配置。

当你没有指定要发送多少次请求时，你可以用 `Ctrl+C`，来终止 `ping` 的运行。

```
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
From 192.168.0.100: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=3 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=4 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=5 Redirect Host(New nexthop: 192.168.0.1)
^C

```

如果你能 `ping` 通路由器，则表示你的有线或无线连接能正常工作。

对于你的局域网上的其他主机呢？你可以 `ping` 各种设备，但是并非所有设备都能保证响应，因为一些设备会丢弃 ICMP 数据包，但许多设备会做出响应。例如，我可以 `ping` 我的打印机：

```
$ ping 192.168.0.4

```

### ping 路由器以外的其他服务器

在确定你自己的网络内部都能连通以后，你还可以 `ping` 通到路由器以外的其他服务器。同样地，并非所有服务器都能接收 ICMP 数据包，更不用说响应 ICMP 数据包了。然而，也有一些服务器可以接收并响应 ICMP 数据包，而在互联网中的一个重要服务器是 <ruby> 域名服务器 <rt>  nameserver </rt></ruby>。

谷歌的 <ruby> 域名解析服务器 <rt>  DNS server </rt></ruby>的 IP 地址很容易记住，而且它会响应 `ping` 请求：

```
$ ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=53.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=53.5 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 53.304/53.424/53.544/0.120 ms

```

当你连不上一个网站时，你可以查询全球 DNS 网络，以找出其主机服务器的地址，然后 `ping` 该服务器。这至少可以告诉你，网站不通的原因是主机已关闭，或者只是 Web 服务器问题。

例如，假设你尝试访问 `example.com`，但是发现失败了。首先，使用 `host` 命令找到 `example.com` 的 IP 地址：

```
$ host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
example.com mail is handled by 0

```

然后，`ping` 该网站的的 IP 地址：

```
$ ping 93.184.216.34 -c 1

```

### 使用 IPv6

`ping` 不仅可以使用 IPv4，还能使用 IPv6。可以通过指定 `-4` 或 `-6` 选项，来只使用 IPv4 或 IPv6。

### 设置数据包大小

你可以使用 `-s` 选项，来更改要发送的 ICMP 数据包的 <ruby> 大小 <rt>  size </rt></ruby>。默认的数据大小为 56 字节，加上 8 字节包头，总共得到 64 字节的 ICMP 数据包。以下的示例将发送的 ICMP 数据包大小修改为 35+8=43 个字节：

```
$ ping -s 35 -c 5 8.8.8.8

```

你可以使用 `-D` 选项，使得在终端中的每个 `ping` 回复之前，先打印出当前的时间戳。该时间戳为 UNIX 时间戳，加上微秒：

```
$ ping -D 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[1634013430.297468] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=53.3 ms
[1634013431.298738] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=53.1 ms

```

### 设置时间间隔/长短

你可以使用 `-i` 选项，来更改两次 `ping` 请求之间的 <ruby> 时间间隔 <rt>  interval </rt></ruby>。以下的示例将 `ping` 间隔更改为 2 秒：

```
$ ping -i 2

```

你也可以使用 `-w` 选项，来在一段时间后终止 `ping`，单位为秒。

```
$ ping -w 6

```

### ping 的变体

`ping` 有很多变体。例如，`iputils` 包提供了 `ping` 命令；[Busybox](https://opensource.com/article/21/8/what-busybox) 也有`ping` 命令；BSD 也有；甚至还有一个图形界面的 `ping`：`gping`，它可用于 Linux、macOS 和 Windows。你可以在 [GitHub](https://github.com/orf/gping) 上找到更多有关 `gping` 的信息。

### 一起来学习吧

`ping` 命令很简单，但它可以帮你诊断网络连接问题。下次再遇到网络连接问题时，让 `ping` 命令成为你解决问题的第一个工具吧。

---

via: <https://opensource.com/article/21/10/linux-ping-command>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[chai001125](https://github.com/chai001125) 校对：[wxy](https://github.com/wxy)

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