12 个全球认可的 Linux 认证

正式工作后发现其实这些认证并没有太多卵用。。。。。想我还当初花了那么多钱。

不过如果没有实际的工作经验证明你的能力之前，你还是得用证书来证明。

--！工作几年了~结果一个证没考

其实这个证你带来的作用是在你找工作的时候跟具竞争力

比如说我，没文凭、没工作经验、人家听了直接把电话挂了，及时让你面试了也不会在给你回应了，

他们看得不是你的技术，而是你能给自己贴多少"金"

没有一个是容易获取到得吧？？？

当你没有一个牛b的文凭，高级证书就是你的闪光点。

# 12 个全球认可的 Linux 认证

大家好，今天我们将会认识一些非常有价值的全球认可的Linux认证。Linux认证是不同的Linux专业机构在全球范围内进行的认证程序。Linux认证可以让Linux专业人才可以在服务器领域或者相关公司等等这些地方更容易获得Linux相关的工作。Linux认证评估一个人在Linux的各个领域里的专业程度。有很多不错的Linux专业机构提供不同的Linux认证。但是，在公司谋取一份工作时全球仅有少数被非常认可的Linux认证含金量很高，这些工作包括管理服务器，虚拟化，安装系统与软件，配置程序，应用支持和其他Linux操作系统相关的东西。随着全球使用Linux操作系统的服务器的增长，拉动了对于Linux专业人才的需求。为了更好的证明Linux专业技术水平，在全球看来，更好的、著名的认证总是有着更高的优先级。

这里是一些全球认可的Linux认证，我们接下来将会一一谈到。

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

### 1. CompTIA Linxu+

CompTIA Linux+ 是LPI（Linux Professional Institute，Linux专业委员会）主办的一个Linux认证，在全世界范围内提供培训。其提供的Linux相关知识，可以用于从事一大批Linux相关专业的工作，如Linux管理员、高级网络管理员、系统管理员、Linux数据库管理员和Web管理员。如果任何人想从事安装和维护Linux操作系统，该课程会帮助他达到认证要求，并且通过提供对Linux系统更宽阔的认识，能够为通过考试做好准备。LPI的CompTIA Linux+认证的主要目的就是，提供给证书持有者足够扎实的，关于安装软件、操作、管理和设备排障的知识。我们可以付出一定的费用、时间和努力，完成CompTIA Linux+，同时获得三个业内认可的证书：**LPI LPIC-1**和**SUSE Certified Linux Administrator （CLA）**证书。

* **认证代码** : LX0-103，LX0-104（2015年3月30日启动）或者LX0-101，LX0-102
* 题目数量：每次考试60道题
* 题目类型：多选
* 考试时长：90分钟
* 要求：A+，Network+，并且有至少12个月的Linux管理经验
* 分数线：500 （对于200-800的范围来说）
* 语言：英语，将来会有德语，葡萄牙语，繁体中文，西班牙。
* 有效期：认证后三年有效

**注意**：不同系列的考试不能合并。如果你考的是LX0-101，那么你必须考LX0-102完成认证。同样的，LX0-103和LX0-104又是一个系列。LX0-103和LX0-104系列是LX0-101和LX0-102系列的升级版。

### 2. LPIC

LPIC，全称Linux专业委员会认证（ Linux Professional Institute Certification），是Linux专业委员会的一个Linux认证程序。这是一个多级别的认证程序，要求在每个级别通过一系列（通常是两个）的认证考试。该认证有三个级别，包括初级水平认证 **LPIC-1** ，高级水平认证 **LPIC-2**和最高水平认证 **LPIC-3**。前两个认证侧重于 **Linux系统管理**，而最后一个认证侧重一些专业技能，包括虚拟化和安全。为了得到 **LPIC-3** 认证，一个持有有效的 **LPIC-1** 与**LPIC-2** 认证的考生必须通过300复杂环境测试、303安全测试、304虚拟化测试和高可用性测试中的一个。**LPIC-1**认证按照证书持有者可以通过运行Linux，使用命令行界面和基本的网络知识安装，维护，配置等任务而设计，LPIC-2测试考生是否作为管理中小型混合网络的候选人。LPIC-3认证是为企业级Linux专业技能设计所设计，代表了最高的专业水平和不针对特定 Linux 发行版的行业认证。

* **认证代码**：LPIC-1（101和102），LPIC-2（201和202）和LPIC-3（300，303或者304）
* 题目类型：60个多项选择
* 考试时长：90分钟
* 要求：无，建议有 Linux Essentials 认证
* 分数线：500（在200-800的范围内）
* 语言：LPIC-1：英语，德语，意大利语，葡萄牙语，西班牙语（现代），汉语（简体），汉语（繁体），日语
* LPIC-2：英语，德语，葡萄牙语，日语
* LPIC-3：英语，日语
* 有效期：退休之后五年内仍然有效

### 3.Oracle Linux OCA

Oracle联合认证（OCA）为个人而定制，适用于那些想证明其部署和管理Oracle Linux操作系统的知识牢固的人。该认证专业知识仅仅针对Oracle Linux发行版，这个系统完全是为Oracle产品特别剪裁的，可以运行Oracle设计的系统，包括Oracle Exadata数据库服务器，Oracle Exalytics In-Memory 服务器，Oracle Exalogic 均衡云，和Oracle数据库应用等。Oracle Linux的“坚不可摧企业内核”为企业应用带来了高性能、高扩展性和稳定性。OCA认证覆盖了如管理本地磁盘设备、管理文件系统、安装和移除Solaris包与补丁，优化系统启动过程和系统进程。这是拿到OCP证书系列的第一步。OCA认证以其前身为Sun Certified Solaris Associate（SCSAS）而为人所知。

* **认证代码**：OCA
* 题目类型：75道多项选择
* 考试时长：120分钟
* 要求：无
* 分数线：64%
* 有效期：永远有效

### 4. Oracle Linux OCP

Oracle专业认证(OCP)是Oracle公司为Oracle Linux提供的一个认证，覆盖更多的进阶知识和技能，对于一个Oracle Linux管理员来说。它囊括的知识有配置网络接口、管理交换分区配置、崩溃转储、管理软件、数据库和重要文件。OCP认证是技术性专业知识和专业技能的基准测试，这些知识与技能需要在公司里广泛用于开发、部署和管理应用、中间件和数据库。Oracle Linux OCP的工作机会在增长，这得益于工作市场和经济发展。根据考试纲领，证书持有者有能力胜任安全管理、为Oracle 数据库准备Oracle Linux系统、排除故障和进行恢复操作、安装软件包、安装和配置内核模块、维护交换空间、完成用户和组管理、创建文件系统、配置逻辑卷管理（LVM）、文件分享服务等等。

* **认证代码**：OCP
* 题目类型：60至80道多项选择题
* 考试时长：120分钟
* 要求：Oracle Linux OCA
* 分数线：64%
* 有效期：永远有效

### 5. RHCSA

RHCSA是红帽公司作为红帽认证系统工程师推出的一个认证程序。RHCSA们是指一些拥有在著名的红帽Linux环境下完成核心系统管理技能和能力的人。这是一个入门级的认证程序，关注在系统管理上的实际胜任能力，包括安装、配置一个红帽Linux系统，接入一个可用的网络提供网络服务。一个红帽认证的系统管理员可以理解和使用基本的工具，用以处理文件、目录、命令行环境和文档；操作运行中的系统，包括以不同的启动级别启动、识别进程、开启和停止虚拟机和控制服务；使用分区和逻辑卷配置本地存储；创建和配置文件系统和文件系统属性，包括权限、加密、访问控制列表和网络文件系统；部署配置和维护系统，包括软件安装、更新和核心服务；管理用户和组，包括使用一个中心的目录用于验证；安全性的工作，包括基本的基本防火墙和SELinux配置。要获得RHCE和其他认证，首先得认证过RHCSA。

* **认证代码**：RHCSA
* 课程代码：RH124，RH134和RH199
* 考试代码：EX200
* 考试时长：21-22小时，取决于选择的课程
* 要求：无。有一些Linux基础知识更好
* 分数线：300总分，210过（70%）
* 有效期：3年

### 6. RHCE

RHCE，也叫做红帽认证工程师，是一个中到高级水平的认证程序，为一些想要学习更多技能和知识，成为一个负责红帽企业Linux的高级系统管理员的RHCSA开设的，RHCE应该有能力、知识和技能来配置静态路由、包过滤、NAT、设定内核运行参数、配置一个ISCSI初始化程序，生成并发送系统用量报告、使用shell脚本自动完成系统维护任务、配置系统日志，包括远程日志、提供网络服务如HTTP/HTTPS、FTP、NFS、SMB、SMTP、SSH和NTP等等。推荐希望获得更多高级水平的认证的RHCSA们、已经完成系统管理员I，II和III、或者已经完成RHCE 快速跟进培训的人们参加认证。

* **认证代码**：RHCE
* 课程代码：RH124，RH134，RH254和RH199
* 考试代码：EX200和EX300
* 考试时长：21-22个小时，取决于所选课程
* 要求：一个RHCSA证书
* 分数线：300总分，210过（70%）
* 有效期：3年

### 7. RHCA

RHCA即红帽认证架构师，是红帽公司的一个认证程序。它的关注点在系统管理的实际能力，包括安装和配置一个红帽Linux系统，并加入到一个可用网络中运行网络服务。RHCA是所有红帽认证中最高水平的认证。考生需要选择他们希望针对的领域，或者选择合格的红帽认证的任意组合来创建一个他们自己的领域。这里有三个主要的领域：数据中心、云和应用平台。精通数据中心领域的RHCA能够运行、管理数据中心；而熟悉云的可以创建、配置和管理私有云和混合云、云应用平台以及使用红帽企业Linux平台的灵活存储方案；精通应用平台集合的RHCA拥有技能如安装、配置和管理红帽JBoss企业应用平台和应用，云应用平台和混合云环境，借助红帽的OpenShift企业版，使用红帽JBoss数据虚拟化技术从多个资源里组合数据。

* **认证代码**：RHCA
* 课程代码：CL210，CL220.CL280，RH236，RH318，RH413，RH436，RH442，JB248和JB450
* 考试代码：EX333，EX401，EX423或者EX318，EX436和EX442
* 考试时长：21-22个小时，取决于所选课程
* 要求：未过期的RHCE证书
* 分数线：300总分，210过（70%）
* 有效期：3年

### 8. SUSE CLA

SUSE认证Linux管理员（SUSE CLA）是SUSE推出的一个初级认证，关注点在SUSE Linux企业服务器环境下的日常任务管理。为了获得SUSE CLA认证，不用必须完成课程任务，只需要通过考试就能获得认证。SUSE CLA们能够、也有技术去使用Linux桌面、定位并利用帮助资源、管理Linux文件系统、用Linux Shell和命令行工作、安装SLE 11 SP22、管理系统安装、硬件、备份和恢复、用YaST管理Linux、Linux进程和服务、存储、配置网络、远程接入、SLE 11 SP2监控，任务自动化和管理用户访问和安全工作。我们可以同时获得SUSE CLA，LPIC-1和CompTIA Linux认证，因为SUSE，Linux Professional Institute和CompATI合作提供了这个同时获得三个Linux认证的机会。

* **认证代码**：SUSE CLA
* 课程代码：3115，3116
* 考试代码：050-720，050-710
* 问题类型：多项选择
* 考试时长：90分钟
* 要求：无
* 分数线：512

### 9. SUSE CLP

SUSE认证Linux专业人员（CLP）是一个认证程序，为那些希望获得关于SUSE Linux企业服务器更多高级且专业的知识的人而服务。SUSE CLP是通过SUSE CLA认证后的下一步。应该通过CLA的考试并拥有证书，然后通过完成CLP的考试才能获得CLP的认证。通过SUSE CLP认证的人员有能力完成安装和配置SLES 11系统、维护文件系统、管理软件包、进程、打印、配置基础网络服务、samba、Web服务器、使用IPv6、创建和运行bash shell脚本。

* **认证代码**：SUSE CLP
* 课程代码：3115，3116和3117
* 考试代码：050-721，050-697
* 考试类型：手写
* 考试时长：180分钟
* 要求：SUSE CLA 认证

### 10. SUSE CLE

SUSE认证Linux工程师(CLE)是一个工程师级别的高级认证，为那些已经通过CLE考试的人准备。为了获得CLE认证，人们需要已经获得SUSE CLA和CLP的认证。获得CLE认证的人员拥有架设复杂SUSE Linux企业服务器环境的技能。CLE认证过的人可以配置基本的网络服务、管理打印、配置和使用Open LDAP、samba、IPv6、完成服务器健康检测和性能调优、创建和执行shell脚本、部署SUSE Linux企业板、通过Xen实现虚拟化等等。

* **认证代码**：SUSE CLE
* 课程代码：3107
* 考试代码：050-723
* 考试类型：手写
* 考试时长：120分钟
* 要求：SUSE CLP 10或者11证书

### 11. LFCS

Linux基金会认证系统管理员（LFCS）认证考生使用Linux和通过终端环境使用Linux的知识。LFCS是Linux基金会的一个认证程序，为使用Linux操作系统工作的系统管理员和工程师准备。Linux基金会联合业内专家、Linux内核社区，测试考生的核心领域、关键技能、知识和应用能力。通过LFCS认证的人员拥有一些技能、知识和能力，包括在命令行下编辑和操作文件、管理和处理文件系统与存储的错误、聚合分区作为LVM设备、配置交换分区、管理网络文件系统、管理用户帐号/权限和属组、创建并执行bash shell脚本、安装/升级/移除软件包等等。

* **认证代码**：LFCS
* 课程代码：LFCS201，LFCS220（可选）
* 考试代码：LFCS 考试
* 考试时长：2小时
* 要求：无
* 分数线：74%
* 语言：英语
* 有效期：两年

### 12. LFCE

Linux基金会认证工程师（LFCE），是Linux基金会为Linux工程师推出的认证。相比于LFCS，通过LFCE认证的人员在Linux方面拥有更大范围的技能。这是一个工程师级别的高级认证程序。LFCE认证的人具备一些网络管理方面的技能和能力，如配置网络服务、配置包过滤、监控网络性能、IP流量、配置文件系统和文件服务、网络文件系统、从仓库安装/升级软件包、管理网络安全、配置iptables、http服务、代理服务、邮件服务等等。由于其为高级工程级别的认证程序，所以普遍认为相比LFCS，学习和通过的难度更大些。

* **认证代码**：LFCE
* 课程代码：LFS230
* 考试代码：LFCE 考试
* 考试时长：2小时
* 要求：认证过LFCS
* 分数线：72%
* 语言：英语
* 有效期：2年

### 我们发现的情况（这仅仅是我们的观点）

最近的调查表明，在不同的高端招聘代理中，称80%的Linux工作描述更倾向于红帽的认证。如果你是一个学生/新手，并且想学习Linux，那么我们建议选择越来越流行的Linux基金会认证，或者CompTIA Linux也可以是一个选择。如果你已经了解了oracle或suse，或者在他们的产品上工作，那oracle/suse的认证会更好些，如果你在公司里工作了，这些认证会对你的职业生涯成长有帮助 :-)

### 总结

在这个世界上，成千上万的大公司正在运行跑着Linux操作系统的服务器和主框架机，为了在这些服务器上管理、配置和工作，总是存在着对Linux技术/专业知识高度认证的需求。这些国际上承认的认证对某些人在Linux的职业生涯扮演很重要的角色。这些遍布全球的公司运行着Linux，需要Linux工程师、系统管理员和已经获得认证且在Linux相关领域干得不错的人员。全球认可的Linux认证，对于专业知识和职业生涯的辉煌都是重中之重，所以好好准备考试并获得认证，对于在Linux建立职业生涯是一个很好的选择。如果你有任何问题，想法，反馈，请写在下方的评论框里，让我们好知道哪些东西需要添加或者改进。谢谢！:-)

---

via: <http://linoxide.com/linux-how-to/12-globally-recognized-linux-certifications/>

作者：[Arun Pyasi](http://linoxide.com/author/arunp/) 译者：[wi-cuckoo](https://github.com/wi-cuckoo) 校对：[wxy](https://github.com/wxy)

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


15 个有用的 MySQL/MariaDB 性能调整和优化技巧

Summary: MySQL 是一个强大的开源关系数据库管理系统（简称 RDBMS）。它发布于 1995 年（20年前）。它采用结构化查询语言（SQL），这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25，于 2015 年 5 月 29 日发布。 关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius（MySQL 的创始人）的女儿 My。尽管有许多关于 MySQL 有趣的传闻，不过本文主要是向你展示一些有用的实践，以帮助你管理你的 MySQL 服务器。  MySQL 性能优化 2009 年 4 月，MySQL 被 Oracle 收购。其结果是MySQL 社区分裂，创建了一个叫 MariaDB 的分支

got it

“设置 MySQL 允许的最大数据包”，今天遇到了【max_allowed_packet】变量带来的问题。

# 15 个有用的 MySQL/MariaDB 性能调整和优化技巧

MySQL 是一个强大的开源关系数据库管理系统（简称 RDBMS）。它发布于 1995 年（20年前）。它采用结构化查询语言（SQL），这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25，于 2015 年 5 月 29 日发布。

关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius（MySQL 的创始人）的女儿“ My”。尽管有许多关于 MySQL 有趣的传闻，不过本文主要是向你展示一些有用的实践，以帮助你管理你的 MySQL 服务器。

*MySQL 性能优化*

2009 年 4 月，MySQL 被 Oracle 收购。其结果是MySQL 社区分裂，创建了一个叫 MariaDB 的分支 。创建该分支的主要原因是为了保持这个项目可以在 GPL 下的自由。

今天，MySQL 和 MariaDB 是用于类似 WordPress、Joomla、Magento 和其他 web 应用程序的最流行的 RDMS 之一（如果不是最多的）。

这篇文章将告诉你一些基本的，但非常有用的关于如何优化 MySQL/MariaDB 性能的技巧。注意，本文假定您已经安装了 MySQL 或 MariaDB。如果你仍然不知道如何在系统上安装它们，你可以按照以下说明去安装：

* [在 RHEL/CentOS 7 上安装 LAMP](http://www.tecmint.com/install-lamp-in-centos-7/)
* [在 Fedora 22 上安装 LAMP](http://www.tecmint.com/install-lamp-linux-apache-mysql-php-on-fedora-22/)
* [在 Ubuntu 15.04 安装 LAMP](http://www.tecmint.com/install-lamp-on-ubuntu-15-04/)
* [在 Debian 8 上安装 MariaDB](http://www.tecmint.com/install-mariadb-in-debian/)
* [在 Gentoo Linux 上安装 MariaDB](http://www.tecmint.com/install-lemp-in-gentoo-linux/)
* [在 Arch Linux 上安装 MariaDB](http://www.tecmint.com/install-lamp-in-arch-linux/)

**重要提示**： 在开始之前，不要盲目的接受这些建议。每个 MySQL 设置都是不同的，在进行任何更改之前需要慎重考虑。

你需要明白这些：

* MySQL/MariaDB 配置文件位于 `/etc/my.cnf`。 每次更改此文件后你需要重启 MySQL 服务，以使更改生效。
* 这篇文章使用 MySQL 5.6 版本。

### 1. 启用 InnoDB 的每张表一个数据文件设置

首先，有一个重要的解释， InnoDB 是一个存储引擎。MySQL 和 MariaDB 使用 InnoDB 作为默认存储引擎。以前，MySQL 使用系统表空间来保存数据库中的表和索引。这意味着服务器唯一的目的就是数据库处理，它们的存储盘不用于其它目的。

InnoDB 提供了更灵活的方式，它把每个数据库的信息保存在一个 `.ibd` 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作，当删除或截断一个数据库表时，你也可以回收未使用的空间。

这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

MySQL 5.6及以上的版本默认启用 `innodb_file_per_table`。你可以在 /etc/my.cnf 文件中看到。该指令看起来是这样的：

```
innodb_file_per_table=1

```

### 2. 将 MySQL 数据库数据存储到独立分区上

**注意**：此设置只在 MySQL 上有效, 在 MariaDB 上无效。

有时候操作系统的读/写会降低你 MySQL 服务器的性能，尤其是如果操作系统和数据库的数据位于同一块磁盘上。因此，我建议你使用单独的磁盘（最好是 SSD）用于 MySQL 服务。

要完成这步，你需要将新的磁盘连接到你的计算机/服务器上。对于这篇文章，我假定磁盘挂在到 /dev/sdb。

#### 下一步是准备新的分区：

```
# fdisk /dev/sdb

```

现在按 “N” 来创建新的分区。接着按 “P”，使其创建为主分区。在此之后，从 1-4 设置分区号。之后，你可以选择分区大小。这里按 enter。在下一步，你需要配置分区的大小。

如果你希望使用全部的磁盘，再按一次 enter。否则，你可以手动设置新分区的大小。准备就绪后按 “w” 保存更改。现在，我们需要为我们的新分区创建一个文件系统。这可以用下面命令轻松地完成：

```
# mkfs.ext4 /dev/sdb1

```

现在我们会挂载新分区到一个目录。我在根目录下创建了一个名为 “ssd” 的目录：

```
# mkdir /ssd/

```

挂载新分区到刚才创建的目录下：

```
# mount /dev/sdb1  /ssd/

```

你可以在 /etc/fstab 文件中添加如下行设置为开机自动挂载：

```
/dev/sdb1 /ssd ext3 defaults 0 0

```

#### 现在我们将 MySQL 移动到新磁盘中

首先停止 MySQL 服务：

```
# service mysqld stop

```

我建议你同时停止 Apache/nginx，以防止任何试图写入数据库的操作：

```
# service httpd stop
# service nginx stop

```

现在复制整个 MySQL 目录到新分区中:

```
# cp /var/lib/mysql /ssd/ -Rp

```

这可能需要一段时间，具体取决于你的 MySQL 数据库的大小。一旦这个过程完成后重命名 MySQL 目录：

```
# mv /var/lib/mysql /var/lib/mysql-backup

```

然后创建一个符号链接：

```
# ln -s /ssd/mysql /var/lib/mysql

```

现在启动你的 MySQL 和 web 服务：

```
# service mysqld start
# service httpd start
# service nginx start

```

以后你的数据库将使用新的磁盘访问。

### 3. 优化使用 InnoDB 的缓冲池

InnoDB 引擎在内存中有一个缓冲池用于缓存数据和索引。这当然有助于你更快地执行 MySQL/MariaDB 查询语句。选择合适的内存大小需要一些重要的决策并对系统的内存消耗有较多的认识。

下面是你需要考虑的:

* 其它的进程需要消耗多少内存。这包括你的系统进程，页表，套接字缓冲。
* 你的服务器是否专门用于 MySQL 还是你运行着其它非常消耗内存的服务。

在一个专用的机器上，你可能会把 60-70％ 的内存分配给 `innodb_buffer_pool_size`。如果你打算在一个机器上运行更多的服务，你应该重新考虑专门用于 `innodb_buffer_pool_size` 的内存大小。

你需要设置 my.cnf 中的此项:

```
innodb_buffer_pool_size

```

### 4. 在 MySQL 中避免使用 Swappiness

“交换”是一个当系统移动部分内存到一个称为 “交换空间” 的特殊磁盘空间时的过程。通常当你的系统用完物理内存后就会出现这种情况，系统将信息写入磁盘而不是释放一些内存。正如你猜测的磁盘比你的内存要慢得多。

该选项默认情况下是启用的：

```
# sysctl vm.swappiness

vm.swappiness = 60

```

运行以下命令关闭 swappiness：

```
# sysctl -w vm.swappiness=0

```

### 5. 设置 MySQL 的最大连接数

`max_connections` 指令告诉你当前你的服务器允许多少并发连接。MySQL/MariaDB 服务器允许有 SUPER 权限的用户在最大连接之外再建立一个连接。只有当执行 MySQL 请求的时候才会建立连接，执行完成后会关闭连接并被新的连接取代。

请记住，太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数，而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

你可以动态地改变 `max_connections` 的值而无需重启MySQL服务器：

```
# mysql -u root -p
mysql> set global max_connections = 300;

```

### 6. 配置 MySQL 的线程缓存数量

`thread_cache_size` 指令用来设置你服务器缓存的线程数量。当客户端断开连接时，如果当前线程数小于 `thread_cache_size`，它的线程将被放入缓存中。下一个请求通过使用缓存池中的线程来完成。

要提高服务器的性能，你可以设置 `thread_cache_size` 的值相对高一些。你可以通过以下方法来查看线程缓存命中率：

```
mysql> show status like 'Threads_created';
mysql> show status like 'Connections';

```

你可以用以下公式来计算线程池的命中率：

```
100 - ((Threads_created / Connections) * 100)

```

如果你得到一个较低的数字，这意味着大多数 mysql 连接使用新的线程，而不是从缓存加载。在这种情况下，你需要增加 `thread_cache_size`。

这里有一个好处是可以动态地改变 `thread_cache_size` 而无需重启 MySQL 服务。你可以通过以下方式来实现：

```
mysql> set global thread_cache_size = 16;

```

### 7. 禁用 MySQL 的 DNS 反向查询

默认情况下当新的连接出现时，MySQL/MariaDB 会进行 DNS 查询解析用户的 IP 地址/主机名。对于每个客户端连接，它的 IP 都会被解析为主机名。然后，主机名又被反解析为 IP 来验证两者是否一致。

当 DNS 配置错误或服务器出现问题时，这很可能会导致延迟。这就是为什么要关闭 DNS 的反向查询的原因，你可以在你的配置文件中添加以下选项去设定：

```
[mysqld]
# Skip reverse DNS lookup of clients
skip-name-resolve

```

更改后你需要重启 MySQL 服务。

### 8. 配置 MySQL 的查询缓存容量

如果你有很多重复的查询并且数据不经常改变 – 请使用缓存查询。 人们常常不理解 `query_cache_size` 的实际含义而将此值设置为 GB 级，这实际上会降低服务器的性能。

背后的原因是，在更新过程中线程需要锁定缓存。通常设置为 200-300 MB应该足够了。如果你的网站比较小的，你可以尝试给 64M 并在以后及时去增加。

在你的 MySQL 配置文件中添加以下设置：

```
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M

```

### 9. 配置临时表容量和内存表最大容量

`tmp_table_size` 和 `max_heap_table_size` 这两个变量的大小应该相同，它们可以让你避免磁盘写入。`tmp_table_size` 是内置内存表的最大空间。如果表的大小超出限值将会被转换为磁盘上的 MyISAM 表。

这会影响数据库的性能。管理员通常建议在服务器上设置这两个值为每 GB 内存给 64M。

```
[mysqld]
tmp_table_size= 64M
max_heap_table_size= 64M

```

### 10. 启用 MySQL 慢查询日志

记录慢查询可以帮助你定位数据库中的问题并帮助你调试。这可以通过在你的 MySQL 配置文件中添加以下值来启用：

```
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long_query_time = 1

```

第一个变量启用慢查询日志，第二个告诉 MySQL 实际的日志文件存储位置。使用 `long_query_time` 来定义完成 MySQL 查询多少用时算长。

### 11. 检查 MySQL 的空闲连接

空闲连接会消耗资源，可以的话应该被终止或者刷新。空闲连接是指处于 “sleep” 状态并且保持了很长一段时间的连接。你可以通过运行以下命令查看空闲连接：

```
# mysqladmin processlist -u root -p | grep “Sleep”

```

这会显示处于睡眠状态的进程列表。当代码使用持久连接到数据库时会出现这种情况。使用 PHP 调用 mysql\_pconnect 可以打开这个连接，执行完查询之后，删除认证信息并保持连接为打开状态。这会导致每个线程的缓冲都被保存在内存中，直到该线程结束。

首先你要做的就是检查代码问题并修复它。如果你不能访问正在运行的代码，你可以修改 `wait_timeout` 变量。默认值是 28800 秒，而你可以安全地将其降低到 60 ：

```
wait_timeout=60

```

### 12. 为 MySQL 选择正确的文件系统

选择正确的文件系统对数据库至关重要。在这里你需要考虑的最重要的事情是 - 数据的完整性，性能和易管理性。

按照 MariaDB 的建议，最好的文件系统是XFS、ext4 和 Btrfs。它们都是可以使用超大文件和大容量存储卷的企业级日志型文件系统。

下面你可以找到一些关于这三个文件系统的有用信息：

| 文件系统 | XFS | Ext4 | Btrfs |
| --- | --- | --- | --- |
| 文件系统最大容量 | 8EB | 1EB | 16EB |
| 最大文件大小 | 8EB | 16TB | 16EB |

我们的这篇文章详细介绍了 Linux 文件系统的利与弊: [Linux 文件系统解析](http://www.tecmint.com/linux-file-system-explained/)。

### 13. 设置 MySQL 允许的最大数据包

MySQL 把数据拆分成包。通常一个包就是发送到客户端的一行数据。`max_allowed_packet` 变量定义了可以被发送的最大的包。

此值设置得过低可能会导致查询速度变得非常慢，然后你会在 MySQL 的错误日志看到一个错误。建议将该值设置为最大包的大小。

### 14. 测试 MySQL 的性能优化

你应该定期检查 MySQL/MariaDB 的性能。这将帮助你了解资源的使用情况是否发生了改变或需要进行改进。

有大量的测试工具可用，但我推荐你一个简单易用的。该工具被称为 mysqltuner。

使用下面的命令下载并运行它：

```
# wget https://github.com/major/MySQLTuner-perl/tarball/master
# tar xf master
# cd major-MySQLTuner-perl-993bc18/
# ./mysqltuner.pl

```

你将收到有关 MySQL 使用的详细报告和推荐提示。下面是默认 MariaDB 安装的输出样例：

### 15. 优化和修复 MySQL 数据库

有时候 MySQL/MariaDB 数据库中的表很容易崩溃，尤其是服务器意外关机、文件系统突然崩溃或复制过程中仍然访问数据库。幸运的是，有一个称为 'mysqlcheck' 的免费开源工具，它会自动检查、修复和优化 Linux 中数据库的所有表。

```
# mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
# mysqlcheck -u root -p --auto-repair --check --optimize databasename

```

就是这些！我希望上述文章对你有用，并帮助你优化你的 MySQL 服务器。一如往常，如果你有任何疑问或评论，请在下面的评论部分提交。

---

via: <http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/>

作者：[Marin Todorov](http://www.tecmint.com/author/marintodorov89/) 译者：[strugglingyouth](https://github.com/strugglingyouth) 校对：[ictlyh](https://github.com/ictlyh)

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


25 个有用 Apache ‘.htaccess’ 技巧

Summary: 网站是我们生活中重要的一部分。它们是实现扩大业务、分享知识以及其它更多功能的方式。早期受制于只能提供静态内容，随着动态客户端和服务器端脚本语言的引入和现有静态语言的持续改进，例如从 html 到 html5，动态网站成为可能，剩下的也许在不久的将来也会实现。 对于网站，随之而来的是需要一个能向全球大规模用户显示站点的某个东西。这个需求可以通过托管网站的服务器实现。这包括一系列的服务器，例如：Apache HTTP Server、Joomla 以及 允许个人拥有自己网站的 WordPress。  25 个 htaccess 小技巧 想要拥有一个网站，可以创建一

好东西 分享了

按照Apache的解释，.htaccess是在没有权限修改httpd.conf的情况下才使用的，因为htaccess不是预编译的。<br />
请不要这样使用htaccess

这样有点滥用了。

# 25 个有用 Apache ‘.htaccess’ 技巧

网站是我们生活中重要的一部分。它们是实现扩大业务、分享知识以及其它更多功能的方式。早期受制于只能提供静态内容，随着动态客户端和服务器端脚本语言的引入和现有静态语言的持续改进，例如从 html 到 html5，动态网站成为可能，剩下的也许在不久的将来也会实现。

对于网站，随之而来的是需要一个能向全球大规模用户显示站点的某个东西。这个需求可以通过托管网站的服务器实现。这包括一系列的服务器，例如：Apache HTTP Server、Joomla 以及 允许个人拥有自己网站的 WordPress。

<img src="content_image/album_201507_01_130912thiu4x2o36h369u9.jpg" alt="Apache htaccess 小技巧" title="Apache htaccess 小技巧">

*25 个 htaccess 小技巧*

想要拥有一个网站，可以创建一个自己的本地服务器，或者联系任何上面提到的或其它服务器管理员来托管他的网站。但实际问题也从这点开始。网站的性能主要取决于以下因素：

* 网站消耗的带宽。
* 面对黑客，网站有多安全。
* 对数据库进行数据检索时的优化。
* 显示导航菜单和提供更多 UI 功能时的用户友好性。

除此之外，保证托管网站服务器成功的多种因素还包括：

* 对于一个流行站点的数据压缩量。
* 同时为多个对请求同一或不同站点的用户服务的能力。
* 保证网站上输入的机密数据安全，例如：Email、信用卡信息等等。
* 允许更多的选项用于增强站点的动态性。

这篇文章讨论一个服务器提供的用于增强网站性能和提高针对坏机器人、热链等的安全性的功能：‘.htaccess’ 文件。

### .htaccess 是什么？

htaccess (hypertext access，超文本访问) 是为网站所有者提供用于控制服务器环境变量以及其它参数的选项，从而增强他们网站的功能的文件。这些文件可以在网站目录树的任何一个目录中，并向该目录以及目录中的文件和子目录提供功能。

这些功能是什么呢？其实这些是服务器的指令，例如命令服务器执行特定任务的行，这些命令只对该文件所在目录中的文件和子目录有效。这些文件默认是隐藏的，因为所有操作系统和网站服务器默认配置为忽略它们，但如果查看隐藏文件的话，你就可以看到这些特殊文件。后续章节的话题将讨论能控制什么类型的参数。

注意：如果 .htaccess 文件保存在 /apache/home/www/Gunjit/ 目录，那么它会向该目录中的所有文件和子目录提供命令，但如果该目录包含一个名为 /Gunjit/images/ 子目录，且该子目录中也有一个 .htaccess 文件，那么这个子目录中的命令会覆盖父目录中 .htaccess 文件(或者目录层次结构中更上层的文件)提供的命令。

### Apache Server 和 .htaccess 文件

Apache HTTP Server 俗称为 Apache，是为了表示对一个有卓越战争策略技能的美洲土著部落的尊敬而命名。它基于 [NCSA HTTPd 服务器](https://en.wikipedia.org/wiki/NCSA_HTTPd) ，是用 C/C++ 和 XML 建立的跨平台 Web 服务器，它在万维网的成长和发展中起到了关键作用。

它最常用于 UNIX，但 Apache 也能用于多种平台，包括 FreeBSD、Linux、Windows、Mac OS、Novel Netware 等。在 2009 年，Apache 成为第一个为超过一亿站点提供服务的服务器。

Apache 服务器可以让 www/ 目录中的每个用户有一个单独的 .htaccess 文件。尽管这些文件是隐藏的，但如果需要的话可以使它们可见。在 www/ 目录中可以有很多子目录，每个子目录通过用户名或所有者名称命名，包含了一个站点。除此之外你可以在每个子目录中有一个 .htaccess 文件，像之前所述用于配置子目录中的文件。

下面介绍如果配置 Apache 服务器上的 htaccess 文件。

### Apache 服务器上的配置

这里有两种情况：

#### 在自己的服务器上托管网站

在这种情况下，如果没有启用 .htaccess 文件，你可以通过在 http.conf(Apache HTTP 守护进程的默认配置文件) 中找到 部分启用。

```
<Directory "/var/www/htdocs">

```

定位如下行

```
AllowOverride None

```

更改为

```
AllowOverride All

```

现在，重启 Apache 后就启用了 .htaccess。

#### 在不同的托管服务提供商的服务器上托管网站

在这种情况下最好咨询托管管理员，如果他们允许访问 .htaccess 文件的话。

### 用于网站的 25 个 Apache Web 服务器 ‘.htaccess’ 小技巧

#### 1. 如何在 .htaccess 文件中启用 mod\_rewrite

mod\_rewrite 选项允许你使用重定向并通过重定向到其它 URL 来隐藏你真实的 URL。这个选项非常有用，允许你用短的容易记忆的 URL 替换长 URL。

要允许 mod\_rewrite，只需要在你的 .htaccess 文件的第一行添加如下一行。

```
Options +FollowSymLinks

```

该选项允许你跟踪符号链接从而在站点中启用 mod*rewrite。后面会介绍用短 URL 替换。（LCTT 译注：+FollowSymLinks 只是启用 mod*rewrite 的前提之一，还需要在全局和虚拟机中设置 `RewriteEngine on` 才能启用重写模块。）

#### 2. 如何允许或禁止对站点的访问

通过使用 order、allow 和 deny 关键字，htaccess 文件可以允许或者禁止对站点或目录中子目录或文件的访问。

**只允许 IP 192.168.3.1 的访问**

```
Order Allow, Deny
Deny from All
Allow from 192.168.3.1

或

Order Allow, Deny
Allow from 192.168.3.1

```

这里的 Order 关键字指定处理 allow 和 deny 访问的顺序。对于上面的 ‘Order’ 语句，首先会处理 Allow 语句，然后是 deny 语句。

**只禁止某个 IP 的访问**

下面一行的意思是除了 IP 地址 192.168.3.1，允许所有用户访问网站。

```
Order Allow, Deny
Deny from 192.168.3.1
Allow from All

或

Order Deny, Allow
Deny from 192.168.3.1

```

#### 3. 为不同错误码生成 Apache 错误文档

用简单几行，我们可以解决当用户/客户端请求一个站点上不可用的网页时服务器产生的错误码的错误文档，例如我们大部分人见过的浏览器中显示的 ‘404 Page not found’。‘.htaccess’ 文件指定了发生这些错误情况时采取何种操作。

要做到这点，需要添加下面的行到 ‘.htaccess’ 文件：

```
ErrorDocument <error-code> <path-of-document/string-representing-html-file-content>

```

‘ErrorDocument’ 是一个关键字，error-code 可以是 401、403、404、500 或任何有效的表示错误的代码，最后 ‘path-of-document’ 表示本地机器上的路径（如果你使用的是你自己的本地服务器） 或服务器上的路径（如果你使用任何其它服务器来托管网站）。

**例子：**

```
ErrorDocument 404 /error-docs/error-404.html

```

上面一行设置客户请求任何无效页面，服务器报告 404 错误时显示 error-docs 目录下的 ‘error-404.html’ 文档。

```
<html><head><title>404 Page not found</title></head><body><p>The page you request is not present. Check the URL you have typed</p></body></html>
```

上面的表示也正确，其中字符串相当于一个普通的 html 文件。

#### 4. 设置/取消 Apache 服务器环境变量

在 .htaccess 文件中你可以设置或者取消站点所有者可以更改的全局环境变量。要设置或取消环境变量，你需要在你的 .htaccess 文件中添加下面的行。

**设置环境变量**

```
SetEnv OWNER “Gunjit Khera”

```

**取消环境变量**

```
UnsetEnv OWNER

```

#### 5. 为文件定义不同 MIME 类型

MIME（多用途 Internet 多媒体扩展）是浏览器运行任何页面所默认识别的类型。你可以在 .htaccess 文件中为你的站点定义 MIME 类型，然后服务器就可以识别你定义类型的文件并运行。

```
<IfModule mod_mime.c>
    AddType application/javascript      js
    AddType application/x-font-ttf      ttf ttc
</IfModule>

```

这里，mod\_mime.c 是用于控制定义不同 MIME 类型的模块，如果在你的系统中已经安装了这个模块，那么你就可以用该模块去为你站点中不同的扩展名定义不同的 MIME 类型，从而让服务器可以理解这些文件。

#### 6. 如何在 Apache 中限制上传和下载的大小

.htaccess 文件允许你能够控制某个用户从你的站点（通过 PHP）单次上传数据量的大小（LCTT 译注：原文有误，修改）。要做到这点你只需要添加下面的行到你的 .htaccess 文件：

```
php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

```

上面的行设置最大上传大小、最大POST 提交数据大小、最长执行时间（例如，允许用户在他的本地机器上单次执行一个请求的最大时间）、限制的最大输入时间。

#### 7. 让用户不能在你的站点上在线播放 .mp3 和其它文件

大部分情况下，人们在下载检查音乐质量之前会在网站上播放等等。作为一个聪明的销售者，你可以添加一个简单的功能，不允许任何用户在线播放音乐或视频，而是必须下载完成后才能播放。这非常有用，因为（无缓冲的）在线播放音乐和视频会消耗很多带宽。

要添加下面的行到你的 .htaccess 文件：

```
AddType application/octet-stream .mp3 .zip

```

#### 8. 为站点设置目录索引

大部分网站开发者都知道第一个显示的页面是哪个，例如一个站点的首页，被命名为 ‘index.html’。我们大部分也见过这个。但是如何设置呢？

.htaccess 文件提供了一种方式用于列出一个客户端请求访问网站的主页面时会顺序扫描的一些网页集合，相应地如果找到了列出的页面中的任何一个就会作为站点的主页面并显示给用户。

需要添加下面的行产生所需的效果。

```
DirectoryIndex index.html index.php yourpage.php

```

上面一行指定如果有任何访问首页的请求到来，首先会在目录中顺序搜索上面列出的网页：如果发现了 index.html 则显示为主页面，否则会找下一个页面，例如 index.php，如此直到你在列表中输入的最后一个页面。

#### 9. 如何为文件启用 GZip 压缩以节省网站带宽

繁忙的站点通常比只占少量空间的轻量级站点运行更慢，这是常见的现象。因为对于繁忙的站点需要时间加载巨大的脚本文件和图片以在客户端的 Web 浏览器上显示。

通常的机制是这样的，当浏览器请求一个 web 页面时，服务器提供给浏览器该页面，并在浏览器端显示该 web 页面，浏览器需要下载该页面并运行页面内的脚本。

这里 GZip 压缩所做的就是节省单个用户的服务时间而不用增加带宽。服务器上站点的源文件以压缩形式保存，当用户请求到来的时候，这些文件以压缩形式传送，然后在客户端上解压（LCTT 译注：原文此处有误）。这改善了带宽限制。

下面的行允许你压缩站点的源文件，但要求在你的服务器上安装 mod\_deflate.c 模块。

```
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/html
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

```

#### 10. 处理文件类型

服务器默认的有一些特定情况。例如：在服务器上运行 .php 文件，显示 .txt 文件。像这些我们可以以源代码形式只显示一些可执行 cgi 脚本或文件而不是执行它们（LCTT 译注：这是为了避免攻击者通过上传恶意脚本，进而在服务器上执行恶意脚本进行破坏和窃取）。

要做到这点在 .htaccess 文件中有如下行。

```
RemoveHandler cgi-script .php .pl .py
AddType text/plain .php .pl .py

```

这些行告诉服务器只显示而不执行 .pl (perl 脚本)、.php (PHP 文件) 和 .py (Python 文件) 。

#### 11. 为 Apache 服务器设置时区

从 .htaccess 文件可用于为服务器设置时区可以看出它的能力和重要性。这可以通过设置一个服务器为每个托管站点提供的一系列全局环境变量中的 ‘TZ’ 完成。

由于这个原因，我们可以在网站上看到根据我们的时区显示的时间。也许服务器上其他拥有网站的人会根据他居住地点的位置设置时区。

下面的一行为服务器设置时区。

```
SetEnv TZ India/Kolkata

```

#### 12. 如果在站点上启用缓存控制

浏览器很有趣的一个功能是，很多时间你可以看到，当多次同时打开一个网站和第一次打开相比前者会更快。但为什么会这样呢？事实上，浏览器在它的缓存中保存了一些通常访问的页面用于加快后面的访问。

但保存多长时间呢？这取决于你自己。例如，你的 .htaccess 文件中设置的缓存控制时间。.htaccess 文件指定了站点的网页可以在浏览器缓存中保存的时间，时间到期后需要重新验证缓存，页面可能会从缓存中删除然后在下次用户访问站点的时候重建。

下面的行为你的站点实现缓存控制。

```
<FilesMatch "\.(ico|png|jpeg|svg|ttf)$">
    Header Set Cache-Control "max-age=3600, public"
</FilesMatch>
<FilesMatch "\.(js|css)$">
    Header Set Cache-Control "public"
    Header Set Expires "Sat, 24 Jan 2015 16:00:00 GMT"
</FilesMatch>

```

上面的行允许缓存 .htaccess 文件所在目录中的页面一小时。

#### 13. 配置单个文件

通常 .htaccess 文件中的内容会对该文件所在目录中的所有文件和子目录起作用，但是你也可以对特殊文件设置一些特殊权限，例如只禁止对某个文件的访问等等。

要做到这点，你需要在文件中以类似方式添加 <Files> 标记：

```
<files conf.html="">
Order allow, deny
Deny from 188.100.100.0
</files>

```

这是一个禁止 IP 188.100.100.0 访问 ‘conf.html’ 的简单例子，但是你也可以添加介绍过的 .htaccess 文件的任何功能，包括将要介绍的功能，例如：缓存控制、GZip 压缩。

大部分服务器会用这个功能增强 .htaccess 文件的安全，这也是我们在浏览器上看不到 .htaccess 文件的原因。在后面的章节中会介绍如何给文件授权。

#### 14. 启用在 cgi-bin 目录以外运行 CGI 脚本

通常服务器运行的 CGI 脚本都保存在 cgi-bin 目录中，但是你可以在你需要的目录运行 CGI 脚本，只需要在所需的目录中的 .htaccess 文件添加下面的行，如果没有该文件就创建一个，并添加下面的行：

```
AddHandler cgi-script .cgi
Options +ExecCGI

```

#### 15.如何用 .htaccess 在站点上启用 SSI

服务器端包括（SSI）顾名思义是和服务器部分相关的东西。这是什么呢？通常当我们在站点上有很多页面的时候，我们在主页上会有一个显示到其它页面链接的导航菜单，我们可以启用 SSI 选项允许导航菜单中显示的所有页面完全包含在主页面中。

SSI 允许多个页面包含同样的内容，因此只需要编辑一个文件就行，从而可以节省很多磁盘空间。对于 .shtml 文件，服务器默认启用了该选项。

如果你想要对 .html 启用该选项，你需要添加下面的行：

```
AddHandler server-parsed .html

```

这样 html 文件中如下部分会被替换为 SSI。

```
<!--#inlcude virtual="gk/document.html"-->

```

#### 16. 如何防止网站列出目录列表

为防止任何客户端在本地机器罗列服务器上的网站目录列表，添加下面的行到你不想列出的目录的文件中。

```
Options -Indexes

```

#### 17. 更改默认字符集和语言头

.htaccess 文件允许你更改网站使用的字符集，例如 ASCII 或 UNICODE，UTF-8 等，以及用于显示内容的默认语言。

在服务器的全局环境变量之后添加下面语句可以实现上述功能。

```
AddDefaultCharset UTF-8
DefaultLanguage en-US

```

#### 18. 重定向一个非 www URL 到 www URL

在开始解释之前，首先看看如何启用该功能，添加下列行到 .htaccess 文件。

```
RewriteEngine ON
RewriteCond %{HTTP_HOST} ^abc\.net$
RewriteRule (.*) http://www.abc.net/$1 [R=301,L]

```

上面的行启用重写引擎，然后在第二行检查所有涉及到主机 abc.net 或 环境变量 HTTP\_HOST 为 “abc.net” 的 URL。

对于所有这样的 URL，代码永久重定向它们(如果启用了 R=301 规则)到新 URL http://www.abc.net/$1，其中 $1 是主机为 abc.net 的非 www URL。非 www URL 是大括号内的内容，并通过 $1 引用。

**重写 URL 的重定向规则**

重写功能简单的说，就是用短而易记的 URL 替换长而难以记忆的 URL。但是，在开始这个话题之前，这里有一些本文后面会使用的特殊字符的规则和约定。

**特殊符号：**

```
符号              含义
^         -     字符串开头
$         -     字符串结尾
|         -     或 [a|b] ： a 或 b
[a-z]     -     a 到 z 的任意字母
+         -     之前字母的一次或多次出现
*         -     之前字母的零次或多次出现
?         -     之前字母的零次或一次出现

```

**常量和它们的含义：**

```
常量          含义
NC          -   区分大小写
L           -   最后的规则 – 停止处理后面规则
R           -   临时重定向到新 URL
R=301       -   永久重定向到新 URL
F           -   禁止发送 403 头给用户
P           -   代理 - 获取远程内容代替部分并返回
G           -   Gone， 不再存在
S=x         -   跳过后面的 x 条规则
T=mime-type -   强制指定 MIME 类型
E=var:value -   设置环境变量 var 的值为 value
H=handler   -   设置处理器
PT          -   Pass through - 用于 URL 还有额外的头
QSA         -   将查询字符串追加到替换 URL

```

#### 19. 重定向整个站点到 https

下面的行会帮助你转换整个网站到 https：

```
RewriteEngine ON
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

```

上面的行启用重写引擎，然后检查环境变量 HTTPS 的值。如果设置了那么重写所有网站页面到 https。

#### 20.一个自定义重写例子

例如，重定向 url ‘http://www.abc.net?p=100&q=20’ 到 ‘http://www.abc.net/10020pq’。

```
RewriteEngine ON
RewriteRule ^http://www.abc.net/([0-9]+)([0-9]+)pq$ ^http://www.abc.net?p=$1&q=$2

```

在上面的行中，$1 表示第一个括号，$2 表示第二个括号。

#### 21. 重命名 htaccess 文件

为了防止入侵者和其他人查看 .htaccess 文件，你可以重命名该文件，这样就不能通过客户端浏览器访问。实现该目标的语句是：

```
AccessFileName  htac.cess

```

#### 22. 如何为你的网站禁用图片盗链

网站带宽消耗比较大的另外一个重要问题是盗链问题，这是其它站点用于显示你网站的图片而链接到你的网站的链接，这会消耗你的带宽。这问题也被成为 ‘带宽盗窃’。

一个常见现象是当一个网站要显示其它网站所包含的图片时，由于该链接需要从你的网站加载内容，消耗你站点的带宽而为其它站点显示图片。为了防止出现这种情况，比如对于 .gif、.jpeg 图片等，下面的代码行会有所帮助：

```
RewriteEngine ON
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpeg|png)$ - [F].

```

上面的行检查 HTTP\_REFERER 是否没有设为空或没有设为你站点上的任何链接。如果是这样的话，你网页上的所有图片会用 403 禁止访问代替。

#### 23. 如何将用户重定向到维护页面

如果你的网站需要进行维护并且你想向所有需要访问该网站的你的所有客户通知这个消息，对于这种情况，你可以添加下面的行到你的 .htaccess 文件，从而只允许管理员访问并替换所有访问 .jpg、.css、.gif、.js 等的页面内容。

```
RewriteCond %{REQUEST_URI} !^/admin/ [NC]
RewriteCond %{REQUEST_URI} !^((.*).css|(.*).js|(.*).png|(.*).jpg)    [NC]
RewriteRule ^(.*)$ /ErrorDocs/Maintainence_Page.html [NC,L,U,QSA]

```

这些行检查请求 URL 是否包含任何例如以 ‘/admin/’ 开头的管理页面的请求，或任何到 ‘.png, .jpg, .js, .css’ 页面的请求，对于任何这样的请求，用 ‘ErrorDocs/Maintainence\_Page.html’ 替换那个页面。

#### 24. 映射 IP 地址到域名

名称服务器是将特定 IP 地址转换为域名的服务器。这种映射也可以在 .htaccess 文件中用以下形式指定。

```
# 为了将IP地址 L.M.N.O 映射到域名 www.hellovisit.com
RewriteCond %{HTTP_HOST} ^L\.M\.N\.O$ [NC]
RewriteRule ^(.*)$ http://www.hellovisit.com/$1 [L,R=301]

```

上面的行检查任何页面的主机是否包含类似 L.M.N.O 的 IP 地址，如果是的话第三行会通过永久重定向将页面映射到域名 http://www.hellovisit.com。

#### 25. FilesMatch 标签

类似用于应用条件到单个文件的 标签， 能用于匹配一组文件并对该组文件应用一些条件，如下：

```
<FilesMatch “\.(png|jpg)$”>
Order Allow, Deny
Deny from All
</FilesMatch>

```

### 结论

.htaccess 文件能实现的小技巧还有很多。这告诉了我们这个文件有多么强大，通过该文件能给你的站点添加多少安全性、动态性以及其它功能。

我们已经在这篇文章中尽最大努力覆盖尽可能多的 htaccess 小技巧，但如果我们缺少了任何重要的技巧，或者你愿意告诉我们你的 htaccess 想法和技巧，你可以在下面的评论框中提交，我们也会在文章中进行介绍。

---

via: <http://www.tecmint.com/apache-htaccess-tricks/>

作者：[Gunjit Khera](http://www.tecmint.com/author/gunjitk94/) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

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


20 款优秀的 Linux 终端仿真器

Summary: 终端仿真器是一款用其它显示架构重现可视终端的计算机程序。换句话说就是终端仿真器能使哑终端看似像一台连接上了服务器的客户机。终端仿真器允许最终用户用文本用户界面和命令行来访问控制台和应用程序。（LCTT 译注：终端仿真器原意指对大型机-哑终端方式的模拟，不过在当今的 Linux 环境中，常指通过远程或本地方式连接的伪终端，俗称终端。）  20款Linux终端仿真器 你能从开源世界中找到大量的终端仿真器，它们有些拥有大量的特性而有些则反之。为了能更好地了解它们的特性，我们收集了一份优秀的Linux终端仿真器清单。每一款都列出了

Guake

竟然没有terminator，差评

你看清楚了么？第一个不是么？

好眼力

不错！

一直用的 xterm

装了guake，果然好用

这个不错哦

来自223.104.95.161的 Chrome Mobile 59.0|Android 5.1 用户

xshell是不是终端模拟器啊

# 20 款优秀的 Linux 终端仿真器

终端仿真器是一款用其它显示架构重现可视终端的计算机程序。换句话说就是终端仿真器能使哑终端看似像一台连接上了服务器的客户机。终端仿真器允许最终用户用文本用户界面和命令行来访问控制台和应用程序。（LCTT 译注：终端仿真器原意指对大型机-哑终端方式的模拟，不过在当今的 Linux 环境中，常指通过远程或本地方式连接的伪终端，俗称“终端”。）

*20款Linux终端仿真器*

你能从开源世界中找到大量的终端仿真器，它们有些拥有大量的特性而有些则反之。为了能更好地了解它们的特性，我们收集了一份优秀的Linux终端仿真器清单。每一款都列出了它们各自的描述和特性以及软件界面截图和下载链接。

### 1. Terminator

Terminator是一款先进且强大的终端仿真器，它支持多终端窗口。这款仿真器可以完全自定义。你可以更改它的界面尺寸、颜色，给它设置不同的形状。拥有高用户友好性且使用起来很有乐趣。

#### Terminator的特性

* 自定义配置和配色方案，根据你的需要设置尺寸。
* 使用插件来提供更多功能。
* 快捷键可以加快普通操作。
* 可以把终端窗口分割成几个虚拟终端并把它们根据需要重新调整尺寸。

*Terminator 终端*

* [Terminator 主页](https://launchpad.net/terminator)
* [下载和安装指引](http://www.tecmint.com/terminator-a-linux-terminal-emulator-to-manage-multiple-terminal-windows/)

### 2. Tilda

Tilda是一款漂亮的下拉式终端，基于GTK+，一键单击你就可以呼出一个新的或隐藏着的Tilda窗口。你也可以用你所选择的颜色来更改文本颜色和终端背景颜色。

#### Tilda的特性

* 高度定制的选项界面设置。
* 你可以给Tilda设置透明度。
* 优秀的嵌入式配色方案。

*Tilda 终端*

* [Tilda 主页](http://tilda.sourceforge.net/tildaabout.php)

### 3. Guake

Guake是一款基于python的下拉式终端，诞生于GNOME桌面环境。一键调出，再按一下就能隐藏。它的设计构思来源于FPS (第一人称射击) 游戏 Quake，其主要目标是容易访问。

Guake与Yakuaka和Tilda非常相似，不过它是一个集上述二者的优点于一体的基于GTK的程序。Guake完全是用Python和C的片段写成的(全局热键部分)。

*Guake 终端*

* [Guake 主页](https://github.com/Guake/guake)

### 4. Yakuake

Yakuake (Yet Another Kuake) 是一款基于KDE的下拉式终端仿真器，它与Guake在功能上非常相似。它的设计构思也是受FPS游戏Quake的启发。

Yakuake从根本上说是一款KDE应用程序，它能非常轻松地安装在KDE桌面上，但是如果你试着将它安装在GNOME桌面上，你将会安装大量的依赖包。

#### Yakuake的特性

* 顺畅地从屏幕顶端弹出
* 标签式界面
* 可配置的尺寸和动画速度
* 可定制

*Yakuake 终端*

* [Yakuake 主页](http://extragear.kde.org/apps/yakuake/)

### 5. ROXTerm

ROXterm是又一款轻量级终端仿真器，旨在提供与“GNOME终端”相似的特性。它原本创造出来是为了避免使用Gnome库从而更少占用空间和更快启动，并使用独立的小程序来显示配置界面(GUI), 但是随着时间的流逝，它的角色就转变为给那些高级用户带来更高层次的特性。

然而，它比GNOME终端更加具有可制定性，并且对于那些经常使用终端的高级用户更令人期望。它能和GNOME桌面环境完美结合并在终端中提供像拖拽项目那样的特性。

*Roxterm 终端*

* [ROXTerm 主页](http://roxterm.sourceforge.net/index.php?page=index&lang=en)

### 6. Eterm

Eterm是最轻量级的一款彩色终端仿真器，是作为xterm的替代品而被设计出来。它是以一种自由选择的理念设计的，带来了更强大、灵活、用户自主把控的终端。

*Eterm 终端*

* [Eterm 主页](http://www.eterm.org/)

### 7. Rxvt

Rxvt 的意思是扩展虚拟终端，它是一款彩色终端仿真器，是为那些不需要一些诸如Tektronix 4014仿真和toolkit-style可配置性等特性的高级用户而生的xterm替代品。

*Rxvt 终端*

* [Rxvt 主页](http://sourceforge.net/projects/rxvt/)

### 8. Wterm

Wterm是另一款以rxvt项目为基础的轻量级彩色终端仿真器。它所包含的特性包括设置背景图片、透明度、反向透明度和大量的设置或运行环境选项让它成为一款可高度自定义的终端仿真器。

*wterm 终端*

* [Wterm 主页](http://sourceforge.net/projects/wterm/)

### 9. LXTerminal

LXTerminal是一款基于VTE的终端仿真器，默认运行于没有任何多余依赖的LXDE(轻量级X桌面环境)下。这款终端有很多很棒的特性。

#### LXTerminal的特性

* 多标签式支持
* 支持常规命令如cp, cd, dir, mkdir, mvdir
* 隐藏菜单栏以保证足够界面空间
* 更改配色方案

*lxterminal 终端*

* [LXTerminal 主页](http://wiki.lxde.org/en/LXTerminal)

### 10. Konsole

Konsole是另一款强大的基于KDE的免费终端仿真器，最初由Lars Doelle创造。

#### Konsole的特性

* 多标签式终端
* 半透明背景
* 支持拆分视图模式
* 目录和SSH书签化
* 可定制的配色方案
* 可定制的按键绑定
* 终端中的活动通知警告
* 增量搜索
* 支持Dolphin文件管理器
* 支持导出显示为普通文本和HTML格式

*Konsole 终端*

* [Konsole 主页](http://konsole.kde.org/)

### 11. TermKit

TermKit是一款漂亮简洁的终端，其目标是用WebKit渲染引擎在基于应用程序的命令行中构建出GUI视图（LCTT 译注：这个描述比较模糊，请参考截图，或安装一个体验下），WebKit渲染引擎在Google Chrome和Chromium中广泛使用。TermKit起初是为Mac和Windows设计的，但是由于Floby对TermKit 构建了分支，现在你可以将它安装在Linux发行版上并感受TermKit带来的魅力。

*TermKit 终端*

* [TermKit 主页](https://github.com/unconed/TermKit)

### 12. st

st是一款简单的X Window终端。

*st 终端*

* [st 主页](http://st.suckless.org/)

### 13. Gnome 终端

GNOME终端是一款在GNOME桌面环境下自带的终端仿真器，由Havoc Pennington和其他一些人共同开发。它允许用户在GNOME环境下可以使用一个真实的Linux shell来运行命令。GNOME终端是模仿了xterm终端仿真器，并有一些相似的特性。

Gnome终端支持多配置文件，用户可以为他们的账户创建多个配置文件，每个配置文件能自定义配置选项，如字体、颜色、背景图片、行为习惯等等，并能分别给每个配置文件取名。它也支持鼠标事件、url探测、多标签等。

*Gnome 终端*

* [Gnome 终端](https://help.gnome.org/users/gnome-terminal/stable/)

### 14. Final Term

Final Term是一款漂亮的开源终端仿真器，在这一个单独的界面里蕴藏着一些令人激动的特性和方便的功能。虽然它仍然有待改进，但是它提供了一些重要的特性比如“语义”文本菜单、智能的命令行补全、GUI终端控制、全能的快捷键、彩色支持等等。以下动图抓取并演示了它们的一些特性，点开来看看吧。

*FinalTerm 终端*

* [Final Term](http://finalterm.org/)

### 15. Terminology

Terminology是又一款新的现代化终端仿真器，为Enlightenment桌面创造，但也能用于其它桌面环境。它有一些独一无二的棒极了的特性，这是其它终端仿真器所不具备的。

抛开这些特性，terminology甚至还提供了你无法从其它仿真器看到的东西，比如图像、视频和文档的缩略图预览，它允许你从Terminology直接就能看到那些文件。

你可以来看看Terminology的开发人员制作的小视频(视频画质不太清晰，但足以让你了解Terminology了)： <https://www.youtube.com/ibPziLRGvkg>

* [Terminology](http://www.enlightenment.org/p.php?p=about/terminology)

### 16. Xfce4 终端

Xfce终端是一款轻量级的现代化终端仿真器，它简单易用，为Xfce桌面环境设计。它最新的一个版本有许多新的炫酷特性，比如搜索对话框、标签颜色转换器、像Guake或Yakuake一样的下拉式控制台等等。

*Xfce 终端*

* [Xfce4 终端](http://docs.xfce.org/apps/terminal/start)

### 17. xterm

xterm应用是一款标准的在X Window系统上的终端仿真器。它保持了对DEC VT102和Tektronix 4014终端的兼容，以支持那些不能直接使用窗口系统的应用。

*xterm 终端*

* [xterm](http://invisible-island.net/xterm/)

### 18. LilyTerm

LilyTerm是一款基于libvte的开源终端仿真器，这款不太出名的仿真器追求的是快速和轻量级。LilyTerm也包括一些关键特性：

* 支持标签、彩色以及标签重新排序
* 通过快捷键管理标签
* 支持背景透明化和饱和度调整
* 支持用户创建配置文件
* 若干个自定义选项
* 广泛支持UTF-8

*Lilyterm 终端*

* [LilyTerm](http://lilyterm.luna.com.tw/)

### 19. Sakura

Sakura是另一款不知名的Unix风格终端仿真器，是为命令行模式和基于文本的终端程序开发的。Sakura基于GTK和livte，自身特性不多，不过还是有一些自定义选项，比如多标签支持、自定义文本颜色、字体和背景图片、快速命令处理等等。

*Sakura 终端*

* [Sakura](https://launchpad.net/sakura)

### 20. rxvt-unicode

rxvt-unicode (也称为urxvt) 是另一个高度可定制、轻量级和快速的终端仿真器，支持xft和unicode，由Marc Lehmann开发。它有许多显著特性，比如通过Unicode支持国际化语言，能显示多种字体类型并支持Perl扩展。

*rxvt unicode*

* [rxvt-unicode](http://software.schmorp.de/pkg/rxvt-unicode)

如果你知道任何其它强大的Linux终端仿真器而上文未提及，欢迎在评论中与我们分享。

---

via: <http://www.tecmint.com/linux-terminal-emulators/>

作者：[Ravi Saive](http://www.tecmint.com/author/admin/) 译者：[ZTinoZ](https://github.com/ZTinoZ) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 上 使用 ONLYOFFICE 协同编辑文档

Summary: 多年前由一些紧张兮兮的、带有强迫症的助理开发的 Bulletin，只是一个放在共享文件夹中只有 Emily 和我可以访问的 Word 文档而已。同一时间我们只有一个人可以打开它并添加消息、想法，或者给条目列表上增加问题。然后我们再打印出更新后的版本并放到我桌子架上的剪贴板，并在完成时删除旧的内容。（《穿普拉达的女王》，劳伦魏丝伯格著 ）  直到今天人们仍然在使用这样的协同编辑，只有一个人可以打开共享文件，对其进行更改，然后告诉其它人什么时候修改了什么。  ONLYOFFICE 是一款集成了文档、电子邮件、事件、任务和客户关系管理工具

http://blog.csdn.net/hotqin888/article/details/79337881<br />
专门针对ONLYOFFICE界面汉化和中文字体。

亲自试验了才知道，onlyoffice document server只能连接20个同时进行编辑。自己电脑都可以试出来，浏览器打开20个文档标签页，就会有提示，再打开多的就只能看，不能编辑了。

# 如何在 Linux 上 使用 ONLYOFFICE 协同编辑文档

>
> “多年前由一些紧张兮兮的、带有强迫症的助理开发的 Bulletin，只是一个放在共享文件夹中只有 Emily 和我可以访问的 Word 文档而已。同一时间我们只有一个人可以打开它并添加消息、想法，或者给条目列表上增加问题。然后我们再打印出更新后的版本并放到我桌子架上的剪贴板，并在完成时删除旧的内容。”（——《穿普拉达的女王》，劳伦·魏丝伯格著 ）
>
>
>

直到今天人们仍然在使用这样的“协同编辑”，只有一个人可以打开共享文件，对其进行更改，然后告诉其它人什么时候修改了什么。

ONLYOFFICE 是一款集成了文档、电子邮件、事件、任务和客户关系管理工具的开源在线办公套件。

使用 ONLYOFFICE 办公套件，一组人可以同时编辑文本、电子表格或者在浏览器上进行展示。可以直接在他们的文档上留下评论并用其中集成的聊天工具和其他人沟通。最后，可以保存文档为 PDF 文件并打印。作为额外的增强功能，它还能浏览文档历史并在如果需要时恢复到之前的修订/版本。

在这篇教程中，我会介绍如何使用 [免费版 ONLYOFFICE](http://www.onlyoffice.org/) 部署你自己的在线办公套件，免费版 ONLYOFFICE 是 ONLYOFFICE 在 GNU AGPL v3 协议下发布的自托管版本。

### 在 Linux 上安装 ONLYOFFICE

安装 ONLYOFFICE 要求在你的 Linux 系统上要有 mono（4.0.0 或更高版本）、nodejs、libstdc++6、nginx 和 mysql-server。为了简化安装过程并避免依赖错误，我使用 Docker 安装 ONLYOFFICE。在这种情况下只需要安装一种依赖 - [Docker](http://xmodulo.com/recommend/dockerbook)。

提醒一下，Docker 是一个在软件容器中自动部署应用的开源项目。如果在你的 Linux 系统上 Docker 不可用，首先根据 [基于 Debian](http://xmodulo.com/manage-linux-containers-docker-ubuntu.html) 或 [基于 Red-Hat](http://xmodulo.com/docker-containers-centos-fedora.html) 系统的 Docker 安装指令安装它。

注意，你需要 Docker 1.4.1 或更高版本。要检查安装的 Docker 版本，可以使用下面的命令。

```
$ docker version

```

在一个 Docker 容器中试用 ONLYOFFICE，只需要执行下面的命令：

```
$ sudo docker run -i -t -d --name onlyoffice-document-server onlyoffice/documentserver
$ sudo docker run -i -t -d -p 80:80 -p 443:443 --link onlyoffice-document-server:document_server onlyoffice/communityserver

```

这些命令会下载为了能正常运行带有所有所需依赖的 [官方 ONLYOFFICE Docker 镜像](https://registry.hub.docker.com/u/onlyoffice/communityserver/)。

也可以在 Linux 服务器上单独安装 [ONLYOFFICE 在线编辑器](http://onlyoffice.org/sources#document)，并通过提供的 API 轻松地集成到你的站点或云应用。

### 运行自行托管的在线 Office

要打开你的在线 office，在你浏览器的地址栏输入 localhost（http://IP地址/）。会打开欢迎页面：

输入一个密码并指定下次访问你的 office 所使用的电子邮件地址。

### 在线编辑文档

首先点击 Document 链接打开 **the My Documents** 文件夹。

#### STEP 1. 选择需要编辑的文档

要在这里新建一个新文档，点击左上角的 “Create” 按钮，从下拉列表中选择文件类型。要编辑保存在你硬盘中的文件，点击 **Create** 按钮旁边的 **Upload** 按钮上传文件到 **Document**。

#### STEP 2. 共享文档

如果你在 **My Documents** 文件夹中，用右边的 **Share** 按钮，或者如果你在文档中，用 **File >> Document Info ... >> Change Access Rights**。

在打开的 **Sharing Settings** 窗口，点击左边的 **People outside portal** 链接，打开到文档的访问，并通过启用 **Full Access** 单选按钮给予完全访问权限。

最后，选择一种方式共享到你文档的链接，通过 email 或者你可用的一种社交网络：Google+、Facebook 或 Twitter 发送。

#### STEP 3. 开始协同编辑

邀请的人只需要根据提供的链接就可以开始协同编辑文档。

它会自动用不用颜色的虚线将你的合作者编辑的文本段落标记出来。

只要你的其中一个协作者保存了他/她的更改，你会看到在顶部工具栏左上角出现了一个提示标签，表示这里有更新。

点击 **Save** 图标保存更改并更新。然后会高亮所有的更新。

#### STEP 4. 和协作者互动

要写评论，用鼠标选择一个文本段落，右击并从上下文菜单中选择 **Add comment** 选项。

要和协作者实时互动，可以使用集成的聊天工具。**Chat** 面板会列出所有正在编辑文档的用户。点击左侧边栏的 **Chat** 图标打开它。在 **Chat** 面板的合适区域输入你的信息开始讨论。

### 有用的提示

最后，这里有一些你充分利用 ONLYOFFICE 的有用提示。

#### Tip #1. 在云存储服务例如 ownCloud 上编辑文档

如果你将文档存储在其它网络资源上，例如 Box、Dropbox、Google Drive、OneDrive、SharePoint 或 ownCloud，你可以轻松地和 ONLYOFFICE 同步。

在打开的 ‘Documents’ 模块，点击 **Add the account** 下面的其中一个图标：Google、Box、DropBox、OneDrive、ownCloud 或 ‘Add account’，并输入所需数据。

#### Tip #2. 在 iPad 上编辑文档

要随时随地对文件进行修改，我使用 iPad 的 ONLYOFFICE Documents 应用。你可以从 [iTune](https://itunes.apple.com/us/app/onlyoffice-documents/id944896972) 下载并安装它，然后你需要输入你的 ONLYOFFICE 地址、email 和密码来访问你的文档。功能设置几乎一样。

为了评估 ONLYOFFICE 在线编辑器的功能，你可以使用供个人使用的 [云版本](https://personal.onlyoffice.com/)。

---

via: <http://xmodulo.com/edit-documents-collaboratively-linux.html>

作者：[Tatiana Kochedykova](http://xmodulo.com/author/tatiana) 译者：[ictlyh](https://github.com/ictlyh) 校对：[wxy](https://github.com/wxy)

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


如何用 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 监控通用服务

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

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

### 在命令行中运行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
        }

```

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

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

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

* 测试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 监控 Linux 服务器

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地址换成你的服务器的地址。

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

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

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

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

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

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

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

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

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

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

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

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

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

### 创建图表树

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

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

### 用户管理

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

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

至此，我们在网络监控系统中部署了一台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 中合并两幅图片

[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 的菜单中： 控制台 > 管理图 > 选择图 > 打开图调试模式。

#### 旧图：

#### 新图：

从样例输出（基于 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 文件中。如果我们点击图，我们可以发现也已经添加了旧图的周、月、年记录。下面图表中的第二幅图显示了旧图的周记录。

总之，该教程显示了如何简单地将两幅 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) 此处简写出错。

# Linux 服务器安全技巧

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

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

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

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

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

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

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

### 七彩虹：lolcat

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

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

lolcat由Moe编写。

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

### 牛郎的牛：cowsay

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是一个简单的每日信息脚本，它基于有些愚蠢但很有趣的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是一个以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是一个有趣的终端应用，它为那些意外的错将ls输成sl的用户显示一个动画。

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

功能包括：

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

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

### 火焰：aafire

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

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

### 矩阵：CMatrix

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

# 如何用Perl访问SQLite数据库

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

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

### 访问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命令可以用于监测日志更新，更新

不错

# watch：定期重复Linux / Unix命令

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

### 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

```

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

```
watch df -h

```

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

```
watch mysqladmin processlist

```

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

```
watch uptime

```

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

```
watch exim -bpc

```

### 1) 指定延迟

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

```

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

```
watch -n 5 date

```

### 2) 连续输出比较

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

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

```

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

```
watch -n 15 -d date

```

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

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

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

```
watch -n 20 -d uptime

```

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

### 3) 不带标题输出

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

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

```

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

```
watch -t date

```

### Watch 帮助

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

```
watch -h [--help]

```

### Watch 版本

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

```
watch -v [--version]

```

**不足**

不幸的是，在终端大小调整时，屏幕不能在下次运行前重画。所有用--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下安装Node.JS的不同方式

如果你要在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，在此之前请卸载旧版本的包以免发生包冲突。

* 从源代码安装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文件

```
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

```

创建一个以.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

```

#### 步骤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下使用的命令列表

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

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

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

```

### 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/

```

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

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

```

运行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

```

#### 步骤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

```

#### 步骤3: 使用NVM

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

### 总结

现在我们已经准备好了在服务端安装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再努力，也和商业无关，只有商业才能贴近生活，技术只能代表一个走势。

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

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

这次采访是《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，假如你要设计操作系统，你必须考虑这些

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

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

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

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

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

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

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

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

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

最常见的文件名例子：

```
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 用户

傻吧

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

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

*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浏览器*

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

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

*连接到Tor网络*

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

*Tor欢迎界面*

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

*在Youtube上看视频*

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

*浏览银行站点*

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

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

*检查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应用启动器*

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

*Tor图标已改变*

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

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

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

*关于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私密浏览指南：

[](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/) 荣誉推出