在 Fedora 上使用 SSH 端口转发

Summary: ssh 命令背后所使用的协议允许终端的输入和输出流经安全通道。但是你知道也可以使用 ssh 来安全地发送和接收其他数据吗？

# 在 Fedora 上使用 SSH 端口转发

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

你可能已经熟悉使用 [ssh 命令](https://en.wikipedia.org/wiki/Secure_Shell)访问远程系统。`ssh` 命令背后所使用的协议允许终端的输入和输出流经[安全通道](https://fedoramagazine.org/open-source-ssh-clients/)。但是你知道也可以使用 `ssh` 来安全地发送和接收其他数据吗？一种方法是使用“<ruby> 端口转发 <rt>  port forwarding </rt></ruby>”，它允许你在进行 `ssh` 会话时安全地连接网络端口。本文向你展示了它是如何工作的。

### 关于端口

标准 Linux 系统已分配了一组网络端口，范围是 0 - 65535。系统会保留 0 - 1023 的端口以供系统使用。在许多系统中，你不能选择使用这些低端口号。通常有几个端口用于运行特定的服务。你可以在系统的 `/etc/services` 文件中找到这些定义。

你可以认为网络端口是类似的物理端口或可以连接到电缆的插孔。端口可以连接到系统上的某种服务，类似物理插孔后面的接线。一个例子是 Apache Web 服务器（也称为 `httpd`）。对于 HTTP 非安全连接，Web 服务器通常要求在主机系统上使用端口 80，对于 HTTPS 安全连接通常要求使用 443。

当你连接到远程系统（例如，使用 Web 浏览器）时，你是将浏览器“连接”到你的主机上的端口。这通常是一个随机的高端口号，例如 54001。你的主机上的端口连接到远程主机上的端口（例如 443）来访问其安全的 Web 服务器。

那么，当你有这么多可用端口时，为什么还要使用端口转发呢？这是 Web 开发人员生活中的几种常见情况。

### 本地端口转发

想象一下，你正在名为 `remote.example.com` 的远程系统上进行 Web 开发。通常，你是通过 `ssh` 进入此系统的，但是它位于防火墙后面，而且该防火墙很少允许其他类型的访问，并且会阻塞大多数其他端口。要尝试你的网络应用，能够使用浏览器访问远程系统会很有帮助。但是，由于使用了讨厌的防火墙，你无法通过在浏览器中输入 URL 的常规方法来访问它。

本地转发使你可以通过 `ssh` 连接来建立可通过远程系统访问的端口。该端口在系统上显示为本地端口（因而称为“本地转发”）。

假设你的网络应用在 `remote.example.com` 的 8000 端口上运行。要将那个系统的 8000 端口本地转发到你系统上的 8000 端口，请在开始会话时将 `-L` 选项与 `ssh` 结合使用：

```
$ ssh -L 8000:localhost:8000 remote.example.com
```

等等，为什么我们使用 `localhost` 作为转发目标？这是因为从 `remote.example.com` 的角度来看，你是在要求主机使用其自己的端口 8000。（回想一下，任何主机通常可以通过网络连接 `localhost` 而连接到自身。）现在那个端口连接到你系统的 8000 端口了。`ssh` 会话准备就绪后，将其保持打开状态，然后可以在浏览器中键入 `http://localhost:8000` 来查看你的 Web 应用。现在，系统之间的流量可以通过 `ssh` 隧道安全地传输！

如果你有敏锐的眼睛，你可能已经注意到了一些东西。如果我们要 `remote.example.com` 转发到与 `localhost` 不同的主机名怎么办？如果它可以访问该网络上另一个系统上的端口，那么通常可以同样轻松地转发该端口。例如，假设你想访问也在该远程网络中的 `db.example.com` 的 MariaDB 或 MySQL 服务。该服务通常在端口 3306 上运行。因此，即使你无法 `ssh` 到实际的 `db.example.com` 主机，你也可以使用此命令将其转发：

```
$ ssh -L 3306:db.example.com:3306 remote.example.com
```

现在，你可以在 `localhost` 上运行 MariaDB 命令，而实际上是在使用 `db.example.com` 主机。

### 远程端口转发

远程转发让你可以进行相反操作。想象一下，你正在为办公室的朋友设计一个 Web 应用，并想向他们展示你的工作。不过，不幸的是，你在咖啡店里工作，并且由于网络设置，他们无法通过网络连接访问你的笔记本电脑。但是，你同时使用着办公室的 `remote.example.com` 系统，并且仍然可在这里登录。你的 Web 应用似乎在本地 5000 端口上运行良好。

远程端口转发使你可以通过 `ssh` 连接从本地系统建立端口的隧道，并使该端口在远程系统上可用。在开始 `ssh` 会话时，只需使用 `-R` 选项：

```
$ ssh -R 6000:localhost:5000 remote.example.com
```

现在，当在公司防火墙内的朋友打开浏览器时，他们可以进入 `http://remote.example.com:6000` 查看你的工作。就像在本地端口转发示例中一样，通信通过 `ssh` 会话安全地进行。

默认情况下，`sshd` 守护进程运行在设置的主机上，因此**只有**该主机可以连接它的远程转发端口。假设你的朋友希望能够让其他 `example.com` 公司主机上的人看到你的工作，而他们不在 `remote.example.com` 上。你需要让 `remote.example.com` 主机的所有者将以下选项**之一**添加到 `/etc/ssh/sshd_config` 中：

```
GatewayPorts yes       # 或
GatewayPorts clientspecified
```

第一个选项意味着 `remote.example.com` 上的所有网络接口都可以使用远程转发的端口。第二个意味着建立隧道的客户端可以选择地址。默认情况下，此选项设置为 `no`。

使用此选项，你作为 `ssh` 客户端仍必须指定可以共享你这边转发端口的接口。通过在本地端口之前添加网络地址范围来进行此操作。有几种方法可以做到，包括：

```
$ ssh -R *:6000:localhost:5000                   # 所有网络
$ ssh -R 0.0.0.0:6000:localhost:5000             # 所有网络
$ ssh -R 192.168.1.15:6000:localhost:5000        # 单个网络
$ ssh -R remote.example.com:6000:localhost:5000  # 单个网络
```

### 其他注意事项

请注意，本地和远程系统上的端口号不必相同。实际上，有时你甚至可能无法使用相同的端口。例如，普通用户可能不会在默认设置中转发到系统端口。

另外，可以限制主机上的转发。如果你需要在联网主机上更严格的安全性，那么这你来说可能很重要。 `sshd` 守护程进程的 `PermitOpen` 选项控制是否以及哪些端口可用于 TCP 转发。默认设置为 `any`，这让上面的所有示例都能正常工作。要禁止任何端口转发，请选择 `none`，或仅允许的特定的“主机:端口”。有关更多信息，请在手册页中搜索 `PermitOpen` 来配置 `sshd` 守护进程：

```
$ man sshd_config
```

最后，请记住，只有在 `ssh` 会话处于打开状态时才会端口转发。如果需要长时间保持转发活动，请尝试使用 `-N` 选项在后台运行会话。确保控制台已锁定，以防止在你离开控制台时其被篡夺。

---

via: <https://fedoramagazine.org/using-ssh-port-forwarding-on-fedora/>

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

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


2019 年最可怕的黑客事件与安全漏洞（上）

# 2019 年最可怕的黑客事件与安全漏洞（上）

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

是的，这是年终摘要文章之一。这是一篇很长的文章，因为就网络安全新闻来说，2019 年就是一场灾难，每周都会有一个或多个重大事件发生。

以下是按月组织的过去 10 个月安全灾难的摘要。

### 一月

[Apple FaceTime 中的严重漏洞](https://www.zdnet.com/article/apple-facetime-exploit-found-by-14-year-old-playing-fortnite/)：Apple FaceTime 应用程序中的一个错误使攻击者可以在不与被呼叫者进行任何用户交互的情况下呼叫并自行应答 FaceTime 呼叫，从而为进行秘密监视打开了大门。

[在通过 Skype 面试后，朝鲜黑客渗透到智利的 ATM 网络](https://www.zdnet.com/article/north-korean-hackers-infiltrate-chiles-atm-network-after-skype-job-interview/)：该文章的标题不言而喻，值得你花时间阅读该故事。

[黑客破坏并窃取了韩国国防部的数据](https://www.zdnet.com/article/hackers-breach-and-steal-data-from-south-koreas-defense-ministry/)：首尔政府表示，黑客破坏了 30 台计算机并窃取了 10 台计算机中的数据。被黑客入侵的计算机存储了有关武器和弹药采购的数据。

[有人入侵了 PHP PEAR 网站](https://www.zdnet.com/article/mystery-still-surrounds-hack-of-php-pear-website/)：我们仍然不知道发生了什么，但是一些黑客侵入了 PHP PEAR 存储库，并给某个版本的 PHP PEAR 软件包管理器添加了后门。

[26 种低端加密货币中发现的安全漏洞](https://www.zdnet.com/article/security-flaws-found-in-26-low-end-cryptocurrencies/)：该报告显示了一些低端的不著名的加密货币的危险性，以及黑客如何随时窃取大量资金。

[俄克拉荷马州政府数据泄漏暴露了联邦调查局的调查记录](https://www.zdnet.com/article/oklahoma-gov-data-leak-exposes-millions-of-department-files-fbi-investigations/)：俄克拉荷马州证券部的服务器允许任何人下载政府文件，例如内部文件，甚至是联邦调查局的调查。

[被怀疑参与了全球 DNS 劫持活动的伊朗黑客](https://www.zdnet.com/article/iranian-hackers-suspected-in-worldwide-dns-hijacking-campaign/)：FireEye 和 Cisco Talos 先后披露了由伊朗黑客发起的全球劫持活动，伊朗黑客通过其伊朗服务器重定向了来自全球各地公司的流量，并记录了公司的凭据以备将来攻击。他们在域名注册商处入侵了 DNS 管理帐户，以执行 DNS 劫持攻击。这些黑客也[入侵了希腊的顶级域名注册商](https://www.zdnet.com/article/hackers-breached-greeces-top-level-domain-registrar/)。

[存在了 36 年之久的 SCP 软件安全漏洞](https://www.zdnet.com/article/scp-implementations-impacted-by-36-years-old-security-flaws/)：自 1983 年以来，过去 36 年中的所有 SCP（安全复制协议）软件版本均受到了四个安全漏洞的影响，这些漏洞允许恶意的 SCP 服务器对客户（用户）的系统进行未经授权的更改，并在终端隐藏其恶意操作。

年度 LTE 安全漏洞：今年发现了两组新的 LTE 安全漏洞。一组影响 [3G、4G 和 5G](https://www.zdnet.com/article/new-security-flaw-impacts-5g-4g-and-3g-telephony-protocols/)，另一组 [36 个漏洞](https://www.zdnet.com/article/researchers-find-36-new-security-flaws-in-lte-protocol/)在韩国安全研究人员进行的一项模糊项目之后被发现。

[网站可以通过浏览器扩展 API 窃取浏览器数据](https://www.zdnet.com/article/websites-can-steal-browser-data-via-extensions-apis/)：研究人员发现有将近 200 个 Chrome、Firefox 和 Opera 扩展容易受到恶意站点的攻击。

[WiFi 固件错误会影响笔记本电脑、智能手机、路由器、游戏设备](https://www.zdnet.com/article/wifi-firmware-bug-affects-laptops-smartphones-routers-gaming-devices/)：Marvell Avastar 芯片组中发现的重大安全漏洞。受影响的设备列表包括 PS4、Xbox One、三星 Chromebook 和微软 Surface 设备。

恶意软件被发现预装在 Android 设备上：在 2019 年发生了两次。首先，在一月份，研究人员在[预安装在阿尔卡特智能手机上的阿尔卡特应用程序](https://www.zdnet.com/article/malware-found-preinstalled-on-some-alcatel-smartphones/)中发现了恶意软件。其次，在六月，德国的网络安全机构在[四种中国智能手机型号中发现了后门](https://www.zdnet.com/article/germany-backdoor-found-in-four-smartphone-models-20000-users-infected/)。

### 二月

[重大 WinRAR 错误暴露](https://www.zdnet.com/article/winrar-versions-released-in-the-last-19-years-impacted-by-severe-security-flaw/)：Check Point 研究人员发现了一个 WinRAR 错误，该错误影响了自 2000 年以来发行的所有 WinRAR 版本。超过 5 亿个 WinRAR 用户面临风险。这些漏洞最终被网络罪犯和国家黑客广泛使用。

[新的 WinPot 恶意软件可以使 ATM 吐出现金](https://www.zdnet.com/article/this-malware-turns-atm-hijacking-into-slot-machine-games/)：WinPot 自 2018 年 3 月以来一直在地下论坛上出售。

[从 Tor 流量检测单个 Android 应用程序的准确性为 97％](https://www.zdnet.com/article/tor-traffic-from-individual-android-apps-detected-with-97-percent-accuracy/)：新的机器学习算法可以通过 Tor 检测 Tor 用户何时使用了特定的应用程序，例如 YouTube、Instagram、Spotify 等。

[黑客抹除了电子邮件提供商 VFEmail 的美国服务器](https://www.zdnet.com/article/hackers-wipe-us-servers-of-email-provider-vfemail/)：黑客没有要求赎金。VFEmail 将事件描述为“攻击并摧毁”。

[Thunderclap 漏洞](https://www.zdnet.com/article/thunderclap-flaws-impact-how-windows-mac-linux-handle-thunderbolt-peripherals/)：该安全漏洞影响 Windows、Mac、Linux 处理 Thunderbolt 外围设备的方式。它们允许创建可能从操作系统内存中窃取数据的高度危险的恶意外围设备。

PDF 协议攻击：一组德国学者发现了一种在 PDF 文档中[伪造签名的方法](https://www.zdnet.com/article/researchers-break-digital-signatures-for-most-desktop-pdf-viewers/)，并在今年晚些时候找到了[一种破解 PDF 加密的方法](https://www.zdnet.com/article/researchers-break-digital-signatures-for-most-desktop-pdf-viewers/)。

使用 CPU 隐藏恶意软件：学者们已经找到了在[使用推测执行](https://www.zdnet.com/article/researchers-hide-malware-in-benign-apps-with-the-help-of-speculative-execution/)和[英特尔 SGX 安全区系统](https://www.zdnet.com/article/researchers-hide-malware-in-intel-sgx-enclaves/)的计算机上隐藏恶意软件的方法。

### 三月

[黑客在大风暴发生前将龙卷风警报器离线](https://www.zdnet.com/article/hacked-tornado-sirens-taken-offline-in-two-texas-cities-ahead-of-major-storm/)：是的，就是为了作恶。

[华硕供应链黑客事件](https://www.zdnet.com/article/supply-chain-attack-installs-backdoors-through-hijacked-asus-live-update-software/)：黑客劫持了华硕 Live Update 实用程序，以便在用户系统上部署恶意软件。黑客攻击发生在 2018 年，但在今年 3 月被披露。据信已经影响了超过一百万台 PC。

[GitHub 帐户环推广了 300 多个带后门的应用程序](https://www.zdnet.com/article/researchers-uncover-ring-of-github-accounts-promoting-300-backdoored-apps/)：该 GitHub 账户环由 89 个帐户组成，推广了 73 个仓库，其中包含 300 多个带有后门的 Windows、Mac 和 Linux 应用程序。

[Bithumb 加密货币交易所在两年内第三次被黑客入侵](https://www.zdnet.com/article/bithumb-cryptocurrency-exchange-hacked-a-third-time-in-two-years/)：据信黑客已经赚了近 2000 万美元的 EOS 和瑞波加密货币。在这一点上，Bithumb 似乎放弃挣扎了。

[Chrome 零日漏洞正受到活跃攻击](https://www.zdnet.com/article/google-reveals-chrome-zero-day-under-active-attacks/)：CVE-2019-5786（Chrome 的 FileReader API 中的一个错误）被广泛利用以从用户计算机中读取内容。谷歌表示，该漏洞是由一个国家攻击者[与 Windows 7 零日漏洞一起使用](https://www.zdnet.com/article/google-chrome-zero-day-was-used-together-with-a-windows-7-zero-day/)的。

[新的英特尔 CPU 错误](https://www.zdnet.com/article/researchers-discover-and-abuse-new-undocumented-feature-in-intel-chipsets/)：研究人员发现了新的 Intel VISA（内部信号架构可视化）调试技术。

[法国加油站的黑客事件](https://www.zdnet.com/article/french-gas-stations-robbed-after-forgetting-to-change-gas-pump-pins/)：加油站忘记更换加油站油泵的 PIN 之后，犯罪集团从巴黎附近的道达尔加油站偷走了 12 万升燃油。

[Citrix 数据泄露](https://www.zdnet.com/article/citrix-discloses-security-breach-of-internal-network/)：Citrix 从 FBI 获悉了本次黑客攻击。黑客偷走了商业文件。Citrix 的许多客户都是政府机构和财富 500 强公司。

智能手机解锁问题：我们今年遇到了一些这样的案例，但第一起案例是在三月份报道的，当时用户发现三星 Galaxy S10 面部识别可能被[手机所有者的视频](https://www.zdnet.com/article/samsung-galaxy-s10-facial-recognition-fooled-by-a-video-of-the-phone-owner/)所欺骗。一个月后，用户发现他可以用[一包口香糖](https://www.zdnet.com/article/nokia-9-buggy-update-lets-anyone-bypass-fingerprint-scanner-with-a-pack-of-gum/)解锁诺基亚 9 智能手机的指纹扫描仪。然后在十月，用户发现可以在[闭着眼睛](https://www.zdnet.com/article/google-pixel-4s-face-unlock-works-even-if-you-have-your-eyes-closed/)时解锁 Pixel 4 的面部解锁技术；一对夫妇发现，如果该设备由硅保护套保护，他们可以使用任何用户的手指[解锁使用指纹保护的 Samsung S10 设备](https://www.zdnet.com/article/samsung-to-patch-s10-fingerprint-sensor-bug-next-week/)。实际上，绕过面部识别的问题非常普遍。去年，一家荷兰非营利组织进行的一项研究发现，攻击者可以在测试的 [110 部智能手机中的 42 部](https://www.zdnet.com/article/facial-recognition-doesnt-work-as-intended-on-42-of-110-tested-smartphones/)中绕过面部解锁类的功能。

### 四月

[美国联合航空公司盖上了座席摄像头](https://www.zdnet.com/article/united-airlines-covers-up-infotainment-seat-camera-following-passenger-outrage/)：该航空公司坚称这些摄像头尚未投入使用；但是，客户首先仍然对该摄像头的存在感到非常不安和烦恼。

[由于未修复的 API，研究人员在数百个 GPS 手表的地图上显示 “PWNED!”](https://www.zdnet.com/article/researcher-prints-pwned-on-hundreds-of-gps-watches-maps-due-to-unfixed-api/) ：超过 20 种型号的 GPS 手表允许恶意行为者跟踪设备所有者，并修改手表功能。

[成千上万辆汽车因使用硬编码的密码而暴露于小偷视野之中](https://www.zdnet.com/article/tens-of-thousands-of-cars-left-exposed-to-thieves-due-to-a-hardcoded-password/)：二月中以来，MyCar 发布的 Android 和 iOS 应用程序的安全更新已删除了硬编码的密码。

[被勒索软件感染后，“天气”频道的播出空缺了 90 分钟](https://www.zdnet.com/article/the-weather-channel-goes-off-the-air-for-90-minutes-after-ransomware-infection/)：10 月对[法国电视台 M6](https://www.zdnet.com/article/m6-one-of-frances-biggest-tv-channels-hit-by-ransomware/) 的类似攻击未成功。

[Facebook 承认存储了数百万个 Instagram 用户的明文密码](https://www.zdnet.com/article/facebook-admits-to-storing-plaintext-passwords-for-millions-of-instagram-users/)：该事件发生的一个月前，Facebook 也承认[存储了 Facebook 帐户的明文密码](https://www.zdnet.com/article/facebook-we-stored-hundreds-of-millions-of-passwords-in-plain-text/)。

[Telegram 上泄露了伊朗网络间谍工具的源代码](https://www.zdnet.com/article/source-code-of-iranian-cyber-espionage-tools-leaked-on-telegram/)：每天都有恶意软件开发人员使用这些工具，从而使更多用户受到攻击。[五月](https://www.zdnet.com/article/new-leaks-of-iranian-cyber-espionage-operations-hit-telegram-and-the-dark-web/)和[六月](https://www.zdnet.com/article/new-iranian-hacking-tool-leaked-on-telegram/)发生了第二次和第三次伊朗黑客工具泄漏。

[印度政府机构保留的数百万孕妇的详细信息暴露在线上](https://www.zdnet.com/article/indian-govt-agency-left-details-of-millions-of-pregnant-women-exposed-online/)：超过 1250 万孕妇医学记录被暴露。三个多星期后，泄漏的服务器中删除了记录。

[超过 13000 个 iSCSI 存储群集暴露在网上而没有密码](https://www.zdnet.com/article/over-13k-iscsi-storage-clusters-left-exposed-online-without-a-password/)：新的攻击方式在企业磁盘存储阵列和人们的 NAS 设备内部打开了后门。

[Gnosticplayers 的黑客事件](https://www.zdnet.com/article/a-hacker-has-dumped-nearly-one-billion-user-records-over-the-past-two-months/)：几个月之内，一个被称为 Gnosticplayers 的黑客在网上放出了超过 10 亿条用户记录。

[黑客组织已经在 D-Link 路由器上劫持了 DNS 流量达三个月](https://www.zdnet.com/article/hacker-group-has-been-hijacking-dns-traffic-on-d-link-routers-for-three-months/)：他们还针对了其他路由器型号进行了劫持，例如 ARG、DSLink、Secutech 和 TOTOLINK。这些攻击[在巴西尤其活跃](https://www.zdnet.com/article/brazil-is-at-the-forefront-of-a-new-type-of-router-attack/)。

### 五月

[黑客擦除了 Git 存储库，并要求赎金](https://www.zdnet.com/article/a-hacker-is-wiping-git-repositories-and-asking-for-a-ransom/)：成千上万的存储库受到了影响，但几乎所有项目都已恢复。

[对现代 CPU 的新 MDS 攻击](https://www.zdnet.com/article/intel-cpus-impacted-by-new-zombieload-side-channel-attack/)：研究人员和学者详细介绍了新的微体系结构数据采样（MDS）攻击，例如 Zombieload、Fallout 和 RIDL。

[Thrangrycat 漏洞](https://www.zdnet.com/article/thrangrycat-flaw-lets-attackers-plant-persistent-backdoors-on-cisco-gear/)：Thrangrycat 漏洞使攻击者可以在 Cisco 设备上植入持久的后门。据信大多数 Cisco 设备都会受到影响。没有广泛检测到攻击。

BlueKeep 漏洞：五月中旬，微软警告了一个[新的 “可用作蠕虫的” RDP 漏洞](https://www.zdnet.com/article/microsoft-patches-windows-xp-server-2003-to-try-to-head-off-wormable-flaw/)，该漏洞后来被称为 BlueKeep。后来在八月披露了两个新的类似 BlueKeep 的可用做蠕虫的漏洞（[DejaBlue](https://www.zdnet.com/article/microsoft-warns-of-two-new-wormable-flaws-in-windows-remote-desktop-services/)）。经过数月的迫切等待之后，九月公开发布了一种[概念验证攻击](https://www.zdnet.com/article/metasploit-team-releases-bluekeep-exploit/)。

[不安全的服务器公开了 85％ 巴拿马公民的的数据](https://www.zdnet.com/article/unsecured-server-exposes-data-for-85-percent-of-all-panama-citizens/)：该服务器包含患者数据，但没有公开医疗记录，仅公开了个人身份信息（PII）。

[软件更新导致荷兰警察的脚踝监控器崩溃](https://www.zdnet.com/article/software-update-crashes-police-ankle-monitors-in-the-netherlands/)：有问题的更新阻止了脚踝监控器将数据发送回警察控制室。导致需要找到一些嫌疑人并送回监狱。

[以色列对空袭哈马斯的黑客首次作出回应](https://www.zdnet.com/article/in-a-first-israel-responds-to-hamas-hackers-with-an-air-strike/)：以色列军方称轰炸了住着哈马斯网络部队的房屋。

[Google 替换了有问题的 Titan 安全密钥](https://www.zdnet.com/article/google-to-replace-faulty-titan-security-keys/)：蓝牙配对协议中的漏洞迫使 Google 替换了在美国销售的 Titan 密钥。微软后来被迫[发布了一个特殊修复程序](https://www.zdnet.com/article/microsoft-blocks-ble-security-keys-with-known-pairing-vulnerability/)以解决该问题。

[Canva 黑客事件](https://www.zdnet.com/article/australian-tech-unicorn-canva-suffers-security-breach/)：Gnosticplayers 的受害者之一。该公司被黑客窃取了 1.39 亿条用户记录。

[StackOverflow 黑客事件](https://www.zdnet.com/article/stack-overflow-says-hackers-breached-production-systems/)：Stack Overflow 表示黑客破坏了生产系统，而黑客发现已经活动了[一周以上](https://www.zdnet.com/article/stack-overflow-hacker-went-undetected-for-a-week/)。

[Flipboard 黑客事件](https://www.zdnet.com/article/flipboard-says-hackers-stole-user-details/)：黑客入侵的程度尚不得而知，但 Flipboard 表示，黑客已经访问其系统将近九个月的时间。

[伦敦地铁开始通过 Wi-Fi 热点跟踪乘客](https://www.zdnet.com/article/london-underground-to-begin-tracking-passengers-through-wi-fi-hotspots/)：伦敦交通局（TfL）表示，计划在未来几个月内推出一种系统，以利用伦敦地铁上的公共 Wi-Fi 热点跟踪通勤者。

[安全浏览器的主要错误](https://www.zdnet.com/article/mobile-chrome-safari-and-firefox-failed-to-show-phishing-warnings-for-more-than-a-year/)：移动版 Chrome、Safari 和 Firefox 一年多都未能显示网络钓鱼警告。

### 六月

[黑客攻击了 10 家电信供应商](https://www.zdnet.com/article/these-hackers-broke-into-10-telecoms-companies-to-steal-customers-phone-records/)：Cybereason 的研究人员说，一个由国家支持的情报机构已经破坏了至少 10 家全球电信公司：在某种程度上，攻击者运行着“事实上的影子 IT 部门”。

[新的 Silex 恶意软件使成千上万的 IoT 设备变砖](https://www.zdnet.com/article/new-silex-malware-is-bricking-iot-devices-has-scary-plans/)：攻击持续了数天，但黑客最终停止并撤回了 Silex 恶意软件代码。

[NASA 因未经授权的树莓派连接到其网络而被黑客入侵](https://www.zdnet.com/article/nasa-hacked-because-of-unauthorized-raspberry-pi-connected-to-its-network/)：NASA 将该黑客攻击描述为“高级持续威胁（APT）”，该术语通常用于国家黑客组织，但未提供其他详细信息。

[流行的 Facebook 悲伤支持页面被黑客入侵](https://www.zdnet.com/article/popular-grief-support-page-hacked-ignored-by-facebook-for-weeks/)：Facebok 数周都无视了该黑客攻击。

[Google Nest 的摄像头可以允许前拥有者监视新拥有者](https://www.zdnet.com/article/google-pushes-nest-cam-update-to-prevent-former-owners-spying-on-new-buyers/)：Google 最终推出了更新解决这个问题。

两个 Firefox 零日漏洞：Mozilla 修复了两个 Firefox 零日漏洞[[1](https://www.zdnet.com/article/mozilla-fixes-second-firefox-zero-day-exploited-in-the-wild/)、[2](https://www.zdnet.com/article/mozilla-fixes-second-firefox-zero-day-exploited-in-the-wild/)] ，它们被用于攻击 Coinbase 员工。

[AMCA 数据泄露](https://www.zdnet.com/article/amca-data-breach-has-now-gone-over-the-20-million-mark/)：去年，美国医疗保健计费供应商被黑客入侵，黑客将患者数据在线出售。该漏洞影响了多家医疗保健提供商，最终数量超过了 2000 万。

[CBP 说，黑客窃取了车牌和旅行者的照片](https://www.zdnet.com/article/cbp-says-hackers-stole-license-plate-and-travelers-photos/)：CBP 说，分包商未经授权将照片存储在其内部服务器上，然后遭到黑客攻击。

[HSM 重大漏洞影响着银行、云提供商、政府](https://www.zdnet.com/article/major-hsm-vulnerabilities-impact-banks-cloud-providers-governments/)：两名安全研究人员透露，可以远程利用这些漏洞来检索存储在称为 HSM（硬件安全模块）的特殊计算机组件中的敏感数据。

[SIM 交换攻击浪潮袭击了美国加密货币用户](https://www.zdnet.com/article/wave-of-sim-swapping-attacks-hit-us-cryptocurrency-users/)：六月的一周，数十名美国加密货币用户认为他们是 SIM 交换攻击的受害者。


使用 ansible-bender 构建容器镜像

Summary: 了解如何使用 Ansible 在容器中执行命令。

了解如何使用 Ansible 在容器中执行命令。

# 使用 ansible-bender 构建容器镜像

>
> 了解如何使用 Ansible 在容器中执行命令。
>
>
>

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

容器和 [Ansible](https://www.ansible.com/) 可以很好地融合在一起：从管理和编排到供应和构建。在本文中，我们将重点介绍构建部分。

如果你熟悉 Ansible，就会知道你可以编写一系列任务，`ansible-playbook` 命令将为你执行这些任务。你知道吗，如果你编写 Dockerfile 并运行 `podman build`，你还可以在容器环境中执行此类命令，并获得相同的结果。

这是一个例子：

```
- name: Serve our file using httpd
  hosts: all
  tasks:
  - name: Install httpd
    package:
      name: httpd
      state: installed
  - name: Copy our file to httpd’s webroot
    copy:
      src: our-file.txt
      dest: /var/www/html/
```

你可以在 Web 服务器本地或容器中执行这个剧本，并且只要你记得先创建 `our-file.txt`，它就可以工作。

但是这里缺少了一些东西。你需要启动（并配置）httpd 以便提供文件。这是容器构建和基础架构供应之间的区别：构建镜像时，你只需准备内容；而运行容器是另一项任务。另一方面，你可以将元数据附加到容器镜像，它会默认运行命令。

这有个工具可以帮助。试试看 `ansible-bender` 怎么样？

```
$ ansible-bender build the-playbook.yaml fedora:30 our-httpd
```

该脚本使用 `ansible-bender` 对 Fedora 30 容器镜像执行该剧本，并将生成的容器镜像命名为 `our-httpd`。

但是，当你运行该容器时，它不会启动 httpd，因为它不知道如何操作。你可以通过向该剧本添加一些元数据来解决此问题：

```
- name: Serve our file using httpd
  hosts: all
  vars:
    ansible_bender:
      base_image: fedora:30
      target_image:
        name: our-httpd
        cmd: httpd -DFOREGROUND
  tasks:
  - name: Install httpd
    package:
      name: httpd
      state: installed
  - name: Listen on all network interfaces.
    lineinfile:
      path: /etc/httpd/conf/httpd.conf
      regexp: '^Listen '
      line: Listen 0.0.0.0:80
  - name: Copy our file to httpd’s webroot
    copy:
      src: our-file.txt
      dest: /var/www/html
```

现在你可以构建镜像（从这里开始，请以 root 用户身份运行所有命令。目前，Buildah 和 Podman 不会为无 root 容器创建专用网络）：

```
# ansible-bender build the-playbook.yaml
PLAY [Serve our file using httpd] ****************************************************

TASK [Gathering Facts] ***************************************************************
ok: [our-httpd-20191004-131941266141-cont]

TASK [Install httpd] *****************************************************************
loaded from cache: 'f053578ed2d47581307e9ba3f64f4b4da945579a082c6f99bd797635e62befd0'
skipping: [our-httpd-20191004-131941266141-cont]

TASK [Listen on all network interfaces.] *********************************************
changed: [our-httpd-20191004-131941266141-cont]

TASK [Copy our file to httpd’s webroot] **********************************************
changed: [our-httpd-20191004-131941266141-cont]

PLAY RECAP ***************************************************************************
our-httpd-20191004-131941266141-cont : ok=3    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Getting image source signatures
Copying blob sha256:4650c04b851c62897e9c02c6041a0e3127f8253fafa3a09642552a8e77c044c8
Copying blob sha256:87b740bba596291af8e9d6d91e30a01d5eba9dd815b55895b8705a2acc3a825e
Copying blob sha256:82c21252bd87532e93e77498e3767ac2617aa9e578e32e4de09e87156b9189a0
Copying config sha256:44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Writing manifest to image destination
Storing signatures
44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Image 'our-httpd' was built successfully \o/
```

镜像构建完毕，可以运行容器了：

```
# podman run our-httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.2.106. Set the 'ServerName' directive globally to suppress this message
```

是否提供文件了？首先，找出你容器的 IP：

```
# podman inspect -f '{{ .NetworkSettings.IPAddress }}' 7418570ba5a0
10.88.2.106
```

你现在可以检查了：

```
$ curl http://10.88.2.106/our-file.txt
Ansible is ❤
```

你文件内容是什么？

这只是使用 Ansible 构建容器镜像的介绍。如果你想了解有关 `ansible-bender` 可以做什么的更多信息，请查看它的 [GitHub](https://github.com/ansible-community/ansible-bender) 页面。构建快乐！

---

via: <https://opensource.com/article/19/10/building-container-images-ansible>

作者：[Tomas Tomecek](https://opensource.com/users/tomastomecek) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


面向对象编程和根本状态

Summary: 早在 2015 年，Brian Will 撰写了一篇有挑衅性的博客：面向对象编程：一个灾难故事。他随后发布了一个名为面向对象编程很糟糕的视频，该视频更加详细。

# 面向对象编程和根本状态

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

早在 2015 年，Brian Will 撰写了一篇有挑衅性的博客：[面向对象编程：一个灾难故事](https://medium.com/@brianwill/object-oriented-programming-a-personal-disaster-1b044c2383ab)。他随后发布了一个名为[面向对象编程很糟糕](https://www.youtube.com/watch?v=QM1iUe6IofM)的视频，该视频更加详细。

我建议你花些时间观看视频，下面是我的一段总结：

>
> OOP 的柏拉图式理想是一堆相互解耦的对象，它们彼此之间发送无状态消息。没有人真的像这样制作软件，Brian 指出这甚至没有意义：对象需要知道向哪个对象发送消息，这意味着它们需要相互引用。该视频大部分讲述的是这样一个痛点：人们试图将对象耦合以实现控制流，同时假装它们是通过设计解耦的。
>
>
>

总的来说，他的想法与我自己的 OOP 经验产生了共鸣：对象没有问题，但是我一直不满意的是*面向*对象建模程序控制流，并且试图使代码“正确地”面向对象似乎总是在创建不必要的复杂性。

有一件事我认为他无法完全解释。他直截了当地说“封装没有作用”，但在脚注后面加上“在细粒度的代码级别”，并继续承认对象有时可以奏效，并且在库和文件级别封装是可以的。但是他没有确切解释为什么有时会奏效，有时却没有奏效，以及如何和在何处划清界限。有人可能会说这使他的 “OOP 不好”的说法有缺陷，但是我认为他的观点是正确的，并且可以在根本状态和偶发状态之间划清界限。

如果你以前从未听说过“<ruby> 根本 <rt>  essential </rt></ruby>”和“<ruby> 偶发 <rt>  accidental </rt></ruby>”这两个术语的使用，那么你应该阅读 Fred Brooks 的经典文章《[没有银弹](http://www.cs.nott.ac.uk/%7Epszcah/G51ISS/Documents/NoSilverBullet.html)》。（顺便说一句，他写了许多很棒的有关构建软件系统的文章。）我以前曾写过[关于根本和偶发的复杂性的文章](https://theartofmachinery.com/2017/06/25/compression_complexity_and_software.html)，这里有一个简短的摘要：软件是复杂的。部分原因是因为我们希望软件能够解决混乱的现实世界问题，因此我们将其称为“根本复杂性”。“偶发复杂性”是所有其它的复杂性，因为我们正尝试使用硅和金属来解决与硅和金属无关的问题。例如，对于大多数程序而言，用于内存管理或在内存与磁盘之间传输数据或解析文本格式的代码都是“偶发的复杂性”。

假设你正在构建一个支持多个频道的聊天应用。消息可以随时到达任何频道。有些频道特别有趣，当有新消息传入时，用户希望得到通知。而其他频道静音：消息被存储，但用户不会受到打扰。你需要跟踪每个频道的用户首选设置。

一种实现方法是在频道和频道设置之间使用<ruby> 映射 <rt>  map </rt></ruby>（也称为哈希表、字典或关联数组）。注意，映射是 Brian Will 所说的可以用作对象的抽象数据类型（ADT）。

如果我们有一个调试器并查看内存中的映射对象，我们将看到什么？我们当然会找到频道 ID 和频道设置数据（或至少指向它们的指针）。但是我们还会找到其它数据。如果该映射是使用红黑树实现的，我们将看到带有红/黑标签和指向其他节点的指针的树节点对象。与频道相关的数据是根本状态，而树节点是偶发状态。不过，请注意以下几点：该映射有效地封装了它的偶发状态 —— 你可以用 AVL 树实现的另一个映射替换该映射，并且你的聊天程序仍然可以使用。另一方面，映射没有封装根本状态（仅使用 `get()` 和 `set()` 方法访问数据并不是封装）。事实上，映射与根本状态是尽可能不可知的，你可以使用基本相同的映射数据结构来存储与频道或通知无关的其他映射。

这就是映射 ADT 如此成功的原因：它封装了偶发状态，并与根本状态解耦。如果你思考一下，Brian 用封装描述的问题就是尝试封装根本状态。其他描述的好处是封装偶发状态的好处。

要使整个软件系统都达到这一理想状况相当困难，但扩展开来，我认为它看起来像这样：

* 没有全局的可变状态
* 封装了偶发状态（在对象或模块或以其他任何形式）
* 无状态偶发复杂性封装在单独函数中，与数据解耦
* 使用诸如依赖注入之类的技巧使输入和输出变得明确
* 组件可由易于识别的位置完全拥有和控制

其中有些违反了我很久以来的直觉。例如，如果你有一个数据库查询函数，如果数据库连接处理隐藏在该函数内部，并且唯一的参数是查询参数，那么接口会看起来会更简单。但是，当你使用这样的函数构建软件系统时，协调数据库的使用实际上变得更加复杂。组件不仅以自己的方式做事，而且还试图将自己所做的事情隐藏为“实现细节”。数据库查询需要数据库连接这一事实从来都不是实现细节。如果无法隐藏某些内容，那么显露它是更合理的。

我对将面向对象编程和函数式编程放在对立的两极非常警惕，但我认为从函数式编程进入面向对象编程的另一极端是很有趣的：OOP 试图封装事物，包括无法封装的根本复杂性，而纯函数式编程往往会使事情变得明确，包括一些偶发复杂性。在大多数时候，这没什么问题，但有时候（比如[在纯函数式语言中构建自我指称的数据结构](https://wiki.haskell.org/Tying_the_Knot)）设计更多的是为了函数编程，而不是为了简便（这就是为什么 [Haskell 包含了一些“<ruby> 逃生出口 <rt>  escape hatches </rt></ruby>”](https://en.wikibooks.org/wiki/Haskell/Mutable_objects#The_ST_monad)）。我之前写过一篇[所谓“<ruby> 弱纯性 <rt>  weak purity </rt></ruby>”的中间立场](https://theartofmachinery.com/2016/03/28/dirtying_pure_functions_can_be_useful.html)。

Brian 发现封装对更大规模有效，原因有几个。一个是，由于大小的原因，较大的组件更可能包含偶发状态。另一个是“偶发”与你要解决的问题有关。从聊天程序用户的角度来看，“偶发的复杂性”是与消息、频道和用户等无关的任何事物。但是，当你将问题分解为子问题时，更多的事情就变得“根本”。例如，在解决“构建聊天应用”问题时，可以说频道名称和频道 ID 之间的映射是偶发的复杂性，而在解决“实现 `getChannelIdByName()` 函数”子问题时，这是根本复杂性。因此，封装对于子组件的作用比对父组件的作用要小。

顺便说一句，在视频的结尾，Brian Will 想知道是否有任何语言支持*无法*访问它们所作用的范围的匿名函数。[D](https://dlang.org) 语言可以。 D 中的匿名 Lambda 通常是闭包，但是如果你想要的话，也可以声明匿名无状态函数：

```
import std.stdio;

void main()
{
    int x = 41;

    // Value from immediately executed lambda
    auto v1 = () {
        return x + 1;
    }();
    writeln(v1);

    // Same thing
    auto v2 = delegate() {
        return x + 1;
    }();
    writeln(v2);

    // Plain functions aren't closures
    auto v3 = function() {
        // Can't access x
        // Can't access any mutable global state either if also marked pure
        return 42;
    }();
    writeln(v3);
}
```

---

via: <https://theartofmachinery.com/2019/10/13/oop_and_essential_state.html>

作者：[Simon Arneaud](https://theartofmachinery.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


2019 年最可怕的黑客事件与安全漏洞（下）

# 2019 年最可怕的黑客事件与安全漏洞（下）

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

是的，这是年终摘要文章之一。这是一篇很长的文章，因为就网络安全新闻来说，2019 年就是一场灾难，每周都会有一个或多个重大事件发生。

以下是按月组织的过去 10 个月安全灾难的摘要。

### 七月

[哈萨克斯坦政府拦截了所有本地 HTTPS 流量](https://www.zdnet.com/article/kazakhstan-government-is-now-intercepting-all-https-traffic/)：HTTPS 拦截工作[针对 Facebook，Google，Twitter 和其他站点](https://www.zdnet.com/article/kazakhstans-https-interception-efforts-target-facebook-google-twitter-others/)。[苹果、谷歌和 Mozilla](https://www.zdnet.com/article/apple-google-and-mozilla-block-kazakhstans-https-intercepting-certificate/) 最终干预并禁止了用于 HTTPS 中间人攻击的证书。

[黑客窃取了数百万保加利亚人的数据](https://www.zdnet.com/article/hacker-steals-data-of-millions-of-bulgarians-emails-it-to-local-media/)：一名黑客窃取了数百万保加利亚人的个人详细信息，并将窃取的数据的下载链接通过电子邮件发送给了本地新闻出版物。该数据窃取自该国国家税务局，[最终在网上泄露](https://www.zdnet.com/article/bulgarias-hacked-database-is-now-available-on-hacking-forums/)。

[黑客侵入了 FSB 的承包商](https://www.zdnet.com/article/hackers-breach-fsb-contractor-expose-tor-deanonymization-project/)：黑客侵入了俄罗斯国家情报局 FSB 的承包商 SyTech，他们从那里窃取了该公司代表该机构开展的内部项目的信息，包括将 Tor 流量匿名化的信息。

[iMessages 可能使你的 iPhone 变砖](https://www.zdnet.com/article/google-project-zero-reveals-bad-imessages-could-have-bricked-your-iphone/)：该漏洞在被广泛利用之前得到了修补。

[Urgent/11 安全漏洞](https://www.zdnet.com/article/urgent11-security-flaws-impact-routers-printers-scada-and-many-iot-devices/)：TCP 库中的主要错误影响了路由器、打印机、SCADA、医疗设备和许多 IoT 设备。

[苹果公司的 AWDL 协议受到安全漏洞的困扰](https://www.zdnet.com/article/apples-awdl-protocol-plagued-by-flaws-that-enable-tracking-and-mitm-attacks/)：苹果公司在五月份修补了一个错误，但学者说，其余的漏洞需要重新设计某些苹果服务。错误会启用跟踪和中间人攻击。

[DHS 警告小型飞机的 CAN 总线漏洞](https://www.zdnet.com/article/dhs-warns-about-can-bus-vulnerabilities-in-small-aircraft/)：DHS 网络安全机构 CISA 建议这些小型飞机的所有者“尽其所能”限制对飞机的访问，以防止这个漏洞可能被用来破坏飞机。

[GE 麻醉机中发现的漏洞](https://www.zdnet.com/article/vulnerabilities-found-in-ge-anesthesia-machines/)：GE 建议设备所有者不要将脆弱的麻醉机连接到医院的主要网络。该公司否认这些漏洞可能导致患者受到伤害，但后来撤回该说法并承认这些问题可能对人类生命构成危险。

[洛杉矶警方陷入数据泄露](https://www.zdnet.com/article/thousands-of-los-angeles-police-caught-up-in-data-breach-personal-records-stolen/)：黑客窃取了 2500 多名洛杉矶警察的个人记录。黑客直接通过电子邮件发送给该部门，并提供了一些据称是被盗信息的样本以支持他们的说法。

[路易斯安那州州长在当地勒索软件爆发后宣布州紧急状态](https://www.zdnet.com/article/louisiana-governor-declares-state-emergency-after-local-ransomware-outbreak/)：是的。勒索软件变得非常糟糕。然后它[袭击了德克萨斯州](https://www.zdnet.com/article/at-least-20-texas-local-governments-hit-in-coordinated-ransomware-attack/)、[牙医办公室](https://www.zdnet.com/article/ransomware-hits-hundreds-of-dentist-offices-in-the-us/)和[托管服务提供商](https://www.zdnet.com/article/ransomware-gang-hacks-msps-to-deploy-ransomware-on-customer-systems/)。

[蓝牙漏洞利用可以跟踪和识别 iOS、微软移动设备用户](https://www.zdnet.com/article/bluetooth-vulnerability-can-be-exploited-to-track-and-id-iphone-smartwatch-microsoft-tablet-users/)：尽管存在本机操作系统保护但该漏洞可用于监视用户，它影响 Windows 10、iOS 和 macOS 计算机上的蓝牙设备。其中包括 iPhone、iPad、Apple Watch、MacBook 和微软的平板电脑和笔记本电脑。

[“7-11” 日本的客户由于移动应用漏洞而损失了 50 万美元](https://www.zdnet.com/article/7-eleven-japanese-customers-lose-500000-due-to-mobile-app-flaw/)：7-11 最终关闭了该应用。

### 八月

[SWAPGSAttack CPU 漏洞](https://www.zdnet.com/article/new-windows-hack-warning-patch-intel-systems-now-to-block-swapgsattack-exploits/)：研究人员详细介绍了该硬件漏洞，它绕过了 Windows 系统上针对 Spectre 和 Meltdown CPU 漏洞的缓解措施，并影响了所有使用自 2012 年以来制造的英特尔处理器的系统。

[新的 Dragonblood 漏洞](https://www.zdnet.com/article/new-dragonblood-vulnerabilities-found-in-wifi-wpa3-standard/)：今年四月初，两名安全研究人员披露了 WiFi 联盟最近发布的 WPA3 WiFi 安全和身份验证标准中五个漏洞（[统称为 Dragonblood](https://www.zdnet.com/article/dragonblood-vulnerabilities-disclosed-in-wifi-wpa3-standard/)）的详细信息。

[14 个 iOS 零日漏洞](https://www.zdnet.com/article/google-finds-malicious-sites-pushing-ios-exploits-for-years/)：自 2016 年 9 月以来，谷歌发现了针对 14 个 iOS 漏洞的攻击，这些漏洞分为五个漏洞利用链，并已被广泛部署。

[VPN 安全漏洞](https://www.zdnet.com/article/hackers-mount-attacks-on-webmin-servers-pulse-secure-and-fortinet-vpns/)：黑客对 Pulse Secure 和 Fortinet VPN 发起攻击。

[Windows CTF 漏洞](https://www.zdnet.com/article/vulnerability-in-microsoft-ctf-protocol-goes-back-to-windows-xp/)：Microsoft CTF 协议中的漏洞可以追溯到 Windows XP。该错误允许黑客劫持任何 Windows 应用，逃脱沙箱并获得管理员权限。

[WS-Discovery 协议被滥用于 DDoS 攻击](https://www.zdnet.com/article/protocol-used-by-630000-devices-can-be-abused-for-devastating-ddos-attacks/)：该协议被 DDoS 租用服务所利用，已在实际攻击中使用。

[Capitol One 黑客事件](https://www.zdnet.com/article/100-million-americans-and-6-million-canadians-caught-up-in-capital-one-breach/)：一名黑客侵入了 Capitol One，从那里窃取了 1 亿用户的记录。她还[入侵了其他 30 家公司](https://www.zdnet.com/article/capital-one-hacker-took-data-from-more-than-30-companies-new-court-docs-reveal/)。

[Hy-Vee 卡泄露](https://www.zdnet.com/article/hy-vee-issues-warning-to-customers-after-discovering-point-of-sale-breach/)：超市连锁店 Hy-Vee 承认其某些 PoS 系统存在安全漏洞。该数据最终被在黑客论坛上出售。

[员工将核电厂连接到互联网，以便他们可以开采加密货币](https://www.zdnet.com/article/employees-connect-nuclear-plant-to-the-internet-so-they-can-mine-cryptocurrency/)：乌克兰核电厂的员工为了开采比特币而承担了不必要的安全风险。他们最终被捕。

[莫斯科的区块链投票系统在大选前一个月就被攻破了](https://www.zdnet.com/article/moscows-blockchain-voting-system-cracked-a-month-before-election/)：法国研究人员因在基于以太坊的投票系统中发现漏洞而获得 15000 美元的奖金。

[美国军方购买了价值 3280 万美元的具有已知安全风险的电子产品](https://www.zdnet.com/article/us-military-purchased-32-8m-worth-of-electronics-with-known-security-risks/)：国防部购买的易受攻击产品包括 Lexmark 打印机、GoPro相机和联想计算机。

[AT＆T 员工受贿以在公司网络上植入恶意软件](https://www.zdnet.com/article/at-t-employees-took-bribes-to-plant-malware-on-the-companys-network/)：美国司法部指控巴基斯坦男子贿赂 AT＆T 员工超过 100 万美元，以在该公司网络上安装恶意软件，解锁超过 200 万台设备。

[Windows 恶意软件会记录用户在成人网站上的访问](https://www.zdnet.com/article/windows-malware-strain-records-users-on-adult-sites/)：新的 Varenyky 木马会记录用户浏览成人网站的桌面视频。当前仅针对法国用户。

[TrickBot 木马具备协助 SIM 交换攻击的功能](https://www.zdnet.com/article/trickbot-todays-top-trojan-adds-feature-to-aid-sim-swapping-attacks/)：TrickBot 木马可以收集 Sprint、T-Mobile 和 Verizon Wireless 帐户的凭据和 PIN 码。

[战争技术](https://www.zdnet.com/article/new-warshipping-technique-gives-hackers-access-to-enterprise-offices/)：黑客可以使用包裹传递服务将黑客设备直接运送到你公司的门口。

[Instagram 踢掉了广告合作伙伴 Hyp3r](https://www.zdnet.com/article/instagram-boots-ad-partner-hyp3r-for-mass-collection-of-user-data/)：Instagram 发现该广告合作伙伴收集其用户数据。

### 九月

[Simjacker 攻击](https://www.zdnet.com/article/new-simjacker-attack-exploited-in-the-wild-to-track-users-for-at-least-two-years/)：安全研究人员详细介绍了一种基于 SMS 的攻击，该攻击可以通过滥用 SIM 卡上运行的鲜为人知的应用程序，使恶意行为者可以跟踪用户的设备。发现 [29 个国家/地区](https://www.zdnet.com/article/these-are-the-29-countries-vulnerable-to-simjacker-attacks/)的 SIM 卡受到了影响。 还发现了第二起名为 [WIBAttack](https://www.zdnet.com/article/new-sim-card-attack-disclosed-similar-to-simjacker/) 的攻击。

[智能电视间谍活动](https://www.zdnet.com/article/smart-tvs-send-user-data-to-tech-heavyweights-including-facebook-google-netflix/)：两项学术论文发现，智能电视正在收集有关用户的电视观看习惯的数据。

[Checkm8 iOS 越狱](https://www.zdnet.com/article/new-checkm8-jailbreak-released-for-all-ios-devices-running-a5-to-a11-chips/)：针对所有运行 A5 至 A11 芯片的 iOS 设备（在 iPhone 4S 以及 iPhone 8 和 X 上）发布的新 Checkm8 越狱。过去九年来，这是第一个在硬件级别起作用的越狱漏洞。

[数据库泄漏了厄瓜多尔大多数公民的数据](https://www.zdnet.com/article/database-leaks-data-on-most-of-ecuadors-citizens-including-6-7-million-children/)：Elasticsearch 服务器泄漏了有关厄瓜多尔公民其家谱和孩子的个人数据，还泄漏了一些用户的财务记录和汽车登记信息。[该公司高管随后被捕](https://www.zdnet.com/article/arrest-made-in-ecuadors-massive-data-breach/)。

[Limin PDF 泄露事件](https://www.zdnet.com/article/data-of-24-3-million-lumin-pdf-users-shared-on-hacking-forum/)：九月中旬，超过 2430 万 Lumin PDF 的用户详细信息在黑客论坛上被分享。该公司在第二天承认这次泄露。

[Heyyo 约会应用程序泄漏事件](https://www.zdnet.com/article/heyyo-dating-app-leaked-users-personal-data-photos-location-data-more/)：他们泄漏了除私人消息以外的几乎所有内容。

[vBulletin 零日漏洞和随后的黑客攻击](https://www.zdnet.com/article/anonymous-researcher-drops-vbulletin-zero-day-impacting-tens-of-thousands-of-sites/)：一位匿名安全研究人员发布了 vBulletin 论坛软件中的零日漏洞。该漏洞立即被黑客用于入侵一系列论坛。

[大量的帐户劫持事件袭击了 YouTube 创作者](https://www.zdnet.com/article/massive-wave-of-account-hijacks-hits-youtube-creators/)：汽车社区的 YouTube 创作者遭受了鱼叉式网络钓鱼攻击，这些攻击可以绕过 2FA，从而使黑客可以接管其 Google 和 YouTube 帐户。

[Lilocked（Lilu）勒索软件](https://www.zdnet.com/article/thousands-of-servers-infected-with-new-lilocked-lilu-ransomware/)：成千上万的 Linux 服务器感染了新的 Lilocked（Lilu）勒索软件。

[超过 47,000 台超微服务器正在互联网上暴露了其 BMC 端口](https://www.zdnet.com/article/over-47000-supermicro-servers-are-exposing-bmc-ports-on-the-internet/)：研究人员在超微服务器上发现了一个新的远程攻击方式，发现它在互联网上暴露了其 BMC 端口。

[勒索软件事件给公司造成了高达 9500 万美元的损失](https://www.zdnet.com/article/ransomware-incident-to-cost-danish-company-a-whopping-95-million/)：丹麦制造助听器 Demant 的勒索软件事件造成了近 9500 万美元的损失，这是迄今为止最昂贵的事件之一。

[Exim 漏洞（CVE-2019-15846）](https://www.zdnet.com/article/millions-of-exim-servers-vulnerable-to-root-granting-exploit/)：数百万的 Exim 服务器容易受到一个安全漏洞的攻击，利用该漏洞可以使攻击者能够以 root 特权运行恶意代码。

### 十月

[Avast 黑客事件](https://www.zdnet.com/article/avast-says-hackers-breached-internal-network-through-compromised-vpn-profile/)：这家捷克的杀毒软件制造商在 2017 年遭受攻击之后，披露了其受到了第二次攻击，旨在破坏 CCleaner 版本。该公司表示，黑客通过受损的 VPN 配置文件破坏了该公司。

[被广泛利用的 Android 零日漏洞](https://www.zdnet.com/article/google-finds-android-zero-day-impacting-pixel-samsung-huawei-xiaomi-devices/)：Google Project Zero 研究人员发现了被广泛利用的 Android 零日漏洞，影响了 Pixel、三星、华为、小米设备。

[Alexa 和 Google Home 设备再次被利用来网络钓鱼和窃听用户](https://www.zdnet.com/article/alexa-and-google-home-devices-leveraged-to-phish-and-eavesdrop-on-users-again/)：亚马逊、Google 在首次报告后一年多未能解决 Alexa 和 Home 设备中的安全漏洞。

[捷克当局拆除了据称是俄罗斯的网络间谍网络](https://www.zdnet.com/article/czech-authorities-dismantle-alleged-russian-cyber-espionage-network/)：捷克官员说，俄罗斯特工利用当地公司对外国目标发起网络攻击。官员们表示，运营得到了俄罗斯国家情报局 FSB 的支持以及当地大使馆的财政帮助。

[约翰内斯堡被黑客团伙勒索赎金](https://www.zdnet.com/article/city-of-johannesburg-held-for-ransom-by-hacker-gang/)：一个名为“Shadow Kill Hackers”的组织正在向当地官员索要 4 枚比特币，否则他们将在线发布该城市数据。这是在七月遭到勒索软件攻击之后对约翰内斯堡的第二次重大袭击，当时导致一些当地居民[断电](https://www.zdnet.com/article/ransomware-incident-leaves-some-johannesburg-residents-without-electricity/)。

[CPDoS 攻击事件](https://www.zdnet.com/article/cpdos-attack-can-poison-cdns-to-deliver-error-pages-instead-of-legitimate-sites/)：CloudFront、Cloudflare、Fastly、Akamai 等受到新的 CPDoS Web 缓存中毒攻击的影响。

[被广泛利用的 PHP7 RCE](https://www.zdnet.com/article/nasty-php7-remote-code-execution-bug-exploited-in-the-wild/)：新的 PHP7 错误 CVE-2019-11043 甚至可以使非技术攻击者接管运行 PHP-FPM 模块的 Nginx 服务器。

[遭受 DDoS 攻击的 macOS 系统](https://www.zdnet.com/article/macos-systems-abused-in-ddos-attacks/)：多达 4 万个 macOS 系统在线暴露了一个特定的端口，该端口可能被滥用于相当大的 DDoS 攻击。


Fedora 31 正式发布

昨晚在虚拟机里安装了一下，源的速度很快。<br />
很喜欢fedora，祝愿越来越好。

最爱fedora!

已经用上了，感觉不错！

# Fedora 31 正式发布

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

这里，我们很荣幸地宣布 Fedora 31 的发布。感谢成千上万的 Fedora 社区成员和贡献者的辛勤工作，我们现在正在庆祝又一次的准时发布。这已成为一种惯例！

如果你只想立即获取它，请立即访问 <https://getfedora.org/>。要了解详细信息，请继续阅读！

### 工具箱

如果你还没有使用过 [Fedora 工具箱](https://docs.fedoraproject.org/en-US/fedora-silverblue/toolbox/)，那么现在是尝试一下的好时机。这是用于启动和管理个人工作区容器的简单工具，你可以在一个单独的环境中进行开发或试验。它只需要在命令行运行 `toolbox enter` 就行。

这种容器化的工作流程对于基于 ostree 的 Fedora 变体（如 CoreOS、IoT 和 Silverblue）的用户至关重要，但在任何工作站甚至服务器系统上也非常有用。在接下来的几个月中，希望对该工具及其相关的用户体验进行更多增强，非常欢迎你提供反馈。

### Fedora 风味版

Fedora 的“版本”是针对特定的“展示柜”用途输出的。

Fedora 工作站版本专注于台式机，以及希望获得“可以工作的” Linux 操作系统体验的特定软件开发人员。此版本具有 GNOME 3.34，它带来了显著的性能增强，在功耗较低的硬件上尤其明显。

Fedora 服务器版本以易于部署的方式为系统管理员带来了最新的、最先进的开源服务器软件。

而且，我们还有处于预览状态下的 Fedora CoreOS（一个定义了现代容器世界分类的操作系统）和[Fedora IoT](https://iot.fedoraproject.org/)（用于“边缘计算”用例）。（敬请期待计划中的给该物联网版本的征集名称的活动！）

当然，我们不仅仅提供的是各种版本。还有面向各种受众和用例的 [Fedora Spins](https://spins.fedoraproject.org/) 和 [Labs](https://labs.fedoraproject.org/)，包括 [Fedora 天文学](https://labs.fedoraproject.org/en/astronomy/) 版本，为业余和专业的天文学家带来了完整的开源工具链，以及支持各种桌面环境（例如 [KDE Plasma](https://spins.fedoraproject.org/en/kde/) 和 [Xfce](https://spins.fedoraproject.org/en/xfce/)）。

而且，请不要忘记我们的替代架构 [ARM AArch64、Power 和 S390x](https://alt.fedoraproject.org/alt/)。特别要注意的是，我们对包括 Rock960、RockPro64 和 Rock64 在内的 Rockchip 片上系统设备的支持得到了改善，并初步支持了 “[panfrost](https://panfrost.freedesktop.org/)”，这是一种较新的开源 3D 加速图形驱动程序 Arm Mali midgard GPU。

不过，如果你使用的是只支持 32 位的 i686 旧系统，那么该找个替代方案了，[我们的基本系统告别了 32 位 Intel 架构](https://fedoramagazine.org/in-fedora-31-32-bit-i686-is-86ed/)。

### 常规改进

无论你使用哪种 Fedora 版本，你都将获得开源世界所提供的最新版本。遵循 “[First](https://docs.fedoraproject.org/en-US/project/#_first)” 准则，我们启用了 CgroupsV2（如果你使用的是 Docker，[请确保检查一下](https://fedoraproject.org/wiki/Common_F31_bugs#Docker_package_no_longer_available_and_will_not_run_by_default_.28due_to_switch_to_cgroups_v2.29)）。Glibc 2.30 和 NodeJS 12 是 Fedora 31 中许多更新的软件包之一。而且，我们已经将 `python` 命令切换为 Python 3，请记住，Python 2 在[今年年底](https://pythonclock.org/)生命期就终止了。

我们很高兴你能试用新版本！转到 <https://getfedora.org/> 并立即下载吧。或者，如果你已经在运行 Fedora 操作系统，请遵循简单的[升级说明](https://docs.fedoraproject.org/en-US/quick-docs/upgrading/)就行。

### 万一出现问题……

如果遇到问题，请查看 [Fedora 31 常见错误](https://fedoraproject.org/wiki/Common_F31_bugs)页面，如果有疑问，请访问我们的 [Ask Fedora](http://ask.fedoraproject.org) 用户支持平台。

### 谢谢大家

感谢在此发行周期中成千上万为 Fedora 项目做出贡献的人们，尤其是那些为使该发行版再次按时发行而付出更多努力的人。而且，如果你本周在波特兰参加 [USENIX LISA](https://www.usenix.org/conference/lisa19)，请在博览会大厅，在 Red Hat、Fedora 和 CentOS 展位找到我。

---

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

作者：[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/) 荣誉推出


使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法

Summary: 你可以通过多种方法来调整 Ubuntu，以自定义其外观和行为。我发现最简单的方法是使用 GNOME 优化工具。

# 使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法

你可以通过多种方法来调整 Ubuntu，以自定义其外观和行为。我发现最简单的方法是使用 [GNOME 优化工具](https://wiki.gnome.org/action/show/Apps/Tweaks?action=show&redirect=Apps%2FGnomeTweakTool)。它也被称为 GNOME Tweak 或简单地称为 Tweak（优化）。

在过去的教程中，我已经多次介绍过它。在这里，我列出了你可以使用此工具执行的所有主要优化。

我在这里使用的是 Ubuntu，但是这些步骤应该适用于使用 GNOME 桌面环境的任何 Linux 发行版。

### 在 Ubuntu 18.04 或其它版本上安装 GNOME 优化工具

GNOME 优化工具可从 [Ubuntu 中的 Universe 存储库](https://itsfoss.com/ubuntu-repositories/)中安装，因此请确保已在“软件和更新”工具中启用了该仓库：

之后，你可以从软件中心安装 GNOME 优化工具。只需打开软件中心并搜索 “GNOME Tweaks” 并从那里安装它：

或者，你也可以使用命令行通过 [apt 命令](https://itsfoss.com/apt-command-guide/)安装此软件：

```
sudo apt install gnome-tweaks
```

### 用优化工具定制 GNOME 桌面

GNOME 优化工具使你可以进行许多设置更改。其中的某些更改（例如墙纸更改、启动应用程序等）也可以在官方的“系统设置”工具中找到。我将重点介绍默认情况下“设置”中不可用的优化。

#### 1、改变主题

你可以通过各种方式[在 Ubuntu 中安装新主题](https://itsfoss.com/install-themes-ubuntu/)。但是，如果要更改为新安装的主题，则必须安装GNOME 优化工具。

你可以在“<ruby> 外观 <rt>  Appearance </rt></ruby>”部分找到主题和图标设置。你可以浏览可用的主题和图标并设置你喜欢的主题和图标。更改将立即生效。

#### 2、禁用动画以提速你的桌面体验

应用程序窗口的打开、关闭、最大化等操作都有一些细微的动画。你可以禁用这些动画以稍微加快系统的速度，因为它会稍微使用一点资源。

#### 3、控制桌面图标

至少在 Ubuntu 中，你会在桌面上看到“<ruby> 家目录 <rt>  Home </rt></ruby>”和“<ruby> 垃圾箱 <rt>  Trash </rt></ruby>”图标。如果你不喜欢，可以选择禁用它。你还可以选择要在桌面上显示的图标。

#### 4、管理 GNOME 扩展

我想你可能知道 [GNOME 扩展](https://extensions.gnome.org/)。这些是用于桌面的小型“插件”，可扩展 GNOME 桌面的功能。有[大量的 GNOME 扩展](https://itsfoss.com/best-gnome-extensions/)，可用于在顶部面板中查看 CPU 消耗、获取剪贴板历史记录等等。

我已经写了一篇[安装和使用 GNOME 扩展](https://itsfoss.com/gnome-shell-extensions/)的详细文章。在这里，我假设你已经在使用它们，如果是这样，可以从 GNOME 优化工具中对其进行管理。

#### 5、改变字体和缩放比例

你可以[在 Ubuntu 中安装新字体](https://itsfoss.com/install-fonts-ubuntu/)，并使用这个优化工具在系统范围应用字体更改。如果你认为桌面上的图标和文本太小，也可以更改缩放比例。

#### 6、控制触摸板行为，例如在键入时禁用触摸板，使触摸板右键单击可以工作

GNOME 优化工具还允许你在键入时禁用触摸板。如果你在笔记本电脑上快速键入，这将很有用。手掌底部可能会触摸触摸板，并导致光标移至屏幕上不需要的位置。

在键入时自动禁用触摸板可解决此问题。

你还会注意到[当你按下触摸板的右下角以进行右键单击时，什么也没有发生](https://itsfoss.com/fix-right-click-touchpad-ubuntu/)。你的触摸板并没有问题。这是一项系统设置，可对没有实体右键按钮的任何触摸板（例如旧的 Thinkpad 笔记本电脑）禁用这种右键单击功能。两指点击可为你提供右键单击操作。

你也可以通过在“<ruby> 鼠标单击模拟 <rt>  Mouse Click Simulation </rt></ruby>”下设置为“<ruby> 区域 <rt>  Area </rt></ruby>”中而不是“<ruby> 手指 <rt>  Fingers </rt></ruby>”来找回这项功能。

你可能必须[重新启动 Ubuntu](https://itsfoss.com/schedule-shutdown-ubuntu/) 来使这项更改生效。如果你是 Emacs 爱好者，还可以强制使用 Emacs 键盘绑定。

#### 7、改变电源设置

电源这里只有一个设置。它可以让你在盖上盖子后将笔记本电脑置于挂起模式。

#### 8、决定什么显示在顶部面板

桌面的顶部面板显示了一些重要的信息。在这里有日历、网络图标、系统设置和“<ruby> 活动 <rt>  Activities </rt></ruby>”选项。

你还可以[显示电池百分比](https://itsfoss.com/display-battery-ubuntu/)、添加日期及时间，并显示星期数。你还可以启用鼠标热角，以便将鼠标移至屏幕的左上角时可以获得所有正在运行的应用程序的活动视图。

如果将鼠标焦点放在应用程序窗口上，你会注意到其菜单显示在顶部面板中。如果你不喜欢这样，可以将其关闭，然后应用程序菜单将显示应用程序本身。

#### 9、配置应用窗口

你可以决定是否在应用程序窗口中显示最大化和最小化选项（右上角的按钮）。你也可以改变它们的位置到左边或右边。

这里还有其他一些配置选项。我不使用它们，但你可以自行探索。

#### 10、配置工作区

GNOME 优化工具还允许你围绕工作区配置一些内容。

### 总结

对于任何 GNOME 用户，GNOME 优化（Tweaks）工具都是必备工具。它可以帮助你配置桌面的外观和功能。 我感到惊讶的是，该工具甚至没有出现在 Ubuntu 的主存储库中。我认为应该默认安装它，要不，你就得在 Ubuntu 中手动安装 GNOME 优化工具。

如果你在 GNOME 优化工具中发现了一些此处没有讨论的隐藏技巧，为什么不与大家分享呢？

---

via: <https://itsfoss.com/gnome-tweak-tool/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[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/) 荣誉推出


Linux 中国徽标征集活动结果

Summary: 一等奖空缺，维持原徽标不变，二三等奖作品奖品翻倍。

把原Logo的背景色由黑色换成别的彩色试一试？象深蓝色或Ubuntu的紫色？

所有获奖者奖金均已送出，感谢诸位中奖和未中奖的贡献者！

一等奖空缺，维持原徽标不变，二三等奖作品奖品翻倍。

# Linux 中国徽标征集活动结果

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

一个月多前，我们发起了 [Linux 中国徽标征集活动](/article-11363-1.html)，陆续得到了诸位朋友的[鼎力支持](/article-11407-1.html)，并于 10 天前进入了[公开评选意见征集](/article-11488-1.html)阶段。

说实话，这次活动的举办有点仓促，我们并没有做好完美的活动计划。所以，活动中也出现了一些不足，如一些对 GitHub 操作不熟悉或非技术圈的朋友对如何通过 GitHub 提交投稿感到困难；也有一些朋友从根本上不认可征集活动，觉得原来的徽标就挺习惯，或者适当改改就行；最后，我们在公开征集过程中，通过微信投票时还出了乌龙，过多的投稿选项导致不恰当地分成了两个问题，从而影响了投票公正性。

后来，不得已，又再次根据投票结果筛选掉部分票数较低的作品，重新发起了投票。（在这次投票中，误筛选掉 water0902 这份作品，特别不好意思，再次向作者道歉。）

其实，在第一次投票后期，我们就尴尬的发现，居然还是我们原本的徽标得到票数最高。而在第二次投票结果中，原本的徽标的票数位列第二名。而 JUNEN-1 这个作品在第一次投票中的票数几乎和原本的徽标所得票数一样，第二次投票中得到了更高的票数，位列第一名。具体得票情况如下：

|  |  |  |
| --- | --- | --- |
| 投稿作品名 | 第一次投票数  | 第二次投票数 |
| 原本的徽标 | **182** | **149** |
| JUNEN-1 | **181** | **163** |
| JUNEN-2 | **167** | **136** |
| whsasf\_work3 | 126 | 8 |
| whsasf\_work2 | 120 | 8 |
| alim0x | 86 | 55 |
| garywill | 61 | 38 |
| Logo0964 | 60 | 35 |
| wxy | 58 | 27 |
| tinnx | 57 | 30 |
| lightyisu | 56 | 26 |
| RedInLinux | 55 | 24 |
| lightyisu2 | 47 | 37 |
| aimeDesign | 44 | 71 |
| 1466587594 | 40 | 32 |
| CodingOctocat | 36 | 16 |
| logoyk | 36 | 30 |
| water0902 | 32 | N/A |
| SmarterC | 29 | 18 |
| hacker | 27 | 19 |
| WSJ | 27 | 19 |
| long | 25 | 7 |
| icekylin-design-2 | 24 | 22 |
| ZIN | 23 | 10 |
| icekylin-design-3 | 20 | 8 |
| OLC | 19 | N/A |
| schiway | 17 | N/A |
| flag | 14 | N/A |
| icekylin-design-1 | 14 | N/A |
| logo0281 | 13 | N/A |
| Fine | 11 | N/A |
| kokialoves | 8 | 0 |
| lartpang | 8 | 0 |
| whsasf\_work | 8 | 0 |

在这次徽标征集活动当中，这些投票数是我们的重要参考依据，但是不是唯一依据，经过团队内部合议，我们决定仍维持原本的徽标，但是会做精简风格处理。因此，一等奖空缺。

二等奖我们决定授予 **JUNEN**，空缺一名，他提交了多份作品，而且作品均得到了比较广泛的好评。考虑到一等奖空缺，我决定将二等奖的单个奖金提升至 1000 元。

三等奖我们决定扩大到十名，授予 **alim0x**、**garywill**、**icekylin**、**water0902**、**aimeDesign**、**whsasf\_work3**、**liujiacode**（logo0964 和 logo0281）、**WSJ**、**long**、**fine**。同样，奖金翻倍为 200 元。

同时，按照活动规则，由于一等奖空缺，二、三等奖作品的版权仍然归作者所有，我们并不取得版权。

请上述中奖者加我微信 **linux\_china** ，我在验证中奖者身份后会颁发奖金。

最后，在这个征集活动中，无论您是否提交了作品，也无论是否评选中奖，我们都对诸位的积极参与和贡献致以最热忱的谢意，是你们大家，让我们觉到了社区的温暖和支持！我们必将在诸位的陪伴和支持下发展的更好！

此致敬礼，

Linux 中国 / 老王


Collapse OS：为世界末日创建的操作系统

末日吗》

末日吗》

# Collapse OS：为世界末日创建的操作系统

当大多数人考虑为末日后的世界做准备时，想到的第一件事就是准备食物和其他生活必需品。最近，有一个程序员觉得，在社会崩溃之后，创建一个多功能的、且可生存的操作系统同样重要。我们今天将尽我们所能地来了解一下它。

### Collapse OS：当文明被掩埋在垃圾中

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

这里说的操作系统称为 [Collapse OS（崩溃操作系统）](https://collapseos.org/)。根据该官方网站的说法，Collapse OS 是 “z80 内核以及一系列程序、工具和文档的集合”。 它可以让你：

* 可在最小的和临时拼凑的机器上运行。
* 通过临时拼凑的方式（串行、键盘、显示）进行接口。
* 可编辑文本文件。
* 编译适用于各种 MCU 和 CPU 的汇编源代码文件。
* 从各种存储设备读取和写入。
* 自我复制。

其创造者 [Virgil Dupras](https://github.com/hsoft) 之所以开始这个项目，是因为[他认为](https://collapseos.org/why.html)“我们的全球供应链在我们到达 2030 年之前就会崩溃”。他是根据<ruby> 巴勃罗·塞维尼 <rt>  Pablo Servigne </rt></ruby>的作品得出了这一结论的。他似乎也觉得并非所有人都会认可[他的观点](https://collapseos.org/why.html)，“话虽如此，我认为不相信到 2030 年可能会发生崩溃也是可以理解的，所以请不要为我的信念而感到受到了冲击。”

该项目的总体目标是迅速让瓦解崩溃后的文明重新回到计算机时代。电子产品的生产取决于非常复杂的供应链。一旦供应链崩溃，人类将回到一个技术水平较低的时代。要恢复我们以前的技术水平，将需要数十年的时间。Dupras 希望通过创建一个生态系统来跨越几个步骤，该生态系统将与从各种来源搜寻到的更简单的芯片一起工作。

### z80 是什么？

最初的 Collapse OS 内核是为 [z80 芯片](https://en.m.wikipedia.org/wiki/Z80)编写的。作为复古计算机历史的爱好者，我对 [Zilog](https://en.wikipedia.org/wiki/Zilog) 和 z80 芯片很熟悉。在 1970 年代后期，Zilog 公司推出了 z80，以和 [Intel 的 8080](https://en.wikipedia.org/wiki/Intel_8080) CPU 竞争。z80 被用于许多早期的个人计算机中，例如 [Sinclair ZX Spectrum](https://en.wikipedia.org/wiki/ZX_Spectrum) 和 [Tandy TRS-80](https://en.wikipedia.org/wiki/TRS-80)。这些系统中的大多数使用了 [CP/M 操作系统](https://en.wikipedia.org/wiki/CP/M)，这是当时最流行的操作系统。（有趣的是，Dupras 最初希望使用[一个开源版本的 CP/M](https://github.com/davidgiven/cpmish)，但最终决定[从头开始](https://github.com/hsoft/collapseos/issues/52)。）

在 1981 年 [IBM PC](https://en.wikipedia.org/wiki/IBM_Personal_Computer) 发布之后，z80 和 CP/M 的普及率开始下降。Zilog 确实发布了其它几种微处理器（Z8000 和 Z80000），但并没有获得成功。该公司将重点转移到了微控制器上。今天，更新后的 z80 后代产品可以在图形计算器、嵌入式设备和消费电子产品中找到。

Dupras 在 [Reddit](https://old.reddit.com/r/collapse/comments/dejmvz/collapse_os_bootstrap_postcollapse_technology/f2w3sid/?st=k1gujoau&sh=1b344da9) 上说，他为 z80 编写了 Collapse OS，因为“它已经投入生产很长时间了，并且因为它被用于许多机器上，所以拾荒者有很大的机会拿到它。”

### 该项目的当前状态和未来发展

Collapse OS 的起步相当不错。有足够的内存和存储空间它就可以进行自我复制。它可以在 [RC2014 家用计算机](https://rc2014.co.uk/)或世嘉 Master System / MegaDrive（Genesis）上运行。它可以读取 SD 卡。它有一个简单的文本编辑器。其内核由用粘合代码连接起来的模块组成。这是为了使系统具有灵活性和适应性。

还有一个详细的[路线图](https://collapseos.org/roadmap.html)列出了该项目的方向。列出的目标包括：

* 支持其他 CPU，例如 8080 和 [6502](https://en.wikipedia.org/wiki/MOS_Technology_6502)。
* 支持临时拼凑的外围设备，例如 LCD 屏幕、电子墨水显示器和 [ACIA 设备](https://en.wikipedia.org/wiki/MOS_Technology_6551)。
* 支持更多的存储方式，例如软盘、CD、SPI RAM/ROM 和 AVR MCU。
* 使它可以在其他 z80 机器上工作，例如 [TI-83+](https://en.wikipedia.org/wiki/TI-83_series#TI-83_Plus) 和 [TI-84+](https://en.wikipedia.org/wiki/TI-84_Plus_series) 图形计算器和 TRS-80s。

如果你有兴趣帮助或只是想窥视一下这个项目，请访问其 [GitHub 页面](https://github.com/hsoft/collapseos)。

### 最后的思考

坦率地说，我认为 Collapse OS 与其说是一个有用的项目，倒不如说更像是一个有趣的爱好项目（对于那些喜欢构建操作系统的人来说）。当崩溃真的到来时，我认为 GitHub 也会宕机，那么 Collapse OS 将如何分发？我无法想像，得具有多少技能的人才能够从捡来的零件中创建出一个系统。到时候会有新一代的创客们，但大多数创客们会习惯于选择 Arduino 或树莓派来构建项目，而不是从头开始。

与 Dupras 相反，我最担心的是[电磁脉冲炸弹（EMP）](https://en.wikipedia.org/wiki/Electromagnetic_pulse) 的使用。这些东西会炸毁所有的电气系统，这意味着将没有任何构建系统的可能。如果没有发生这种事情，我想我们将能够找到过去 30 年制造的那么多的 x86 组件，以保持它们运行下去。

话虽如此，对于那些喜欢为奇奇怪怪的应用编写低级代码的人来说，Collapse OS 听起来是一个有趣且具有高度挑战性的项目。如果你是这样的人，去检出 [Collapse OS](https://collapseos.org/) 代码吧。

让我提个假设的问题：你选择的世界末日操作系统是什么？请在下面的评论中告诉我们。

如果你觉得这篇文章有趣，请花一点时间在社交媒体、Hacker News 或 [Reddit](https://reddit.com/r/linuxusersgroup) 上分享。

---

via: <https://itsfoss.com/collapse-os/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[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/) 荣誉推出


RPM 包是如何从源 RPM 制作的

Summary: Fedora 中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。

Fedora 中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。

# RPM 包是如何从源 RPM 制作的

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

在[上一篇文章中，我们研究了什么是 RPM 软件包](/article-11452-1.html)。它们是包含文件和元数据的档案文件。当安装或卸载 RPM 时，此元数据告诉 RPM 在哪里创建或删除文件。正如你将在上一篇文章中记住的，元数据还包含有关“依赖项”的信息，它可以是“运行时”或“构建时”的依赖信息。

例如，让我们来看看 `fpaste`。你可以使用 `dnf` 下载该 RPM。这将下载 Fedora 存储库中可用的 `fpaste` 最新版本。在 Fedora 30 上，当前版本为 0.3.9.2：

```
$ dnf download fpaste

...
fpaste-0.3.9.2-2.fc30.noarch.rpm
```

由于这是个构建 RPM，因此它仅包含使用 `fpaste` 所需的文件：

```
$ rpm -qpl ./fpaste-0.3.9.2-2.fc30.noarch.rpm
/usr/bin/fpaste
/usr/share/doc/fpaste
/usr/share/doc/fpaste/README.rst
/usr/share/doc/fpaste/TODO
/usr/share/licenses/fpaste
/usr/share/licenses/fpaste/COPYING
/usr/share/man/man1/fpaste.1.gz
```

### 源 RPM

在此链条中的下一个环节是源 RPM。Fedora 中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。因此，要制作一个 RPM 文件，RPM（工具）需要：

* 给出必须要安装的文件，
* 例如，如果要编译出这些文件，则告诉它们如何生成这些文件，
* 告知必须在何处安装这些文件，
* 该特定软件需要其他哪些依赖才能正常工作。

源 RPM 拥有所有这些信息。源 RPM 与构建 RPM 相似，但顾名思义，它们不包含已构建的二进制文件，而是包含某个软件的源文件。让我们下载 `fpaste` 的源 RPM：

```
$ dnf download fpaste --source

...
fpaste-0.3.9.2-2.fc30.src.rpm
```

注意文件的结尾是 `src.rpm`。所有的 RPM 都是从源 RPM 构建的。你也可以使用 `dnf` 轻松检查“二进制” RPM 的源 RPM：

```
$ dnf repoquery --qf "%{SOURCERPM}" fpaste
fpaste-0.3.9.2-2.fc30.src.rpm
```

另外，由于这是源 RPM，因此它不包含构建的文件。相反，它包含有关如何从中构建 RPM 的源代码和指令：

```
$ rpm -qpl ./fpaste-0.3.9.2-2.fc30.src.rpm
fpaste-0.3.9.2.tar.gz
fpaste.spec
```

这里，第一个文件只是 `fpaste` 的源代码。第二个是 spec 文件。spec 文件是个配方，可告诉 RPM（工具）如何使用源 RPM 中包含的源代码创建 RPM（档案文件）— 它包含 RPM（工具）构建 RPM（档案文件）所需的所有信息。在 spec 文件中。当我们软件包维护人员添加软件到 Fedora 中时，我们大部分时间都花在编写和完善 spec 文件上。当软件包需要更新时，我们会回过头来调整 spec 文件。你可以在 <https://src.fedoraproject.org/browse/projects/> 的源代码存储库中查看 Fedora 中所有软件包的 spec 文件。

请注意，一个源 RPM 可能包含构建多个 RPM 的说明。`fpaste` 是一款非常简单的软件，一个源 RPM 生成一个“二进制” RPM。而 Python 则更复杂。虽然只有一个源 RPM，但它会生成多个二进制 RPM：

```
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3
python3-3.7.3-1.fc30.src.rpm
python3-3.7.4-1.fc30.src.rpm

$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-devel
python3-3.7.3-1.fc30.src.rpm
python3-3.7.4-1.fc30.src.rpm

$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-libs
python3-3.7.3-1.fc30.src.rpm
python3-3.7.4-1.fc30.src.rpm

$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-idle
python3-3.7.3-1.fc30.src.rpm
python3-3.7.4-1.fc30.src.rpm

$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-tkinter
python3-3.7.3-1.fc30.src.rpm
python3-3.7.4-1.fc30.src.rpm
```

用 RPM 行话来讲，“python3” 是“主包”，因此该 spec 文件将称为 `python3.spec`。所有其他软件包均为“子软件包”。你可以下载 python3 的源 RPM，并查看其中的内容。（提示：补丁也是源代码的一部分）：

```
$ dnf download --source python3
python3-3.7.4-1.fc30.src.rpm

$ rpm -qpl ./python3-3.7.4-1.fc30.src.rpm
00001-rpath.patch
00102-lib64.patch
00111-no-static-lib.patch
00155-avoid-ctypes-thunks.patch
00170-gc-assertions.patch
00178-dont-duplicate-flags-in-sysconfig.patch
00189-use-rpm-wheels.patch
00205-make-libpl-respect-lib64.patch
00251-change-user-install-location.patch
00274-fix-arch-names.patch
00316-mark-bdist_wininst-unsupported.patch
Python-3.7.4.tar.xz
check-pyc-timestamps.py
idle3.appdata.xml
idle3.desktop
python3.spec
```

### 从源 RPM 构建 RPM

现在我们有了源 RPM，并且其中有什么内容，我们可以从中重建 RPM。但是，在执行此操作之前，我们应该设置系统以构建 RPM。首先，我们安装必需的工具：

```
$ sudo dnf install fedora-packager
```

这将安装 `rpmbuild` 工具。`rpmbuild` 需要一个默认布局，以便它知道源 RPM 中每个必需组件的位置。让我们看看它们是什么：

```
# spec 文件将出现在哪里？
$ rpm -E %{_specdir}
/home/asinha/rpmbuild/SPECS

# 源代码将出现在哪里？
$ rpm -E %{_sourcedir}
/home/asinha/rpmbuild/SOURCES

# 临时构建目录是哪里？
$ rpm -E %{_builddir}
/home/asinha/rpmbuild/BUILD

# 构建根目录是哪里？
$ rpm -E %{_buildrootdir}
/home/asinha/rpmbuild/BUILDROOT

# 源 RPM 将放在哪里？
$ rpm -E %{_srcrpmdir}
/home/asinha/rpmbuild/SRPMS

# 构建的 RPM 将放在哪里？
$ rpm -E %{_rpmdir}
/home/asinha/rpmbuild/RPMS
```

我已经在系统上设置了所有这些目录：

```
$ cd
$ tree -L 1 rpmbuild/
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

6 directories, 0 files
```

RPM 还提供了一个为你全部设置好的工具：

```
$ rpmdev-setuptree
```

然后，确保已安装 `fpaste` 的所有构建依赖项：

```
sudo dnf builddep fpaste-0.3.9.2-3.fc30.src.rpm
```

对于 `fpaste`，你只需要 Python，并且它肯定已经安装在你的系统上（`dnf` 也使用 Python）。还可以给 `builddep` 命令一个 spec 文件，而不是源 RPM。在手册页中了解更多信息：

```
$ man dnf.plugin.builddep
```

现在我们有了所需的一切，从源 RPM 构建一个 RPM 就像这样简单：

```
$ rpmbuild --rebuild fpaste-0.3.9.2-3.fc30.src.rpm
..
..

$ tree ~/rpmbuild/RPMS/noarch/
/home/asinha/rpmbuild/RPMS/noarch/
└── fpaste-0.3.9.2-3.fc30.noarch.rpm

0 directories, 1 file
```

`rpmbuild` 将安装源 RPM 并从中构建你的 RPM。现在，你可以使用 `dnf` 安装 RPM 以使用它。当然，如前所述，如果你想在 RPM 中进行任何更改，则必须修改 spec 文件，我们将在下一篇文章中介绍 spec 文件。

### 总结

总结一下这篇文章有两点：

* 我们通常安装使用的 RPM 是包含软件的构建版本的 “二进制” RPM
* 构建 RPM 来自于源 RPM，源 RPM 包括用于生成二进制 RPM 所需的源代码和规范文件。

如果你想开始构建 RPM，并帮助 Fedora 社区维护我们提供的大量软件，则可以从这里开始： <https://fedoraproject.org/wiki/Join_the_package_collection_maintainers>

如有任何疑问，请发邮件到 [Fedora 开发人员邮件列表](https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/)，我们随时乐意为你提供帮助！

---

via: <https://fedoramagazine.org/how-rpm-packages-are-made-the-source-rpm/>

作者：[Ankur Sinha FranciscoD](https://fedoramagazine.org/author/ankursinha/) 选题：[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/) 荣誉推出


COPR 仓库中 4 个很酷的新项目（2019.10）

Summary: 本文介绍了 COPR 中一些有趣的新项目。

本文介绍了 COPR 中一些有趣的新项目。

# COPR 仓库中 4 个很酷的新项目（2019.10）

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

COPR 是个人软件仓库[集合](https://copr.fedorainfracloud.org/)，它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准；或者它可能不符合其他 Fedora 标准，尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持，或者是由项目自己背书的。但是，这是一种尝试新的或实验性的软件的一种巧妙的方式。

本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR，请参阅 [COPR 用户文档](https://docs.pagure.org/copr.copr/user_documentation.html#)。

### Nu

[Nu](https://github.com/nushell/nushell) 也被称为 Nushell，是受 PowerShell 和现代 CLI 工具启发的 shell。通过使用基于结构化数据的方法，Nu 可轻松处理命令的输出，并通过管道传输其他命令。然后将结果显示在可以轻松排序或过滤的表中，并可以用作其他命令的输入。最后，Nu 提供了几个内置命令、多 shell 和对插件的支持。

#### 安装说明

该[仓库](https://copr.fedorainfracloud.org/coprs/atim/nushell/)目前为 Fedora 30、31 和 Rawhide 提供 Nu。要安装 Nu，请使用以下命令：

```
sudo dnf copr enable atim/nushell
sudo dnf install nushell
```

### NoteKit

[NoteKit](https://github.com/blackhole89/notekit) 是一个笔记程序。它支持 Markdown 来格式化笔记，并支持使用鼠标创建手绘笔记的功能。在 NoteKit 中，笔记以树状结构进行排序和组织。

#### 安装说明

该[仓库](https://copr.fedorainfracloud.org/coprs/lyessaadi/notekit/)目前为 Fedora 29、30、31 和 Rawhide 提供 NoteKit。要安装 NoteKit，请使用以下命令：

```
sudo dnf copr enable lyessaadi/notekit
sudo dnf install notekit
```

### Crow Translate

[Crow Translate](https://github.com/crow-translate/crow-translate) 是一个翻译程序。它可以翻译文本并且可以对输入和结果发音，它还提供命令行界面。对于翻译，Crow Translate 使用 Google、Yandex 或 Bing 的翻译 API。

#### 安装说明

该[仓库](https://copr.fedorainfracloud.org/coprs/faezebax/crow-translate/)目前为 Fedora 30、31 和 Rawhide 以及 Epel 8 提供 Crow Translate。要安装 Crow Translate，请使用以下命令：

```
sudo dnf copr enable faezebax/crow-translate
sudo dnf install crow-translate
```

### dnsmeter

[dnsmeter](https://github.com/DNS-OARC/dnsmeter) 是用于测试域名服务器及其基础设施性能的命令行工具。为此，它发送 DNS 查询并计算答复数，从而测量各种统计数据。除此之外，dnsmeter 可以使用不同的加载步骤，使用 PCAP 文件中的载荷和欺骗发送者地址。

#### 安装说明

该仓库目前为 Fedora 29、30、31、Rawhide 以及 Epel 7 提供 dnsmeter。要安装 dnsmeter，请使用以下命令：

```
sudo dnf copr enable @dnsoarc/dnsmeter
sudo dnf install dnsmeter
```

---

via: <https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-october-2019/>

作者：[Dominik Turecek](https://fedoramagazine.org/author/dturecek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


由于 GIMP 是令人反感的字眼，有人将它复刻了

Summary: 在开源应用程序世界中，当社区成员希望以与其他人不同的方向来开发应用程序时，复刻是很常见的。最新的具有新闻价值的一个复刻称为 Glimpse，旨在解决用户在使用 GNU 图像处理程序（通常称为 GIMP）时遇到的某些问题。

grub蛆<br />
GNOME侏儒

来自湖北武汉的 Chrome Mobile 57.0|Android 8.1 用户

# 由于 GIMP 是令人反感的字眼，有人将它复刻了

在开源应用程序世界中，当社区成员希望以与其他人不同的方向来开发应用程序时，<ruby> 复刻 <rt>  fork </rt></ruby>是很常见的。最新的具有新闻价值的一个复刻称为 [Glimpse](https://getglimpse.app/)，旨在解决用户在使用 <ruby>   GNU 图像处理程序  <rt>  GNU Image Manipulation Program </rt></ruby>（通常称为 GIMP）时遇到的某些问题。

### 为什么创建 GIMP 的复刻？

当你访问 Glimpse 应用的[主页](https://getglimpse.app/)时，它表示该项目的目标是“尝试其他设计方向并修复长期存在的错误。”这听起来并不奇怪。但是，如果你开始阅读该项目的博客文章，则是另外一种印象。

根据该项目的[第一篇博客文章](https://getglimpse.app/posts/so-it-begins/)，他们创建了这个复刻是因为他们不喜欢 GIMP 这个名称。根据该帖子，“我们中的许多人不认为该软件的名称适用于所有用户，并且在拒绝该项目的 13 年后，我们决定复刻！”

如果你想知道为什么这些人认为 GIMP 令人讨厌，他们在[关于页面](https://getglimpse.app/about/)中回答该问题：

>
> “如果英语不是你的母语，那么你可能没有意识到 ‘gimp’ 一词有问题。在某些国家，这被视为针对残疾人的侮辱和针对不受欢迎儿童的操场侮辱。它也可以与成年人同意的某些‘天黑后’活动联系起来。”
>
>
>

他们还指出，他们并没有使这一举动脱离政治正确或过于敏感。“除了可能给边缘化社区带来的痛苦外，我们当中许多人都有过倡导自由软件的故事，比如在 GNU 图像处理程序没有被专业环境中的老板或同事视为可选项这件事上。”

他们似乎在回答许多质疑，“不幸的是，我们不得不复刻整个项目来更改其名称，我们认为有关此问题的讨论陷入了僵局，而这是最积极的前进方向。 ”

看起来 Glimpse 这个名称不是确定不变的。他们的 GitHub 页面上有个关于可能选择其他名称的[提案](https://github.com/glimpse-editor/Glimpse/issues/92)。也许他们应该放弃 GNU 这个词，我认为 IMP 这个词没有不好的含义。（LCTT 译注：反讽）

### 分叉之路

[GIMP](https://itsfoss.com/gimp-2-10-release/) 已经存在了 20 多年，因此任何形式的复刻都是一项艰巨的任务。当前，[他们正在计划](https://getglimpse.app/posts/six-week-checkpoint/)首先在 2019 年 9 月发布 Glimpse 0.1。这将是一个软复刻，这意味着在迁移到新身份时的更改将主要是装饰性的。（LCTT 译注：事实上到本译文发布时，该项目仍然处于蛋疼的 0.1 beta，也许 11 月，也许 12 月，才能发布 0.1 的正式版本。）

Glimpse 1.0 将是一个硬复刻，他们将积极更改代码库并将其添加到代码库中。他们想将 1.0 移植到 GTK3 并拥有自己的文档。他们估计，直到 2020 年 GIMP 3 发布之后才能做到。

除了 1.0，Glimpse 团队还计划打响自己的名声。他们计划进行“前端 UI 重写”。他们目前正在讨论[改用哪种语言](https://github.com/glimpse-editor/Glimpse/issues/70)。D 和 Rust 似乎有很多支持者。随着时间的流逝，他们也[希望](https://getglimpse.app/posts/so-it-begins/)“添加新功能以解决普通用户的抱怨”。

### 最后的思考

我过去曾经使用过一点 GIMP，但从来没有对它的名称感到困扰。老实说，我很长一段时间都不知道这意味着什么。有趣的是，当我在 Wikipedia 上搜索 GIMP 时，看到了一个 [GIMP 项目](https://en.wikipedia.org/wiki/The_Gimp_Project)的条目，这是纽约的一个现代舞蹈项目，其中包括残疾人。我想 gimp 并不是每个人视为一个贬低词汇的。

对我来说，更改名称似乎需要大量工作。似乎改写 UI 的想法会使项目看起来更有价值一些。我想知道他们是否会调整它以带来更经典的 UI，例如[使用 Ctrl + S 保存到 GIMP](https://itsfoss.com/how-to-solve-gimp-2-8-does-not-save-in-jpeg-or-png-format/) / Glimpse。让我们拭目以待。

如果你对该项目感兴趣，可以在 [Twitter](https://twitter.com/glimpse_editor) 上关注他们，查看其 [GitHub 帐户](https://github.com/glimpse-editor/Glimpse)，或查看其 [Patreon 页面](https://www.patreon.com/glimpse)。

你觉得被 GIMP 名称冒犯了吗？你是否认为值得对应用程序进行复刻，以便你可以对其进行重命名？在下面的评论中让我们知道。

如果你觉得这篇文章有趣，请花一点时间在社交媒体、Hacker News 或 [Reddit](https://reddit.com/r/linuxusersgroup) 上分享。

---

via: <https://itsfoss.com/gimp-fork-glimpse/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[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/) 荣誉推出


5 个 Linux 桌面上的最佳密码管理器

# 5 个 Linux 桌面上的最佳密码管理器

>
> 密码管理器是创建唯一密码并安全存储它们的有用工具，这样你无需记住密码。了解一下适用于 Linux 桌面的最佳密码管理器。
>
>
>

密码无处不在。网站、论坛、Web 应用等，你需要为其创建帐户和密码。麻烦在于密码，为各个帐户使用相同的密码会带来安全风险，因为[如果其中一个网站遭到入侵，黑客也会在其他网站上尝试相同的电子邮件密码组合](https://medium.com/@computerphonedude/one-of-my-old-passwords-was-hacked-on-6-different-sites-and-i-had-no-clue-heres-how-to-quickly-ced23edf3b62)。

但是，为所有新帐户设置独有的密码意味着你必须记住所有密码，这对普通人而言不太可能。这就是密码管理器可以提供帮助的地方。

密码管理应用会为你建议/创建强密码，并将其存储在加密的数据库中。你只需要记住密码管理器的主密码即可。

主流的现代浏览器（例如 Mozilla Firefox 和 Google Chrome）内置了密码管理器。这有帮助，但是你只能在浏览器上使用它。

有一些第三方专门的密码管理器，其中一些还提供 Linux 的原生桌面应用。在本文中，我们将筛选出可用于 Linux 的最佳密码管理器。

继续之前，我还建议你仔细阅读 [Linux 的免费密码生成器](https://itsfoss.com/password-generators-linux/)，来为你生成强大的唯一密码。

### Linux 密码管理器

>
> 可能的非 FOSS 警报！
>
>
> 我们优先考虑开源软件（有一些专有软件，请不要讨厌我！），并提供适用于 Linux 的独立桌面应用（GUI）。专有软件已高亮显示。
>
>
>

#### 1、Bitwarden

主要亮点：

* 开源
* 免费供个人使用（可选付费升级）
* 云服务器的端到端加密
* 跨平台
* 有浏览器扩展
* 命令行工具

Bitwarden 是 Linux 上最令人印象深刻的密码管理器之一。老实说，直到现在我才知道它。我已经从 [LastPass](https://www.lastpass.com/) 切换到了它。我能够轻松地从 LastPass 导入数据，而没有任何问题和困难。

付费版本的价格仅为每年 10 美元。这似乎是值得的（我已经为个人使用进行了升级）。

它是一个开源解决方案，因此没有任何可疑之处。你甚至可以将其托管在自己的服务器上，并为你的组织创建密码解决方案。

除此之外，你还将获得所有必需的功能，例如用于登录的两步验证、导入/导出凭据、指纹短语（唯一键）、密码生成器等等。

你可以免费将帐户升级为组织帐户，以便最多与 2 个用户共享你的信息。但是，如果你想要额外的加密存储以及与 5 个用户共享密码的功能，那么付费升级的费用低至每月 1 美元。我认为绝对值得一试！

* [Bitwarden](https://bitwarden.com/)

#### 2、Buttercup

主要亮点：

* 开源
* 免费，没有付费方式。
* 跨平台
* 有浏览器扩展

这是 Linux 中的另一个开源密码管理器。Buttercup 可能不是一个非常流行的解决方案。但是，如果你在寻找一种更简单的保存凭据的方法，那么这将是一个不错的开始。

与其他软件不同，你不必对怀疑其云服务器的安全，因为它只支持离线使用并支持连接 [Dropbox](https://www.dropbox.com/)、[OwnCloud](https://owncloud.com/)、[Nextcloud](https://nextcloud.com/) 和 [WebDAV](https://en.wikipedia.org/wiki/WebDAV) 等云服务。

因此，如果需要同步数据，那么可以选择云服务。你有不同选择。

* [Buttercup](https://buttercup.pw/)

#### 3、KeePassXC

主要亮点：

* 开源
* 简单的密码管理器
* 跨平台
* 没有移动设备支持

KeePassXC 是 [KeePassX](https://www.keepassx.org/) 的社区分支，它最初是 Windows 上 [KeePass](https://keepass.info/) 的 Linux 移植版本。

除非你没意识到，KeePassX 已经多年没有维护。因此，如果你在寻找简单易用的密码管理器，那么 KeePassXC 是一个不错的选择。KeePassXC 可能不是最漂亮或最好的密码管理器，但它确实可以做到该做的事。

它也是安全和开源的。我认为这值得一试，你说呢？

* [KeePassXC](https://keepassxc.org)

#### 4、Enpass （非开源）

主要亮点：

* 专有软件
* 有许多功能，包括对“可穿戴”设备支持。
* Linux 完全免费（具有付费支持）

Enpass 是非常流行的跨平台密码管理器。即使它不是开源解决方案，但还是有很多人依赖它。因此，至少可以肯定它是可行的。

它提供了很多功能，如果你有可穿戴设备，它也可以支持它，这点很少见。

很高兴能看到 Enpass 积极管理 Linux 发行版的软件包。另外，请注意，它仅适用于 64 位系统。你可以在它的网站上找到[官方的安装说明](https://www.enpass.io/support/kb/general/how-to-install-enpass-on-linux/)。它需要使用终端，但是我按照步骤进行了测试，它非常好用。

* [Enpass](https://www.enpass.io/)

#### 5、myki （非开源）

主要亮点：

* 专有软件
* 不使用云服务器存储密码
* 专注于本地点对点同步
* 能够在移动设备上用指纹 ID 替换密码

这可能不是一个受欢迎的建议，但我发现它很有趣。它是专有软件密码管理器，它让你避免使用云服务器，而是依靠点对点同步。

因此，如果你不想使用任何云服务器来存储你的信息，那么它适合你。另外值得注意的是，用于 Android 和 iOS 的程序可让你用指纹 ID 替换密码。如果你希望便于在手机上使用，又有桌面密码管理器的基本功能，这似乎是个不错的选择。

但是，如果你选择升级到付费版，这有个付费计划供你判断，绝对不便宜。

尝试一下，让我们知道它如何!

* [myki](https://myki.com/)

### 其他一些值得说的密码管理器

即使没有为 Linux 提供独立的应用，但仍有一些密码管理器值得一提。

如果你需要使用基于浏览器的（扩展）密码管理器，建议你尝试使用 [LastPass](https://lastpass.com/)、[Dashlane](https://www.dashlane.com/) 和 [1Password](https://1password.com/)。LastPass 甚至提供了 [Linux 客户端（和命令行工具）](https://lastpass.com/misc_download2.php)。

如果你正在寻找命令行密码管理器，那你应该试试 [Pass](https://www.passwordstore.org/)。

[Password Safe](https://pwsafe.org/) 也是种选择，但它的 Linux 客户端还处于 beta 阶段。我不建议依靠 “beta” 程序来存储密码。还有 [Universal Password Manager](http://upm.sourceforge.net/)，但它不再维护。你可能也听说过 [Password Gorilla](https://github.com/zdia/gorilla/wiki)，但并它没有积极维护。

### 总结

目前，Bitwarden 似乎是我个人的最爱。但是，在 Linux 上有几个替代品可供选择。你可以选择提供原生应用的程序，也可选择浏览器插件，选择权在你。

如果我有错过值得尝试的密码管理器，请在下面的评论中告诉我们。与往常一样，我们会根据你的建议扩展列表。

---

via: <https://itsfoss.com/password-managers-linux/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Java 中初始化数组

# Java 中初始化数组

>
> 数组是一种有用的数据类型，用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。
>
>
>

<img src="content_image/album_201911_03_133858thw7h2enpdvhhv0t.jpg" alt="Coffee beans and a cup of coffee" title="Coffee beans and a cup of coffee">

有使用 C 或者 FORTRAN 语言编程经验的人会对数组的概念很熟悉。它们基本上是一个连续的内存块，其中每个位置都是某种数据类型：整型、浮点型或者诸如此类的数据类型。

Java 的情况与此类似，但是有一些额外的问题。

### 一个数组的示例

让我们在 Java 中创建一个长度为 10 的整型数组：

```
int[] ia = new int[10];
```

上面的代码片段会发生什么？从左到右依次是：

1. 最左边的 `int[]` 将变量的*类型*声明为 `int` 数组（由 `[]` 表示）。
2. 它的右边是变量的名称，当前为 `ia`。
3. 接下来，`=` 告诉我们，左侧定义的变量赋值为右侧的内容。
4. 在 `=` 的右侧，我们看到了 `new`，它在 Java 中表示一个对象正在*被初始化中*，这意味着已为其分配存储空间并调用了其构造函数（[请参见此处以获取更多信息](https://opensource.com/article/19/8/what-object-java)）。
5. 然后，我们看到 `int[10]`，它告诉我们正在初始化的这个对象是包含 10 个整型的数组。

因为 Java 是强类型的，所以变量 `ia` 的类型必须跟 `=` 右侧表达式的类型兼容。

### 初始化示例数组

让我们把这个简单的数组放在一段代码中，并尝试运行一下。将以下内容保存到一个名为 `Test1.java` 的文件中，使用 `javac` 编译，使用 `java` 运行（当然是在终端中）：

```
import java.lang.*;

public class Test1 {

    public static void main(String[] args) {
        int[] ia = new int[10];                              // 见下文注 1
        System.out.println("ia is " + ia.getClass());        // 见下文注 2
        for (int i = 0; i < ia.length; i++)                  // 见下文注 3
            System.out.println("ia[" + i + "] = " + ia[i]);  // 见下文注 4
    }

}
```

让我们来看看最重要的部分。

1. 我们声明和初始化了长度为 10 的整型数组，即 `ia`，这显而易见。
2. 在下面的行中，我们看到表达式 `ia.getClass()`。没错，`ia` 是属于一个*类*的*对象*，这行代码将告诉我们是哪个类。
3. 在紧接的下一行中，我们看到了一个循环 `for (int i = 0; i < ia.length; i++)`，它定义了一个循环索引变量 `i`，该变量遍历了从 0 到比 `ia.length` 小 1 的序列，这个表达式告诉我们在数组 `ia` 中定义了多少个元素。
4. 接下来，循环体打印出 `ia` 的每个元素的值。

当这个程序编译和运行时，它产生以下结果：

```
me@mydesktop:~/Java$ javac Test1.java
me@mydesktop:~/Java$ java Test1
ia is class [I
ia[0] = 0
ia[1] = 0
ia[2] = 0
ia[3] = 0
ia[4] = 0
ia[5] = 0
ia[6] = 0
ia[7] = 0
ia[8] = 0
ia[9] = 0
me@mydesktop:~/Java$
```

`ia.getClass()` 的输出的字符串表示形式是 `[I`，它是“整数数组”的简写。与 C 语言类似，Java 数组以第 0 个元素开始，扩展到第 `<数组大小> - 1` 个元素。如上所见，我们可以看到数组 `ia` 的每个元素都（似乎由数组构造函数）设置为零。

所以，就这些吗？声明类型，使用适当的初始化器，就完成了吗?

好吧，并没有。在 Java 中有许多其它方法来初始化数组。

### 为什么我要初始化一个数组，有其它方式吗？

像所有好的问题一样，这个问题的答案是“视情况而定”。在这种情况下，答案取决于初始化后我们希望对数组做什么。

在某些情况下，数组自然会作为一种累加器出现。例如，假设我们正在编程实现计算小型办公室中一组电话分机接收和拨打的电话数量。一共有 8 个分机，编号为 1 到 8，加上话务员的分机，编号为 0。 因此，我们可以声明两个数组：

```
int[] callsMade;
int[] callsReceived;
```

然后，每当我们开始一个新的累计呼叫统计数据的周期时，我们就将每个数组初始化为：

```
callsMade = new int[9];
callsReceived = new int[9];
```

在每个累计通话统计数据的最后阶段，我们可以打印出统计数据。粗略地说，我们可能会看到：

```
import java.lang.*;
import java.io.*;

public class Test2 {

    public static void main(String[] args) {

        int[] callsMade;
        int[] callsReceived;

        // 初始化呼叫计数器

        callsMade = new int[9];
        callsReceived = new int[9];

        // 处理呼叫……
        //   分机拨打电话：callsMade[ext]++
        //   分机接听电话：callsReceived[ext]++

        // 汇总通话统计

        System.out.printf("%3s%25s%25s\n", "ext", " calls made",
                "calls received");
        for (int ext = 0; ext < callsMade.length; ext++) {
            System.out.printf("%3d%25d%25d\n", ext,
                    callsMade[ext], callsReceived[ext]);
        }

    }

}
```

这会产生这样的输出：

```
me@mydesktop:~/Java$ javac Test2.java
me@mydesktop:~/Java$ java Test2
ext               calls made           calls received
  0                        0                        0
  1                        0                        0
  2                        0                        0
  3                        0                        0
  4                        0                        0
  5                        0                        0
  6                        0                        0
  7                        0                        0
  8                        0                        0
me@mydesktop:~/Java$
```

看来这一天呼叫中心不是很忙。

在上面的累加器示例中，我们看到由数组初始化程序设置的零起始值可以满足我们的需求。但是在其它情况下，这个起始值可能不是正确的选择。

例如，在某些几何计算中，我们可能需要将二维数组初始化为单位矩阵（除沿主对角线———左上角到右下角——以外所有全是零）。我们可以选择这样做：

```
double[][] m = new double[3][3];
for (int d = 0; d < 3; d++) {
    m[d][d] = 1.0;
}
```

在这种情况下，我们依靠数组初始化器 `new double[3][3]` 将数组设置为零，然后使用循环将主对角线上的元素设置为 1。在这种简单情况下，我们可以使用 Java 提供的快捷方式：

```
double[][] m = {
        {1.0, 0.0, 0.0},
        {0.0, 1.0, 0.0},
        {0.0, 0.0, 1.0}};
```

这种可视结构特别适用于这种应用程序，在这种应用程序中，它便于复查数组的实际布局。但是在这种情况下，行数和列数只在运行时确定时，我们可能会看到这样的东西:

```
int nrc;
// 一些代码确定行数和列数 = nrc
double[][] m = new double[nrc][nrc];
for (int d = 0; d < nrc; d++) {
    m[d][d] = 1.0;
}
```

值得一提的是，Java 中的二维数组实际上是数组的数组，没有什么能阻止无畏的程序员让这些第二层数组中的每个数组的长度都不同。也就是说，下面这样的事情是完全合法的：

```
int [][] differentLengthRows = {
     {1, 2, 3, 4, 5},
     {6, 7, 8, 9},
     {10, 11, 12},
     {13, 14},
     {15}};
```

在涉及不规则形状矩阵的各种线性代数应用中，可以应用这种类型的结构（有关更多信息，请参见[此 Wikipedia 文章](https://en.wikipedia.org/wiki/Irregular_matrix)）。除此之外，既然我们了解到二维数组实际上是数组的数组，那么以下内容也就不足为奇了：

```
differentLengthRows.length
```

可以告诉我们二维数组 `differentLengthRows` 的行数，并且：

```
differentLengthRows[i].length
```

告诉我们 `differentLengthRows` 第 `i` 行的列数。

### 深入理解数组

考虑到在运行时确定数组大小的想法，我们看到数组在实例化之前仍需要我们知道该大小。但是，如果在处理完所有数据之前我们不知道大小怎么办？这是否意味着我们必须先处理一次以找出数组的大小，然后再次处理？这可能很难做到，尤其是如果我们只有一次机会使用数据时。

[Java 集合框架](https://en.wikipedia.org/wiki/Java_collections_framework)很好地解决了这个问题。提供的其中一项是 `ArrayList` 类，它类似于数组，但可以动态扩展。为了演示 `ArrayList` 的工作原理，让我们创建一个 `ArrayList` 对象并将其初始化为前 20 个[斐波那契数字](https://en.wikipedia.org/wiki/Fibonacci_number)：

```
import java.lang.*;
import java.util.*;

public class Test3 {

    public static void main(String[] args) {

        ArrayList<Integer> fibos = new ArrayList<Integer>();

        fibos.add(0);
        fibos.add(1);
        for (int i = 2; i < 20; i++) {
            fibos.add(fibos.get(i - 1) + fibos.get(i - 2));
        }

        for (int i = 0; i < fibos.size(); i++) {
            System.out.println("fibonacci " + i + " = " + fibos.get(i));
        }

    }
}
```

上面的代码中，我们看到：

* 用于存储多个 `Integer` 的 `ArrayList` 的声明和实例化。
* 使用 `add()` 附加到 `ArrayList` 实例。
* 使用 `get()` 通过索引号检索元素。
* 使用 `size()` 来确定 `ArrayList` 实例中已经有多少个元素。

这里没有展示 `put()` 方法，它的作用是将一个值放在给定的索引号上。

该程序的输出为：

```
fibonacci 0 = 0
fibonacci 1 = 1
fibonacci 2 = 1
fibonacci 3 = 2
fibonacci 4 = 3
fibonacci 5 = 5
fibonacci 6 = 8
fibonacci 7 = 13
fibonacci 8 = 21
fibonacci 9 = 34
fibonacci 10 = 55
fibonacci 11 = 89
fibonacci 12 = 144
fibonacci 13 = 233
fibonacci 14 = 377
fibonacci 15 = 610
fibonacci 16 = 987
fibonacci 17 = 1597
fibonacci 18 = 2584
fibonacci 19 = 4181
```

`ArrayList` 实例也可以通过其它方式初始化。例如，可以给 `ArrayList` 构造器提供一个数组，或者在编译过程中知道初始元素时也可以使用 `List.of()` 和 `array.aslist()` 方法。我发现自己并不经常使用这些方式，因为我对 `ArrayList` 的主要用途是当我只想读取一次数据时。

此外，对于那些喜欢在加载数据后使用数组的人，可以使用 `ArrayList` 的 `toArray()` 方法将其实例转换为数组；或者，在初始化 `ArrayList` 实例之后，返回到当前数组本身。

Java 集合框架提供了另一种类似数组的数据结构，称为 `Map`（映射）。我所说的“类似数组”是指 `Map` 定义了一个对象集合，它的值可以通过一个键来设置或检索，但与数组（或 `ArrayList`）不同，这个键不需要是整型数；它可以是 `String` 或任何其它复杂对象。

例如，我们可以创建一个 `Map`，其键为 `String`，其值为 `Integer` 类型，如下：

```
Map<String, Integer> stoi = new Map<String, Integer>();
```

然后我们可以对这个 `Map` 进行如下初始化：

```
stoi.set("one",1);
stoi.set("two",2);
stoi.set("three",3);
```

等类似操作。稍后，当我们想要知道 `"three"` 的数值时，我们可以通过下面的方式将其检索出来：

```
stoi.get("three");
```

在我的认知中，`Map` 对于将第三方数据集中出现的字符串转换为我的数据集中的一致代码值非常有用。作为[数据转换管道](https://towardsdatascience.com/data-science-for-startups-data-pipelines-786f6746a59a)的一部分，我经常会构建一个小型的独立程序，用作在处理数据之前清理数据；为此，我几乎总是会使用一个或多个 `Map`。

值得一提的是，`ArrayList` 的 `ArrayList` 和 `Map` 的 `Map` 是很可能的，有时也是合理的。例如，假设我们在看树，我们对按树种和年龄范围累计树的数目感兴趣。假设年龄范围定义是一组字符串值（“young”、“mid”、“mature” 和 “old”），物种是 “Douglas fir”、“western red cedar” 等字符串值，那么我们可以将这个 `Map` 中的 `Map` 定义为：

```
Map<String, Map<String, Integer>> counter = new Map<String, Map<String, Integer>>();
```

这里需要注意的一件事是，以上内容仅为 `Map` 的*行*创建存储。因此，我们的累加代码可能类似于：

```
// 假设我们已经知道了物种和年龄范围
if (!counter.containsKey(species)) {
    counter.put(species,new Map<String, Integer>());
}
if (!counter.get(species).containsKey(ageRange)) {
    counter.get(species).put(ageRange,0);
}
```

此时，我们可以这样开始累加：

```
counter.get(species).put(ageRange, counter.get(species).get(ageRange) + 1);
```

最后，值得一提的是（Java 8 中的新特性）Streams 还可以用来初始化数组、`ArrayList` 实例和 `Map` 实例。关于此特性的详细讨论可以在[此处](https://stackoverflow.com/questions/36885371/lambda-expression-to-initialize-array)和[此处](https://stackoverflow.com/questions/32868665/how-to-initialize-a-map-using-a-lambda)中找到。

---

via: <https://opensource.com/article/19/10/initializing-arrays-java>

作者：[Chris Hermansen](https://opensource.com/users/clhermansen) 选题：[lujun9972](https://github.com/lujun9972) 译者：[laingke](https://github.com/laingke) 校对：[wxy](https://github.com/wxy)

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


开源 CMS Ghost 3.0 发布，带来新功能

Summary: Ghost 是目前最好的开源 CMS 之一。它主要聚焦于创建轻量级、快速加载、界面美观的博客。

# 开源 CMS Ghost 3.0 发布，带来新功能

[Ghost](https://itsfoss.com/recommends/ghost/) 是一个自由开源的内容管理系统（CMS）。如果你还不了解 CMS，那我在此解释一下。CMS 是一种软件，用它可以构建主要专注于创建内容的网站，而无需了解 HTML 和其他与 Web 相关的技术。

事实上，Ghost 是目前[最好的开源 CMS](https://itsfoss.com/open-source-cms/) 之一。它主要聚焦于创建轻量级、快速加载、界面美观的博客。

Ghost 系统有一个现代直观的编辑器，该编辑器内置 SEO（搜索引擎优化）功能。你也可以用本地桌面（包括 Linux 系统）和移动应用程序。如果你喜欢终端，也可以使用其提供的 CLI（命令行界面）工具。

让我们看看 Ghost 3.0 带来了什么新功能。

### Ghost 3.0 的新功能

我通常对开源的 CMS 解决方案很感兴趣。因此，在阅读了官方公告后，我通过在 Digital Ocean 云服务器上安装新的 Ghost 实例来进一步尝试它。

与以前的版本相比，Ghost 3.0 在功能和用户界面上的改进给我留下了深刻的印象。

在此，我将列出一些值得一提的关键点。

#### 书签卡

除了编辑器的所有细微更改之外，3.0 版本现在支持通过输入 URL 添加漂亮的书签卡。

如果你使用过 WordPress（你可能已经注意到，WordPress 需要添加一个插件才能添加类似的卡片），所以该功能绝对是 Ghost 3.0 系统的一个最大改进。

#### 改进的 WordPress 迁移插件

我没有专门对此进行测试，但它更新了 WordPress 的迁移插件，可以让你轻松地将帖子（带有图片）克隆到 Ghost CMS。

基本上，使用该插件，你就能够创建一个存档（包含图片）并将其导入到 Ghost CMS。

#### 响应式图像库和图片

为了使用户体验更好，Ghost 团队还更新了图像库（现已为响应式），以便在所有设备上舒适地呈现你的图片集。

此外，帖子和页面中的图片也更改为响应式的了。

#### 添加成员和订阅选项

虽然，该功能目前还处于测试阶段，但如果你是以此平台作为维持你业务关系的重要发布平台，你可以为你的博客添加成员、订阅选项。

该功能可以确保只有订阅的成员才能访问你的博客，你也可以选择让未订阅者也可以访问。

#### Stripe：集成支付功能

默认情况下，该版本支持 Stripe 付款网关，帮助你轻松启用订阅功能（或使用任何类型的付款的付款方式），而 Ghost 不收取任何额外费用。

#### 新的应用程序集成

你现在可以在 Ghost 3.0 的博客中集成各种流行的应用程序/服务。它可以使很多事情自动化。

#### 默认主题改进

引入的默认主题（设计）已得到改进，现在也提供了夜间模式。

你也可以随时选择创建自定义主题（如果没有可用的预置主题）。

#### 其他小改进

除了所有关键亮点以外，用于创建帖子/页面的可视编辑器也得到了改进（具有某些拖放功能）。

我确定还有很多技术方面的更改，如果你对此感兴趣，可以在他们的[更改日志](https://ghost.org/faq/upgrades/)中查看。

### Ghost 影响力渐增

要在以 WordPress 为主导的世界中获得认可并不是一件容易的事。但 Ghost 逐渐形成了它的一个专门的发布者社区。

不仅如此，它的托管服务 [Ghost Pro](https://itsfoss.com/recommends/ghost-pro/) 现在拥有像 NASA、Mozilla 和 DuckDuckGo 这样的客户。

在过去的六年中，Ghost 从其 Ghost Pro 客户那里获得了 500 万美元的收入。就从它是致力于开源系统解决方案的非营利组织这一点来讲，这确实是一项成就。

这些收入有助于它们保持独立，避免风险投资家的外部资金投入。Ghost CMS 的托管客户越多，投入到免费和开源的 CMS 的研发款项就越多。

总体而言，Ghost 3.0 是迄今为止提供的最好的升级版本。这些功能给我留下了深刻的印象。

如果你拥有自己的网站，你会使用什么 CMS？你曾经使用过 Ghost 吗？你的体验如何？请在评论部分分享你的想法。

---

via: <https://itsfoss.com/ghost-3-release/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Morisun029](https://github.com/Morisun029) 校对：[wxy](https://github.com/wxy)

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


如何在 CentOS 8 和 RHEL 8 服务器上启用 EPEL 仓库

Summary: EPEL 仓库提供了额外的软件包，这些软件在 CentOS 8 和 RHEL 8 的默认软件包仓库中不可用。

# 如何在 CentOS 8 和 RHEL 8 服务器上启用 EPEL 仓库

EPEL 代表 “Extra Packages for Enterprise Linux”，它是一个自由开源的附加软件包仓库，可用于 CentOS 和 RHEL 服务器。顾名思义，EPEL 仓库提供了额外的软件包，这些软件在 [CentOS 8](https://www.linuxtechi.com/centos-8-installation-guide-screenshots/) 和 [RHEL 8](https://www.linuxtechi.com/install-configure-kvm-on-rhel-8/) 的默认软件包仓库中不可用。

在本文中，我们将演示如何在 CentOS 8 和 RHEL 8 服务器上启用和使用 EPEL 存储库。

### EPEL 仓库的先决条件

* 最小化安装的 CentOS 8 和 RHEL 8 服务器
* root 或 sudo 管理员权限
* 网络连接

### 在 RHEL 8.x 服务器上安装并启用 EPEL 仓库

登录或 SSH 到你的 RHEL 8.x 服务器，并执行以下 `dnf` 命令来安装 EPEL rpm 包，

```
[root@linuxtechi ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
```

上面命令的输出将如下所示，

EPEL rpm 包成功安装后，它将自动启用并配置其 yum/dnf 仓库。运行以下 `dnf` 或 `yum` 命令，以验证是否启用了 EPEL 仓库，

```
[root@linuxtechi ~]# dnf repolist epel
或者
[root@linuxtechi ~]# dnf repolist epel -v
```

### 在 CentOS 8.x 服务器上安装并启用 EPEL 仓库

登录或 SSH 到你的 CentOS 8 服务器，并执行以下 `dnf` 或 `yum` 命令来安装 `epel-release` rpm 软件包。在 CentOS 8 服务器中，EPEL rpm 在其默认软件包仓库中。

```
[root@linuxtechi ~]# dnf install epel-release -y
或者
[root@linuxtechi ~]# yum install epel-release -y
```

执行以下命令来验证 CentOS 8 服务器上 EPEL 仓库的状态，

```
[root@linuxtechi ~]# dnf repolist epel
Last metadata expiration check: 0:00:03 ago on Sun 13 Oct 2019 04:18:05 AM BST.
repo id              repo name                                               status
*epel                Extra Packages for Enterprise Linux 8 - x86_64          1,977
[root@linuxtechi ~]#
[root@linuxtechi ~]# dnf repolist epel -v
……………………
Repo-id      : epel
Repo-name    : Extra Packages for Enterprise Linux 8 - x86_64
Repo-status  : enabled
Repo-revision: 1570844166
Repo-updated : Sat 12 Oct 2019 02:36:32 AM BST
Repo-pkgs    : 1,977
Repo-size    : 2.1 G
Repo-metalink: https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=stock&content=centos
  Updated    : Sun 13 Oct 2019 04:28:24 AM BST
Repo-baseurl : rsync://repos.del.extreme-ix.org/epel/8/Everything/x86_64/ (34 more)
Repo-expire  : 172,800 second(s) (last: Sun 13 Oct 2019 04:28:24 AM BST)
Repo-filename: /etc/yum.repos.d/epel.repo
Total packages: 1,977
[root@linuxtechi ~]#
```

以上命令的输出说明我们已经成功启用了 EPEL 仓库。让我们在 EPEL 仓库上执行一些基本操作。

### 列出 EPEL 仓库种所有可用包

如果要列出 EPEL 仓库中的所有的软件包，请运行以下 `dnf` 命令，

```
[root@linuxtechi ~]# dnf repository-packages epel list
……………
Last metadata expiration check: 0:38:18 ago on Sun 13 Oct 2019 04:28:24 AM BST.
Installed Packages
epel-release.noarch                   8-6.el8                @epel
Available Packages
BackupPC.x86_64                       4.3.1-2.el8            epel
BackupPC-XS.x86_64                    0.59-3.el8             epel
CGSI-gSOAP.x86_64                     1.3.11-7.el8           epel
CGSI-gSOAP-devel.x86_64               1.3.11-7.el8           epel
Field3D.x86_64                        1.7.2-16.el8           epel
Field3D-devel.x86_64                  1.7.2-16.el8           epel
GraphicsMagick.x86_64                 1.3.33-1.el8           epel
GraphicsMagick-c++.x86_64             1.3.33-1.el8           epel
…………………………
zabbix40-web-mysql.noarch             4.0.12-1.el8           epel
zabbix40-web-pgsql.noarch             4.0.12-1.el8           epel
zerofree.x86_64                       1.1.1-3.el8            epel
zimg.x86_64                           2.8-4.el8              epel
zimg-devel.x86_64                     2.8-4.el8              epel
zstd.x86_64                           1.4.2-1.el8            epel
zvbi.x86_64                           0.2.35-9.el8           epel
zvbi-devel.x86_64                     0.2.35-9.el8           epel
zvbi-fonts.noarch                     0.2.35-9.el8           epel
[root@linuxtechi ~]#
```

### 从 EPEL 仓库中搜索软件包

假设我们要搜索 EPEL 仓库中的 Zabbix 包，请执行以下 `dnf` 命令，

```
[root@linuxtechi ~]# dnf repository-packages epel list | grep -i zabbix
```

上面命令的输出类似下面这样，

### 从 EPEL 仓库安装软件包

假设我们要从 EPEL 仓库安装 htop 包，运行以下 `dnf` 命令，

语法：

```
# dnf –enablerepo=”epel” install <包名>
```

```
[root@linuxtechi ~]# dnf --enablerepo="epel" install htop -y
```

注意：如果我们在上面的命令中未指定 `–enablerepo=epel`，那么它将在所有可用的软件包仓库中查找 htop 包。

本文就是这些内容了，我希望上面的步骤能帮助你在 CentOS 8 和 RHEL 8 服务器上启用并配置 EPEL 仓库，请在下面的评论栏分享你的评论和反馈。

---

via: <https://www.linuxtechi.com/enable-epel-repo-centos8-rhel8-server/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


SQLite 真的很容易编译

Summary: 事实证明，这个过程超麻烦（如通常一样），但是非常有趣！

事实证明，这个过程超麻烦（如通常一样），但是非常有趣！

# SQLite 真的很容易编译

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

上周，我一直在做一个 SQL 网站（<https://sql-steps.wizardzines.com/>，一个 SQL 示例列表）。我使用 sqlite 运行网站上的所有查询，并且我想在其中一个例子（[这个](https://sql-steps.wizardzines.com/lag.html)）中使用窗口函数。

但是我使用的是 Ubuntu 18.04 中的 sqlite 版本，它太旧了，不支持窗口函数。所以我需要升级 sqlite！

事实证明，这个过程超麻烦（如通常一样），但是非常有趣！我想起了一些有关可执行文件和共享库如何工作的信息，结论令人满意。所以我想在这里写下来。

（剧透：<https://www.sqlite.org/howtocompile.html> 中解释了如何编译 SQLite，它只需花费 5 秒左右，这比我平时从源码编译的体验容易了许多。）

### 尝试 1：从它的网站下载 SQLite 二进制文件

[SQLite 的下载页面](https://www.sqlite.org/download.html)有一个用于 Linux 的 SQLite 命令行工具的二进制文件的链接。我下载了它，它可以在笔记本电脑上运行，我以为这就完成了。

但是后来我尝试在构建服务器（Netlify） 上运行它，得到了这个极其奇怪的错误消息：“File not found”。我进行了追踪，并确定 `execve` 返回错误代码 ENOENT，这意味着 “File not found”。这有点令人发狂，因为该文件确实存在，并且有正确的权限。

我搜索了这个问题（通过搜索 “execve enoen”），找到了[这个 stackoverflow 中的答案](https://stackoverflow.com/questions/5234088/execve-file-not-found-when-stracing-the-very-same-file)，它指出要运行二进制文件，你不仅需要二进制文件存在！你还需要它的**加载程序**才能存在。（加载程序的路径在二进制文件内部）

要查看加载程序的路径，可以使用 `ldd`，如下所示：

```
$ ldd sqlite3
    linux-gate.so.1 (0xf7f9d000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7f70000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7e6e000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7e4f000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7c73000)
    /lib/ld-linux.so.2
```

所以 `/lib/ld-linux.so.2` 是加载程序，而该文件在构建服务器上不存在，可能是因为 Xenial（Xenial 是 Ubuntu 16.04，本文应该使用的是 18.04 “Bionic Beaver”）安装程序不支持 32 位二进制文件（？），因此我需要尝试一些不同的东西。

### 尝试 2：安装 Debian sqlite3 软件包

好吧，我想我也许可以安装来自 [debian testing 的 sqlite 软件包](https://packages.debian.org/bullseye/amd64/sqlite3/download)。尝试从另一个我不使用的 Debian 版本安装软件包并不是一个好主意，但是出于某种原因，我还是决定尝试一下。

这次毫不意外地破坏了我计算机上的 sqlite（这也破坏了 git），但我设法通过 `sudo dpkg --purge --force-all libsqlite3-0` 恢复了，并使所有依赖于 sqlite 的软件再次工作。

### 尝试 3：提取 Debian sqlite3 软件包

我还尝试仅从 Debian sqlite 软件包中提取 sqlite3 二进制文件并运行它。毫不意外，这也行不通，但这个更容易理解：我有旧版本的 libreadline（`.so.7`），但它需要 `.so.8`。

```
$ ./usr/bin/sqlite3
./usr/bin/sqlite3: error while loading shared libraries: libreadline.so.8: cannot open shared object file: No such file or directory
```

### 尝试 4：从源代码进行编译

我花费这么多时间尝试下载 sqlite 二进制的原因是我认为从源代码编译 sqlite 既烦人又耗时。但是显然，下载随便一个 sqlite 二进制文件根本不适合我，因此我最终决定尝试自己编译它。

这有指导：[如何编译 SQLite](https://www.sqlite.org/howtocompile.html)。它是宇宙中最简单的东西。通常，编译的感觉是类似这样的：

* 运行 `./configure`
* 意识到我缺少依赖
* 再次运行 `./configure`
* 运行 `make`
* 编译失败，因为我安装了错误版本的依赖
* 去做其他事，之后找到二进制文件

编译 SQLite 的方式如下：

* [从下载页面下载整合的 tarball](https://www.sqlite.org/download.html)
* 运行 `gcc shell.c sqlite3.c -lpthread -ldl`
* 完成！！！

所有代码都在一个文件（`sqlite.c`）中，并且没有奇怪的依赖项！太奇妙了。

对我而言，我实际上并不需要线程支持或 readline 支持，因此我用编译页面上的说明来创建了一个非常简单的二进制文件，它仅使用了 libc 而没有其他共享库。

```
$ ldd sqlite3
    linux-vdso.so.1 (0x00007ffe8e7e9000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbea4988000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbea4d79000)
```

### 这很好，因为它使体验 sqlite 变得容易

我认为 SQLite 的构建过程如此简单很酷，因为过去我很乐于[编辑 sqlite 的源码](https://jvns.ca/blog/2014/10/02/how-does-sqlite-work-part-2-btrees/)来了解其 B 树的实现方式。

鉴于我对 SQLite 的了解，这并不令人感到意外（它在受限环境/嵌入式中确实可以很好地工作，因此可以以一种非常简单/最小的方式进行编译是有意义的）。 但这真是太好了！

---

via: <https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-compile/>

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

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


如何编写 RPM 的 spec 文件

# 如何编写 RPM 的 spec 文件

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

在[关于 RPM 软件包构建的上一篇文章](/article-11527-1.html)中，你了解到了源 RPM 包括软件的源代码以及 spec 文件。这篇文章深入研究了 spec 文件，该文件中包含了有关如何构建 RPM 的指令。同样，本文以 `fpaste` 为例。

### 了解源代码

在开始编写 spec 文件之前，你需要对要打包的软件有所了解。在这里，你正在研究 `fpaste`，这是一个非常简单的软件。它是用 Python 编写的，并且是一个单文件脚本。当它发布新版本时，可在 Pagure 上找到：<https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz>。

如该档案文件所示，当前版本为 0.3.9.2。下载它，以便你查看该档案文件中的内容：

```
$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
$ tar -tvf fpaste-0.3.9.2.tar.gz
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/
-rw-rw-r-- root/root        25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore
-rw-rw-r-- root/root      3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG
-rw-rw-r-- root/root     35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING
-rw-rw-r-- root/root       444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile
-rw-rw-r-- root/root      1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst
-rw-rw-r-- root/root       658 2018-07-25 02:58 fpaste-0.3.9.2/TODO
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/
-rw-rw-r-- root/root      3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1
-rwxrwxr-x root/root     24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste
lrwxrwxrwx root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste
```

你要安装的文件是：

* `fpaste.py`：应该安装到 `/usr/bin/`。
* `docs/man/en/fpaste.1`：手册，应放到 `/usr/share/man/man1/`。
* `COPYING`：许可证文本，应放到 `/usr/share/license/fpaste/`。
* `README.rst`、`TODO`：放到 `/usr/share/doc/fpaste/` 下的其它文档。

这些文件的安装位置取决于文件系统层次结构标准（FHS）。要了解更多信息，可以在这里阅读：<http://www.pathname.com/fhs/> 或查看 Fedora 系统的手册页：

```
$ man hier
```

#### 第一部分：要构建什么？

现在我们知道了源文件中有哪些文件，以及它们要存放的位置，让我们看一下 spec 文件。你可以在此处查看这个完整的文件：<https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec>。

这是 spec 文件的第一部分：

```
Name:   fpaste
Version:  0.3.9.2
Release:  3%{?dist}
Summary:  A simple tool for pasting info onto sticky notes instances
BuildArch:  noarch
License:  GPLv3+
URL:    https://pagure.io/fpaste
Source0:  https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz

Requires:    python3

%description
It is often useful to be able to easily paste text to the Fedora
Pastebin at http://paste.fedoraproject.org and this simple script
will do that and return the resulting URL so that people may
examine the output. This can hopefully help folks who are for
some reason stuck without X, working remotely, or any other
reason they may be unable to paste something into the pastebin
```

`Name`、`Version` 等称为*标签*，它们定义在 RPM 中。这意味着你不能只是随意写点标签，RPM 无法理解它们！需要注意的标签是：

* `Source0`：告诉 RPM 该软件的源代码档案文件所在的位置。
* `Requires`：列出软件的运行时依赖项。RPM 可以自动检测很多依赖项，但是在某些情况下，必须手动指明它们。运行时依赖项是系统上必须具有的功能（通常是软件包），才能使该软件包起作用。这是 [dnf](https://fedoramagazine.org/managing-packages-fedora-dnf/) 在安装此软件包时检测是否需要拉取其他软件包的方式。
* `BuildRequires`：列出了此软件的构建时依赖项。这些通常必须手动确定并添加到 spec 文件中。
* `BuildArch`：此软件为该计算机体系结构所构建。如果省略此标签，则将为所有受支持的体系结构构建该软件。值 `noarch` 表示该软件与体系结构无关（例如 `fpaste`，它完全是用 Python 编写的）。

本节提供有关 `fpaste` 的常规信息：它是什么，正在将什么版本制作为 RPM，其许可证等等。如果你已安装 `fpaste`，并查看其元数据时，则可以看到该 RPM 中包含的以下信息：

```
$ sudo dnf install fpaste
$ rpm -qi fpaste
Name        : fpaste
Version     : 0.3.9.2
Release     : 2.fc30
...
```

RPM 会自动添加一些其他标签，以代表它所知道的内容。

至此，我们掌握了要为其构建 RPM 的软件的一般信息。接下来，我们开始告诉 RPM 做什么。

#### 第二部分：准备构建

spec 文件的下一部分是准备部分，用 `％prep` 代表：

```
%prep
%autosetup
```

对于 `fpaste`，这里唯一的命令是 `％autosetup`。这只是将 tar 档案文件提取到一个新文件夹中，并为下一部分的构建阶段做好了准备。你可以在此处执行更多操作，例如应用补丁程序，出于不同目的修改文件等等。如果你查看过 Python 的源 RPM 的内容，那么你会在那里看到许多补丁。这些都将在本节中应用。

通常，spec 文件中带有 `％` 前缀的所有内容都是 RPM 以特殊方式解释的宏或标签。这些通常会带有大括号，例如 `％{example}`。

#### 第三部分：构建软件

下一部分是构建软件的位置，用 `％build` 表示。现在，由于 `fpaste` 是一个简单的纯 Python 脚本，因此无需构建。因此，这里是：

```
%build
#nothing required
```

不过，通常来说，你会在此处使用构建命令，例如：

```
configure; make
```

构建部分通常是 spec 文件中最难的部分，因为这是从源代码构建软件的地方。这要求你知道该工具使用的是哪个构建系统，该系统可能是许多构建系统之一：Autotools、CMake、Meson、Setuptools（用于 Python）等等。每个都有自己的命令和语法样式。你需要充分了解这些才能正确构建软件。

#### 第四部分：安装文件

软件构建后，需要在 `％install` 部分中安装它：

```
%install
mkdir -p %{buildroot}%{_bindir}
make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
```

在构建 RPM 时，RPM 不会修改你的系统文件。在一个可以正常运行的系统上添加、删除或修改文件的风险太大。如果发生故障怎么办？因此，RPM 会创建一个专门打造的文件系统并在其中工作。这称为 `buildroot`。 因此，在 `buildroot` 中，我们创建由宏 `％{_bindir}` 代表的 `/usr/bin` 目录，然后使用提供的 `Makefile` 将文件安装到其中。

至此，我们已经在专门打造的 `buildroot` 中安装了 `fpaste` 的构建版本。

#### 第五部分：列出所有要包括在 RPM 中的文件

spec 文件其后的一部分是文件部分：`％files`。在这里，我们告诉 RPM 从该 spec 文件创建的档案文件中包含哪些文件。`fpaste` 的文件部分非常简单：

```
%files
%{_bindir}/%{name}
%doc README.rst TODO
%{_mandir}/man1/%{name}.1.gz
%license COPYING
```

请注意，在这里，我们没有指定 `buildroot`。所有这些路径都是相对路径。`％doc` 和 `％license`命令做的稍微多一点，它们会创建所需的文件夹，并记住这些文件必须放在那里。

RPM 很聪明。例如，如果你在 `％install` 部分中安装了文件，但未列出它们，它会提醒你。

#### 第六部分：在变更日志中记录所有变更

Fedora 是一个基于社区的项目。许多贡献者维护或共同维护软件包。因此，当务之急是不要被软件包做了哪些更改所搞混。为了确保这一点，spec 文件包含的最后一部分是变更日志 `％changelog`：

```
%changelog
* Thu Jul 25 2019 Fedora Release Engineering < ...> - 0.3.9.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild

* Thu Jan 31 2019 Fedora Release Engineering < ...> - 0.3.9.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild

* Tue Jul 24 2018 Ankur Sinha  - 0.3.9.2-1
- Update to 0.3.9.2

* Fri Jul 13 2018 Fedora Release Engineering < ...> - 0.3.9.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild

* Wed Feb 07 2018 Fedora Release Engineering < ..> - 0.3.9.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild

* Sun Sep 10 2017 Vasiliy N. Glazov < ...> - 0.3.9.1-2
- Cleanup spec

* Fri Sep 08 2017 Ankur Sinha  - 0.3.9.1-1
- Update to latest release
- fixes rhbz 1489605
...
....
```

spec 文件的*每项*变更都必须有一个变更日志条目。如你在此处看到的，虽然我以维护者身份更新了该 spec 文件，但其他人也做过更改。清楚地记录变更内容有助于所有人知道该 spec 文件的当前状态。对于系统上安装的所有软件包，都可以使用 `rpm` 来查看其更改日志：

```
$ rpm -q --changelog fpaste
```

### 构建 RPM

现在我们准备构建 RPM 包。如果要继续执行以下命令，请确保遵循[上一篇文章](/article-11527-1.html)中的步骤设置系统以构建 RPM。

我们将 `fpaste` 的 spec 文件放置在 `~/rpmbuild/SPECS` 中，将源代码档案文件存储在 `~/rpmbuild/SOURCES/` 中，现在可以创建源 RPM 了：

```
$ cd ~/rpmbuild/SPECS
$ wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec

$ cd ~/rpmbuild/SOURCES
$ wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz

$ cd ~/rpmbuild/SOURCES
$ rpmbuild -bs fpaste.spec
Wrote: /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
```

让我们看一下结果：

```
$ ls ~/rpmbuild/SRPMS/fpaste*
/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm

$ rpm -qpl ~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
fpaste-0.3.9.2.tar.gz
fpaste.spec
```

我们看到源 RPM 已构建。让我们同时构建源 RPM 和二进制 RPM：

```
$ cd ~/rpmbuild/SPECS
$ rpmbuild -ba fpaste.spec
..
..
..
```

RPM 将向你显示完整的构建输出，并在我们之前看到的每个部分中详细说明它的工作。此“构建日志”非常重要。当构建未按预期进行时，我们的打包人员将花费大量时间来遍历它们，以跟踪完整的构建路径来查看出了什么问题。

就是这样！准备安装的 RPM 应该位于以下位置：

```
$ ls ~/rpmbuild/RPMS/noarch/
fpaste-0.3.9.2-3.fc30.noarch.rpm
```

### 概括

我们已经介绍了如何从 spec 文件构建 RPM 的基础知识。这绝不是一份详尽的文档。实际上，它根本不是文档。它只是试图解释幕后的运作方式。简短回顾一下：

* RPM 有两种类型：源 RPM 和 二进制 RPM。
* 二进制 RPM 包含要安装以使用该软件的文件。
* 源 RPM 包含构建二进制 RPM 所需的信息：完整的源代码，以及 spec 文件中的有关如何构建 RPM 的说明。
* spec 文件包含多个部分，每个部分都有其自己的用途。 在这里，我们已经在安装好的 Fedora 系统中本地构建了 RPM。虽然这是个基本的过程，但我们从存储库中获得的 RPM 是建立在具有严格配置和方法的专用服务器上的，以确保正确性和安全性。这个 Fedora 打包流程将在以后的文章中讨论。

你想开始构建软件包，并帮助 Fedora 社区维护我们提供的大量软件吗？你可以[从这里开始加入软件包集合维护者](https://fedoraproject.org/wiki/Join_the_package_collection_maintainers)。

如有任何疑问，请发布到 [Fedora 开发人员邮件列表](https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/)，我们随时乐意为你提供帮助！

### 参考

这里有一些构建 RPM 的有用参考：

* <https://fedoraproject.org/wiki/How_to_create_an_RPM_package>
* <https://docs.fedoraproject.org/en-US/quick-docs/create-hello-world-rpm/>
* <https://docs.fedoraproject.org/en-US/packaging-guidelines/>
* <https://rpm.org/documentation.html>

---

via: <https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/>

作者：[Ankur Sinha FranciscoD](https://fedoramagazine.org/author/ankursinha/) 选题：[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/) 荣誉推出


为什么你不必害怕 Kubernetes

# 为什么你不必害怕 Kubernetes

>
> Kubernetes 绝对是满足复杂 web 应用程序需求的最简单、最容易的方法。
>
>
>

<img src="content_image/album_201911_05_115817v397nh7jx3hx5ffs.png" alt="Digital creative of a browser on the internet" title="Digital creative of a browser on the internet">

在 90 年代末和 2000 年代初，在大型网站工作很有趣。我的经历让我想起了 American Greetings Interactive，在情人节那天，我们拥有了互联网上排名前 10 位之一的网站（以网络访问量衡量）。我们为 [AmericanGreetings.com](http://AmericanGreetings.com)、[BlueMountain.com](http://BlueMountain.com) 等公司提供了电子贺卡，并为 MSN 和 AOL 等合作伙伴提供了电子贺卡。该组织的老员工仍然深切地记得与 Hallmark 等其它电子贺卡网站进行大战的史诗般的故事。顺便说一句，我还为 Holly Hobbie、Care Bears 和 Strawberry Shortcake 运营过大型网站。

我记得那就像是昨天发生的一样，这是我们第一次遇到真正的问题。通常，我们的前门（路由器、防火墙和负载均衡器）有大约 200Mbps 的流量进入。但是，突然之间，Multi Router Traffic Grapher（MRTG）图示突然在几分钟内飙升至 2Gbps。我疯了似地东奔西跑。我了解了我们的整个技术堆栈，从路由器、交换机、防火墙和负载平衡器，到 Linux/Apache web 服务器，到我们的 Python 堆栈（FastCGI 的元版本），以及网络文件系统（NFS）服务器。我知道所有配置文件在哪里，我可以访问所有管理界面，并且我是一位经验丰富的，打过硬仗的系统管理员，具有多年解决复杂问题的经验。

但是，我无法弄清楚发生了什么……

当你在一千个 Linux 服务器上疯狂地键入命令时，五分钟的感觉就像是永恒。我知道站点可能会在任何时候崩溃，因为当它被划分成更小的集群时，压垮上千个节点的集群是那么的容易。

我迅速*跑到*老板的办公桌前，解释了情况。他几乎没有从电子邮件中抬起头来，这使我感到沮丧。他抬头看了看，笑了笑，说道：“是的，市场营销可能会开展广告活动。有时会发生这种情况。”他告诉我在应用程序中设置一个特殊标志，以减轻 Akamai 的访问量。我跑回我的办公桌，在上千台 web 服务器上设置了标志，几分钟后，站点恢复正常。灾难也就被避免了。

我可以再分享 50 个类似的故事，但你脑海中可能会有一点好奇：“这种运维方式将走向何方?”

关键是，我们遇到了业务问题。当技术问题使你无法开展业务时，它们就变成了业务问题。换句话说，如果你的网站无法访问，你就不能处理客户交易。

那么，所有这些与 Kubernetes 有什么关系？一切！世界已经改变。早在 90 年代末和 00 年代初，只有大型网站才出现大型的、<ruby> 规模级 <rt>  web-scale </rt></ruby>的问题。现在，有了微服务和数字化转型，每个企业都面临着一个大型的、规模级的问题——可能是多个大型的、规模级的问题。

你的企业需要能够通过许多不同的人构建的许多不同的、通常是复杂的服务来管理复杂的规模级的网站。你的网站需要动态地处理流量，并且它们必须是安全的。这些属性需要在所有层（从基础结构到应用程序层）上由 API 驱动。

### 进入 Kubernetes

Kubernetes 并不复杂；你的业务问题才复杂。当你想在生产环境中运行应用程序时，要满足性能（伸缩性、性能抖动等）和安全性要求，就需要最低程度的复杂性。诸如高可用性（HA）、容量要求（N+1、N+2、N+100）以及保证最终一致性的数据技术等就会成为必需。这些是每家进行数字化转型的公司的生产要求，而不仅仅是 Google、Facebook 和 Twitter 这样的大型网站。

在旧时代，我还在 American Greetings 任职时，每次我们加入一个新的服务，它看起来像这样：所有这些都是由网站运营团队来处理的，没有一个是通过订单系统转移给其他团队来处理的。这是在 DevOps 出现之前的 DevOps：

1. 配置 DNS（通常是内部服务层和面向公众的外部）
2. 配置负载均衡器（通常是内部服务和面向公众的）
3. 配置对文件的共享访问（大型 NFS 服务器、群集文件系统等）
4. 配置集群软件（数据库、服务层等）
5. 配置 web 服务器群集（可以是 10 或 50 个服务器）

大多数配置是通过配置管理自动完成的，但是配置仍然很复杂，因为每个系统和服务都有不同的配置文件，而且格式完全不同。我们研究了像 [Augeas](http://augeas.net/) 这样的工具来简化它，但是我们认为使用转换器来尝试和标准化一堆不同的配置文件是一种反模式。

如今，借助 Kubernetes，启动一项新服务本质上看起来如下：

1. 配置 Kubernetes YAML/JSON。
2. 提交给 Kubernetes API（`kubectl create -f service.yaml`）。

Kubernetes 大大简化了服务的启动和管理。服务所有者（无论是系统管理员、开发人员还是架构师）都可以创建 Kubernetes 格式的 YAML/JSON 文件。使用 Kubernetes，每个系统和每个用户都说相同的语言。所有用户都可以在同一 Git 存储库中提交这些文件，从而启用 GitOps。

而且，可以弃用和删除服务。从历史上看，删除 DNS 条目、负载平衡器条目和 Web 服务器的配置等是非常可怕的，因为你几乎肯定会破坏某些东西。使用 Kubernetes，所有内容都处于命名空间下，因此可以通过单个命令删除整个服务。尽管你仍然需要确保其它应用程序不使用它（微服务和函数即服务 [FaaS] 的缺点），但你可以更加确信：删除服务不会破坏基础架构环境。

### 构建、管理和使用 Kubernetes

太多的人专注于构建和管理 Kubernetes 而不是使用它（详见 [Kubernetes 是一辆翻斗车](/article-11011-1.html)）。

在单个节点上构建一个简单的 Kubernetes 环境并不比安装 LAMP 堆栈复杂得多，但是我们无休止地争论着构建与购买的问题。不是 Kubernetes 很难；它以高可用性大规模运行应用程序。建立一个复杂的、高可用性的 Kubernetes 集群很困难，因为要建立如此规模的任何集群都是很困难的。它需要规划和大量软件。建造一辆简单的翻斗车并不复杂，但是建造一辆可以运载 [10 吨垃圾并能以 200 迈的速度稳定行驶的卡车](http://crunchtools.com/kubernetes-10-ton-dump-truck-handles-pretty-well-200-mph/)则很复杂。

管理 Kubernetes 可能很复杂，因为管理大型的、规模级的集群可能很复杂。有时，管理此基础架构很有意义；而有时不是。由于 Kubernetes 是一个社区驱动的开源项目，它使行业能够以多种不同方式对其进行管理。供应商可以出售托管版本，而用户可以根据需要自行决定对其进行管理。（但是你应该质疑是否确实需要。）

使用 Kubernetes 是迄今为止运行大规模网站的最简单方法。Kubernetes 正在普及运行一组大型、复杂的 Web 服务的能力——就像当年 Linux 在 Web 1.0 中所做的那样。

由于时间和金钱是一个零和游戏，因此我建议将重点放在使用 Kubernetes 上。将你的时间和金钱花费在[掌握 Kubernetes 原语](/article-11036-1.html)或处理[活跃度和就绪性探针](https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html)的最佳方法上（表明大型、复杂的服务很难的另一个例子）。不要专注于构建和管理 Kubernetes。（在构建和管理上）许多供应商可以为你提供帮助。

### 结论

我记得对无数的问题进行了故障排除，比如我在这篇文章的开头所描述的问题——当时 Linux 内核中的 NFS、我们自产的 CFEngine、仅在某些 Web 服务器上出现的重定向问题等）。开发人员无法帮助我解决所有这些问题。实际上，除非开发人员具备高级系统管理员的技能，否则他们甚至不可能进入系统并作为第二双眼睛提供帮助。没有带有图形或“可观察性”的控制台——可观察性在我和其他系统管理员的大脑中。如今，有了 Kubernetes、Prometheus、Grafana 等，一切都改变了。

关键是：

1. 时代不一样了。现在，所有 Web 应用程序都是大型的分布式系统。就像 AmericanGreetings.com 过去一样复杂，现在每个网站都有扩展性和 HA 的要求。
2. 运行大型的分布式系统是很困难的。绝对是。这是业务的需求，不是 Kubernetes 的问题。使用更简单的编排系统并不是解决方案。

Kubernetes 绝对是满足复杂 Web 应用程序需求的最简单，最容易的方法。这是我们生活的时代，而 Kubernetes 擅长于此。你可以讨论是否应该自己构建或管理 Kubernetes。有很多供应商可以帮助你构建和管理它，但是很难否认这是大规模运行复杂 Web 应用程序的最简单方法。

---

via: <https://opensource.com/article/19/10/kubernetes-complex-business-problem>

作者：[Scott McCarty](https://opensource.com/users/fatherlinux) 选题：[lujun9972](https://github.com/lujun9972) 译者：[laingke](https://github.com/laingke) 校对：[wxy](https://github.com/wxy)

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


将 Fedora 30 升级到 Fedora 31

# 将 Fedora 30 升级到 Fedora 31

Fedora 31 [日前发布了](/article-11522-1.html)。你也许想要升级系统来获得 Fedora 中的最新功能。Fedora 工作站有图形化的升级方式。另外，Fedora 提供了一种命令行方式来将 Fedora 30 升级到 Fedora 31。

### 将 Fedora 30 工作站升级到 Fedora 31

在该发布不久之后，就会有通知告诉你有可用升级。你可以点击通知打开 GNOME “软件”。或者在 GNOME Shell 选择“软件”。

在 GNOME 软件中选择*更新*，你应该会看到告诉你有 Fedora 31 更新的提示。

如果你在屏幕上看不到任何内容，请尝试使用左上方的重新加载按钮。在发布后，所有系统可能需要一段时间才能看到可用的升级。

选择*下载*以获取升级包。你可以继续工作，直到下载完成。然后使用 GNOME “软件”重启系统并应用升级。升级需要时间，因此你可能需要喝杯咖啡，稍后再返回系统。

### 使用命令行

如果你是从 Fedora 以前的版本升级的，那么你可能对 `dnf upgrade` 插件很熟悉。这是推荐且支持的从 Fedora 30 升级到 Fedora 31 的方法。使用此插件能让你轻松地升级到 Fedora 31。

#### 1、更新软件并备份系统

在开始升级之前，请确保你安装了 Fedora 30 的最新软件。如果你安装了模块化软件，这点尤为重要。`dnf` 和 GNOME “软件”的最新版本对某些模块化流的升级过程进行了改进。要更新软件，请使用 GNOME “软件” 或在终端中输入以下命令：

```
sudo dnf upgrade --refresh
```

此外，在继续操作之前，请确保备份系统。有关备份的帮助，请参阅 Fedora Magazine 上的[备份系列](https://fedoramagazine.org/taking-smart-backups-duplicity/)。

#### 2、安装 DNF 插件

接下来，打开终端并输入以下命令安装插件：

```
sudo dnf install dnf-plugin-system-upgrade
```

#### 3、使用 DNF 开始更新

现在，你的系统是最新的，已经备份并且安装了 DNF 插件，你可以通过在终端中使用以下命令来开始升级：

```
sudo dnf system-upgrade download --releasever=31
```

该命令将开始在本地下载计算机的所有升级。如果由于缺乏更新包、损坏的依赖项或已淘汰的软件包而在升级时遇到问题，请在输入上面的命令时添加 `‐-allowerasing` 标志。这将使 DNF 删除可能阻止系统升级的软件包。

#### 4、重启并升级

上面的命令下载更新完成后，你的系统就可以重启了。要将系统引导至升级过程，请在终端中输入以下命令：

```
sudo dnf system-upgrade reboot
```

此后，你的系统将重启。在许多版本之前，`fedup` 工具会在内核选择/引导页面上创建一个新选项。使用 `dnf-plugin-system-upgrade` 软件包，你的系统将重新引导到当前 Fedora 30 使用的内核。这很正常。在内核选择页面之后不久，你的系统会开始升级过程。

现在也许可以喝杯咖啡休息下！升级完成后，系统将重启，你将能够登录到新升级的 Fedora 31 系统。

### 解决升级问题

有时，升级系统时可能会出现意外问题。如果遇到任何问题，请访问 [DNF 系统升级文档](https://docs.fedoraproject.org/en-US/quick-docs/dnf-system-upgrade/#Resolving_post-upgrade_issues)，以获取有关故障排除的更多信息。

如果升级时遇到问题，并且系统上安装了第三方仓库，那么在升级时可能需要禁用这些仓库。对于 Fedora 不提供的仓库的支持，请联系仓库的提供者。

---

via: <https://fedoramagazine.org/upgrading-fedora-30-to-fedora-31/>

作者：[Ben Cotton](https://fedoramagazine.org/author/bcotton/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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