分类 技术 下的文章

想知道 ls 命令输出中的颜色是什么?它们从何而来,又该如何设置?本文将为您一一解答。

相信你一定使用过 ls 命令来 列出目录的内容。在 Ubuntu 和许多其他发行版中,你将看到不同颜色的 ls 命令输出。

如果你没有看到过,你可以这样获得如下所示的彩色输出:

ls --color=auto

但是你有没有想过这些颜色在 ls 命令输出中意味着什么?

我将回答本文中的问题。如果你的终端默认情况下不显示它,我还将展示如何使用 ls 命令获取彩色输出

Ubuntu 中 ls 命令中使用的颜色的含义

? ls 命令输出的颜色没有固定的标准。不同的终端和发行版使用不同的颜色编码,你也可以根据自己的喜好进行修改。换句话说,不要依赖颜色。

我在本节中使用默认的 Ubuntu 终端及其颜色配置文件。

当你 使用 ls 命令列出文件 时,它会使用不同的颜色来指示不同类型的文件。

大多数终端都会以不同的颜色显示可执行文件、链接、常规文件和目录,以便你可以轻松区分它们。

有些终端(例如 Ubuntu 中的默认终端)将其提升到一个新的水平,并为音乐文件、图像和视频添加更多颜色。

为了演示,我列出了来自不同目录的文件,这些文件在 Ubuntu 中用不同的颜色填充了我的终端窗口:

different colors used by the ls command

看起来很混乱? 让我一一为你解密吧!

颜色描述
粗体蓝色目录
无色文件或硬链接
粗体青色指向文件的符号链接。
粗体绿色可执行文件(.sh 扩展名的脚本)
粗体红色归档文件(主要是 tarball 或 zip 文件)
洋红色表示图像和视频文件
青色音频文件
黄色配黑色背景管道文件(称为 FIFO)
粗体红色配黑色背景损坏的符号链接
无色(白色)配红色背景表示设置用户 ID 文件
黑色配黄色背景表示设置组 ID 文件
白色与蓝色背景显示粘滞位目录
蓝色配绿色背景指向其他可写目录
黑色配绿色背景当目录同时具有粘滞位和其他可写目录的特征时
? 再次强调,上述颜色数据基于终端的默认设置,如果更改调色板,将不会得到类似的结果。

但是如果你的终端不显示任何颜色怎么办? 好吧,这是有原因和解决方案的。

如果 ls 命令不显示彩色输出怎么办?

事情是这样的。默认情况下,ls 命令不应在输出中显示颜色。如果你使用 --color=auto 标志,它将显示颜色。

ls --color=auto

那么为什么 ls 命令在 Ubuntu 和其他一些发行版中默认添加颜色呢? 这是因为你的发行版为 ls 命令设置了别名,以便在执行 ls 命令时使用 --color=auto 标志:

alias

因此,如果 ls 命令未显示彩色输出,则是因为默认情况下没有设置别名。

现在,每当你使用 ls 命令时,你都可以使用 --color=auto 标志。

Use  --color=auto flag with the ls command to get the colored output

但这不太方便。相反,你应该创建别名并将其添加到 .bashrc 中,以便 ls 命令默认显示颜色。

为 ls 创建一个永久别名来显示颜色

要创建永久别名,首先,使用以下命令打开 .bashrc 文件:

nano ~/.bashrc

使用 Alt + / 跳到文件末尾粘贴如下行到终端:

alias ls='ls --color=auto'

完成后,保存更改并退出 nano 文本编辑器。

要使你刚刚所做的更改生效,请 源引 source .bashrc 文件:

source ~/.bashrc

就是这样! 从现在开始,你可以使用彩色输出。

ls 命令从哪里获取颜色?

现在有趣的部分来了。ls 命令的颜色在哪里定义? 答案是 LS_COLORS 环境变量。

是的。这是名为 LS_COLORS 的特殊环境变量,它定义 ls 命令使用的颜色。

Value of the LS_COLORS env variable in Ubuntu

这很好,但是谁定义了这个变量呢? 如果你想做出一些改变怎么办? 我也来回答一下这些问题。

实际上,你有一个专门的 dircolors 命令来为 ls 命令设置颜色。

不同的 Shell 有不同的颜色配置文件格式。这就是为什么在使用此命令时应指定 Shell。

dircolors command output for bash

如你所见,它定义了 LS_COLORS 环境变量并将其导出,以便该变量可用于子 Shell。

现在,如果你想使用它,你可以将其复制粘贴到你的 .bashrc 文件或像这样重定向输出:

dircolors -b >> .bashrc

源引 source 该文件,以便效果立即可见。你只需要做一次。

理解颜色配置文件

LS_COLORS 包含由冒号(:)分隔的键值对数据。如果该值有多个部分,则它们之间用分号(;)分隔。

键通常是预定义的。值部分代表颜色。

因此,如果显示 ln=01;36,则表示对于符号链接,字体为粗体,颜色(36)为青色。

00 为正常,01 为粗体,4 为下划线。31 代表红色,32 代表绿色等。颜色代码遵循 ANSI 转义代码

另一个例子。or=40;31;01 表示链接到不存在的文件(键为 or),使用黑色背景(颜色代码 40)、红色(31)和粗体字体(代码 01)。

我认为顺序并不重要,因为代码不重叠。31 是前景色红色的代码,41 是背景红色的颜色。因此,如果使用 41,你就知道它用于背景颜色。

使用 ls 命令执行更多操作

ls 命令可以做更多的事情,为此,我们制作了有关如何使用 ls 命令的详细教程:

在 Linux 中使用 ls 命令

Abhishek Prakash 提供资料。

(题图:MJ/4d0f1f66-259f-4671-a3a8-158f61a38b10)


via: https://itsfoss.com/ls-color-output/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

连续集成 continuous integration (CI)是指代码变更会被自动构建和测试。以下是我为自己的 C++ 项目构建 CI 流水线的过程。

本文介绍如何在 GitLab 上配置 CI 流水线。我在前面的文章中介绍了 基于 CMake 和 VSCodium 的构建系统基于 GoogleTest 和 CTest 的单元测试。本文将在此基础上进一步配置 CI 流水线。我会先演示如何布设和运行 CI 流水线,然后再介绍如何配置它。

CI 是指提交到代码仓库的代码变更会被自动构建和测试。在开源领域,GitLab 是一个流行的 CI 流水线平台。除了作为中心 Git 仓库外,GitLab 还提供 CI/CD 流水线、 问题跟踪 issue tracking 容器注册表 container registry 功能。

相关术语

在进入正题之前,我先介绍在本文和 GitLab 文档 中会遇到的常见术语。

  • 持续交付 continuous delivery (CD):自动化供应软件,以供随时交付
  • 持续部署 continuous deployment (CD):自动化软件发布
  • 流水线 pipeline : CI/CD 的直接构件,它由阶段和作业构成
  • 阶段 stage :一组作业
  • 作业 job :某项需要执行的具体任务,比如编译、单元测试等
  • 执行器 runner :实际执行作业的服务

布设 CI 流水线

在下面的章节中,我将复用以前的 示例工程。点击 GitLab 仓库页面右上角的 复刻 Fork 按钮复刻代码仓库。

 title=

设置执行器

为了让你对整个流程有所了解,我们先从在本地安装执行器讲起。

参照执行器服务 安装指南 安装好服务,然后注册执行器。

1、选择 GitLab 项目页面左侧的 设置 Settings ,再选择 CI/CD

 title=

2、展开 执行器 Runners 区域,关闭 共享的执行器 Shared runners 选项(黄框处)。特别注意令牌和 URL(绿框处),下一步会用到它们。

 title=

3、在终端中运行 gitlab-runner register,根据提示输入以下注册信息:

  • GitLab 实例: https://gitlab.com/ (如上图)
  • 注册令牌:从执行器区域中获取 (如上图)
  • 描述:按需自由填写
  • 标签:可以不填
  • 执行环境:选 Shell

如果有需要,你可以在 ~/.gitlab-runner/config.toml 中修改这些配置。

4、用命令 gitlab-runner run 启动执行器。你可以在 GitLab 的项目设置界面执行器区域看到执行器的状态:

 title=

运行流水线

前面已经提过,流水线就是一组由执行器执行的作业。每个推送到 GitLab 的提交都会生成一个附加到该提交的流水线。如果多个提交被一起推送,那么只会为最后一个提交生成流水线。为了演示,我直接在 GitLab 在线编辑器中提交和推送修改。

打开 README.md 文件,添加一行数据:

 title=

现在提交修改。

这里注意默认的行为是为提交新建一个分支,为了简便起见,我们择提交到主分支。

 title=

提交后一会儿后,你就应该改能看到 GitLab 执行器执行的控制台中有输出消息:

Checking for jobs... received job=1975932998 repo_url=<https://gitlab.com/hANSIc99/cpp\_testing\_sample.git> runner=Z7MyQsA6

Job succeeded duration_s=3.866619798 job=1975932998 project=32818130 runner=Z7MyQsA6

在 GitLab 项目概览界面左侧选择 CI/CD --> 管道 Pipelines ,查看最近执行的流水线:

 title=

选中流水线可以在详情界面看到哪些作业失败了,并能查看各个作业的输出。

当遇到非零返回值是就认为作业执行失败了。在下面的例子中我通过调用 exit 1 强制让作业执行失败:

 title=

CI 配置

阶段、流水线和作业的配置都在仓库根目录的 .gitlab-ci.yml 文件中。我建议使用 GitLab 内置的流水线编辑器,它会自动对配置进行检查。

stages:
- build
- test

build:
  stage: build
  script:
    - cmake -B build -S .
    - cmake --build build --target Producer
  artifacts:
    paths:
      - build/Producer

RunGTest:
  stage: test
  script:
    - cmake -B build -S .
    - cmake --build build --target GeneratorTest
    - build/Generator/GeneratorTest

RunCTest:
  stage: test
  script:
    - cmake -B build -S .
    - cd build
    - ctest --output-on-failure -j6

文件中定义了两个阶段:buildtest,以及三个作业:buildRunGTestRunCTest。其中作业 build 属于一个同名的阶段,另外两个作业属于阶段 test

script 小节下的命令就是一般的 Shell 命令。你可以认为是将它们逐行输入到 Shell 中。

我要特别提及 产物artifact 这个特性。在示例中我定义了二进制的 Producer 为作业 build 的产物。产物会被上传到 GitLab 服务器,并且可以从服务器的这个页面上被下载:

 title=

默认情况下,后续阶段的作业会自动下载先前阶段作业生成的所有产物。

你可以在 docs.gitlab.com 上查看 gitlab-ci.yml 参考指南。

总结

上面只是一个最基本的例子,让你对持续集成的一般原则有一个了解。再演示中我禁用了共享执行器,然而这才是 GitLab 的优势所在。你可以在一个干净的容器化的环境中构架、测试和部署程序。除了使用 GitLab 提供的免费执行器,你也可以用自己的容器作为执行器。当然还有更高阶的用法:用 Kubernetes 来协调调度执行者容器,让流水线适应大规模使用的使用场景。如需进一步了解,可以查看 about.gitlab.com

如果你使用的是 Fedora,需要注意的一点是目前 GitLab 执行者还不支持用 Podman 作为容器引擎。(LCTT 译注:Podman 是 Fedora 自带的容器引擎。)根据 议题 issue #27119,对 Podman 支持已将列上日程。(LCTT 译注:Podman 4.2 及以上版本增加了对于 GitLab 执行器的支持。)

把重复性的操作描述成作业,并将作业合并成流水线和阶段,可以让你跟踪它们的质量而不增加额外工作。。特别是在大型社区项目中,适当配置的 CI 可以告诉你提交的代码是否对项目有改善,为你接受或拒绝合并请求提供依据。

(题图:MJ/fb711c48-251a-4726-a41c-247370e5df25)


via: https://opensource.com/article/22/2/setup-ci-pipeline-gitlab

作者:Stephan Avenwedde 选题:lujun9972 译者:toknow-gh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

想了解 Linux 命令行的基础知识吗? 这是一个带有实践方法的教程系列。

Linux 终端可能令人生畏。这块黑色的屏幕只能使用命令。很容易让人感到迷失。

问题是 Linux 命令行是一个很大的话题。你只需使用命令即可管理整个系统。我的意思是,这就是系统管理员、网络工程师和许多其他工作的角色。

本教程集的目的不是让你做好工作准备。它旨在为你提供 Linux 命令行之旅的起点。 它将为你提供足够的能力来使用终端并了解一些基本知识,例如读取文件和编辑文件。

由于这只是开始,所以大部分教程都属于“文件操作”类别。这是大多数 Linux 书籍和课程的起点。

? 最好的学习方法就是自己动手。我以“实践模式”编写了这些教程,以便你可以在 Linux 系统上参照这些示例。本系列的每一章都包含一些示例练习来锻炼。跟着学、多练习,你很快就能熟练掌握 Linux 命令行。

第 0 章:熟悉终端和术语

当你对终端完全陌生时,即使在阅读教程时你也会发现自己迷失了方向。那是因为你应该知道至少你得理解最简单的术语。

下面的文章将帮助你解决其中的一些问题。虽然我分享的一些技巧可能对你来说有点超前或不太有用,但你会发现很多有用的东西。

19 个基础而重要的 Linux 终端技巧

第 1 章:更改目录

在第一章中,学习使用绝对路径和相对路径切换目录(文件夹)。这样,你就可以在 Linux 命令行中切换。

在 Linux 终端更改目录

第 2 章:创建目录

现在你已经了解了如何切换目录,接下来了解如何创建新目录。

在 Linux 终端创建目录

第 3 章:列出目录中的内容

你已经很好地掌握了目录。学习查看目录内部并查看它们有哪些文件和子目录。

在 Linux 终端列出目录

第 4 章:创建文件

关于目录已经足够了。了解在 Linux 命令行中创建新文件。

在 Linux 终端创建文件

第 5 章:读取文件

文件里面有什么?在本章中学习阅读文本文件。

在 Linux 终端读取文件

第 6 章:删除文件和目录

现在你已经学会了创建新文件和文件夹,是时候删除它们了。

在 Linux 终端删除文件和目录

第 7 章:复制文件和目录

在终端基础知识系列的本期中,继续进行文件操作并学习复制文件和目录。

在 Linux 终端复制文件和目录

第 8 章:移动文件和目录

移动文件操作就像剪切粘贴一样。你也可以使用相同的方法重命名文件和目录。

在 Linux 终端移动文件和目录

第 9 章:编辑文件

作为最后一个主要的文件操作,学习在命令行中编辑文本文件。

在 Linux 终端编辑文件

第 10 章:获取帮助

现在你已经了解了大量基本的 Linux 命令行操作,是时候了解如何在终端本身中获取帮助了。

在 Linux 终端获取帮助

从这往哪儿走?

现在你已经更熟悉终端并了解命令行中的基本文件操作,你可能想知道接下来要怎么做。

我建议你购买一本 Linux 书籍,例如《How Linux Works》。不过,你可以从你遇到的任何 Linux 书籍开始。这里有一些 我喜欢的几本 Linux 书籍

还不想花钱买书吗? 不用担心! 这里有一些 你可以下载的免费 Linux 电子书

Bash 脚本也是 Linux 学习中不可或缺的一部分。即使你不必编写 Shell 脚本,如果你了解基础知识,你也应该能够理解使用 Linux 时遇到的脚本。

Bash 基础知识系列

学无止境。不可能面面俱到。但是,如果你至少了解基础知识,就能帮助你更有效地使用系统。

? 希望你喜欢这个 Linux 终端教程系列。请在评论部分分享你的反馈。


via: https://itsfoss.com/linux-terminal-basics/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

不喜欢 Gedit 文本编辑器的默认外观?当然可以尝试更改颜色主题。以下是更改方法。

Gedit 是 Linux 世界中最流行的文本编辑器之一。它主要是一个文本编辑器,但 经过一些调整,你也可以使用它进行编写程序。

现在,程序员通常更喜欢较暗的主题,Gedit 对此并不陌生。它有很多主题可供选择。

但是,如果你对它们不满意,你也可以安装第三方配色方案。如果需要,你甚至可以创建自己的配色方案,使其完全独一无二。

首先让我向你展示如何更改默认的 Gedit 主题,然后我将分享如何安装其他第三方主题。

更改默认的 Gedit 主题

正如我之前提到的,Gedit 带有一些自己的配色方案。你可以轻松切换到它们。

转到右上角的菜单并选择 “ 首选项 Preferences ”。

Select Preferences from the top-right hamburger menu

现在,转到字体和颜色选项卡。

Select the Fonts & Colors tab in the preferences section for changing colors

在这里,你可以更改配色方案。你可以在下面的截图中看到所有配色方案的外观。

Classic

Cobalt

Kate

Oblivion

Solarized Dark

Solarized Light

Tango

Yaru

Yaru Dark

不喜欢你所看到的? 让我们探索一下第三方 Gedit 主题。

安装第三方配色方案

你需要先从互联网下载所需的配色方案文件,然后从首选项将它们添加到 Gedit 或将它们放在 .local/share/gedit/styles 文件夹中。

步骤 1:下载配色方案文件

第三方 Gedit 主题可在各种 GitHub 仓库中找到。为了你的方便,我列出了一些仓库,你可以在其中找到很多方案文件。

在上面的仓库中,你可以找到 XML 文件。打开主题 XML 文件并使用 将文件另存为原始数据 选项下载它们,如下所示。

Download XML files for Gedit themes

步骤 2:安装单独的主题文件

如果你精心挑选了一些主题文件,你可以使用 Gedit 添加方案功能一一安装它们。为此,请打开 “ 首选项 Preferences > 字体和颜色 Fonts & Colors ” 选项卡。现在,单击左下角的 “+” 符号:

Click on the "+" sign on Fonts & Colors page for adding individual XML files

从文件浏览器中,选择下载的主题文件,然后单击“ 确定 OK ”。

"Neon", a newly installed theme

该主题现在将在同一“字体和颜色”选项卡上可见,你可以通过单击它进行切换。

步骤 2 替代:批量安装主题

你是否下载了整个 GitHub 主题仓库? 那么一一安装主题就不方便了。不用担心,Gedit 有可用于批量安装的颜色主题目录。

你必须将所有 XML 文件复制并粘贴到 .local/share/gedit/styles

之后,你将在“字体和颜色”选项卡上获得所有主题的缩略图。

Fonts & Colors tab will list all the user installed third partyy themes, that are available for switching

如果没有 styles 目录,请创建一个。现在,主题将可供该特定用户使用。

? 在 Linux Mint 上,你可以将 XML 文件复制到 /usr/share/gtksourceview-3.0 目录,Gedit 和 Xed 编辑器都可以访问该目录。

删除 Gedit 主题

如果你不喜欢某些主题,可以从该位置删除这些文件。或者,转到字体和颜色部分。现在选择你要删除的主题,然后按左下角的 “-” 号。

Select theme that you want to remove from the list and press "-" button

这将删除该特定的配色方案。

一些好看的 Gedit 主题

下面的截图给出了我的一些建议。

Blackboard:

Blackboard (gmate)

Catppuccin 是一个深色的 Gedit,如果你使用任何类似的 GTK 主题,那就太合适了:

Catppuccin

Lowlight:

Lowlight theme from gmate

Midnight:

Midnight (gmate)

Monakai:

Monakai (gmate)

Neopro:

Neopro theme from gmate

Plastic Code Wrap:

Plastic Code Wrap theme from gmate

Slate:

Slate (gmate)

Vibrant Fun:

Vibrant Fun (gmate / mig)

你可以通过搜索 GitHub 话题 和仓库来获取更多主题。

更多 Gedit 调整

这只是众多 调整 Gedit 的方法 之一。这里还有更多内容供你探索。

享受更多颜色的 Gedit ?

(题图:MJ/3a36db2e-6da6-4bdc-bf80-0aa0e6481f8e)


via: https://itsfoss.com/gedit-themes/

作者:Sreenath 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

FIDO U2F 安全密钥是一种小型的基于 USB/NFC 的设备。它是一种硬件安全令牌,具有多个安全相关的用途模块。FIDO U2F 标准兼容的密钥品牌有多种,包括 NitroKey、SoloKey v2 和 YubiKey。与类似 Yubico OTP 的专有协议相比,FIDO 协议是不依赖特定硬件令牌的,并且使用的工具也不依赖特定制造商。

本文介绍了 FIDO 协议,并展示了如何安装和启用 FIDO U2F 安全密钥作为替代身份验证因素,以用于登录终端、GDM 或进行 sudo 认证。

对于 YubiKey,特别是其不支持 FIDO2/U2F 的旧版设备,请参阅之前的文章:

如何在 Fedora Linux 上使用 YubiKey

本文不涵盖存储 OpenPGP 密钥或 X.509 证书的操作,因为这些功能与硬件相关,不属于 FIDO U2F 标准的一部分。

保留备用安全密钥

一旦你开始使用安全令牌,就必须考虑到自己可能会被锁定在与这些令牌相关联的账户之外的情况。由于硬件安全令牌是独特的,并且被设计为非常难以复制,你不能像在使用 KeePass 或 AndOTP 等软件保险库时那样制作备份。因此,你使用主要密钥进行的所有注册都应立即使用第二个备份密钥重复进行,并将其存储在安全的位置,甚至可能是保险箱中。

在实践中,这意味着你需要将两个硬件令牌注册到你的 Linux 和 Web 账户中,并生成两份 OpenSSH 私钥,并将这两份 OpenSSH 公钥上传到你使用的服务器和服务(例如 GitHub)中。

如果你丢失了一个密钥,你将需要使用第二个密钥登录与密钥注册的每个服务,删除丢失的密钥,并注册一个新密钥。对于使用 FIDO2 协议的无密码登录尤其如此。

FIDO2、U2F 和 FIDO 联盟

FIDO2 是由 FIDO 联盟 维护的一系列标准。FIDO 联盟希望最终完全摒弃密码,并提供通过多个因素安全验证用户身份的过程,而无需使用密码。

该标准包括万维网联盟(W3C)的 网页认证 Web Authentication (WebAuthn)和 FIDO 联盟的 客户端到认证器协议 Client-to-Authenticator Protocol (CTAP)。WebAuthn 是一种用于请求和处理公钥挑战进行认证的标准 API。通过这个标准,浏览器会向客户端发送一个 挑战 challenge ,然后客户端使用私钥生成一个 响应 response ,挑战者再使用之前交换的公钥进行验证。如何生成挑战答案对于服务来说是不可知的,而是由 CTAP 控制。用户可能会被要求使用多种验证方法,如生物识别、PIN 或存在性检查(或这些方法的组合)。这些验证方式在认证时与注册密钥时的方式相同。

为了保护与硬件令牌的任何交互,可以选择设置一个访问 PIN,并且默认情况下未设置。大多数密钥在连续八次输入访问 PIN 失败后将自动失效。恢复失效的密钥并设置新 PIN 的唯一方法是重置密钥。然而,当密钥重置时,所有其服务注册将丢失!

FIDO2 密钥还支持 FIDO U2F 协议(现已更名为 CTAP1)。该协议旨在提供第二或多因素(但非无密码)认证。Linux 的 PAM 认证系统也可以配置为使用 U2F 协议。虽然 FIDO U2F 不是为无密码认证设计的,但 U2F PAM 模块允许无密码认证。

安全影响

FIDO2 / U2F 通过将安全密钥与用户账户绑定来工作。大多数密钥默认启用/使用基本的存在性检查。它们通常通过点亮并提示你触摸密钥来进行存在性检查。FIDO2 PIN 是可选的,默认情况下未设置。当密钥用于登录 Linux 帐户或用于使用 sudo 时,只需确保设备和密钥物理上存在即可。FIDO2 PIN 是一个重要的附加验证步骤,用于确保只有你才能使用密钥进行身份验证。

等一下!现在我还要记住额外的 PIN 吗?这不就是一个更短的密码吗?

—— 担心的读者

FIDO2 PIN 不是密码,它是一个简短、容易记住的短语。这并不是一个问题,因为:

  1. 你需要物理访问密钥 需要知道 PIN。
  2. 输入 PIN 错误达到八次会使密钥失效,这使得暴力破解变得困难。

相反地,现在你可以使用存储在密码管理器中的安全密码,而无需记住它。

谷歌在 2016 年进行的一项案例研究,题为 《安全密钥:现代网络的实用密码学第二因素》,显示了安全密钥有效地保护用户免受密码重用、钓鱼和中间人攻击的影响。

使用 PAM 进行用户认证

本地系统认证使用 可插拔认证模块(PAM)。U2F 设备的 PAM 模块(因此进行认证)是 pam_u2f。你的密钥是否支持 FIDO2 或 FIDO U2F 取决于其固件版本和硬件型号。

设置如下:

  1. 安装 PAM 模块。
  2. 将密钥注册到你的用户账户上。
  3. 使用 authselect 在 PAM 中激活智能卡支持。

authselect 是一个用于配置带有可重现配置文件的 PAM 的工具。使用 authselect 的配置文件可以避免手动修改 /etc/pam.d 目录下的配置文件。

依赖项

所需的软件包可在官方仓库中获取。

[…]$ sudo dnf install pam-u2f pamu2fcfg fido2-tools

在密钥上设置 FIDO2 PIN

FIDO2 标准定义了一种用于访问保护的可选 PIN。如果 PIN 丢失或失效,没有 PUK 或其他恢复方式,请确保你有一种备用的身份验证方法。如果通过连续输入无效的 PIN 使 PIN 失效,恢复的唯一方法是重置密钥。然而,重置密钥会删除其所有凭据,并将其与以前注册的所有服务断开连接。

fido2-tools 包含一个用于设置密钥的 FIDO2 PIN 的工具: fido2-token。使用 fido2-token -L 获取当前连接的 FIDO2 设备列表,并使用 fido2-token -C </path/to/device> 设置一个新的 PIN:

[…]$ fido2-token -L
/dev/hidraw1: vendor=0x1050, product=0x0407 (Yubico YubiKey OTP+FIDO+CCID)
[…]$ fido2-token -C /dev/hidraw1
Enter current PIN for /dev/hidraw1:
Enter new PIN for /dev/hidraw1:

将安全密钥注册到本地账户

使用工具 pamu2fcfg 检索一个配置行,该行将放入 ~/.config/Yubico/u2f_keys 中。pam_u2f 是由 Yubico 提供的通用 U2F 密钥模块,因此使用 Yubico 特定的默认配置路径。该文件中的每个配置行由用户名和密钥特定的凭据/配置部分以冒号分隔。确保每个用户仅使用一行。

fedora-user:owBYtPIH2yzjlSQaRrVcxB...Pg==,es256,+presence+pin[:该用户另外的密钥]

如果密钥受 PIN 保护,你将被要求输入 PIN 来进行此操作。对于第一个密钥的初始注册,请使用以下命令:

[…]$ mkdir -p ~/.config/Yubico
[…]$ pamu2fcfg --pin-verification > ~/.config/Yubico/u2f_keys

要将另一个密钥(例如备份密钥)添加到此单用户配置中,请使用以下命令:

[…]$ pamu2fcfg --nouser --pin-verification >> ~/.config/Yubico/u2f_keys

pam_u2f 还支持使用一个中心身份验证文件。在这种情况下,请确保每个用户使用一行,并将给定用户的所有密钥保持在同一行上。如果两行引用相同的用户名,那么只有最后一行将被使用!请参阅 pam\_u2f 手册页 获取所有可用选项的详细信息。

使用 authselect 配置 PAM

authselect 是一个用于控制系统 PAM 配置的工具。它引入了配置文件作为额外的抽象层。一个 authselect 配置文件可以更改多个 PAM 配置文件。配置文件具有控制附加功能和行为的参数,例如启用 FIDO U2F 安全密钥。有关 authselect 的详细介绍计划在未来的文章中进行。

显示当前活动的 authselect 配置文件。如果选择了 SSSD(系统安全服务守护程序)配置文件并启用了 U2F 支持,则输出可能类似于以下内容:

[…]$ authselect current
Profile ID: sssd
Enabled features:
- with-pam-u2f

使用 authselectwith-pam-u2f 标志,在 PAM 中激活 FIDO U2F 支持:

[…]$ sudo authselect select sssd with-pam-u2f

如果你还想使用指纹读取器,必须同时启用这两个功能:

[…]$ sudo authselect select sssd with-pam-u2f with-fingerprint

这会在 PAM 中激活具有 pam_u2f 和指纹读取器支持的 SSSD 配置文件。例如,当使用上述 authselect 配置文件在终端上使用 sudo 时,首先会要求你提供指纹,如果指纹识别失败,则使用 U2F 密钥。然而,GDM 将首先使用 U2F 密钥。

解锁 GNOME 钥匙环守护程序

当使用生物识别、U2F 密钥或任何其他不需要密码短语登录 GNOME 的方法时,无法自动解锁“登录”钥匙环。这是因为,默认情况下,钥匙环的密码短语设置为与你的登录密码短语相同。通常,PAM 将你的登录密码短语传递给钥匙环守护程序。由于你在通过生物识别或 U2F 密钥进行身份验证时不需要输入密码短语,因此 PAM 没有密码短语可以传递给钥匙环守护程序。这个问题没有简单直接的解决方法。

如果你为家目录使用 LUKS 加密并且操作的是单用户系统,你可以从钥匙环中移除密码短语。这将使你的 GNOME 钥匙环在文件级别上保持未加密。但它仍然在块级别上由 LUKS 加密,因为 LUKS 加密与单用户系统上的默认基于文件的钥匙环加密等效。由于钥匙环的加密仅旨在保护其内容免受离线访问,钥匙环在登录后将被解密/解锁,任何运行时应用程序或恶意软件在解锁后都有可能访问钥匙环的内容。由于 LUKS 也是一种离线保护机制,因此可以认为它是钥匙环正常基于文件的加密的替代选择。

如果你的系统被多个用户使用,则 LUKS 加密和钥匙环的正常基于文件的加密不是等效的。在具有只由 LUKS 保护的钥匙环的多用户系统中,具有解密磁盘和引导系统授权的任何用户都能够访问同一系统上的任何其他用户的钥匙环。

移除 GNOME “登录”钥匙环密码短语非常简单。只需设置一个新的空密码,钥匙环将被解锁,并且其内容将以未加密的方式存储在文件级别上。可以使用图形实用程序 Seahorse(也称为“密码和密钥”)来在 GNOME “登录”钥匙环上设置一个空密码。

警惕和其他用例

即将发布的文章将探讨如何使用 U2F Dracut 插件使用 FIDO2/U2F 密钥解锁 LUKS 加密的磁盘。

OpenSSH 8.2+ 支持使用 ed25519-sk 安全密钥。这个主题已经在之前的文章《如何在 Fedora Linux 上使用 YubiKey》中涉及到。

需要注意的是,FIDO2/U2F 是一种认证标准。还有其他用于安全令牌的用例(主要由 Yubico 建立),例如 (T)OTP、PIV(用于 x509 密钥管理)或 OpenPGP,这些用例不是一般性的,而是具体硬件上的用例。

(题图:MJ/4bd195dc-130b-4ef2-af6c-9a6ef5d54223)


via: https://fedoramagazine.org/use-fido-u2f-security-keys-with-fedora-linux/

作者:Alexander Wellbrock 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我经常写关于我发现难以学习的技术的文章。不久前,我的朋友 Sumana 向我提出了一个有趣的问题 - 为什么这些东西学起来那么难?为什么它们看起来如此神秘?

以 DNS 为例。我们从 80 年代 开始使用 DNS(已经超过 35 年了!)。它在互联网上的每个网站中都使用。而且它相当稳定 - 在很多方面,它的工作方式与 30 年前完全相同。

但是我花了好几年的时间才弄清楚如何自信地调试 DNS 问题,我也见过很多其他程序员在调试 DNS 问题上苦苦挣扎。那么到底发生了什么呢?

以下是关于为什么学习排除 DNS 问题很困难的几点思考。

(我不会在这篇文章中详细解释 DNS,更多关于 DNS 如何工作的信息,请参阅 《用一个周末实现一个 DNS》 或 我的 DNS 方面的博文

并不是因为 DNS 非常难

当我最终学会如何排除 DNS 问题时,我的反应是“什么,就这样吗???这并不难!”我感觉有点被骗了!我可以在 几个小时 内向你解释关于 DNS 令我感到困惑的一切事情。

那么 - 如果 DNS 并不是那么复杂,为什么我花了这么多年的时间才弄清楚如何排除相当基本的 DNS 问题(比如“即使我已经正确设置了,我的域名仍无法解析”或者“dig 命令和我的浏览器的 DNS 结果不一致,为什么?”)?

而且,在发现 DNS 学习困难方面,我并不孤单!我与许多经验丰富的程序员朋友讨论过多年来的 DNS 问题,其中很多人要么:

  • 不敢轻易对其网站进行简单的 DNS 更改
  • 或对 DNS 工作原理的基本事实感到困惑(比如记录是 拉取的而非推送的
  • 或对 DNS 基础知识了解得很好,但却和我一样存在一些知识盲点(负缓存和 dig 命令及浏览器如何以不同方式进行 DNS 查询的细节)

因此,如果我们都面临着 DNS 的相同困扰,到底发生了什么?为什么对许多人来说学习 DNS 如此困难?

以下是我的一些看法。

很多系统是隐藏的

当你在计算机上发起 DNS 请求时,基本的过程如下:

  1. 你的计算机向一个名为“解析器”的服务器发起请求。
  2. 解析器检查其缓存,并向一些称为“权威名称服务器”的其它服务器发起请求。

以下是你看不到的一些内容:

  • 解析器的缓存。里面有什么内容?
  • 在你的计算机上进行 DNS 请求的库代码是哪个(是否是 libc 的 getaddrinfo 函数?如果是,它是来自 glibc、musl 还是苹果?是你的浏览器的 DNS 代码吗?还是其他自定义的 DNS 实现?)所有这些选项的行为略有不同,并且有不同的配置、缓存方法、可用功能等等。例如,musl DNS 直到 2023 年初 才支持 TCP。
  • 解析器与权威名称服务器之间的对话。如果你能够神奇地获得一个准确记录你的请求期间向下游查询的每个权威名称服务器以及它们的响应的追踪,我认为很多 DNS 问题将变得非常简单。(比如,如果你能运行 dig +debug google.com 并获得一些额外的调试信息会怎么样?)

如何和隐藏系统打交道

以下是几个处理隐藏系统的方法:

  • 向人们传授隐藏系统的知识会产生重大影响。很长一段时间里,我不知道我的计算机有多个不同的 DNS 库,它们在不同情况下使用,我对此感到困惑了好几年。这是我的重要排错方法。
  • 通过 Mess With DNS,我们尝试了一种“鱼缸”的方法,展示了通常隐藏的系统(与解析器和权威名称服务器的对话)的一些部分。
  • 我觉得将 DNS 扩展以包括一个“调试信息”部分会非常酷。(注:似乎这已经有了!它被称为“扩展 DNS 错误”,即 EDE,各种工具正在逐渐添加对它的支持。)

扩展 DNS 错误看起来不错

扩展 DNS 错误是 DNS 服务器提供额外调试信息的一种新方式。以下是一个示例:

$ dig @8.8.8.8 xjwudh.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39830
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
; EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)
;; QUESTION SECTION:
;xjwudh.com.            IN    A

;; AUTHORITY SECTION:
com.            900    IN    SOA    a.gtld-servers.net. nstld.verisign-grs.com. 1690634120 1800 900 604800 86400

;; Query time: 92 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Jul 29 08:35:45 EDT 2023
;; MSG SIZE  rcvd: 161

这里我请求了一个不存在的域名,并收到了扩展错误信息 EDE: 12 (NSEC Missing): (Invalid denial of existence of xjwudh.com/a)。我不太确定这是什么意思(它与 DNSSEC 有关),但能看到这样额外的调试信息真的很酷。

为了能看到上述内容,我确实需要安装更新版本的 dig

令人困惑的工具

尽管很多 DNS 的细节被隐藏起来,但你可以通过使用 dig 工具来找出发生了什么事情。

例如,你可以使用 dig +norecurse 来确定给定的 DNS 解析器是否在其缓存中具有特定的记录。如果响应没有被缓存,8.8.8.8 看起来会返回 SERVFAIL 响应。

以下是对 google.com 进行该操作的示例:

$ dig +norecurse  @8.8.8.8 google.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11653
;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
google.com.     21  IN  A   172.217.4.206

;; Query time: 57 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:50:45 EDT 2023
;; MSG SIZE  rcvd: 55

这是对 homestarrunner.com 的示例:

$ dig +norecurse  @8.8.8.8 homestarrunner.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 55777
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

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

;; Query time: 52 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 28 10:51:01 EDT 2023
;; MSG SIZE  rcvd: 47

在这里,你可以看到我们对于 google.com 得到了一个正常的 NOERROR 响应(8.8.8.8 的缓存中有该记录),但对于 homestarrunner.com 得到了 SERVFAIL 响应(没有缓存)。这并不意味着 homestarrunner.com 没有 DNS 记录(实际上有!),它只是没有被缓存。

但如果你不熟悉这样的输出,它确实很难阅读!以下是我认为其中一些奇怪的地方:

  1. 标题很奇怪(有 ->>HEADER<<-flags:OPT PSEUDOSECTION:QUESTION SECTION:ANSWER SECTION:)。
  2. 空格排版很奇怪(OPT PSEUDOSECTIONQUESTION SECTION 之间为什么没有换行符?)。
  3. MSG SIZE rcvd: 47 很奇怪(MSG SIZE 中是否还有其他字段,而不仅仅是 rcvd?它们是什么?)。
  4. 它说有 1 个记录在 ADDITIONAL 部分,但没有显示它,你必须以某种方式神奇地知道OPT PSEUDOSECTION 记录实际上在 ADDITIONAL 部分。

总的来说,dig 的输出给人的感觉是一个以临时方式编写并随着时间的推移逐渐发展起来的脚本,而不是经过有意设计的东西。

处理令人困惑的工具的一些想法:

  • 解释输出结果。例如,我写了一篇 如何使用 dig 的文章,解释了 dig 的输出结果以及如何配置它以默认给出更简短的输出。
  • 创建新的、更友好的工具。例如,在 DNS 方面,有 dogdoggo我的 DNS 查询工具。我认为这些工具非常酷,但我个人不使用它们,因为有时我想做一些稍微高级一点的操作(比如使用 +norecurse),据我所知,无论是 dog 还是 doggo 都不支持 +norecurse。我更愿意使用一个工具来完成所有任务,所以我坚持使用 dig。要替换 dig,其功能广度是一项庞大的工作。
  • 使 dig 的输出更加友好。如果我在 C 编程方面更好一些,我可能会尝试编写一个 dig 的拉取请求,添加一个 +human 标志以以更结构化和易读的方式格式化长格式的输出,可能类似于以下形式:
$ dig +human +norecurse  @8.8.8.8 google.com 
HEADER:
  opcode: QUERY
  status: NOERROR
  id: 11653
  flags: qr ra
  records: QUESTION: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

QUESTION SECTION:
  google.com.            IN    A

ANSWER SECTION:
  google.com.        21    IN    A    172.217.4.206
  
ADDITIONAL SECTION:
  EDNS: version: 0, flags:; udp: 512

EXTRA INFO:
  Time: Fri Jul 28 10:51:01 EDT 2023
  Elapsed: 52 msec
  Server: 8.8.8.8:53
  Protocol: UDP
  Response size: 47 bytes

这样可以更清晰地呈现 DNS 响应的结构-包括标题、问题、答案和附加部分。

而且它并不是“简化”了什么!它是完全相同的信息,只是以更结构化的方式进行了格式化。我对替代的 DNS 工具最大的不满是它们经常为了清晰起见而删除信息。虽然这些工具肯定有其用武之地,但我想要看到所有的信息!我只是希望它能够以清晰明了的方式呈现。

在过去的 40 年中,我们已经学到了很多关于如何设计更用户友好的命令行工具的知识,我认为将其中一些知识应用到我们那些有些陈旧的工具中将会很棒。

dig +yaml

关于 dig 的一个简单备注:较新版本的 dig 支持 +yaml 输出格式,对我来说更加清晰,但有些冗长(一个相当简单的 DNS 响应都无法在屏幕上完整显示)。

一些奇怪的陷阱

DNS 存在一些相对常见但很难通过自学了解到的奇怪问题。以下是一些例子(有更多可在 导致 DNS 中断的一些方式 中找到):

  • 负缓存:我在 这篇演讲 中提到过,我大约花了 5 年时间才意识到不应该访问没有 DNS 记录的域名,因为该记录的 不存在 信息将被缓存,并且该缓存在几个小时内不会被更新,这真的很烦人。
  • getaddrinfo 实现的差异:直到 2023 年初musl 不支持 TCP DNS。
  • 忽略 TTL 的解析器:如果你在 DNS 记录上设置了 TTL(比如“5 分钟”),一些解析器完全会忽略这些 TTL 设置,并将记录缓存更长时间,比如可能是 24 小时。
  • 如果你错误地配置了 Nginx(像这样),它将永久缓存 DNS 记录。
  • ndots 如何导致 Kubernetes DNS 缓慢。

如何应对奇怪的陷阱

对此,我没有像我希望的那样完美的答案。对奇怪陷阱的了解非常难以获得(再次强调,我花了多年的时间才弄清楚负缓存!),对我而言,人们不得不一次又一次地自己重新发现它们感觉很愚蠢。

以下是一些想法:

  • 当有人在解释一个主题时提到了一些棘手的问题,这是非常有帮助的。例如(离开 DNS 一下),Josh Comeau 的 Flexbox 入门解释了这个 最小尺寸的陷阱,在找到解释之前,我多年来遇到过很多次这个问题。
  • 我希望看到更多的社区整理的常见陷阱。比如说,对于 Bash,shellcheck 是一个非常不错的常见陷阱集合。

关于记录 DNS 陷阱的一个棘手问题是,不同的人会遇到不同的陷阱。如果你只是每三年为个人域名配置一次 DNS,你可能会遇到不同的问题,而那些管理高流量域名的人则可能会遇到其他问题。

还有一些更简单的原因:

不经常接触

很多人非常少接触 DNS。如果你只在每三年才处理一次 DNS,学习起来就会更加困难!

我认为备忘单(比如“这是更改你的名称服务器的步骤”)可以在这方面起到很大的帮助。

难以进行实验

DNS 在进行实验时可能会让人感到害怕,因为你不想搞砸自己的域名。我们建立了 Mess With DNS 来使这个过程变得更容易一些。

目前就这些

我很想听听其他关于什么让 DNS(或你最喜欢的神秘技术)难以学习的想法。

(题图:MJ/96c5d8fb-f4a5-4710-8f91-c71617120675)


via: https://jvns.ca/blog/2023/07/28/why-is-dns-still-hard-to-learn/

作者:Julia Evans 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出