如何检查 Linux 中的开放端口列表？

Summary: 本文帮助你检查本地系统上的开放端口列表。在 Linux 中很少有用于此目的的实用程序。然而，我提供了四个最重要的 Linux 命令来检查这一点。

![](/data/attachment/album/201904/17/085105v2pxt00umyyj5y7j.jpg)

最近，我们就同一主题写了两篇文章。这些文章内容帮助你如何检查远程服务器中给定的端口是否打开。

如果你想 [检查远程 Linux 系统上的端口是否打开](/article-10675-1.html) 请点击链接浏览。如果你想 [检查多个远程 Linux 系统上的端口是否打开](/article-10766-1.html) 请点击链接浏览。如果你想 [检查多个远程 Linux 系统上的多个端口状态](/article-10766-1.html) 请点击链接浏览。

但是本文帮助你检查本地系统上的开放端口列表。

在 Linux 中很少有用于此目的的实用程序。然而，我提供了四个最重要的 Linux 命令来检查这一点。

你可以使用以下四个命令来完成这个工作。这些命令是非常出名的并被 Linux 管理员广泛使用。

* `netstat`：netstat (“network statistics”) 是一个显示网络连接（进和出）相关信息命令行工具，例如：路由表, 伪装连接,多点传送成员和网络端口。
* `nmap`：Nmap (“Network Mapper”) 是一个网络探索与安全审计的开源工具。它旨在快速扫描大型网络。
* `ss`： ss 被用于转储套接字统计信息。它也可以类似 netstat 使用。相比其他工具它可以展示更多的TCP状态信息。
* `lsof`： lsof 是 List Open File 的缩写. 它用于输出被某个进程打开的所有文件。

### 如何使用 Linux 命令 netstat 检查系统中的开放端口列表

`netstat` 是 Network Statistics 的缩写，是一个显示网络连接（进和出）相关信息命令行工具，例如：路由表、伪装连接、多播成员和网络端口。

它可以列出所有的 tcp、udp 连接和所有的 unix 套接字连接。

它用于发现发现网络问题，确定网络连接数量。

```
# netstat -tplugn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      2038/master
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN      1396/snmpd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1398/httpd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1388/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      2038/master
tcp6       0      0 :::22                   :::*                    LISTEN      1388/sshd
udp        0      0 0.0.0.0:39136           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:56130           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:40105           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:11584           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:30105           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:50656           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:1632            0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:28265           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:40764           0.0.0.0:*                           1396/snmpd
udp        0      0 10.90.56.21:123         0.0.0.0:*                           895/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           895/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           895/ntpd
udp        0      0 0.0.0.0:53390           0.0.0.0:*                           1396/snmpd
udp        0      0 0.0.0.0:161             0.0.0.0:*                           1396/snmpd
udp6       0      0 :::123                  :::*                                895/ntpd

IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.0.0.1
lo              1      ff02::1
lo              1      ff01::1
eth0            1      ff02::1
eth0            1      ff01::1
```

你也可以使用下面的命令检查特定的端口。

```
# # netstat -tplugn | grep :22

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1388/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1388/sshd
```

### 如何使用 Linux 命令 ss 检查系统中的开放端口列表？

`ss` 被用于转储套接字统计信息。它也可以显示类似 `netstat` 的信息。相比其他工具它可以展示更多的 TCP 状态信息。

```
# ss -lntu

Netid  State      Recv-Q Send-Q                     Local Address:Port                                    Peer Address:Port
udp    UNCONN     0      0                                      *:39136                                              *:*
udp    UNCONN     0      0                                      *:56130                                              *:*
udp    UNCONN     0      0                                      *:40105                                              *:*
udp    UNCONN     0      0                                      *:11584                                              *:*
udp    UNCONN     0      0                                      *:30105                                              *:*
udp    UNCONN     0      0                                      *:50656                                              *:*
udp    UNCONN     0      0                                      *:1632                                               *:*
udp    UNCONN     0      0                                      *:28265                                              *:*
udp    UNCONN     0      0                                      *:40764                                              *:*
udp    UNCONN     0      0                            10.90.56.21:123                                                *:*
udp    UNCONN     0      0                              127.0.0.1:123                                                *:*
udp    UNCONN     0      0                                      *:123                                                *:*
udp    UNCONN     0      0                                      *:53390                                              *:*
udp    UNCONN     0      0                                      *:161                                                *:*
udp    UNCONN     0      0                                     :::123                                               :::*
tcp    LISTEN     0      100                                    *:25                                                 *:*
tcp    LISTEN     0      128                            127.0.0.1:199                                                *:*
tcp    LISTEN     0      128                                    *:80                                                 *:*
tcp    LISTEN     0      128                                    *:22                                                 *:*
tcp    LISTEN     0      100                                   :::25                                                :::*
tcp    LISTEN     0      128                                   :::22                                                :::*
```

你也可以使用下面的命令检查特定的端口。

```
# # ss -lntu | grep ':25'

tcp    LISTEN     0      100       *:25                    *:*
tcp    LISTEN     0      100      :::25                   :::*
```

### 如何使用 Linux 命令 nmap 检查系统中的开放端口列表？

Nmap (“Network Mapper”) 是一个网络探索与安全审计的开源工具。它旨在快速扫描大型网络，当然它也可以工作在独立主机上。

Nmap 使用裸 IP 数据包以一种新颖的方式来确定网络上有哪些主机可用，这些主机提供什么服务（应用程序名称和版本），它们运行什么操作系统（版本），使用什么类型的数据包过滤器/防火墙，以及许多其他特征。

虽然 Nmap 通常用于安全审计，但许多系统和网络管理员发现它对于日常工作也非常有用，例如网络资产清点、管理服务升级计划以及监控主机或服务正常运行时间。

```
# nmap -sTU -O localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2019-03-20 09:57 CDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00028s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 1994 closed ports

PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
80/tcp  open  http
199/tcp open  smux
123/udp open  ntp
161/udp open  snmp

Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.7 - 3.9
Network Distance: 0 hops

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.93 seconds
```

你也可以使用下面的命令检查特定的端口。

```
# nmap -sTU -O localhost | grep 123

123/udp open  ntp
```

### 如何使用 Linux 命令 lsof 检查系统中的开放端口列表？

它向你显示系统上打开的文件列表以及打开它们的进程。还会向你显示与文件相关的其他信息。

```
# lsof -i

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ntpd      895    ntp   16u  IPv4   18481      0t0  UDP *:ntp
ntpd      895    ntp   17u  IPv6   18482      0t0  UDP *:ntp
ntpd      895    ntp   18u  IPv4   18487      0t0  UDP localhost:ntp
ntpd      895    ntp   20u  IPv4   23020      0t0  UDP CentOS7.2daygeek.com:ntp
sshd     1388   root    3u  IPv4   20065      0t0  TCP *:ssh (LISTEN)
sshd     1388   root    4u  IPv6   20067      0t0  TCP *:ssh (LISTEN)
snmpd    1396   root    6u  IPv4   22739      0t0  UDP *:snmp
snmpd    1396   root    7u  IPv4   22729      0t0  UDP *:40105
snmpd    1396   root    8u  IPv4   22730      0t0  UDP *:50656
snmpd    1396   root    9u  IPv4   22731      0t0  UDP *:pammratc
snmpd    1396   root   10u  IPv4   22732      0t0  UDP *:30105
snmpd    1396   root   11u  IPv4   22733      0t0  UDP *:40764
snmpd    1396   root   12u  IPv4   22734      0t0  UDP *:53390
snmpd    1396   root   13u  IPv4   22735      0t0  UDP *:28265
snmpd    1396   root   14u  IPv4   22736      0t0  UDP *:11584
snmpd    1396   root   15u  IPv4   22737      0t0  UDP *:39136
snmpd    1396   root   16u  IPv4   22738      0t0  UDP *:56130
snmpd    1396   root   17u  IPv4   22740      0t0  TCP localhost:smux (LISTEN)
httpd    1398   root    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
master   2038   root   13u  IPv4   21638      0t0  TCP *:smtp (LISTEN)
master   2038   root   14u  IPv6   21639      0t0  TCP *:smtp (LISTEN)
sshd     9052   root    3u  IPv4 1419955      0t0  TCP CentOS7.2daygeek.com:ssh->Ubuntu18-04.2daygeek.com:11408 (ESTABLISHED)
httpd   13371 apache    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
httpd   13372 apache    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
httpd   13373 apache    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
httpd   13374 apache    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
httpd   13375 apache    3u  IPv4   20337      0t0  TCP *:http (LISTEN)
```

你也可以使用下面的命令检查特定的端口。

```
# lsof -i:80

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd    1398   root    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
httpd   13371 apache    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
httpd   13372 apache    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
httpd   13373 apache    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
httpd   13374 apache    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
httpd   13375 apache    3u  IPv4  20337      0t0  TCP *:http (LISTEN)
```

---

via: <https://www.2daygeek.com/linux-scan-check-open-ports-using-netstat-ss-nmap/>

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

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


管理 131,800,000,000 条数据记录，巨杉数据库支撑银行云化架构升级

Summary: 答案就是新一代分布式数据库。

答案就是新一代分布式数据库。

![](/data/attachment/album/201904/17/093643r3m864decd6he47m.jpg)

如今，大型企业的应用平台正在向微服务架构进行转型。在微服务架构下，应用程序和数据库等底层平台的关系将会被重构。

作为新一代分布式数据库，其架构与功能特性需要保证在与传统数据库全兼容的基础上，拥抱微服务与云计算框架。因此，分布式数据库对于分布式事务与 ACID 必须保证与传统技术完全兼容。同时，在面向微服务应用开发与云计算基础架构时，**新一代分布式数据库必须支持弹性扩张、资源隔离、多租户、可配置一致性、多模式（支持各类 SQL 协议）、集群内可配置容灾策略等一系列功能。**

传统单点数据库的容量瓶颈，仅仅是分布式数据库所解决的问题之一。更重要的是在未来微服务化应用开发以及云化平台的趋势下，应用不再以“烟囱式”的中间件加数据库模式进行构建，而是采用数千甚至上万的微服务程序构建成的复杂网状模型。因此，分布式数据库需要满足以下能力，才能够满足上层应用的弹性扩展、高并发、高吞吐量、与灵活敏捷的需求。

在这些技术需求驱动下，分布式数据库核心技术能力分为两个方面，一方面是对传统技术的兼容，包括：

* 完整的 ACID 支持，事务和一致性保证；
* SQL 的完整支持，传统数据库如 MySQL/PostgreSQL 的语法完全兼容。

另一方面，则是技术创新，包括：

* 分布式与扩展性，应对数据量的变化，实现存储层和计算层的弹性扩展；
* 多模式访问接口，支持多类型数据管理和多种模式的访问接口；
* HTAP 交易/分析混合处理能力，复杂业务需求下，实现数据的物理隔离，互不干扰。

作为一款金融级分布式关系型数据库，SequoiaDB 巨杉数据库的分布式数据库架构和面向微服务的云化产品形态，已经帮助包括民生银行、恒丰银行在内的多家大型金融客户实现了大量业务系统的底层数据库云化转型升级。

目前，**巨杉数据库在银行生产系统单机群最大物理节点数达到 135 个，单集群最大存储容量超过 2.1 PB，单集群最大管理数据条数 1318 亿条。**

SequoiaDB 巨杉数据库作为一款金融级的分布式关系型数据库，在企业客户云化架构转型过程中，提供了多种重要技术能力。

### 数据存储资源池化

SequoiaDB 数据存储引擎采用原生分布式架构，数据完全打散在分布式节点间存储，自动化数据分布和管理，数据可以按需灵活扩展。

SequoiaDB 采用分片技术为系统提供了横向扩展机制，其分片过程对于应用程序来说完全透明。该机制解决了单台服务器硬件资源（如内存、CPU、磁盘 I/O）受限的问题，并不会增加应用程序开发的复杂性。巨杉数据库通过原生分布式架构，可以轻松实现 PB 级别数据管理，目前生产环境最大支持超过 1500 个节点集群。

SequoiaDB 巨杉数据库存储引擎也实现了 multi-model 多模数据管理，支持非结构化、结构化和半结构化数据全覆盖并统一管理。SequoiaDB 的多模引擎设计让数据库平台场景更多样，也能符合云数据架构下对于多样化业务数据的统一管理与运维要求。

同时，在一个大型集群中，SequoiaDB 提供了多维度、多层级的逻辑与物理隔离能力。在一个典型的数据资源池类型基础数据服务平台（DBaas，DataBase As A Service）中，SequoiaDB 巨杉数据库能够同时服务于成百上千个不同 SLA 服务级别、优先级、业务特性、与数据量的应用程序，并保证应用程序之间的数据逻辑与物理隔离。

SequoiaDB 提供的“数据域（Domain）”特性，能够将整个集群在物理设备层面进行隔离，确保不同的表、表空间、与数据库实例坐落于独立的硬件设备上，保证高优先级的联机交易应用与后台统计分析相互隔离互不干扰。

### 数据库实例化

SequoiaDB 巨杉数据库支持数据库服务实例化。

针对微服务应用架构，用户可以在同一个集群中创建成百上千个不同的关系型数据库实例。数据库实例的访问与使用方式和传统关系型数据库 100% 兼容，同时其底层所使用的数据从逻辑上完全独立，每个实例拥有自己独立的权限管理、数据管控、甚至可以选择部署在独立的硬件环境或共享设备中。

目前 SequoiaDB 巨杉数据库支持用户创建 MySQL、PostgreSQL 与 SparkSQL 实例，同时还提供了JSON、S3对象存储以及 Posix 文件系统实例，充分满足用户对于结构化、半结构化、以及非结构化数据的需求。

从应用程序开发者与 DBA 的角度看，SequoiaDB 巨杉数据库所提供的关系型数据库实例，与传统 MySQL、PostgreSQL 和 SparkSQL 保持全兼容。例如，在 SequoiaDB 巨杉数据库中的 MySQL 实例中，其所有的增删改查语法、视图、触发器、事务、甚至访问计划都与传统 MySQL 保持一致。

作为分布式数据库，SequoiaDB 巨杉数据库的 SQL 实例用户不需要关心底层的数据到底被分散在一台还是多台设备中。用户可以简单创建一个分区表，向其中写入上亿条记录，其数据将会被自动分散在不同的物理设备中，对于应用程序根本无需关注分库分表，数据库自动提供分布式事务以及分布式访问等能力。

### 双活容灾与数据安全

双活容灾即灾备系统中使主生产端数据库和备机端数据库同时在线运行，处于可读可写状态的技术。在银行的交易系统中，双活容灾能力不仅保证数据不丢失，也保证系统在遭遇事故时能够短时间内重新上线。在正常情况下，双活架构的两个数据中心都能够同时提供业务的读写服务，而当一个中心宕机后，所有前端应用可以立刻切换至依然存活的数据中心继续使用。

SequoiaDB 巨杉数据库在内核层面实现了多种容灾方式，包括同城双活、同城双中心、同城三中心、两地三中心、与三地五中心等容灾策略。通过使用 SequoiaDB 巨杉数据库的容灾与高可用机制，数据中心内的服务器故障可以保证 RTO 与 RPO 均为零，而整个数据中心或同城网络故障也可以做到秒级 RTO=0、RPO=0。

### 关于 SequoiaDB 巨杉数据库

巨杉数据库专注新一代分布式数据库技术研发，自 2011 年成立以来，坚持从零开始打造分布式开源数据库引擎，是中国首家连续两年入选 Gartner 数据库报告的数据库厂商。

巨杉数据库的主要产品包括 SequoiaDB 分布式关系型数据库与 SequoiaCM 企业内容管理软件，企业级应用场景包括分布式在线交易、数据中台、分布式内容管理等。

目前巨杉数据库已在超过 50 家 500 强级别的大型商业银行核心生产业务上线，企业用户总数超过 1000 家。


小白观察：开源永存

Summary: Linux Journal 发布了新的头条文章《Open Source is Eternal》，在文中，作者 Glyn Moody 历数了从 1994 年开始的 Linux Journal 、计算机周刊、互联网档案馆等一系列的服务的历史。并通过这些网站的历史变迁，衬托出开源永生。

![](/data/attachment/album/201904/17/094325vf0xtopz9109n13n.jpg)

### Big News

##### Open Source Eternal 开源永存

Linux Journal 发布了新的头条文章《[Open Source is Eternal](https://www.linuxjournal.com/content/open-source-eternal)》，在文中，作者 Glyn Moody 历数了从 1994 年开始的 Linux Journal 、计算机周刊、互联网档案馆等一系列的服务的历史。并通过这些网站的历史变迁，衬托出开源永生。

![](/data/attachment/album/201904/15/110332k14jhr8741hrwx81.png)

>
> 不知不觉，Linux 已经来到这时间 28 年了，在过去的 28 年里，Linux 深刻的改变了我们的世界，Linux 推动了云计算、虚拟化等一系列技术的诞生。 Linux 永生！
>
>
>

### Quick News

##### Mozilla 发布了可以在浏览器下运行 Python 数据科学的项目 Pyodide

除了运行 Python 以外，Pyodide 还可以很好的和 JavaScript 进行交互。[Mozilla Hacks](https://hacks.mozilla.org/2019/04/pyodide-bringing-the-scientific-python-stack-to-the-browser/)

##### Kubernetes 如何简化 Bet365 的软件部署

Bet365是世界上最大的网上投注平台。他们使用 Kuberntets 来进行软件的部署。[ComputerWeekly](https://www.computerweekly.com/news/252461716/How-Kubernetes-has-simplified-bet365s-software-deployments)

>
> 来自网上投注平台 K8s 实践
>
>
>

##### 放弃 Windows 选择 Linux 的原因

精选的的系统和软件应用、高度可定制化的界面、更加轻量级以及更低可能的数据泄露。[SlashGear](https://www.slashgear.com/reasons-to-abandon-windows-for-linux-06572307/)

>
> 还需要更多好用的应用的支持。
>
>
>


每日安全资讯：专家发现漏洞后是否公示？新报告称已沦为黑客挥向用户的屠刀

![](/data/attachment/album/201904/17/095650cepwt5jtbiri8ytt.jpg)

是否公开发布安全漏洞（尤其是零日漏洞）的概念验证（PoC）代码历来是备受争议的话题。在代码公开之后往往会被威胁攻击者所利用，在数天乃至数小时内发起攻击，导致终端用户没有充足的时间来修复受影响的系统。而公开这些 PoC 代码的并非坏人或者其他独立来源，而是理论上更应该保护用户的白帽安全研究人员。

围绕着这个争议做法的话题已经持续多年时间，而信息安全领域的专家分成两派。其中一方认为安全研究人员不应该发布 PoC 代码，因为攻击者可以采用该代码并自动化攻击；而另一方认为 PoC 代码同时是测试大型网络和识别存在漏洞系统所必须的，允许IT部门成员模拟未来可能遭受到的攻击。

在上个月发布的“网络安全威胁观 2018 年第四季度”报告中，Positive Technologies 的安全专家再次触及了这场长期争论。

在这份报告中，Positive Technologies 的安全专家并没有给这个争论下判断，而是客观陈述了当前用户面临的安全问题。在漏洞发现的新闻曝光或者零日漏洞的 PoC 代码公开之后，在两种情况下黑客并没有为用户提供充足的时间来修复系统。

在这份季度威胁报告中，Positive Technologies 表示这种情况发生的频率越来越多。在报告中通过罗列了一系列安全事件，表明在PoC代码公开之后会立即被黑客所利用。例如在推特上有安全专家公开了 Windows 系统零日漏洞的 PoC 代码，随后 ESET 安全专家就观测到了此类恶意软件活动。例如在网络上关于中文 PHP 框架的漏洞公开之后，数百万网站立即遭到了攻击。

在接受外媒 ZDNet 采访时候，Positive Technologies 的安全弹性负责人 Leigh-Anne Galloway 表示：

>
> “作为安全行业的一员，我们有责任倡导漏洞公示守则。但是并非所有人都遵循这个原则。同样并非所有安全供应商都知道或者了解。……通常公开披露的驱动因素是因为供应商没有认识到问题的严重性，也没有解决漏洞。或者安全研究人员可能已经尝试了所有其他途径来传达他们的发现。当然，危险的是犯罪分子可能使用此信息来攻击受害者。供应商要求提供证据证明该漏洞实际存在于他们的产品中，并且当研究人员向他们报告漏洞时可以利用这些漏洞。研究人员需要证明它是如何被利用的，为此创建了PoC代码。”
>
>
>

通过 CVSS 系统来标记该漏洞的危险程度。如果供应商向研究人员支付漏洞奖励框架内发现的漏洞，研究人员会从这项工作中赚钱，但供应商通常不会安排他们的 bug-bounty 计划，研究人员可以从中得到的所有内容都是专家社区的公开认可。通过在互联网上演示漏洞，展示操作和 PoC 代码的一个例子，研究人员得到了认可和尊重。

通常情况下，研究人员只有在他们通知供应商有关漏洞的足够长时间后才会发布漏洞利用代码，从而使产品开发人员有机会关闭漏洞并通知用户需要安装升级。但是，很多时候，供应商会推迟发布补丁和更新，有时会延迟六个月以上，因此，在发布补丁之后，[PoC] 漏洞的公示就会发生。

来源：cnBeta.COM

### 更多资讯

##### 印度外包巨头遭入侵

印度 IT 外包巨头 Wipro 正在调查其 IT 系统遭到入侵，并被用于对其客户发动攻击的报道。Wipro 是印度第三大 IT 外包公司，匿名消息来源称该公司的系统被用于作为起跳点对其数十家客户的系统发动钓鱼式刺探。

来源： solidot.org

详情： <http://t.cn/EX9pVxu>

##### 微软向 Office 用户提供更多数据收集控制选项

近年来，微软对自家产品和服务引入了更加激进的数据收集政策，但这也惹恼了许多注重隐私的客户。无论是 Windows 10 操作系统，还是 Microsoft Office 生产力套件，均包含了获取遥测数据的功能。但长期以来，用户并不能对数据收集的选项作出太多的调整，更别提轻松的找到相关的设置选项了。不过最近，微软正在酝酿给 Office 用户带来一项新的变化。

来源： cnBeta.COM

详情： <http://t.cn/EX9piRr>

##### 卡巴斯基报告：70% 的黑客攻击事件瞄准 Office 漏洞

据美国科技媒体 ZDNet 援引卡巴斯基实验室报告称，黑客最喜欢攻击微软 Office 产品。 在<ruby> 安全分析师峰会 <rp>  （ </rp> <rt>  Security Analyst Summit </rt> <rp>  ） </rp></ruby>上，卡巴斯基表示，分析卡巴斯基产品侦测的攻击后发现，2018 年四季度有 70% 利用了Office 漏洞。而在2016年四季度，这一比例只有16%。

来源： 新浪科技

详情： <http://t.cn/EX9pKCN>

##### 个人数据保护迈出勇敢一步

新加坡亚洲新闻网 4 月 15 日文章，原题：中国加大对个人数据的保护 长期以来，中国政府部门、商业机构及普通消费者一直在努力应对新兴互联网技术对个人数据保护造成的影响。随着有关问题日益严重，中国正推进制定覆盖国内外企业的国家层面的法律，以保护消费者隐私。

来源： 环球时报

详情： <http://t.cn/EX9ppe3>

（信息来源于网络，安华金和搜集整理）


破除对 AWS Fargate 的幻觉

![](/data/attachment/album/201904/17/105605bunt8noyrw8qt338.jpg)

我在 $work 建立了一个基于 Kubernetes 的平台已经快一年了，而且有点像 Kubernetes 的布道者了。真的，我认为这项技术太棒了。然而我并没有对它的运营和维护的困难程度抱过什么幻想。今年早些时候我读了[这样](https://matthias-endler.de/2019/maybe-you-dont-need-kubernetes/)的一篇文章，并对其中某些观点深以为然。如果我在一家规模较小的、有 10 到 15 个工程师的公司，假如有人建议管理和维护一批 Kubernetes 集群，那我会感到害怕的，因为它的运维开销太高了！

尽管我现在对 Kubernetes 的一切都很感兴趣，但我仍然对“<ruby> 无服务器 <rt>  Serverless </rt></ruby>”计算会消灭运维工程师的说法抱有好奇。这种好奇心主要来源于我希望在未来仍然能有一份有报酬的工作 —— 如果我们前景光明的未来不需要运维工程师，那我得明白到底是怎么回事。我已经在 Lamdba 和Google Cloud Functions 上做了一些实验，结果让我印象十分深刻，但我仍然坚信无服务器解决方案只是解决了一部分问题。

我关注 [AWS Fargate](https://aws.amazon.com/fargate/) 已经有一段时间了，这就是 $work 的开发人员所推崇为“无服务器计算”的东西 —— 主要是因为 Fargate，用它你就可以无需管理底层节点而运行你的 Docker 容器。我想看看它到底意味着什么，所以我开始尝试从头开始在 Fargate 上运行一个应用，看看是否可以成功。这里我对成功的定义是一个与“生产级”应用程序相近的东西，我想应该包含以下内容：

* 一个在 Fargate 上运行的容器
* 配置信息以环境变量的形式下推
* “秘密信息” 不能是明文的
* 位于负载均衡器之后
* 有效的 SSL 证书的 TLS 通道

我以“基础设施即代码”的角度来开始整个任务，不遵循默认的 AWS 控制台向导，而是使用 terraform 来定义基础架构。这很可能让整个事情变得复杂，但我想确保任何部署都是可重现的，任何想要遵循此步骤的人都可发现我的结论。

上述所有标准通常都可以通过基于 Kubernetes 的平台使用一些外部的附加组件和插件来实现，所以我确实是以一种比较的心态来处理整个任务的，因为我要将它与我的常用工作流程进行比较。我的主要目标是看看Fargate 有多容易，特别是与 Kubernetes 相比时。结果让我感到非常惊讶。

### AWS 是有开销的

我有一个干净的 AWS 账户，并决定从零到部署一个 webapp。与 AWS 中的其它基础设施一样，我必须首先使基本的基础设施正常工作起来，因此我需要先定义一个 VPC。

遵循最佳实践，因此我将这个 VPC 划分为跨可用区（AZ）的子网，一个公共子网和私有子网。这时我想到，只要这种设置基础设施的需求存在，我就能找到一份这种工作。AWS 是免运维的这一概念一直让我感到愤怒。开发者社区中的许多人理所当然地认为在设置和定义一个设计良好的 AWS 账户和基础设施是不需要付出多少工作和努力的。而这种想当然甚至发生在开始谈论多帐户架构*之前*就有了——现在我仍然使用单一帐户，我已经必须定义好基础设施和传统的网络设备。

这里也值得记住，我已经做了很多次，所以我*很清楚*该做什么。我可以在我的帐户中使用默认的 VPC 以及预先提供的子网，我觉得很多刚开始的人也可以使用它。这大概花了我半个小时才运行起来，但我不禁想到，即使我想运行 lambda 函数，我仍然需要某种连接和网络。定义 NAT 网关和在 VPC 中路由根本不会让你觉得很“Serverless”，但要往下进行这就是必须要做的。

### 运行简单的容器

在我启动运行了基本的基础设施之后，现在我想让我的 Docker 容器运行起来。我开始翻阅 Fargate 文档并浏览 [入门](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html) 文档，这些就马上就展现在了我面前：

![](/data/attachment/album/201904/17/105648yh5hffn1a8k3399x.png)

等等，只是让我的容器运行就至少要有**三个**步骤？这完全不像我所想的，不过还是让我们开始吧。

#### 任务定义

“<ruby> 任务定义 <rt>  Task Definition </rt> <rt> </rt></ruby>”用来定义要运行的实际容器。我在这里遇到的问题是，任务定义这件事非常复杂。这里有很多选项都很简单，比如指定 Docker 镜像和内存限制，但我还必须定义一个网络模型以及我并不熟悉的其它各种选项。真需要这样吗？如果我完全没有 AWS 方面的知识就进入到这个过程里，那么在这个阶段我会感觉非常的不知所措。可以在 AWS 页面上找到这些 [参数](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html) 的完整列表，这个列表很长。我知道我的容器需要一些环境变量，它需要暴露一个端口。所以我首先在一个神奇的 [terraform 模块](https://github.com/cloudposse/terraform-aws-ecs-container-definition) 的帮助下定义了这一点，这真的让这件事更容易了。如果没有这个模块，我就得手写 JSON 来定义我的容器定义。

首先我定义了一些环境变量：

```
container_environment_variables = [
    {
      name  = "USER"
      value = "${var.user}"
    },
    {
      name  = "PASSWORD"
      value = "${var.password}"
    }
]
```

然后我使用上面提及的模块组成了任务定义：

```
module "container_definition_app" {
  source  = "cloudposse/ecs-container-definition/aws"
  version = "v0.7.0"

  container_name  = "${var.name}"
  container_image = "${var.image}"

  container_cpu                = "${var.ecs_task_cpu}"
  container_memory             = "${var.ecs_task_memory}"
  container_memory_reservation = "${var.container_memory_reservation}"

  port_mappings = [
    {
      containerPort = "${var.app_port}"
      hostPort      = "${var.app_port}"
      protocol      = "tcp"
    },
  ]

  environment = "${local.container_environment_variables}"

}
```

在这一点上我非常困惑，我需要在这里定义很多配置才能运行，而这时什么都没有开始呢，但这是必要的 —— 运行 Docker 容器肯定需要了解一些容器配置的知识。我 [之前写过](https://leebriggs.co.uk/blog/2018/05/08/kubernetes-config-mgmt.html) 关于 Kubernetes 和配置管理的问题的文章，在这里似乎遇到了同样的问题。

接下来，我在上面的模块中定义了任务定义（幸好从我这里抽象出了所需的 JSON —— 如果我不得不手写JSON，我可能已经放弃了）。

当我定义模块参数时，我突然意识到我漏掉了一些东西。我需要一个 IAM 角色！好吧，让我来定义：

```
resource "aws_iam_role" "ecs_task_execution" {
  name = "${var.name}-ecs_task_execution"

  assume_role_policy = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Effect": "Allow"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "ecs_task_execution" {
  count = "${length(var.policies_arn)}"

  role       = "${aws_iam_role.ecs_task_execution.id}"
  policy_arn = "${element(var.policies_arn, count.index)}"
}
```

这样做是有意义的，我需要在 Kubernetes 中定义一个 RBAC 策略，所以在这里我还未完全错失或获得任何东西。这时我开始觉得从 Kubernetes 的角度来看，这种感觉非常熟悉。

```
resource "aws_ecs_task_definition" "app" {
  family                   = "${var.name}"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "${var.ecs_task_cpu}"
  memory                   = "${var.ecs_task_memory}"
  execution_role_arn       = "${aws_iam_role.ecs_task_execution.arn}"
  task_role_arn            = "${aws_iam_role.ecs_task_execution.arn}"

  container_definitions    = "${module.container_definition_app.json}"

}
```

现在，为了运行起来我已经写了很多行代码，我阅读了很多 ECS 文档，我所做的就是定义一个任务定义。我还没有让这个东西运行起来。在这一点上，我真的很困惑这个基于 Kubernetes 的平台到底增值了什么，但我继续前行。

#### 服务

服务，一定程度上是将容器如何暴露给外部，另外是如何定义它拥有的副本数量。我的第一个想法是“啊！这就像一个 Kubernetes 服务！”我开始着手映射端口等。这是我第一次在 terraform 上跑：

```
resource "aws_ecs_service" "app" {
  name                               = "${var.name}"
  cluster                            = "${module.ecs.this_ecs_cluster_id}"
  task_definition                    = "${data.aws_ecs_task_definition.app.family}:${max(aws_ecs_task_definition.app.revision, data.aws_ecs_task_definition.app.revision)}"
  desired_count                      = "${var.ecs_service_desired_count}"
  launch_type                        = "FARGATE"
  deployment_maximum_percent         = "${var.ecs_service_deployment_maximum_percent}"
  deployment_minimum_healthy_percent = "${var.ecs_service_deployment_minimum_healthy_percent}"

  network_configuration {
    subnets          = ["${values(local.private_subnets)}"]
    security_groups  = ["${module.app.this_security_group_id}"]
  }

}
```

当我必须定义允许访问所需端口的安全组时，我再次感到沮丧，当我这样做了并将其插入到网络配置中后，我就像被扇了一巴掌。

我还需要定义自己的负载均衡器？

什么？

当然不是吗？

##### 负载均衡器从未远离

老实说，我很满意，我甚至不确定为什么。我已经习惯了 Kubernetes 的服务和 Ingress 对象，我一心认为用 Kubernetes 将我的应用程序放到网上是多么容易。当然，我们在 $work 花了几个月的时间建立一个平台，以便更轻松。我是 [external-dns](https://github.com/kubernetes-incubator/external-dns) 和 [cert-manager](https://github.com/jetstack/cert-manager) 的重度用户，它们可以自动填充 Ingress 对象上的 DNS 条目并自动化 TLS 证书，我非常了解进行这些设置所需的工作，但老实说，我认为在 Fargate 上做这件事会更容易。我认识到 Fargate 并没有声称自己是“如何运行应用程序”这件事的全部和最终目的，它只是抽象出节点管理，但我一直被告知这比 Kubernetes *更加容易*。我真的很惊讶。定义负载均衡器（即使你不想使用 Ingress 和 Ingress Controller）也是向 Kubernetes 部署服务的重要组成部分，我不得不在这里再次做同样的事情。这一切都让人觉得如此熟悉。

我现在意识到我需要：

* 一个负载均衡器
* 一个 TLS 证书
* 一个 DNS 名字

所以我着手做了这些。我使用了一些流行的 terraform 模块，并做了这个：

```
# Define a wildcard cert for my app
module "acm" {
  source  = "terraform-aws-modules/acm/aws"
  version = "v1.1.0"

  create_certificate = true

  domain_name = "${var.route53_zone_name}"
  zone_id     = "${data.aws_route53_zone.this.id}"

  subject_alternative_names = [
    "*.${var.route53_zone_name}",
  ]

  tags = "${local.tags}"

}
# Define my loadbalancer
resource "aws_lb" "main" {
  name            = "${var.name}"
  subnets         = [ "${values(local.public_subnets)}" ]
  security_groups = ["${module.alb_https_sg.this_security_group_id}", "${module.alb_http_sg.this_security_group_id}"]
}

resource "aws_lb_target_group" "main" {
  name        = "${var.name}"
  port        = "${var.app_port}"
  protocol    = "HTTP"
  vpc_id      = "${local.vpc_id}"
  target_type = "ip"
  depends_on  = [ "aws_lb.main" ]
}

# Redirect all traffic from the ALB to the target group
resource "aws_lb_listener" "main" {
  load_balancer_arn = "${aws_lb.main.id}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_lb_target_group.main.id}"
    type             = "forward"
  }
}

resource "aws_lb_listener" "main-tls" {
  load_balancer_arn = "${aws_lb.main.id}"
  port              = "443"
  protocol          = "HTTPS"
  certificate_arn   = "${module.acm.this_acm_certificate_arn}"

  default_action {
    target_group_arn = "${aws_lb_target_group.main.id}"
    type             = "forward"
  }
}
```

我必须承认，我在这里搞砸了好几次。我不得不在 AWS 控制台中四处翻弄，以弄清楚我做错了什么。这当然不是一个“轻松”的过程，而且我之前已经做过很多次了。老实说，在这一点上，Kubernetes 看起来对我很有启发性，但我意识到这是因为我对它非常熟悉。幸运的是我能够使用托管的 Kubernetes 平台（预装了 external-dns 和 cert-manager），我真的很想知道我漏掉了 Fargate 什么增值的地方。它真的感觉不那么简单。

经过一番折腾，我现在有一个可以工作的 ECS 服务。包括服务在内的最终定义如下所示：

```
data "aws_ecs_task_definition" "app" {
  task_definition = "${var.name}"
  depends_on      = ["aws_ecs_task_definition.app"]
}

resource "aws_ecs_service" "app" {
  name                               = "${var.name}"
  cluster                            = "${module.ecs.this_ecs_cluster_id}"
  task_definition                    = "${data.aws_ecs_task_definition.app.family}:${max(aws_ecs_task_definition.app.revision, data.aws_ecs_task_definition.app.revision)}"
  desired_count                      = "${var.ecs_service_desired_count}"
  launch_type                        = "FARGATE"
  deployment_maximum_percent         = "${var.ecs_service_deployment_maximum_percent}"
  deployment_minimum_healthy_percent = "${var.ecs_service_deployment_minimum_healthy_percent}"

  network_configuration {
    subnets          = ["${values(local.private_subnets)}"]
    security_groups  = ["${module.app_sg.this_security_group_id}"]
  }

  load_balancer {
    target_group_arn = "${aws_lb_target_group.main.id}"
    container_name   = "app"
    container_port   = "${var.app_port}"
  }

  depends_on = [
    "aws_lb_listener.main",
  ]

}
```

我觉得我已经接近完成了，但后来我记起了我只完成了最初的“入门”文档中所需的 3 个步骤中的 2 个，我仍然需要定义 ECS 群集。

#### 集群

感谢 [定义模块](https://github.com/terraform-aws-modules/terraform-aws-ecs)，定义要所有这些运行的集群实际上非常简单。

```
module "ecs" {
  source  = "terraform-aws-modules/ecs/aws"
  version = "v1.1.0"

  name = "${var.name}"
}
```

这里让我感到惊讶的是为什么我必须定义一个集群。作为一个相当熟悉 ECS 的人，你会觉得你需要一个集群，但我试图从一个必须经历这个过程的新人的角度来考虑这一点 —— 对我来说，Fargate 标榜自己“ Serverless”而你仍需要定义集群，这似乎很令人惊讶。当然这是一个小细节，但它确实盘旋在我的脑海里。

### 告诉我你的 Secret

在这个阶段，我很高兴我成功地运行了一些东西。然而，我的原始的成功标准缺少一些东西。如果我们回到任务定义那里，你会记得我的应用程序有一个存放密码的环境变量：

```
container_environment_variables = [
    {
      name  = "USER"
      value = "${var.user}"
    },
    {
      name  = "PASSWORD"
      value = "${var.password}"
    }
]
```

如果我在 AWS 控制台中查看我的任务定义，我的密码就在那里，明晃晃的明文。我希望不要这样，所以我开始尝试将其转化为其他东西，类似于 [Kubernetes 的Secrets管理](https://kubernetes.io/docs/concepts/configuration/secret/)。

#### AWS SSM

Fargate / ECS 执行<ruby> secret 管理 <rt>  secret management </rt></ruby>部分的方式是使用 [AWS SSM](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html)（此服务的全名是 AWS 系统管理器参数存储库 Systems Manager Parameter Store，但我不想使用这个名称，因为坦率地说这个名字太愚蠢了）。

AWS 文档很好的[涵盖了这个内容](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html)，因此我开始将其转换为 terraform。

##### 指定秘密信息

首先，你必须定义一个参数并为其命名。在 terraform 中，它看起来像这样：

```
resource "aws_ssm_parameter" "app_password" {
  name  = "${var.app_password_param_name}" # The name of the value in AWS SSM
  type  = "SecureString"
  value = "${var.app_password}" # The actual value of the password, like correct-horse-battery-stable
}
```

显然，这里的关键部分是 “SecureString” 类型。这会使用默认的 AWS KMS 密钥来加密数据，这对我来说并不是很直观。这比 Kubernetes 的 Secret 管理具有巨大优势，默认情况下，这些 Secret 在 etcd 中是不加密的。

然后我为 ECS 指定了另一个本地值映射，并将其作为 Secret 参数传递：

```
container_secrets = [
    {
      name      = "PASSWORD"
      valueFrom = "${var.app_password_param_name}"
    },
]

module "container_definition_app" {
  source  = "cloudposse/ecs-container-definition/aws"
  version = "v0.7.0"

  container_name  = "${var.name}"
  container_image = "${var.image}"

  container_cpu                = "${var.ecs_task_cpu}"
  container_memory             = "${var.ecs_task_memory}"
  container_memory_reservation = "${var.container_memory_reservation}"

  port_mappings = [
    {
      containerPort = "${var.app_port}"
      hostPort      = "${var.app_port}"
      protocol      = "tcp"
    },
  ]

  environment = "${local.container_environment_variables}"
  secrets     = "${local.container_secrets}"
```

##### 出了个问题

此刻，我重新部署了我的任务定义，并且非常困惑。为什么任务没有正确拉起？当新的任务定义（版本 8）可用时，我一直在控制台中看到正在运行的应用程序仍在使用先前的任务定义（版本 7）。解决这件事花费的时间比我预期的要长，但是在控制台的事件屏幕上，我注意到了 IAM 错误。我错过了一个步骤，容器无法从 AWS SSM 中读取 Secret 信息，因为它没有正确的 IAM 权限。这是我第一次真正对整个这件事情感到沮丧。从用户体验的角度来看，这里的反馈非常*糟糕*。如果我没有发觉的话，我会认为一切都很好，因为仍然有一个任务正在运行，我的应用程序仍然可以通过正确的 URL 访问 —— 只不过是旧的配置而已。

在 Kubernetes 里，我会清楚地看到 pod 定义中的错误。Fargate 可以确保我的应用不会停止，这绝对是太棒了，但作为一名运维，我需要一些关于发生了什么的实际反馈。这真的不够好。我真的希望 Fargate 团队的人能够读到这篇文章，改善这种体验。

### 就这样了

到这里就结束了，我的应用程序正在运行，也符合我的所有标准。我确实意识到我做了一些改进，其中包括：

* 定义一个 cloudwatch 日志组，这样我就可以正确地写日志了
* 添加了一个 route53 托管区域，使整个事情从 DNS 角度更容易自动化
* 修复并重新调整了 IAM 权限，这里太宽泛了

但老实说，现在我想反思一下这段经历。我写了一个关于我的经历的 [推特会话](https://twitter.com/briggsl/status/1116870900719030272)，然后花了其余时间思考我在这里的真实感受。

### 代价

经过一夜的反思，我意识到无论你是使用 Fargate 还是 Kubernetes，这个过程都大致相同。最让我感到惊讶的是，尽管我经常听说 Fargate “更容易”，但我真的没有看到任何超过 Kubernetes 平台的好处。现在，如果你正在构建 Kubernetes 集群，我绝对可以看到这里的价值 —— 管理节点和控制面板只是不必要的开销，问题是 —— 基于 Kubernetes 的平台的大多数消费者都*没有*这样做。如果你很幸运能够使用 GKE，你几乎不需要考虑集群的管理，你可以使用单个 `gcloud` 命令来运行集群。我经常使用 Digital Ocean 的 Kubernetes 托管服务，我可以肯定地说它就像操作 Fargate 集群一样简单，实际上在某种程度上它更容易。

必须定义一些基础设施来运行你的容器就是此时的代价。谷歌本周可能刚刚使用他们的 [Google Cloud Run](https://cloud.google.com/run/) 产品改变了游戏规则，但他们在这一领域的领先优势远远领先于其他所有人。

从这整个经历中，我可以肯定的说：*大规模运行容器仍然很难。*它需要思考，需要领域知识，需要运维和开发人员之间的协作。它还需要一个基础来构建 —— 任何基于 AWS 的操作都需要事先定义和运行一些基础架构。我对一些公司似乎渴望的 “NoOps” 概念非常感兴趣。我想如果你正在运行一个无状态应用程序，你可以把它全部放在一个 lambda 函数和一个 API 网关中，这可能不错，但我们是否真的适合在任何一种企业环境中这样做？我真的不这么认为。

#### 公平比较

令我印象深刻的另一个现实是，技术 A 和技术 B 之间的比较通常不太公平，我经常在 AWS 上看到这一点。这种实际情况往往与 Jeff Barr 博客文章截然不同。如果你是一家足够小的公司，你可以使用 AWS 控制台在 AWS 中部署你的应用程序并接受所有默认值，这绝对更容易。但是，我不想使用默认值，因为默认值几乎是不适用于生产环境的。一旦你开始剥离掉云服务商服务的层面，你就会开始意识到最终你仍然是在运行软件 —— 它仍然需要设计良好、部署良好、运行良好。我相信 AWS 和 Kubernetes 以及所有其他云服务商的增值服务使得它更容易运行、设计和操作，但它绝对不是免费的。

#### Kubernetes 的争议

最后就是：如果你将 Kubernetes 纯粹视为一个容器编排工具，你可能会喜欢 Fargate。然而，随着我对 Kubernetes 越来越熟悉，我开始意识到它作为一种技术的重要性 —— 不仅因为它是一个伟大的容器编排工具，而且因为它的设计模式 —— 它是声明性的、API 驱动的平台。 在*整个* Fargate 过程期间发生的一个简单的事情是，如果我删除这里某个东西，Fargate 不一定会为我重新创建它。自动缩放很不错，不需要管理服务器和操作系统的补丁及更新也很棒，但我觉得因为无法使用 Kubernetes 自我修复和 API 驱动模型而失去了很多。当然，Kubernetes 有一个学习曲线，但从这里的体验来看，Fargate 也是如此。

### 总结

尽管我在这个过程中遭遇了困惑，但我确实很喜欢这种体验。我仍然相信 Fargate 是一项出色的技术，AWS 团队对 ECS/Fargate 所做的工作确实非常出色。然而，我的观点是，这绝对不比 Kubernetes “更容易”，只是……难点不同。

在生产环境中运行容器时出现的问题大致相同。如果你从这篇文章中有所收获，它应该是这样的：*不管你选择的哪种方式都有运维开销*。不要相信你选择一些东西你的世界就变得更轻松。我个人的意见是：如果你有一个运维团队，而你的公司要为多个应用程序团队部署容器 —— 选择一种技术并围绕它构建流程和工具以使其更容易。

人们说的一点肯定没错，用点技巧可以更容易地使用某种技术。在这个阶段，谈到 Fargate，下面的漫画这总结了我的感受：

![](/data/attachment/album/201904/17/105659tez2vppfevf4whwe.jpg)

---

via: <https://leebriggs.co.uk/blog/2019/04/13/the-fargate-illusion.html>

作者：[Lee Briggs](https://leebriggs.co.uk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Bestony](https://github.com/Bestony) 校对：[wxy](https://github.com/wxy), 临石（阿里云智能技术专家）

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


使用 RadioDroid 流传输网络广播

Summary: 通过简单的设置使用你家中的音响收听你最爱的网络电台。

通过简单的设置使用你家中的音响收听你最爱的网络电台。

>
> 通过简单的设置使用你家中的音响收听你最爱的网络电台。
>
>
>

![](/data/attachment/album/201904/17/192645rbacky0mrogka0bk.png "woman programming")

最近网络媒体对 [Google 的 Chromecast 音频设备的下架](https://www.theverge.com/2019/1/11/18178751/google-chromecast-audio-discontinued-sale)发出叹息。该设备在音频媒体界备受[好评](https://www.whathifi.com/google/chromecast-audio/review)，因此我已经在考虑入手一个。基于 Chromecast 退场的消息，我决定在它们全部被打包扔进垃圾堆之前以一个合理价位买一个。

我在 [MobileFun](https://www.mobilefun.com/google-chromecast-audio-black-70476) 上找到一个放进我的订单中。这个设备最终到货了。它被包在一个普普通通、简简单单的 Google 包装袋中，外面打印着非常简短的使用指南。

![Google Chromecast 音频](/data/attachment/album/201904/17/192647i3oavvo8j4n3ox38.png "Google Chromecast Audio")

我通过我的数模转换器的光纤 S/PDIF 连接接入到家庭音响，希望以此能提供最佳的音质。

安装过程并无纰漏，在五分钟后我就可以播放一些音乐了。我知道一些安卓应用支持 Chromecast，因此我决定用 Google Play Music 测试它。意料之中，它工作得不错，音乐效果听上去也相当好。然而作为一个具有开源精神的人，我决定看看我能找到什么开源播放器能兼容 Chromecast。

### RadioDroid 的救赎

[RadioDroid 安卓应用](https://play.google.com/store/apps/details?id=net.programmierecke.radiodroid2) 满足条件。它是开源的，并且可从 [GitHub](https://github.com/segler-alex/RadioDroid)、Google Play 以及 [F-Droid](https://f-droid.org/en/packages/net.programmierecke.radiodroid2/) 上获取。根据帮助文档，RadioDroid 从 [Community Radio Browser](http://www.radio-browser.info/gui/#!/) 网页寻找播放流。因此我决定在我的手机上安装尝试一下。

![RadioDroid](/data/attachment/album/201904/17/192648whwjh3e7rjqlhz83.png "RadioDroid")

安装过程快速顺利，RadioDroid 打开展示当地电台十分迅速。你可以在这个屏幕截图的右上方附近看到 Chromecast 按钮（看上去像一个有着波阵面的长方形图标）。

我尝试了几个当地电台。这个应用可靠地在我手机喇叭上播放了音乐。但是我不得不摆弄 Chromecast 按钮来通过 Chromecast 把音乐传到流上。但是它确实可以做到流传输。

我决定找一下我喜爱的网络广播电台：法国马赛的 [格雷诺耶广播电台](http://www.radiogrenouille.com/)。在 RadioDroid 上有许多找到电台的方法。其中一种是使用标签——“当地”、“最流行”等——就在电台列表上方。其中一个标签是国家，我找到法国，在其 1500 个电台中划来划去寻找格雷诺耶广播电台。另一种办法是使用屏幕上方的查询按钮；查询迅速找到了那家美妙的电台。我尝试了其它几次查询它们都返回了合理的信息。

回到“当地”标签，我在列表中翻来覆去，发现“当地”的定义似乎是“在同一个国家”。因此尽管西雅图、波特兰、旧金山、洛杉矶和朱诺比多伦多更靠近我的家，我并没有在“当地”标签中看到它们。然而通过使用查询功能，我可以发现所有名字中带有西雅图的电台。

“语言”标签使我找到所有用葡语（及葡语方言）播报的电台。我很快发现了另一个最爱的电台 [91 Rock Curitiba](https://91rock.com.br/)。

接着灵感来了，虽然现在是春天了，但又如何呢？让我们听一些圣诞音乐。意料之中，搜寻圣诞把我引到了 [181.FM – Christmas Blender](http://player.181fm.com/?station=181-xblender)。不错，一两分钟的欣赏对我就够了。

因此总的来说，我推荐把 RadioDroid 和 Chromecast 的组合作为一种用家庭音响以合理价位播放网络电台的良好方式。

### 对于音乐方面……

最近我从 [Blue Coast Music](https://bluecoastmusic.com/store) 商店里选了一个 [Qua Continuum](https://bluecoastmusic.com/artists/qua-continuum) 创作的叫作 [Continuum One](https://www.youtube.com/watch?v=PqLCQXPS8iQ) 的有趣的氛围（甚至无节拍）音乐专辑。

Blue Coast 有许多可提供给开源音乐爱好者的。音乐可以无需通过那些奇怪的平台专用下载管理器下载（有时以物理形式）。它通常提供几种形式，包括 WAV、FLAC 和 DSD；WAV 和 FLAC 还提供不同的字长和比特率，包括 16/44.1、24/96 和 24/192，针对 DSD 则有 2.8、5.6 和 11.2 MHz。音乐是用优秀的仪器精心录制的。不幸的是，我并没有找到许多符合我口味的音乐，尽管我喜欢 Blue Coast 上能获取的几个艺术家，包括 Qua Continuum，[Art Lande](https://bluecoastmusic.com/store?f%5B0%5D=search_api_multi_aggregation_1%3Aart%20lande) 以及 [Alex De Grassi](https://bluecoastmusic.com/store?f%5B0%5D=search_api_multi_aggregation_1%3Aalex%20de%20grassi)。

在 [Bandcamp](https://bandcamp.com/) 上，我挑选了 [Emancipator’s Baralku](https://emancipator.bandcamp.com/album/baralku) 和 [Framework’s Tides](https://frameworksuk.bandcamp.com/album/tides)，两个都是我喜欢的。两位艺术家创作的音乐符合我的口味——电音但又（总体来说）不是舞蹈，它们的音乐旋律优美，副歌也很好听。有许多可以让开源音乐发烧友爱上 Bandcamp 的东西，比如买前试听整首歌的服务；没有垃圾软件下载器；与大量音乐家的合作；以及对 [Creative Commons music](https://bandcamp.com/tag/creative-commons) 的支持。

---

via: <https://opensource.com/article/19/4/radiodroid-internet-radio-player>

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

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


使用 Dask 在 Python 中进行并行计算

Summary: Dask 库可以将 Python 计算扩展到多个核心甚至是多台机器。

Dask 库可以将 Python 计算扩展到多个核心甚至是多台机器。

>
> Dask 库可以将 Python 计算扩展到多个核心甚至是多台机器。
>
>
>

![](/data/attachment/album/201904/17/222443oozyvxoze6okeiv3.jpg)

关于 Python 性能的一个常见抱怨是[全局解释器锁](https://wiki.python.org/moin/GlobalInterpreterLock)（GIL）。由于 GIL，同一时刻只能有一个线程执行 Python 字节码。因此，即使在现代的多核机器上，使用线程也不会加速计算。

但当你需要并行化到多核时，你不需要放弃使用 Python：[Dask](https://github.com/dask/dask) 库可以将计算扩展到多个内核甚至多个机器。某些设置可以在数千台机器上配置 Dask，每台机器都有多个内核。虽然存在扩展规模的限制，但一般达不到。

虽然 Dask 有许多内置的数组操作，但举一个非内置的例子，我们可以计算[偏度](https://en.wikipedia.org/wiki/Skewness#Definition)：

```
import numpy
import dask
from dask import array as darray

arr = dask.from_array(numpy.array(my_data), chunks=(1000,))
mean = darray.mean()
stddev = darray.std(arr)
unnormalized_moment = darry.mean(arr * arr * arr)
## See formula in wikipedia:
skewness = ((unnormalized_moment - (3 * mean * stddev ** 2) - mean ** 3) /
            stddev ** 3)
```

请注意，每个操作将根据需要使用尽可能多的内核。这将在所有核心上并行化执行，即使在计算数十亿个元素时也是如此。

当然，并不是我们所有的操作都可由这个库并行化，有时我们需要自己实现并行性。

为此，Dask 有一个“延迟”功能：

```
import dask

def is_palindrome(s):
    return s == s[::-1]

palindromes = [dask.delayed(is_palindrome)(s) for s in string_list]
total = dask.delayed(sum)(palindromes)
result = total.compute()
```

这将计算字符串是否是回文并返回回文的数量。

虽然 Dask 是为数据科学家创建的，但它绝不仅限于数据科学。每当我们需要在 Python 中并行化任务时，我们可以使用 Dask —— 无论有没有 GIL。

---

via: <https://opensource.com/article/19/4/parallel-computation-python-dask>

作者：[Moshe Zadka (Community Moderator)](https://opensource.com/users/moshez) 选题：[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/) 荣誉推出


每日安全资讯：因不满支持论坛，安全人员连续公布三个 WordPress 插件漏洞

近日，有安全研究人员连续在 Plugin Vulnerabilities 平台上，对外公布了 3 个 WordPress 插件的 0day 漏洞，将 10 万个 WordPress 网站于陷于安全风险中。

![](/data/attachment/album/201904/18/081229eaqqwwwc1o5cered.jpeg)

相关研究人员在公布这些漏洞时，提到他们只是为了抗议 WordPress 支持论坛版（WordPress Support Forum）的版主行为。只要版主停止不当行为，他们会立即终止对外揭露 0day 漏洞。

被揭露漏洞的 3 个 WordPress 插件分别是 Social Warfare、Yuzo Related Posts 和 Yellow Pencil Visual Theme Customizer。其中，Warfare 是个社交网站分享插件，有超过 6 万个 WordPress 网站安装了该插件。研究人员在 3 周前公布了 Social Warfare 的安全漏洞，插件开发人员即时将它修补了。

另外两个插件就没这么幸运了。可用来自动找出相关文章的 Yuzo Related Posts 原本拥有 6 万个安装数量，可自定义主题的 Yellow Pencil Visual Theme Customizer 则有 3 万个安装数量，这两个插件都都惹来了攻击，目前已在 WordPress 插件商店下架，插件开发人员还建议用户应尽快将所安装的版本移除。

据了解，原本安全人员在公开漏洞前，会给开发者一定的缓冲时间。而这次漏洞曝光，研究人员故意不遵循责任揭露，直接对外公开这些 WordPress 插件漏洞。他们声称目的是为了抗议 WordPress 支持论坛版主的不当行为。这些版主明知有些热门插件含有漏洞，却未通知相关的开发人员。版主们甚至会联手隐瞒插件的安全问题，为了推广特定安全服务而阻拦用户得到其它帮助。

这次漏洞接连曝光事件，看起来很像是 Plugin Vulnerabilities 平台与 WordPress 支持论坛之间的恩怨而引发的。前者不仅是为 WordPress 打造，定位更是专门对抗 WordPress 插件漏洞的服务。但不论如何，原本应该是维护 WordPress 安全的事件，目前却已危及到了众多 WordPress 网站的安全。

来源：开源中国

### 更多资讯

##### 阿桑奇被捕后 厄瓜多尔政府和机构网站遭到 4000 万次攻击

由于厄瓜多尔现任总统莫雷诺撤回了外交庇护，维基解密创始人<ruby> 朱利安·阿桑奇 <rp>  （ </rp> <rt>  Julian Assange </rt> <rp>  ） </rp></ruby>藏身厄瓜多尔驻英大使馆将近7年之后被抓。在接受法新社采访的时候， 厄瓜多资讯与通讯科技部副部长 Patricio Real 表示在阿桑奇遭到逮捕之后，已经受到了大规模针对该国的网络攻击。

来源： cnBeta.COM

详情： <http://t.cn/EXYhKm8>

##### 本月补丁星期二活动已修复卡巴斯基发现的严重零日漏洞

在 4 月 9 日发布的补丁星期二活动日中，微软修复了卡巴斯基发现的一个零日漏洞，如果被黑客控制可以获得控制系统的完整权限。该漏洞编号为 CVE-2019-0859，是已经被黑客利用的 Win32k 提权漏洞，微软已经确认新旧 Windows 系统均受到影响。Windows 10十月更新（Version 1809）同样受到影响。

来源： cnBeta.COM

详情： <http://t.cn/EXYhOFM>

##### 监控拍下欧洲犯罪分子用挖掘机盗取 ATM 机

原来为了现金，人们真的可以不顾一切、铤而走险。4 月 15 日晚，北爱尔兰再次发生一起开挖掘机砸抢 ATM 取款机的事件，从 3 月至今，这已经是第 9 起。凿出 ATM 机后，犯罪分子用反铲将其放到实现准备好的卡车上，然后逃离，将挖掘机丢弃在现场。当然，实际上，挖掘机也是偷来的。

来源： 快科技

详情： <http://t.cn/EXYhQDE>

##### 俄罗斯：9 个月内 FB 和 Twitter 必须遵守数据保护法

据路透社报道，俄罗斯通信监管机构“联邦通信、信息技术与大众传媒监督局”局长<ruby> 亚历山大·扎罗夫 <rp>  （ </rp> <rt>  Alexander Zharov </rt> <rp>  ） </rp></ruby>今日称，Twitter 和 Facebook 还有 9 个月的时间来遵守俄罗斯的数据保护法。

来源： 新浪科技

详情： <http://t.cn/EXYhBoV>

（信息来源于网络，安华金和搜集整理）


杨镭访谈：UCloud 的技术价值观

Summary: 你问我相信什么样的事情？我们相信云计算是长远的。

你问我相信什么样的事情？我们相信云计算是长远的。

![](/data/attachment/album/201904/18/184404w332v9ggpw3jlj29.jpg)

>
> 你问我相信什么样的事情？我们相信云计算是长远的。
>
>
>

去年，作为《[穿山甲专访](https://linux.cn/talk/interview/)》系列采访之一，我们曾经给大家分享过 [UCloud 技术副总裁杨镭先生的访谈](/article-10394-1.html)。那是我和杨镭先生的第一次见面，虽然采访时间不长，但是他务实严谨的风格，也给我留下了深刻的印象。因此，这次又特意预约了他的时间，专程去上海和他深入地聊了一些过去七年 UCloud 的技术价值观理念，并与这位从一线运维跌打滚爬出身的技术领袖的所思所想产生了深切的共鸣。

作为采访者，我也是一位做了二十多年互联网技术工作的老兵，虽然在私交上我和杨镭并不算熟悉，但是随着在互联网、技术和开源方面话题的展开，我们很快就聊得十分投机。

![](/data/attachment/album/201904/18/112249nyj2p8bdp1gprl0c.jpg)

*【图：现场采访图】*

### 第一章 一位技术人员的成长史

>
> 话题是先从杨镭先生的技术背景和从业经历展开的。
>
>
>

**老王：**是否可以请先介绍一下你之前的技术背景和你的从业方面的情况？

**杨镭：**我结合 UCloud 整个技术发展的情况和我自己的情况跟你讲一下。

我的背景是这样的，我 2006 年加入盛大在线，刚入职时我是从最一线的运维人员开始做的，大概两年多以后逐渐地开始参加一些研发的工作，做一些运维的平台系统开发工作。

我跟老季（UCloud CEO 季昕华）是大概 2008 年认识的，他当时在管盛大在线。盛大在线提供运维平台来支撑各个游戏部门的业务，包括像盛大创新院的服务器，其实背后都是由盛大在线提供运维的。在之后做盛大云时，我们承接了非常多的业务部门的运维工作，而当时我就是在做平台技术方面的工作。

那时包括 OpenStack 才刚刚出现，AWS在国内刚被知晓，而我们那时候自己最早做虚拟化都是通过 VMWare 来做的。我们一直在关注云计算的发展。在 2011 年底，老季出来创业时，问我有没有兴趣出来，我就出来了。

我们当时认为，运维应该走到一线去产生业务价值，而云计算正好是可以让做运维、做技术的人能做产品的一个技术。云计算说白了是把以前运维的东西放在台前了，可以去赚钱了。

#### ?从一封未发出的邮件说起…

**杨镭：**当时我离开盛大的时候，写了一封邮件，但邮件我没发出去，一直存在我的草稿箱里，现在还在。其实我对盛大也是挺有感情的，整个平台都是我们一手搭建的，做了很多很多的事情，还是很辛苦的。

那封信大概的意思是说，云计算真的能解决很多问题，它能让服务器弹性地、不用关机去升级内存和 CPU……还有很多充满想象力的事情，其实这也是 UCloud 的初衷，是我们出来创业的初心，包括老季在内，其实也是这样的，在那个时候我们每次出问题，他都知道，可能是哪个机房的网线插反了，或者哪个服务器配置不小心没搞对，就像蝴蝶效应一样引发了严重的后果。

那时候出来，我们就是想把云这个事情做好。

#### 践行新技术，到处吃螃蟹

**杨镭：**因为我不是从研发出身的，当时 UCloud 创业的时候也不容易，我们当时除了三个创始人之外，还有五个研发技术人员。当时所有的运维、开发、底层的一些工作，这些我都参与过。

![](/data/attachment/album/201904/18/121511rpmplzkkte9cmcsk.jpg)

一开始我是做网络方面的研发，当时懂网络的人比较少，而我是做运维出身的。那时还没有 SDN 的概念，我们开始做云计算的时候，当时主流的虚拟化技术是 Xen，KVM 刚进入视野。我那时候很关心 Linux 内核方面的技术，我认为 KVM 一定是有发展的，所以就建议围绕KVM而不是Xen做底层虚拟化，我们一开始采用的 KVM 就是这样来的，结果在后面就少走了很多的弯路。

我主要的一个工作是虚拟机创建流程，这跟我自己之前的一些运维知识也比较匹配，在这方面我做的很多工作主要是优化。这里面其实有一个云计算产品的精髓，云计算产品如果要做好有两方面：

**一方面技术要做好**，它的可拓展性、稳定性要好，这是从研发的架构层面来看；**另一个方面，你要真正地懂这个产品**。

比如说云主机，你现在来看很多云计算产品的功能都已经习以为常了，但是 UCloud 一开始做了很多可能现在看起来不同寻常的事情。为什么会做这些事情呢？根本原因在于我们对于运维的理解比较深刻，所以我们敢先做这些功能。比如说当时有一个叫“重装系统”的功能，当时很多云服务商是没有这个功能的——那时候还很早，大约是 2012年的时候——这是我现在回过头来看一开始 UCloud 在那个阶段能冲出来的一个蛮重要的原因。

当时 SDN 也是这样的。在那个时候，很多技术和框架还没有标准的、可以参考的开源实现。比如说做虚拟化，你可以用 KVM 或 Xen 都能做 。因为那个时候我对网络方面一直很感兴趣，我以前主要是做运维，对 IPtables 很熟悉，排查过非常多复杂的现网故障，所以对于IPtables在生产环境中的使用有一定的把握。当时我们就是这样，去 AWS 的 EC2 虚拟机中抓包结合网络上的材料来分析背后的实现方案，然后用最有把握的工具链来实现。我们很快就做了一套自己的 SDN——当时还没有 Open vSwitch，它是 2013 年出来的——而我们当时就很大胆地采用了一个这样的东西。现在你看 UCloud 发布的技术文章、我们把技术实现方式都讲了出去，但是那个时候你只能自己猜和试验。

云计算的问题在于什么呢？它的产品是技术型的，客户用你的产品和服务的时候，你跟客户接触的人员是要懂技术的，尽管我们传统上认为这个事情很多还是商务上、销售上的事情。但是最终你要成就一个优质的客户，因为只有优质的客户，它的业务好，才会更多的买云服务。而优质的客户不光看客户关系的，看的还是你的技术、你的产品和你的人员是不是专业。因为这个原因，所以我后来在整个 UCloud 工作的过程里，不断地在往前走，去做技术支持。那时候我们很重视客户，我去做解决方案架构师，甚至有段时间在事业部参与销售工作，其实是因为被这个问题推着往前走的，包括我现在其实主要的精力也在负责产品以及整体的技术管理这块。

差不多我的技术历程就是这样的，这也是 UCloud 技术这几年发展的一个缩影。

### 第二章 技术观与价值观

**老王：**你作为 UCloud 的技术负责人，之前在 TIC 大会上我也听你讲到过 UCloud 的技术价值观的观点，我想了解一下在宏观上、较高层面上你是如何看待云计算技术的发展的，以及这里传达了什么样的价值观？

#### 「能力」——用工程能力解决技术问题

**杨镭：**接着前面的话题说。尽管在方向上是对的，但是我们还是走了很多小的弯路。我们有一个核心的能力，也是 UCloud 的核心技术能力，就是出现 BUG 或者架构缺陷的时候可以很快地在现网透明地升级解决掉——这实际上是对我们后端的无缝升级能力特别大的挑战。我自己的感受是，一开始讲要这样做时我其实不太相信能做到，但是在第一年，我们就做到了很多这样的事情。

![](/data/attachment/album/201904/18/121437mqlqxebptwzpcppk.jpg)

我举个例子，当时我们产品上线以后，做弹性 IP 的实现，一开始很简单，我们搞几台设备，用IPtables实现了弹性IP和内网云主机的映射，放在两台机器上，有故障时候服务自动切换，一切都很美好。但是上线以后就开始发现问题，这两台机器不停地宕机，其实就是出现了 “Kernel Panic”。因为我们一开始只有两台核心网络接入设备，宕机一台就是 50% 的服务不可用，然后客户自然就炸了。但是那时候我们是解决不了这个 “Kernel Panic” 问题的，尽管懂一点内核知识，但是对内核代码层面的问题并不了解，我不知道为什么会发生，虽然我知道肯定是那个方向的问题。

我们搞不定怎么办呢？当时老季和我们 COO 经常在外面和客户解释网络故障的原因，例如中午和客户吃饭，边吃边告诉客户我们出了什么问题，会采取什么样的措施确保不再出现。而在后面，我们做了一件什么事儿呢？我们大概花了 2-3 天的时间，我们把两台集中式的服务器变成分布式的了，因为在物理机上崩溃了之后、服务器就挂了嘛，所以我们把这个服务放到虚拟机里去，每一台物理机上我们放两台。这样比如说到时候这里宕机了，这两台就可以及时切换，而且因为是虚拟机，切换速度很快。我们写了一个自动化地拉起所有服务的脚本。两三天就完成了，就把这个问题救活了。如果当时不解决，可能 UCloud 就挂了。

我们靠这个机制顶了大半年，直到我们的内核负责人来了。最后，发现是什么问题呢？确实是流量带宽控制那里有一个隐藏的 BUG，这个 BUG 其实连 CentOS 都没修复——因为我们用的是 CentOS——它没修复，而我们也搞不定。当时去查找 CentOS 的补丁列表，并没发现有这方面的补丁。到最后是怎么发现的呢？是上游后来发一个修复，但是这个修复 CentOS 一直都没放进来。

你看，这本身是一个非常深入的技术问题，但在创业的时候你不一定能解决，而我们通过架构的优化把它解决掉了，这实际上是 UCloud 从成立第一年开始到现在的一个核心能力。我自己经历过这个事情以后，再遇到什么事情都不怕了。

>
> 用架构、用工程能力去解决了一个隐藏很深的技术问题，以成本最小的方法解决问题。
>
>
>

**杨镭：这是一种变换的能力**。这是整个 UCloud 技术文化所贯穿的一点，先提供一个方案把它解决掉，让我们的服务品质不会降低。而要做到这一点，我觉得最难的是你需要对工程这个事情有深刻的理解。大家都会说工程师很重要、工程能力很重要，但是说实话，就像我开始来到 UCloud 的时候，我也会讲我是工程师，我很自信这一点，但是在我第一年遇到并解决了很多问题以后，我发现自己其实还不太懂。比如说，你看现在最近很火一些知识付费类课程，当我走到那个高度后我跟你说这个事情应该这样，应该那样。但如果你是才进入行业两三年的人，你是听不懂的，你并不知道怎么做，只能知道这句话应该是对的。这句话可能确实是对的，但是在日常工作中，你第一时间是反应不过来的，因为你不会深刻理解这句话。

一开始我们的工程能力就是很强的，因为这个基因来自于创始团队是当时最顶尖的工程团队。云计算天生对稳定的要求特别高，这是非常偏工程化，而这个能力对整个行业的影响是很深远的。

#### 「尝试」——当时胆子真的太大了，走得很前面

杨镭：当时我们遇到的挑战很多，我们一开始第一代用 **SDN 白盒交换机**的，当时没多想就上了，然后我们遇到了非常多的问题，最早还用过 Open Switch。其实 UCloud 前几年在技术上走的比较靠前，因为我们规模较小，决策更快，而且我们的技术团队胆子也很大，因为对技术团队很自信，对自己的工程能力很自信，所以敢尝试新的技术。比如说在网络层，我们有一套是用的 OVS，还有一套是用白盒交换机，而我们在两套之间还做了无缝地升级。我们的胆子大，所以那时候我们玩的都是新的技术。我还记得我在 2013 年出去做过 SDN 相关的演讲，现在看来当时胆子真的太大了，走得很前面。

那时候大家都知道是趋势，但是到底会怎么发展还没有人敢下定论，就像 Service Mesh 一样，现在绝大多数公司在做研究，在做概念验证，而我们已经在产品环境上跑了，我们走在很前面，有点孤独。

从我自己的角度看，我们那时候技术还是走得很快的。我举一个例子，比如现在有的云服务商要在两个地域之间打通，比如说从北京到香港，一般会告诉你要找第三方的网络供应商帮你打通。而 UCloud 是怎么做的呢？我们在底层有物理专线，用户只要在控制台点一下两边就通了。大概在相当早的时候，我们就提供了两个地域连接打通的功能。现在有的云服务商还需要几天才能为客户打通，而我们只要控制台上点一下，计费之后就通了，两个地域间的虚拟机就全部都互通了。

我记得那时候在这个功能的发布前夕，我们为此做了一整个通宵。在早上 7 点钟的时候，公司有人来上班了，我就在群里发了一条消息，说我们这个搞完了，大家都很激动，虽然现在两个地域之间的云计算服务器连起来是很正常的，但是在那个时候是没有人做的，那时候就感觉很有成就感。

其实好几个 UCloud 早期的研发同事，他们都有类似于跟我一样的事情，只是我当时的领域全部在网络上，而他们的领域在其它的方面。

>
> 整个云计算这个事情，它的核心其实是一个技术问题，最终想在这个地方走长远，本质上是要比技术能力的，一不小心就会落后。
>
>
>

我再举一个例子，我们在 2014 年下半年的时候招了第一个做 **DPDK 研发**的人，那时候我们知道 DPDK 技术发展前景还不错，所以我们招了这个岗位；而到了 2018 年的下半年，如果哪家有云产品而没有 DPDK 技术，你的产品是完全不具备商业竞争力的，你会卖得很贵，性能非常差，而友商会卖得很便宜，性能又很好，这个就是技术的红利。DPDK 的红利，但是如果你当时不投入的话，到现在可能会来不及。这是看三年的，所以我们现在在做 Serverless 方面的工作，投入是比较大的，但是如果我们不投入，可能三年以后或者四五年以后就出局了。

**杨镭：**我们还做了很多很有意思的事情。比如，很多用户买了云计算的虚拟机以后由于密码不严格被黑掉了，然后就变成肉鸡对外发大量数据包。这个事情很多云服务商的处理是很简单粗暴的，就是把你机器关掉，但客户其实是很受伤的。而我们当时不是这样做的。我们看，它不是对外发包吗？我们在宿主机上打开 TCP 来抓包，比如说 10 秒钟的包——因为不能长抓，长抓的量太大了——把它放到数据库里，然后我们去分析这个 TCP 包的特征、出入的比例，如果只是出站没有入站的话，那就肯定是被利用攻击了嘛。后来我们发现，所有被反射攻击利用的特征都是这样的。我们发现如果符合这个特征，就把这个虚拟机的网络给处理掉——我们会把它的网络给漂走，叫做隔离区，并没有把机器关掉，不会影响其他人，但是他的虚拟机自己还是可以登进去的。我们把这叫做最优选择，但是这个技术上很复杂。

![](/data/attachment/album/201904/18/121340sz16mg3i02s65ppp.jpg)

实际上这不是纯技术的问题，这是一个理念，你要懂技术，还要懂业务，还要懂数据分析，还要设计一套东西把它串起来。

我们觉得自豪的一点不是说这个技术很厉害，而是我们的友商没人这样去做。我们做了好几件类似的事情，我们最终带动了行业的发展，客户在 UCloud 里体会到好处以后，他跑到别的云服务商说，你看 UCloud 这样做的，别的云服务商没办法，就被我们反逼提供这样的功能。而且这种功能不是说我们为了超越谁，而是我们自己想出来的。我们自己的研发人员自己关起门来说，对这种事情还是挺自豪，某种意义上我觉得这其实是种创新。

#### 「价值观」——我们相信云计算是长远的

**老王：**你刚才介绍了 UCloud 的情况，作为技术人员我也觉得很有心向往之的感觉。你觉得目前而言，你们这个四五百人的技术团队的优势主要是在工程能力上还是在你们团队上的技术文化上？

**杨镭：**从我这个角度，首先这是我们的精髓、文化或者说是技术文化。在这个问题上我们是不允许所谓的不纯粹的。所以在管理上，其实我们对刚才说的这几件事情，我们是要求很高的，如果你新来一个人你在文化上不认同，这个可能不适合你。

还有一方面，我们对整个技术的价值观就像上次我跟你聊的一样，我们会要求很高。我们除了自己不收集，还会帮用户把隐私保护好，告诉用户不要给我们任何的信息，而多数的公司是反过来的。我们大概会在 1 年多后完成大部分云上数据的加密，包括存量的数据。就像我们在去年的 TIC 大会上说的，这里会坚决投入，而且不是一个小的研发投入。因为说白了用户未必自己诉求那么强，很多时候没这个意识。而我们做这个事情因为有很多存量的云主机，几十万台的规模，我们要透明的、不影响性能、安全地放上去，而且密钥还要定期轮换，不能老是一把密钥，但是要轮换的时候又不能影响性能，所以在工程上是有挑战的和有技术深度的。我们做那么多的事情，说白了这就是价值观问题，我们真的对用户的数据安全非常重视。

>
> 树立了一个自己的独特价值观，而且为了这个价值观付出了代价、成本。
>
>
>

**杨镭：**尽管我们现在人不少了，但是我们产品线也很长，我们这点人也是不够的，我们现在做这个事情都在加班做，说白了时间不够，只能花时间解决这种问题。这种事情说白了是在价值观上，你做不做可能没有区别，但是我们认为真正长远地看这个事情是有意义的。眼前不会有太大的得益和收益，但是从长远的趋势看，从我们的信念看，保护隐私、保护数据安全其实是一个所有人都会走向的共同的目标，只是现在还看不到。

所有的这些事情其实都是归纳到一点，你相信什么样的事情？**我们相信云计算是长远的**。我们跟客户的合作不是做一锤子买卖，我们甚至于对客户都有要求，我们都要做得很优秀，我们要长远看这件事情值不值得做？当然值得做。为什么要看长远？因为我们对自己还是有信心的。其实你的现在是被过去决定的，你现在是为未来做的，所以我们现在在这个层面上想的事情都是三年、五年以后的。现在这些从大势来看，我们做的这些其实都是因为我们前三年做了一些事情，我们坚持了一些事情，因为做了那些事情，我们活了下来了。现在数据隐私这个事情也好，数据安全这个事情也好，或者是很多 Serverless 产品也好，我们相信在那个时代会更重要，所以我们坚持做这个。

### 第三章 尾声

**老王：**做这个专访，一方面我们希望看到真正的技术人现在具体做哪些事情。另外一方面我们希望让大家看到有这样的公司在做具体的事情，这些事情会不会对他们产生触动、启发甚至吸引他们去关注或者参与，这是我们希望能进一步做到的东西。

我觉得今天你婉拒了很多采访的邀约而接受我们的专访，我觉得也很荣幸。一方面我们可以持续性地关注你们这边的技术进展，我们把有些可能在你们看来不值得一提，但是在我们看起来可能非常重要或者更有传播和示范意义事件传播给大家。我觉得今天的采访让我确实地了解到了很多我原来没有想到或者没有观察到的地方。

**杨镭：**我从一个运维人员走到现在，现在做这个事情我才能发现原来是这样的。我觉得我能理解你，因为大家专业不同，我们正好每天在这里做事情，所以就往这个方面想。我希望这篇采访能让大家知道有些事情怎么做更好，只是我们走在了前面一点，我们是这个行业里的人，我们有经验，我们传播出去，这个我很开心，就 OK 了。

>
> ![](/data/attachment/album/201904/29/124032pcmmv75r8uvd73v2.jpg)
>
>
> “穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。
>
>
> 取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。
>
>
>


小白观察：Let's Encrpt 正过渡到 ISRG Root

Summary: 非盈利加密组织开始逐渐过渡为 ISRG Root， 这标志着 Let’s Encrypt 也逐渐成为顶级 CA （实际上还不是，但 Let’s Encrypt 已经被各家所认可）

![](/data/attachment/album/201904/18/131447evrttgmlmomqstc3.jpg)

### Big News

##### Let’s Encrpt 正过渡到 ISRG Root

非盈利加密组织 Let’s Encrypt 开始逐渐过渡为 ISRG Root， 这标志着它也逐渐成为顶级 CA （实际上还不是，但 Let’s Encrypt 已经被各家所认可）。[【Scotthelme.co.uk】](https://scotthelme.co.uk/lets-encrypt-to-transition-to-isrg-root/)

![](/data/attachment/album/201904/15/110332k14jhr8741hrwx81.png)

>
> Let’s Encrypt 推动了 HTTPS 的落地和推广，让过去成本极高的证书签发和部署成本不断降低。Let’s Encrypt 推动了 HTTPS 的落地和推广，让过去成本极高的证书签发和部署成本不断降低。对于整个行业来说，无疑是大功一件。 随着 Let’s Encrypt 的不断推广，终有一天， HTTPS 将成为标准。
>
>
>

### Quick News

##### Ubuntu 19.04 将使用 Linux 5.0 内核

Ubuntu 将在新的桌面版本 19.04 中使用新的 Linux Kernel 5.0。相比前代，提供了 USB 3.2 、Type-C、AMD Radeon RX Vega M GPU 的支持。[【ZDNet】](https://www.zdnet.com/article/ubuntu-19-04-comes-refreshed-with-the-linux-5-0-kernel/)

##### Google 将延长来自新开发者的应用核查

Google 表示，将加强对从未见过的开发者的核查，以避免“恶意”开发者。[【BBC】](https://www.bbc.com/news/technology-47950665)

##### Pinterest 即将进行首次公开募股

知名设计网站 Pinterest 将于本周进行首次公开募股。Pinterest 是一个能够让设计师分享作品、获得灵感的地方。[【CNET】](https://www.cnet.com/news/pinterests-ipo-shows-the-internet-isnt-always-as-awful-as-you-thought/)


如何在 Linux 中配置 sudo 访问权限

![](/data/attachment/album/201904/18/224237bhgeghjzryjrthce.jpg)

Linux 系统中 root 用户拥有 Linux 中全部控制权力。Linux 系统中 root 是拥有最高权力的用户，可以在系统中实施任意的行为。

如果其他用户想去实施一些行为，不能为所有人都提供 root 访问权限。因为如果他或她做了一些错误的操作，没有办法去纠正它。

为了解决这个问题，有什么方案吗？

我们可以把 sudo 权限发放给相应的用户来克服这种情况。

`sudo` 命令提供了一种机制，它可以在不用分享 root 用户的密码的前提下，为信任的用户提供系统的管理权限。

他们可以执行大部分的管理操作，但又不像 root 一样有全部的权限。

### 什么是 sudo？

`sudo` 是一个程序，普通用户可以使用它以超级用户或其他用户的身份执行命令，是由安全策略指定的。

sudo 用户的访问权限是由 `/etc/sudoers` 文件控制的。

### sudo 用户有什么优点？

在 Linux 系统中，如果你不熟悉一个命令，`sudo` 是运行它的一个安全方式。

* Linux 系统在 `/var/log/secure` 和 `/var/log/auth.log` 文件中保留日志，并且你可以验证 sudo 用户实施了哪些行为操作。
* 每一次它都为当前的操作提示输入密码。所以，你将会有时间去验证这个操作是不是你想要执行的。如果你发觉它是不正确的行为，你可以安全地退出而且没有执行此操作。

基于 RHEL 的系统（如 Redhat (RHEL)、 CentOS 和 Oracle Enterprise Linux (OEL)）和基于 Debian 的系统（如 Debian、Ubuntu 和 LinuxMint）在这点是不一样的。

我们将会教你如何在本文中提及的两种发行版中执行该操作。

这里有三种方法可以应用于两个发行版本。

* 增加用户到相应的组。基于 RHEL 的系统，我们需要添加用户到 `wheel` 组。基于 Debain 的系统，我们添加用户到 `sudo` 或 `admin` 组。
* 手动添加用户到 `/etc/group` 文件中。
* 用 `visudo` 命令添加用户到 `/etc/sudoers` 文件中。

### 如何在 RHEL/CentOS/OEL 系统中配置 sudo 访问权限？

在基于 RHEL 的系统中（如 Redhat (RHEL)、 CentOS 和 Oracle Enterprise Linux (OEL)），使用下面的三个方法就可以做到。

#### 方法 1：在 Linux 中如何使用 wheel 组为普通用户授予超级用户访问权限？

wheel 是基于 RHEL 的系统中的一个特殊组，它提供额外的权限，可以授权用户像超级用户一样执行受到限制的命令。

注意，应该在 `/etc/sudoers` 文件中激活 `wheel` 组来获得该访问权限。

```
# grep -i wheel /etc/sudoers

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
# %wheel ALL=(ALL) NOPASSWD: ALL
```

假设我们已经创建了一个用户账号来执行这些操作。在此，我将会使用 `daygeek` 这个用户账号。

执行下面的命令，添加用户到 `wheel` 组。

```
# usermod -aG wheel daygeek
```

我们可以通过下面的命令来确定这一点。

```
# getent group wheel
wheel:x:10:daygeek
```

我将要检测用户 `daygeek` 是否可以访问属于 root 用户的文件。

```
$ tail -5 /var/log/secure
tail: cannot open /var/log/secure for reading: Permission denied
```

当我试图以普通用户身份访问 `/var/log/secure` 文件时出现错误。 我将使用 `sudo` 访问同一个文件，让我们看看这个魔术。

```
$ sudo tail -5 /var/log/secure
[sudo] password for daygeek:
Mar 17 07:01:56 CentOS7 sudo: daygeek : TTY=pts/0 ; PWD=/home/daygeek ; USER=root ; COMMAND=/bin/tail -5 /var/log/secure
Mar 17 07:01:56 CentOS7 sudo: pam_unix(sudo:session): session opened for user root by daygeek(uid=0)
Mar 17 07:01:56 CentOS7 sudo: pam_unix(sudo:session): session closed for user root
Mar 17 07:05:10 CentOS7 sudo: daygeek : TTY=pts/0 ; PWD=/home/daygeek ; USER=root ; COMMAND=/bin/tail -5 /var/log/secure
Mar 17 07:05:10 CentOS7 sudo: pam_unix(sudo:session): session opened for user root by daygeek(uid=0)
```

#### 方法 2：在 RHEL/CentOS/OEL 中如何使用 /etc/group 文件为普通用户授予超级用户访问权限？

我们可以通过编辑 `/etc/group` 文件来手动地添加用户到 `wheel` 组。

只需打开该文件，并在恰当的组后追加相应的用户就可完成这一点。

```
$ grep -i wheel /etc/group
wheel:x:10:daygeek,user1
```

在该例中，我将使用 `user1` 这个用户账号。

我将要通过在系统中重启 Apache httpd 服务来检查用户 `user1` 是不是拥有 sudo 访问权限。让我们看看这个魔术。

```
$ sudo systemctl restart httpd
[sudo] password for user1:

$ sudo grep -i user1 /var/log/secure
[sudo] password for user1:
Mar 17 07:09:47 CentOS7 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/systemctl restart httpd
Mar 17 07:10:40 CentOS7 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/systemctl restart httpd
Mar 17 07:12:35 CentOS7 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/grep -i httpd /var/log/secure
```

#### 方法 3：在 Linux 中如何使用 /etc/sudoers 文件为普通用户授予超级用户访问权限？

sudo 用户的访问权限是被 `/etc/sudoers` 文件控制的。因此，只需将用户添加到 `sudoers` 文件中 的 `wheel` 组下即可。

只需通过 `visudo` 命令将期望的用户追加到 `/etc/sudoers` 文件中。

```
# grep -i user2 /etc/sudoers
user2 ALL=(ALL) ALL
```

在该例中，我将使用 `user2` 这个用户账号。

我将要通过在系统中重启 MariaDB 服务来检查用户 `user2` 是不是拥有 sudo 访问权限。让我们看看这个魔术。

```
$ sudo systemctl restart mariadb
[sudo] password for user2:

$ sudo grep -i mariadb /var/log/secure
[sudo] password for user2:
Mar 17 07:23:10 CentOS7 sudo: user2 : TTY=pts/0 ; PWD=/home/user2 ; USER=root ; COMMAND=/bin/systemctl restart mariadb
Mar 17 07:26:52 CentOS7 sudo: user2 : TTY=pts/0 ; PWD=/home/user2 ; USER=root ; COMMAND=/bin/grep -i mariadb /var/log/secure
```

### 在 Debian/Ubuntu 系统中如何配置 sudo 访问权限？

在基于 Debian 的系统中（如 Debian、Ubuntu 和 LinuxMint），使用下面的三个方法就可以做到。

#### 方法 1：在 Linux 中如何使用 sudo 或 admin 组为普通用户授予超级用户访问权限？

`sudo` 或 `admin` 是基于 Debian 的系统中的特殊组，它提供额外的权限，可以授权用户像超级用户一样执行受到限制的命令。

注意，应该在 `/etc/sudoers` 文件中激活 `sudo` 或 `admin` 组来获得该访问权限。

```
# grep -i 'sudo\|admin' /etc/sudoers

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
```

假设我们已经创建了一个用户账号来执行这些操作。在此，我将会使用 `2gadmin` 这个用户账号。

执行下面的命令，添加用户到 `sudo` 组。

```
# usermod -aG sudo 2gadmin
```

我们可以通过下面的命令来确定这一点。

```
# getent group sudo
sudo:x:27:2gadmin
```

我将要检测用户 `2gadmin` 是否可以访问属于 root 用户的文件。

```
$ less /var/log/auth.log
/var/log/auth.log: Permission denied
```

当我试图以普通用户身份访问 `/var/log/auth.log` 文件时出现错误。 我将要使用 `sudo` 访问同一个文件，让我们看看这个魔术。

```
$ sudo tail -5 /var/log/auth.log
[sudo] password for 2gadmin:
Mar 17 20:39:47 Ubuntu18 sudo: 2gadmin : TTY=pts/0 ; PWD=/home/2gadmin ; USER=root ; COMMAND=/bin/bash
Mar 17 20:39:47 Ubuntu18 sudo: pam_unix(sudo:session): session opened for user root by 2gadmin(uid=0)
Mar 17 20:40:23 Ubuntu18 sudo: pam_unix(sudo:session): session closed for user root
Mar 17 20:40:48 Ubuntu18 sudo: 2gadmin : TTY=pts/0 ; PWD=/home/2gadmin ; USER=root ; COMMAND=/usr/bin/tail -5 /var/log/auth.log
Mar 17 20:40:48 Ubuntu18 sudo: pam_unix(sudo:session): session opened for user root by 2gadmin(uid=0)
```

或者，我们可以通过添加用户到 `admin` 组来执行相同的操作。

运行下面的命令，添加用户到 `admin` 组。

```
# usermod -aG admin user1
```

我们可以通过下面的命令来确定这一点。

```
# getent group admin
admin:x:1011:user1
```

让我们看看输出信息。

```
$ sudo tail -2 /var/log/auth.log
[sudo] password for user1:
Mar 17 20:53:36 Ubuntu18 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/usr/bin/tail -2 /var/log/auth.log
Mar 17 20:53:36 Ubuntu18 sudo: pam_unix(sudo:session): session opened for user root by user1(uid=0)
```

#### 方法 2：在 Debian/Ubuntu 中如何使用 /etc/group 文件为普通用户授予超级用户访问权限？

我们可以通过编辑 `/etc/group` 文件来手动地添加用户到 `sudo` 组或 `admin` 组。

只需打开该文件，并在恰当的组后追加相应的用户就可完成这一点。

```
$ grep -i sudo /etc/group
sudo:x:27:2gadmin,user2
```

在该例中，我将使用 `user2` 这个用户账号。

我将要通过在系统中重启 Apache httpd 服务来检查用户 `user2` 是不是拥有 `sudo` 访问权限。让我们看看这个魔术。

```
$ sudo systemctl restart apache2
[sudo] password for user2:

$ sudo tail -f /var/log/auth.log
[sudo] password for user2:
Mar 17 21:01:04 Ubuntu18 systemd-logind[559]: New session 22 of user user2.
Mar 17 21:01:04 Ubuntu18 systemd: pam_unix(systemd-user:session): session opened for user user2 by (uid=0)
Mar 17 21:01:33 Ubuntu18 sudo: user2 : TTY=pts/0 ; PWD=/home/user2 ; USER=root ; COMMAND=/bin/systemctl restart apache2
```

#### 方法 3：在 Linux 中如何使用 /etc/sudoers 文件为普通用户授予超级用户访问权限？

sudo 用户的访问权限是被 `/etc/sudoers` 文件控制的。因此，只需将用户添加到 `sudoers` 文件中的 `sudo` 或 `admin` 组下即可。

只需通过 `visudo` 命令将期望的用户追加到 `/etc/sudoers` 文件中。

```
# grep -i user3 /etc/sudoers
user3 ALL=(ALL:ALL) ALL
```

在该例中，我将使用 `user3` 这个用户账号。

我将要通过在系统中重启 MariaDB 服务来检查用户 `user3` 是不是拥有 `sudo` 访问权限。让我们看看这个魔术。

```
$ sudo systemctl restart mariadb
[sudo] password for user3:

$ sudo tail -f /var/log/auth.log
[sudo] password for user3:
Mar 17 21:12:32 Ubuntu18 systemd-logind[559]: New session 24 of user user3.
Mar 17 21:12:49 Ubuntu18 sudo: user3 : TTY=pts/0 ; PWD=/home/user3 ; USER=root ; COMMAND=/bin/systemctl restart mariadb
Mar 17 21:12:49 Ubuntu18 sudo: pam_unix(sudo:session): session opened for user root by user3(uid=0)
Mar 17 21:12:53 Ubuntu18 sudo: pam_unix(sudo:session): session closed for user root
Mar 17 21:13:08 Ubuntu18 sudo: user3 : TTY=pts/0 ; PWD=/home/user3 ; USER=root ; COMMAND=/usr/bin/tail -f /var/log/auth.log
Mar 17 21:13:08 Ubuntu18 sudo: pam_unix(sudo:session): session opened for user root by user3(uid=0)
```

---

via: <https://www.2daygeek.com/how-to-configure-sudo-access-in-linux/>

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

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


思科、谷歌重新赋能多/混合云共同开发

>
> 思科、VMware、HPE 等公司开始采用了新的 Google Cloud Athos 云技术。
>
>
>

![Thinkstock](/data/attachment/album/201904/19/000918bzf5mbz2tts2q7fz.jpg)

思科与谷歌已扩展它们的混合云开发活动，以帮助其客户可以在从本地数据中心到公共云上的任何地方更轻松地搭建安全的多云以及混合云应用。

这次扩张围绕着谷歌被称作 Anthos 的新的开源混合云包展开，它是在这周的 Google Next 活动上推出的。Anthos 基于并取代了谷歌现有的谷歌云服务测试版。Anthos 将让客户们无须修改应用就可以在现有的本地硬件或公共云上运行应用。据谷歌说，它可以在[谷歌云平台](https://cloud.google.com/) (GCP) 与 [谷歌 Kubernetes 引擎](https://cloud.google.com/kubernetes-engine/) (GKE) 或者在数据中心中与 [GKE On-Prem](https://cloud.google.com/gke-on-prem/) 一同使用。谷歌说，Anthos 首次让客户们可以无需管理员和开发者了解不同的坏境和 API 就能从谷歌平台上管理在第三方云上（如 AWS 和 Azure）的工作负荷。

关键在于，Athos 提供了一个单一的托管服务，它使得客户们无须担心不同的环境或 API 就能跨云管理、部署工作负荷。

作为首秀的一部分，谷歌也宣布一个叫做 [Anthos Migrate](https://cloud.google.com/contact/) 的测试计划，它能够从本地环境或者其它云自动迁移虚拟机到 GKE 上的容器中。谷歌说，“这种独特的迁移技术使你无须修改原来的虚拟机或者应用就能以一种行云流水般的方式迁移、更新你的基础设施”。谷歌称它给予了公司按客户节奏转移本地应用到云环境的灵活性。

### 思科和谷歌

就思科来说，它宣布对 Anthos 的支持并承诺将它紧密集成进思科的数据中心技术中，例如 HyperFlex 超融合包、应用中心基础设施（思科的旗舰 SDN 方案）、SD-WAN 和 StealthWatch 云。思科说，无论是本地的还是在云端的，这次集成将通过自动更新到最新版本和安全补丁，给予一种一致的、云般的感觉。

“谷歌云在容器（Kubernetes）和<ruby> 服务网格 <rt>  service mesh </rt></ruby>（Istio）上的专业与它们在开发者社区的领导力，再加上思科的企业级网络、计算、存储和安全产品及服务，将为我们的顾客促成一次强强联合。”思科的云平台和解决方案集团资深副总裁 Kip Compton 这样[写道](https://blogs.cisco.com/news/next-phase-cisco-google-cloud)，“思科对于 Anthos 的集成将会帮助顾客跨本地数据中心和公共云搭建、管理多云/混合云应用，让他们专注于创新和灵活性，同时不会影响安全性或增加复杂性。”

### 谷歌云和思科

谷歌云工程副总裁 Eyal Manor [写道](https://cloud.google.com/blog/topics/partners/google-cloud-partners-with-cisco-on-hybrid-cloud-next19?utm_medium=unpaidsocial&utm_campaign=global-googlecloud-liveevent&utm_content=event-next) 通过思科对 Anthos 的支持，客户将能够：

* 受益于全托管服务例如 GKE 以及思科的超融合基础设施、网络和安全技术；
* 在企业数据中心和云中一致运行
* 在企业数据中心使用云服务
* 用最新的云技术更新本地基础设施

思科和谷歌从 2017 年 10 月就在紧密合作，当时他们表示正在开发一个能够连接本地基础设施和云环境的开放混合云平台。该套件，即[思科为谷歌云打造的混合云平台](https://cloud.google.com/cisco/)，大致在 2018 年 9 月上市。它使得客户们能通过谷歌云托管 Kubernetes 容器开发企业级功能，包含思科网络和安全技术以及来自 Istio 的服务网格监控。

谷歌说开源的 Istio 的容器和微服务优化技术给开发者提供了一种一致的方式，通过服务级的 mTLS （双向传输层安全）身份验证访问控制来跨云连接、保护、管理和监听微服务。因此，客户能够轻松实施新的可移植的服务，并集中配置和管理这些服务。

思科不是唯一宣布对 Anthos 支持的供应商。谷歌表示，至少 30 家大型合作商包括 [VMware](https://blogs.vmware.com/networkvirtualization/2019/04/vmware-and-google-showcase-hybrid-cloud-deployment.html/)、[Dell EMC](https://www.dellemc.com/en-us/index.htm)、[HPE](https://www.hpe.com/us/en/newsroom/blog-post/2019/04/hpe-and-google-cloud-join-forces-to-accelerate-innovation-with-hybrid-cloud-solutions-optimized-for-containerized-applications.html)、Intel 和联想致力于为他们的客户在它们自己的超融合基础设施上提供 Anthos 服务。

---

via: <https://www.networkworld.com/article/3388218/cisco-google-reenergize-multicloudhybrid-cloud-joint-development.html>

作者：[Michael Cooney](https://www.networkworld.com/author/Michael-Cooney/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[tomjlw](https://github.com/tomjlw) 校对：[wxy](https://github.com/wxy)

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


每日安全资讯：黑客网上出售伊朗间谍部队的黑客工具源代码

![](/data/attachment/album/201904/19/082950xwouyiv1jgjrowii.jpg)

2017 年，黑客组织 Shadow Brokers 对外宣称他们已经成功入侵了美国国家安全局（NSA）下属的黑客组织 Equation Group，下载了后者大量的攻击工具并在网上发起拍卖。而现在又有黑客发布了类似的黑客工具，不过这次来自于伊朗精英网络间谍部队之一，在业内被称之为 APT34、Oilrig 或 HelixKitten。

[![](/data/attachment/album/201904/19/083005cd5zppmpsydtzqoy.jpg)](https://static.cnbetacdn.com/article/2019/0418/aea4a764b5c6bd8.jpg)

尽管本次发布的黑客工具并没有 2017 年 NSA 泄露的黑客工具那么复杂，但它们依然是非常危险的。这些黑客工具自今年 3 月中旬开始在网络上发布，以 Lab Dookhtegan 这个假名在 Telegram 频道上进行出售。

[![](/data/attachment/album/201904/19/083005x33sffetilvm3okz.jpg)](https://static.cnbetacdn.com/article/2019/0418/c136b1dbe6c1db7.jpg)

一些网络安全专家已经确认了这些工具的真实性。 Alphabet 的网络安全部门 Chronicle 今天早些时候向 ZDNet 证实了这一点。在今天发布的 Telegram 频道中，黑客共泄露了 6 个黑客工具的源代码，此外还有部分来自活跃后端面板的内容以及收集的受害者数据。

这6个黑客工具分别为：

* Glimpse（基于 PowerShell 的新版木马，Palo Alto Networks 命名为 BondUpdater）
* PoisonFrog（旧版 BondUpdater）
* HyperShell（称之为 TwoFace 的 Palo Alto Networks 网络外壳）
* HighShell（另一个 Web shell）
* Fox Panel（钓鱼工具包）
* Webmask（DNS 隧道，DNSpionage 背后的主要工具）

来源：cnBeta.COM

### 更多资讯

##### 追剧有险 黑客利用《权利的游戏》勒索诈骗

追了八年的《权力的游戏》在 4 月 14 日迎来了最终季，朋友圈有人感叹，刚追剧时候自己还不是个“日天日地日卫星”的程序员，拥有茂密的头发，现在……这都不重要，剧王终章上映，前七季人物的关系，经典场景，甚至是床戏都被拿来一一盘点，剧迷们纷纷分享熟肉资源，在一本正经工作群里也出现了这种场面。

来源： 雷锋网

详情： <http://t.cn/EX3xWrt>

##### 美国学生使用 USB Killer 毁掉了数万美元的学校电脑

纽约 Saint Rose 学院的一名前学生承认使用 USB Killer 设备毁掉数万美元学校电脑的指控。USB Killer 设备设计通过释放负电涌毁坏计算机主板电路。27 岁的 Vishwanath Akuthota 面临最高 10 年的监禁和 25 万美元的罚款（大多数情况下不会面临最高刑期），他于 2 月 22 日在北卡罗来纳州被捕。

来源： solidot.org

详情： <http://t.cn/EX3xRjJ>

##### 微软动作太慢：0patch 团队抢先发布 Win10 IE 安全漏洞修复补丁

几天前，外媒爆料称 Internet Explorer 存在一个可能被黑客利用的安全漏洞。借助某些文件处理中的 bug，它可以窃取用户的文件。最令人害怕的是，就算你不是 IE 浏览器的用户，也会受到这个漏洞的影响。鉴于微软没能第一时间发布漏洞修复补丁，坐不住的第三方已经抢先推出了针对 Windows 10 平台的小补丁（micro-patch）。

来源： cnBeta.COM

详情： <http://t.cn/EX3xrkH>

##### 四部门抓紧推进 App 违法收集使用个人信息专项治理

中央网信办、工信部、公安部、市场监管总局指导成立 App 违法违规收集使用个人信息专项治理工作组以来，组织开展的 App 收集使用个人信息评估工作取得阶段性进展。记者从工作组负责人处获悉，截至 4 月 16 日，举报信息超过 3480 条，涉及 1300 余款 App。对于 30 款用户量大、问题严重的 App，工作组已向其运营者发送了整改通知。

来源： 新华网

详情： <http://t.cn/EX3JPo7>

（信息来源于网络，安华金和搜集整理）


小白观察：Ubuntu 19.04 发布

桌面右键菜单及部分仍然是英文显示的。

来自云南昆明的 Internet Explorer 11.0|Windows 10 用户

![](/data/attachment/album/201904/19/123826g9z5gm374ng930g3.jpg)

### Big News

##### Ubuntu 19.04 发布

Ubuntu 19.04 是 Ubuntu 最新的桌面端操作系统。目前已经开放了下载。 此版本不是 LTS 版本，最新的 LTS 版本依然是 Ubuntu 18.04.2 。[【Ubuntu】](https://www.ubuntu.com/)

![](/data/attachment/album/201904/19/123826jwwhua7ggqzgxufz.png)

>
> 新的 Ubuntu 系统提供了更好的用户体验和操作的节奏，你可以现在安装 Ubuntu 19.04 来体验 Gnome 3.32 、Linux Kernel 5.X 以及性能的提升。
>
>
>

### Quick News

##### 微软收购了设计了 ThreadX 的 Express Logic 公司

Express Logic 公司于 1996 年创建，至今已有 23 年，其产品 ThreadX RTos部署超过了超过62亿个设备。[【Express Logic】](https://rtos.com/expresslogic-joins-microsoft/)

##### Zoom 公司开盘价为 $65，超过发售价 $36

Zoom.us 是业界领先的视频会议解决方案提供商。Zoom 公司本周四在美国纳斯达克市场上交易，股票代码为“ZM”。[【ZDnet】](https://www.zdnet.com/article/zooms-ipo-opens-at-an-eye-popping-65-per-share/)

##### 中国在山东建立高速公路的自动驾驶汽车测试场

齐鲁交通发展集团有限公司发言人表示，该公司正在利用现有高速公路的一部分在山东省东部建立试验场地，这条26公里长的试验场地于 4 月 12 日开始施工，预计将于 9 月开始运营。[【The Star】](https://www.thestar.com.my/tech/tech-news/2019/04/18/china-builds-site-to-test-autonomous-cars-in-highway-conditions/)


如何在 Linux 上安装并启用 Flatpak 支持？

Summary: Flatpak 提供了一种通用的包封装格式，可以在任何 Linux 发行版中使用。它提供了一个沙箱（隔离的）环境来运行应用程序，不会影响其他应用程序和发行版核心软件包。

![](/data/attachment/album/201904/20/000836zn7s4011z4qs72ss.jpg)

目前，我们都在使用 Linux 发行版的官方软件包管理器来安装所需的软件包。

在 Linux 中，它做得很好，没有任何问题。（它不打折扣地很好的完成了它应该做的工作）

但在一些方面它也有一些限制，所以会让我们考虑其他替代解决方案来解决。

是的，默认情况下，我们不能从发行版官方软件包管理器获取到最新版本的软件包，因为这些软件包是在构建当前 OS 版本时构建的。它们只会提供安全更新，直到下一个主要版本发布。

那么，这种情况有什么解决办法吗？是的，我们有多种解决方案，而且我们大多数人已经开始使用其中的一些了。

有些什么呢，它们有什么好处？

* **对于基于 Ubuntu 的系统：** PPA
* **对于基于 RHEL 的系统：** [EPEL 仓库](https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/)、[ELRepo 仓库](https://www.2daygeek.com/install-enable-elrepo-on-rhel-centos-scientific-linux/)、[nux-dextop 仓库](https://www.2daygeek.com/install-enable-nux-dextop-repository-on-centos-rhel-scientific-linux/)、[IUS 社区仓库](https://www.2daygeek.com/install-enable-ius-community-repository-on-rhel-centos/)、[RPMfusion 仓库](https://www.2daygeek.com/install-enable-rpm-fusion-repository-on-centos-fedora-rhel/) 和 [Remi 仓库](https://www.2daygeek.com/install-enable-remi-repository-on-centos-rhel-fedora/)

使用上面的仓库，我们将获得最新的软件包。这些软件包通常都得到了很好的维护，还有大多数社区的推荐。但这些只是建议，可能并不总是安全的。

近年来，出现了一下通用软件包封装格式，并且得到了广泛的应用。

* **Flatpak**：它是独立于发行版的包格式，主要贡献者是 Fedora 项目团队。大多数主要的 Linux 发行版都采用了 Flatpak 框架。
* **Snaps**：Snappy 是一种通用的软件包封装格式，最初由 Canonical 为 Ubuntu 手机及其操作系统设计和构建的。后来，更多的发行版都接纳了它。
* **AppImage**：AppImage 是一种可移植的包格式，可以在不安装和不需要 root 权限的情况下运行。

我们之前已经介绍过 [Snap 包管理器和包封装格式](https://www.2daygeek.com/linux-snap-package-manager-ubuntu/)。今天我们将讨论 Flatpak 包封装格式。

### 什么是 Flatpak？

Flatpak（以前称为 X Desktop Group 或 xdg-app）是一个软件实用程序。它提供了一种通用的包封装格式，可以在任何 Linux 发行版中使用。

它提供了一个沙箱（隔离的）环境来运行应用程序，不会影响其他应用程序和发行版核心软件包。我们还可以安装并运行不同版本的软件包。

Flatpak 的一个缺点是不像 Snap 和 AppImage 那样支持服务器操作系统，它只在少数桌面环境下工作。

比如说，如果你想在系统上运行两个版本的 php，那么你可以轻松安装并按照你的意愿运行。

这就是现在通用包封装格式非常有名的地方。

### 如何在 Linux 中安装 Flatpak？

大多数 Linux 发行版官方仓库都提供 Flatpak 软件包。因此，可以使用它们来进行安装。

对于 Fedora 系统，使用 [DNF 命令](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/) 来安装 flatpak。

```
$ sudo dnf install flatpak
```

对于 Debian/Ubuntu 系统，使用 [APT-GET 命令](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/) 或 [APT 命令](https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/) 来安装 flatpak。

```
$ sudo apt install flatpak
```

对于较旧的 Ubuntu 版本：

```
$ sudo add-apt-repository ppa:alexlarsson/flatpak
$ sudo apt update
$ sudo apt install flatpak
```

对于基于 Arch Linux 的系统，使用 [Pacman 命令](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/) 来安装 flatpak。

```
$ sudo pacman -S flatpak
```

对于 RHEL/CentOS 系统，使用 [YUM 命令](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/) 来安装 flatpak。

```
$ sudo yum install flatpak
```

对于 openSUSE Leap 系统，使用 [Zypper 命令](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/) 来安装 flatpak。

```
$ sudo zypper install flatpak
```

### 如何在 Linux 上启用 Flathub 支持？

Flathub 网站是一个应用程序商店，你可以在其中找到 flatpak 软件包。它是一个中央仓库，所有的 flatpak 应用程序都可供用户使用。

运行以下命令在 Linux 上启用 Flathub 支持：

```
$ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
```

为 GNOME 桌面环境安装 Software Flatpak 插件。

```
$ sudo apt install gnome-software-plugin-flatpak
```

此外，如果你使用的是 GNOME 桌面环境，则可以启用 GNOME 仓库。它包含所有 GNOME 核心应用程序。

```
$ wget https://sdk.gnome.org/keys/gnome-sdk.gpg
$ sudo flatpak remote-add --gpg-import=gnome-sdk.gpg --if-not-exists gnome-apps https://sdk.gnome.org/repo-apps/
```

### 如何列出已配置的 flakpak 仓库？

如果要查看系统上已配置的 flatpak 仓库列表，运行以下命令：

```
$ flatpak remotes
Name       Options
flathub    system
gnome-apps system
```

### 如何列出已配置仓库中的可用软件包？

如果要查看已配置仓库中的可用软件包的列表（它将显示所有软件包，如应用程序和运行环境），运行以下命令：

```
$ flatpak remote-ls | head -10

org.freedesktop.GlxInfo gnome-apps
org.gnome.Books gnome-apps
org.gnome.Builder   gnome-apps
org.gnome.Calculator    gnome-apps
org.gnome.Calendar  gnome-apps
org.gnome.Characters    gnome-apps
org.gnome.Devhelp   gnome-apps
org.gnome.Dictionary    gnome-apps
org.gnome.Documents gnome-apps
org.gnome.Epiphany  gnome-apps
```

仅列出应用程序：

```
$ flatpak remote-ls --app
```

列出特定的仓库应用程序：

```
$ flatpak remote-ls gnome-apps
```

### 如何从 flatpak 安装包？

运行以下命令从 flatpak 仓库安装软件包：

```
$ sudo flatpak install flathub com.github.muriloventuroso.easyssh

Required runtime for com.github.muriloventuroso.easyssh/x86_64/stable (runtime/org.gnome.Platform/x86_64/3.30) found in remote flathub
Do you want to install it? [y/n]: y
Installing in system:
org.gnome.Platform/x86_64/3.30                          flathub 4e93789f42ac
org.gnome.Platform.Locale/x86_64/3.30                   flathub 6abf9c0e2b72
org.freedesktop.Platform.html5-codecs/x86_64/18.08      flathub d6abde36c0be
com.github.muriloventuroso.easyssh/x86_64/stable        flathub 337db43043d2
  permissions: ipc, network, wayland, x11, dri
  file access: home, xdg-run/dconf, ~/.config/dconf:ro
  dbus access: ca.desrt.dconf
com.github.muriloventuroso.easyssh.Locale/x86_64/stable flathub af837356b222
Is this ok [y/n]: y
Installing: org.gnome.Platform/x86_64/3.30 from flathub
[####################] 1 metadata, 14908 content objects fetched; 228018 KiB transferred in 364 seconds
Now at 4e93789f42ac.
Installing: org.gnome.Platform.Locale/x86_64/3.30 from flathub
[####################] 4 metadata, 1 content objects fetched; 16 KiB transferred in 2 seconds
Now at 6abf9c0e2b72.
Installing: org.freedesktop.Platform.html5-codecs/x86_64/18.08 from flathub
[####################] 26 metadata, 131 content objects fetched; 2737 KiB transferred in 8 seconds
Now at d6abde36c0be.
Installing: com.github.muriloventuroso.easyssh/x86_64/stable from flathub
[####################] 191 metadata, 3633 content objects fetched; 24857 KiB transferred in 117 seconds
Now at 337db43043d2.
Installing: com.github.muriloventuroso.easyssh.Locale/x86_64/stable from flathub
[####################] 3 metadata, 1 content objects fetched; 14 KiB transferred in 2 seconds
Now at af837356b222.
```

所有已安装的应用程序都将放在以下位置：

```
$ ls /var/lib/flatpak/app/
com.github.muriloventuroso.easyssh
```

### 如何运行已安装的应用程序？

运行以下命令以启动所需的应用程序，确保替换为你的应用程序名称：

```
$ flatpak run com.github.muriloventuroso.easyssh
```

### 如何查看已安装的应用程序？

运行以下命令来查看已安装的应用程序：

```
$ flatpak list
Ref                                                Options
com.github.muriloventuroso.easyssh/x86_64/stable   system,current
org.freedesktop.Platform.html5-codecs/x86_64/18.08 system,runtime
org.gnome.Platform/x86_64/3.30                     system,runtime
```

### 如何查看有关已安装应用程序的详细信息？

运行以下命令以查看有关已安装应用程序的详细信息：

```
$ flatpak info com.github.muriloventuroso.easyssh

Ref: app/com.github.muriloventuroso.easyssh/x86_64/stable
ID: com.github.muriloventuroso.easyssh
Arch: x86_64
Branch: stable
Origin: flathub
Collection ID: org.flathub.Stable
Date: 2019-01-08 13:36:32 +0000
Subject: Update com.github.muriloventuroso.easyssh.json (cd35819c)
Commit: 337db43043d282c74d14a9caecdc780464b5e526b4626215d534d38b0935049f
Parent: 6e49096146f675db6ecc0ce7c5347b4b4f049b21d83a6cc4d01ff3f27c707cb6
Location: /var/lib/flatpak/app/com.github.muriloventuroso.easyssh/x86_64/stable/337db43043d282c74d14a9caecdc780464b5e526b4626215d534d38b0935049f
Installed size: 100.0 MB
Runtime: org.gnome.Platform/x86_64/3.30
Sdk: org.gnome.Sdk/x86_64/3.30
```

### 如何更新已安装的应用程序？

运行以下命令将已安装的应用程序更新到最新版本：

```
$ flatpak update
```

对于特定应用程序，使用以下格式：

```
$ flatpak update com.github.muriloventuroso.easyssh
```

### 如何移除已安装的应用程序？

运行以下命令来移除已安装的应用程序：

```
$ sudo flatpak uninstall com.github.muriloventuroso.easyssh
```

进入 man 页面以获取更多细节和选项：

```
$ flatpak --help
```

---

via: <https://www.2daygeek.com/how-to-install-and-enable-flatpak-support-on-linux/>

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

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


Vim 入门：基础

Summary: 为工作或者新项目学习足够的 Vim 知识。

文章不错，编辑的也不错，汉字上面有英文提示是如何实现的，

<ruby>分割<rt>split</rt></ruby>

厉害了

好

确实是很实用的基础功能，很适合新手上手，给一个赞，支持用心编辑的文章。

ADFA

为工作或者新项目学习足够的 Vim 知识。

>
> 为工作或者新项目学习足够的 Vim 知识。
>
>
>

![](/data/attachment/album/201904/20/104238gvg444k5tbm4gqt5.jpg)

我还清晰地记得我第一次接触 Vim 的时候。那时我还是一名大学生，计算机学院的机房里都装着 Ubuntu 系统。尽管我在上大学前也曾接触过不同的 Linux 发行版（比如 RHEL —— Red Hat 在百思买出售它的 CD），但这却是我第一次要在日常中频繁使用 Linux 系统，因为我的课程要求我这样做。当我开始使用 Linux 时，正如我的前辈和将来的后继者们一样，我感觉自己像是一名“真正的程序员”了。

![Real Programmers comic](/data/attachment/album/201904/20/104307h6o5ntn9h225onn0.jpg "Real Programmers comic")

*真正的程序员，来自 [xkcd](https://xkcd.com/378/)*

学生们可以使用像 [Kate](https://kate-editor.org) 一样的图形文本编辑器，这也安装在学校的电脑上了。对于那些可以使用 shell 但不习惯使用控制台编辑器的学生，最流行的选择是 [Nano](https://www.nano-editor.org)，它提供了很好的交互式菜单和类似于 Windows 图形文本编辑器的体验。

我有时会用 Nano，但当我听说 [Vi/Vim](https://www.vim.org) 和 [Emacs](https://www.gnu.org/software/emacs) 能做一些很棒的事情时我决定试一试它们（主要是因为它们看起来很酷，而且我也很好奇它们有什么特别之处）。第一次使用 Vim 时吓到我了 —— 我不想搞砸任何事情！但是，一旦我掌握了它的诀窍，事情就变得容易得多，我就可以欣赏这个编辑器的强大功能了。至于 Emacs，呃，我有点放弃了，但我很高兴我坚持和 Vim 在一起。

在本文中，我将介绍一下 Vim（基于我的个人经验），这样你就可以在 Linux 系统上用它来作为编辑器使用了。这篇文章不会让你变成 Vim 的专家，甚至不会触及 Vim 许多强大功能的皮毛。但是起点总是很重要的，我想让开始的经历尽可能简单，剩下的则由你自己去探索。

### 第 0 步：打开一个控制台窗口

在使用 Vim 前，你需要做一些准备工作。在 Linux 操作系统打开控制台终端。（因为 Vim 也可以在 MacOS 上使用，Mac 用户也可以使用这些说明）。

打开终端窗口后，输入 `ls` 命令列出当前目录下的内容。然后，输入 `mkdir Tutorial` 命令创建一个名为 `Tutorial` 的新目录。通过输入 `cd Tutorial` 来进入该目录。

![Create a folder](/data/attachment/album/201904/20/104312nbyok8arxho0bnok.jpg "Create a folder")

这就是全部的准备工作。现在是时候转到有趣的部分了——开始使用 Vim。

### 第 1 步：创建一个 Vim 文件和不保存退出

还记得我一开始说过我不敢使用 Vim 吗？我当时在害怕“如果我改变了一个现有的文件，把事情搞砸了怎么办？”毕竟，一些计算机科学作业要求我修改现有的文件。我想知道：如何在不保存更改的情况下打开和关闭文件？

好消息是你可以使用相同的命令在 Vim 中创建或打开文件：`vim <FILE_NAME>`，其中 `<FILE_NAME>` 表示要创建或修改的目标文件名。让我们通过输入 `vim HelloWorld.java` 来创建一个名为 `HelloWorld.java` 的文件。

你好，Vim！现在，讲一下 Vim 中一个非常重要的概念，可能也是最需要记住的：Vim 有多种模式，下面是 Vim 基础中需要知道的的三种：

| 模式 | 描述 |
| --- | --- |
| 正常模式 | 默认模式，用于导航和简单编辑 |
| 插入模式 | 用于直接插入和修改文本 |
| 命令行模式 | 用于执行如保存，退出等命令 |

Vim 也有其他模式，例如可视模式、选择模式和命令模式。不过上面的三种模式对我们来说已经足够用了。

你现在正处于正常模式，如果有文本，你可以用箭头键移动或使用其他导航键（将在稍后看到）。要确定你正处于正常模式，只需按下 `esc` (Escape）键即可。

>
> **提示：** `Esc` 切换到正常模式。即使你已经在正常模式下，点击 `Esc` 只是为了练习。
>
>
>

现在，有趣的事情发生了。输入 `:` （冒号键）并接着 `q!` （完整命令：`:q!`）。你的屏幕将显示如下：

![Editing Vim](/data/attachment/album/201904/20/104313nxbiqx37yq3kk5qx.jpg "Editing Vim")

在正常模式下输入冒号会将 Vim 切换到命令行模式，执行 `:q!` 命令将退出 Vim 编辑器而不进行保存。换句话说，你放弃了所有的更改。你也可以使用 `ZQ` 命令；选择你认为更方便的选项。

一旦你按下 `Enter` （回车），你就不再在 Vim 中。重复练习几次来掌握这条命令。熟悉了这部分内容之后，请转到下一节，了解如何对文件进行更改。

### 第 2 步：在 Vim 中修改并保存

通过输入 `vim HelloWorld.java` 和回车键来再次打开这个文件。你可以在插入模式中修改文件。首先，通过 `Esc` 键来确定你正处于正常模式。接着输入 `i` 来进入插入模式（没错，就是字母 **i**）。

在左下角，你将看到 `-- INSERT --`，这标志着你这处于插入模式。

![Vim insert mode](/data/attachment/album/201904/20/104315z2klgi2lwlbvthgg.jpg "Vim insert mode")

写一些 Java 代码。你可以写任何你想写的，不过这也有一份你可以参照的例子。你的屏幕将显示如下：

```
public class HelloWorld {
  public static void main([String][11][] args) {
  }
}
```

非常漂亮！注意文本是如何在 Java 语法中高亮显示的。因为这是个 Java 文件，所以 Vim 将自动检测语法并高亮颜色。

保存文件：按下 `Esc` 来退出插入模式并进入命令行模式。输入 `:` 并接着 `x!` （完整命令：`:x!`），按回车键来保存文件。你也可以输入 `wq` 来执行相同的操作。

现在，你知道了如何使用插入模式输入文本并使用以下命令保存文件：`:x!` 或者 `:wq`。

### 第 3 步：Vim 中的基本导航

虽然你总是可以使用上箭头、下箭头、左箭头和右箭头在文件中移动，但在一个几乎有数不清行数的大文件中，这将是非常困难的。能够在一行中跳跃光标将会是很有用的。虽然 Vim 提供了不少很棒的导航功能，不过在一开始，我想向你展示如何在 Vim 中到达某一特定的行。

单击 `Esc` 来确定你处于正常模式，接着输入 `:set number` 并键入回车。

瞧！你现在可以在每一行的左侧看到行号。

![Showing Line Numbers](/data/attachment/album/201904/20/104319ow29q27wwzs00s0y.jpg "Showing Line Numbers")

好，你也许会说，“这确实很酷，不过我该怎么跳到某一行呢？”再一次的，确认你正处于正常模式。接着输入 `:<LINE_NUMBER>`，在这里 `<LINE_NUMBER>` 是你想去的那一行的行数。按下回车键来试着移动到第二行。

```
:2
```

现在，跳到第三行。

![Jump to line 3](/data/attachment/album/201904/20/104322x033zctfxff9ff2z.jpg "Jump to line 3")

但是，假如你正在处理一个一千多行的文件，而你正想到文件底部。这该怎么办呢？确认你正处于正常模式，接着输入 `:$` 并按下回车。

你将来到最后一行！

现在，你知道如何在行间跳跃了，作为补充，我们来学一下如何移动到一行的行尾。确认你正处于有文本内容的一行，如第三行，接着输入 `$`。

![Go to the last character](/data/attachment/album/201904/20/104325w6poo9hhj9x6ozi9.jpg "Go to the last character")

你现在来到这行的最后一个字节了。在此示例中，高亮左大括号以显示光标移动到的位置，右大括号被高亮是因为它是高亮的左大括号的匹配字符。

这就是 Vim 中的基本导航功能。等等，别急着退出文件。让我们转到 Vim 中的基本编辑。不过，你可以暂时顺便喝杯咖啡或茶休息一下。

### 第 4 步：Vim 中的基本编辑

现在，你已经知道如何通过跳到想要的一行来在文件中导航，你可以使用这个技能在 Vim 中进行一些基本编辑。切换到插入模式。（还记得怎么做吗？是不是输入 `i` ？）当然，你可以使用键盘逐一删除或插入字符来进行编辑，但是 Vim 提供了更快捷的方法来编辑文件。

来到第三行，这里的代码是 `public static void main(String[] args) {`。双击 `d` 键，没错，就是 `dd`。如果你成功做到了，你将会看到，第三行消失了，剩下的所有行都向上移动了一行。（例如，第四行变成了第三行）。

![Deleting A Line](/data/attachment/album/201904/20/104329i0oripvlg8wz8lk7.jpg "Deleting A Line")

这就是<ruby> 删除 <rt>  delete </rt></ruby>命令。不要担心，键入 `u`，你会发现这一行又回来了。喔，这就是<ruby> 撤销 <rt>  undo </rt></ruby>命令。

![Undoing a change in Vim](/data/attachment/album/201904/20/104332o8nnv8qlqqlnelim.jpg "Undoing a change in Vim")

下一课是学习如何复制和粘贴文本，但首先，你需要学习如何在 Vim 中突出显示文本。按下 `v` 并向左右移动光标来选择或反选文本。当你向其他人展示代码并希望标识你想让他们注意到的代码时，这个功能也非常有用。

![Highlighting text in Vim](/data/attachment/album/201904/20/104335ol7u6u61uprm7bmr.jpg "Highlighting text in Vim")

来到第四行，这里的代码是 `System.out.println("Hello, Opensource");`。高亮这一行的所有内容。好了吗？当第四行的内容处于高亮时，按下 `y`。这就叫做<ruby> 复制 <rt>  yank </rt></ruby>模式，文本将会被复制到剪贴板上。接下来，输入 `o` 来创建新的一行。注意，这将让你进入插入模式。通过按 `Esc` 退出插入模式，然后按下 `p`，代表<ruby> 粘贴 <rt>  paste </rt></ruby>。这将把复制的文本从第三行粘贴到第四行。

![Pasting in Vim](/data/attachment/album/201904/20/104338li1hb4qmyeq46d2h.jpg "Pasting in Vim")

作为练习，请重复这些步骤，但也要修改新创建的行中的文字。此外，请确保这些行对齐工整。

>
> **提示：** 您需要在插入模式和命令行模式之间来回切换才能完成此任务。
>
>
>

当你完成了，通过 `x!` 命令保存文件。以上就是 Vim 基本编辑的全部内容。

### 第 5 步：Vim 中的基本搜索

假设你的团队领导希望你更改项目中的文本字符串。你该如何快速完成任务？你可能希望使用某个关键字来搜索该行。

Vim 的搜索功能非常有用。通过 `Esc` 键来进入命令模式，然后输入冒号 `:`，我们可以通过输入 `/<SEARCH_KEYWORD>` 来搜索关键词， `<SEARCH_KEYWORD>` 指你希望搜索的字符串。在这里，我们搜索关键字符串 `Hello`。在下面的图示中没有显示冒号，但这是必须输入的。

![Searching in Vim](/data/attachment/album/201904/20/104340tlsr8a33l2zr2zdl.jpg "Searching in Vim")

但是，一个关键字可以出现不止一次，而这可能不是你想要的那一个。那么，如何找到下一个匹配项呢？只需按 `n` 键即可，这代表<ruby> 下一个 <rt>  next </rt></ruby>。执行此操作时，请确保你没有处于插入模式！

### 附加步骤：Vim 中的分割模式

以上几乎涵盖了所有的 Vim 基础知识。但是，作为一个额外奖励，我想给你展示 Vim 一个很酷的特性，叫做<ruby> 分割 <rt>  split </rt></ruby>模式。

退出 `HelloWorld.java` 并创建一个新文件。在控制台窗口中，输入 `vim GoodBye.java` 并按回车键来创建一个名为 `GoodBye.java` 的新文件。

输入任何你想输入的让内容，我选择输入 `Goodbye`。保存文件（记住你可以在命令模式中使用 `:x!` 或者 `:wq`）。

在命令模式中，输入 `:split HelloWorld.java`，来看看发生了什么。

![Split mode in Vim](/data/attachment/album/201904/20/104345e9e9ucep9o9cruo4.jpg "Split mode in Vim")

Wow！快看！ `split` 命令将控制台窗口水平分割成了两个部分，上面是 `HelloWorld.java`，下面是 `GoodBye.java`。该怎么能在窗口之间切换呢？ 按住 `Control` 键（在 Mac 上）或 `Ctrl` 键（在 PC 上），然后按下 `ww` (即双击 `w` 键)。

作为最后一个练习，尝试通过复制和粘贴 `HelloWorld.java` 来编辑 `GoodBye.java` 以匹配下面屏幕上的内容。

![Modify GoodBye.java file in Split Mode](/data/attachment/album/201904/20/104349vqbzq47gnzq4x99u.jpg "Modify GoodBye.java file in Split Mode")

保存两份文件，成功！

>
> **提示 1：** 如果你想将两个文件窗口垂直分割，使用 `:vsplit <FILE_NAME>` 命令。（代替 `:split <FILE_NAME>` 命令，`<FILE_NAME>` 指你想要使用分割模式打开的文件名）。
>
>
> **提示 2：** 你可以通过调用任意数量的 `split` 或者 `vsplit` 命令来打开两个以上的文件。试一试，看看它效果如何。
>
>
>

### Vim 速查表

在本文中，您学会了如何使用 Vim 来完成工作或项目，但这只是你开启 Vim 强大功能之旅的开始，可以查看其他很棒的教程和技巧。

为了让一切变得简单些，我已经将你学到的一切总结到了 [一份方便的速查表](https://opensource.com/downloads/cheat-sheet-vim) 中。

---

via: <https://opensource.com/article/19/3/getting-started-vim>

作者：[Bryant Son](https://opensource.com/users/brson) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Modrisco](https://github.com/Modrisco) 校对：[wxy](https://github.com/wxy)

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


小白观察：如何将你的应用生态从 Apple 迁移到其他平台？

Summary: 这篇文章从软件、硬件两个方面，解读了如何将你的日常使用设备从 Apple 迁移到其他平台。其中提到的主要是 Google 的服务。

![](/data/attachment/album/201904/20/105448f900kkr5uiq0k5id.jpg)

### Deep News

#### 《如何将你的应用生态从 Apple 迁移到其他平台？》

[这篇文章](https://www.zdnet.com/article/alternatives-to-apples-ecosystem-yes-there-is-a-way-out/)从软件、硬件两个方面，解读了如何将你的日常使用设备从 Apple 迁移到其他平台。其中提到的主要是 Google 的服务。 具体的替换如下：

| Apple 生态 | Google 生态 |
| --- | --- |
| iPhone | Pixel 3 or Pixel 3XL |
| mac book | Pixelbook |
| Apple Watch | Fossil Sport |
| AirPods | Samsung Galaxy Buds |
| Homepod | Google Home, Google Home Mini, or Google Home Max |
| Homepod | Google Home Hub |
| Apple TV | Chromecast or Android TV box |

![](/data/attachment/album/201904/19/123826jwwhua7ggqzgxufz.png)

>
> 当初的屠龙少年终成尾大不掉的恶龙，一代一代的屠龙者不断出现，Google 又能否检查不作恶呢？拭目以待。
>
>
>

### Quick News

##### 微软 Hotmail （Outlook）发生数据泄露

据报道，一批非企业用户的邮箱遭到了泄漏 ，泄漏信息包括邮箱地址、文件夹名、邮件标题等。受影响的邮件为从 2019 年 1 月 1日 到 2019 年 3 月 28 日的邮件。微软表示已经做了处理，避免问题的扩大。[【GadgetsNow】](https://www.gadgetsnow.com/tech-news/hotmail-outlook-users-personal-data-exposed-for-over-two-months/articleshow/68952023.cms)

##### 微软推出 Google G Suite 迁移到 Office 365 的工具

微软推出了 Google G Suite 迁移到 Office 365 的工具，帮助用户从 Google G Suite 迁移数据到 Office 365 中。[【ZDNet】](https://www.zdnet.com/article/microsoft-starts-rolling-out-google-g-suite-to-office-365-migration-tools/)

##### Facebook 仍未走出隐私风波

据华盛顿邮报报道，美国联邦贸易委员会（FTC）正在考虑和研究设计新的法规来规范企业行为以及如何让扎克伯格对 Facebook 数据丢失负责。[【华盛顿邮报】](https://www.washingtonpost.com/technology/2019/04/19/federal-investigation-facebook-could-hold-mark-zuckerberg-accountable-privacy-sources-say/?noredirect=on&utm_term=.97ca68d303c7)


每日安全资讯：BGP 路由表即将突破 768k，可能会引发网络故障

Summary: 768k 日即将临近，它有可能会导致部分网络发生故障

768k 日即将临近，它有可能会导致部分网络发生故障

![](/data/attachment/album/201904/20/110757andgre8d788gfee3.jpg)

768k 日即将临近，它有可能会导致部分网络发生故障，但不用恐慌，你也可能会很幸运的体验不到任何问题。768k 日发源于 512k 日，512k 日是指路由器耗尽了储存全球 BGP 路由表的内存，它于 2014 年 8 月 12 日到来，导致了全世界数以百计的 ISP 发生网络故障。

在 512k 日来临之际，许多旧的路由器收到了紧急更新，分配了更多内存去储存 BGP 路由表，而新分配的值是 768k 或 768,000。现在 768k 的限制又要突破了。根据最新的数据，全球路由表已经达到了 767,392，无限接近 768k。

网络工程师和专家预测，768k 日将会在下个月到来，但这一次应该不会发生像 2014 年那样严重的网络问题，不过小型的地区 ISP 可能会遇到问题。

![](/data/attachment/album/201904/20/105923arbuz4rbazfasz7u.jpg)

来源：solidot.org

### 更多资讯

##### car2go 汽车共享 App 遭黑客入侵，100 多辆豪华汽车被窃

据 TheDrive 网站报道，黑客近日入侵 car2go 汽车共享应用 APP，并在芝加哥窃取了 100 多辆高端豪华汽车。

来源： 盖世汽车

详情： <http://t.cn/EXkMHek>

##### 穆勒报告披露更多俄罗斯如何攻击 DNC 及希拉里竞选团队的信息

据外媒报道，穆勒报告带来了俄罗斯政府如何入侵希拉里·克林顿总统竞选团队以及美国民主党全国委员会(DNC)文件和电子邮件的新信息。该份报告证实，俄罗斯曾一度使用位于美国的服务器展开大规模数据渗漏行动。

来源： cnBeta.COM

详情： <http://t.cn/EXkMEgM>

##### Facebook 承认员工可获取数百万 Instagram 用户的明文密码

Facebook 周四称，该公司员工可在一个内部数据库中看到数以百万计的 Instagram 用户密码，这些密码以可搜索的格式存储在数据库中。Facebook 此次宣布的这一消息是对上个月发表的一篇博文的更新，当时该公司披露信息称，公司员工可以看到数百万 Facebook 用户密码。

来源： 新浪科技

详情： <http://t.cn/EXkxvOH>

（信息来源于网络，安华金和搜集整理）


小白观察：Erlang 的设计者 Joe Armstrong 去世

Summary: R.I.P

有拼写错误, 是 "Joe Armstrong", 不是 "Jow Armstrong ".

![](/data/attachment/album/201904/21/091525veepemab9kbb9msw.jpg)

### Breaking News

##### Erlang 的设计者 Joe Armstrong 去世

Erlang 的设计者，计算机科学家及程序员 Jow Armstrong 昨日过世，享年 69 岁。

### Quick News

##### Fastly 提交了 IPO 的文件

服务了 Github、Twitter、Yelp、Vogue、imgur、vimeo 的 CDN 服务提供商 Fastly 提交了 IPO 上市的文件。

[【TechCrunch】](https://techcrunch.com/2019/04/19/fastly-the-content-delivery-network-files-for-an-ipo/)

>
> Fastly 能发展的很好么？看看他的竞品吧， Akamai CDN 的股票目前每股 75.34 元；Cloudflare 也在寻求上市。
>
>
>

##### 缺乏睡眠最终会导致你死亡

工业社会的发展，我们用更多的时间来工作，更少的时间来睡觉。根据畅销书《Why we Sleep Unlocking Dreams》的作者 Walker 表示，“睡眠不足会渗透到我们身体的每一个角落里，而且，睡眠是一种必须品“。[【Wired】](https://www.wired.com/story/youre-not-getting-enough-sleep-and-its-killing-you/)

>
> 结合 996 ICU 一起看，还是身体重要。
>
>
>

##### Chrome 将于 4 月 23 日发布 Chrome 74

新的 Chrome 74 为 Windows 提供了 Darkmode ，为 Linux 提供了 Container Backup、 Audio Support、GPU Acceleration、USB Device Access、Linux Apps Search and Installation 等特性。[【HowToGeek】](https://www.howtogeek.com/411621/whats-new-in-chrome-74-arriving-april-23/)

>
> 这次的更新，怎么看怎么像 Linux 专版
>
>
>


解决 Ubuntu 在启动时冻结的问题

神舟T65 即使是设置过这个也没法启动图形界面，会卡死在图形服务加载哪里，但安装deepin即又是正常的，到登陆界面后切换到tty3使用字符界面登陆并添加.conf重新初始化一下就可以了，除了deepin其它任何linux均引导冻结

>
> 本文将向你一步步展示如何通过安装 NVIDIA 专有驱动来处理 Ubuntu 在启动过程中冻结的问题。本教程仅在一个新安装的 Ubuntu 系统上操作验证过，不过在其它情况下也理应可用。
>
>
>

不久前我买了台[宏碁掠夺者](https://amzn.to/2YVV6rt)笔记本电脑来测试各种 Linux 发行版。这台庞大且笨重的机器与我喜欢的，类似[戴尔 XPS](https://itsfoss.com/dell-xps-13-ubuntu-review/)那般小巧轻便的笔记本电脑大相径庭。

我即便不打游戏也选择这台电竞笔记本电脑的原因，就是为了 [NVIDIA 的显卡](https://www.nvidia.com/en-us/)。宏碁掠夺者 Helios 300 上搭载了一块 [NVIDIA Geforce](https://www.nvidia.com/en-us/geforce/) GTX 1050Ti 显卡。

NVIDIA 那糟糕的 Linux 兼容性为人们所熟知。过去很多 It’s FOSS 的读者都向我求助过关于 NVIDIA 笔记本电脑的问题，而我当时无能为力，因为我手头上没有使用 NVIDIA 显卡的系统。

所以当我决定搞一台专门的设备来测试 Linux 发行版时，我选择了带有 NVIDIA 显卡的笔记本电脑。

这台笔记本原装的 Windows 10 系统安装在 120 GB 的固态硬盘上，并另外配有 1 TB 的机械硬盘来存储数据。在此之上我配置好了 [Windows 10 和 Ubuntu 18.04 双系统](https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/)。整个的安装过程舒适、方便、快捷。

随后我启动了 [Ubuntu](https://www.ubuntu.com/)。那熟悉的紫色界面展现了出来，然后我就发现它卡在那儿了。鼠标一动不动，我也输入不了任何东西，然后除了长按电源键强制关机以外我啥事儿都做不了。

然后再次尝试启动，结果一模一样。整个系统就一直卡在那个紫色界面，随后的登录界面也出不来。

这听起来很耳熟吧？下面就让我来告诉你如何解决这个 Ubuntu 在启动过程中冻结的问题。

>
> 如果你用的不是 Ubuntu
>
>
> 请注意，尽管是在 Ubuntu 18.04 上操作的，本教程应该也能用于其他基于 Ubuntu 的发行版，例如 Linux Mint、elementary OS 等等。关于这点我已经在 Zorin OS 上确认过。
>
>
>

### 解决 Ubuntu 启动中由 NVIDIA 驱动引起的冻结问题

![](/data/attachment/album/201904/21/095055w2sv4xsxs2di326d.png)

我介绍的解决方案适用于配有 NVIDIA 显卡的系统，因为你所面临的系统冻结问题是由开源的 [NVIDIA Nouveau 驱动](https://nouveau.freedesktop.org/wiki/)所导致的。

事不宜迟，让我们马上来看看如何解决这个问题。

#### 步骤 1：编辑 Grub

在启动系统的过程中，请你在如下图所示的 Grub 界面上停下。如果你没看到这个界面，在启动电脑时请按住 `Shift` 键。

在这个界面上，按 `E` 键进入编辑模式。

![按“E”按键](/data/attachment/album/201904/21/095057tmli00lsqowlms0n.jpg)

你应该看到一些如下图所示的代码。此刻你应关注于以 “linux” 开头的那一行。

![前往 Linux 开头的那一行](/data/attachment/album/201904/21/095101mwm8k8l8kbbwq88b.jpg)

#### 步骤 2：在 Grub 中临时修改 Linux 内核参数

回忆一下，我们的问题出在 NVIDIA 显卡驱动上，是开源版 NVIDIA 驱动的不适配导致了我们的问题。所以此处我们能做的就是禁用这些驱动。

此刻，你有多种方式可以禁用这些驱动。我最喜欢的方式是通过 `nomodeset` 来禁用所有显卡的驱动。

请把下列文本添加到以 “linux” 开头的那一行的末尾。此处你应该可以正常输入。请确保你把这段文本加到了行末。

```
 nomodeset
```

现在你屏幕上的显示应如下图所示：

![通过向内核添加 nomodeset 来禁用显卡驱动](/data/attachment/album/201904/21/095103b4ha4cfchfh3fth4.jpg)

按 `Ctrl+X` 或 `F10` 保存并退出。下次你就将以修改后的内核参数来启动。

>
> 对以上操作的解释
>
>
> 所以我们究竟做了些啥？那个 `nomodeset` 又是个什么玩意儿？让我来向你简单地解释一下。
>
>
> 通常来说，显卡是在 X 或者是其他显示服务器开始执行后才被启用的，也就是在你登录系统并看到图形界面以后。
>
>
> 但近来，视频模式的设置被移进了内核。这么做的众多优点之一就是能你看到一个漂亮且高清的启动画面。
>
>
> 若你往内核中加入 `nomodeset` 参数，它就会指示内核在显示服务启动后才加载显卡驱动。
>
>
> 换句话说，你在此时禁止视频驱动的加载，由此产生的冲突也会随之消失。你在登录进系统以后，还是能看到一切如旧，那是因为显卡驱动在随后的过程中被加载了。
>
>
>

#### 步骤 3：更新你的系统并安装 NVIDIA 专有驱动

别因为现在可以登录系统了就过早地高兴起来。你之前所做的只是临时措施，在下次启动的时候，你的系统依旧会尝试加载 Nouveau 驱动而因此冻结。

这是否意味着你将不得不在 Grub 界面上不断地编辑内核？可喜可贺，答案是否定的。

你可以在 Ubuntu 上为 NVIDIA 显卡[安装额外的驱动](https://itsfoss.com/install-additional-drivers-ubuntu/)。在使用专有驱动后，Ubuntu 将不会在启动过程中冻结。

我假设这是你第一次登录到一个新安装的系统。这意味着在做其他事情之前你必须先[更新 Ubuntu](https://itsfoss.com/update-ubuntu/)。通过 Ubuntu 的 `Ctrl+Alt+T` [系统快捷键](https://itsfoss.com/ubuntu-shortcuts/)打开一个终端，并输入以下命令：

```
sudo apt update && sudo apt upgrade -y
```

在上述命令执行完以后，你可以尝试安装额外的驱动。不过根据我的经验，在安装新驱动之前你需要先重启一下你的系统。在你重启时，你还是需要按我们之前做的那样修改内核参数。

当你的系统已经更新和重启完毕，按下 `Windows` 键打开一个菜单栏，并搜索“<ruby> 软件与更新 <rt>  Software & Updates </rt></ruby>”。

![点击“软件与更新”（Software & Updates）](/data/attachment/album/201904/21/095106y51mm1bznb4tbixu.png)

然后切换到“<ruby> 额外驱动 <rt>  Additional Drivers </rt></ruby>”标签页，并等待数秒。然后你就能看到可供系统使用的专有驱动了。在这个列表上你应该可以找到 NVIDIA。

选择专有驱动并点击“<ruby> 应用更改 <rt>  Apply Changes </rt></ruby>”。

![NVIDIA 驱动安装中](/data/attachment/album/201904/21/095108bk9cppkfuscxck59.jpg)

新驱动的安装会费点时间。若你的系统启用了 UEFI 安全启动，你将被要求设置一个密码。*你可以将其设置为任何容易记住的密码*。它的用处我将在步骤 4 中说明。

![你可能需要设置一个安全启动密码](/data/attachment/album/201904/21/095110c29h2vncss1nhkg4.jpg)

安装完成后，你会被要求重启系统以令之前的更改生效。

![在新驱动安装好后重启你的系统](/data/attachment/album/201904/21/095112p2g27c11dzcrubku.jpg)

#### 步骤 4：处理 MOK（仅针对启用了 UEFI 安全启动的设备）

如果你之前被要求设置安全启动密码，此刻你会看到一个蓝色界面，上面写着 “MOK management”。这是个复杂的概念，我试着长话短说。

对 MOK（[设备所有者密码](https://firmware.intel.com/blog/using-mok-and-uefi-secure-boot-suse-linux)）的要求是因为安全启动的功能要求所有内核模块都必须被签名。Ubuntu 中所有随 ISO 镜像发行的内核模块都已经签了名。由于你安装了一个新模块（也就是那个额外的驱动），或者你对内核模块做了修改，你的安全系统可能视之为一个未经验证的外部修改，从而拒绝启动。

因此，你可以自己对系统模块进行签名（以告诉 UEFI 系统莫要大惊小怪，这些修改是你做的），或者你也可以简单粗暴地[禁用安全启动](https://itsfoss.com/disable-secure-boot-in-acer/)。

现在你对[安全启动和 MOK](https://wiki.ubuntu.com/UEFI/SecureBoot/DKMS) 有了一定了解，那咱们就来看看在遇到这个蓝色界面后该做些什么。

如果你选择“继续启动”，你的系统将有很大概率如往常一样启动，并且你啥事儿也不用做。不过在这种情况下，新驱动的有些功能有可能工作不正常。

这就是为什么，你应该“选择注册 MOK”。

![](/data/attachment/album/201904/21/095114dujx2ufn55xnn3rz.jpg)

它会在下一个页面让你点击“继续”，然后要你输入一串密码。请输入在上一步中，在安装额外驱动时设置的密码。

>
> 别担心！
>
>
> 如果你错过了这个关于 MOK 的蓝色界面，或不小心点了“继续启动”而不是“注册 MOK”，不必惊慌。你的主要目的是能够成功启动系统，而通过禁用 Nouveau 显卡驱动，你已经成功地实现了这一点。
>
>
> 最坏的情况也不过就是你的系统切换到 Intel 集成显卡而不再使用 NVIDIA 显卡。你可以之后的任何时间安装 NVIDIA 显卡驱动。你的首要任务是启动系统。
>
>
>

#### 步骤 5：享受安装了专有 NVIDIA 驱动的 Linux 系统

当新驱动被安装好后，你需要再次重启系统。别担心！目前的情况应该已经好起来了，并且你不必再去修改内核参数，而是能够直接启动 Ubuntu 系统了。

我希望本教程帮助你解决了 Ubuntu 系统在启动中冻结的问题，并让你能够成功启动 Ubuntu 系统。

如果你有任何问题或建议，请在下方评论区给我留言。

---

via: <https://itsfoss.com/fix-ubuntu-freezing/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Raverstern](https://github.com/Raverstern) 校对：[wxy](https://github.com/wxy)

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


5 个有用的开源日志分析工具

Summary: 监控网络活动既重要又繁琐，以下这些工具可以使它更容易。

Elastic Stack (ELK Stack) 感觉还不错。

监控网络活动既重要又繁琐，以下这些工具可以使它更容易。

>
> 监控网络活动既重要又繁琐，以下这些工具可以使它更容易。
>
>
>

![](/data/attachment/album/201904/21/105133idpt27j0fk043qqp.jpg)

监控网络活动是一项繁琐的工作，但有充分的理由这样做。例如，它允许你查找和调查工作站和连接到网络的设备及服务器上的可疑登录，同时确定管理员滥用了什么。你还可以跟踪软件安装和数据传输，以实时识别潜在问题，而不是在损坏发生后才进行跟踪。

这些日志还有助于使你的公司遵守适用于在欧盟范围内运营的任何实体的[通用数据保护条例](https://opensource.com/article/18/4/gdpr-impact)（GDPR）。如果你的网站在欧盟可以浏览，那么你就有遵守的该条例的资格。

日志记录，包括跟踪和分析，应该是任何监控基础设置中的一个基本过程。要从灾难中恢复 SQL Server 数据库，需要事务日志文件。此外，通过跟踪日志文件，DevOps 团队和数据库管理员（DBA）可以保持最佳的数据库性能，又或者，在网络攻击的情况下找到未经授权活动的证据。因此，定期监视和分析系统日志非常重要。这是一种重新创建导致出现任何问题的事件链的可靠方式。

现在有很多开源日志跟踪器和分析工具可供使用，这使得为活动日志选择合适的资源比你想象的更容易。自由和开源软件社区提供的日志设计适用于各种站点和操作系统。以下是五个我用过的最好的工具，它们并没有特别的顺序。

### Graylog

[Graylog](https://www.graylog.org/products/open-source) 于 2011 年在德国创立，现在作为开源工具或商业解决方案提供。它被设计成一个集中式日志管理系统，接受来自不同服务器或端点的数据流，并允许你快速浏览或分析该信息。

![Graylog screenshot](/data/attachment/album/201904/21/105146oxvxgnxmjgmzngtm.png "Graylog screenshot")

Graylog 在系统管理员中有着良好的声誉，因为它易于扩展。大多数 Web 项目都是从小规模开始的，但它们可能指数级增长。Graylog 可以均衡后端服务网络中的负载，每天可以处理几 TB 的日志数据。

IT 管理员会发现 Graylog 的前端界面易于使用，而且功能强大。Graylog 是围绕仪表板的概念构建的，它允许你选择你认为最有价值的指标或数据源，并快速查看一段时间内的趋势。

当发生安全或性能事件时，IT 管理员希望能够尽可能地根据症状追根溯源。Graylog 的搜索功能使这变得容易。它有内置的容错功能，可运行多线程搜索，因此你可以同时分析多个潜在的威胁。

### Nagios

[Nagios](https://www.nagios.org/downloads/) 始于 1999 年，最初是由一个开发人员开发的，现在已经发展成为管理日志数据最可靠的开源工具之一。当前版本的 Nagios 可以与运行 Microsoft Windows、Linux 或 Unix 的服务器集成。

![Nagios Core](/data/attachment/album/201904/21/105149w87touctxtcszzix.png "Nagios Core")

它的主要产品是日志服务器，旨在简化数据收集并使系统管理员更容易访问信息。Nagios 日志服务器引擎将实时捕获数据，并将其提供给一个强大的搜索工具。通过内置的设置向导，可以轻松地与新端点或应用程序集成。

Nagios 最常用于需要监控其本地网络安全性的组织。它可以审核一系列与网络相关的事件，并帮助自动分发警报。如果满足特定条件，甚至可以将 Nagios 配置为运行预定义的脚本，从而允许你在人员介入之前解决问题。

作为网络审计的一部分，Nagios 将根据日志数据来源的地理位置过滤日志数据。这意味着你可以使用地图技术构建全面的仪表板，以了解 Web 流量是如何流动的。

### Elastic Stack (ELK Stack)

[Elastic Stack](https://www.elastic.co/products)，通常称为 ELK Stack，是需要筛选大量数据并理解其日志系统的组织中最受欢迎的开源工具之一（这也是我个人的最爱）。

![ELK Stack](/data/attachment/album/201904/21/105151u8ky1biv09bxybi1.png "ELK Stack")

它的主要产品由三个独立的产品组成：Elasticsearch、Kibana 和 Logstash：

* 顾名思义， Elasticsearch 旨在帮助用户使用多种查询语言和类型在数据集之中找到匹配项。速度是它最大的优势。它可以扩展成由数百个服务器节点组成的集群，轻松处理 PB 级的数据。
* Kibana 是一个可视化工具，与 Elasticsearch 一起工作，允许用户分析他们的数据并构建强大的报告。当你第一次在服务器集群上安装 Kibana 引擎时，你会看到一个显示着统计数据、图表甚至是动画的界面。
* ELK Stack 的最后一部分是 Logstash，它作为一个纯粹的服务端管道进入 Elasticsearch 数据库。你可以将 Logstash 与各种编程语言和 API 集成，这样你的网站和移动应用程序中的信息就可以直接提供给强大的 Elastic Stalk 搜索引擎中。

ELK Stack 的一个独特功能是，它允许你监视构建在 WordPress 开源网站上的应用程序。与[跟踪管理日志和 PHP 日志](https://www.wpsecurityauditlog.com/benefits-wordpress-activity-log/)的大多数开箱即用的安全审计日志工具相比，ELK Stack 可以筛选 Web 服务器和数据库日志。

糟糕的日志跟踪和数据库管理是导致网站性能不佳的最常见原因之一。没有定期检查、优化和清空数据库日志，不仅会降低站点的运行速度，还可能导致其完全崩溃。因此，ELK Stack 对于每个 WordPress 开发人员的工具包来说都是一个优秀的工具。

### LOGalyze

[LOGalyze](http://www.logalyze.com/) 是一个位于匈牙利的组织，它为系统管理员和安全专家构建开源工具，以帮助他们管理服务器日志，并将其转换为有用的数据点。其主要产品可供个人或商业用户免费下载。

![LOGalyze](/data/attachment/album/201904/21/105154rg6mv3zunknwz503.jpg "LOGalyze")

LOGalyze 被设计成一个巨大的管道，其中多个服务器、应用程序和网络设备可以使用简单对象访问协议（SOAP）方法提供信息。它提供了一个前端界面，管理员可以登录界面来监控数据集并开始分析数据。

在 LOGalyze 的 Web 界面中，你可以运行动态报告，并将其导出到 Excel 文件、PDF 文件或其他格式。这些报告可以基于 LOGalyze 后端管理的多维统计信息。它甚至可以跨服务器或应用程序组合数据字段，借此来帮助你发现性能趋势。

LOGalyze 旨在不到一个小时内完成安装和配置。它具有预先构建的功能，允许它以法律所要求的格式收集审计数据。例如，LOGalyze 可以很容易地运行不同的 HIPAA 报告，以确保你的组织遵守健康法律并保持合规性。

### Fluentd

如果你所在组织的数据源位于许多不同的位置和环境中，那么你的目标应该是尽可能地将它们集中在一起。否则，你将难以监控性能并防范安全威胁。

[Fluentd](https://www.fluentd.org/) 是一个强大的数据收集解决方案，它是完全开源的。它没有提供完整的前端界面，而是作为一个收集层来帮助组织不同的管道。Fluentd 在被世界上一些最大的公司使用，但是也可以在较小的组织中实施。

![Fluentd architecture](/data/attachment/album/201904/21/105158jy44o5ho4wgogwf4.png "Fluentd architecture")

Fluentd 最大的好处是它与当今最常用的技术工具兼容。例如，你可以使用 Fluentd 从 Web 服务器（如 Apache）、智能设备传感器和 MongoDB 的动态记录中收集数据。如何处理这些数据完全取决于你。

Fluentd 基于 JSON 数据格式，它可以与由卓越的开发人员创建的 [500 多个插件](https://opensource.com/article/18/9/open-source-log-aggregation-tools)一起使用。这使你可以将日志数据扩展到其他应用程序中，并通过最少的手工操作从中获得更好的分析。

### 写在最后

如果出于安全原因、政府合规性和衡量生产力的原因，你还没有使用活动日志，那么现在开始改变吧。市场上有很多插件，它们可以与多种环境或平台一起工作，甚至可以在内部网络上使用。不要等发生了严重的事件，才采取一个积极主动的方法去维护和监督日志。

---

via: <https://opensource.com/article/19/4/log-analysis-tools>

作者：[Sam Bocetta](https://opensource.com/users/sambocetta) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


每日安全资讯：阻止了 WannaCry 传播的安全研究员被控传播银行木马

![](/data/attachment/album/201904/21/110357b0e2k8qqk2x7we8q.jpg)

英国安全研究员 Marcus Hutchins（MalwareTech），2017 年因发现 WannaCry 的关闭开关阻止了该勒索软件的进一步传播而被视为一位安全领域的英雄，但他在当年前往美国参加安全会议 Black Hat 和 DEF CON 后准备在机场离境时遭到 FBI 逮捕，被控开发、传播和维护了银行木马 Kronos。

来源：solidot.org

### 更多资讯

##### 勒索软件攻击致使 The Weather Channel 停播

根据《华尔街日报》报道，周四 The Weather Channel（天气频道）遭勒索软件攻击，导致其一个现场直播的电视节目停播。停播持续大约一个多小时，攻击发生时美国东南部天气十分恶劣。美国联邦调查局告诉《华尔街日报》，勒索软件攻击是问题的根源，该机构正在进行调查。

来源： solidot.org

详情： <http://www.dbsec.cn/zx/20190421-2.html>

##### 印度支付卡欺诈发案率快速上升 名列全球第二

根据网络安全公司Gemini Advisory发布的网络犯罪统计数据，2018年，超过320万张印度支付卡记录被泄露，并在网上发布供出售，这与去年相比有了很大的飞跃，当时只有80万张印度支付卡的详细信息被发布在网络犯罪论坛上。

来源： cnBeta.COM

详情： <http://t.cn/EaActwV>

##### 计算机故障被指延误了巴黎圣母院的灭火

巴黎圣母院周一晚上六点左右失火，最有可能的失火原因是电梯的电气短路，但一个计算机 bug 被指耽搁了灭火行动，导致了火势的快速蔓延。法国媒体报道称，在晚上六点后不久火警响起，但计算机 bug 在错误的地点显示了起火的位置。

来源： solidot.org

详情： <http://t.cn/EaAcxIJ>

##### 薅羊毛薅到犯罪 有人非法套取信用卡积分获利被判刑

获取积分，兑换礼品，这是不少消费者，尤其是年轻群体熟悉的生活方式，有人把这种赚取优惠的行为戏称为“薅羊毛”。但是，“羊毛”薅得太狠，也会违法犯罪，山东、上海等地最近先后有人因为通过虚假交易等方式获取信用卡积分和礼品，被判诈骗罪。

来源： 央广网

详情： <http://t.cn/EaAco6w>

（信息来源于网络，安华金和搜集整理）


我们做了一个极简的文章列表小程序

![](/data/attachment/album/201904/22/092735gnqysmxmlcilkuc2.jpg)

一直想有个 Linux 中国的 APP，因为种种条件限制而没有达成这个目标。

微信小程序出来之后，也考虑过是否可以用微信小程序来实现一个 Linux 中国的 APP。但是在这个小程序内应该实现什么功能呢？经过几番考虑，可能也是因为最近比较喜欢极简风格，因此就做了一个（真的）极简的 Linux 中国小程序。

好吧，以上是给我自己找的理由，实在是因为这个小程序里面不知道该放些什么功能才是大家需要的，所以这个小程序只有 3 个页面：一闪而过的封面、显示文章题图及标题的翻页列表，以及一个显示文章内容的 web-view。

![扫描或搜索“Linux文章”小程序](/data/attachment/album/201904/22/091841ibtqs00302vqbmoa.jpg)

打开这个小程序，封面闪过之后，就是这样的列表：

![竖版界面](/data/attachment/album/201904/22/090307ckk71gi4qq7k9tf4.jpg)

向左滑动，就是下一篇。

点击这个页面，会切换显示模式，以横屏模式显示题图。再次点击切换回来。横屏模式下长按图片，可以保存该图片（需要授权才行）。之所以做这样的功能，是因为我们的每篇文章，都会尽力去选择一张漂亮的题图，不能辜负这种对读者的心意。:D

![横版题图](/data/attachment/album/201904/22/090719oxhsss9jf5hmhch3.jpg)

什么，你说如何访问文章？哦，是我忘记啦——在竖屏模式下，长按即可访问。

此外，要是遇到喜欢的文章，可以方便的分享出去：

![分享](/data/attachment/album/201904/22/091647hssve03qacqpu631.jpg)


在 Bash 中使用[方括号]（二）

Summary: 我们继续来看方括号的用法，它们甚至还可以在 Bash 当中作为一个命令使用。

我们继续来看方括号的用法，它们甚至还可以在 Bash 当中作为一个命令使用。

![square brackets](/data/attachment/album/201904/22/100922bacug4z3a7bvodgd.jpg "square brackets")

>
> 我们继续来看方括号的用法，它们甚至还可以在 Bash 当中作为一个命令使用。
>
>
>

欢迎回到我们的方括号专题。在[前一篇文章](/article-10717-1.html)当中，我们介绍了方括号在命令行中可以用于通配操作，如果你已经读过前一篇文章，就可以从这里继续了。

方括号还可以以一个命令的形式使用，就像这样：

```
[ "a" = "a" ]
```

上面这种 `[ ... ]` 的形式就可以看成是一个可执行的命令。要注意，方括号内部的内容 `"a" = "a"` 和方括号 `[`、`]` 之间是有空格隔开的。因为这里的方括号被视作一个命令，因此要用空格将命令和它的参数隔开。

上面这个命令的含义是“判断字符串 `"a"` 和字符串 `"a"` 是否相同”，如果判断结果为真，那么 `[ ... ]` 就会以<ruby> 状态码 <rt>  status code </rt></ruby> 0 退出，否则以状态码 1 退出。在[之前的文章](/article-10596-1.html)中，我们也有介绍过状态码的概念，可以通过 `$?` 变量获取到最近一个命令的状态码。

分别执行

```
[ "a" = "a" ]
echo $?
```

以及

```
[ "a" = "b" ]
echo $?
```

这两段命令中，前者会输出 0（判断结果为真），后者则会输出 1（判断结果为假）。在 Bash 当中，如果一个命令的状态码是 0，表示这个命令正常执行完成并退出，而且其中没有出现错误，对应布尔值 `true`；如果在命令执行过程中出现错误，就会返回一个非零的状态码，对应布尔值 `false`。而 `[ ... ]` 也同样遵循这样的规则。

因此，`[ ... ]` 很适合在 `if ... then`、`while` 或 `until` 这种在代码块结束前需要判断是否达到某个条件结构中使用。

对应使用的逻辑判断运算符也相当直观：

```
[ STRING1 = STRING2 ] => 检查字符串是否相等
[ STRING1 != STRING2 ] => 检查字符串是否不相等
[ INTEGER1 -eq INTEGER2 ] => 检查整数 INTEGER1 是否等于 INTEGER2
[ INTEGER1 -ge INTEGER2 ] => 检查整数 INTEGER1 是否大于等于 INTEGER2
[ INTEGER1 -gt INTEGER2 ] => 检查整数 INTEGER1 是否大于 INTEGER2
[ INTEGER1 -le INTEGER2 ] => 检查整数 INTEGER1 是否小于等于 INTEGER2
[ INTEGER1 -lt INTEGER2 ] => 检查整数 INTEGER1 是否小于 INTEGER2
[ INTEGER1 -ne INTEGER2 ] => 检查整数 INTEGER1 是否不等于 INTEGER2
等等……
```

方括号的这种用法也可以很有 shell 风格，例如通过带上 `-f` 参数可以判断某个文件是否存在：

```
for i in {000..099}; \
 do \
  if [ -f file$i ]; \
  then \
   echo file$i exists; \
  else \
   touch file$i; \
   echo I made file$i; \
  fi; \
done
```

如果你在上一篇文章使用到的测试目录中运行以上这串命令，其中的第 3 行会判断那几十个文件当中的某个文件是否存在。如果文件存在，会输出一条提示信息；如果文件不存在，就会把对应的文件创建出来。最终，这个目录中会完整存在从 `file000` 到 `file099` 这一百个文件。

上面这段命令还可以写得更加简洁：

```
for i in {000..099};\
do\
 if [ ! -f file$i ];\
 then\
  touch file$i;\
  echo I made file$i;\
 fi;\
done
```

其中 `!` 运算符表示将判断结果取反，因此第 3 行的含义就是“如果文件 `file$i` 不存在”。

可以尝试一下将测试目录中那几十个文件随意删除几个，然后运行上面的命令，你就可以看到它是如何把被删除的文件重新创建出来的。

除了 `-f` 之外，还有很多有用的参数。`-d` 参数可以判断某个目录是否存在，`-h` 参数可以判断某个文件是不是一个符号链接。可以用 `-G` 参数判断某个文件是否属于某个用户组，用 `-ot` 参数判断某个文件的最后更新时间是否早于另一个文件，甚至还可以判断某个文件是否为空文件。

运行下面的几条命令，可以向几个文件中写入一些内容：

```
echo "Hello World" >> file023
echo "This is a message" >> file065
echo "To humanity" >> file010
```

然后运行：

```
for i in {000..099};\
do\
 if [ ! -s file$i ];\
 then\
  rm file$i;\
  echo I removed file$i;\
 fi;\
done
```

你就会发现所有空文件都被删除了，只剩下少数几个非空的文件。

如果你还想了解更多别的参数，可以执行 `man test` 来查看 `test` 命令的 man 手册（`test` 是 `[ ... ]` 的命令别名）。

有时候你还会看到 `[[ ... ]]` 这种双方括号的形式，使用起来和单方括号差别不大。但双方括号支持的比较运算符更加丰富：例如可以使用 `==` 来判断某个字符串是否符合某个<ruby> 模式 <rt>  pattern </rt></ruby>，也可以使用 `<`、`>` 来判断两个字符串的出现顺序。

可以在 [Bash 表达式文档](https://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions)中了解到双方括号支持的更多运算符。

### 下一集

在下一篇文章中，我们会开始介绍圆括号 `()` 在 Linux 命令行中的用法，敬请关注！

### 更多

* [Linux 工具：点的含义](/article-10465-1.html)
* [理解 Bash 中的尖括号](/article-10502-1.html)
* [Bash 中尖括号的更多用法](/article-10529-1.html)
* [Linux 中的 &](/article-10587-1.html)
* [Bash 中的 ＆ 符号和文件描述符](/article-10591-1.html)
* [Bash 中的逻辑和（&）](/article-10596-1.html)
* [浅析 Bash 中的 {花括号}](/article-10624-1.html)
* [在 Bash 中使用[方括号] （一）](/article-10717-1.html)

---

via: <https://www.linux.com/blog/learn/2019/4/using-square-brackets-bash-part-2>

作者：[Paul Brown](https://www.linux.com/users/bro66) 选题：[lujun9972](https://github.com/lujun9972) 译者：[HankChow](https://github.com/HankChow) 校对：[wxy](https://github.com/wxy)

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