分类 技术 下的文章

如果你一直在使用 Arch Linux 或其他基于 Arch 的发行版,如 Manjaro,那么可能会遇到 AUR。你尝试安装新软件,有人建议从 AUR 中安装它。这让你感到困惑。

什么是 AUR?为什么使用它?如何使用 AUR?我将在本文中回答这些问题。

什么是 AUR?

AUR 表示 Arch 用户仓库 Arch User Repository 。它是针对基于 Arch 的 Linux 发行版用户的社区驱动的仓库。它包含名为 PKGBUILD 的包描述,它可让你使用 makepkg 从源代码编译软件包,然后通过 pacman(Arch Linux 中的软件包管理器)安装。

创建 AUR 的目的是组织和共享社区中的新软件包,并帮助加速将流行的软件包纳入社区仓库

进入官方仓库的大量新软件包都从 AUR 开始。在 AUR 中,用户可以贡献自己的软件包构建(PKGBUILD 和相关文件)。

AUR 社区可以对 AUR 中的软件包进行投票。如果一个软件包变得足够流行(假设它具有兼容的许可证和良好的打包技术),那么可以将其加入 pacman 直接访问的社区仓库中。

简而言之,AUR 是开发人员在 Arch 仓库中正式包含新软件之前向 Arch Linux 用户提供新软件的一种方式。

你应该使用 AUR 吗?有什么风险?

使用 AUR 就像过马路一样。如果你谨慎操作,应该就没问题。

如果你刚接触 Linux,建议你在建立有关 Arch/Manjaro 和 Linux 的基础知识之前不要使用 AUR。

的确,任何人都可以将软件包上传到 AUR,但受信任用户(TU)负责监视上传的内容。尽管 TU 对上传的软件包执行质量控制,但不能保证 AUR 中的软件包格式正确或没有恶意。

在实践中,AUR 似乎很安全,但理论上讲它可以造成一定程度的损害,但前提是你不小心。从 AUR 构建软件包时,聪明的 Arch 用户总是检查 PKGBUILD*.install 文件。

此外,TU(受信任用户)还会删除 AUR 中包含在 core/extra/community 中的软件包,因此它们之间不应存在命名冲突。AUR 通常会包含软件包的开发版本(cvs/svn/git 等),但它们的名称会被修改,例如 foo-git。

对于 AUR 软件包,pacman 会处理依赖关系并检测文件冲突,因此,除非你默认使用 –force 选项,否则你不必担心用另一个包中的文件会覆盖另一个包的文件。如果这么做了,你可能会遇到比文件冲突更严重的问题。

如何使用 AUR?

使用 AUR 的最简单方法是通过 AUR 助手。 AUR 助手 是一个命令行工具(有些还有 GUI),可让你搜索在 AUR 上发布的软件包并安装。

在 Arch Linux 上安装 AUR 助手

假设你要使用 Yay AUR 助手。确保在 Linux 上安装了 git。然后克隆仓库,进入目录并构建软件包。

依次使用以下命令:

sudo pacman -S git
sudo git clone https://aur.archlinux.org/yay-git.git
cd yay
makepkg -si

安装后,你可以使用 yay 命令来安装软件包:

yay -S package_name

并非必须使用 AUR 助手来从 AUR 安装软件包。从以下文章解如何在没有 AUR 助手的情况下使用 AUR。

不使用 AUR 助手安装 AUR 软件包

如果你不想使用 AUR 助手,那么也可以自行从 AUR 安装软件包。

AUR 页面上找到要安装的软件包后,建议确认“许可证”、“流行程度”、“最新更新”、“依赖项”等,作为额外的质量控制步骤。

git clone [package URL]
cd [package name]
makepkg -si

例如。假设你要安装 telegram 桌面包

git clone https://aur.archlinux.org/telegram-desktop-git.git
cd telegram-desktop-git
makepkg -si

在 Manjaro Linux 中启用 AUR 支持

它默认情况下未启用 AUR,你必须通过 pamac 启用它。我的笔记本电脑运行 Manjaro Cinnamon,但是所有 Manjaro 变种的步骤都相同。

打开 Pamac(显示为 “Add/Remove Software”):

进入 Pamac 后,请进入如下所示的 首选项 preferences

在首选项对话框中,进入 “AUR” 选项卡,启用 AUR 支持,启用检查更新,并关闭对话框。

现在,你可以搜索软件包,并且可以通过软件包描述下的标签来识别属于 AUR 的软件包。

希望本文对你有用,并关注社交媒体上即将出现的与 Arch 相关的主题。


via: https://itsfoss.com/aur-arch-linux/

作者:Dimitrios Savvopoulos 选题:lujun9972 译者:geekpi 校对:wxy

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

如何在树莓派上使用 k3s 和 Let's Encrypt 来加密你的网站。

上一篇文章中,我们在 k3s 集群上部署了几个简单的网站。那些是未加密的网站。不错,它们可以工作,但是未加密的网站有点太过时了!如今,大多数网站都是加密的。在本文中,我们将安装 cert-manager 并将其用于在集群上以部署采用 TLS 加密的网站。这些网站不仅会被加密,而且还会使用有效的公共证书,这些证书会从 Let's Encrypt 自动获取和更新!让我们开始吧!

准备

要继续阅读本文,你将需要我们在上一篇文章中构建的 k3s 树莓派集群。另外,你需要拥有一个公用静态 IP 地址,并有一个可以为其创建 DNS 记录的域名。如果你有一个动态 DNS 提供程序为你提供域名,可能也行。但是,在本文中,我们使用静态 IP 和 CloudFlare 来手动创建 DNS 的 A 记录。

我们在本文中创建配置文件时,如果你不想键入它们,则可以在此处进行下载。

我们为什么使用 cert-manager?

Traefik(在 k3s 预先捆绑了)实际上具有内置的 Let's Encrypt 支持,因此你可能想知道为什么我们要安装第三方软件包来做同样的事情。在撰写本文时,Traefik 中的 Let's Encrypt 支持检索证书并将其存储在文件中。而 cert-manager 会检索证书并将其存储在 Kubernetes 的 “ 机密信息 secret ” 中。我认为,“机密信息”可以简单地按名称引用,因此更易于使用。这就是我们在本文中使用 cert-manager 的主要原因。

安装 cert-manager

通常,我们只是遵循 cert-manager 的文档在 Kubernetes 上进行安装。但是,由于我们使用的是 ARM 体系结构,因此我们需要进行一些更改,以便我们可以完成这个操作。

第一步是创建 cert-manager 命名空间。命名空间有助于将 cert-manager 的 Pod 排除在我们的默认命名空间之外,因此当我们使用自己的 Pod 执行 kubectl get pods 之类的操作时,我们不必看到它们。创建名称空间很简单:

kubectl create namespace cert-manager

安装说明会让你下载 cert-manager 的 YAML 配置文件并将其一步全部应用到你的集群。我们需要将其分为两个步骤,以便为基于 ARM 的树莓派修改文件。我们将下载文件并一步一步进行转换:

curl -sL \
https://github.com/jetstack/cert-manager/releases/download/v0.11.0/cert-manager.yaml |\
sed -r 's/(image:.*):(v.*)$/\1-arm:\2/g' > cert-manager-arm.yaml

这会下载配置文件,并将包含的所有 docker 镜像更新为 ARM 版本。来检查一下它做了什么:

$ grep image: cert-manager-arm.yaml
          image: "quay.io/jetstack/cert-manager-cainjector-arm:v0.11.0"
          image: "quay.io/jetstack/cert-manager-controller-arm:v0.11.0"
          image: "quay.io/jetstack/cert-manager-webhook-arm:v0.11.0"

如我们所见,三个镜像现在在镜像名称上添加了 -arm。现在我们有了正确的文件,我们只需将其应用于集群:

kubectl apply -f cert-manager-arm.yaml

这将安装 cert-manager 的全部。我们可以通过 kubectl --namespace cert-manager get pods 来检查安装何时完成,直到所有 Pod 都处于 Running 状态。

这就完成了 cert-manager 的安装!

Let's Encrypt 概述

Let's Encrypt 的好处是,它免费为我们提供了经过公共验证的 TLS 证书!这意味着我们可以拥有一个完全有效的、可供任何人访问的 TLS 加密网站,这些家庭或业余的爱好活动挣不到钱,也无需自己掏腰包购买 TLS 证书!以及,当通过 cert-manager 使用 Let's Encrypt 的证书时,获得证书的整个过程是自动化的,证书的续订也是自动的!

但它是如何工作的?下面是该过程的简化说明。我们(或代表我们的 cert-manager)向 Let's Encrypt 发出我们拥有的域名的证书请求。Let's Encrypt 通过使用 ACME DNS 或 HTTP 验证机制来验证我们是否拥有该域。如果验证成功,则 Let's Encrypt 将向我们提供证书,这些证书将由 cert-manager 安装在我们的网站(或其他 TLS 加密的端点)中。在需要重复此过程之前,这些证书可以使用 90 天。但是,cert-manager 会自动为我们更新证书。

在本文中,我们将使用 HTTP 验证方法,因为它更易于设置并且适用于大多数情况。以下是幕后发生的基本过程。cert-manager 向 Let's Encrypt 发出证书请求。作为回应,Let's Encrypt 发出所有权验证的 质询 challenges 。这个质询是将一个 HTTP 资源放在请求证书的域名下的一个特定 URL 上。从理论上讲,如果我们可以将该资源放在该 URL 上,并且让 Let's Encrypt 可以远程获取它,那么我们实际上必须是该域的所有者。否则,要么我们无法将资源放置在正确的位置,要么我们无法操纵 DNS 以使 Let's Encrypt 访问它。在这种情况下,cert-manager 会将资源放在正确的位置,并自动创建一个临时的 Ingress 记录,以将流量路由到正确的位置。如果 Let's Encrypt 可以读到该质询要求的资源并正确无误,它将把证书发回给 cert-manager。cert-manager 将证书存储为“机密信息”,然后我们的网站(或其他任何网站)将使用这些证书通过 TLS 保护我们的流量。

为该质询设置网络

我假设你要在家庭网络上进行设置,并拥有一个以某种方式连接到更广泛的互联网的路由器/接入点。如果不是这种情况,则可能不需要以下过程。

为了使质询过程正常运行,我们需要一个我们要申请证书的域名,以将其路由到端口 80 上的 k3s 集群。为此,我们需要告诉世界上的 DNS 系统它的位置。因此,我们需要将域名映射到我们的公共 IP 地址。如果你不知道你的公共 IP 地址是什么,可以访问 WhatsMyIP 之类的地方,它会告诉你。接下来,我们需要输入 DNS 的 A 记录,该记录将我们的域名映射到我们的公共 IP 地址。为了使此功能可靠地工作,你需要一个静态的公共 IP 地址,或者你可以使用动态 DNS 提供商。一些动态 DNS 提供商会向你颁发一个域名,你可以按照以下说明使用它。我没有尝试过,所以不能肯定地说它适用于所有提供商。

对于本文,我们假设有一个静态公共 IP,并使用 CloudFlare 来设置 DNS 的 A 记录。如果愿意,可以使用自己的 DNS 服务器。重要的是你可以设置 A 记录。

在本文的其余部分中,我将使用 k3s.carpie.net 作为示例域名,因为这是我拥有的域。你显然会用自己拥有的任何域名替换它。

为示例起见,假设我们的公共 IP 地址是 198.51.100.42。我们转到我们的 DNS 提供商的 DNS 记录部分,并添加一个名为 k3s.carpie.net 的类型为 A 的记录(CloudFlare 已经假定了域的部分,因此我们只需输入 k3s),然后输入 198.51.100.42 作为 IPv4 地址。

请注意,有时 DNS 更新要传播一段时间。你可能需要几个小时才能解析该名称。在继续之前该名称必须可以解析。否则,我们所有的证书请求都将失败。

我们可以使用 dig 命令检查名称是否解析:

$ dig +short k3s.carpie.net
198.51.100.42

继续运行以上命令,直到可以返回 IP 才行。关于 CloudFlare 有个小注释:ClouldFlare 提供了通过代理流量来隐藏你的实际 IP 的服务。在这种情况下,我们取回的是 CloudFlare 的 IP,而不是我们的 IP。但对于我们的目的,这应该可以正常工作。

网络配置的最后一步是配置路由器,以将端口 80 和 443 上的传入流量路由到我们的 k3s 集群。可悲的是,路由器配置页面的差异很大,因此我无法确切地说明你的外观是什么样子。大多数时候,我们需要的管理页面位于“端口转发”或类似内容下。我甚至看到过它列在“游戏”之下(显然是端口转发主要用于的游戏)!让我们看看我的路由器的配置如何。

如果你和我的环境一样,则转到 192.168.0.1 登录到路由器管理应用程序。对于此路由器,它位于 “ NAT/QoS” -> “端口转发”。在这里,我们将端口 80/TCP 协议设置为转发到 192.168.0.50(主节点 kmaster 的 IP)的端口 80。我们还设置端口 443 也映射到 kmaster。从技术上讲,这对于质询来说并不是必需的,但是在本文的结尾,我们将部署一个启用 TLS 的网站,并且需要映射 443 来进行访问。因此,现在进行映射很方便。我们保存并应用更改,应该一切顺利!

配置 cert-manager 来使用 Let's Encrypt(暂存环境)

现在,我们需要配置 cert-manager 来通过 Let's Encrypt 颁发证书。Let's Encrypt 为我们提供了一个暂存(例如用于测试)环境,以便审视我们的配置。这样它更能容忍错误和请求的频率。如果我们对生产环境做了错误的操作,我们很快就会发现自己被暂时禁止访问了!因此,我们将使用暂存环境手动测试请求。

创建一个文件 letsencrypt-issuer-staging.yaml,内容如下:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # The ACME server URL
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: <your_email>@example.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class: traefik

请确保将电子邮件地址更新为你的地址。如果出现问题或我们弄坏了一些东西,这就是 Let's Encrypt 与我们联系的方式!

现在,我们使用以下方法创建 发行者 issuer

kubectl apply -f letsencrypt-issuer-staging.yaml

我们可以使用以下方法检查发行者是否已成功创建:

kubectl get clusterissuers

clusterissuers 是由 cert-manager 创建的一种新的 Kubernetes 资源类型。

现在让我们手动请求一个测试证书。对于我们的网站,我们不需要这样做;我们只是在测试这个过程,以确保我们的配置正确。

创建一个包含以下内容的证书请求文件 le-test-certificate.yaml

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: k3s-carpie-net
  namespace: default
spec:
  secretName: k3s-carpie-net-tls
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer
  commonName: k3s.carpie.net
  dnsNames:
  - k3s.carpie.net

该记录仅表示我们要使用名为 letsencrypt-staging(我们在上一步中创建的)的 ClusterIssuer 来请求域 k3s.carpie.net 的证书,并在 Kubernetes 的机密信息中名为 k3s-carpie-net-tls 的文件中存储该证书。

像平常一样应用它:

kubectl apply -f le-test-certificate.yaml

我们可以通过以下方式查看状态:

kubectl get certificates

如果我们看到类似以下内容:

NAME                    READY   SECRET                  AGE
k3s-carpie-net          True    k3s-carpie-net-tls      30s

我们走在幸福之路!(这里的关键是 READY 应该是 True)。

解决证书颁发问题

上面是幸福的道路。如果 READYFalse,我们可以等等它,然后再次花点时间检查状态。如果它一直是 False,那么我们就有需要解决的问题。此时,我们可以遍历 Kubernetes 资源链,直到找到一条告诉我们问题的状态消息。

假设我们执行了上面的请求,而 READYFalse。我们可以从以下方面开始故障排除:

kubectl describe certificates k3s-carpie-net

这将返回很多信息。通常,有用的内容位于 Events: 部分,该部分通常位于底部。假设最后一个事件是 Created new CertificateRequest resource "k3s-carpie-net-1256631848。然后我们 描述 describe 一下该请求:

kubectl describe certificaterequest k3s-carpie-net-1256631848

现在比如说最后一个事件是 Waiting on certificate issuance from order default/k3s-carpie-net-1256631848-2342473830

那么,我们可以描述该顺序:

kubectl describe orders default/k3s-carpie-net-1256631848-2342473830

假设有一个事件,事件为 Created Challenge resource "k3s-carpie-net-1256631848-2342473830-1892150396" for domain "k3s.carpie.net"。让我们描述一下该质询:

kubectl describe challenges k3s-carpie-net-1256631848-2342473830-1892150396

从这里返回的最后一个事件是 Presented challenge using http-01 challenge mechanism。看起来没问题,因此我们浏览一下描述的输出,并看到一条消息 Waiting for http-01 challenge propagation: failed to perform self check GET request ... no such host。终于!我们发现了问题!在这种情况下,no such host 意味着 DNS 查找失败,因此我们需要返回并手动检查我们的 DNS 设置,正确解析域的 DNS,并进行所需的任何更改。

清理我们的测试证书

我们实际上想要使用的是域名的真实证书,所以让我们继续清理证书和我们刚刚创建的机密信息:

kubectl delete certificates k3s-carpie-net
kubectl delete secrets k3s-carpie-net-tls

配置 cert-manager 以使用 Let's Encrypt(生产环境)

现在我们已经有了测试证书,是时候移动到生产环境了。就像我们在 Let's Encrypt 暂存环境中配置 cert-manager 一样,我们现在也需要对生产环境进行同样的操作。创建一个名为 letsencrypt-issuer-production.yaml 的文件(如果需要,可以复制和修改暂存环境的文件),其内容如下:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
 # The ACME server URL
  server: https://acme-v02.api.letsencrypt.org/directory
  # Email address used for ACME registration
  email: <your_email>@example.com
  # Name of a secret used to store the ACME account private key
  privateKeySecretRef:
    name: letsencrypt-prod
  # Enable the HTTP-01 challenge provider
  solvers:
  - http01:
      ingress:
        class: traefik

(如果要从暂存环境进行复制,则唯一的更改是 server: URL。也请不要忘记修改电子邮件!)

应用它:

kubectl apply -f letsencrypt-issuer-production.yaml

申请我们网站的证书

重要的是需要注意,我们到目前为止完成的所有步骤都只需要进行一次!而对于将来的任何其他申请,我们可以从这个说明开始!

让我们部署在上一篇文章中部署的同样站点。(如果仍然可用,则可以修改 YAML 文件。如果没有,则可能需要重新创建并重新部署它)。

我们只需要将 mysite.yamlIngress 部分修改为:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mysite-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "traefik"
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
  - host: k3s.carpie.net
    http:
      paths:
      - path: /
        backend:
          serviceName: mysite-nginx-service
          servicePort: 80
  tls:
  - hosts:
    - k3s.carpie.net
    secretName: k3s-carpie-net-tls

请注意,上面仅显示了 mysite.yamlIngress 部分。所做的更改是添加了注解 cert-manager.io/cluster-issuer: letsencrypt-prod。这告诉 traefik 创建证书时使用哪个发行者。 其他唯一增加的是 tls: 块。这告诉 traefik 我们希望在主机 k3s.carpie.net 上具有 TLS 功能,并且我们希望 TLS 证书文件存储在机密信息 k3s-carpie-net-tls 中。

请记住,我们没有创建这些证书!(好吧,我们创建了名称相似的测试证书,但我们删除了这些证书。)Traefik 将读取这些配置并继续寻找机密信息。当找不到时,它会看到注释说我们想使用 letsencrypt-prod 发行者来获取它。由此,它将提出请求并为我们安装证书到机密信息之中!

大功告成! 让我们尝试一下。

它现在具有了加密 TLS 所有优点!恭喜你!


via: https://opensource.com/article/20/3/ssl-letsencrypt-k3s

作者:Lee Carpenter 选题:lujun9972 译者:wxy 校对:wxy

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

网络防火墙,顾名思义:为了阻止不需要的网络连接而设置的防护性屏障。在与外界建立连接或是提供网络服务时常常会用到。例如,在学校或是咖啡厅里使用笔记本电脑时,你一定不想某个陌生人窥探你的电脑。

每个 Fedora 系统都内置了一款防火墙。这是 Linux 内核网络功能的一部分。本文介绍如何通过 firewall-cmd 命令修改防火墙的配置。

网络基础

本文并不教授计算机网络的所有知识,但还是会简单介绍一些网络基础。

网络中的所有计算机都有一个 IP 地址,可以把它想象成一个邮箱地址,有了邮箱地址,邮件才知道发往何处。每台计算机还会拥有一组端口,端口号范围从 0 到 65535。同样的,你可以把这些端口想象成用来连接邮箱地址的连接点。

通常情况下,端口会是一个标准端口号或是根据应用程序的应答要求选定的一个端口范围。例如,一台 Web 服务器通常会保留 80 端口用于 HTTP 通信,443 端口用于 HTTPS。小于 1024 的端口主要用于系统或常见用途,1024-49151 端口是已经注册的,49152 及以上端口多为临时使用(只限短时间使用)。

互联网传输中最常见的两个协议,TCPUDP。当要传输的数据很重要,不能有丢包时,就使用 TCP 协议,如果数据包没有按顺序到达,还需要重组为正确的顺序。UDP 协议则更多用于对时间敏感的服务,为了保证时效性,有时允许丢失部分数据。

系统中运行的应用,例如 Web 服务器,会保留一些端口(例如上文提到的 80 和 443)。在网络传输过程中,主机会为传输的两端建立一个链接,一端是源地址和源端口,另一端是目的地址和目的端口。

网络防火墙就是基于地址、端口及其他标准的一组规则集,来对网络数据的传输进行屏蔽或阻断的。通过 firewall-cmd 命令,我们就可以查看或修改防火墙的工作配置。

防火墙域(zone)

为了验证防火墙是否开启,使用 firewall-cmd 命令,输入时要加上 sudo。(通常,在运行了 PolicyKit 的环境中,你也可以不加 sudo

$ sudo firewall-cmd --state
running

firewalld 服务支持任意数量的域。每个域都可以拥有独立的配置和防护规则。一台 Fedora 工作站的外部接口(例如 WIFI 或有线网卡)其默认域为 FedoraWorkstation

要看有哪些域是激活状态,可以使用 -–get-active-zones 选项。在本示例中,有两个网卡,有线以太网卡 wlp2s0 和虚拟(libvirt)桥接网卡 virbr0

$ sudo firewall-cmd --get-active-zones
FedoraWorkstation
  interfaces: wlp2s0
libvirt
  interfaces: virbr0

如果想看看默认域是什么,或是直接查询所有域:

$ sudo firewall-cmd --get-default-zone
FedoraWorkstation
$ sudo firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal libvirt public trusted work

查询默认域中防火墙放行了哪些系统,使用 -–list-services 选项。下例给出了一个定制系统的查询结果,你可以看到与常见的结果有些不同。

$ sudo firewall-cmd --list-services
dhcpv6-client mdns samba-client ssh

该系统对外开启了四个服务。每个服务都对应一个常见端口。例如 ssh 服务对应 22 端口。

如果要查看当前域中防火墙还开启了哪些端口,可以使用 --list-ports 选项。当然,你也可以随时对其他域进行查询:

$ sudo firewall-cmd --list-ports --zone=FedoraWorkstation
1025-65535/udp 1025-65535/tcp

结果表明,从 1025 到 65535 端口(包含 UDP 和 TCP)默认都是开启的。

修改域、端口及服务

以上的配置都是预先设计好的防火墙策略。是为了确保新手用户安装的应用都能够正常访问网络。如果你确定自己心里有数,想要一个保护性更强的策略,可以将接口放入 FedoraServer 域,明确禁止所有端口的访问。(警告:如果你的服务器之前是联网状态,这么做可能会导致连接中断,那你就得到机房里去修改更多的配置项!)

$ sudo firewall-cmd --change-interface=<ifname> --zone=FedoraServer
success

本文并不讨论如何制定防火墙策略,Fedora 社区里已经有很多讨论了。你大可以按照自身需要来修改配置。

如果你想要开放某个服务的常见端口,可以将该服务加入默认域(或使用 --zone 指定一个不同的域)。还可以一次性将其加入多个域。下例开放了 HTTP 和 HTTPS 的常见端口 80、443:

$ sudo firewall-cmd --add-service=http --add-service=https
success

并非所有的服务都有默认端口,不过大部分都是有的。使用 -–get-services 选项可以查看完整列表。

如果你想指定某个特定端口号,可以直接用数字和协议进行配置。(多数情况下,-–add-service-–add-port 这两个选项是合在一起使用的)下例开启的是 UDP 协议的网络启动服务:

$ sudo firewall-cmd --add-port=67/udp
success

重要:如果想要在系统重启或是 firewalld 服务重启后,配置仍然生效,必须在命令中加上 -–permanent 选项。本文中的例子只是临时修改了配置,下次遇到系统重启或是 firewalld 服务重启,这些配置就失效了。

以上只是 firewall-cmd 和 firewalld 服务诸多功能中的一小部分。firewalld 项目的主页还有更多信息值得你去探索和尝试。


via: https://fedoramagazine.org/control-the-firewall-at-the-command-line/

作者:Paul W. Frields 选题:lujun9972 译者:tinyeyeser 校对:wxy

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

Python 是最流行、功能最强大的编程语言之一。由于它是自由开源的,因此每个人都可以使用。大多数 Fedora 系统都已安装了该语言。Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数据。CSV文件一开始往往是以表格或电子表格的形式出现。本文介绍了如何在 Python 3 中处理 CSV 数据。

CSV 数据正如其名。CSV 文件按行放置数据,数值之间用逗号分隔。每行由相同的字段定义。简短的 CSV 文件通常易于阅读和理解。但是较长的数据文件或具有更多字段的数据文件可能很难用肉眼解析,因此在这种情况下计算机做得更好。

这是一个简单的示例,其中的字段是 NameEmailCountry。在此例中,CSV 数据将字段定义作为第一行,尽管并非总是如此。

Name,Email,Country
John Q. Smith,[email protected],USA
Petr Novak,[email protected],CZ
Bernard Jones,[email protected],UK

从电子表格读取 CSV

Python 包含了一个 csv 模块,它可读取和写入 CSV 数据。大多数电子表格应用,无论是原生(例如 Excel 或 Numbers)还是基于 Web 的(例如 Google Sheet),都可以导出 CSV 数据。实际上,许多其他可发布表格报告的服务也可以导出为 CSV(例如,PayPal)。

Python csv 模块有一个名为 DictReader 的内置读取器方法,它可以将每个数据行作为有序字典 (OrderedDict) 处理。它需要一个文件对象访问 CSV 数据。因此,如果上面的文件在当前目录中为 example.csv,那么以下代码段是获取此数据的一种方法:

f = open('example.csv', 'r')
from csv import DictReader
d = DictReader(f)
data = []
for row in d:
    data.append(row)

现在,内存中的 data 对象是 OrderedDict 对象的列表:

[OrderedDict([('Name', 'John Q. Smith'),
               ('Email', '[email protected]'),
               ('Country', 'USA')]),
  OrderedDict([('Name', 'Petr Novak'),
               ('Email', '[email protected]'),
               ('Country', 'CZ')]),
  OrderedDict([('Name', 'Bernard Jones'),
               ('Email', '[email protected]'),
               ('Country', 'UK')])]

引用这些对象很容易:

>>> print(data[0]['Country'])
USA
>>> print(data[2]['Email'])
[email protected]

顺便说一句,如果你需要处理没有字段名标题行的 CSV 文件,那么 DictReader 类可以让你定义它们。在上面的示例中,添加 fieldnames 参数并传递一系列名称:

d = DictReader(f, fieldnames=['Name', 'Email', 'Country'])

真实例子

我最近想从一长串人员名单中随机选择一个中奖者。我从电子表格中提取的 CSV 数据是一个简单的名字和邮件地址列表。

幸运的是,Python 有一个有用的 random 模块,可以很好地生成随机值。该模块 Random 类中的 randrange 函数正是我需要的。你可以给它一个常规的数字范围(例如整数),以及它们之间的步长值。然后,该函数会生成一个随机结果,这意味着我可以在数据的总行数范围内获得一个随机整数(或者说是行号)。

这个小程序运行良好:

from csv import DictReader
from random import Random

d = DictReader(open('mydata.csv'))
data = []
for row in d:
    data.append(row)

r = Random()
winner = data[r.randrange(0, len(data), 1)]
print('The winner is:', winner['Name'])
print('Email address:', winner['Email'])

显然,这个例子非常简单。电子表格本身包含了复杂的分析数据的方法。但是,如果你想在电子表格应用之外做某事,Python 或许是一种技巧!

题图由 Isaac Smith 拍摄,发表于 U​​nsplash


via: https://fedoramagazine.org/using-data-from-spreadsheets-in-fedora-with-python/

作者:Paul W. Frields 选题:lujun9972 译者:geekpi 校对:wxy

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

深色模式是 Ubuntu 20.04 最受瞩目的新功能之一了。任何版本的 Ubuntu 都可以通过安装深色主题让用户界面拥有一个深色的外观,但在 Ubuntu 20.04 中,这个过程变得更简单。

在 Ubuntu 20.04 中,无需额外安装主题,默认主题(称为 Yaru)本身就带有三种模式,其中就包括深色模式。

下面我会展示如何将 Ubuntu 系统完全设置为深色模式。

在 Ubuntu 20.04 打开深色模式

这个步骤是在 GNOME 桌面上进行的,如果你使用的是其它桌面,你看到的可能会和下面的截图不一样。

按下 super 键(或 Windows 键),然后输入 “settings”,就可以找到系统设置。

Search for Settings

在系统设置中,进入“ 外观 Appearance ”部分,就可以看到 浅色 light 标准 standard 深色 dark 三个选项。既然要使用深色模式,那自然而然要选择“深色”这个选项了。

Enable Dark Theme in Ubuntu

完成设置以后,使用了 GTK3 的应用程序都可以跟随深色模式。因此你会看到系统中包括文本编辑器、终端、LibreOffice 等在内的大多数应用程序都已经切换成深色了。但未使用 GTK3 的应用程序可能并没有跟随进入深色模式,下面我会展示如何更完整地进入深色模式。

继续调整,进入完整深色模式

这个时候你会发现,shell 主题、屏幕顶部面板中的消息托盘和系统托盘还仍然保持在原有的模式当中。

No Dark Shell by default in Ubuntu

现在就需要使用 GNOME 扩展安装 Yaru 深色 shell 主题了。在 Ubuntu 中通过 Ctrl+Alt+T 打开终端,然后执行以下这个命令安装浏览器扩展:

sudo apt install chrome-gnome-shell

进入扩展页面启用这个扩展:

Enable User Themes GNOME Extension

执行以下命令安装 GNOME 调整工具

sudo apt install gnome-tweaks

打开 GNOME 调整工具,进入“ 外观 Appearance ”部分,就可以看到 shell 主题的选项,现在只需要把它启用就可以了。

Enable Yaru Dark Shell Theme in Ubuntu

设置完之后再观察一下,桌面通知、消息托盘、系统托盘等等都已经进入深色模式了。

Yaru Dark Shell Theme in Ubuntu

现在感觉好多了。但你可能还会注意到,在使用浏览器访问网站的时候,很多网站都使用了白色的背景色。如果期望网站方提供深色模式,那是很不现实的,但我们可以自己实现这一件事。

你需要用到的东西就是诸如 Dark Reader 这样的浏览器扩展。《在 Firefox 中启用深色模式》这篇文章中也有讨论过这个浏览器扩展,它的使用过程并不复杂,如果你使用的浏览器是 Firefox、Chrome 或 Ubuntu 下的 Chromium,就可以直接安装其官方网站上列出的扩展。

Dark Reader 安装完成后,就会以深色模式打开网站了。

It’s FOSS Homepage in Dark Mode with Dark Reader

当然,有些外部的第三方应用程序可能仍然是浅色状态。如果它们自己附带了深色模式的选项,就需要手动启用它们的深色模式。

如今,深色模式在非开发者人群中也越来越流行了。按照以上的步骤,你就可以轻松进入深色模式。

请享受深色模式。


via: https://itsfoss.com/dark-mode-ubuntu/

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

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

如果你用过 Ubuntu 或者其他的 Linux 发行版里的自动登录功能, 你可能遇到过这种弹出消息:

请输入密码以解锁你的登录密钥环

登录密钥环在你登录系统时未解锁。

Enter Password To Unlock Your Login Keyring Ubuntu

如果你一直点击取消,它会不断弹出几次才会消失。你可能想知道,为什么你会一直看到这个密钥环信息呢?

让我来告诉你吧。它其实不是错误,而是一个安全特性。

奇怪吗?下面就让我来解释下 Linux 里的密钥环概念。

Linux 里的密钥环是什么。为什么需要它?

在现实生活中你为什么要用钥匙环(也叫钥匙链)?你用它把一把或多把钥匙串到一起, 以便于携带和查找。

Linux 里也是类似的。密钥环特性使你的系统可以将各种密码放在一起,并将其保存在一个地方。

大多数 Linux 桌面环境,如 GNOME、KDE、Xfce 等采用 GNOME 密钥环来提供这个功能。

该密钥环保存了 ssh 密钥、GPG 密钥以及使用此功能的应用程序(例如 Chromium 浏览器)的密钥。默认情况下,“密钥环”通过主密码来保护,该密码通常是帐户的登录密码。

系统上的每个用户都有自己的密钥环,(通常)密码与用户帐户本身的密码相同。当你使用密码登录系统时,你的密匙环将使用你帐户的密码自动解锁。

当你启用 Ubuntu 中的自动登录功能时时,就有问题了。这意味着你无需输入密码即可登录系统。在这种情况下,你的密钥环不会自动解锁。

密钥环是一个安全特性

记得我说过密钥环是一个安全特性吗?现在想象一下你在 Linux 电脑上开启了自动登录功能。有权访问你电脑的任何人无需密码就能进入你的系统。但是你可能不会在意,因为你只是用它来访问互联网。

但是,如果你在 Ubuntu 中使用 Chromium 或 Google Chrome 之类的浏览器,并使用它来保存各种网站的登录密码,那么你将遇到麻烦。任何人都可以使用浏览器并利用你在浏览器中保存的密码登录网站。这不很危险吗?

这就是为什么当你使用 Chrome 时,它将反复地提示你先解锁密钥环。这确保了只有知道密钥环密码(即账户密码)的人才能使用在浏览器中保存的密码来登录它们相关的网站。

如果你反复取消解锁密钥环的提示,它最终将消失,并允许你使用浏览器。但是,保存的密码将不会被解锁,你在 Chromium/Chome 浏览器上将会看到“同步暂停”的提示。

Sync paused in Google Chrome

如果密钥环一直存在,为什么你从来没有见过它呢?

如果你在你的 Linux 系统上从没见过它的话,这个问题就很有道理。

如果你从没有用过自动登录功能(或者修改你的账户密码),你可能都没有意识到这个特性的存在。

这是因为当你通过你的密码登录系统时,你的密钥环被你的账户密码自动解锁了。

Ubuntu(和其他发行版)在执行普通的管理任务如修改用户、安装新软件等需要输入密码,无论你是否是自动登录的。但是对于日常任务像使用浏览器,它不需要输入密码因为密钥环已经被解锁了。

当你切换到自动登录时,你不再需要输入登录密码。这意味着密钥环没有被自动解锁,因此当你使用利用了密钥环特性的浏览器时,它将提示你来解锁密钥环。

你可以轻松地管理密钥环和密码

这个密钥环放在哪里?它的核心是一个守护任务(一个后台自动运行的程序)。

别担心。你不必通过终端来操作守护任务。大多数桌面环境都自带一个可以和这个守护进程进行交互的图形化应用程序。KDE 上有 KDE 钱包,GNOME 和其他桌面上叫做“密码和密钥”(之前叫 Seahorse)。

Password And Keys App in Ubuntu

你可以用这个 GUI 程序来查看哪些应用程序在用密钥环来管理/保护密码。

你可以看到,我的系统有自动创建的登录密钥环。也有一个存储 GPG 和 SSH 密钥的密钥环。那个证书用来保存证书机构颁发的证书(如 HTTPS 证书)。

Password and Keys application in Ubuntu

你也可以使用这个应用程序来手动保存网站的密码。例如,我创建了一个新的叫做“Test”的被密码保护的密钥环,并手动存储了一个密码。

这比在一个文本文件中保存一批密码要好一些。至少在这种情况下,你的密码只有在你通过密码解锁了密钥环时才允许被看到。

Saving New Password Seahorse

这里有一个潜在的问题,如果你格式化你的系统,手动保存的密码必然会丢失。通常,你会备份你的个人文件,但并不是所有的用户特定数据,如密钥环文件。

有一种办法能解决它。密钥环数据通常保存在 ~/.local/share/keyrings 目录。在这里你可以看到所有的密钥环,但是你不能直接看到它们的内容。如果你移除密钥环的密码(我会在这篇文章的后面描述操作步骤),你可以像一个普通的文本文件一样读取密钥环的内容。你可以将这个解锁后的密钥环文件完整地复制下来,并在其他的 Linux 机器上运行“密码和密钥”应用程序导入到其中。

总结一下目前为止所学的内容:

  • 大多数 Linux 系统缺省已经安装并激活了密钥环特性
  • 系统上的每个用户都拥有他自己的密钥环
  • 密钥环通常是用账户密码锁定的(保护)
  • 当你通过密码登录时密钥环会被自动解锁
  • 对于自动登录,密钥环不会自动解锁,因此当你试图使用依赖密钥环的应用程序时会被提示先解锁它
  • 并不是所有的浏览器或应用程序利用了密钥环特性
  • (Linux 上)安装一个 GUI 程序可以和密钥环交互
  • 你可以用密钥环来手动存储加密格式的密码
  • 你可以自己修改密钥环密码
  • 你可以通过导出(需要先解锁密钥环)并导入到其他计算机上的方式来获取手工保存的密码。

修改密钥环密码

假设你修改了你的账户密码。当你登录时,你的系统试图通过新的登录密码来自动解锁密钥环。但是密钥环还在使用老的登录密码。

这种情况下,你可以修改密钥环密码为新的登录密码,这样密码环才能在你登录系统时自动解锁。

从菜单中打开“密码和密钥”应用程序:

Look for Password and Keys app in the menu

在“Login”密钥环上右击并点击“修改密码”:

Change Keyring Password

如果你不记得老的登录密码怎么办?

你可能知道在 Ubuntu 上重置忘记的密码很容易。但是密钥环在这种场景下还是有问题。你修改了账户密码,但是你不记得仍然被密钥环使用的老的账户密码。

你不能修改它因为你不知道老的密码。怎么办?

这种情况下,你将不得不移除整个密钥环。你可以通过“密码和密钥”应用程序来操作:

Delete Keyring Ubuntu

它会提示你进行确认:

Delete Keyring

另外,你也可以手动删除 ~/.local/share/keyrings 目录下的密钥环文件。

老的密钥环文件被移除后,你再打开 Chrome/Chromium 时,它会提示你创建一个新的密钥环。

New Keyring Password

你可以用新的登录密码,密钥环就会被自动解锁了。

禁用密钥环密码

在你想用自动登录但又不想手动解锁密钥环时,你可以把禁用密钥环密码作为一个规避方法。记住你正在禁用一个安全特性,因此请三思。

操作步骤和修改密钥环相似。打开“密码和密钥”应用程序,然后修改密钥环密码。

技巧在于当它提示修改密码时,不要输入新密码,而是点击“继续”按钮。这将移除密钥环的密码。

Disable Keyring password by not setting any password at all

这种方法,密钥环没有密码保护,并将一直处于解锁状态。


via: https://itsfoss.com/ubuntu-keyring/

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

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