如何用 Nagios 监控通用服务

Summary: Nagios内置了很多脚本来监控服务。本篇会使用其中一些来检查通用服务如MySql、Apache、DNS等等。 为了保证本篇集中在系统监控，我们不会在这里配置主机组或者模板，它们已经在 前面的教程中覆盖了，它们可以满足需要了。  在命令行中运行Nagios 通常建议在添加到Nagios前，先在命令行中运行Nagios服务检测脚本。它会给出执行是否成功以及脚本的输出将会看上去的样子。 这些脚本存储在 /etc/nagios-plugins/config/ ，可执行文件在 /usr/lib/nagios/plugins/。 下面就是该怎么做 root@nagios:~# cd /etc/nagios-plugins/config/  提供的脚

Nagios内置了很多脚本来监控服务。本篇会使用其中一些来检查通用服务如MySql、Apache、DNS等等。

为了保证本篇集中在系统监控，我们不会在这里配置主机组或者模板，它们已经在 [前面的教程](/article-2436-1.html)中覆盖了，它们可以满足需要了。

![](/data/attachment/album/201507/02/163344eo0tnj54x3d5odb3.jpg)

### 在命令行中运行Nagios

通常建议在添加到Nagios前，先在命令行中运行Nagios服务检测脚本。它会给出执行是否成功以及脚本的输出将会看上去的样子。

这些脚本存储在 /etc/nagios-plugins/config/ ，可执行文件在 /usr/lib/nagios/plugins/。

下面就是该怎么做

```
root@nagios:~# cd /etc/nagios-plugins/config/

```

提供的脚本包含了语法帮助。示例包含了部分输出。

```
root@nagios:~# cat /etc/nagios-plugins/config/tcp_udp.cfg

```

---

```
# 'check_tcp' command definition
define command{
        command_name    check_tcp
        command_line    /usr/lib/nagios/plugins/check_tcp -H '$HOSTADDRESS$' -p '$ARG1$'

```

了解了语法，TCP 80端口可以用下面的方法检查。

```
root@nagios:~# /usr/lib/nagios/plugins/check_tcp -H 10.10.10.1 -p 80

```

---

```
TCP OK - 0.000 second response time on port 80|time=0.000222s;;;0.000000;10.000000

```

### 示例拓扑

本片中使用下面三台服务器。每台服务器运行多个通用服务。Nagios服务器现在运行的是Ubuntu。

* Server 1 (10.10.10.1) : MySQL, Apache2
* Server 2 (10.10.10.2) : Postfix, Apache2
* Server 3 (10.10.10.3) : DNS

首先，这些服务器被定义在了Nagios中。

```
root@nagios:~# vim /etc/nagios3/conf.d/example.cfg

```

---

```
define host{
        use                     generic-host
        host_name               test-server-1
        alias                   test-server-1
        address                 10.10.10.1
        }

define host{
        use                     generic-host
        host_name               test-server-2
        alias                   test-server-2
        address                 10.10.10.2
        }

define host{
        use                     generic-host
        host_name               test-server-3
        alias                   test-server-3
        address                 10.10.10.3
        }

```

### 监控MySQL服务

#### MySQL 监控需要

* 通过检查3306端口来检测MySQL是否运行中。
* 检测特定的数据库'testDB'是否可用。

#### MySQL 服务器设置

开始检测MySQL时，需要记住MySQL默认只监听回环接口127.0.0.1。这增加了数据库的安全。手动调节需要告诉MySQL该监听什么其他接口。下面是该怎么做。

这个设置要在所有的MySQL服务器上完成。

```
root@nagios:~# vim /etc/mysql/my.cnf

```

下面这行被注释掉以监听所有网络接口。

```
#bind-address           = 127.0.0.1

```

同样，MySQL也不会让任意主机来连接它。需要为localhost和“任意”主机创建MySQL用户‘nagios’，接着在所有的数据库中为这个用户授予ALL权限，会这将在会用在监控中。

下面的设置对所有的MySQL服务器都已经设置。

```
root@nagios:~# mysql -u root –p
## MySQL root 密码 ##

```

在MySQL服务器中创建'nagios@localhost'用户。

```
mysql> CREATE USER 'nagios'@'localhost' IDENTIFIED BY 'nagios-pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'nagios'@'localhost';

```

创建'nagios@任意主机'用户。（LCTT 译注：实际上这两个是同一个用户，只是分别授权给localhost和任意主机的访问；因为它们所用的密码的同一个，修改任何一个，另外一个也相应变化。）

```
mysql> CREATE USER 'nagios'@'%' IDENTIFIED BY 'nagios-pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'nagios'@'%';

mysql> FLUSH PRIVILEGES;

```

这使MySQL监听所有的网络接口，同样接受来自用户'nagios'的进入连接。

请注意，这种修改可能有安全隐患，所以需要提示几点：

* 这个设置将会暴露MySQL给所有的接口，包括外网。确保只有合法的网络访问是非常重要的。应该使用防火墙和TCP wrapper等过滤器。
* MySQL用户‘nagios’的密码应该非常强。如果只有几台Nagios服务器，那么应该创建'nagios@服务器名'用户而不是任意用户的'nagios@%'。

#### 对MySQL的Nagios配置

按如下配置来做一些调整。

```
root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg

```

---

```
define service{
use         generic-service
host_name       test-server-1
;hostgroup can be used instead as well

service_description     Check MYSQL via TCP port
check_command           check_tcp!3306
        }

define service{
use             generic-service
host_name           test-server-1
;hostgroup can be used instead as well

service_description Check availability of database 'testDB'
check_command   check_mysql_database!nagios!nagios-pass!testDB
;check_mysql!userName!userPassword!databaseName
        }

```

这样，Nagios就可以同时监控MySQL服务器及其数据库的可用性。

### 监控Apache服务器

Nagios同样也可以监控Apache服务。

#### Apache监控需要

* 监控apache服务是否可用

这个任务非常简单因为Nagios有一个内置命令。

```
root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg

```

---

```
define service{
use         generic-service
host_name       test-server-1, test-server-2
service_description Check Apache Web Server
check_command       check_http
        }

```

现在就非常简单了。

### 监控DNS服务

Nagios通过向DNS服务器查询一个完全限定域名（FQDN），或者使用dig工具来查询。默认用于查询的FQDN的是www.google.com，但是这个可以按需改变。按照下面的文件修改来完成这个任务。

```
root@nagios:~# vim /etc/nagios-plugins/config/dns.cfg

```

---

```
## The -H portion can be modified to replace Google ##
define command{
command_name    check_dns
command_line    /usr/lib/nagios/plugins/check_dns -H www.google.com -s '$HOSTADDRESS$'
}

```

编辑下面的行。

```
root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg

```

---

```
## Nagios asks server-3 to resolve the IP for google.com ##
define service{
use                             generic-service
host_name                       test-server-3
service_description     Check DNS
check_command           check_dns
        }

## Nagios asks server-3 to dig google.com ##
define service{
use                             generic-service
host_name                       test-server-3
service_description     Check DNS via dig
check_command           check_dig!www.google.com
        }

```

### 监控邮件服务器

Nagios可以监控不同的邮件服务组件如SMTP、POP、IMAP和mailq。之前提过，server-2设置了Postfix邮件服务。Nagios将被配置来监控SMTP和邮件队列。

```
root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg

```

---

```
define service{
use                     generic-service
host_name               test-server-2
service_description     Check SMTP
check_command           check_smtp
        }

define service{
use                     generic-service
host_name               test-server-2
service_description     Check Mail Queue
check_command           check_mailq_postfix!50!100
                    ;warning at 50, critical at 100
        }

```

下面的截屏显示了目前配置监控服务的概览。

![](/data/attachment/album/201507/02/163346zzfav21gnfn13pfp.jpg)

### 基于端口自定义监控程序

让我们假设如下定制程序同样运行在网络中，监听着一个特定的端口。

* 测试1号服务器：定制程序（TCP端口 12345）

做一些小的调整，Nagios也可以帮助我们监控这个程序。

```
root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg

```

---

```
define service{
use                     generic-service
host_name               test-server-1
service_description     Check server 1 custom application
check_command           check_tcp!12345
        }

```

在结束之前的提示，Nagios可以监控网络很多其他的方面。存储在/etc/nagios-plugins/config/中的脚本为Nagios提供了很棒的能力。

一些Nagios提供的脚本被仅限于本地服务器，比如，服务器负载、进程并发数量、登录用户数量等。这些检查可以提供Nagios服务器内有用的信息。

希望这篇文章对你有用。

---

via: <http://xmodulo.com/monitor-common-services-nagios.html>

作者：[Sarmed Rahman](http://xmodulo.com/author/sarmed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


使用 SNMP 和 Cacti 监控 Linux 服务器

Summary: SNMP（简单网络管理协议）用于收集设备内部发生的数据，如负载、磁盘状态、带宽之类。像Cacti这样的网络监控工具用这些数据来生成图标以达到监控的目的。 在一个典型的Cacti和SNMP部署中，会有一台或多台启用了SNMP的设备，以及一台独立的用来从那些设备收集SNMP回馈的监控服务器。请记住，所有需要监控的设备必须启用SNMP。在本教程中，出于演示目的，我们将在同一台Linux服务器上配置Cacti和SNMP。 在Debian或Ubuntu上配置SNMP 要在基于Debian的系统上安装SNMP代理（snmpd），请运行以下命令： root@server:~# apt-get install snmpd

SNMP（简单网络管理协议）用于收集设备内部发生的数据，如负载、磁盘状态、带宽之类。像Cacti这样的网络监控工具用这些数据来生成图标以达到监控的目的。

在一个典型的Cacti和SNMP部署中，会有一台或多台启用了SNMP的设备，以及一台独立的用来从那些设备收集SNMP回馈的监控服务器。请记住，所有需要监控的设备必须启用SNMP。在本教程中，出于演示目的，我们将在同一台Linux服务器上配置Cacti和SNMP。

### 在Debian或Ubuntu上配置SNMP

要在基于Debian的系统上安装SNMP代理（snmpd），请运行以下命令：

```
root@server:~# apt-get install snmpd

```

然后，如下编辑配置文件。

```
root@server:~# vim /etc/snmp/snmpd.conf

```

---

```
# 使snmpd 监听再所有接口上
agentAddress  udp:161

# 定义一个只读的 community 'myCommunity' 和源网络
rocommunity myCommunity 172.17.1.0/24

sysLocation    Earth
sysContact     email@domain.tld

```

在编辑完配置文件后，重启snmpd。

```
root@server:~# service snmpd restart

```

### 在CentOS或RHEL上配置SNMP

要安装SNMP工具和库，请运行以下命令。

```
root@server:~# sudo yum install net-snmp

```

然后，如下编辑SNMP配置文件。

```
root@server:~# vim /etc/snmp/snmpd.conf

```

---

```
# 定义一个使用 community 'myCommunity' 和源网络 172.17.1.0/24 的用户 'myUser'
com2sec myUser 172.17.1.0/24 myCommunity

# 将 myUser 加到 'myGroup' 组，定义组权限
group    myGroup    v1        myUser
group    myGroup    v2c        myUser
view all included .1
access myGroup    ""    any    noauth     exact    all    all    none

```

---

```
root@server:~# service snmpd restart
root@server:~# chkconfig snmpd on

```

重启snmpd服务，然后添加到启动服务列表。

### 测试SNMP

SNMP可以通过运行snmpwalk命令进行测试。如果SNMP已经配置成功，该命令会生成大量输出。

```
root@server:~# snmpwalk -c myCommunity 172.17.1.44 -v1

```

---

```
iso.3.6.1.2.1.1.1.0 = STRING: "Linux mrtg 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (2097) 0:00:20.97

~~ 输出截断 ~~

iso.3.6.1.2.1.92.1.1.2.0 = Gauge32: 1440
iso.3.6.1.2.1.92.1.2.1.0 = Counter32: 1
iso.3.6.1.2.1.92.1.2.2.0 = Counter32: 0
iso.3.6.1.2.1.92.1.3.1.1.2.7.100.101.102.97.117.108.116.1 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.92.1.3.1.1.3.7.100.101.102.97.117.108.116.1 = Hex-STRING: 07 DD 0B 12 00 39 27 00 2B 06 00

```

### 配置带有SNMP的Cacti

在本教程中，我们将在同一台Linux服务器上设置Cacti和SNMP。所以，到刚刚配置SNMP的Linux服务器上去[安装Cacti][2]吧。

安装完后，Cacti网页界面可以通过“http://172.17.1.44/cacti ”来访问，当然，在你的环境中，请将IP地址换成你的服务器的地址。

![](/data/attachment/album/201507/02/223738cgd66yd3d3uow8dd.jpg)

![](/data/attachment/album/201507/02/223746c43n25up293nenla.jpg)

安装过程中Cacti的路径一般都是正确的，但是如有必要，请再次检查以下。

![](/data/attachment/album/201507/02/223755dhxx5nuy9dxxfdcr.jpg)

在首次安装过程中，Cacti默认的用户名和密码是“admin”和“admin”。在首次登录后会强制你修改密码。

![](/data/attachment/album/201507/02/223758x58gpowcsmm3mq5g.png)

### 添加设备到Cacti并管理

Cacti将根据先前配置的SNMP字符串注册设备。在本教程中，我们将只添加启用了SNMP的本地服务器。

要添加设备，我们必须以管理员登录，然后转到Cacti管理员面板中的控制台。点击 控制台 > 设备。

![](/data/attachment/album/201507/02/223801e2ac6a6lz6jv5j2c.jpg)

那里可能已经有一个名为‘localhost’的设备。我们不需要它，因为我们要创建全新的图表。我们可以将该设备从列表中删除，使用“添加”按钮来添加新设备。

![](/data/attachment/album/201507/02/223802tbb8b2w9ofbb9o8f.jpg)

接下来，我们设置设备参数。

![](/data/attachment/album/201507/02/223806bbdraz3j6arxa3ud.jpg)

现在设备已经添加，我们来指定想要创建的图表模板。你可以在该页面的最后部分中找到这块内容。

![](/data/attachment/album/201507/02/223807j8b9lxlbwdfu80nd.jpg)

然后，我们继续来创建图表。

![](/data/attachment/album/201507/02/223808umnkm4gc99pz59m9.jpg)

这里，我们创建用于平均负载、RAM和硬盘、处理器的图表。

![](/data/attachment/album/201507/02/223810r0hb8ygf18b7cny1.jpg)

### 接口的图表和64位计数器

默认情况下，Cacti在SNMP查询中使用32位计数器。32位计数器对于大多数带宽图表而言已经足够了，但是对于超过100Mbps的带宽，它就无能为力了。如果已经知道带宽会超过100Mbps，建议你使用64位计数器。使用64位计数器一点也不麻烦。

![](/data/attachment/album/201507/02/223812z3siddeq0i5m060a.jpg)

**注意**： Cacti会花费大约15分钟来产生新图表，除了耐心等待，你别无选择。

### 创建图表树

这些截图展示了如何创建图表树，以及如何添加图表到这些树中。

![](/data/attachment/album/201507/02/223813sgxeact86hhr36x1.jpg)

![](/data/attachment/album/201507/02/223815prqhprbpmzbvhhlr.jpg)

![](/data/attachment/album/201507/02/223816c8rrahh4qgg441ah.jpg)

![](/data/attachment/album/201507/02/223818blh7jsipzmijs0zs.jpg)

我们可以验证图表树中的图表。

![](/data/attachment/album/201507/02/223820nm33m46mi0ymbigz.jpg)

### 用户管理

最后，我们创建一个只具有查看我们刚创建的图表权限的用户。Cacti内建了用户管理系统，而且是高度可定制的。

![](/data/attachment/album/201507/02/223824btyxe5btybyxexaq.jpg)

![](/data/attachment/album/201507/02/223826h8xm0348z29z4n43.jpg)

![](/data/attachment/album/201507/02/223831r1ztvrz2usayb7ry.jpg)

在完成这些步骤后，我们可以使用‘user1’来登录进去，并验证只有该用户可以查看该图表。

![](/data/attachment/album/201507/02/223833wxyojb3njx2wndyz.jpg)

![](/data/attachment/album/201507/02/223834n8q3ra2jq2qjj8nj.jpg)

至此，我们在网络监控系统中部署了一台Cacti服务器。Cacti服务器比较稳定，可以处理大量图表而不会出问题。

希望本文对你有所帮助。

---

via: <http://xmodulo.com/monitor-linux-servers-snmp-cacti.html>

作者：[Sarmed Rahman](http://xmodulo.com/author/sarmed) 译者：[GOLinux](https://github.com/GOLinux) 校对：[wxy](https://github.com/wxy)

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


如何在 Cacti 中合并两幅图片

Summary: Cacti 是一个很棒的开源网络监视系统，它广泛使用于图形化地展示网络元素，例如带宽、存储、处理器和内存使用。使用它的基于Web 的界面，你可以轻松地创建和组织各种图表。然而，它默认并没有提供一些高级功能，例如合并图片、使用多个来源创建聚合图形、迁移 Cacti 到另一台服务器。使用 Cacti 的这些功能你还需要一些经验。在该教程中，我们会看到如何在将两幅 Cacti 图片合并为一幅。 看看这个例子。在过去的 6 个月中，客户端 A 连接到了交换机 A 的端口 5。端口 5 发生了错误，因此客户端迁移到了端口 6。由于 Cacti 为每个接口/元素

[Cacti](/article-5746-1.html) 是一个很棒的开源网络监视系统，它广泛使用于图形化地展示网络元素，例如带宽、存储、处理器和内存使用。使用它的基于Web 的界面，你可以轻松地创建和组织各种图表。然而，它默认并没有提供一些高级功能，例如合并图片、使用多个来源创建聚合图形、迁移 Cacti 到另一台服务器。使用 Cacti 的这些功能你还需要一些经验。在该教程中，我们会看到如何在将两幅 Cacti 图片合并为一幅。

看看这个例子。在过去的 6 个月中，客户端 A 连接到了交换机 A 的端口 5。端口 5 发生了错误，因此客户端迁移到了端口 6。由于 Cacti 为每个接口/元素使用不同的图，客户端的带宽历史会分成端口 5 和端口 6。结果是对于一个客户端我们有两幅图片 - 一幅是 6 个月的旧数据，另一幅保存了后续的数据。

在这种情况下，我们实际上可以合并两幅图片将旧数据加到新的图中，使得用一个单独的图为一个用户保存历史的和新数据。本教程将会解释如何做到这一点。

Cacti 将每幅图片的数据保存在它自己的 RRD（round robin database，循环数据库）文件中。当请求一幅图片时，根据保存在对应 RRD 文件中的值生成图。在 Ubuntu/Debian 系统中，RRD 文件保存在 `/var/lib/cacti/rra`，在 CentOS/RHEL 系统中则是 `/var/www/cacti/rra`。

合并图片背后的思想是更改这些 RRD 文件使得旧 RRD 文件中的值能追加到新的 RRD 文件中。

### 情景

一个客户端的服务在 eth0 上运行了超过一年。由于硬件损坏，客户端迁移到了另一台服务器的 eth1 接口。我们想展示新接口的带宽，同时保留超过一年的历史数据。该客户端希望只在一幅图中显示。

### 确定图的 RRD 文件

图合并的首个步骤是确定与图相关联的 RRD 文件。我们可以通过以调试模式打开图检查文件。要做到这点，在 Cacti 的菜单中： 控制台 > 管理图 > 选择图 > 打开图调试模式。

#### 旧图：

![](/data/attachment/album/201507/02/225211y2nx3n5l82hhnjdv.jpg)

#### 新图：

![](/data/attachment/album/201507/02/225213yo3j47w323o04jww.jpg)

从样例输出（基于 Debian 系统）中，我们可以确定两幅图片的 RRD 文件：

* **旧图**： /var/lib/cacti/rra/old\_graph\_traffic\_in\_8.rrd
* **新图**： /var/lib/cacti/rra/new\_graph\_traffic\_in\_10.rrd

### 准备脚本

我们会用一个 [RRD 剪接脚本](http://svn.cacti.net/viewvc/developers/thewitness/rrdsplice/rrdsplice.php) 来合并两个 RRD 文件。下载该 PHP 脚本，并安装到 /var/lib/cacti/rra/rrdsplice.php (Debian/Ubuntu 系统) 或 /var/www/cacti/rra/rrdsplice.php (CentOS/RHEL 系统)。

下一步，确认 Apache 用户拥有该文件。

在 Debian 或 Ubuntu 系统中，运行下面的命令：

```
# chown www-data:www-data rrdsplice.php

```

并更新 rrdsplice.php。查找下面的行：

```
chown($finrrd, "apache");

```

用下面的语句替换：

```
chown($finrrd, "www-data");

```

在 CentOS 或 RHEL 系统中，运行下面的命令即可：

```
# chown apache:apache rrdsplice.php

```

### 合并两幅图

通过不带任何参数运行该脚本可以获得脚本的使用语法。

```
# cd /path/to/rrdsplice.php
# php rrdsplice.php

```

---

```
USAGE: rrdsplice.php --oldrrd=file --newrrd=file --finrrd=file

```

现在我们准备好合并两个 RRD 文件了。只需要指定旧 RRD 文件和新 RRD 文件的名称。我们会将合并后的结果重写到新 RRD 文件中。

```
# php rrdsplice.php --oldrrd=old_graph_traffic_in_8.rrd --newrrd=new_graph_traffic_in_10.rrd --finrrd=new_graph_traffic_in_10.rrd

```

现在旧 RRD 文件中的数据已经追加到了新 RRD 文件中。Cacti 会将任何新数据写到新 RRD 文件中。如果我们点击图，我们可以发现也已经添加了旧图的周、月、年记录。下面图表中的第二幅图显示了旧图的周记录。

![](/data/attachment/album/201507/02/225220n727g2h7f7d2nnyf.jpg)

总之，该教程显示了如何简单地将两幅 Cacti 图片合并为一幅。当服务迁移到另一个设备/接口，我们希望只处理一幅图片而不是两幅时，这个小技巧非常有用。该脚本非常方便，因为它可以不管源设备是不是相同都可以合并图片，例如 Cisco 1800 路由器和 Cisco 2960 交换机。

希望这些能对你有所帮助。

---

via: <http://xmodulo.com/combine-two-graphs-cacti.html>

作者：[Sarmed Rahman](http://xmodulo.com/author/sarmed) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

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


Linux 服务器安全技巧

Summary: 毋庸置疑，对于系统管理员，提高服务器的安全性是最重要的事情之一。因此，也就有了许多针对这个话题而生的文章、博客和论坛帖子。 一台服务器由大量功能各异的部件组成，这一点使得很难根据每个人的需求去提供定制的解决方案。这篇文章尽可能涵盖一些有所裨益的小技巧来帮助管理员保证服务器和用户安全。 有一些常识是每个系统管理员都应该烂熟于心的，所以下面的几点在本文将不会提及：  务必保证系统是最新的 经常更换密码 - 使用数字、字母和非字母的符号组合 给予用户最小的权限，满足他们日常使用所需即可 只安装那些真正需要的软件

SCF(Config Server Firewall) 此处简写出错。

毋庸置疑，对于系统管理员，提高服务器的安全性是最重要的事情之一。因此，也就有了许多针对这个话题而生的文章、博客和论坛帖子。

一台服务器由大量功能各异的部件组成，这一点使得很难根据每个人的需求去提供定制的解决方案。这篇文章尽可能涵盖一些有所裨益的小技巧来帮助管理员保证服务器和用户安全。

有一些常识是每个系统管理员都应该烂熟于心的，所以下面的几点在本文将不会提及：

* 务必保证系统是**最新的**
* 经常更换密码 - 使用数字、字母和非字母的符号组合
* 给予用户**最小**的权限，满足他们日常使用所需即可
* 只安装那些真正需要的软件包

![](/data/attachment/album/201507/03/100435cuo93k1715ekhvxo.jpg)

下面是一些更有意思的内容：

### 更改SSH默认端口

在搭建好一台全新的服务器后要做的第一件事情就是更改SSH的默认端口。这个小小的改动能够使你的服务器避免受到成千上万的暴力攻击（LCTT 译注：不更改默认端口相当于黑客们知道你家的门牌号，这样他们只需要一把一把的试钥匙就可能打开你家的锁）。

要更改默认的SSH端口，先打开sshd\_config文件：

```
sudo vim /etc/ssh/sshd_config

```

找到下面这行：

```
#Port 22

```

“#”号表示这行是注释。首先删除#号，然后把端口号改成目的端口。端口号不能超过65535，确保要指定的端口号没有被系统或其它服务占用。建议在[维基百科]上查看常用端口号列表。在本文中，使用这个端口号：

```
Port 16543

```

然后保存并关闭文件。

接下来的一步是：

### 使用SSH密钥认证

在通过SSH访问服务器时，使用SSH密钥进行认证是尤其重要的。这样做为服务器增加了额外的保护，确保只有那些拥有密钥的人才能访问服务器。

在本地机器上运行下面命令以生成SSH密钥：

```
ssh-keygen -t rsa

```

你会看到下面的输出，询问要将密钥写到哪一个文件里，并且设置一个密码：

```
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): my_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in my_key.
Your public key has been saved in my_key.pub.
The key fingerprint is:
SHA256:MqD/pzzTRsCjZb6mpfjyrr5v1pJLBcgprR5tjNoI20A

```

完成之后，就得到两个文件：

my\_key

my\_key.pub

接下来把my\_key.pub拷贝到~/.ssh/authorized\_key中

```
cp my_key.pub ~/.ssh/authorized_keys

```

然后使用下面命令将密钥上传到服务器：

```
scp -P16543 authorized_keys user@yourserver-ip:/home/user/.ssh/

```

至此，你就可以从这台本地机器上无密码地访问服务器了。

### 关闭SSH的密码认证

既然已经有了SSH密钥，那么关闭SSH的密码认证就会更安全了。再次打开并编辑sshd\_config，按如下设置：

```
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

```

### 关闭Root登录

下面关键的一步是关闭root用户的直接访问，而使用sudo或su来执行管理员任务。首先需要添加一个有root权限的新用户，所以编辑这个路径下的sudoers文件：

```
/etc/sudoers/

```

推荐使用如**visudo**这样的命令编辑该文件，因为它会在关闭文件之前检查任何可能出现的语法错误。当你在编辑文件时出错了，这就很有用了。

接下来赋予某个用户root权限。在本文中，使用用户**sysadmin**。确保在编辑后这个文件时使用的用户是系统已有的用户。找到下面这行：

```
root ALL=(ALL) ALL

```

拷贝这行，然后粘贴在下一行，然后把root更改为“sysadmin”，如下所示：

```
root ALL=(ALL) ALL
sysadmin ALL=(ALL) ALL

```

现在解释一下这行的每一个选项的含义：

```
(1) root  (2)ALL=(3)(ALL) (4)ALL

```

(1) 指定用户

(2) 指定用户使用sudo的终端

(3) 指定用户可以担任的用户角色

(4) 这个用户可以使用的命令

（LCTT 译注：所以上面的配置是意思是：root 用户可以在任何终端担任任何用户，执行任何命令。）

使用这个配置可以给用户访问一些系统工具的权限。

这时，可以放心保存文件了。

为了关闭通过SSH直接访问root，需要再次打开**sshd\_config**，找到下面这行：

```
#PermitRootLogin yes

```

更改为：

```
PermitRootLogin no

```

然后保存文件，重启sshd守护进程使改动生效。执行下面命令即可：

```
sudo /etc/init.d/sshd restart

```

### 设置防火墙

防火墙有助于过滤出入端口和阻止使用暴力法的登录尝试。我倾向于使用SCF(Config Server Firewall)这个强力防火墙。它使用了iptables，易于管理，而且对于不擅于输入命令的用户提供了web界面。

要安装CSF，先登录到服务器，切换到这个目录下：

```
cd /usr/local/src/

```

然后以root权限执行下面命令：

```
wget https://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh

```

只需等待安装程序完成，然后编辑CSF的配置文件：

```
/etc/csf/csf.conf

```

默认情况下CSF是以测试模式运行。通过将“TESTING”的值设置成0，切换到product模式。

```
TESTING = "0"

```

下面要设置的就是服务器上允许通过的端口。在csf.conf中定位到下面的部分，根据需要修改端口：

```
# 允许入站的 TCP 端口
TCP_IN = "20,21,25,53,80,110,143,443,465,587,993,995,16543"
# 允许出站的 TCP 端口
TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,16543"
# 允许入站的 UDP 端口
UDP_IN = "20,21,53"
# 允许出站的 UDP 端口
# 要允许发出 traceroute 请求，请加 33434:33523 端口范围到该列表
UDP_OUT = "20,21,53,113,123"

```

请根据需要逐一设置，推荐只使用那些需要的端口，避免设置对端口进行大范围设置。此外，也要避免使用不安全服务的不安全端口。比如只允许端口465和587来发送电子邮件，取代默认的SMTP端口25。（LCTT 译注：前提是你的邮件服务器支持 SMTPS）

**重要**：千万不要忘记允许自定义的 ssh 端口。

允许你的IP地址通过防火墙，而绝不被屏蔽，这一点很重要。IP地址定义在下面的文件中：

```
/etc/csf/csf.ignore

```

被屏蔽了的IP地址会出现在这个文件中：

```
/etc/csf/csf.deny

```

一旦完成更改，使用这个命令重启csf：

```
sudo /etc/init.d/csf restart

```

下面是在某台服务器上的csf.deny文件的部分内容，来说明CSF是很有用的：

```
211.216.48.205 # lfd: (sshd) Failed SSH login from 211.216.48.205 (KR/Korea, Republic of/-): 5 in the last 3600 secs - Fri Mar 6 00:30:35 2015
103.41.124.53 # lfd: (sshd) Failed SSH login from 103.41.124.53 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:06:46 2015
103.41.124.42 # lfd: (sshd) Failed SSH login from 103.41.124.42 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:59:04 2015
103.41.124.26 # lfd: (sshd) Failed SSH login from 103.41.124.26 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 02:48:26 2015
109.169.74.58 # lfd: (sshd) Failed SSH login from 109.169.74.58 (GB/United Kingdom/mail2.algeos.com): 5 in the last 3600 secs - Fri Mar 6 03:49:03 2015

```

可以看到，尝试通过暴力法登录的IP地址都被屏蔽了，真是眼不见心不烦啊！

### 锁住账户

如果某个账户在很长一段时间内都不会被使用了，那么可以将其锁住以防止其它人访问。使用如下命令：

```
passwd -l accountName

```

当然，这个账户依然可以被root用户使用（LCTT 译注：可用 su 切换为该账号）。

### 了解服务器上的服务

服务器的本质是为各种服务提供访问功能。使服务器只运行所需的服务，关闭没有使用的服务。这样做不仅会释放一些系统资源，而且也会使服务器变得更加安全。比如，如果只是运行一个简单的服务器，显然不需要X显示或者桌面环境。如果不需要Windows网络共享功能，则可以放心关闭Samba。

使用下面的命令能查看伴随系统启动而启动的服务：

```
chkconfig --list | grep "3:on"

```

如果系统运行了**systemd**，执行这条命令：

```
systemctl list-unit-files --type=service | grep enabled

```

然后使用下面的命令关闭服务：

```
chkconfig service off
或
systemctl disable service

```

在上面的例子中，把“service”替换成真正想要停止的服务名称。实例如下：

```
chkconfig httpd off
或
systemctl disable httpd

```

### 小结

这篇文章的目的是涵盖一些通用的安全步骤以便帮助你保护服务器。你可以采取更多方式去增强对服务器的保护。请记住保证服务器安全是你的责任，在维护服务器安全时尽量做出明智的选择，尽管并没有什么容易的方式去完成这件事情，而建立“完善的”安全需要花费大量的时间和测试直到达到想要的结果。

---

via: <http://www.linuxveda.com/2015/06/03/secure-linux-server/>

作者：[Marin Todorow](http://www.linuxveda.com/author/marin_todorov/) 译者：[KayGuoWhu](https://github.com/KayGuoWhu) 校对：[wxy](https://github.com/wxy)

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


Linux 命令行中的幽默

Summary: 图形桌面总是很养眼的，它增强了可视化体验，有时也能够提升了某些软件的功能，让软件变得更有趣。但是，在命令行下工作也不需要总是很古板，如果您想在命令行下寻找些乐趣，那么有很多命令给您带来趣味。 Linux是个有趣的操作系统。它提供大量的小型开源工具，从平淡无奇的软件到稀奇古怪的应用。正是这些工具的功能和琳琅满目的选择帮助Linux脱颖而出。让我们一起来看看下面这七个小工具吧。 七彩虹：lolcat  lolcat是一个用于将文件或标准输入连接到标准输出（类似常见的cat）的程序，但是它会为输出添加七彩的颜色。 lolcat通常和其他

挺好玩的

图形桌面总是很养眼的，它增强了可视化体验，有时也能够提升了某些软件的功能，让软件变得更有趣。但是，在命令行下工作也不需要总是很古板，如果您想在命令行下寻找些乐趣，那么有很多命令给您带来趣味。

Linux是个有趣的操作系统。它提供大量的小型开源工具，从平淡无奇的软件到稀奇古怪的应用。正是这些工具的功能和琳琅满目的选择帮助Linux脱颖而出。让我们一起来看看下面这七个小工具吧。

### 七彩虹：lolcat

![lolcat](/data/attachment/album/201507/05/215537feqbs18kmkwwcwme.png)

lolcat是一个用于将文件或标准输入连接到标准输出（类似常见的cat）的程序，但是它会为输出添加七彩的颜色。

lolcat通常和其他诸如toilet或figlet等生成文本的应用结合使用。这个软件不应被误认为是一个或多个猫的图像的宏。

lolcat由Moe编写。

网址: [github.com](https://github.com/busyloop/lolcat)

### 牛郎的牛：cowsay

![cowsay](/data/attachment/album/201507/05/215539bkt1xdhw9wrotxd0.png)

cowsay是一个可配置的开源软件，它用ASCII码生成奶牛的图片，并可以在对话气泡中显示消息。cowsay是用Perl写的。

cowsay并不仅仅只能显示奶牛。它能生成预先制作的图片或者其他动物，包括鸭子、考拉、麋鹿、小马、绵羊、剑龙和火鸡，以及奶酪、雪人和骷髅。

有一个叫cowthink的应用，与对话的气泡不同，它能在生成奶牛的同时生成思考的气泡。

功能包括：

* 让脚本变得更有趣
* Borg模式
* 可以更改奶牛看起来的样子，比如让奶牛看起来贪婪、偏执、固执、疲倦、古怪、年轻等
* 图形版变体：xcowsay

网址: [nog.net](https://web.archive.org/web/20120225123719/http://www.nog.net/%7Etony/warez/cowsay.shtml)

### 傻狗：doge

![doge](/data/attachment/album/201507/05/215540zi66krgjj699f966.png)

doge是一个简单的每日信息脚本，它基于有些愚蠢但很有趣的doge的梗。它随机的打印一些在语法上有误的句子，有时这些句子基于您电脑中的东西。

doge是一个在2013年非常流行的互联网潮流元素（梗）。这个梗通常由一幅日本柴犬的图片和彩色的文字组成。这些文字故意用一种蹩脚的语气写成了一些互联网的独白。

* 随机的用不同的颜色和蹩脚的英语写下随机的句子
* 终端中的柴犬效果非常棒
* 可以获得系统数据，比如主机名、运行中的程序、当前用户、$EDITOR
* 如果您安装了lolcat，您可以用它作为点缀: `while true; do doge | lolcat -a -d 100 -s 100 -p 1; done`
* 支持标准输入: `ls /usr/bin | doge` 将显示一些 /usr/bin下的可执行文件。哇噢，还有许多命令行的开关可以过滤词语以及控制词语的频率。

网址: [github.com/thiderman/doge](https://github.com/thiderman/doge)

### 水族箱：ASCIIQuarium

![Asciiquarium](/data/attachment/album/201507/05/215544ggbqlxo95ggmo9jo.png)

ASCIIQuarium是一个以ASCII码方式画出的水族馆/海洋动画。享受生活在您电脑中水底的奇妙生物吧。

想运行ASCIIQuarium，您需要安装Perl的curses包以及Term::Animation模块。请使用`sudo apt-get install libcurses-perl`来安装前者，使用sudo cpan Term::Animation来安装后者。两个命令都需要在终端中运行。

功能包括：

* 五彩的鱼儿
* 有趣的动画，包括钓鱼钩
* 还有许多的天鹅、鸭子、海豚和船只

网址: [www.robobunny.com](http://www.robobunny.com/projects/asciiquarium/html/)

### 蒸汽机车：sl

![sl](/data/attachment/album/201507/05/215546t5w94nns5pu41p1z.png)

sl是一个有趣的终端应用，它为那些意外的错将ls输成sl的用户显示一个动画。

我打字通常非常草率，更喜欢速度而不是准确性。但错别字在命令行中是非常危险的。因此sl扮演了一个提醒者，提醒我们注意错误输入的这种坏习惯。它总是会让人咯咯的笑。

功能包括：

* 使用 -F, 火车在飞翔
* 使用 -l, 显示一个小型的火车
* 使用 -a, 看上去发生了意外

网址: [github.com/mtoyoda/sl](https://github.com/mtoyoda/sl)

### 火焰：aafire

![aafire](/data/attachment/album/201507/05/215549aaapin55fpipzief.png)

aafire在终端中显示燃烧的ASCII火焰。它展示了aalib库的强大能力，一个ascii艺术库显示出来。

网址: [aa-project.sourceforge.net/aalib](http://aa-project.sourceforge.net/aalib/)

### 矩阵：CMatrix

![CMatrix](/data/attachment/album/201507/05/215556che7k8mz1gkmgts1.png)

CMatrix是一个基于ncurses的程序，它模拟《黑客帝国》（一部电影）中的画面。如果您在一个山洞里度过了上个15年，那么您可能不知道这部1999年的美国科幻电影，主角为 Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss, Hugo Weaving和 Joe Pantoliano。

它可以在终端设置为132x300的情况下工作，并且可以以同样的速率进行滚动或者以用户定义的速度进行异步的滚动。

功能包括：

* 修改文本颜色
* 使用粗体字符
* 异步滚动
* 使用老式的滚动效果
* 屏幕保护程序模式

网址: [www.asty.org/cmatrix](http://www.asty.org/cmatrix/)

---

via: <http://www.linuxlinks.com/article/20150614112018846/Humor.html>

译者：[wwy-hust](https://github.com/wwy-hust) 校对：[Caroline](https://github.com/carolinewuyan)

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


如何用Perl访问SQLite数据库

Summary: SQLite是一个零配置、无服务端、基于文件的事务型数据库系统。由于它的轻量级，自包含和紧凑的设计，所以当你想要集成数据库到你的程序中时，SQLite是一个非常不错的选择。在这篇文章中，我会展示如何用Perl脚本来创建和访问SQLite数据库。我演示的Perl代码片段是完整的，所以你可以很简单地修改并集成到你的项目中。  访问SQLite的准备 我会使用SQLite DBI Perl驱动来连接到SQLite3。因此你需要在Linux中安装它（和SQLite3一起）。 Debian、 Ubuntu 或者 Linux Mint $ sudo apt-get install sqlite3 libdbd-sqlite3-perl  CentOS、 Fedor

SQLite是一个零配置、无服务端、基于文件的事务型数据库系统。由于它的轻量级，自包含和紧凑的设计，所以当你想要集成数据库到你的程序中时，SQLite是一个非常不错的选择。在这篇文章中，我会展示如何用Perl脚本来创建和访问SQLite数据库。我演示的Perl代码片段是完整的，所以你可以很简单地修改并集成到你的项目中。

![](/data/attachment/album/201507/05/220606jrfr4gjrrmrz1cjr.jpg)

### 访问SQLite的准备

我会使用SQLite DBI Perl驱动来连接到SQLite3。因此你需要在Linux中安装它（和SQLite3一起）。

**Debian、 Ubuntu 或者 Linux Mint**

```
$ sudo apt-get install sqlite3 libdbd-sqlite3-perl

```

**CentOS、 Fedora 或者 RHEL**

```
$ sudo yum install sqlite perl-DBD-SQLite

```

安装后，你可以检查SQLite驱动可以通过下面的脚本访问到。

```
#!/usr/bin/perl

my @drv = DBI->available_drivers();
print join("\n", @drv), "\n";

```

如果你运行脚本，你应该会看见下面的输出。

```
DBM
ExampleP
File
Gofer
Proxy
SQLite
Sponge

```

### Perl SQLite 访问示例

下面就是Perl访问SQLite的示例。这个Perl脚本会演示下面这些SQLite数据库的常规管理。

* 创建和连接SQLite数据库
* 在SQLite数据库中创建新表
* 在表中插入行
* 在表中搜索和迭代行
* 在表中更新行
* 在表中删除行

```
use DBI;
use strict;

# 定义数据库名称和驱动
my $driver   = "SQLite";
my $db_name = "xmodulo.db";
my $dbd = "DBI:$driver:dbname=$db_name";

# sqlite 没有用户名密码的概念
my $username = "";
my $password = "";

# 创建并连接到数据库
# 以下创建的文件名为 xmodulo.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 })
                      or die $DBI::errstr;
print STDERR "Database opened successfully\n";

# 创建表
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
             (ID INTEGER PRIMARY KEY     AUTOINCREMENT,
              HOSTNAME       TEXT    NOT NULL,
              IPADDRESS      INT     NOT NULL,
              OS             CHAR(50),
              CPULOAD        REAL););
my $ret = $dbh->do($stmt);
if($ret < 0) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "Table created successfully\n";
}

# 插入三行到表中
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('xmodulo', 16843009, 'Ubuntu 14.10', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('bert', 16843010, 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('puppy', 16843011, 'Ubuntu 14.10', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

# 在表中检索行
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);
my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;

if($ret < 0) {
   print STDERR $DBI::errstr;
}
while(my @row = $obj->fetchrow_array()) {
      print "ID: ". $row[0] . "\n";
      print "HOSTNAME: ". $row[1] ."\n";
      print "OS: ". $row[2] ."\n";
      print "CPULOAD: ". $row[3] ."\n\n";
}

# 更新表中的某行
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='Ubuntu 14.10';);
$ret = $dbh->do($stmt) or die $DBI::errstr;

if( $ret < 0 ) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "A total of $ret rows updated\n";
}

# 从表中删除某行
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;

if($ret < 0) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "A total of $ret rows deleted\n";
}

# 断开数据库连接
$dbh->disconnect();
print STDERR "Exit the database\n";

```

上面的Perl脚本运行成功后会创建一个叫“xmodulo.db”的数据库文件，并会有下面的输出。

```
Database opened successfully
Table created successfully
ID: 1
HOSTNAME: xmodulo
OS: Ubuntu 14.10
CPULOAD: 0

ID: 2
HOSTNAME: bert
OS: CentOS 7
CPULOAD: 0

ID: 3
HOSTNAME: puppy
OS: Ubuntu 14.10
CPULOAD: 0

A total of 2 rows updated
A total of 1 rows deleted
Exit the database

```

### 错误定位

如果你尝试没有安装SQLite DBI驱动的情况下使用Perl访问SQLite的话，你会遇到下面的错误。你必须按开始说的安装DBI驱动。

```
Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./script.pl line 3.
BEGIN failed--compilation aborted at ./script.pl line 3.

```

---

via: <http://xmodulo.com/access-sqlite-database-perl.html>

作者：[Dan Nanni](http://xmodulo.com/author/nanni) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


watch：定期重复Linux / Unix命令

Summary: 服务器管理员需要维护系统并保持更新和安全。每天需要运行大量的指令。有些系统进程会记录日志。这些日志不断更新。为了检查这些更新，需要重复地执行命令。比如，为了读取一个日志文件需要使用head、tail、cat等命令。这些命令需要重复地执行。而watch命令可以用于定期地执行一个命令。  Watch 命令 watch是一个简单的命令，只有几个选项。watch命令的基本语法是： watch   ]     command  watch命令默认每隔2秒执行后面参数给出的命令。这个时间根据的是命令执行结束到上次执行的间隔来算的。比如，watch命令可以用于监测日志更新，更新

不错

服务器管理员需要维护系统并保持更新和安全。每天需要运行大量的指令。有些系统进程会记录日志。这些日志不断更新。为了检查这些更新，需要重复地执行命令。比如，为了读取一个日志文件需要使用head、tail、cat等命令。这些命令需要重复地执行。而watch命令可以用于定期地执行一个命令。

![](/data/attachment/album/201507/05/222526uus5925dpb555xyr.jpg)

### Watch 命令

watch是一个简单的命令，只有几个选项。watch命令的基本语法是：

```
watch [-dhvt] [-n <seconds>] [--differences[=cumulative]] [--help] [--interval=<seconds>] [--no-title] [--version] <command>

```

watch命令默认每隔2秒执行后面参数给出的命令。这个时间根据的是命令执行结束到上次执行的间隔来算的。比如，watch命令可以用于监测日志更新，更新是在文件的后面追加新的内容，因此可以用tail命令来检测文件的更新（LCTT 译注：可以直接使用 `tail -f` 主动跟踪某个文件的更新，而不用使用 watch。）。这个命令会持续地运行直到你按下 `CTRL + C`回到提示符。

### 例子

每两秒监测 errors/notices/warning 生成的情况。

```
watch tail /var/log/messages

```

![tail messages](/data/attachment/album/201507/05/222531dlij1jff48rrcasa.png)

按指定的时间间隔监测磁盘的使用率。

```
watch df -h

```

![df -h](/data/attachment/album/201507/05/222532en4m39mm3j029pgp.png)

对磁盘管理员而言，关注高I/O等待导致的磁盘操作尤其是mysql事务是很重要的。

```
watch mysqladmin processlist

```

![processlist](/data/attachment/album/201507/05/222532q2ipcghizkhejbe2.png)

监测服务器负载和运行时间。

```
watch uptime

```

![uptime](/data/attachment/album/201507/05/222533anujurflz34xljtx.png)

监测exim给用户发送通知的队列大小。

```
watch exim -bpc

```

![exim -bpc](/data/attachment/album/201507/05/222533qqzhh2xjaxzx753i.png)

### 1) 指定延迟

```
watch [-n <seconds>] <command>

```

命令默认运行的时间间隔可用-n改变，下面的命令会在5秒后运行后面的命令：

```
watch -n 5 date

```

![date 5 seconds](/data/attachment/album/201507/05/222534wdn75q76050b27qc.png)

### 2) 连续输出比较

如果你使用-d选项，它会累次地高亮第一次和下一次命令之间输出的差别。

```
watch [-d or --differences[=cumulative]] <command>

```

例子 1，用下面的命令连续地输出时间并观察高亮出来的不同部分。

```
watch -n 15 -d date

```

第一次执行date的输出会被记录，15秒后会重复运行命令。

![Difference A](/data/attachment/album/201507/05/222534eq5gi5lzleel4iel.png)

在下一次执行时，可以看到输出除了被高亮的秒数从14到29之外其他的都一样。

![Difference A](/data/attachment/album/201507/05/222534x29d7mm2kcqypkwe.png)

例子 2，让我们来体验一下两个连续的“uptime”命令输出的不同。

```
watch -n 20 -d uptime

```

![uptime](/data/attachment/album/201507/05/222533anujurflz34xljtx.png)

现在列出了时间和3个负载快照之间的不同。

![10b](/data/attachment/album/201507/05/222535gttvhlaffogk3kkz.png)

### 3) 不带标题输出

如果你不希望显示更多关于延迟和实际命令的信息可以使用-t选项。

```
watch [-t | --no-title] <command>

```

让我们看下下面例子命令的输出：

```
watch -t date

```

![watch without title](/data/attachment/album/201507/05/222535fvv68ffrsvn8bc3y.png)

### Watch 帮助

可以在ssh中输入下面的命令来得到watch的简要帮助。

```
watch -h [--help]

```

![watch help](/data/attachment/album/201507/05/222536ud631kovem9mkd1d.png)

### Watch 版本

在ssh终端中运行下面的命令来检查watch的版本。

```
watch -v [--version]

```

![version](/data/attachment/album/201507/05/222536zp1uocco1mabxaec.png)

**不足**

不幸的是，在终端大小调整时，屏幕不能在下次运行前重画。所有用--difference高亮的内容也会在更新时丢失。

### 总结

watch对系统管理员而言是一个非常强大的工具，因为它可以用于监控、日志、运维、性能和系统运行时的吞吐量。人们可以非常简单地格式化和推延watch的输出。任何Linux命令/程序或脚本可以按照所需监测和连续输出。

---

via: <http://linoxide.com/linux-command/linux-watch-command/>

作者：[Aun Raza](http://linoxide.com/author/arunrz/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在Ubuntu下安装Node.JS的不同方式

Summary: 如果你要在Ubuntu 15.04上安装Node.js的话，这篇教程对你来说肯定很重要。Node.js从本质上来说就是一个运行在服务端上的封装好了输入输出流的javascript程序。Node.js巧妙的使用单线程的事件循环来处理高吞吐量和非阻塞IO。同时它也是一个提供了通过操作系统读写文件和网络操作功能的平台层。所以这篇文章将展示在Ubuntu 15.04 server上不同的安装Node.Js的方式。  安装Node.JS 的方法 有许多安装Node.JS的不同的方法，我们可以选择其一。通过本篇文章我们将手把手带着你在Ubuntu 15.04上安装Node.Js，在此之前请卸载旧版本的包以免发生包

如果你要在Ubuntu 15.04上安装Node.js的话，这篇教程对你来说肯定很重要。Node.js从本质上来说就是一个运行在服务端上的封装好了输入输出流的javascript程序。Node.js巧妙的使用单线程的事件循环来处理高吞吐量和非阻塞IO。同时它也是一个提供了通过操作系统读写文件和网络操作功能的平台层。所以这篇文章将展示在Ubuntu 15.04 server上不同的安装Node.Js的方式。

![](/data/attachment/album/201507/05/233616rf2861f2qqkr1qli.jpg)

### 安装Node.JS 的方法

有许多安装Node.JS的不同的方法，我们可以选择其一。通过本篇文章我们将手把手带着你在Ubuntu 15.04上安装Node.Js，在此之前请卸载旧版本的包以免发生包冲突。

* 从源代码安装Node.JS
* 用包管理器安装Node.JS
* 从Github远程库安装Node.JS
* 用NVM安装Node.JS

### 1) 从源代码安装Node.JS

让我们开始从源代码安装Node.JS之前，请确认系统上的所有的依赖包都已经更新到最新版本。然后跟着以下步骤来开始安装：

#### 步骤1: 升级系统

用以下命令来升级系统，并且安装一些Node.JS必要的包。

```
root@ubuntu-15:~# apt-get update
root@ubuntu-15:~# apt-get install python gcc make g++

```

#### 步骤2: 获取Node.JS的源代码

安装好依赖包之后我们可以从官方网站上下载Node.JS的源代码。下载以及解压的命令如下：

```
root@ubuntu-15:~# wget http://nodejs.org/dist/v0.12.4/node-v0.12.4.tar.gz
root@ubuntu-15:~# tar zxvf node-v0.12.4.tar.gz

```

#### 步骤3: 开始安装

现在我们进入源代码的目录，然后运行.configure文件

![NodeJS Configure](/data/attachment/album/201507/05/233620ojdeix8wriooehmi.png)

```
root@ubuntu-15:~# ls
node-v0.12.4 node-v0.12.4.tar.gz
root@ubuntu-15:~# cd node-v0.12.4/
root@ubuntu-15:~/node-v0.12.4# ./configure
root@ubuntu-15:~/node-v0.12.4# make install

```

#### 安装后测试

只要运行一下上面的命令就顺利安装好了Node.JS，现在我们来确认一下版本信息和测试以下Node.JS是否可以运行输出。

```
root@ubuntu-15:~/node-v0.12.4# node -v
v0.12.4

```

![Node.Js Test](/data/attachment/album/201507/05/233621qty6vzv3ufhttmjf.png)

创建一个以.js为扩展名的文件然后用Node的命令运行

```
root@ubuntu-15:~/node-v0.12.4# touch helo_test.js
root@ubuntu-15:~/node-v0.12.4# vim helo_test.js
console.log('Hello World');

```

现在我们用Node的命令运行文件

```
root@ubuntu-15:~/node-v0.12.4# node helo_test.js
Hello World

```

输出的结果证明我们已经成功的在Ubuntu 15.04安装好了Node.JS，同时我们也能运行JavaScript文件。

### 2) 利用包管理器安装Node.JS

在Ubuntu下用包管理器安装Node.JS是非常简单的，只要增加NodeSource的个人软件包档案（PPA）即可。

我们将下面通过PPA安装Node.JS。

#### 步骤1: 用curl获取源代码

在我们用curl获取源代码之前，我们必须先升级操作系统，然后用curl命令获取NodeSource添加到本地仓库。

```
root@ubuntu-15:~#apt-get update
root@ubuntu-15:~# curl -sL https://deb.nodesource.com/setup | sudo bash -

```

curl将运行以下任务

```
## Installing the NodeSource Node.js 0.10 repo...
## Populating apt-get cache...
## Confirming "vivid" is supported...
## Adding the NodeSource signing key to your keyring...
## Creating apt sources list file for the NodeSource Node.js 0.10 repo...
## Running `apt-get update` for you...
Fetched 6,411 B in 5s (1,077 B/s)
Reading package lists... Done
## Run `apt-get install nodejs` (as root) to install Node.js 0.10 and npm

```

#### 步骤2: 安装NodeJS和NPM

运行以上命令之后如果输出如上所示，我们可以用apt-get命令来安装NodeJS和NPM包。

```
root@ubuntu-15:~# apt-get install nodejs

```

![NodeJS Install](/data/attachment/album/201507/05/233622jtdaxzxdl0zjhhbs.png)

#### 步骤3: 安装一些必备的工具

通过以下命令来安装编译安装一些我们必需的本地插件。

```
root@ubuntu-15:~# apt-get install -y build-essential

```

#### 通过Node.JS Shell来测试

测试Node.JS的步骤与之前使用源代码安装相似，通过以下node命令来确认Node.JS是否完全安装好:

```
root@ubuntu-15:~# node
> console.log('Node.js Installed Using Package Manager');
Node.js Installed Using Package Manager

```

---

```
root@ubuntu-15:~# node
> a = [1,2,3,4,5]
[ 1, 2, 3, 4, 5 ]
> typeof a
'object'
> 5 + 2
7
>
(^C again to quit)
>
root@ubuntu-15:~#

```

#### 使用NodeJS应用进行简单的测试

REPL是一个Node.js的shell，任何有效的JavaScript代码都能在REPL下运行通过。所以让我们看看在Node.JS下的REPL是什么样子吧。

```
root@ubuntu-15:~# node
> var repl = require("repl");
undefined
> repl.start("> ");

Press Enter and it will show out put like this:
> { domain: null,
_events: {},
_maxListeners: 10,
useGlobal: false,
ignoreUndefined: false,
eval: [Function],
inputStream:
{ _connecting: false,
_handle:
{ fd: 0,
writeQueueSize: 0,
owner: [Circular],
onread: [Function: onread],
reading: true },
_readableState:
{ highWaterMark: 0,
buffer: [],
length: 0,
pipes: null,
...
...

```

以下是可以在REPL下使用的命令列表

![REPL Manual](/data/attachment/album/201507/05/233623jk6dcv6mtxjt63j0.png)

#### 使用NodeJS的包管理器

NPM是一个提供给node脚本持续生命力的命令行工具，它能通过package.json来安装和管理依赖包。最开始从初始化命令init开始

```
root@ubuntu-15:~# npm init

```

![NPM starting](/data/attachment/album/201507/05/233624q9admhyhy9gilamz.png)

### 3) 从Github远程库安装Node.JS

在这个方法中我们需要一些步骤来把Node.JS从Github的远程的仓库克隆到本地仓库目录

在开始克隆（clone）包到本地并且配制之前，我们要先安装以下依赖包

```
root@ubuntu-15:~# apt-get install g++ curl make libssl-dev apache2-utils git-core

```

现在我们开始用git命令克隆到本地并且转到配制目录

```
root@ubuntu-15:~# git clone git://github.com/ry/node.git
root@ubuntu-15:~# cd node/

```

![Git Clone NodeJS](/data/attachment/album/201507/05/233625jd44t0dd4dr1jf8y.png)

clone仓库之后，通过运行.config命令来编译生成完整的安装包。

```
root@ubuntu-15:~# ./configure

```

![Configure Node](/data/attachment/album/201507/05/233625i38fz8xf8n92sxlp.png)

运行make install命令之后耐心等待几分钟，程序将会安装好Node.JS。

```
root@ubuntu-15:~/node# make install
root@ubuntu-15:~/node# node -v
v0.13.0-pre

```

#### 测试Node.JS

```
root@ubuntu-15:~/node# node
> a = [1,2,3,4,5,6,7]
[ 1, 2, 3, 4, 5, 6, 7 ]
> typeof a
'object'
> 6 + 5
11
>
(^C again to quit)
>
root@ubuntu-15:~/node#

```

### 4) 通过NVM安装Node.JS

在最后一种方法中我们我们将用NVM来比较容易安装Node.JS。安装和配制Node.JS，这是最好的方法之一，它可以供我们选择要安装的版本。

在安装之前，请确认本机以前的安装包已经被卸载。

#### 步骤1: 安装依赖包

首先升级Ubuntu Server系统，然后安装以下安装Node.JS和使用NVM所要依赖的包。用curl命令从git上下载NVM到本地仓库：

```
root@ubuntu-15:~# apt-get install build-essential libssl-dev
root@ubuntu-15:~# curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh

```

![NVM Curl](/data/attachment/album/201507/05/233626mu3y7uu33zung7x0.png)

#### 步骤2: 修改Home环境

用curl从NVM下载必需的包到用户的home目录之后，我们需要修改bash的配置文件添加NVM，之后只要重新登录中断或者用如下命令更新即可。

```
root@ubuntu-15:~# source ~/.profile

```

现在我们可以用NVM来设置默认的NVM的版本，或者用如下命令来指定之前版本：

```
root@ubuntu-15:~# nvm ls
root@ubuntu-15:~# nvm alias default 0.12.4

```

![NVM Default](/data/attachment/album/201507/05/233627kmti78dz5mip1pii.png)

#### 步骤3: 使用NVM

我们已经通过NVM成功的安装了Node.JS，所以我们现在可以使用各种有用的命令。

![NVM Manual](/data/attachment/album/201507/05/233627na52hkapktpakp55.png)

### 总结

现在我们已经准备好了在服务端安装Node.JS，你可以从我们说的四种方式中选择最合适你的方式在最新的Ubuntu 15.04上来安装Node.JS，安装好之后你就可以利用Node.JS来编写你的代码。

---

via: <http://linoxide.com/ubuntu-how-to/setup-node-js-ubuntu-15-04-different-methods/>

作者：[Kashif Siddique](http://linoxide.com/author/kashifs/) 译者：[NearTan](https://github.com/NearTan) 校对：[wxy](https://github.com/wxy)

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


没有 Linus，Linux 的未来是什么样子？

Summary: 这次采访是《Linux For You》杂志在2007年进行的，现在我们发表在这里是为了存档的目的。 Q：对于 Linux 内核，未来的计划/道路/提升是怎样的？ Linus：我从来没有太多的预见性  与其从宏大的计划上看未来，我倾向于从一个相对短的时间框架，比如几个月之后的事情。我是一个忠实的细节成败论的信仰者，如果你抓住了细节，再大的问题也会大事化小，小事化无。 所以，对于五年后内核会是什么样，我真的没有任何远见  仅仅是希望我们能够持续专注于Linux的发展。实际上，对于我个人来说，我最担心的事情之一甚至不是技术问题，而是确保这个过

“而 20100年之后，已经没有什么动静了。”确实，那个时候人类还存不存在都不好说。

大神就是大神

厄。。。多了个0。。。。。

哈哈，让转载的带着笔误去吧~~

不过如果真的没有了linus，我想linux要比没有了jobs的apple还悲惨

也许没有linus，Linux才会真正成为普遍使用的系统。但我觉得首先他面对的是一波哄抢，比如Windows干到头还不知道下个版本该怎么走的微软？？？<br />
不知道RedHat等怎么看这个问题。

我觉得 Linus 能在有生之年继续做这件事就好了，之后，或许是需要新的一代，或许是不需要了。倒也不必担忧百年之后的事情。

呵呵，如果卖电脑的商人们，在启动项列表里面除了缺省windows入口外，再弄个Linux的，那这个命题就和Linus完全无关了。<br />
我所看到的是：Linus再努力，也和商业无关，只有商业才能贴近生活，技术只能代表一个走势。

![](/data/attachment/album/201507/06/222131omf3r8jy03rqdfdj.jpg)

这次采访是《Linux For You》杂志在2007年进行的，现在我们发表在这里是为了存档的目的。

**Q：对于 Linux 内核，未来的计划/道路/提升是怎样的？**

Linus：我从来没有太多的预见性 — 与其从宏大的计划上看未来，我倾向于从一个相对短的时间框架，比如“几个月之后的事情”。我是一个忠实的‘细节成败论’的信仰者，如果你抓住了细节，再大的问题也会大事化小，小事化无。

所以，对于五年后内核会是什么样，我真的没有任何远见 — 仅仅是希望我们能够持续专注于Linux的发展。实际上，对于我个人来说，我最担心的事情之一甚至不是技术问题，而是确保这个‘过程’正常，这样人们才可以相互协作好。

**Q：你怎么看 Linux 和 Solaris 之间的关系在未来的发展？它会如何使用户受益？**

Linus：我并没有看到太多交叉的地方，除了我认为 Solaris 会使用更多的 Linux 用户空间工具（对我自己来说并没有太多关注这个，因为我真的只关心内核）。Linux 桌面比起传统 Solaris 桌面好多了，而且我希望 Solaris 移植越来越多的 Linux 的东西，朝着一个更加类 Linux 的模式前进。（LCTT 译注：时至今日，我们还需要讨论 Solaris 吗？/cry ，但是当时，整个开源社区确实期望接受 Solaris 一些遗产。）

从纯内核方面讲，许可证的存在意味着没有太多的合作空间，但是如果这种情况发生改变将会变得很有趣。Sun 已经声称将在 GPL（v2 或 v3）下授权 Solaris，如果这种许可证的差异消失，那么会导致一些有趣的技术出现。但对此，我持观望态度。

**Q：现在 GPL v3 已经完成并发布了，你是否预见有什么情况会鼓励你开始移植内核到 Solaris 上去？或者，从你的角度看，它是否很糟糕以至于你从来没考虑过它？**

Linus：我觉得相比于早先的草稿，v3 有了很多提高，并且我也不认为它是一个糟糕的许可证。我只是认为它没有 GPLv2 一样‘伟大’。

所以，如果没有 GPLv2，我觉得自己将会使用 GPLv3。不过，既然我已经有了一个更好的选择，我为什么还要考虑它呢？

这就是说，我始终秉承实用主义精神，并且我认为“ GPLv3 不像 GPLv2 一样好”这件事并不是一个‘非黑即白’的问题。这就像是一个天平，如果 GPLv3 有了其他的优点作为砝码，很有可能那些优点会让我对 GPLv3 更偏爱一些。

恕我直言，我到现在还并没有看到任何优点，但是如果 Solaris 真的在 GPLv3 下发布，可能避免不必要的许可证不兼容性这一条就分量足够了，足以值得我们去尝试将 Linux 的内核重新在 GPLv3 许可证下发布。不过，请不要误解，我认为这是不大可能的。但是我确实想澄清我本质上并不是一个许可证偏执者。我认为 GPLv2 是毫无疑问的好许可证，但是许可证并不是一切。（LCTT 译注：事实上，Solaris/OpenSolaris 最终也没采用 GPL 许可协议发布，而 2010年之后，已经没有什么动静了。而 Linux 内核最终也没有更换到 GPLv3 上。）

总的来说，我使用很多其他许可证下的程序。我可能没有把任何一个我自己做的项目放在 BSD（或 X11—MIT）许可证下，但是我认为它是一个伟大的许可证，对于其他项目来说，它可能是最佳的选择。

**Q：目前有没有任何你想特别提出作为 Linux 内核的关键贡献者的印度人？**

（LCTT 译注：本篇访谈中提到多次印度，是因为访谈者是印度人。）

Linus：我不得不承认，我并没有与来自印度的任何人直接合作过，尽管我已经非常有意识地努力建立一个规模庞大的内核开发团队，这样我不用总是独自工作。

我相信大多数人的社交基本上是受限制的，只对很少的人十分了解（比如你最亲近的家人和朋友），我也努力构造这样一个开发模型来改变这种状况：通过一个‘开发者网络’，人们可以在此互动，可能是与一批你信任的人，而且那些人反过来与他们信任的一群人互动。

所以，我偶然会与上百个发给我一两个不确定的补丁的开发者联系。我试着去建立一些由我熟知的人组成的小团体，我认为那就是人们工作的方式，当然也是我喜欢工作的方式。

同时，坦白地说，我甚至不知道许多与我一起工作的人生活在哪里。地理位置成了十分次要的东西。所以我很确信与我工作最紧密的前10—15个人中，没有印度的，可能这话稍后传到公众耳里，然后被指出确实有一些人来自那里！

**Q：因为 Linux 的内核开发对你依赖如此严重，你如何计划组织或重组，让它在没有你的情况下继续发展，假设你决定花更多的时间在你自己的生活和家庭上面的话？**

Linus：现在 Linux 比我重要得多，为了今天这一步我已经工作了很长时间。是的，我仍然十分密切地参与其中，而且我对其有着想当大的日常影响，我最终会是这样一个人——在某种程度上，扮演着许多内核开发活跃者的中心；但是，我不会说 Linux “严重依赖”于我。

所以，如果我得了心脏病并且明天就死了（很高兴没这种可能：我显然在任何方面都很健康），人们肯定会注意到，但是有成千上万的人为内核工作，并且不止一两个人能够毫无困难地接替我的角色。

**Q：印度是软件工程师的主要产地之一，但是我们没有在 Linux 领域做太多贡献。你觉得为什么印度人没有积极参与Linux？如果我们鼓励印度人参与并为 Linux 做更大的贡献，你觉得如何？你会乐意用你个人作为榜样激励印度工程师吗？**

Linus：对我来说，这确实是一个不好回答的问题。参与开源取决于两方面的基础条件：信息流和文化（用你的话说是互联网和教育），我甚至不知道这其中哪个是最大的障碍。

在很多方面，至少在那些印度讲英语文化的地方，参与 Linux 和其他开源项目是相对容易的，如果仅仅是由于语言门槛的话。这当然比起亚洲的许多地方，甚至欧洲的一些地方要容易些。

当然，这只是一些人，并不等同于印度的大部分群体，而且我自己关于印度的情况也知道不多，甚至没法不太负责的猜测最好的途径是什么。我猜一个热情的本地用户社区会是最好的途径，而且我猜测你们已经拥有这样的社区了。

至于我的‘偶像’形象，我自己不以为然。我不是一个伟大的公众演讲者，而且我最近些年已经避免出游，因为被看做符号化的‘偶像’让我很不自在。我就是一个工程师而已，而且我仅仅是喜欢我做的事情，并与社会上其他人一起工作。

**Q：什么样的理由会让你考虑去访问印度？**

Linus：如前一个回答中提到，我十分讨厌公开演讲，所以我才想避免开会等等这些事。我更愿意某天去印度度个假，但是如果我这样做，我可能悄悄地干 — 出行之前不告诉任何人，仅仅作为一个游客去游览印度！（LCTT 译注：所以 Linus 不来中国的道理是同样的，除非在中国召开一次世界性的 LinuxCon。）

**Q：最近你好像在抨击 Subversion 与 CVS，质问他们的架构基础。现在你已经从 Subversion 和 CVS 社区那里得到回应，你是否改变了看法，还是说并没有被说服？**

Linus：因为我发现这个争论很有趣，所以我想做一个强硬的声明。换句话说，我确实‘喜欢’争论。并不是不经思考的，但是我确实想要让争论更热烈些，而不仅仅是完全的柏拉图式的。

做出强硬的争论有时会引来一个非常合理的反驳，然后我会很高兴地说：“噢，好吧，你是对的。”

但是话说回来，对 SVN/CVS 并不会发生这种情况。我怀疑很多人并不是真的很喜欢 CVS，所以我真的不觉得会有谁坚持认为 CVS 就是一切，而不是一个老旧系统。要是我知道之前就有人这样认为的话，我就不会那么不礼貌地反对 SVN（嘿，这么说没错 — 我真的不是一个非常礼貌的家伙！），我不相信任何人会认为 SVN 是‘好的’。

我认为，SVN 就是一个‘还好’的经典案例。人们过去经常使用 SVN，并且它也‘还好’地广泛使用，但是它的‘还好’就如 DOS 与 Windows 的‘还好’一样。不是什么伟大的技术，只是普遍适用而已，同时它对人们来说运行良好，看着十分熟悉。但是很少有人以此为傲，或者对其感到兴奋。

Git，从另外方面讲，其身后有一些‘UNIX 哲学’，这和 UNIX 无关。实质上，就像原始的 UNIX，在它身后有一个基本理念。对 UNIX 来说，最底层的哲学就是，“所有东西只是一个文件”。对 Git 来说，“则是每个东西只是内容寻址数据库中的一个对象”。

**Q：现在如此多的发行是好事还是坏事？选择是很有意思的，但是选择太多了就是干扰。相较于这么多的人每天花费数小时去构建成百上千的发行版，如果人们可以一起来支持少数的发行版，这样在企业级市场去挑战微软是不是更容易些呢？对此你怎么看？**

Linus：我认为多个发行版是开源不可回避的部分。它会造成困惑吗？当然。它会变得低效率吗？是的。但是我喜欢拿它与政治比较：‘民主’也有那些令人困惑的选择，往往没有任何一个选择是你‘真正’想要的。而且有时候，如果你不需要操心选举、不同党派和联合等等方面的困惑的话，你可能会感觉事情更加容易一些，更有效率一些。

但是最后我想说，选择可能会导致低效率，但是它也让每个人至少保留了‘所谓的’诚信。我们可能都希望我们的政治家更诚信，我们也希望不同的发行版可以让我们有一天有其他的选择，而如果没有选择的话，事情可能会更糟。

**Q：为什么你觉得 CFS 比 SD 更好？**

Linus：一部分原因是我与 Ingo [Molnar] 工作过很长一段时间，也就是说，我了解他，并且知道他会对发生的任何问题非常负责。那种品质是非常重要的。

但是一部分原因就简单的与用户有关，大多数人实际上表示 CFS 比 SD 好。包括许多 3D 游戏方面（这是人们声称 SD 最强的一点）。

尽管如此，我认为并不是任何一段代码都十分‘完美’。最好的情况是，想成为 SD 支持者的人会努力提高 SD，从而通过其它方式取得了平衡 — 而我们会保持两个阵营都尝试有趣的事情，因为内部的竞争会刺激他们。

**Q：在 Google 的一次关于 Git 的访谈中，有人问你如何将当前集中存放的超大代码库迁移到 git 上，而不用将开发工作停止六个月。你对此的回答是什么？**

Linus：啊哈，那个问题我在现场没有听清楚（在录音里，问题会听得更清楚些），当我回头去听录制的音频，注意到了我没有回答他的问题，但是我觉得这问题他问过。

无论如何，我们确实有很多导入的工具，所以你实际上可以仅仅是将一个大的项目从任何其他的早期的 SCM （源代码控制系统）导入到 git 里，但问题显然不是经常以导入动作本身结束，而是需要‘习惯’这种新模式！

坦白来说，我认为关于如何‘习惯它’没有任何其他答案，而只能是去开始使用和尝试它。显然，你不会冒险率先导入你现有的最大、最重要的项目，那确实会导致工作停顿下来，然后使得每个人都很不高兴。

所以没有任何理智健全的人会拥护在一夜之间将一切移到 git 上去，并强迫人们改变他们的环境。是的，你需要从公司里的小项目开始，可能是一些由一个小组主要控制和维护的项目，然后开始转移其到 git。这是你能让人们习惯这种模式的方式，你应该以一个核心的组开始，他们知道 git 如何工作，如何在公司里面使用它。

接着，你就会铺展开来。并不需要一次到位。你会导入越来越多的项目 — 甚至是在你公司里采用‘单一大型仓库’模式；那个仓库基本上是作为许多模块的集合，因为让每个人去检查每件事不是一个可执行的工作模型（除非这个‘每件事’并不非常大）。

所以，你基本上只会一次转移一个模块，直到你发现使用 git 是如此酸爽，这时你可以移植余下的所有（或者‘余下’的太旧了，没有人用了）。

git 最赞的一个功能是，它实际上可以同很多其他 SCM 相处很好。很多 git 用户使用它的时候，与他们一起工作的人并没有发现，因为他们看到 git 的结果，会联想到一些传统的 SCM 上去。

**Q：Linux 用了你在 Transmeta（全美达）上实现备用指令集的经验吗？[Transmeta Crusoe 芯片看起来像一个非常轻量级的 CPU — 记得有一台 Burroughs B1000 解释器，它实际上实现了多个虚拟机。有的用于系统软件，有的用于 Cobol，还有的用于 Fortran；如果没错的话，那么人们可以在芯片上实现 Burroughs 6/7000 或者 HP3000 类似的堆栈架构，或适用于 JVM 的指令集，等等。（LCTT 译注：Linus 于 1997-2003 期间就职于全美达）]**

Linus：我们确实有一些备选的结构集合，不过我不打算谈论太多这个，我可以说的是我们已经做了一个混合结构集合的公开演示。我们有一个技术展示，在那里你同时可以跑 x86 指令和 Java 字节码（实际上，它是一个轻量的扩展 pico—java，iirc）。

我想我们展示的这个应用会在 Linux 上运行 DOOM，这里 Linux 的部分是一个完全标准 x86 发行版。但是 DOOM 的二进制程序是一个特定的编译版本，它实际上编译为 pico-java 代码。而 CPU 最终以相同的方式来运行它们——从 JIT 到原生 VLIW 指令集。

（选择 DOOM 的原因仅仅是其源代码可用，并且游戏的核心部分非常小，足以很容易拿它来做一个验证 — 而且它也显然看起来十分有趣。）

有更多的事情是在内部运作，但是我不能谈论他们。而且实际上，就我个人而言，对 Java 不怎么感冒。

**Q：386BSD 衍生了 NetBSD，FreeBSD 和 OpenBSD，在 Linux 出现之前已经发展不错了，但是 Linux 传播比 386BSD 及其衍生者更为广泛。这在多大程度上左右你对许可证的选择，这个选择的发展过程是怎样的？你不认为比起 GPLv2 来，是 GPLv3 创造了发展空间，迄今为止，让 Linux 比 BSD 变得更好？**

Linus：我认为这不仅是一个许可证问题，也是一个社区及人格问题。BSD 的许可证总是鼓励分叉，但是这也意味着，如果某些人取得了成功并做了商业性的分叉，他并不需要将他的修改返回来。因此，哪怕实际上这种事情没有（而实际上，这种事情的确发生了，比如 BSDi），人们也难以建立彼此信任。

相比之下，GPLv2 也鼓励分叉，但是它不仅仅鼓励分叉出去，它也鼓励（并‘要求’）能够融合回来。所以，我们现在达到了新的层次的信任：你‘知道’每个人都被许可证所约束，所以每个人都不会占你便宜。

所以，在我看来，GPLv2 作为许可证来说，它允许人们在要求总是回馈贡献的前提下，在另外的方面取得了最大可能的自由。没有人能阻止你对源代码的改进。

那么，BSD 许可证是更‘自由’的吗？是的，毫无疑问。但是我不会在我在意的任何项目里面使用 BSD 许可证，因为我不仅仅想要自由，我也想要信任，可以让我总是能使用其他人为我的项目所写的代码。

所以对于我来说，GPLv2 最终在‘尽可能自由’上取得了完美的平衡，这样，我们做到了让每个人都能信任，他们总是可以取得源代码并使用它。

这就是为什么我认为 GPLv3 最终并没多大意思，它不再是那种‘返回源代码’的信任；它退化成了‘我写了这些代码，所以我能控制你如何使用它’。

换言之，我只是觉得 GPLv3 太狭隘和自私了。我认为 GPLv2 在‘自由’和‘信任’之间取得伟大的平衡。它不如 BSD 许可证自由，但是它让你安心回馈，而且它符合我认为的‘以德报德’：我给你源代码，你也回馈我源代码。

而 GPLv3 试着控制源代码的‘使用’。现在它就是“我给你我的源代码，如果你使用它的话，你就准备好让我对你的设备动手动脚吧”，看见了没？在我看来，不但小气，而且小心眼。

**Q：-rt 代码树的功能正在缓慢而稳定地逐渐集成到主线代码中。你对将剩余的 -rt 树合并到主线代码的看法是什么？（我说的不是 CFS）**

Linus: 我不能保证来自 -rt 的一切‘都’会被合并进入标准内核（有一些部分肯定不适合常规的内核），不过是的，这些年来我们实际上将它的大部分都集成进去了，剩下的部分最终以后也会合并进去。

我提倡高效工作，但是我同时也很保守。我退回了一些激进的合并请求，只是因为我需要确保它们对我们所有人都有意义，不仅仅是用于极端情况下的实时环境，而且也对并不需要这种环境的‘普通’用户有用。这解释了为什么这个过程相当缓慢却稳定不断地合并代码，因为它需要足够稳定和有意义。

顺便说一句，这不仅仅是针对 -rt ，它也出现在许多开发中。-rt 出现这种情况是因为它是更‘直接’的内核项目，而且也是因为它的一个主要开发者直接参与到了常规内核开发。通常其它功能的迁移（安全、虚拟内核变化、虚拟化，等等）也遵循类似的方式：他们针对特定的环境进行开发，然后这些功能片段缓慢而稳步地合并到标准内核。

**Q：我对 Linux 内核所支持的文件系统发展很感兴趣。你觉得 Reiser4、XFS4、ZFS 以及 Oracle 的新项目哪个更有前途？这些天 ZFS 有不少新闻，Reiser4 也发布了很不错的性能基准测试，XFS4 正紧随其后，而 Oracle 发布的那个也有很多像 Sun 的 ZFS 一样的特性。我们将走向何方呢？以你的观点来看，哪个文件系统更有前途？**

Linus： 实际上，就在昨天我们发现了一个 git 的性能问题，有一个用户发现他采用 ZFS 要比 UFS 慢一个数量级（不是在 Linux 下，git 已经得到了许多关注，甚至是来自内核开发团队之外）。所以，我认为许多‘新文件系统’的拥护者部分原因是因为他们了解到旧文件系统的不足，然后（有点不切实际地）期望一个‘崭新的、改进的’文件系统能使一切都完美。

最后，这是一个永无止境的领域，看看谁是最终的赢家——也许并不需要（看起来不需要）一个赢家。几乎总是这样，对文件系统的选择最终取决于负载和环境。

相比你提到的这些文件系统，我个人对基于闪存的硬盘很快就可以供甚至是‘普通’用户使用的这个事实更感到兴奋。当然，它们仍然很昂贵（而且相当的小），但是基于闪存的存储和传统硬盘的性能完全不可同日而语，我怀疑它们最终将对文件系统的设计有巨大的影响。而现在，多数文件系统的设计都是在考虑如何处理硬盘延迟。

**Q：操作系统变得越来越不重要。你说过好几次用户根本不应该‘看见’操作系统。应用更为重要。基于浏览器的应用，如 Google 的办公软件影响力越来越大。你认为操作系统将走向何方？**

Linus：我并不真的认可‘浏览器 OS’，因为我认为人们总是需要在本地做一些事情。也许是因为安全，或者仅仅是因为隐私的原因。而且即便当到处可以接入时，它也并不是‘无处不在’。

所以我认为，整个‘Web OS’这件事有一部分是真实的，但是另外一部分人们也许忘记了操作系统已经存在了几十年，它已经相当稳定，而且它的发展是有目共睹的。人们真的不应该期望操作系统有魔法般的变化，现在已经不是操作系统刚刚起步的六十年代，甚至连硬件也和过去完全不同了！

所以，别指望一场革命。我认为操作系统将在很大程度上继续它们所擅长的，当然，我们也会进步，但是我不认为会从根本上改变。也许会发生巨变的是界面和操作系统顶层的那些东西（当然，操作系统下面的硬件也会继续进步），这显然才是人们所关心的。

至于操作系统？它显然是应该尽可能隐藏起来的东西。你真的不应该在意它，除非你特别想知道在机器里面真正在发生什么。

**Q：最近我听说你正在使用一台 PPC G4/5 作为个人计算机，你使用它来做什么？为什么呢？**

Linus：我最终放弃了那台 PowerPC，因为没有人能在这台工作站上做到更多，特别是，自从 x86-64 开始变得越来越强大了。所以这些天，我在用一台标准的 PC，里面是一个普通的 Core 2 Duo CPU。

在其它架构下运行是非常有趣的（alpha 作为我的主要架构运行了好几年，所以这并不是第一次），但是这种 CPU 得当成商品买得到才行。我认为，唯一能取代 x86 架构的，也许未来十年并不需要使用 x86 作为主要架构，我认为或许是 ARM，这得益于移动设备市场的发展。

**Q：Linux 对你意味着什么？一种业余爱好、哲学、人生意义、工作、最好的操作系统，还是什么？**

Linus：它是所有的这一切。它是爱好，而且是具有深刻意义的爱好。最好的爱好是你‘真的’非常在意它。这些日子里，它显然也是我的工作，我非常高兴工作和兴趣能合二为一。

我不了解所谓的‘哲学’，我并不真的是因为深层次的道德或哲学的原因才做的 Linux，但是可以肯定的是，对开源的深层思考是我非常重视的。所以我并不是因为什么明确的理由做 Linux，也不能说是它在激励我，但是我的确在思考开源是如何工作。

**Q：微软的‘黑衣人’有没有和你交谈过？**

Linus：我从来没有真正和微软交谈过，没有。我偶尔会和一些微软的人出现再同一个会议上（我比以前参加的会议更多了），但是我从来和他们没有任何关系。我认为彼此都很谨慎吧。

---

via: <http://www.linuxveda.com/2015/06/17/what-happens-to-linux-after-linus/>

作者：[Swapnil Bhartiya](http://www.linuxveda.com/author/arnieswap/) 译者：[wi-cuckoo](https://github.com/wi-cuckoo)，[wxy](https://github.com/wxy) 校对：mahua, [wxy](https://github.com/wxy)

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


Linux 下如何处理包含空格和特殊字符的文件名

Summary: 我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最常见，应用也很广泛，但总会需要处理一些包含特殊字符的文件名/文件夹名。 注意：我们可能有各种类型的文件，但是为了简单以及方便实现，在本文中我们只用文本文件（.txt）做演示。  最常见的文件名例子： abc.txt avi.txt debian.txt ...  数字文件名例子： 121.txt 3221.txt 674659.txt ...  字母数字文件名例子： eg84235.txt 3kf43nl2.txt 2323ddw.txt ...  包含特殊字符的文件名的例子，并不常见： #232.txt #bkf.tx

“注意：在 Linux 里你可能碰到名字包含许多点 (.) 的文件。不像其他操作系统，...”

Windows 也可以。

“最好不要在文件名里使用空格，如果你必须要分隔可读的名字”

实在是不能认同，空格分明是非常用于区分的字符。文中举例了那么多使用比空格更怪异的字符，为何偏偏不建议使用空格。

而且处理空格的方法，明明用半角单引号或双引号括起来就完了，还非得用更麻烦反斜杠转义。

自动匹配的时候bash应该是用\ 来匹配空格的。<br />
这里应该也不是让你用，只不过是说明一下输入特殊符号可以用的方法吧。

另外，我看到翻译里说了各种错误，去原文看了一下，都是说直接使用就好。<br />
我在bash里测试了一下 ，就“touch”而言，倒是随便写，换作rm就不行了，比如?12.txt就给通配掉了。

不，bash 的自动匹配含空格的文件名或目录名，是同时支持反斜杠(\)和半角单双引号('' "")两种，如果名字的最前面有单双引号，则用单双引号，否则用反斜杠。

P.S. 我注意到，最前面的两个评论都来自 RONG 城。

是的，我们在翻译的过程中，认为原文不够严谨，因此有部分段落做了修改和说明。一般来说，对于像 touch 这样无害的命令来说，可能*，? 这样无所谓，但是对于rm 这样的命令，则非常有害——必须做转义。因此，我们建议，对于这些特殊字符，都谨慎使用，尽可能转义，而不要去试探 shell 的底线。

好文章！

研究这种东西真是无聊，了解一下 " 和 ' 不是更加简单。再，了解一下命名规范，不要取那种蛋疼的文件名。

嗯，其实就是三条：1、单引号和双引号；2、反斜线；3、--

感觉有点实用

请问文件名包含°(度)怎么办

那只是UTF-8，不是什么特殊字符

这不是无聊，这是更深层次地了解linux，假如你要设计操作系统，你必须考虑这些

你应该试试，就知道 ", ' 是解决不了这种问题的。

你应该试试，就知道 ", ' 是解决不了这种问题的。

要是包含换行符且想保留转义的含义怎么做

一点都不无聊，今天就遇到了一个-号开头的文件，其他软件创建的。反过来想，也可以创建一些这种文件，来测试软件稳定性

如果字符串里本身含有单引号，或者双引号，该怎么处理？

我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最常见，应用也很广泛，但总会需要处理一些包含特殊字符的文件名/文件夹名。

**注意**：我们可能有各种类型的文件，但是为了简单以及方便实现，在本文中我们只用文本文件（.txt）做演示。

![](/data/attachment/album/201507/07/225132g0xgyr2gvr0gy0y7.jpg)

最常见的文件名例子：

```
abc.txt
avi.txt
debian.txt
...

```

数字文件名例子：

```
121.txt
3221.txt
674659.txt
...

```

字母数字文件名例子：

```
eg84235.txt
3kf43nl2.txt
2323ddw.txt
...

```

包含特殊字符的文件名的例子，并不常见：

```
#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

```

一个显而易见的问题是 - 在这个星球上有谁会创建和处理包含井号`(#)`，分号`(;)`，破折号`(-)`或其他特殊字符的文件/文件夹啊。

我和你想的一样，这种文件名确实不常见，不过在你必须得处理这种文件名的时候你的 shell 也不应该出错或罢工。而且技术上来说，Linux 下的一切比如文件夹、驱动器或其他所有的都被当作文件处理。

### 处理名字包含破折号(-)的文件

创建以破折号`(-)`开头的文件，比如 -abx.txt。

```
$ touch -abc.txt

```

#### 测试输出

```
touch: invalid option -- 'b'
Try 'touch --help' for more information.

```

出现上面错误的原因是，shell 把破折号`(-)`之后的内容认作参数了，而很明显没有这样的参数，所以报错。

要解决这个问题，我们得告诉 Bash shell（是的，这里以及本文后面的大多数例子都是基于 BASH 环境）不要将特殊字符（这里是破折号）后的字符解释为参数。

有两种方法解决这个错误：

```
$ touch -- -abc.txt     [方法 #1]
$ touch ./-abc.txt      [方法 #2]

```

你可以通过运行命令 ls 或 [ls -l](/article-5349-1.html) 列出详细信息来检查通过上面两种方式创建的文件。

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

```

要编辑上述文件可以这样：

```
$ nano -- -abc.txt
或者
$ nano ./-abc.txt

```

**注意**：你可以将 nano 替换为任何其他你喜欢的编辑器比如说 vim：

```
$ vim -- -abc.txt
或者
$ vim ./-abc.txt

```

如果只是简单地移动文件可以这样：

```
$ mv -- -abc.txt -a.txt
或者
$ mv -- -a.txt -abc.txt

```

删除这种文件，可以这样：

```
$ rm -- -abc.txt
或者
$ rm ./-abc.txt

```

如果一个目录下有大量这种名字包含破折号的文件，要一次全部删除的话，可以这样：

```
$ rm ./-*

```

**重要：**

1. 上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置的连接符号的文件。就是说，-a-b-c.txt，ab-c.txt，abc-.txt，等等。
2. 上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置连接符号的文件夹，除了一种情况，在删除一个文件夹的时候你得这样使用`rm -rf`：

$ rm -rf -- -abc 或者 $ rm -rf ./-abc

### 处理名字包含井号(#)的文件

符号`#`在 BASH 里有非常特别的含义。`#`之后的一切都会被认为是评论，因此会被 BASH 忽略。

**通过例子来加深理解：**

创建一个名字是 #abc.txt 的文件：

```
$ touch #abc.txt

```

#### 测试输出

```
touch: missing file operand
Try 'touch --help' for more information.

```

出现上面错误的原因是，BASH 将 #abc.txt 解释为评论而忽略了。所以[命令 touch](http://www.tecmint.com/8-pratical-examples-of-linux-touch-command/)没有收到任何文件作为参数，所以导致这个错误。

要解决这个问题，你可能需要告诉 BASH 不要将 # 解释为评论。

```
$ touch ./#abc.txt
或者
$ touch '#abc.txt'

```

检查刚创建的文件：

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

```

现在创建名字中除了开头的其他地方包含 # 的文件。

```
$ touch ./a#bc.txt
$ touch ./abc#.txt
或者
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

```

运行 ‘ls -l‘ 来检查：

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

```

如果同时创建两个文件（比如 a 和 #bc）会怎么样：

```
$ touch a.txt #bc.txt

```

检查刚创建的文件：

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:18 a.txt

```

很明显上面的例子中只创建了文件 `a` 而文件 `#bc` 被忽略了。对于上面的情况我们可以这样做，

```
$ touch a.txt ./#bc.txt
或者
$ touch a.txt '#bc.txt'

```

检查一下：

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 #bc.txt

```

可以这样移动文件：

```
$ mv ./#bc.txt ./#cd.txt
或者
$ mv '#bc.txt' '#cd.txt'

```

这样拷贝：

```
$ cp ./#cd.txt ./#de.txt
或者
$ cp '#cd.txt' '#de.txt'

```

可以使用你喜欢的编辑器来编辑文件：

```
$ vi ./#cd.txt
或者
$ vi '#cd.txt'

$ nano ./#cd.txt
或者
$ nano '#cd.txt'

```

这样删除：

```
$ rm ./#bc.txt
或者
$ rm '#bc.txt'

```

要删除所有以井号（#）开头的文件，可以这样：

```
# rm ./#*

```

### 处理名字包含分号(;)的文件

如果你还不知道的话，分号在 BASH 里起到命令分隔的作用，其他 shell 可能也是一样的。分号作为分隔符可以让你一次执行几个命令。你碰到过名字包含分号的文件吗？如果没有的话，这里有例子。

创建一个名字包含分号的文件。

```
$ touch ;abc.txt

```

#### 测试输出

```
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

```

出现上面错误的原因是，在运行上面命令的时候 BASH 会把 touch 解释为一个命令但是在分号前没有任何文件参数，所以报告错误。然后报告的另一个错误找不到命令 `abc.txt`，只是因为在分号后 BASH 会期望另一个新的命令，而 `abc.txt` 并不是一个命令。

要解决这个问题，我们得告诉 BASH 不要将分号解释为命令分隔符，例如：

```
$ touch ./';abc.txt'
或者
$ touch ';abc.txt'

```

**注意**：我们将文件名用单引号 '' 包含起来。这样可以告诉 BASH 分号 ; 是文件名的一部分而不是命令分隔符。

对名字包含分号的文件和文件夹的其他操作（就是，拷贝、移动、删除）可以直接将名字用单引号包含起来就好了。

### 处理名字包含其他特殊字符的文件/文件夹

#### 文件名包含加号 (+)

不需要任何特殊处理，按平时的方式做就好了，比如下面测试的文件名。

```
$ touch +12.txt

```

#### 文件名包含美元符 ($)

你需要将文件名用单引号括起来，像处理分号那样的方式。然后就很简单了。

```
$ touch '$12.txt'

```

#### 文件名包含百分号 (%)

不需要任何特殊处理，当作一个普通文件就可以了。

```
$ touch %12.txt

```

#### 文件名包含星号 (\*)

需要用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改。）

```
$ touch *12.txt

```

注意：当你需要删除星号开头的文件时，千万不要用类似下面的命令。

```
$ rm *
或者
$ rm -rf *

```

而是用这样的命令，(LCTT 译注：此处原文有误，已修改）

```
$ rm ./'*.txt'

```

#### 文件名包含叹号 (!)

只要将文件名用单引号括起来，其他的就一样了。

```
$ touch '!12.txt'

```

#### 文件名包含小老鼠 (@)

没有什么特别的，可以将名字包含小老鼠的文件当作普通文件。

```
$ touch '@12.txt'

```

#### 文件名包含 ^

不需要特殊处理。可以将名字包含 ^ 的文件当作普通文件。

```
$ touch ^12.txt

```

#### 文件名包含 (&)

将文件名用单引号括起来，然后就可以操作了。

```
$ touch '&12.txt'

```

#### 文件名包含括号 ()

如果文件名包含括号，你需要将文件名用单引号括起来。

```
$ touch '(12.txt)'

```

#### 文件名包含花括号 {}

用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改）

```
$ touch '{12.txt}'

```

#### 文件名包含尖括号 <>

名字包含尖括号的文件需要用单引号括起来。

```
$ touch '<12.txt>'

```

#### 文件名包含方括号 [ ]

用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改）

```
$ touch '[12.txt]'

```

#### 文件名包含下划线 (\_)

这个非常普遍，不需要特殊对待。当作普通文件随意处理。

```
$ touch _12.txt

```

#### 文件名包含等号 (=)

用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改）

```
$ touch '=12.txt'

```

#### 处理反斜杠 ()

反斜杠会告诉 shell 忽略后面字符的特殊含义。你必须将文件名用单引号括起来，就像处理分号那样。其他的就没什么了。

```
$ touch '\12.txt'

```

#### 包含斜杠的特殊情形

除非你的文件系统有问题，否则你不能创建名字包含斜杠的文件。没办法转义斜杠。

所以如果你能创建类似 ‘/12.txt’ 或者 ‘b/c.txt’ 这样的文件，那要么你的文件系统有问题，或者支持 Unicode，这样你可以创建包含斜杠的文件。只是这样并不是真的斜杠，而是一个看起来像斜杠的 Unicode 字符。

#### 文件名包含问号 (?)

用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改）

```
$ touch '?12.txt'

```

#### 文件名包含点 (.)

在 Linux 里以点 `(.)` 开头的文件非常特别，被称为点文件。它们通常是隐藏的配置文件或系统文件。你需要使用 ls 命令的 ‘-a‘ 或 ‘-A‘ 开关来查看这种文件。

创建，编辑，重命名和删除这种文件很直接。

```
$ touch .12.txt

```

注意：在 Linux 里你可能碰到名字包含许多点 `(.)` 的文件。不像其他操作系统，文件名里的点并不意味着分隔名字和扩展后缀。你可以创建名字包含多个点的文件：

```
$ touch 1.2.3.4.5.6.7.8.9.10.txt

```

检查一下：

```
$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 14:32 1.2.3.4.5.6.7.8.9.10.txt

```

#### 文件名包含逗号 (,)

你可以在文件名中使用逗号，可以有任意多个而不用特殊对待。就像平时普通名字文件那样处理。

```
$ touch ,12.txt
或者
$ touch ,12,.txt

```

#### 文件名包含冒号 (:)

用单引号括起来或使用反斜杠转义。（LCTT 译注：此处原文有误，已修改）

```
$ touch ':12.txt'
或者
$ touch ':12:.txt'

```

#### 文件名包含引号（单引号和双引号）

要在文件名里使用引号，我们需要使用交替规则。例如，如果你需要在文件名里使用单引号，那就用双引号把文件名括起来。而如果你需要在文件名里使用双引号，那就用单引号把文件名括起来。（LCTT 译注：或者如果单引号和双引号混杂的情况，你也可以用反斜杠转义。）

```
$ touch "15'.txt"

以及

$ touch '15".txt'

```

#### 文件名包含波浪号 (~)

Linux 下一些像 emacs 这样的文本编辑器在编辑文件的时候会创建备份文件。这个备份文件的名字是在原文件名后面附加一个波浪号。你可以在文件名任意位置使用波浪号，例如：

```
$ touch ~1a.txt
或者
$touch 2b~.txt

```

#### 文件名包含空格

创建名字的字符/单词之间包含空格的文件，比如 “hi my name is avishek.txt”。

最好不要在文件名里使用空格，如果你必须要分隔可读的名字，可以使用下划线或横杠。不过，你还是需要创建这样的文件的话，你可以用反斜杠来转义下一个字符。要创建上面名字的文件可以这样做。

```
$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

```

我已经尝试覆盖你可能碰到的所有情况。上面大多数测试都在 BASH Shell 里完成，可能在其他 shell 下会有差异。

如果你觉得我遗漏了什么（这很正常也符合人性），请把你的建议发表到下面的评论里。保持联系，多评论。不要走开！求点赞求分享求扩散！

---

via: <http://www.tecmint.com/manage-linux-filenames-with-special-characters/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[zpl1025](https://github.com/zpl1025) 校对：[wxy](https://github.com/wxy)

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


Tor浏览器：Linux下用于匿名Web浏览的终极浏览器

Summary: 我们大多数人都在上网方面花费很多时间。上网使用的应用程序主要是浏览器，更确切的说是一个Web浏览器。我们在网络上的大部分活动要以客户端/服务器的方式登录，这个过程会包括IP地址、地理信息、搜索、活动以及许多潜在的信息，这些信息如果以其他方式被故意使用，会存在潜在的危险性。  Tor浏览器：匿名浏览器 此外，美国国家安全局（NSA）这样的国际间谍机构会记录我们的数字足迹。更不必说受到控制的代理服务器也会被用来做为数据搜集服务器。并且大多数企业和公司不会允许您访问代理服务器（使您能保障自己的隐私）。 因此，我们需要

不翻墙能用吗？

翻墙也打不开https://www.torproject.org/download/download-easy.html.en这个链接啊

我想科学的上网，可以提供一个下载链接么。。。<br />
文中的链接表示打不开

表示该链接翻墙可访问到——也许翻墙姿势不对？

请用正确姿势先翻墙获取梯子~——厄，这似乎是个悖论？

那用不了

这个东西能直接翻墙访问脸书吗？

还得需要网桥 直连不了

呵呵 说不能用的，你们就不会先找个梯子来作为网络接入吗<br />
接入后就可以把梯子丢一边了。（当然，目前通过内置的亚马逊也是可以连接网络的）

傻吧

来自甘肃兰州的 Chrome Mobile 70.0|Android 8.1 用户

傻吧

我们大多数人都在上网方面花费很多时间。上网使用的应用程序主要是浏览器，更确切的说是一个Web浏览器。我们在网络上的大部分活动要以客户端/服务器的方式登录，这个过程会包括IP地址、地理信息、搜索、活动以及许多潜在的信息，这些信息如果以其他方式被故意使用，会存在潜在的危险性。

![在Linux中安装Tor浏览器](/data/attachment/album/201507/07/234541bs1o18zhqs84qs6s.jpg)

*Tor浏览器：匿名浏览器*

此外，美国国家安全局（NSA）这样的国际间谍机构会记录我们的数字足迹。更不必说受到控制的代理服务器也会被用来做为数据搜集服务器。并且大多数企业和公司不会允许您访问代理服务器（使您能保障自己的隐私）。

因此，我们需要的最好是一个小型、独立、可携带的应用程序，它能达到匿名的效果。Tor浏览器便是这样的一个应用，它拥有上面提到的所有功能，甚至不止于此。

这篇文章里我们会讨论Tor浏览器，它的功能、使用方式、领域、安装以及其他关于Tor浏览器的重要方面。

### 什么是Tor浏览器？

Tor是一个自由分发的应用软件，以BSD许可证发布，通过其安全可靠的洋葱式的结构，允许用户匿名的进行网络浏览。从前，由于它的结构和运作机制，Tor被称为‘洋葱路由器’。这个应用是由C语言写成的。

#### Tor浏览器的功能

* 跨平台可用。例如，这个应用程序在Linux、Windows和Mac下都可用。
* 在发送数据到因特网前进行复杂的数据加密。
* 在客户端进行数据自动解密。
* 它是火狐浏览器和Tor工程的结合。
* 对服务器和网站提供匿名性。
* 可以访问被限制的网站。
* 无需暴露源IP便可以执行任务。
* 可以将数据路由至/从防火墙后隐藏的服务和应用程序。
* 便携性 - 可以直接从USB存储棒上运行一个预配置的web浏览器。无需本地安装。
* 在x86和x86\_64平台均可用
* 可以配置为一个运行在“localhost”的“9050”端口上的“socks4a”代理来让FTP跑在Tor 上。
* Tor拥有处理上千的中继和上百万用户的能力。

#### Tor浏览器如何工作？

Tor的工作方式基于洋葱路由的概念。洋葱路由的结构类似洋葱，它的每一层都嵌套在另一层里面，就像洋葱一样。这种嵌套的结构负责多次加密数据并将其通过虚拟电路进行发送。在客户端一侧每一层都在将他传递到下一层之前解密数据。最后一层在将原始数据传递到目的地前解密最里面一层的加密数据。

在这个过程里，这种解密整个层的功能设计的如此高明以至于无法追踪IP以及用户的地理位置，因此可以限制任何人观察您访问站点的网络连接。

所有这些过程看起来有些复杂，但用户使用Tor浏览器时没有必要担心。实际上，Tor浏览器的功能像其他浏览器一样（尤其是Mozilla的Firefox）。

### 在Linux中安装Tor浏览器

就像上面讨论的一样，Tor浏览器在Linux和Windows以及Mac下都可用。用户需要根据系统和架构的不同在下面的链接处下载最新的版本（例如，Tor浏览器4.0.4）。

* <https://www.torproject.org/download/download-easy.html.en>

在下载Tor浏览器后，按说我们需要安装它，但是Tor的好处是我们不需要安装它。它能直接从随身设备中运行，并且该浏览器可以被预配置。这意味着插件和运行的特性可以完美的移植。

下载打包文件（\*.tar.xz）后我们需要解压它。

**32位系统**

```
$ wget https://www.torproject.org/dist/torbrowser/4.0.4/tor-browser-linux32-4.0.4_en-US.tar.xz
$ tar xpvf tor-browser-linux32-4.0.4_en-US.tar.xz

```

**64位系统**

```
$ wget https://www.torproject.org/dist/torbrowser/4.0.4/tor-browser-linux64-4.0.4_en-US.tar.xz
$ tar -xpvf tor-browser-linux64-4.0.4_en-US.tar.xz

```

**注意** : 在上面的命令中，我们使用‘$‘意味着这个压缩包应以普通用户而不是root用户来解压。我们强烈建议您不要以root用户解压和运行Tor浏览器。

### 开始使用Tor浏览器

在成功的解压后，我们便可以将解压后的浏览器移动到任何地方/USB存储设备中。并从解压的文件夹以非root用户直接运行‘start-tor-browser’。

```
$ cd tor-browser_en-US
$ ./start-tor-browser

```

![开始使用Tor浏览器](/data/attachment/album/201507/07/234544xpl36y5alhzv73w3.jpg)

*开始使用Tor浏览器*

#### 1. 尝试连接到Tor网络

点击“连接”之后Tor将按照设置帮您做剩下的事情。\*\*

![连接到Tor网络](/data/attachment/album/201507/07/234547q8w7oafmlf7cae8a.jpg)

*连接到Tor网络*

#### 2. 欢迎窗口/标签。

![Tor欢迎界面](/data/attachment/album/201507/07/234552p6ln9huipw6ppk3w.png)

*Tor欢迎界面*

**3. 用Tor浏览器在Youtube上看视频**

![在Youtube上看视频](/data/attachment/album/201507/07/234556f5s4phu5si5izs1d.jpg)

*在Youtube上看视频*

#### 4. 打开银行网址以进行在线购物和交易

![浏览银行站点](/data/attachment/album/201507/07/234601iodcooo363oxh8pd.jpg)

*浏览银行站点*

#### 5. 浏览器显示我当前的代理IP

注意其中的文字为“Proxy Server detected”。\*\*

![检查IP地址](/data/attachment/album/201507/07/234606cnqu00n70s0ns709.jpg)

*检查IP地址*

**注意**: 每次您想运行Tor时，您需要在文本模式上运行Tor启动脚本。并且该终端在您运行Tor时会一直被占用。如何克服这些，并创建一个桌面/Dock栏图标呢？

#### 6. 我们需要在解压的文件夹中创建`tor.desktop`

$ touch tor.desktop

接着使用您喜欢的编辑器编辑这个文件，加入下面的文本，这里我使用nano。

```
$ nano tor.desktop

```

---

```
#!/usr/bin/env xdg-open
[Desktop Entry]
Encoding=UTF-8
Name=Tor
Comment=Anonymous Browse
Type=Application
Terminal=false
Exec=/home/avi/Downloads/tor-browser_en-US/start-tor-browser
Icon=/home/avi/Downloads/tor-browser_en-US/Browser/browser/icons/mozicon128.png
StartupNotify=true
Categories=Network;WebBrowser;

```

**注意**: 确保将上面的tor浏览器的路径替换为您的环境中的路径。

#### 7. 一旦搞定后，您就可以双击`tor.desktop`文件来运行Tor浏览器了

您可能需要在第一次运行时信任该文件。

![Tor应用启动器](/data/attachment/album/201507/07/234609yw3z2ce3w72wc2ry.jpg)

*Tor应用启动器*

#### 8. 一旦您选择了信任，请注意`tor.desktop`文件的图标则会改变

![Tor图标已改变](/data/attachment/album/201507/07/234611h2p4ecp8234x5444.jpg)

*Tor图标已改变*

#### 9. 您可以通过拖拽`tor.desktop`的图标在桌面和Dock栏中创建快捷方式

![在桌面添加Tor快捷方式](/data/attachment/album/201507/07/234613ipr7aas7salrc0up.jpg)

*在桌面添加Tor快捷方式*

#### 10. 关于Tor浏览器

![关于Tor浏览器](/data/attachment/album/201507/07/234618kv5bb1czvjcp8vjt.jpg)

*关于Tor浏览器*

**注意**: 如果您在使用旧版本的Tor，您可以从上面的窗口更新它。

#### 应用的可用性和领域

* 匿名使用网络。
* 浏览被封锁的页面。
* 连接其他应用，即（FTP）来保证网络安全的访问。

#### 关于Tor浏览器的争论

* 在Tor应用的边界上并没有什么安全措施。比如，数据入口点和出口点。
* 一项2011年的研究发现一种特殊的针对Tor浏览器的攻击可以得到BitTorrent用户的IP地址。
* 在一些研究中发现某些特定的协议有泄漏IP地址的倾向。
* 早些的Tor版本绑定了旧版本的Firefox浏览器，这被证明较易受JavaScript攻击。
* Tor浏览器运行起来比较慢。

#### 真实世界中Tor浏览器的实现

* [Vuze BitTorrent Client](http://www.tecmint.com/install-vuze-torrent-client-in-linux/)
* Anonymous Os
* Os’es from Scratch
* whonix 等

#### Tor浏览器的未来

Tor浏览器是前途无量的。也许第一个该类应用程序的实现是非常出色的，但Tor浏览器必须加大对支持、伸缩性、以及对近期的攻击进行数据安全的研究的投入。这个应用程序是未来的需要。

#### 下载免费的电子书

非官方的Tor私密浏览指南：

[![](/data/attachment/album/201507/07/234622wpzmhstts7ttbtmz.gif)](http://tecmint.tradepub.com/free/w_make129/prgm.cgi)

### 结论

如果您工作的部门不允许您访问某网站，或者如果您不希望别人知道您的私人事务，或您不想向NSA提供您的个人数字足迹，那么Tor浏览器在目前是必须的。

**注意**: Tor浏览器提供的安全性不能抵御病毒、木马或其他类似这样的安全威胁。写这篇文章的目的也不是希望通过在互联网上隐藏我们的身份来放纵非法活动。这篇文章纯粹是为了教学的目的，作者和Tecmint均不会为任何非法的使用负责。这是用户自己的责任。

Tor浏览器是一个非常不错的应用，您值得尝试！这就是我要说的全部了，我还会在这里写一些您感兴趣的文章，所以请继续关注。别忘了在留言区提供给我们您有价值的反馈。

---

via: <http://www.tecmint.com/tor-browser-for-anonymous-web-browsing/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[wwy-hust](https://github.com/wwy-hust) 校对：[wxy](https://github.com/wxy)

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


在 RHEL/CentOS 7.0 中安装 LAMP

Summary: 跳过 LAMP 的介绍，因为我认为你们大多数已经知道了。这个教程会集中在如何在升级到 Apache 2.4 的 Red Hat Enterprise Linux 7.0 和 CentOS 7.0 中安装和配置 LAMP：Linux、Apache、 MariaDB、 PHP/PhpMyAdmin。  在 RHEL/CentOS 7.0 中安装 LAMP 前置要求 根据使用的发行版是 RHEL 还是 CentOS 7.0，按照下面的链接来进行最小化的系统安装，网络使用静态 IP。 对于 RHEL 7.0  RHEL 7.0 安装过程 在 RHEL 7.0 中注册和启用订阅仓库  对于 CentOS 7.0  CentOS 7.0 安装过程  第一步：使用基本配置安装apache 1、在完成最小化系统安装，并

原文是国外的，phpmyadmin的源电信网不可用，不知道国内其他人有测试过没

跳过 LAMP 的介绍，因为我认为你们大多数已经知道了。这个教程会集中在如何在升级到 Apache 2.4 的 Red Hat Enterprise Linux 7.0 和 CentOS 7.0 中安装和配置 LAMP：Linux、Apache、 MariaDB、 PHP/PhpMyAdmin。

![Install LAMP in CentOS 7](/data/attachment/album/201507/09/235139hp3a3uac3ktkoadu.jpg)

*在 RHEL/CentOS 7.0 中安装 LAMP*

#### 前置要求

根据使用的发行版是 RHEL 还是 CentOS 7.0，按照下面的链接来进行最小化的系统安装，网络使用静态 IP。

**对于 RHEL 7.0**

* [RHEL 7.0 安装过程](http://www.tecmint.com/redhat-enterprise-linux-7-installation/)
* [在 RHEL 7.0 中注册和启用订阅仓库](http://www.tecmint.com/enable-redhat-subscription-reposiories-and-updates-for-rhel-7/)

**对于 CentOS 7.0**

* [CentOS 7.0 安装过程](http://www.tecmint.com/centos-7-installation/)

### 第一步：使用基本配置安装apache

1、在完成最小化系统安装，并[在 RHEL/CentOS 7.0 上配置静态 IP](/article-3977-1.html) 后，就可以使用下面的命令从官方仓库安装最新的 Apache 2.4 httpd 服务了。

```
# yum install httpd

```

![Install Apache in CentOS 7](/data/attachment/album/201507/09/235140r70bpb5vxbnpp8gd.png)

*安装 apache 服务*

2、安装完成后，使用下面的命令来管理apache守护进程，因为 RHEL 和 CentOS 7.0 都将 init 脚本从 SysV 升级到了systemd，所以同时你还可以使用 SysV 脚本和 Apache 脚本来管理服务。

```
# systemctl status|start|stop|restart|reload httpd
或者
# service httpd status|start|stop|restart|reload
或者
# apachectl configtest| graceful

```

![Start Apache in CentOS 7](/data/attachment/album/201507/09/235140yrpslfrzjar1gxfx.png)

*启动apache服务*

3、在使用 systemd 初始化脚本来启动 apache 服务后，要用 `firewall-cmd` 打开 RHEL/CentOS 7.0 防火墙规则， 这是通过 [firewalld](/article-4425-1.html) 守护进程管理 iptables 的默认命令。\*\*

```
# firewall-cmd --add-service=http

```

**注意**：上面的命令会在系统重启或者 firewalld 服务重启后失效，因为它是即时的规则，它不会永久生效。要使 iptables 规则在 fiewalld 中持久化，使用 `--permanent` 选项并重启 firewalld 服务来生效。（LCTT 译注：也可以不重启 firewalld 服务，而是再执行一遍不带 `--permanent` 选项的命令。）

```
# firewall-cmd --permanent --add-service=http
# systemctl restart firewalld

```

![Enable Firewall in CentOS 7](/data/attachment/album/201507/09/235142dikwijwwvidimkj7.png)

*在 CentOS 7 中启用防火墙*

下面是 firewalld 其他的重要选项：

```
# firewall-cmd --state
# firewall-cmd --list-all
# firewall-cmd --list-interfaces
# firewall-cmd --get-service
# firewall-cmd --query-service service_name
# firewall-cmd --add-port=8080/tcp

```

4、要验证 apache 的功能，打开一个远程浏览器并使用 http 协议访问你服务器的 IP 地址(http://server\_IP)， 应该会显示下图中的默认页面。

![Apache Default Page](/data/attachment/album/201507/09/235144ogrj7wwwmdw9g51x.png)

*Apache 默认页*

5、现在 apache 的根地址在 `/var/www/html`，该目录中没有提供任何索引文件。如果你想要看见根目录下的文件夹列表，打开 apache 欢迎配置文件并设置 `<LocationMach>` 下 `Indexes` 前的状态从`-`到`+`，下面的截图就是一个例子。

```
# nano /etc/httpd/conf.d/welcome.conf

```

![Apache Directory Listing](/data/attachment/album/201507/09/235145kjxaj9x3rutt3uwr.png)

*Apache 目录列出*

6、关闭文件，重启 apache 服务来使设置生效，重载页面来看最终效果。

```
# systemctl restart httpd

```

![Apache Index File](/data/attachment/album/201507/09/235146frba0arvva4znuqb.png)

*Apache 索引文件*

### 第二步：为 Apache 安装 php5 支持

7、在为 apache 安装 php 支持之前，使用下面的命令的得到所有可用的php模块和扩展。

```
# yum search php

```

![Install PHP in CentOS 7](/data/attachment/album/201507/09/235149ky3itc4clp1gtg4a.png)

在 CentOS 7 上安装 PHP\*

8、根据你所要使用的应用类型，安装上述列表中所需的 PHP 模块。对于 PHP 中的基本的 MariaDB 支持和 PhpMyAdmin，你需要安装如下模块。

```
# yum install php php-mysql php-pdo php-gd php-mbstring

```

![Install PHP Modules in CentOS 7](/data/attachment/album/201507/09/235151ukrvdtdcrc2d3j3t.png)

*安装 PHP 模块*

![Install PHP mbstring Module](/data/attachment/album/201507/09/235155qo893e3k88xzv00p.png)

*安装 PHP mbstring 模块*

9、 要在你的浏览器上显示 PHP 的全部信息，用 root 账号执行如下命令在 Apache 的文档根目录下创建一个 `info.php` 文件，然后重启 httpd 服务，并在你的浏览器里面访问 http://server\_IP/info.php 。

```
# echo "<?php phpinfo(); ?>" > /var/www/html/info.php
# systemctl restart httpd

```

![Check PHP Info in CentOS 7](/data/attachment/album/201507/09/235156q48g5166tmg4zrtr.png)

*查看 CentOS 7 上的 PHP 信息*

10、如果你得到一个 PHP 的日期和时区错误，打开配置文件 `php.ini`，取消 `date.timezone` 语句的注释，加上你的实际时区参数，然后重启 Apache 守护进程。

```
# nano /etc/php.ini

```

找到并如下修改`date.timezone`，参考 [PHP 支持的时区列表](http://php.net/manual/en/timezones.php)。（LCTT 译注：对于中国，可以使用 Asia/Shanghai、Asia/Chongqing 等，但是不建议使用向后兼容而保留的 PRC。）

```
date.timezone = Continent/City

```

![Set Timezone in PHP](/data/attachment/album/201507/09/235159fwyj0ty2nl27ssdq.png)

*设置 PHP 的时区*

### 第三步：安装和配置 MariaDB 数据库

11、 Red Hat Enterprise Linux/CentOS 7.0 使用 MariaDB 替换 MySQL 为默认数据库管理系统。使用如下命令安装 MariaDB 数据库。

```
# yum install mariadb-server mariadb

```

![Install MariaDB in CentOS 7](/data/attachment/album/201507/09/235201wwvwvpxm176kvmxl.png)

*在 CentOS 7中安装 MariaDB*

12、安装 MariaDB 后，启动数据库守护进程并使用 mysql*secure*installation 脚本来保护数据库（设置数据库的 root 密码、禁止远程 root 登录、移除测试数据库、移除匿名用户等）。

```
# systemctl start mariadb
# mysql_secure_installation

```

![Start MariaDB Database](/data/attachment/album/201507/09/235204olf6gfczfklecjtt.png)

*启动 MariaDB 数据库*

![Secure MySQL Installation](/data/attachment/album/201507/09/235205jvubttfa0url0003.png)

*MariaDB 安全设置*

13、要测试数据库功能，使用 root 账户登录 MariaDB 并用 quit 退出。

```
mysql -u root -p
MariaDB > SHOW VARIABLES;
MariaDB > quit

```

![Connect MySQL Database in CentOS](/data/attachment/album/201507/09/235207w8r2scbsc4b2ccs8.png)

*连接 MariaDB 数据库*

### 第四步：安装 PhpMyAdmin

14、 RHEL 7.0 或者 CentOS 7.0 仓库默认没有提供 PhpMyAdmin 二进制安装包。如果你不适应使用 MySQL 命令行来管理你的数据库，你可以通过下面的命令启用 CentOS 7.0 rpmforge 仓库来安装 PhpMyAdmin。

```
# yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

```

启用 rpmforge 仓库后，下面安装 PhpMyAdmin。

```
# yum install phpmyadmin

```

![Enable RPMForge in CentOS 7](/data/attachment/album/201507/09/235209ley142yklt1bigb4.png)

*启用 RPMForge 仓库*

15、下面配置 PhpMyAdmin 的 `phpmyadmin.conf` 来允许远程连接，它位于 Apache 的 `conf.d` 目录下，并注释掉下面的行。

```
# nano /etc/httpd/conf.d/phpmyadmin.conf

```

使用#来注释掉下列行。

```
# Order Deny,Allow
# Deny from all
# Allow from 127.0.0.1

```

![Allow Remote PhpMyAdmin Access](/data/attachment/album/201507/09/235210svavv1sz2qvewh91.png)

*允许远程 PhpMyAdmin 访问*

16、 要使用 cookie 验证来登录 PhpMyAdmin，像下面的截图那样使用[生成的秘密字符串](http://www.question-defense.com/tools/phpmyadmin-blowfish-secret-generator)来添加一个 blowfish 字符串到 `config.inc.php` 文件中，重启 apache 服务并打开 URL：http://server\_IP/phpmyadmin/。

```
# nano /etc/httpd/conf.d/phpmyadmin.conf
# systemctl restart httpd

```

![Add Blowfish in PhpMyAdmin](/data/attachment/album/201507/09/235213zqszo9ipqy677q67.png)

*在 PhpMyAdmin 中添加 Blowfish*

![PhpMyAdmin Dashboard](/data/attachment/album/201507/09/235216j0hohh2m82gj82aw.png)

*PhpMyAdmin 面板*

### 第五步：在系统范围内启用 LAMP

17、 如果你需要在重启后自动运行 MariaDB 和 Apache 服务，你需要在系统级地启用它们。

```
# systemctl enable mariadb
# systemctl enable httpd

```

![Enable Services System Wide](/data/attachment/album/201507/09/235217i9chiwom8thjmijo.png)

*系统级启用服务*

这就是在 Red Hat Enterprise 7.0 或者 CentOS 7.0 中安装 LAMP 的过程。在 CentOS/RHEL 7.0 上关于 LAMP 的系列文章接下来将会讨论在 Apache 中创建虚拟主机，生成 SSL 证书、密钥和添加 SSL 事务支持。

---

via: <http://www.tecmint.com/install-lamp-in-centos-7/>

作者：[Matei Cezar](http://www.tecmint.com/author/cezarmatei/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


Linus Torvalds说那些对人工智能奇点深信不疑的人显然磕了药

Summary: 像往常一样, 他的评论不能只看字面意思  人工智能是一个非常热门的话题，许多高端人士，包括特斯拉的CEO埃隆马斯克就曾表示有情感的人工智能技术即将到来，同时这一技术将发展到危险的门槛上。不过Linus Torvalds显然不这么认为，他认为那只是差劲的科幻小说。 人工智能激发了人们的创造力已经不是什么新鲜的想法了，不过近段时间关于所谓的人工智能奇点的讨论，引起了诸如埃隆马斯克和斯蒂芬霍金表示关心，认为可能会创造出一个怪兽。不只是他们，论坛和评论部分充斥着杞人忧天者，他们不知道该相信谁，或是哪个提出建议的人更聪明。 事

Linus Torvalds表示：我搞了那么久都没把人工智能弄出来，你们瞎BB什么呢！

我也不相信人工智能。人类到现在对思维可以说是一无所知，也就能算算数学题，思维是上帝创造的。

创造一个自己的都搞不清怎么运转的东西=_= |||

除非哪个程序员一不小心给代码注入了灵魂

有道理

灵魂那么高尚的东西，不会是bug吧。。。

*像往常一样, 他的评论不能只看字面意思*

![](/data/attachment/album/201507/10/111001x6mycc8j1y8qc1c7.jpg)

**人工智能是一个非常热门的话题，许多高端人士，包括特斯拉的CEO埃隆·马斯克就曾表示有情感的人工智能技术即将到来，同时这一技术将发展到危险的门槛上。不过Linus Torvalds显然不这么认为，他认为那只是差劲的科幻小说。**

人工智能激发了人们的创造力已经不是什么新鲜的想法了，不过近段时间关于所谓的人工智能奇点的讨论，引起了诸如埃隆·马斯克和斯蒂芬·霍金表示关心，认为可能会创造出一个怪兽。不只是他们，论坛和评论部分充斥着杞人忧天者，他们不知道该相信谁，或是哪个提出建议的人更聪明。

事实证明Linux项目创始人Linus Torvalds在这件事上显然有完全不同的观点。他说事实上什么都不会发生，我们也更有理由相信他。人工智能意需要有人编写它的代码，Linus知道编写人工智能代码会遇到的阻力和障碍。他很有可能已经猜到了什么会被涉及到，并且明白为什么人工智能不会成为威胁。

### Linus Torvalds与人工智能

Linus Torvalds在[slashdot.org](http://classic.slashdot.org/story/15/06/30/0058243)上回答了一些社区中的问题，他的所有观点都十分有趣。他曾对[游戏的未来和Valve](http://news.softpedia.com/news/linus-torvalds-said-valve-is-exploring-a-second-source-against-microsoft-486266.shtml)发表看法，就像这次关于人工智能一样。虽然他经常是关注一些关于内核和开源的问题，但是他在其他部分也有自己的见解。事实是作为一个问题，人工智能工程是一个他可以从程序员的角度讨论的问题。

“所以我期待更多有针对性的（和相当棒的）AI，而不是它有多像人。像语言识别、模式识别，这样的东西。我根本找不出在你洗碗的时候，洗碗机和你讨论Sartre（萨特，法国哲学家、小说家、剧作家）有什么危害。真的有‘奇点’这种事吗？是的，我认为那只是科幻小说，还不是好的那种。无休止的指数增长？我说，真的！这些人嗑了什么药了吧？” Linus在Slashdot写道。

选择相信埃隆·马斯克还是Linus是你的决定，但如果我卷入了这场赌局，我会把钱投给Linus。

---

via: <http://news.softpedia.com/news/linus-torvalds-says-people-who-believe-in-an-ai-singularity-are-on-drugs-486373.shtml>

作者：[Silviu Stahie](http://news.softpedia.com/editors/browse/silviu-stahie) 译者：[martin2011qi](https://github.com/martin2011qi) 校对：[wxy](https://github.com/wxy)

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


时隔两年，Oracle VirtualBox 5.0 正式版发布

Summary: 我们很高兴的宣布，Oracle VMVirtualBox 5.0 发布了！  此版本包含了重大改进和大量的增强及错误修复，具体可详见官方的发布公告。Oracle VM VirtualBox 5.0 中的全部功能的说明请参见这里。 这里只强调一些新的功能 对新版本的 Windows 和 Linux 客户机的半虚拟化支持 Oracle VM VirtualBox 能够为软件的有效执行而提供半虚拟化接口。当设置一个虚拟机平台时，Oracle VM VirtualBox 可通过内置的虚拟化支持（Linux 客户机上的 KVM，Windows 客户机的 Hyper-V）提升客户机性能。 支持 USB 3.0 设备的 xHCI 控制器 客户机操作系统现在可以

为什么我今天安装的没有Start的三个选项？我是xubuntu14.04直接下的64位DEB包。虚拟机中安装的Debian8.10。<br />
原来是安装的时候没有，安装完成以后，还是有这三个选项的。心急吃不了热豆腐呀～

图标变丑了 =_= |||

我也从Ubuntu转到Xubuntu 14.04.2 LTS下了<br />
我觉得LXC / Docker更好玩，玩Linux肯定没问题吧？

唉

不管LINUX是内核也好，框架也好。。。。。。反正我就是当是个平台，能完成我所做的事情就好了。GNOME和KDE都感觉太。。。。。。还是简单点好～不折腾

我们很高兴的宣布，Oracle VM VirtualBox 5.0 发布了！

![](/data/attachment/album/201507/10/212742mqwct7e4zgacbv5t.jpg)

此版本包含了重大改进和大量的增强及错误修复，具体可详见官方的[发布公告](https://www.oracle.com/corporate/pressrelease/oracle-vm-virtualbox-5-070915.html)。Oracle VM VirtualBox 5.0 中的全部功能的说明请参见[这里[PDF]](http://www.oracle.com/us/technologies/virtualization/oraclevm/oracle-vm-virtualbox-ds-1655169.pdf)。

### 这里只强调一些新的功能

#### 对新版本的 Windows 和 Linux 客户机的半虚拟化支持

Oracle VM VirtualBox 能够为软件的有效执行而提供半虚拟化接口。当设置一个虚拟机平台时，Oracle VM VirtualBox 可通过内置的虚拟化支持（Linux 客户机上的 KVM，Windows 客户机的 Hyper-V）提升客户机性能。

#### 支持 USB 3.0 设备的 xHCI 控制器

客户机操作系统现在可以直接识别 USB 3.0 设备，并支持 3.0 设备的全速操作。客户机可以配置使用 USB 1.1、2.0 和 3.0 设备。

#### 改进的拖放支持

从 Oracle VM VirtualBox 5.0 开始，我们改进了客户机和宿主操作系统之间的双向拖放支持；可以安装最新的客户机附件来支持拖放功能。

#### 磁盘镜像加密

Oracle VM VirtualBox 5.0 可以在 XTS 模式（128 位或 256 位）下使用 AES 算法来加密虚拟磁盘镜像；因为 DEK 存储在虚拟机配置文件中，所以加密功能的引入带来了在启动虚拟机之前输入密码的安全功能。

![](/data/attachment/album/201507/10/211111vn3883zasenv9aes.png)

#### 无界面启动和可分离启动选项

Oracle VM VirtualBox 现在支持在后台启动虚拟机，分离的前端进程可以关闭，而虚拟机会继续运行。

![](/data/attachment/album/201507/10/211129hnf7dp7dnfdne74e.png)

更多的 GUI 改进：

* 客户机内容（guest-content）缩放支持（包括3D 加速）
* 新的用户界面设置包括定制状态条、菜单栏和客户机内容缩放
* 新的加密设置页可定制磁盘镜像的加密选项
* HiDPI 支持，包括在 Mac OS X 上的应用图标和可选的非缩放 HiDPI 输出（包括3D 加速）
* 对 SATA 磁盘的热插拔支持
* 改进的 Mac 和 Windows 宿主机上的 HID LED 同步
* 在账户的预览窗口中以同等尺寸比例显示客户机屏幕
* 在虚拟机选择器里可以直接访问存储介质

如希望了解更多细节，请参考官方的 Oracle VM VirtualBox 5.0 [资料表](http://www.oracle.com/us/technologies/virtualization/oraclevm/oracle-vm-virtualbox-ds-1655169.pdf)， [用户手册](http://download.virtualbox.org/virtualbox/5.0.0/UserManual.pdf) 和 [virtualbox.org](https://www.virtualbox.org/) 网站。

### 下载

[![](/data/attachment/album/201507/10/212746rpwc8z0g35bbcpxw.png)](https://www.virtualbox.org/wiki/Downloads)

* **VirtualBox 软件包。**这些二进制的发布许可协议是 GPL v2
	+ **VirtualBox 5.0 for Windows hosts**  [x86/amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Win.exe)
	+ **VirtualBox 5.0 for OS X hosts**  [x86/amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-OSX.dmg)
	+ **[VirtualBox 5.0 for Linux hosts](https://www.virtualbox.org/wiki/Linux_Downloads)**
		- Ubuntu 14.04 ("Trusty") / 14.10 ("Utopic") / 15.04 ("Vivid")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~trusty_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~trusty_amd64.deb)
		- Ubuntu 12.04 LTS ("Precise Pangolin")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~precise_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Ubuntu~precise_amd64.deb)
		- Debian 8 ("Jessie")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~jessie_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~jessie_amd64.deb)
		- Debian 7 ("Wheezy")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~wheezy_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~wheezy_amd64.deb)
		- Debian 6 ("Squeeze")  [i386](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~squeeze_i386.deb) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/virtualbox-5.0_5.0.0-101573~Debian~squeeze_amd64.deb)
		- openSUSE 13.2  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE132-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE132-1.x86_64.rpm)
		- openSUSE 13.1  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE131-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE131-1.x86_64.rpm)
		- openSUSE 12.3  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE123-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_openSUSE123-1.x86_64.rpm)
		- SUSE Linux Enterprise Server 11 (SLES11)  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_sles11.0-1.i586.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_sles11.0-1.x86_64.rpm)
		- Fedora 22  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora22-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora22-1.x86_64.rpm)
		- Fedora 18 ("Spherical Cow") / 19 ("Schrödingers Cat") / 20 ("Heisenbug") / 21  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora18-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_fedora18-1.x86_64.rpm)
		- Oracle Linux 7 ("OL7") / Red Hat Enterprise Linux 7 ("RHEL7") / CentOS 7  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el7-1.x86_64.rpm)
		- Oracle Linux 6 ("OL6") / Red Hat Enterprise Linux 6 ("RHEL6") / CentOS 6  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el6-1.i686.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el6-1.x86_64.rpm)
		- Oracle Linux 5 ("OL5") / Red Hat Enterprise Linux 5 ("RHEL5") / CentOS 5  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el5-1.i386.rpm) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0-5.0.0_101573_el5-1.x86_64.rpm)
		- All distributions  [i386](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Linux_x86.run) |  [AMD64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-Linux_amd64.run)
	+ **VirtualBox 5.0 for Solaris hosts**  [amd64](http://download.virtualbox.org/virtualbox/5.0.0/VirtualBox-5.0.0-101573-SunOS.tar.gz)

* **VirtualBox 5.0 Oracle VM VirtualBox Extension Pack**  [All supported platforms](http://download.virtualbox.org/virtualbox/5.0.0/Oracle_VM_VirtualBox_Extension_Pack-5.0.0-101573.vbox-extpack)


LFS 中文版手册发布：如何打造自己的 Linux 发行版

Summary: 您是否想过打造您自己的 Linux 发行版？每个 Linux 用户在他们使用 Linux 的过程中都想过做一个他们自己的发行版，至少一次。我也不例外，作为一个 Linux 菜鸟，我也考虑过开发一个自己的 Linux 发行版。从头开发一个 Linux 发行版这件事情被称作 Linux From Scratch （LFS）。  在开始之前，我总结了一些有关 LFS 的内容，如下： 1. 那些想要打造他们自己的 Linux 发行版的人应该了解打造一个 Linux 发行版（打造意味着从头开始）与配置一个已有的 Linux 发行版的不同 如果您只是想调整下启动屏幕、定制登录页面以及拥有更好的外观和使用

这个必须好顶赞

有没有下载翻译版的地址？

翻译团队辛苦啦，32个赞！！

制作上传中——目前 PDF 版本遇到问题了。

这个必须来32个赞~

大赞！

必须大赞，期待可下载版，话说FHS也翻译下吧！！！！

已经有了下载的 PDF 和 CHM 啦，去看看吧。。。FHS 。。。这个。。

刚刚放上了。敬请下载。

谢谢

缅怀一下逝去的linuxsir...

awsome

非常感谢翻译了最新的LFS 7.7，希望可以继续翻译BLFS 7.7。毕竟LFS只是用来构建一个基础系统，有BLFS会完善很多。

压力好大——希望更多的人来参与。

有翻译版本了 找了好久终于找到了 谢谢

LCTT辛苦了！

很感谢这些翻译工作人员，谢谢你们的辛苦劳动~！

我在编译Kmod时出错了

gcc: error: /usr/lib/liblzma.so: No such file or directory

ldd /usr/lib/liblzma.so

显示ldd: /usr/lib/liblzma.so: No such file or directory

要怎么解决呢

liblzma.so是在编译xz软件时生成的，make install后，会有如下动作：

============================

mv -v /usr/lib/liblzma.so.* /lib

ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so

=============================

第二句的链接要注意不要含有中文字符，我当时也是有这个问题，后来从英文LFS拷贝这两行后再运行就OK了！

成功后可以查看下链接是否正常：

=============================

root:/src/kmod-19# ls -l /usr/lib | grep liblzma

-rw-r--r-- 1 root root  1407116 Oct  9 07:12 liblzma.a

-rwxr-xr-x

来自陕西西安的 Microsoft Edge 12.10240|Windows 10 用户

=============================

root:/src/kmod-19# ls -l /usr/lib | grep liblzma

-rw-r--r-- 1 root root  1407116 Oct  9 07:12 liblzma.a

-rwxr-xr-x 1 root root      919 Oct  9 07:12 liblzma.la

lrwxrwxrwx 1 root root       26 Oct  9 08:09 liblzma.so -> ../../lib/liblzma.so.5.2.0

root:/src/kmod-19#

=============================

另外，别忘了重新configure再make，然后就OK了。

这是那一节的内容？请告诉我，或者到 github 上提交 PR 补丁吧：https://github.com/LCTT/LFS-BOOK-7.7-systemd 谢谢！

谢谢，找到了，xz 一节有错误的中文括号，已经修正 github 版本库了。

太感谢了，话不多说，辛苦了！

谢谢！

正在翻译7.8，欢迎愿意参与翻译的，对 LFS 和 Linux 有了解的同学加入。

有非systemd版本的中文手册吗？

没有翻译

已经按照书本在做编译了，总是出错，已经接近崩溃了！！！！

您是否想过打造您自己的 Linux 发行版？每个 Linux 用户在他们使用 Linux 的过程中都想过做一个他们自己的发行版，至少一次。我也不例外，作为一个 Linux 菜鸟，我也考虑过开发一个自己的 Linux 发行版。从头开发一个 Linux 发行版这件事情被称作 Linux From Scratch （LFS）。

![](/data/attachment/album/201507/12/225059cu9e537ir33ikeru.jpg)

在开始之前，我总结了一些有关 LFS 的内容，如下：

**1. 那些想要打造他们自己的 Linux 发行版的人应该了解打造一个 Linux 发行版（打造意味着从头开始）与配置一个已有的 Linux 发行版的不同**

如果您只是想调整下启动屏幕、定制登录页面以及拥有更好的外观和使用体验。您可以选择任何一个 Linux 发行版并且按照您的喜好进行个性化配置。此外，有许多配置工具可以帮助您。

如果您想打包所有必须的文件、引导加载器和内核，并选择什么该被包括进来，然后依靠自己编译这一切东西。那么您需要的就是 Linux From Scratch （LFS）。

**注意**：如果您只想要定制 Linux 系统的外表和体验，这个指南并不适合您。但如果您真的想打造一个 Linux 发行版，并且向了解怎么开始以及一些其他的信息，那么这个指南正是为您而写。

**2. 打造一个 Linux 发行版（LFS）的好处**

* 您将了解 Linux 系统的内部工作机制
* 您将开发一个灵活的适应您需求的系统
* 您开发的系统（LFS）将会非常紧凑，因为您对该包含/不该包含什么拥有绝对的掌控
* 您开发的系统（LFS）在安全性上会更好

**3. 打造一个Linux发行版（LFS）的坏处**

打造一个 Linux 系统意味着将所有需要的东西放在一起并且编译之。这需要许多查阅、耐心和时间。而且您需要一个可用的 Linux 系统和足够的磁盘空间来打造 LFS。

**4. 有趣的是，Gentoo/GNU Linux 在某种意义上最接近于 LFS。Gentoo 和 LFS 都是完全从源码编译的定制的 Linux 系统**

**5. 您应该是一个有经验的Linux用户，对编译包、解决依赖有相当的了解，并且是个 shell 脚本的专家。**

了解一门编程语言（最好是 C 语言）将会使事情变得容易些。但哪怕您是一个新手，只要您是一个优秀的学习者，可以很快的掌握知识，您也可以开始。最重要的是不要在 LFS 过程中丢失您的热情。

如果您不够坚定，恐怕会在 LFS 进行到一半时放弃。

\*\*6. 现在您需要一步一步的指导来打造一个 Linux 。LFS 手册是打造 LFS 的官方指南。我们的合作站点 tradepub 也为我们的读者制作了 LFS 的指南，这同样是免费的。 ###

您可以从下面的链接下载 Linux From Scratch 的电子书：

[![](/data/attachment/album/201507/12/225214g6bmigjednbu4fbb.gif)](http://tecmint.tradepub.com/free/w_linu01/prgm.cgi)

下载: [Linux From Scratch](http://tecmint.tradepub.com/free/w_linu01/prgm.cgi)

**7. 当前 LFS 的版本是 7.7，分为 systemd 版本和非 systemd 版本。**

LFS 的官方网站是： <http://www.linuxfromscratch.org/>

您可以在官网在线浏览 LFS 以及类似 BLFS 这样的相关项目的手册，也可以下载不同格式的版本。

* LFS （非 systemd 版本）：
	+ PDF 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7.pdf>
	+ 单一 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7-NOCHUNKS.html>
	+ 打包的多页 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-7.7.tar.bz2>
* LFS （systemd 版本）：
	+ PDF 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd.pdf>
	+ 单一 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd-NOCHUNKS.html>
	+ 打包的多页 HTML 版本： <http://www.linuxfromscratch.org/lfs/downloads/7.7-systemd/LFS-BOOK-7.7-systemd.tar.bz2>

**8. Linux 中国/LCTT 翻译了一份 LFS 手册（7.7，systemd 版本）**

经过 LCTT 成员的努力，我们终于完成了对 LFS 7.7 systemd 版本手册的翻译。

手册在线访问地址：<https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html> 。

CHM 版本： <https://img.linux.net.cn/lfs/LFS-BOOK-7.7-systemd.chm>

PDF 版本： <https://img.linux.net.cn/lfs/LFS-BOOK-7.7-systemd.pdf>

其它格式的版本稍后推出。

感谢参与翻译的成员： wxy, ictlyh, dongfengweixiao, zpl1025, H-mudcup, Yuking-net, kevinSJ 。

### 关于：Linux From Scratch

这本手册是由 LFS 的项目领头人 Gerard Beekmans 创作的， Matthew Burgess 和 Bruse Dubbs 参与编辑，两人都是LFS 项目的联合领导人。这本书内容很广泛，有 338 页之多。

手册中内容包括：介绍 LFS、准备构建、构建 LFS、建立启动脚本、使 LFS 可以引导，以及附录。其中涵盖了您想知道的 LFS 项目中的所有东西。

这本手册还给出了编译一个包的预估时间。预估的时间以编译第一个包的时间作为参考。所有的东西都以易于理解的方式呈现，甚至对于新手来说也是这样。

如果您有充裕的时间并且真正对构建自己的 Linux 发行版感兴趣，那么您绝对不会错过下载这个电子书（免费下载）的机会。您需要做的，便是照着这本手册在一个工作的 Linux 系统（任何 Linux 发行版，足够的磁盘空间即可）中开始构建您自己的 Linux 系统，付出时间和热情。

如果 Linux 使您着迷，如果您想自己动手构建一个自己的 Linux 发行版，这便是现阶段您应该知道的全部了，其他的信息您可以参考上面链接的手册中的内容。

请让我了解您阅读/使用这本手册的经历，这本详尽的 LFS 指南的使用是否足够简单？如果您已经构建了一个 LFS 并且想给我们的读者一些建议，欢迎留言和反馈。

---

via: <http://www.tecmint.com/create-custom-linux-distribution-from-scratch/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[wwy-hust](https://github.com/wwy-hust) 校对：[wxy](https://github.com/wxy)

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


lolcat ：一个在 Linux 终端中输出彩虹特效的命令行工具

Summary: 那些相信 Linux 命令行是单调无聊且没有任何乐趣的人们，你们错了，这里有一些有关 Linux 的文章，它们展示着 Linux 是如何的有趣和淘气 。  Linux命令及Linux终端的20个趣事 终端中的乐趣：6个有趣的Linux命令行工具 Linux终端的乐趣之把玩字词计数  在本文中，我将讨论一个名为lolcat的小工具  它可以在终端中生成彩虹般的颜色。  为终端生成彩虹般颜色的输出的 Lolcat 命令 何为 lolcat ? Lolcat 是一个针对 Linux，BSD 和 OSX 平台的工具，它类似于 cat 命令，并为 cat 的输出添加彩虹般的色彩。 Lolcat 主要用于在 Linux 终端中为文

感觉在linux.cn上这个东西已经看见过不下五次了。。。。

我敢打赌，顶多三次——因为我只记得两次。。汗

请问下楼主，我看到你用的终端颜色配置，其中，命令行本身，如 apt-get、yum、alias等都有颜色，请问下要怎么配置呢！！！

越多越好，喜欢喜欢，这是Linux新手的动力啊。O(∩_∩)O

按照文章的方法去安装，是不行的？？？？<br />
谁知道怎么用yum安装

楼主是不会告诉你这些高端操作的

那些相信 Linux 命令行是单调无聊且没有任何乐趣的人们，你们错了，这里有一些有关 Linux 的文章，它们展示着 Linux 是如何的有趣和“淘气” 。

* [Linux命令及Linux终端的20个趣事](/article-2831-1.html)
* [终端中的乐趣：6个有趣的Linux命令行工具](/article-4128-1.html)
* [Linux终端的乐趣之把玩字词计数](/article-4088-1.html)

在本文中，我将讨论一个名为“lolcat”的小工具 – 它可以在终端中生成彩虹般的颜色。

![为终端生成彩虹般颜色的输出的 Lolcat 命令](/data/attachment/album/201507/12/233817ti7ujuuu3t257es5.png)

*为终端生成彩虹般颜色的输出的 Lolcat 命令*

#### 何为 lolcat ?

Lolcat 是一个针对 Linux，BSD 和 OSX 平台的工具，它类似于 [cat 命令](http://www.tecmint.com/13-basic-cat-command-examples-in-linux/)，并为 `cat` 的输出添加彩虹般的色彩。 Lolcat 主要用于在 Linux 终端中为文本添加彩虹般的色彩。

### 在 Linux 中安装 Lolcat

**1. Lolcat 工具在许多 Linux 发行版的软件仓库中都可获取到，但可获得的版本都有些陈旧，而你可以通过 git 仓库下载和安装最新版本的 lolcat。**

由于 Lolcat 是一个 ruby gem 程序，所以在你的系统中必须安装有最新版本的 RUBY。

```
# apt-get install ruby      [在基于 APT 的系统中]
# yum install ruby          [在基于 Yum 的系统中]
# dnf install ruby          [在基于 DNF 的系统中]

```

一旦 ruby 软件包安装成功，请确保验证安装的 ruby 的版本。

```
# ruby --version

ruby 2.1.5p273 (2014-11-13) [x86_64-linux-gnu]

```

**2. 接着使用下面的命令来从 lolcat 的 git 仓库中下载和安装最新版本的 lolcat。**

```
# wget https://github.com/busyloop/lolcat/archive/master.zip
# unzip master.zip
# cd lolcat-master/bin
# gem install lolcat

```

一旦 lolcat 安装后，你可以检查它的版本号。

```
# lolcat --version

lolcat 42.0.99 (c)2011 moe@busyloop.net

```

### Lolcat 的用法

**3. 在开始使用 lolcat 之前，使用下面的命令来了解它可用的选项和其帮助文档。**

```
# lolcat -h

```

![Lolcat 的帮助文档](/data/attachment/album/201507/12/233818tb261kz6h1k6mz1r.png)

*Lolcat 的帮助文档*

**4. 接着, 通过管道连接 lolcat 和其他命令，例如 ps, date 和 cal:**

```
# ps | lolcat
# date | lolcat
# cal | lolcat

```

![ps 命令的输出](/data/attachment/album/201507/12/233818rjrol0uoro9r9jtm.png)

*ps 命令的输出*

![Date 的输出](/data/attachment/album/201507/12/233819vrz5h2l5o5lgz75k.png)

*Date 的输出*

![Calendar 的输出](/data/attachment/album/201507/12/233819jz0lczc97rc2uwcl.png)

*Calendar 的输出*

**5. 使用 lolcat 来展示一个脚本文件的代码:**

```
# lolcat test.sh

```

![用 lolcat 来展示代码](/data/attachment/album/201507/12/233821mjgssa2sh8j08xhx.png)

*用 lolcat 来展示代码*

**6. 通过管道连接 lolcat 和 figlet 命令。Figlet 是一个展示由常规的屏幕字符组成的巨大字符串的应用。我们可以通过管道将 figlet 的输出连接到 lolcat 中来展示出如下的多彩输出:**

```
# echo I ❤ Tecmint | lolcat
# figlet I Love Tecmint | lolcat

```

![多彩的文字](/data/attachment/album/201507/12/233822gjm7mvsxyag7qgj3.png)

*多彩的文字*

**注**: 注意， ❤ 是一个 unicode 字符。要安装 figlet，你需要像下面那样使用 yum 和 apt 来得到这个软件包:

```
# apt-get figlet
# yum install figlet
# dnf install figlet

```

**7. 给文本赋予彩虹颜色的动画:**

```
$ echo I ❤ Tecmit | lolcat -a -d 500

```

![动的文本](/data/attachment/album/201507/12/233823jehnp3kpni8z9pzm.gif)

*动的文本*

这里选项 `-a` 指的是 Animation(动画)， `-d` 指的是 duration(持续时间)。在上面的例子中，持续 500 次动画。

**8. 在彩虹般的颜色下阅读 man 页(例如 `man ls`):**

```
# man ls | lolcat

```

![多彩地显示文件](/data/attachment/album/201507/12/233824jka0omoajr6o0mj6.png)

*多彩地显示文件*

**9. 通过管道连接 lolcat 和 cowsay。cowsay 是一个可配置的正在思考或说话的奶牛，这个程序也支持其他的动物。**

使用下面的命令来安装 cowsay :

```
# apt-get cowsay
# yum install cowsay
# dnf install cowsay

```

安装后，使用下面的命令来显示在 cowsay 中的所有动物：

```
# cowsay -l

```

**样例输出**

```
Cow files in /usr/share/cowsay/cows:
apt beavis.zen bong bud-frogs bunny calvin cheese cock cower daemon default
dragon dragon-and-cow duck elephant elephant-in-snake eyes flaming-sheep
ghostbusters gnu head-in hellokitty kiss kitty koala kosh luke-koala
mech-and-cow meow milk moofasa moose mutilated pony pony-smaller ren sheep
skeleton snowman sodomized-sheep stegosaurus stimpy suse three-eyes turkey
turtle tux unipony unipony-smaller vader vader-koala www

```

通过管道连接 lolcat 和 cowsay 后的输出，并且使用了‘gnu’形象的 cowfile。

```
# cowsay -f gnu ☛ Tecmint ☚ is the best Linux Resource Available online | lolcat

```

![使用 Lolcat 的 Cowsay](/data/attachment/album/201507/12/233824aum0w02gxuk4d6dz.png)

*使用 Lolcat 的 Cowsay*

**注**: 你可以在将 lolcat 和其他任何命令用管道连接起来在终端中得到彩色的输出。

**10. 你可以为最常用的命令创建别名来使得命令的输出呈现出彩虹般的色彩。你可以像下面那样为 ‘ls -l‘ 命令创建别名，这个命令输出一个目录中包含内容的列表。**

```
# alias lolls="ls -l | lolcat"
# lolls

```

![多彩的 Alias 命令](/data/attachment/album/201507/12/233825jl9mg6o8ga5walpm.png)

*多彩的 Alias 命令*

你可以像上面建议的那样，为任何命令创建别名。为了使得别名永久生效，你需要添加相关的代码(上面的代码是 ls -l 的别名) 到 ~/.bashrc 文件中，并登出后再重新登录来使得更改生效。

现在就是这些了。我想知道你是否曾经注意过 lolcat 这个工具？你是否喜欢这篇文章？欢迎在下面的评论环节中给出你的建议和反馈。喜欢并分享我们，帮助我们传播。

---

via: <http://www.tecmint.com/lolcat-command-to-output-rainbow-of-colors-in-linux-terminal/>

作者：[Avishek Kumar](http://www.tecmint.com/author/avishek/) 译者：[FSSlc](https://github.com/FSSlc) 校对：[wxy](https://github.com/wxy)

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


动态壁纸给linux发行版添加活力背景

Summary: 我们知道你想拥有一个有格调的ubuntu桌面来炫耀一下 ：）  Live Wallpaper 在linxu上费一点点劲搭建一个出色的工作环境是很简单的。今天，我们（重新）着重来探讨长驻你脑海中那些东西 ：一款自由，开源，能够给你的截图增添光彩的工具。 它叫 Live Wallpaper (正如你猜的那样) ，它用由OpenGL驱动的一款动态桌面背景来代替标准的静态桌面背景。 最好的一点是：在ubuntu上安装它很容易。 动态壁纸主题  Live Wallpaper 不是此类软件唯一的一款，但它是最好的一款之一。 它附带很多不同的开箱即用的主题。 从精细的(noise)到狂热的 (nexus)

能不能让视频作为桌面背景呢

**我们知道你想拥有一个有格调的ubuntu桌面来炫耀一下 ：）**

在linxu上费一点点劲搭建一个出色的工作环境是很简单的。今天，我们（[重新](http://www.omgubuntu.co.uk/2011/11/5-system-monitoring-tools-for-ubuntu)）着重来探讨长驻你脑海中那些东西 ：一款自由，开源，能够给你的截图增添光彩的工具。

它叫 **Live Wallpaper** (正如你猜的那样) ，它用由OpenGL驱动的一款动态桌面背景来代替标准的静态桌面背景。

最好的一点是：在ubuntu上安装它很容易。

### 动态壁纸主题

![](/data/attachment/album/201507/14/172530wnwzw8gfangavr4p.jpg)

Live Wallpaper 不是此类软件唯一的一款，但它是最好的一款之一。

它附带很多不同的开箱即用的主题。

![Live Wallpaper](/data/attachment/album/201507/14/172527ihk30tgchhygxlgl.gif)

*Live Wallpaper*

从精细的(‘noise’)到狂热的 (‘nexus’)，包罗万象，甚至有受到Ubuntu Phone欢迎屏幕启发的obligatory锁屏壁纸。

* Circles — 带着‘evolving circle’风格的时钟，灵感来自于Ubuntu Phone
* Galaxy — 支持自定义大小，位置的旋转星系
* Gradient Clock — 放在倾斜面上的polar时钟
* Nexus — 亮色粒子火花穿越屏幕
* Noise — 类似于iOS动态壁纸的Bokeh设计
* Photoslide — 由文件夹（默认为 ~/Photos）内照片构成的动态网格相册

Live Wallpaper **完全开源**，所以没有什么能够阻挡天马行空的艺术家们用诀窍（当然还有耐心）来创造他们自己的精美主题。

### 设置 & 特点

![](/data/attachment/album/201507/14/172532oyx9ynjfff1yf9qf.jpg)

虽然某些主题与其它主题相比有更多的选项，但每款主题都可以通过某些方式来配置或者定制。

例如，Nexus主题中 (上图所示) 你可以更改脉冲粒子的数量，颜色，大小和出现频率。

首选项提供了 **通用选项** 适用于所有主题，包括:

* 设置登录界面的动态壁纸
* 自定义动画背景
* 调节 FPS (包括在屏幕上显示FPS)
* 指定多显示器的行为

有如此多的选项，diy适用于你自己的桌面背景是很容易的。

### 缺陷

#### 没有桌面图标

Live Wallpaper在运行时，你无法在桌面添加，打开或者是编辑文件和文件夹。

首选项程序提供了一个选项来让你这样做（只是猜测）。也许是它只能在老版本中使用，在我们的测试中－测试环境为Ununtu 14.10，它不工作。但在测试中发现当把桌面壁纸设置成格式为png的图片文件时，这个选项有用，不需要是透明的png图片文件，只要是png图片文件就行了。

#### 资源占用

动态壁纸与标准的壁纸相比要消耗更多的系统资源。

我们并不是说任何时候都会消耗大量资源，但至少在我们的测试中是这样，所以低配置机器和笔记本用户要谨慎使用这款软件。可以使用 [系统监视器](http://www.omgubuntu.co.uk/2011/11/5-system-monitoring-tools-for-ubuntu) 来追踪CPU 和GPU的负载。

#### 退出程序

对我来说最大的“bug”绝对是没有“退出”选项。

当然，动态壁纸可以通过托盘图标和首选项完全退出，那退出托盘图标呢？没办法。只能在终端执行命令‘pkill livewallpaper’。

### 怎么在 Ubuntu 14.04 LTS+ 上安装 Live Wallpaper

![](/data/attachment/album/201507/14/172533vhlvwchh9e5vcpcp.jpg)

要想在Ubuntu 14.04 LTS 和更高版本中安装 Live Wallpaper，你首先需要把官方PPA添加进你的软件源。 最快的方法是在终端中执行下列命令:

```
sudo add-apt-repository ppa:fyrmir/livewallpaper-daily

sudo apt-get update && sudo apt-get install livewallpaper

```

你还需要安装 indicator applet，这样可以方便快速的打开或是关闭动态壁纸，从菜单选择主题，另外图形配置工具可以让你基于你自己的口味来配置每款主题。

```
sudo apt-get install livewallpaper-config livewallpaper-indicator

```

所有都安装好之后你就可以通过Unity Dash来启动它和它的首选项工具了。

![](/data/attachment/album/201507/14/172541k8cgrlcggeslcen6.png)

让人不爽的是，安装完成后，程序不会自动打开托盘图标，而仅仅将它自己加入自动启动项，所以，快速来个注销 -> 登陆它就会出现啦。

### 总结

如果你正处在无聊呆板的桌面中，幻想有一个更有活力的生活，不妨试试。另外，告诉我们你想看到什么样的动态壁纸！

---

via: <http://www.omgubuntu.co.uk/2015/05/animated-wallpaper-adds-live-backgrounds-to-linux-distros>

作者：[Joey-Elijah Sneddon](https://plus.google.com/117485690627814051450/?rel=author) 译者：[Love-xuan](https://github.com/Love-xuan) 校对：[wxy](https://github.com/wxy)

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


在Ubuntu 15.04中安装Ruby on Rails

Summary: 本篇我们会学习如何用rbenv在Ubuntu 15.04中安装Ruby on Rails。我们选择Ubuntu作为操作系统是因为Ubuntu是Linux发行版中自带很多包和完整文档的操作系统，因此我认为这是正确的选择。如果你还没有安装最新的Ubuntu，你可以从下载iso文件开始。 安装 Ruby 我们要做的第一件事是更新Ubuntu包并且为Ruby安装一些依赖。 sudo apt-get update sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-

本篇我们会学习如何用rbenv在Ubuntu 15.04中安装Ruby on Rails。我们选择Ubuntu作为操作系统是因为Ubuntu是Linux发行版中自带很多包和完整文档的操作系统，因此我认为这是正确的选择。如果你还没有安装最新的Ubuntu，你可以从[下载iso文件](http://release.ubuntu.com/15.04)开始。

### 安装 Ruby

我们要做的第一件事是更新Ubuntu包并且为Ruby安装一些依赖。

```
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

```

有三种方法来安装Ruby：rbenv、rvm和从源码安装。每种都有各自的好处，但是近来开发者们更倾向使用rbenv而不是rvm和源码来安装。我们将安装最新的Ruby版本，2.2.2。

用rbenv来安装只有简单的两步。第一步安装rbenv，接着是ruby-build：

```
cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL

git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash

rbenv install 2.2.2
rbenv global 2.2.2
ruby -v

```

我们需要安装Bundler，但是我们要在安装之前告诉rubygems不要为每个包安装本地文档。

```
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler

```

### 配置 GIT

配置git之前，你要创建一个github账号，你可以注册一个[github 账号](http://github.com)。我们需要git作为版本控制系统，因此我们要设置它来匹配github账号。

用户的github账号来替换下面的**Name** 和 **Email address** 。

```
git config --global color.ui true
git config --global user.name "YOUR NAME"
git config --global user.email "YOUR@EMAIL.com"
ssh-keygen -t rsa -C "YOUR@EMAIL.com"

```

接下来用新生成的ssh key添加到github账号中。这样你需要复制下面命令的输出并[粘贴在Github的设置页面里面](https://github.com/settings/ssh)。

```
cat ~/.ssh/id_rsa.pub

```

如果你做完了，检查是否已经成功。

```
ssh -T git@github.com

```

你应该得到下面这样的信息。

```
Hi excid3! You've successfully authenticated, but GitHub does not provide shell access.

```

### 安装 Rails

我们需要安装像NodeJS这样的javascript运行时环境，因为近来Rails的依赖越来越多了。这样我们可以合并和压缩你的javascript，从而提供一个更快的生产环境。

我们需要添加PPA来安装nodeJS。

```
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

```

如果在更新时遇到了问题，你可以试试这个命令：

```
# Note the new setup script name for Node.js v0.12
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -

# Then install with:
sudo apt-get install -y nodejs

```

下一步，用这个命令安装 rails：

```
gem install rails -v 4.2.1

```

因为我们正在使用rbenv，用下面的命令来让rails的执行程序可以使用。

```
rbenv rehash

```

要确保rails已经正确安装，你可以运行rails -v，显示如下：

```
rails -v
# Rails 4.2.1

```

如果你得到的是不同的结果可能是环境没有设置正确。

### 设置 MySQL

或许你已经熟悉MySQL了，你可以从Ubuntu的仓库中安装MySQL的客户端与服务端。你可以在安装时设置root用户密码。这个信息将来会进入你rails程序的database.yml文件中。用下面的命令来安装mysql。

```
sudo apt-get install mysql-server mysql-client libmysqlclient-dev

```

安装libmysqlclient-dev用于mysql2 gem的编译；在设置rails程序时，rails通过它来连接mysql。

### 最后一步

让我们尝试创建你的第一个rails程序：

```
# 使用 MySQL 数据库
rails new myapp -d mysql

# 进入到应用目录
cd myapp
# 创建数据库
rake db:create
rails server

```

访问http://localhost:3000来访问你的新网站。现在你的电脑上已经可以构建rails程序了。

![](/data/attachment/album/201507/14/175043nu5bwu5pdz9pwcbw.png)

如果你在创建数据库时遇到了“Access denied for user 'root'@'localhost' (Using password: NO)”这个错误信息，你需要更新你的config/database.yml文件来匹配数据库的**用户名**和**密码**。

```
# 编辑配置文件夹中的 database.yml
nano config/database.yml

```

接着填入MySql root用户的密码。

![](/data/attachment/album/201507/14/175019xnnzn3h22toez1a2.png)

退出 (Ctrl+X)并保存。

### 总结

Rails是用Ruby写的， 也是随着rails一起使用的编程语言。在Ubuntu 15.04中Ruby on Rails可以用rbenv、 rvm和源码的方式来安装。本篇我们使用的是rbenv方式并用了MySQL作为数据库。有任何的问题或建议，请在评论栏指出。

---

via: <http://linoxide.com/ubuntu-how-to/installing-ruby-rails-using-rbenv-ubuntu-15-04/>

作者：[Obet](http://linoxide.com/author/obetp/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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