Skip to content Skip to main navigation Skip to footer

Linux

Linux:十分钟搞清字符集和字符编码

本文将简述字符集,字符编码的概念。以及在遭遇乱码时的一些常用诊断技巧

背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题。当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难。

本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题。

在正式介绍之前,先做个小申明:如果你希望非常精确的理解各个名词的解释,那么可以查阅wikipedia。本文是博主通过自己理解消化后并转化成易懂浅显的表述后的介绍。

Linux:十分钟搞清字符集和字符编码
Linux:十分钟搞清字符集和字符编码

什么是字符集

在介绍字符集之前,我们先了解下为什么要有字符集。我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流。那么在这两者之间的转换规则就需要一个统一的标准,否则把我们的U盘插到老板的电脑上,文档就乱码了;小伙伴QQ上传过来的文件,在我们本地打开又乱码了。于是为了实现转换标准,各种字符集标准就出现了。简单的说字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

那么为什么会有那么多字符集标准呢?这个问题实际非常容易回答。问问自己为什么我们的插头拿到英国就不能用了呢?为什么显示器同时有DVI,VGA,HDMI,DP这么多接口呢?很多规范和标准在最初制定时并不会意识到这将会是以后全球普适的准则,或者处于组织本身利益就想从本质上区别于现有标准。于是,就产生了那么多具有相同效果但又不相互兼容的标准了。

说了那么多我们来看一个实际例子,下面就是屌这个字在各种编码下的十六进制和二进制编码结果,怎么样有没有一种很屌的感觉?

字符集 16进制编码 对应的二进制数据
UTF-8 0xE5B18C 1110 0101 1011 0001 1000 1100
UTF-16 0x5C4C 1011 1000 1001 1000
GBK 0x8CC5 1000 1100 1100 0101

什么是字符编码

字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语,日语。对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表(character repertoire)、编码字符集(coded character set)、字符编码(character encoding form)。其中字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。编码字符集,即用一个编码值code point来表示一个字符在字库中的位置。字符编码,将编码字符集和实际存储数值之间的转换关系。一般来说都会直接将code point的值作为编码后的值直接存储。例如在ASCII中A在表中排第65位,而编码后A的数值是0100 0001也即十进制的65的二进制转换结果。

看到这里,可能很多读者都会有和我当初一样的疑问:字库表和编码字符集看来是必不可少的,那既然字库表中的每一个字符都有一个自己的序号,直接把序号作为存储内容就好了。为什么还要多此一举通过字符编码把序号转换成另外一种存储格式呢?

其实原因也比较容易理解:统一字库表的目的是为了能够涵盖世界上所有的字符,但实际使用过程中会发现真正用的上的字符相对整个字库表来说比例非常低。例如中文地区的程序几乎不会需要日语字符,而一些英语国家甚至简单的ASCII字库表就能满足基本需求。而如果把每个字符都用字库表中的序号来存储的话,每个字符就需要3个字节(这里以Unicode字库为例),这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积是原来的三倍)。算的直接一些,同样一块硬盘,用ASCII可以存1500篇文章,而用3字节Unicode序号存储只能存500篇。于是就出现了UTF-8这样的变长编码。在UTF-8编码中原本只需要一个字节的ASCII字符,仍然只占一个字节。而像中文及日语这样的复杂字符就需要2个到3个字节来存储。

UTF-8和Unicode的关系

看完上面两个概念解释,那么解释UTF-8和Unicode的关系就比较简单了。Unicode就是上文中提到的编码字符集,而UTF-8就是字符编码,即Unicode规则字库的一种实现形式。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。详见:Unicode on Wikipedia

Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符。而UTF-8则只实现了第一个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符的处理困难(下文会有提到)。

UTF-8编码简介

为了更好的理解后面的实际应用,我们这里简单的介绍下UTF-8的编码实现方法。即UTF-8的物理存储和Unicode序号的转换关系。

UTF-8编码为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。

  • 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
  • 如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后一个字节的除10外的部分(6个bit)代表在Unicode中的序号。且第二个字节以10开头
  • 如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后两个字节的除10外的部分(12个bit)代表在Unicode中的序号。且第二、第三个字节以10开头
  • 如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)和之前的部分一同组成在Unicode中的序号。

具体每个字节的特征可见下表,其中x代表序号部分,把各个字节中的所有x部分拼接在一起就组成了在Unicode字库中的序号

Byte 1 Byte 2 Byte3
0xxx xxxx    
110x xxxx 10xx xxxx  
1110 xxxx 10xx xxxx 10xx xxxx

我们分别看三个从一个字节到三个字节的UTF-8编码例子:

实际字符 在Unicode字库序号的十六进制 在Unicode字库序号的二进制 UTF-8编码后的二进制 UTF-8编码后的十六进制
$ 0024 010 0100 0010 0100 24
¢ 00A2 000 1010 0010 1100 0010 1010 0010 C2 A2
20AC 0010 0000 1010 1100 1110 0010 1000 0010 1010 1100 E2 82 AC

细心的读者不难从以上的简单介绍中得出以下规律:

  • 3个字节的UTF-8十六进制编码一定是以E开头的
  • 2个字节的UTF-8十六进制编码一定是以C或D开头的
  • 1个字节的UTF-8十六进制编码一定是以比8小的数字开头的

为什么会出现乱码

先科普下乱码的英文native说法是mojibake。

简单的说乱码的出现是因为:编码和解码时用了不同或者不兼容的字符集。对应到真实生活中,就好比是一个英国人为了表示祝福在纸上写了bless(编码过程)。而一个法国人拿到了这张纸,由于在法语中bless表示受伤的意思,所以认为他想表达的是受伤(解码过程)。这个就是一个现实生活中的乱码情况。在计算机科学中一样,一个用UTF-8编码后的字符,用GBK去解码。由于两个字符集的字库表不一样,同一个汉字在两个字符表的位置也不同,最终就会出现乱码。

我们来看一个例子:假设我们用UTF-8编码存储很屌两个字,会有如下转换:

字符 UTF-8编码后的十六进制
E5BE88
E5B18C

于是我们得到了E5BE88E5B18C这么一串数值。而显示时我们用GBK解码进行展示,通过查表我们获得以下信息:

两个字节的十六进制数值 GBK解码后对应的字符
E5BE
88E5
B18C

解码后我们就得到了寰堝睂这么一个错误的结果,更要命的是连字符个数都变了。

如何识别乱码的本来想要表达的文字

要从乱码字符中反解出原来的正确文字需要对各个字符集编码规则有较为深刻的掌握。但是原理很简单,这里用最常见的UTF-8被错误用GBK展示时的乱码为例,来说明具体反解和识别过程。

第1步 编码

假设我们在页面上看到寰堝睂这样的乱码,而又得知我们的浏览器当前使用GBK编码。那么第一步我们就能先通过GBK把乱码编码成二进制表达式。当然查表编码效率很低,我们也可以用以下SQL语句直接通过MySQL客户端来做编码工作:

mysql [localhost] {msandbox} > select hex(convert('寰堝睂' using gbk));
+-------------------------------------+
| hex(convert('寰堝睂' using gbk))    |
+-------------------------------------+
| E5BE88E5B18C                        |
+-------------------------------------+
1 row in set (0.01 sec)

第2步 识别

现在我们得到了解码后的二进制字符串E5BE88E5B18C。然后我们将它按字节拆开。

Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6
E5 BE 88 E5 B1 8C

然后套用之前UTF-8编码介绍章节中总结出的规律,就不难发现这6个字节的数据符合UTF-8编码规则。如果整个数据流都符合这个规则的话,我们就能大胆假设乱码之前的编码字符集是UTF-8

第3步 解码

然后我们就能拿着E5BE88E5B18C用UTF-8解码,查看乱码前的文字了。当然我们可以不查表直接通过SQL获得结果:

mysql [localhost] {msandbox} ((none)) > select convert(0xE5BE88E5B18C using utf8);
+------------------------------------+
| convert(0xE5BE88E5B18C using utf8) |
+------------------------------------+
| 很屌                               |
+------------------------------------+
1 row in set (0.00 sec)

常见问题处理之Emoji

所谓Emoji就是一种在Unicode位于u1F601-u1F64F区段的字符。这个显然超过了目前常用的UTF-8字符集的编码范围u0000-uFFFF。Emoji表情随着IOS的普及和微信的支持越来越常见。下面就是几个常见的Emoji:

emoji1emoji2emoji3

那么Emoji字符表情会对我们平时的开发运维带来什么影响呢?最常见的问题就在于将他存入MySQL数据库的时候。一般来说MySQL数据库的默认字符集都会配置成UTF-8(三字节),而utf8mb4在5.5以后才被支持,也很少会有DBA主动将系统默认字符集改成utf8mb4。那么问题就来了,当我们把一个需要4字节UTF-8编码才能表示的字符存入数据库的时候就会报错:ERROR 1366: Incorrect string value: ‘xF0x9Dx8Cx86’ for column 。

如果认真阅读了上面的解释,那么这个报错也就不难看懂了。我们试图将一串Bytes插入到一列中,而这串Bytes的第一个字节是xF0意味着这是一个四字节的UTF-8编码。但是当MySQL表和列字符集配置为UTF-8的时候是无法存储这样的字符的,所以报了错。

那么遇到这种情况我们如何解决呢?有两种方式:升级MySQL到5.6或更高版本,并且将表字符集切换至utf8mb4。第二种方法就是在把内容存入到数据库之前做一次过滤,将Emoji字符替换成一段特殊的文字编码,然后再存入数据库中。之后从数据库获取或者前端展示时再将这段特殊文字编码转换成Emoji显示。第二种方法我们假设用-*-1F601-*-来替代4字节的Emoji,那么具体实现python代码可以参见Stackoverflow上的回答

来源:http://cenalulu.github.io/linux/character-encoding/

Linux:docker index服务概述

index顾名思义“索引”,index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,如下图所示,首先会去index服务上 做认证,然后查找镜像所在的registry的地址并放回给docker客户端,最终docker客户端再从registry下载镜像,当然在下载过程中 registry会去index校验客户端token的合法性。不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。

Linux:docker index服务概述
Linux:docker index服务概述

开源社区docker仓库 的实现,有两种运行模式

(1)standalone=true:在这种模式下,仓库自身提供了简单的index服务,在实现过程中index只是实现了简单的索引功能,没有实现用户认证功能

(2)standalone=false:在这种模式下,需要配置index的服务访问点,需自行实现index服务

index服务对外提供的接口

index对外提供的REST API接口如下:

  • PUT /v1/repositories/(namespace)/(repo_name)/

    在docker push的流程中会调用到,其作用是创建一个repository。创建之前会对用户密码以及权限进行验证,如果合法,则最终会返回一个token至docker客户端

  • DELETE /v1/repositories/(namespace)/(repo_name)/

    删除一个repository,删除之前会对用户密码以及权限进行验

  • PUT /v1/repositories/(namespace)/(repo_name)/images

    在docker push流程中会调用到,其作用是更新repository对应的image列表,更新之前会校验携带的token

  • GET /v1/repositories/(namespace)/(repo_name)/images

    在docker pull流程中会调用到,其作用是获取repository对应的image列表。获取之前会对用户密码以及权限进行验证

  • PUT /v1/repositories/(namespace)/(repo_name)/auth

    校验token的合法性

  • GET /v1/users/

    docker login会调用到此接口,用来验证用户的合法性

  • POST /v1/users/

    docker login会调用到此接口,可用来创建一个用户

  • PUT /v1/users/username/

    用来更新用户信息

各个接口的请求的具体Header、Action、Response,可参考 这里

index服务已有的开源实现

https://github.com/ekristen/docker-index,采用node js实现,其中实现了一套简单的用户管理。

来源:http://openstack.wiaapp.com/?p=1201&utm;_source=tuicool

Linux:理解和解决 MySQL 乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案

在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码

MySQL出现乱码的原因

要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为。为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段。

Linux:理解和解决 MySQL 乱码问题
Linux:理解和解决 MySQL 乱码问题

存入MySQL经历的编码转换过程

Linux:理解和解决 MySQL 乱码问题
Linux:理解和解决 MySQL 乱码问题

上图中有3次编码/解码的过程(红色箭头)。三个红色箭头分别对应:客户端编码,MySQL Server解码,Client编码向表编码的转换。其中Terminal可以是一个Bash,一个web页面又或者是一个APP。本文中我们假定Bash是我们的Terminal,即用户端的输入和展示界面。图中每一个框格对应的行为如下:

  • 在terminal中使用输入法输入
  • terminal根据字符编码转换成二进制流
  • 二进制流通过MySQL客户端传输到MySQL Server
  • Server通过character-set-client解码
  • 判断character-set-client和目标表的charset是否一致
  • 如果不一致则进行一次从client-charset到table-charset的一次字符编码转换
  • 将转换后的字符编码二进制流存入文件中

从MySQL表中取出数据经历的编码转换过程

Linux:理解和解决 MySQL 乱码问题
Linux:理解和解决 MySQL 乱码问题
上图有3次编码/解码的过程(红色箭头)。上图中三个红色箭头分别对应:客户端解码展示,MySQL Server根据character-set-client编码,表编码向character-set-client编码的转换。

  • 从文件读出二进制数据流
  • 用表字符集编码进行解码
  • 将数据转换为character-set-client的编码
  • 使用character-set-client编码为二进制流
  • Server通过网络传输到远端client
  • client通过bash配置的字符编码展示查询结果

造成MySQL乱码的原因

1. 存入和取出时对应环节的编码不一致

这个会造成乱码是显而易见的。我们把存入阶段的三次编解码使用的字符集编号为C1,C2,C3(图一从左到右);取出时的三个字符集依次编号为C1’,C2’,C3’(从左到右)。那么存入的时候bash C1用的是UTF-8编码,取出的时候,C1’我们却使用了windows终端(默认是GBK编码),那么结果几乎一定是乱码。又或者存入MySQL的时候set names utf8(C2),而取出的时候却使用了set names gbk(C2′),那么结果也必然是乱码

2. 单个流程中三步的编码不一致

即上面任意一幅图中的同方向的三步中,只要两步或者两部以上的编码有不一致就有可能出现编解码错误。如果差异的两个字符集之间无法进行无损编码转换(下文会详细介绍),那么就一定会出现乱码。例如:我们的shell是UTF8编码,MySQL的character-set-client配置成了GBK,而表结构却又是charset=utf8,那么毫无疑问的一定会出现乱码。

这里我们就简单演示下这种情况:

master [localhost] {msandbox} (test) > create table charset_test_utf8 (id int primary key auto_increment, char_col varchar(50)) charset = utf8;
Query OK, 0 rows affected (0.04 sec)
master [localhost] {msandbox} (test) > set names gbk;
Query OK, 0 rows affected (0.00 sec)
master [localhost] {msandbox} (test) > insert into charset_test_utf8 (char_col) values ('中文');
Query OK, 1 row affected, 1 warning (0.01 sec)
master [localhost] {msandbox} (test) > show warnings;
+---------+------+---------------------------------------------------------------------------+
| Level   | Code | Message                                                                   |
+---------+------+---------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: 'xADxE6x96x87' for column 'char_col' at row 1 |
+---------+------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
master [localhost] {msandbox} (test) > select id,hex(char_col),char_col from charset_test_utf8;
+----+----------------+----------+
| id | hex(char_col)  | char_col |
+----+----------------+----------+
|  1 | E6B6933FE69E83 | �?��        |
+----+----------------+----------+
1 row in set (0.01 sec)

关于MySQL的编/解码

既然系统之间是按照二进制流进行传输的,那直接把这串二进制流直接存入表文件就好啦。为什么在存储之前还要进行两次编解码的操作呢?

  • Client to Server的编解码的原因是MySQL需要对传来的二进制流做语法和词法解析。如果不做编码解析和校验,我们甚至没法知道传来的一串二进制流是insert还是update。
  • File to Engine的编解码是为知道二进制流内的分词情况。举个简单的例子:我们想要从表里取出某个字段的前两个字符,执行了一句形如select left(col,2) from table的语句,存储引擎从文件读入该column的值是E4B8ADE69687。那么这个时候如果我们按照GBK把这个值分割成E4B8,ADE6,9687三个字,并那么返回客户端的值就应该是E4B8ADE6;如果按照UTF8分割成E4B8AD,E69687,那么就应该返回E4B8ADE69687两个字。可见,如果在从数据文件读入数据后,不进行编解码的话在存储引擎内部是无法进行字符级别的操作的。

来源:http://cenalulu.github.io/mysql/mysql-mojibake/

Linux:在Linux上使用Python和Flask创建你的第一个应用

Linux:在Linux上使用Python和Flask创建你的第一个应用
Linux:在Linux上使用Python和Flask创建你的第一个应用

无论你在linux上娱乐还是工作,这对你而言都是一个使用python来编程的很好的机会。回到大学我希望他们教我的是Python而不是Java,这学起来很有趣且在实际的应用如yum包管理器中很有用。

本篇教程中我会带你使用python和一个称为flask的微型框架来构建一个简单的应用,来显示诸如每个进程的内存使用,CPU百分比之类有用的信息。

前置需求

Python基础、列表、类、函数、模块。HTML/CSS (基础)。

学习这篇教程你不必是一个python高级开发者,但是首先我建议你阅读 https://wiki.python.org/moin/BeginnersGuide/NonProgrammers

在Linux上安装Python 3

在大多数Linux发行版上Python是默认安装的。下面的你命令可以让你看到安装的版本。

[root@linux-vps ~]# python -V
Python 2.7.5

我们会使用3.x的版本来构建我们的app。根据Python.org所说,现在只对这个版本进行改进,而且不向后兼容Python 2。

注意: 在开始之前,我强烈建议你在虚拟机中尝试这个教程,因为Python是许多Linux发行版的核心组件,任何意外都可能会损坏你的系统。

以下步骤是基于红帽的版本如CentOS(6和7),基于Debian的版本如UbuntuMint和Resbian可以跳过这步,Pythonn 3应该默认已经安装了。如果没有安装,请用apt-get而不是yum来安装下面相应的包。

[leo@linux-vps] yum groupinstall 'Development Tools'
[leo@linux-vps] yum install -y zlib-dev openssl-devel sqlite-devel bzip2-devel
[leo@linux-vps] wget https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz
[leo@linux-vps] tar -xvzf Python-3.4.2.tgz
[leo@linux-vps] cd Python-3.4.2
[leo@linux-vps] ./configure
[leo@linux-vps] make
# 推荐使用 make altinstall 以覆盖当前的 python 库
[leo@linux-vps]   make altinstall

成功安装后,你应该可以用下面的命令进入Python3.4的shell了。

[leo@linux-vps]# python3.4
Python 3.4.2 (default, Dec 12 2014, 08:01:15)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit ()

使用pip来安装包

Python有它自己的包管理去,与yum和apt-get相似。你将需要它来下载、安装和卸载包。

[leo@linux-vps] pip3.4 install "packagename"
[leo@linux-vps] pip3.4 list
[leo@linux-vps] pip3.4 uninstall "packagename"

Python虚拟环境

在Python中虚拟环境是一个放置你的项目的依赖环境的目录。这是一个将带有不同的依赖环境的项目隔离的好办法。它可以让你不用sudo命令就能安装包。

[leo@linux-vps] mkdir python3.4-flask
[leo@linux-vps] cd python3.4-flask
[leo@linux-vps python3.4-flask] pyvenv-3.4 venv

要创建虚拟环境你需要使用“pyvenv-3.4”命令。上述命令会在venv文件夹的内部创建一个名为lib的目录,这里会安装项目所依赖的包。这里同样会创建一个bin文件夹容纳该环境下的pip和python可执行文件。

为我们的Linux系统信息项目激活虚拟环境

 [leo@linux-vps python3.4-flask] source venv/bin/activate
 [leo@linux-vps python3.4-flask] which pip3.4
~/python3.4-flask/venv/bin/pip3.4
[leo@linux-vps python3.4-flask] which python3.4
~/python3.4-flask/venv/bin/python3.4

使用pip安装flask

让我们继续安装第一个模块flask框架,它可以处理访问路由和渲染显示我们app的模板。

[leo@linux-vps python3.4-flask]pip3.4 install flask

来源:https://linux.cn/article-5044-1.html

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

NativeScript是一款使用JavaScript语言来构建跨平台原生移动应用的开源框架,支持iOS、Android和Windows Phone。且NativeScript的使用没有过多繁杂的要求,只需使用自己已经掌握的JavaScript和CSS技能就能开发出真正具有原生用户 体验的移动应用。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

作 为免费开源项目的NativeScript,它的源码已经托管至Github上,让开发者可以没有任何门槛约束的随意使用。除了无需学习新的编程语言,使 用大家所熟识的JavaScript编码及CSS打造应用样式外,NativeScript的强大之处还有使用跨平台的UI抽象、共享业务逻辑和第三方原 生库。

100%访问原生平台API:整个原生平台功能在JavaScript层都是可用的。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

基于ECMAScript5+JavaScript和CSS标准:使用现有的技能构建原生应用。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

100%共享代码:基于一次编码,构建Android、iOS和Windows Phone应用。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

使用NativeScript开发的应用展示:

Amroo:

Amroo是一款专为养宠物的人员打造的应用,当你要出差或是度假时,可以通过这款应用找到可以帮你照看宠物的人。简单直观的界面设计与功能,都是通过NativeScript实现的,你也可以试试。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

Tasks:

Tasks是用于规划和监督事情进程的任务管理应用,它的构建当然也是来自NativeScript技术。

Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript
Linux:原生体验挡不住!JavaScript开源跨平台框架NativeScript

传送门:NativeScript官网Github托管地址

来源:http://www.csdn.net/article/2015-03-10/2824153-NativeScript

Linux:Linux有问必答:如何在脚本中获取进程ID(PID)

提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。

当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。

Linux:Linux有问必答:如何在脚本中获取进程ID(PID)
Linux:Linux有问必答:如何在脚本中获取进程ID(PID)

在某些情况下,你也许想要知道运行中的子shell的PID。这个PID信息可以在不同的情况下使用。比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身的子shell。

在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量只读,你不可以在脚本中修改它。比如:

#!/bin/bash
echo "PID of this script: $$"

上面的脚本会得到下面的输出:

PID of this script: 6583

除了$$, bash shell还会导出其他的只读变量。比如,PPID存储子shell父进程的ID(也就是主shell)。UID存储了执行这个脚本的当前用户ID。比如:

#!/bin/bash
echo "PID of this script: $$"
echo "PPID of this script: $PPID"
echo "UID of this script: $UID"

输出是:

PID of this script: 6686
PPID of this script: 4656
UID of this script: 1000

上面输出中,PID每次执行都会变化。这个因为每次运行都会创建一个新的shell。另一方面,PPID每次都会一样只要你在同一个shell中运行。

Linux:Linux有问必答:如何在脚本中获取进程ID(PID)
Linux:Linux有问必答:如何在脚本中获取进程ID(PID)

对于所有bash内置变量列表,参考man页。

$ man bash

via: http://ask.xmodulo.com/process-id-pid-shell-script.html

译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5051-1.html

Linux:Docker背后的内核知识:命名空间资源隔离

Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用户最直观的感觉就是使用后根目录/的挂载点切换了,即文件系统被隔离了。然后,为了在分布式的环境下进行通信和定位,容器必然需要一个独立的IP、端口、路由等等,自然就想到了网络的隔离。同时,你的容器还需要一个独立的主机名以便在网络中标识自己。想到网络,顺其自然就想到通信,也就想到了进程间通信的隔离。可能你也想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有自己的PID,自然也需要与宿主机中的PID进行隔离。

Linux:Docker背后的内核知识:命名空间资源隔离
Linux:Docker背后的内核知识:命名空间资源隔离

由此,我们基本上完成了一个容器所需要做的六项隔离,Linux内核中就提供了这六种命名空间(namespace)隔离的系统调用,如下表所示。

Namespace

系统调用参数

隔离内容

UTS

CLONE_NEWUTS

主机名与域名

IPC

CLONE_NEWIPC

信号量、消息队列和共享内存

PID

CLONE_NEWPID

进程编号

Network

CLONE_NEWNET

网络设备、网络栈、端口等等

Mount

CLONE_NEWNS

挂载点(文件系统)

User

CLONE_NEWUSER

用户和用户组

表 namespace六项隔离

实际上,Linux内核实现namespace的主要目的就是为了实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身于一个独立的系统环境中,以此达到独立和隔离的目的。

需要说明的是,本文所讨论的namespace实现针对的均是Linux内核3.8及其以后的版本。接下来,我们将首先介绍使用namespace的API,然后针对这六种namespace进行逐一讲解,并通过程序让你亲身感受一下这些隔离效果{![参考自http://lwn.net/Articles/531114/]}。

1. 调用namespace的API

namespace的API包括clone()、setns()以及unshare(),还有/proc下的部分文件。为了确定隔离的到底是哪种namespace,在使用这些API时,通常需要指定以下六个常数的一个或多个,通过|(位或)操作来实现。你可能已经在上面的表格中注意到,这六个参数分别是CLONE_NEWIPC、CLONE_NEWNS、CLONE_NEWNET、CLONE_NEWPID、CLONE_NEWUSER和CLONE_NEWUTS。

(1)通过clone()创建新进程的同时创建namespace

使用clone()来创建一个独立namespace的进程是最常见做法,它的调用方式如下。

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

clone()实际上是传统UNIX系统调用fork()的一种更通用的实现方式,它可以通过flags来控制使用多少功能。一共有二十多种CLONE_*的flag(标志位)参数用来控制clone进程的方方面面(如是否与父进程共享虚拟内存等等),下面外面逐一讲解clone函数传入的参数。

  • 参数child_func传入子进程运行的程序主函数。
  • 参数child_stack传入子进程使用的栈空间
  • 参数flags表示使用哪些CLONE_*标志位
  • 参数args则可用于传入用户参数

在后续的内容中将会有使用clone()的实际程序可供大家参考。

(2)查看/proc/[pid]/ns文件

从3.8版本的内核开始,用户就可以在/proc/[pid]/ns文件下看到指向不同namespace号的文件,效果如下所示,形如[4026531839]者即为namespace号。

$ ls -l /proc/$$/ns         <<-- $$ 表示应用的PID
total 0
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 net -> net:[4026531956]
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 user->user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Jan  8 04:12 uts -> uts:[4026531838]

如果两个进程指向的namespace编号相同,就说明他们在同一个namespace下,否则则在不同namespace里面。/proc/[pid]/ns的另外一个作用是,一旦文件被打开,只要打开的文件描述符(fd)存在,那么就算PID所属的所有进程都已经结束,创建的namespace就会一直存在。那如何打开文件描述符呢?把/proc/[pid]/ns目录挂载起来就可以达到这个效果,命令如下。

# touch ~/uts
# mount --bind /proc/27514/ns/uts ~/uts

如果你看到的内容与本文所描述的不符,那么说明你使用的内核在3.8版本以前。该目录下存在的只有ipc、net和uts,并且以硬链接存在。

(3)通过setns()加入一个已经存在的namespace

上文刚提到,在进程都结束的情况下,也可以通过挂载的形式把namespace保留下来,保留namespace的目的自然是为以后有进程加入做准备。通过setns()系统调用,你的进程从原先的namespace加入我们准备好的新namespace,使用方法如下。

int setns(int fd, int nstype);
  • 参数fd表示我们要加入的namespace的文件描述符。上文已经提到,它是一个指向/proc/[pid]/ns目录的文件描述符,可以通过直接打开该目录下的链接或者打开一个挂载了该目录下链接的文件得到。
  • 参数nstype让调用者可以去检查fd指向的namespace类型是否符合我们实际的要求。如果填0表示不检查。

为了把我们创建的namespace利用起来,我们需要引入execve()系列函数,这个函数可以执行用户命令,最常用的就是调用/bin/bash并接受参数,运行起一个shell,用法如下。

fd = open(argv[1], O_RDONLY);   /* 获取namespace文件描述符 */
setns(fd, 0);                   /* 加入新的namespace */
execvp(argv[2], &argv[2]);      /* 执行程序 */

假设编译后的程序名称为setns。

# ./setns ~/uts /bin/bash   # ~/uts 是绑定的/proc/27514/ns/uts

至此,你就可以在新的命名空间中执行shell命令了,在下文中会多次使用这种方式来演示隔离的效果。

(4)通过unshare()在原先进程上进行namespace隔离

最后要提的系统调用是unshare(),它跟clone()很像,不同的是,unshare()运行在原先的进程上,不需要启动一个新进程,使用方法如下。

int unshare(int flags);

调用unshare()的主要作用就是不启动一个新进程就可以起到隔离的效果,相当于跳出原先的namespace进行操作。这样,你就可以在原进程进行一些需要隔离的操作。Linux中自带的unshare命令,就是通过unshare()系统调用实现的,有兴趣的读者可以在网上搜索一下这个命令的作用。

(5)延伸阅读:fork()系统调用

系统调用函数fork()并不属于namespace的API,所以这部分内容属于延伸阅读,如果读者已经对fork()有足够的了解,那大可跳过。

当程序调用fork()函数时,系统会创建新的进程,为其分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的进程中,只有少量数值与原来的进程值不同,相当于克隆了一个自己。那么程序的后续代码逻辑要如何区分自己是新进程还是父进程呢?

fork()的神奇之处在于它仅仅被调用一次,却能够返回两次(父进程与子进程各返回一次),通过返回值的不同就可以进行区分父进程与子进程。它可能有三种不同的返回值:

  • 在父进程中,fork返回新创建子进程的进程ID
  • 在子进程中,fork返回0
  • 如果出现错误,fork返回一个负值

下面给出一段实例代码,命名为fork_example.c。

#include 
#include 
int main (){
    pid_t fpid; //fpid表示fork函数返回的值
    int count=0;
    fpid=fork();
    if (fpid < 0)printf("error in fork!");
    else if (fpid == 0) {
        printf("I am child. Process id is %d/n",getpid());
    }
    else {
        printf("i am parent. Process id is %d/n",getpid());
    }
    return 0;
}

编译并执行,结果如下。

root@local:~# gcc -Wall fork_example.c && ./a.out
I am parent. Process id is 28365
I am child. Process id is 28366

使用fork()后,父进程有义务监控子进程的运行状态,并在子进程退出后自己才能正常退出,否则子进程就会成为“孤儿”进程。

下面我们将分别对六种namespace进行详细解析。

来源:http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation

Linux:WordPress 可以触发 Linux 上的 Ghost 缺陷

建议用户马上更新可用的补丁

Linux:WordPress 可以触发 Linux 上的 Ghost 缺陷
Linux:WordPress 可以触发 Linux 上的 Ghost 缺陷

这个漏洞之前由Qualys的安全研究员发现,并取了绰号叫Ghost,可以利用WordPress或其他PHP应用来攻击网站服务器。

这个瑕疵是一个缓冲区溢出问题,可以被攻击者触发用来获取Linux主机的命令行执行权限。发生在glibc的“__nss_hostname_digits_dots()”函数中,它会被“gethostbyname()”函数用到。

PHP应用可以用来利用这个瑕疵

Sucuri的Marc-Alexandre Montpas说之所以这个问题很重要是因为这些函数在大量软件和服务器系统使用。

“说这是个严重问题的一个例子是WordPress本身:它使用一个叫wp_http_validate_url()的函数来验证每个pingback的发送URL,它是通过PHP应用的“gethostbyname()”函数替代来执行的”,他在周三的一篇博客文章里写到。

攻击者可以用这种方式来引入一个设计用来触发服务器端漏洞的恶意URL,从而获得系统访问权限。

实际上,Trustwave的安全研究人员提供了验证代码,可以使用WordPress的pingback功能引起缓冲区溢出。

多个Linux发行版受到影响

ghost漏洞存在于glibc 2.17以上版本中,发布于2013年5月21日。glibc当前版本是2.20,发布于2014年9月。

不过,当时并没有升级为一个安全补丁,许多发行版并没有包含进去,特别是提供长期支持(LTS)的发行版。

受影响的系统包括Debian 7(wheezy),Red Hat企业版Linux 6和7,CentOS 6和7,Ubuntu 12.04。幸运的是,Linux供应商已经开始发布可以减轻风险的升级补丁。建议用户马上下载并更新。

为了展示这个漏洞,Qualys建立了一个利用它通过Exim邮件服务器运行远程代码的试验页面。这家安全公司声称在这个漏洞丢掉半条命之前不会关闭这个页面,意思是受影响的系统的数量降到50%的水平。

Linux上存在漏洞的应用包括clockdiff,ping和arping(在某些特定情况下),procmail,pppd,和Exim邮件服务器。


via: http://news.softpedia.com/news/WordPress-Can-Be-Used-to-Leverage-Critical-Ghost-Flaw-in-Linux-471730.shtml

作者:Ionut Ilascu 译者:zpl1025 校对:wxy

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

来源:https://linux.cn/article-5061-1.html

Linux:Puppet 简介

每个IT专家都遭受过代码在生产环境上不能正常运行的困境。有经验的开发者耗费几个小时、几天、乃至几个星期的时间进行应用程序开发,但在应用发布之后就不得不持续不断地为它打各种补丁。质量保证工程师能够确保应用达到了高性能和低磁盘占用的各种指标……但只限于他们的测试系统环境。运维工程师在进行每次部署操作都得逐字逐句地仔细对照检查表,结果发现他们还是得整日整夜地加班工作,才能够让应用能够在生产环境上正常运行(或者说苟延残喘)。

与此同时,公司的执行长官们则是暴跳如雷。因为他们认为自己已经花了这么多钱,却依然得不到满意的结果。“为什么新的特性要这么长时间才能发布,连改一个bug都要这么久?”客户们在远离我们的产品,竞争者的技术已经远远领先我们,就连华尔街也留意到了我们的颓势。

陷入以上这种困境的IT组织通常极度缺乏组织纪律。开发、运维和测试人员的管理各行其是,各自遵循不同的衡量标准和工作目标,他们或许在不同的大楼里工作,有些人甚至从来没有见过面。这些团队很可能使用不同的技术栈进行工作,各自使用不同的配置。应用程序的代码或许还算稳健,但除此之外就是一团散沙了。能够在开发者的笔记本、或是在QA环境下正常工作的代码,往往在部署到生产环境后就会出现问题。最糟糕的是:没人知道问题的根源在哪里。

Puppet的创始人Luke Kanies曾经也是那些在数据中心中彻夜加班的运维人员之一。正是出于对现状的不满,促使他编写了这套如今被称为Puppet的软件。

Linux:Puppet 简介
Linux:Puppet 简介

等一下——我们刚才谈论的不是组织的问题吗?一套软件怎么能够解决组织文化的问题,并促进团队的协作呢?答案是,软件确实做不到这一点,至少它本身是做不到的。Puppet是一个优秀的基础设施管理平台,可以让每个系统管理员更高效地完成工作,哪怕是一个封闭的运维团队也能够掌握。而对于那些准备提高团队的协作能力的组织来说,Puppet能够为共享的代码库提供一种强力的粘合剂,以统一不同团队的工作。请耐心地听我介绍Puppet的工作原理,以及它是如何帮助处于各种不同状况的团队增强协作能力,以进行软件开发和发布的——这种工作方式的演变通常被称做DevOps。

Puppet是什么?

“Puppet”这个词实际上包括了两层含义:它既代表编写这种代码的语言,也代表对基础设施进行管理的平台。

Puppet语言

Puppet是一种简单的建模语言,使用它编写的代码能够对基础设施的管理实现自动化。Puppet允许对整个系统(我们称之为节点)所希望达到的最终状态进行简单地描述。这与过程式的脚本有明显的不同:编写过程式的脚本需要你清楚地知道如何将某个特定的系统转变至某种特定的状态,并且正确地编写所有这些步骤。而使用Puppet时,你不需要了解或指定达到最终状态的步骤,你也无需担心因为错误的步骤顺序,或是细微的脚本错误而造成错误的结果。

与过程式的脚本的另一点不同在于,Puppet的语言能够跨平台运行。Puppet将状态进行了抽象,而不依赖于具体实现,因此你就可以专注在你所关心的那一部分系统,而将实现的细节,例如命令的名称、参数及文件格式等等交给Puppet自己负责。举例来说,你可以通过Puppet对所有的用户以相同的方式进行管理,无论该用户是用NetInfo或是/etc/passwd方式进行存储的。

这种抽象的概念正是Puppet功能的关键所在,它允许使用者自由选择最适合他本人的代码对系统进行管理。这意味着团队之间能够更好地进行协作,团队成员也能够对他们所不了解的资源进行管理,这种方式促进了团队共同承担责任的意识。

Puppet这门建模语言的另一个优势在于:它是可重复的。通常来说,要继续执行脚本文件,必须对系统进行变更。但Puppet可以被不断地重复执行,如果系统已经达到了目标状态,Puppet就会确保停留在该状态上。

资源

Puppet语言的基础在于对资源的声明。每个资源都定义了系统的一个组件,例如某个必须运行的服务,或是某个必须被安装的包。以下是一些其它类型资源的示例:

  • 某个用户帐号
  • 某个特定的文件
  • 某个文件夹
  • 某个软件包
  • 某个运行中的服务

可以将资源想象为构建块,他们将结合在一起,对你所管理的系统的目标状态进行建模。

接下来,我们将接触到Puppet中更深入核心的定义,这些定义允许你以一种经济的方式将资源进行结合,而经济正是Puppet的关键特色之一。

类型与提供者

Puppet将类似的资源以类型的方式进行组织。举例来说,用户是一种类型,文件是另一种类型,而服务又是一种类型。当你正确地对某个资源的类型进行描述之后,接下来只需描述该资源所期望的状态即可。比起传统的写法:“运行这个命令,以启动XYZ服务”,你只需简单地表示:“保证XYZ处于运行状态”就可以了。

提供者则在一种特定的系统中,使用该系统本身的工具实现各种资源类型。由于类型与提供者的定义被区分开来,因此某个单一的资源类型(例如“包”)就能够管理多种不同的系统中所定义的包。举例来说,你的“包”资源能够管理Red Hat系统下的yum、基于Debian的系统下的dpkg和apt,以及BSD系统中的端口。

管理员通常来说不大有机会对提供者进行定义,除非管理员打算改变系统的默认值。Puppet中已经精确的写入了提供者,因此你无需了解如何对运行在基础设施中的各种操作系统或平台进行管理。再次声明,由于Puppet将细节进行了抽象,因此你无需担心各种细节问题。如果你确实需要编写提供者,那也通常能够找到一些简单的Ruby代码,其中封装了各种shell命令,因此通常非常简短,同时也便于创建。

类型和提供者使得Puppet能够运行在各种主流平台上,并且允许Puppet不断成长与进化,以支持运算服务器之外的各种平台,例如网络与存储设备。

下面的一个示例将为你展现Puppet语言的便捷性,它首先演示了如何用shell脚本添加一个新用户以及一个新的组,这与Puppet中始终一致的操作形成鲜明对比。而在使用Puppet的示例中,“用户”和“组”都是类型,Puppet能够自动找到适用于你的平台的提供者。相比之下,特定于平台的过程式脚本无论是编写还是理解都要困难得多。

Linux:Puppet 简介
Linux:Puppet 简介

类、清单与模块

Puppet语言中的其它元素的主要作用是为资源的声明提供更多的灵活性和便捷性。在Puppet中的作用是切分代码块,将资源组织成较大的配置单元。举例来说,一个类能够包括所有安装和配置NTP时必须的Puppet代码。类的创建与调用可以在不同的地方完成。

不同的类集合可以应用在扮演不同角色的节点上。我们将其称之为“节点分类”,这是一项非常强大的能力,它允许你根据节点的能力,而不是根据节点的名称对他们进行管理。这种“别把家畜当宠物”的机器管理方式,得到了许多快速发展的组织的偏爱。

Puppet语言文件被称为清单,最简单的Puppet部署方式就是一个单独的清单文件加上一些资源。如果我们为以上示例中的基础Puppet代码命名为“user-present.pp”文件,那它就成为了一个清单。

模块是一系列类、资源类型、文件和模板的结合,他们以一某个特定的目的,并按照某种特定的、可预测的结构组织在一起。模块可以为了各种目的而创建,可以是对Apache实例进行完整的配置以搭建一套Rails应用程序,也可以为各种其它目的进行创建。通过将各种复杂特性的实现封装在模块中,管理员就能够使用更小、可读性更好的清单文件对模块进行调用。

Puppet模块的一个巨大优势在于模块的重用性。你可以自由使用他人编写的模块,并且Puppet有一个参与者数量巨大的活跃社区,除了Puppet Labs的员工所提编写的模块之外,社区成员们也会免费地分享他们所编写的模块。你能够在Puppet Forge上找到超过3000个可以免费下载的模块,其中有许多模块是系统管理员的工作中最常见的一些任务,因此这些模块能够节约你大量的时间。比方说,你可以使用模块进行各种管理任务,包括简单的服务器构建块(NTP、SSH)管理,乃至复杂方案(SQL Server或F5)的管理。

类、清单和模块都是纯粹的代码,与组织中所需要的其它任何在代码一样,它们能够、也应该被签入到版本控制系统当中,稍后我们将对这一点展开讨论。

Puppet平台

完整的Puppet解决方案不仅仅是指这门语言。使用者需要在不同的基础设施中部署Puppet代码、时不时地对代码及配置进行更新、纠正不恰当的变更、并且时时对系统进行检查,以保证每个环节的正常运行。为了满足这些需求,大多数使用者会在某个主机-代理结构中运行Puppet解决方案,由一系列组件所组成。根据不同的需求,使用者可以选择运行一个或多个主机。每个节点上都会安装一个代理,通过一个经过签名的安全连接与主机进行通信。

采取主机-代理这一结构的目的是为了将Puppet代码部署在节点上,并长期维护这些节点的配置信息。在对节点进行配置之前,Puppet会将清单编译为一个目录(catalog),目录是一种静态文档,在其中对系统资源及资源间的关系进行定义。根据节点的工作任务,以及任务的上下文不同,每个目录将对应一个单独的节点。目录定义了节点将如何工作,Puppet将根据目录的内容对节点进行检查,判断该节点的配置是否正确,并且在需要时应用新的配置。

在常规Puppet运行期间,每个基于节点的代理会定期与某个主机进行检查工作,Puppet会根据不同结果进行以下各种操作:

  • 对于产生了偏差的配置进行纠正
  • 仅报告节点的状态,而不进行任何改动
  • 使用Puppet的操作工具进行必需的配置改动
  • 收集节点与事件的相关数据,并加以保存,以便重试

Puppet Lab还提供了一个商用版本的解决方案,名为Puppet Enterprise,其中包括了客户支持服务,并提供了一系列高级且重要的功能:

  • 节点管理高级功能
  • 基于角色的访问控制
  • 运维性指标,以及一个报表控制台

结合语言与平台

现在,你对Puppet的工作原理有一个基本的了解了,但你可能仍然会感到疑惑:Puppet怎样帮助你的组织解决深层次的问题,并简化人们的协作方式呢?

一切重点在于:在你使用Puppet时,你是在对你的基础设施进行建模,正如对代码建模一样。你能够像对待代码一样的方式处理Puppet,或者从更广的意义上说,是对基础设施的配置进行同样的处理。Puppet代码能够方便地进行保存和重用,能够与运维团队的其他成员,以及其他任何需要对机器进行管理的团队成员进行分享。无论是在笔记本上的开发环境,还是在生产环境上,开发人员和运维人员都能够使用相同的清单对系统进行管理。因此当代码发布到生产环境时,各种令人不快的打击就会少很多。 这将大大改善部署的质量,尤其是在我们所见到的组织中更是如此。

将配置作为代码处理,系统管理员就能够为开发人员提供独占的测试环境,开发人员也不再将系统管理员视为碍事的人了。你甚至可以将Puppet代码交付给审记,如今有许多审记都接收Puppet清单,以进行一致性验证。这些都能够提升组织的效率,并点燃员工的热情。

最重要的一点或许在于,你能够将Puppet代码签入到某个共享的版本控制工具中,这将为你的基础设施提供一个可控的历史记录。你可以实行在软件开发者中十分常见的结对审查实践,让运维团队也能够不断地对配置代码进行改善、变更和测试,直到你有信心将配置提交至生产环境。

由于Puppet支持在模拟环境或noop模式下运行,你就可以在应用改动之前预先检查改动会造成的影响。这将大大缓解部署的压力,因为你可以随时选择回滚。

通过在Puppet使用中结合版本控制,以及之前我们所提到的各种优秀实践,许多客户实现了持续集成方面的最高境界,能够更频繁地将代码提交至生产环境,并且产生的错误更少。如果你能够以更小的增量部署应用,你就能够更早、更频繁地获得用户的反馈,它将告诉你你是否正处在正确的前进方向上。这样就可以避免在经过6到12个月开发工作,提交了大量代码之后,却发现它并不符合客户的需要,或是对客户没有吸引力这种悲惨情形的发生了。

我们的客户会选择与开发人员的应用程序代码同步对开发、测试以及生产环境上的配置进行变更,这就让开发者能够在一个非常接近于真实环境,甚至与生产环境完全相同的环境中进行工作。再也不会发生由于在开发与测试环境中的配置的不同,导致应用程序在生产环境上崩溃的情况出现了。开发者和QA能够部署更优秀的软件、运维人员不再需要整夜无眠、而执行官们……好吧,就算他们谈不上有多高兴,至少也能够对结果感到满意,从而将关注点转移到IT团队的效率以外的事情上了!

迈出第一步

不可否认,我们所见过的多数组织在持续协作方面都远远没有达到一个高水准,更不用说持续交付了。而Puppet的一个优点在于,随着你的团队的成长和基础设施的规模增加,Puppet也能够随之成长。或许你还没有准备好在整个公司范围内推行DevOps的实践,这不要紧。许多客户都在保守的、循规蹈矩的行业,例如银行业与政府项目中成功地将Puppet作为配置管理工具进行应用。这些组织或许对持续交付方面的需求很低,但不管怎样,能够将基础设施作为代码进行保存与版本化,这就极大地改善了这些组织的变更控制,以及安全实践了。

我们建议你首先对某个能够简化你工作的任务开始实现自动化。举例来说,许多管理员首先会对NTP、DNS、SSH、防火墙、用户和组等实现自动化管理,这些都是日常工作,但又经常会产生各种问题的任务。

当人们逐渐熟悉了Puppet之后,他们就会更进一步,开始编写更复杂的模块对服务进行管理,例如Tomcat的监控服务,或JBoss的应用服务器管理,还有一些人会开始采用Forge模块。当你做好进一步探索的准备,你就能够确保数据中心、乃至云端的所有机器都正确配置了各种任务、并确保这些任务运行正常,而且整个系统也处于正常运行状态中,以保证你的核心业务的应用程序正常运转。

你要记住的一点是,并非所有基础设施的代码都要你来编写,这一点非常重要。在你之前已经有人解决了这些问题,因此你只需对这些工作成果善加利用!我们之前提到了Puppet Forge上提供了几千个模块,你也可以在Puppet社区中寻求帮助,其中的模块更达到几万个之多。你也可以订阅Google上的Puppet用户组,或是查看ask.puppetlabs.com论坛上的内容,并与论坛中的活跃人士混熟。你也可以参加当地的Puppet CampPuppet用户小组,与小组成员进行面对面的交流。你还可以利用Puppet Labs上的学习资源,包括免费和付费的版本。在YouTube频道上和我们的官方文档中也可以学到各种知识。

当你进入了Puppet的生态系统后,以上这些只是全部学习资源的一小部分。我们期待与你相会,帮助你学习如何使用Puppet改善你的基础设施、业务和工作生活。

来源:http://www.infoq.com/cn/articles/introduction-puppet

Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试。当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例如公钥验证或者双重验证。将不同的验证方法的优劣处先放在一边,如果我们必须使用密码验证方式怎么办?你是如何保护你的 SSH 服务器免遭暴力破解攻击的呢?

Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

fail2ban 是 Linux 上的一个著名的入侵保护的开源框架,它会监控多个系统的日志文件(例如:/var/log/auth.log 或者 /var/log/secure)并根据检测到的任何可疑的行为自动触发不同的防御动作。事实上,fail2ban 在防御对SSH服务器的暴力密码破解上非常有用。

在这篇指导教程中,我会演示如何安装并配置 fail2ban 来保护 SSH 服务器以避免来自远程IP地址的暴力攻击

在linux上安装Fail2ban

为了在CentOS 或 RHEL上安装fail2ban,首先设置EPEL仓库,然后运行以下命令。

$ sudo yum install fail2ban

在Fedora上安装fail2ban,简单地运行以下命令:

$ sudo yum install fail2ban

在ubuntu,Debian 或 Linux Mint上安装fail2ban:

$ sudo apt-get install fail2ban

为SSH服务器配置Fail2ban

现在你已经准备好了通过配置 fail2ban 来加强你的SSH服务器。你需要编辑其配置文件 /etc/fail2ban/jail.conf。 在配置文件的“[DEFAULT]”区,你可以在此定义所有受监控的服务的默认参数,另外在特定服务的配置部分,你可以为每个服务(例如SSH,Apache等)设置特定的配置来覆盖默认的参数配置。

在针对服务的监狱区(在[DEFAULT]区后面的地方),你需要定义一个[ssh-iptables]区,这里用来定义SSH相关的监狱配置。真正的禁止IP地址的操作是通过iptables完成的。

下面是一个包含“ssh-iptables”监狱配置的/etc/fail2ban/jail.conf的文件样例。当然根据你的需要,你也可以指定其他的应用监狱。

$ sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
# 用于指定哪些地址可以忽略 fail2ban 防御
ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24
# 客户端主机被禁止的时长(秒)
bantime = 86400
# 客户端主机被禁止前允许失败的次数
maxretry = 5
# 查找失败次数的时长(秒)
findtime = 600
mta = sendmail
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=your@email.com, sender=fail2ban@email.com]
# Debian 系的发行版
logpath = /var/log/auth.log
# Red Hat 系的发行版
logpath = /var/log/secure
# ssh 服务的最大尝试次数
maxretry = 3

根据上述配置,fail2ban会自动禁止在最近10分钟内有超过3次访问尝试失败的任意IP地址。一旦被禁,这个IP地址将会在24小时内一直被禁止访问 SSH 服务。这个事件也会通过sendemail发送邮件通知。

一旦配置文件准备就绪,按照以下方式重启fail2ban服务。

在 Debian, Ubuntu 或 CentOS/RHEL 6:

$ sudo service fail2ban restart

在 Fedora 或 CentOS/RHEL 7:

$ sudo systemctl restart fail2ban

为了验证fail2ban成功运行,使用参数’ping’来运行fail2ban-client 命令。 如果fail2ban服务正常运行,你可以看到“pong(嘭)”作为响应。

$ sudo fail2ban-client ping
Server replied: pong

测试 fail2ban 保护SSH免遭暴力破解攻击

为了测试fail2ban是否能正常工作,尝试通过使用错误的密码来用SSH连接到服务器模拟一个暴力破解攻击。与此同时,监控 /var/log/fail2ban.log,该文件记录在fail2ban中发生的任何敏感事件。

$ sudo tail -f /var/log/fail2ban.log
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

根据上述的日志文件,Fail2ban通过检测IP地址的多次失败登录尝试,禁止了一个IP地址192.168.1.8。

检查fail2ban状态并解禁被锁住的IP地址

由于fail2ban的“ssh-iptables”监狱使用iptables来阻塞问题IP地址,你可以通过以下方式来检测当前iptables来验证禁止规则。

$ sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-SSH  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Chain fail2ban-SSH (1 references)
target     prot opt source               destination
DROP       all  --  192.168.1.8          0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

如果你想要从fail2ban中解锁某个IP地址,你可以使用iptables命令:

$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP

当然你可以使用上述的iptables命令手动地检验和管理fail2ban的IP阻塞列表,但实际上有一个适当的方法就是使用fail2ban-client命令行工具。这个命令不仅允许你对”ssh-iptables”监狱进行管理,同时也是一个标准的命令行接口,可以管理其他类型的fail2ban监狱。

为了检验fail2ban状态(会显示出当前活动的监狱列表):

$ sudo fail2ban-client status

为了检验一个特定监狱的状态(例如ssh-iptables):

$ sudo fail2ban-client status ssh-iptables

上面的命令会显示出被禁止IP地址列表。

Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

为了解锁特定的IP地址:

$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击
Linux:如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

注意,如果你停止了Fail2ban 服务,那么所有的IP地址都会被解锁。当你重启 Fail2ban,它会从/etc/log/secure(或 /var/log/auth.log)中找到异常的IP地址列表,如果这些异常地址的发生时间仍然在禁止时间内,那么Fail2ban会重新将这些IP地址禁止。

设置 Fail2ban 自动启动

一旦你成功地测试了fail2ban之后,最后一个步骤就是在你的服务器上让其在开机时自动启动。在基于Debian的发行版中,fail2ban已经默认让自动启动生效。在基于Red-Hat的发行版中,按照下面的方式让自动启动生效。

在 CentOS/RHEL 6中:

$ sudo chkconfig fail2ban on

在 Fedora 或 CentOS/RHEL 7:

$ sudo systemctl enable fail2ban

总结

在该教程中,我演示了如何安装并配置fail2ban来保护一个SSH服务器。当然fail2ban可以缓解暴力密码攻击,但是请注意,这并不能保护SSH服务器避免来自复杂的分布式暴力破解组织,这些攻击者通过使用成千上万个机器控制的IP地址来绕过fail2ban的防御机制。


via: http://xmodulo.com/how-to-protect-ssh-server-from-brute-force-attacks-using-fail2ban.html

作者:Dan Nanni 译者:theo-l 校对:wxy

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

来源:https://linux.cn/article-5067-1.html

Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统

前面我们已经讨论了如何清理 Ubuntu GNU/Linux 系统,这篇教程将在原有教程的基础上,增加对新的 Ubuntu 发行版本的支持,并介绍更多的工具。

假如你想清理你的 Ubuntu 主机,你可以按照以下的一些简单步骤来移除所有不需要的垃圾文件。

Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统
Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统

(题图来自:amysplaceforyouth.org)

移除多余软件包

这又是一个内置功能,但这次我们不必使用新得立包管理软件(Synaptic Package Manager),而是在终端中达到目的。

现在,在终端窗口中键入如下命令:

sudo apt-get autoclean

这便激活了包清除命令。这个命令所做的工作是: 自动清除那些当你安装或升级程序时系统所缓存的 .deb包(即清除 /var/cache/apt/archives目录,不过只清理过时的包)。如果需要使用清除命令,只需在终端窗口中键入以下命令:

sudo apt-get clean

然后你就可以使用自动移除命令。这个命令所做的工作是:清除那些 在系统中被某个已经卸载的软件 作为依赖所安装的软件包。要使用自动移除命令,在终端窗口中键入以下命令:

sudo apt-get autoremove

移除不需要的本地化数据

为达到此目的,我们需要安装 localepurge软件,它将自动移除一些不需要的本地化数据(LCTT 译注:即各种语言翻译)。这个软件是一个简单的脚本,它将从那些不再需要的本地化文件和本地化联机手册( man pages ) 所占用的空间中回收磁盘空间。这个软件将在任何 apt 安装命令运行时 被自动激活。

在 Ubuntu 中安装 localepurge:

sudo apt-get install localepurge

在通过 apt-get install安装任意软件后, localepurge 将移除所有不是使用你系统中所设定语言的翻译文件和翻译的联机手册。

假如你想设置 localepurge,你需要编辑 /ect/locale.nopurge文件。

根据你已经安装的软件,这将为你节省几兆的磁盘空间。

例子:

假如我试着使用 apt-get来安装 dicus软件:

sudo apt-get install discus

在软件安装完毕之后,你将看到如下提示:

localepurge: Disk space freed in /usr/share/locale: 41860K

移除孤包

假如你想移除孤包,你需要安装 deborphan软件:

在 Ubuntu 中安装 deborphan:

sudo apt-get install deborphan

使用 deborphan,打开终端并键入如下命令即可:

sudo deborphan | xargs sudo apt-get -y remove --purge

使用 GtkOrphan 来移除孤包

GtkOrphan(一个针对 debian 系发行版本的 Perl/Gtk2 应用) 是一个分析用户安装过程状态并查找孤立库文件的图形化工具,它为 deborphan提供了一个 GUI 前端,并具备移除软件包的功能。

在 Ubuntu 中安装 GtkOrphan,打开终端并运行如下命令:

sudo apt-get install gtkorphan

一张截图

Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统
Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统

使用 Wajig 移除孤包

Wajig是 Debian 包管理系统中一个简单的软件包管理前端。它将 apt、apt-cache、 dpkg、 /etc/init.d 中的脚本等 通过一个单一命令集成在一起,它的设计初衷是使用简单和为它的所有功能提供丰富的文档。

通过适当的 sudo配置,大多数(如果不是全部)的软件包安装和创建等任务可以通过一个用户 shell 来完成。Wajig也适用于一般的系统管理。另外,一个 Gnome GUI 命令 gjig也被囊括在这个软件包之中。

在 Ubuntu 中安装 Wajig,打开终端并运行如下命令:

sudo apt-get install wajig

Debfoster --- 跟踪你在安装过程中的操作

debfoster 将会维护一个列有被明确需要安装的软件包的列表,但不包括那些作为某个软件的依赖而被安装的软件包。参数是完全可选的,你甚至可以使得在 dpkg 和/或 apt-get 每次运行之后马上激活 debfoster 。

另外,你还可以在命令行中使用 debfoster 来安装或移除某些特定的软件包。那些后缀为 ---的软件包将会被移除,而没有后缀的软件包将会被安装。

假如一个新的软件包或 debfoster 注意到作为某个软件包的依赖的软件包是一个孤包,则 debfoster 将会询问你下一步如何操作。若你决定保留这个孤包, debfoster 将只会进行记录并继续安装过程;若你觉得这个软件包不足以引起你的兴趣,在 debfoster 询问这个问题后,它将移除这个软件包。进一步的,如果你的决定使得其他的软件包变为孤包,更多的提问将会接踵而来。

在 Ubuntu 中安装 debfoster,打开终端并运行如下命令:

sudo apt-get install debfoster

使用 debfoster

为了创建一个初始跟踪文件,可以使用如下命令:

sudo debfoster -q

你总可以编辑 /var/lib/debfoster/keepers文件,来定义那些你想留在系统中的软件包。

为了编辑这个文件,可以键入:

sudo vi /var/lib/debfoster/keepers

要强制使 debfoster 去移除所有没有被列在上面这个文件的软件包,或安装作为某些列在这个文件中的软件包的依赖,它也同时会添加所有在这个列表中没有被安装的软件包。若要根据这个列表来执行相关操作,只需执行:

sudo debfoster -f

若需要跟踪你新安装的软件包,你需要时不时地执行如下命令:

sudo debfoster

xdiskusage -- 查看你的硬盘空间都去哪儿了

图形化地展示磁盘使用情况的 du。xdiskusage 是一个用户友好型的程序,它将为你展示你所有磁盘的使用情况。 它是在 Phillip C. Dykstra 所写的 “xdu” 程序的基础上设计的。做了一些修改以使得它可以为你运行 “du”命令,并显示磁盘的剩余空间,并且假如你想清晰地了解你的磁盘空间都去哪儿了,它还可以生成一个 PostScript 格式的名为 display.xdiskusage 的文件。

在 Ubuntu 中安装 xdiskusage,只需使用如下命令:

sudo apt-get install xdiskusage

若你想打开这个应用,你需要使用如下命令:

sudo xdiskusage

一旦这个应用被打开,你将看到如下图所示的界面:

Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统
Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统

Bleachbit

BleachBit 能快速地释放磁盘空间并不知疲倦地保护你的隐私。它可以释放缓存,删除 cookie,清除 Internet 上网历史,粉碎临时文件,删除日志,丢弃你所不知道存在何处的垃圾。为 Linux 和 Windows 系统而设计,它支持擦除清理数以千计的应用程序,如 Firefox, Internet Explorer, Adobe Flash, Google Chrome, Opera, Safari 等等。除了简单地删除文件,BleachBit 还包括许多高级功能,诸如粉碎文件以防止恢复,擦除磁盘空间来隐藏被其他应用程序所删除文件的痕迹,为火狐“除尘”,使其速度更快等。比免费更好,BleachBit 是一个开源软件。

在 Ubuntu 中安装 Bleachbit,打开终端并运行如下命令:

sudo apt-get install bleachbit

一张截图

Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统
Linux:如何清理你的 Ubuntu 14.10/14.04/13.10 系统

使用 Ubuntu-Tweak

最后,你也可以使用 Ubuntu-Tweak 来清理你的系统。


via: http://www.ubuntugeek.com/cleaning-up-a-ubuntu-gnulinux-system-updated-with-ubuntu-14-10-and-more-tools-added.html

作者:ruchi 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5069-1.html

Linux:智能、开放及安全,这三道槛,是智能家居最关键的问题!

Linux:智能、开放及安全,这三道槛,是智能家居最关键的问题!
Linux:智能、开放及安全,这三道槛,是智能家居最关键的问题!

3月11日,全球三大家电展之中国家电博览会(AWE 2015)在上海拉开帷幕,除了来自传统行业包括海尔、史密斯之类的大小家电厂商之外,包括360、京东、机智云等在内的互联网厂商身影也出现在博览会展 馆内,大推智能家居概念。其中,360与京东在展会上推出智能家居战略,智能家居领域在2015年似乎将要迎来爆发,已经有人称2015年将是智能家居发 展元年。

然而智能家居行业发展却并不会像媒体、业内人士期盼的那样火爆,智能家居行业的爆发还面临着许多基础问题,面临着许多槛。 

智能:重新定义智能家居

国内百科词条中对智能家居的定义是:

智能家居是以住宅为平台,利用综合布线技术、网络通信技术、智能家居-系统设计方案安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。

这一定义的最原始出处已经无法考证,基本符合几年前我们对智能家居的理解,但随着IOT时代的到来,这一定义与现今的智能家居有所不符。在这里,我们姑且将智能家居重新定义如下:

智能家居是基于无线网络通信、大数据、云计算、语音识别、人工智能、机器学习等先进技术,采用内置操作系统、智能芯片、传感器的硬件产品以及软件应用一同构建的,能够给用户带来便利、健康、安全、舒适的人性化、智能化家居生态系统。

之所以需要重新定义智能家居,是因为互联网的发展已经从PC互联网、移动互联网在向IOT转变,这其中为我们带来了大量的新兴技术,使得智能家居真正实现智能化而非简单的便捷化。

目前,市场上我们所能见到的绝大多数智能家居产品其实并不符合上述定义,因为大多数产品的智能化仍然不足。这些产品的状态是:一部内置智能芯片、传感器的 硬件产品加上一款手机应用。这样的产品只能说是进一步实现了便捷化。如一些智能插座的远程关闭功能,只是让用户发现插座没关闭之后不用从公司回家关闭它, 而不是智能地更具家中环境情况判断是否该自动关闭电源。

而智能家居要真正实现智能化,还需要大数据、云计算、人工智能及机器学习技术发展的支持,这几项技术,将能够使现在的智能家居产品实现数据云端存储、分析,并据此为用户提供更为精准的智能化服务,比如上述的情况中:智能插座会通过传感器判断家中是否有人,然后将信息传至云端,对比云端存储的数据,判断家中没人的情况下,哪些电器应该关闭电源哪些电器应该保持电源开启,然后返回指令自动执行。

这就是智能家居爆发要面临的第一道槛:智能化不足。如果只是利用手机遥控关闭设备、调节温度这样的功能,其需求实际上远远低于厂商们的期望。要让用户以相对高昂的价格去购买这样一类产品,除非真的是:钱多、人傻。

开放:互联更智能

从智能家居话题开始升温至现在,业内最常讨论的共同话题就是统一标准,小米公司创始人雷军也在不久前的两会上拿出了《关于加快制定智能家居国家标准的建议》提案。我们在此不讨论雷军提出这一提案是否有为小米提升行业地位的私心,只谈原因。

智能是智能家居的核心吸引力,这无需赘言。但智能,除了厂商需要尽可能地挖掘新兴技术的潜力推出新功能之外,还需要厂商、产品之间的开放、联动。

无论在AWE 2015上宣布智能家居战略的360还是推出超级APP的京东,还是野心颇大的小米,谁都不会有能力涉足整个智能家居生态中所有产品的生产制造。而智能家居智能化,恰恰需要产品之间的数据互通、互联、互动。

举例来说,早上离开家上班时,窗户自动打开通风透气,晚上,当智能门锁感应到我下班回家走到门外自动开门时,智能窗户是否能够自动关闭、智能空调是否能够同步打开?这些都需要不同产品之间向彼此开放接口、数据才能实现互动。

什么才是真正的智能?应该是我们用户与产品之间的双向互动非常少才是智能,应该是用户不作出指令、或者只做出一个指令,多个智能家居产品就能够联动提供服务才是真正的智能。

而这一目标的实现,现在看来还有很大的难度。我们来看国内智能家居市场的阵营分布:

1,阿里、魅族:姑且认为魅族与阿里之间能够互相开放; 2,腾讯、京东:同样认为京东能够与腾讯之间互相开放; 3,360、格力:周鸿祎与董明珠最近互动频繁,我们也暂时将其列入同一阵营; 4,小米、美的:小米入股美的之后,也算是同一阵营; 5,百度:虽未联手其他厂商,百度也在智能家居有所布局; 6,乐视:推出智能电视之后的乐视做手机做汽车,相不会抛弃智能家居这块肥肉。

瞧,我们至少可以看到国内智能家居行业已经有六大派,相互之间的竞争关系不言自明,让这六大派开放自己的数据、接口,难度可想而知。

目前小米智能家居体系只针对接受小米投资的雷军系公司开放;360在智能家居战略中表示以合作方式向产业链全面开放,开放数据中心提供云计算、流量、营销 平台以及芯片组,但具体细节不得而知;腾讯目前看来可能会围绕微信、手Q打造智能家居闭环……所以至少我们目前还看不到对于“开放”有更好的解决方案。

当然,我们也能看到例外,如海尔,在智能家居领域海尔同百度、阿里、360、京东以及苹果、微软都有合作。但这样的合作目前看来也只有庞大如海尔这样量级 的公司才能运作。对于第三方家电厂商、创业者,我们期待能够更好的方式来解决“开放”难题,否则绝大多数所谓的智能家居产品将无法实现真正的智能,最终也 很难为用户所接受。 

安全:被忽视的基石

美剧《不死法医》第17集讲述了一个通过智能家居谋杀他人的故事:

黑客组织Faceless的成员肖被发现死在家中,肖为自己建立了一套智能家居系统,早上闹钟响了之后,窗帘自动拉开、咖啡机自动启动、音响自动打开音 乐……当然,家中的天然气也是接入智能家居系统的,可以远程操控。最后,调查发现肖家中的天然气被人远程打开泄漏,造成肖中毒。

除此之外,一如之前的一些有黑客出现的影视作品,这集中,黑客还操控了交通信号灯。

不错,这是电视剧中的场景,但这一幕或许很快就会发生在我们的生活中。许多所谓的智能空调、智能电视已经可以远程控制,那么,有一天,燃气灶、微波炉,被黑客攻击的可能性并非不存在。当然,黑客或者说小偷更感兴趣的还有你的保险柜,或者说,你家的智能门窗。

当然,很多人觉得这是危言耸听。但我还是得说,IOT背景下的智能家居时代,我们家中的任何物件都是联网的,网络安全问题已经开始由线上转移至线下了。作 为安全领域的巨头,360公司董事长周鸿祎在公司年会上曾表示,360将要从互联网安全公司转变为安全互联网公司,利用IOT技术,将从保护用户安全从线 上拓展至线下。360的几款产品也主打安全概念,如360安全路由、360儿童卫士等。

但在360之外,将智能家居安全话题挂在嘴边的公司几乎没有。当然,并不是这些公司都没有能力,腾讯、阿里以及小米,也或多或少有自己的安全防护能力。之所以不提,除了安全并非优势之外,更多的是忽视。

因为现在智能家居并未普及,所以并未出现智能家居安全方面的真实案例。但未发生并不代表没有,在智能家居真正实现大爆发之前,一定会出现因智能家居产品安全问题给用户造成损失的案例。而且,已经有安全研究人员表示可以通过智能电视监控用户:

在2013年的Black Hat大会上,韩国高丽大学的安全人员Seungjin Lee就曾演示了入侵三星智能电视发布”白宫遭到攻击”假新闻的整个过程,并证明了可以通过智能电视监视用户。

SeungJin Lee说,他可以利用携带病毒的电子邮件或网站链接,远程控制三星的智能电视机,让电视机将其面前的图像发送到另外一个地方的电脑上。即使电视机看起来好像已关掉,也不影响其被远程控制。

这个例子中,用户仅仅是被监视。而在前面美剧的案例中,我们可以发现,智能家居带来的安全威胁或许会远超互联网时代的安全威胁,因为它们可能会带来身体上的伤害。

从目前厂商们对智能家居安全问题的关注来看,智能家居产品会比PC和手机更容易被入侵。而且当前也没有公司研发智能家居安全软件。

除了软件漏洞之外,智能家居产品与之前PC互联网、移动互联网时代的软件应用产品不同,硬件方面如芯片、传感器等模块漏洞的修补起来并不容易。所以我们不应该奢望亡羊补牢的行为,因为一旦出现安全问题,智能家居产品想要重获用户信任就很难了。

结语

最近几年,每年都会被冠上各类“元年”的称号,如“智能硬件元年”、“可穿戴设备元年”,今年也被一些人认为是“智能家居元年”。

写这些不是给行业泼冷水,随着软的基础服务如云计算、大数据的发展完善,再加上智能硬件制造业在智能手机的推动下逐渐成熟,智能家居行业的确迎来了一个很好的发展机遇期。但正如前两年可穿戴设备的发展一样,不要被“虚火”闪了眼睛,看不清背后的问题。

智能、开放及安全,如果智能家居产品于这三方面在今年没有较大的发展,那么,2016年或许会是智能家居发展的又一个元年。

来源:http://www.techtree.com.cn/model/92.html

Linux:Pinta 1.6发布!在 Ubuntu 和 Linux Mint 上安装

Linux:Pinta 1.6发布!在 Ubuntu 和 Linux Mint 上安装
Linux:Pinta 1.6发布!在 Ubuntu 和 Linux Mint 上安装

Pinta 是一款免费的开源绘图应用软件,它在Linux用户中很受欢迎。你也可以把它看作是微软画图软件的开源替代品。Pinta 可以在很多平台上使用,如 Linux、Windows 以及 Mac OS X。

Gimp 作为一款功能齐全的图像编辑软件而流行,相比Pinta则单纯是一种绘图工具。我常用它在我的截图上画箭头和曲线,而且我可以说这是我在 Linux 上最喜欢的绘图应用软件。

Pinta 1.6 的新功能

经过一年多的时间,Pinta发布了1.6版本,修复了50多个漏洞并且增加了一些新功能。增加的新功能如下:

  • 线条工具现在支持绘制曲线和箭头
  • 绘制好的图形可以编辑形状
  • 所有的图形工具现在支持绘制虚线
  • 所有的选择工具现在支持并集、排除,异或和交集模式
  • 插件可通过插件管理器安装
  • 命令行中加入新选项

新版本同时也修复了一个很烦人的漏洞——右键菜单选项,在打开方式中使用Pinta不能打开文件。你可以在发布说明阅读所有的改变。

在 Ubuntu 和 Linux Mint 中安装 Pinta 1.6

Pinta 1.5 可以在 Ubuntu 14.04,14.10,Linux Mint 17 和 elementary OS 中使用。如果你想安装最新的 1.6 版本,你可以使用 Pinta 团队的官方PPA源。如果你已经安装了 Pinta 1.5 也不必担心。再安装一次将会使版本升级。

打开终端并使用以下命令:

sudo add-apt-repository ppa:pinta-maintainers/pinta-stable
sudo apt-get update
sudo apt-get install pinta

下载源代码或者获取 Windows 和 Mac OS X 的安装文件,请点击Pinta下载页面。在如下这篇相关文章中,你也可以选出Linux中最好的照片应用软件


via: http://itsfoss.com/pinta-1-6-ubuntu-linux-mint/

作者:Abhishek 译者:linuhap 校对:Caroline

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

来源:https://linux.cn/article-5071-1.html

Linux:如何配置 fail2ban 来保护 Apache 服务器

生产环境中的 Apache 服务器可能会受到不同的攻击。攻击者或许试图通过暴力攻击或者执行恶意脚本来获取未经授权或者禁止访问的目录。一些恶意爬虫或许会扫描你网站下的各种安全漏洞,或者通过收集email地址和web表单来发送垃圾邮件。

Apache服务器具有全面的日志功能,可以捕捉到各种攻击所反映的异常事件。然而,它还不能系统地解析具体的apache 日志并迅速地对潜在的攻击进行反应(比如,禁止/解禁IP地址)。这时候fail2ban可以解救这一切,解放了系统管理员的工作。

fail2ban是一款入侵防御工具,可以基于系统日志检测不同的工具并且可以自动采取保护措施比如:通过iptables禁止ip、通过 /etc/hosts.deny 阻止连接、或者通过邮件发送通知。fail2ban具有一系列预定义的“监狱”,它使用特定程序日志过滤器来检测通常的攻击。你也可以编写自定义的规则来检测来自任意程序的攻击。

在本教程中,我会演示如何配置fail2ban来保护你的apache服务器。我假设你已经安装了apache和fail2ban。对于安装,请参考另外一篇教程

什么是 Fail2ban 监狱

Linux:如何配置 fail2ban 来保护 Apache 服务器
Linux:如何配置 fail2ban 来保护 Apache 服务器

让我们更深入地了解 fail2ban 监狱。监狱定义了具体的应用策略,它会为指定的程序触发一个保护措施。fail2ban在 /etc/fail2ban/jail.conf 下为一些流行程序如Apache、Dovecot、Lighttpd、MySQL、Postfix、SSH 等预定义了一些监狱。每个监狱都通过特定的程序日志过滤器(在/etc/fail2ban/fileter.d 下面)来检测通常的攻击。让我看一个例子监狱:SSH监狱。

[ssh]
enabled   = true
port      = ssh
filter    = sshd
logpath   = /var/log/auth.log
maxretry  = 6
banaction = iptables-multiport

SSH监狱的配置定义了这些参数:

  • [ssh]: 方括号内是监狱的名字。
  • enabled:是否启用监狱
  • port: 端口号(或者对应的服务名称)
  • filter: 检测攻击的日志解析规则
  • logpath: 所检测的日志文件
  • maxretry: 最大失败次数
  • banaction: 所进行的禁止操作

定义在监狱配置中的任意参数都会覆盖fail2ban-wide中相应的默认配置参数。相反,任何缺少的参数都会使用定义在[DEFAULT] 字段的默认值。

预定义的日志过滤器都放在/etc/fail2ban/filter.d,而可以采取的禁止操作放在 /etc/fail2ban/action.d。

Linux:如何配置 fail2ban 来保护 Apache 服务器
Linux:如何配置 fail2ban 来保护 Apache 服务器

如果你想要覆盖fail2ban的默认操作或者定义任何自定义监狱,你可以创建/etc/fail2ban/jail.local*文件。本篇教程中,我会使用/etc/fail2ban/jail.local。

启用预定义的apache监狱

fail2ban的默认安装为Apache服务提供了一些预定义监狱和过滤器。我要启用这些内建的Apache监狱。由于Debian和RedHat配置的稍微不同,我会分别提供它们的配置文件。

在Debian 或者 Ubuntu启用Apache监狱

要在基于Debian的系统上启用预定义的apache监狱,如下创建/etc/fail2ban/jail.local。

$ sudo vi /etc/fail2ban/jail.local

# 检测密码认证失败
[apache]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6
# 检测漏洞和 PHP 脆弱性扫描
[apache-noscript]
enabled  = true
port     = http,https
filter   = apache-noscript
logpath  = /var/log/apache*/*error.log
maxretry = 6
# 检测 Apache 溢出攻击
[apache-overflows]
enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2
# 检测在服务器寻找主目录的尝试
[apache-nohome]
enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

由于上面的监狱没有指定措施,这些监狱都将会触发默认的措施。要查看默认的措施,在/etc/fail2ban/jail.conf中的[DEFAULT]下找到“banaction”。

banaction = iptables-multiport

本例中,默认的操作是iptables-multiport(定义在/etc/fail2ban/action.d/iptables-multiport.conf)。这个措施使用iptable的多端口模块禁止一个IP地址。

在启用监狱后,你必须重启fail2ban来加载监狱。

$ sudo service fail2ban restart

在CentOS/RHEL 或者 Fedora中启用Apache监狱

要在基于红帽的系统中启用预定义的监狱,如下创建/etc/fail2ban/jail.local。

$ sudo vi /etc/fail2ban/jail.local

# 检测密码认证失败
[apache]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/httpd/*error_log
maxretry = 6
# 检测抓取邮件地址的爬虫
[apache-badbots]
enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/httpd/*access_log
bantime  = 172800
maxretry = 1
# 检测漏洞和 PHP 脆弱性扫描
[apache-noscript]
enabled  = true
port     = http,https
filter   = apache-noscript
logpath  = /var/log/httpd/*error_log
maxretry = 6
# 检测 Apache 溢出攻击
[apache-overflows]
enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/httpd/*error_log
maxretry = 2
# 检测在服务器寻找主目录的尝试
[apache-nohome]
enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/httpd/*error_log
maxretry = 2
# 检测执行不存在的脚本的企图
# 这些都是流行的网站服务程序
# 如:webmail, phpMyAdmin,WordPress
port     = http,https
filter   = apache-botsearch
logpath  = /var/log/httpd/*error_log
maxretry = 2

注意这些监狱文件默认的操作是iptables-multiport(定义在/etc/fail2ban/jail.conf中[DEFAULT]字段下的“banaction”中)。这个措施使用iptable的多端口模块禁止一个IP地址。

启用监狱后,你必须重启fail2ban来加载监狱。

在 Fedora 或者 CentOS/RHEL 7中:

$ sudo systemctl restart fail2ban

在 CentOS/RHEL 6中:

$ sudo service fail2ban restart

检查和管理fail2ban禁止状态

监狱一旦激活后,你可以用fail2ban的客户端命令行工具来监测当前的禁止状态。

查看激活的监狱列表:

$ sudo fail2ban-client status

查看特定监狱的状态(包含禁止的IP列表):

$ sudo fail2ban-client status [监狱名]
Linux:如何配置 fail2ban 来保护 Apache 服务器
Linux:如何配置 fail2ban 来保护 Apache 服务器

你也可以手动禁止或者解禁IP地址:

要用制定监狱禁止IP:

$ sudo fail2ban-client set [name-of-jail] banip [ip-address]

要解禁指定监狱屏蔽的IP:

$ sudo fail2ban-client set [name-of-jail] unbanip [ip-address]

总结

本篇教程解释了fail2ban监狱如何工作以及如何使用内置的监狱来保护Apache服务器。依赖于你的环境以及要保护的web服务器类型,你或许要调整已有的监狱或者编写自定义监狱和日志过滤器。查看outfail2ban的官方Github页面来获取最新的监狱和过滤器示例。

你有在生产环境中使用fail2ban么?分享一下你的经验吧。


via: http://xmodulo.com/configure-fail2ban-apache-http-server.html

作者:Dan Nanni 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5068-1.html

Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比

前言

我(@董伟明9 )经常看到很多程序员, 运维在代码搜索上使用ack, 甚至ag(the_silver_searcher ), 而我工作中95%都是用grep,剩下的是ag。 我觉得很有必要聊一聊这个话题。

我以前也是一个运维, 我当时也希望找到最好的最快的工具用在工作的方方面面。 但是我很好奇为什么ag和ack没有作为linux发行版的内置部分。 内置的一直是grep。 我当初的理解是受各种开源协议的限制, 或者发行版的boss个人喜好。 后来我就做了实验, 研究了下他们到底谁快。 当时的做法也无非跑几个真实地线上log看看用时。 然后我也有了我的一个认识: 大部分时候用grep也无妨, 日志很大的时候用ag。

ack原来的域名是betterthangrep.com, 现在是beyondgrep.com。 好吧,其实我理解使用ack的同学, 也理解ack产生的原因。 这里就有个故事。

最开始我做运维使用shell, 经常做一些分析日志的工作。 那时候经常写比较复杂的shell代码实现一些特定的需求。 后来来了一位会perl的同学。 原来我写shell做一个事情, 写了20多行shell代码, 跑一次大概5分钟, 这位同学来了用perl改写, 4行, 一分钟就能跑完。 亮瞎我们的眼, 从那时候开始, 我就觉得需要学perl,以至于后来的python。

perl是天生用来文本解析的语言, ack的效率确实很高。 我想着可能是大家认为ack要更快更合适的理由吧。 其实这件事要看场景。 我为什么还用比较’土’的grep呢?

看一下这篇文章, 希望给大家点启示。不耐烦看具体测试过程的同学,可以直接看结论:

  1. 在搜索的总数据量较小的情况下, 使用grep, ack甚至ag在感官上区别不大
  2. 搜索的总数据量较大时, grep效率下滑的很多, 完全不要选
  3. ack在某些场景下没有grep效果高(比如使用-v搜索中文的时候)
  4. 在不使用ag没有实现的选项功能的前提下, ag完全可以替代ack/grep

实验条件

PS: 严重声明, 本实验经个人实践, 我尽量做到合理。 大家看完觉得有异议可以试着其他的角度来做。 并和我讨论。

  • 我使用了公司的一台开发机(gentoo)

  • 我测试了纯英文和汉语2种, 汉语使用了结巴分词的字典, 英语使用了miscfiles中提供的词典

# 假如你是ubuntu: sudo apt-get install miscfiles
wget https://raw.githubusercontent.com/fxsjy/jieba/master/extra_dict/dict.txt.big

实验前的准备

我会分成英语和汉语2种文件, 文件大小为1MB, 10MB, 100MB, 500MB, 1GB, 5GB。 没有更多是我觉得在实际业务里面不会单个日志文件过大的。 也就没有必要测试了(就算有, 可以看下面结果的趋势)。用下列程序深入测试的文件:

cat make_words.py
# coding=utf-8
import os
import random
from cStringIO import StringIO
EN_WORD_FILE = '/usr/share/dict/words'
CN_WORD_FILE = 'dict.txt.big'
with open(EN_WORD_FILE) as f:
    EN_DATA = f.readlines()
with open(CN_WORD_FILE) as f:
    CN_DATA = f.readlines()
MB = pow(1024, 2)
SIZE_LIST = [1, 10, 100, 500, 1024, 1024 * 5]
EN_RESULT_FORMAT = 'text_{0}_en_MB.txt'
CN_RESULT_FORMAT = 'text_{0}_cn_MB.txt'
def write_data(f, size, data, cn=False):
    total_size = 0
    while 1:
        s = StringIO()
        for x in range(10000):
            cho = random.choice(data)
            cho = cho.split()[0] if cn else cho.strip()
            s.write(cho)
        s.seek(0, os.SEEK_END)
        total_size += s.tell()
        contents = s.getvalue()
        f.write(contents + 'n')
        if total_size > size:
            break
    f.close()
for index, size in enumerate([
        MB,
        MB * 10,
        MB * 100,
        MB * 500,
        MB * 1024,
        MB * 1024 * 5]):
    size_name = SIZE_LIST[index]
    en_f = open(EN_RESULT_FORMAT.format(size_name), 'a+')
    cn_f = open(CN_RESULT_FORMAT.format(size_name), 'a+')
    write_data(en_f, size, EN_DATA)
    write_data(cn_f, size, CN_DATA, True)

好吧, 效率比较低是吧? 我自己没有vps, 公司服务器我不能没事把全部内核的cpu都占满(不是运维好几年了)。 假如你不介意htop的多核cpu飘红, 可以这样,耗时就是各文件生成的时间短板。这是生成测试文件的多进程版本:

# coding=utf-8
import os
import random
import multiprocessing
from cStringIO import StringIO
EN_WORD_FILE = '/usr/share/dict/words'
CN_WORD_FILE = 'dict.txt.big'
with open(EN_WORD_FILE) as f:
    EN_DATA = f.readlines()
with open(CN_WORD_FILE) as f:
    CN_DATA = f.readlines()
MB = pow(1024, 2)
SIZE_LIST = [1, 10, 100, 500, 1024, 1024 * 5]
EN_RESULT_FORMAT = 'text_{0}_en_MB.txt'
CN_RESULT_FORMAT = 'text_{0}_cn_MB.txt'
inputs = []
def map_func(args):
    def write_data(f, size, data, cn=False):
        f = open(f, 'a+')
        total_size = 0
        while 1:
            s = StringIO()
            for x in range(10000):
                cho = random.choice(data)
                cho = cho.split()[0] if cn else cho.strip()
                s.write(cho)
            s.seek(0, os.SEEK_END)
            total_size += s.tell()
            contents = s.getvalue()
            f.write(contents + 'n')
            if total_size > size:
                break
        f.close()
    _f, size, data, cn = args
    write_data(_f, size, data, cn)
for index, size in enumerate([
        MB,
        MB * 10,
        MB * 100,
        MB * 500,
        MB * 1024,
        MB * 1024 * 5]):
    size_name = SIZE_LIST[index]
    inputs.append((EN_RESULT_FORMAT.format(size_name), size, EN_DATA, False))
    inputs.append((CN_RESULT_FORMAT.format(size_name), size, CN_DATA, True))
pool = multiprocessing.Pool()
pool.map(map_func, inputs, chunksize=1)

等待一段时间后,测试的文件生成了。目录下是这样的:

$ls -lh
total 14G
-rw-rw-r-- 1 vagrant vagrant 2.2K Mar 14 05:25 benchmarks.ipynb
-rw-rw-r-- 1 vagrant vagrant 8.2M Mar 12 15:43 dict.txt.big
-rw-rw-r-- 1 vagrant vagrant 1.2K Mar 12 15:46 make_words.py
-rw-rw-r-- 1 vagrant vagrant 101M Mar 12 15:47 text_100_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant 101M Mar 12 15:47 text_100_en_MB.txt
-rw-rw-r-- 1 vagrant vagrant 1.1G Mar 12 15:54 text_1024_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant 1.1G Mar 12 15:51 text_1024_en_MB.txt
-rw-rw-r-- 1 vagrant vagrant  11M Mar 12 15:47 text_10_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant  11M Mar 12 15:47 text_10_en_MB.txt
-rw-rw-r-- 1 vagrant vagrant 1.1M Mar 12 15:47 text_1_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant 1.1M Mar 12 15:47 text_1_en_MB.txt
-rw-rw-r-- 1 vagrant vagrant 501M Mar 12 15:49 text_500_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant 501M Mar 12 15:48 text_500_en_MB.txt
-rw-rw-r-- 1 vagrant vagrant 5.1G Mar 12 16:16 text_5120_cn_MB.txt
-rw-rw-r-- 1 vagrant vagrant 5.1G Mar 12 16:04 text_5120_en_MB.txt

确认版本

$  ack --version # ack在ubuntu下叫`ack-grep`
ack 2.12
Running under Perl 5.16.3 at /usr/bin/perl
Copyright 2005-2013 Andy Lester.
This program is free software.  You may modify or distribute it
under the terms of the Artistic License v2.0.
$  ag --version
ag version 0.21.0
$  grep --version
grep (GNU grep) 2.14
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see .

实验设计

为了不产生并行执行的相互响应, 我还是选择了效率很差的同步执行, 我使用了ipython提供的%timeit。 测试程序的代码如下:

import re
import glob
import subprocess
import cPickle as pickle
from collections import defaultdict
IMAP = {
    'cn': ('豆瓣', '小明明'),
    'en': ('four', 'python')
}
OPTIONS = ('', '-i', '-v')
FILES = glob.glob('text_*_MB.txt')
EN_RES = defaultdict(dict)
CN_RES = defaultdict(dict)
RES = {
        'en': EN_RES,
        'cn': CN_RES
}
REGEX = re.compile(r'text_(d+)_(w+)_MB.txt')
CALL_STR = '{command} {option} {word} {filename} > /dev/null 2>&1'
for filename in FILES:
    size, xn = REGEX.search(filename).groups()
    for word in IMAP[xn]:
        _r = defaultdict(dict)
        for command in ['grep', 'ack', 'ag']:
            for option in OPTIONS:
                rs = %timeit -o -n10 subprocess.call(CALL_STR.format(command=command, option=option, word=word, filename=filename), shell=True)
                best = rs.best
                _r[command][option] = best
        RES[xn][word][size] = _r
# 存起来
data = pickle.dumps(RES)
with open('result.db', 'w') as f:
    f.write(data)

温馨提示, 这是一个灰常耗时的测试。 开始执行后 要喝很久的茶…

我来秦皇岛办事完毕(耗时超过1一天), 继续我们的实验。

我想要的效果

我想工作的时候一般都是用到不带参数/带-i(忽略大小写)/-v(查找不匹配项)这三种。 所以这里测试了:

  1. 英文搜索/中文搜索
  2. 选择了2个搜索词(效率太低, 否则可能选择多个)
  3. 分别测试’’/’-i’/’-v’三种参数的执行
  4. 使用%timeit, 每种条件执行10遍, 选择效率最好的一次的结果
  5. 每个图代码一个搜索词, 3搜索命令, 一个选项在搜索不同大小文件时的效率对比

我先说结论

  1. 在搜索的总数据量较小的情况下, 使用grep, ack甚至ag在感官上区别不大
  2. 搜索的总数据量较大时, grep效率下滑的很多, 完全不要选
  3. ack在某些场景下没有grep效果高(比如使用-v搜索中文的时候)
  4. 在不使用ag没有实现的选项功能的前提下, ag完全可以替代ack/grep

渲染图片的gist可以看这里benchmarks.ipynb。 它的数据来自上面跑的结果在序列化之后存入的文件。

Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
 

Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比
Linux:何不 Ack?Grep, Ack, Ag的搜索效率对比

来源:http://www.dongwm.com/archives/ack/

Linux:Ubuntu & XFCE vs Xubuntu

Ubuntu拥有漂亮的桌面体验以及强大的应用程序。Xubuntu轻量、快速并且可定制,哪个更适合你?


Linux:Ubuntu & XFCE vs Xubuntu
Linux:Ubuntu & XFCE vs Xubuntu

首先,这篇文章不是用来说明Ubuntu比Xubuntu更好或者Xubuntu比Ubuntu更好之类的东西。

并且,我同时也会在这篇文章中介绍Ubuntu用户如何获取基本的XFCE桌面,以及如何安装完整的Xubuntu桌面。

Ubuntu以及Xubuntu是针对不同目的开发的操作系统,为什么我会强调这一点,是为了说明什么时候或者为什么你应该使用Ubuntu或Xubuntu。

比较这两个操作系统就像比较劳斯莱斯保时捷。这两个都是很棒的车,但是如果把劳斯莱斯给一个赛车迷,他们也许会卖掉它买个其他的车,同样,如果把保时捷给舒格勋爵或者休·海夫纳这类人可能也不那么合适。

Ubuntu拥有一个适用性很强的桌面环境,叫做Unity,并且默认会安装一些很棒的Linux应用程序,包括Rhythmbox以及LibreOffic。Ubuntu就像是劳斯莱斯。它为舒适而生,并且尽可能的提供满足需要的漂亮的解决方案。

作为一个Ubuntu用户,就像汽车里面的乘客。你在到达目的地的过程中就可以同时把事情搞定,并且所有的事看起来都很漂亮并且很简单。

另一方面,Xubuntu采用了轻量的XFCE桌面环境。内置的应用自然也是轻量级的,使用它们也可以完成工作,但是不像Ubuntu自带的应用那么完整。

XFCE桌面环境可以高度定制化,你可以把你的桌面搞成任何你想要的形式。

Xubuntu就像一个改装过的跑车。你可以把它改装成任何你想要的样子。但不是做为一名乘客,而更像是驾驶员开着它快速漂移过弯,或者小心翼翼的通过狭小的弯角。

如果你不关心如何美化或者定制桌面,并且你发现Ubuntu用起来很顺手,那么你没必要切换到Xubuntu。

但是,如果你发现Unity没办法满足你的要求,并且感觉你的计算机在运行Ubuntu时或多或少有一些性能压力,那么当然就可以考虑考虑Xubuntu。

上周我发了一篇文章介绍怎么创建Xubuntu启动优盘,并且也写了一篇安装Xubuntu的教程(译者注:链接为github地址)。

不过,如果你已经安装了Ubuntu,就不用这么费事照着教程再来一遍了。你只需要继续读完这篇文章,就可以在Ubuntu里面安装一个更合适的解决方案。

那么如果你已经装了Ubuntu,如何切换到Xubuntu呢?

你需要做一个选择题。问题是,你是仅仅需要一个更轻量的、可定制化的XFCE桌面,还是同时也需要那些Xubuntu内置的轻量级应用。

先来看看这些应用吧。下面有一个列表,列出了Ubuntu和Xubuntu内置的应用程序。如果你只需要几个Xubuntu应用程序,那么我建议你只安装XFCE然后单独安装这些应用。如果你需要一半以上的应用,那就安装整个Xubuntu桌面环境吧。

Ubuntu与Xubuntu内置应用对比
应用类型 Ubuntu Xubuntu
音频 Rhythmbox gmusicbrowser
视频 Totem Parole
照片管理 Shotwell Ristretto
办公 LibreOffice Abiword/Gnumeric
浏览器 FireFox FireFox
Email   Thunderbird
即时通讯 Empathy Pidgin

如何在Ubuntu安装XFCE桌面环境

Linux:Ubuntu & XFCE vs Xubuntu
Linux:Ubuntu & XFCE vs Xubuntu

接下来,我会使用命令行工具apt-get介绍在Ubuntu安装XFCE桌面的方法。

打开一个终端窗口,在Unity环境,你可以在Dash中搜索“TERM”,或者使用组合键 CTRL+ALT+T

安装XFCE桌面十分简单,输入下列命令就可以了:

sudo apt-get update sudo apt-get install xfce4

点击右上角设置图标然后登出,来切换到XFCE桌面环境

切换到登入界面以后,点击在你用户名旁边的小Ubuntu图标,就会出现Unity桌面和XFCE桌面的选项。切换到XFCE然后正常登录。

系统会显示一个消息,提示你是否使用默认的面板布局或者使用单独的面板。

最新版本的Xubuntu在顶部包含一个单独的面板,不过我更喜欢双面板,顶部一个标准面板,底部一个常用程序的停靠面板。

需要注意的是,XFCE桌面菜单系统和Xubuntu的菜单有些差异,除非你安装一个更好的菜单系统,设置两个面板或许是个更好的选择。

这取决与选择的是哪个选项,不过没关系,如果后面你改变了主意,也可以很容易重新设置。XFCE可以进行深度的自定义。

不重新安装的情况下,如何从Ubuntu切换到Xubuntu

Linux:Ubuntu & XFCE vs Xubuntu
Linux:Ubuntu & XFCE vs Xubuntu

如果你想全都使用Xubuntu的东西,但是又不想按照那些介绍重新安装系统的话,看看下面的东西。

通过搜索“TERM”,或者组合键CTRL+ALT+T,打开一个终端窗口。

在终端输入如下命令:

sudo apt-get update sudo apt-get install xubuntu-desktop

花费的时间会比安装XFCE桌面长一些,但是要比重新安装Xubuntu系统要快。

安装完成以后,点击右上角图标,然后登出。

在登录界面,点击Ubuntu图标。会出现Unity和Xubuntu选项。点击Xubuntu,然后正常登入。

Xubuntu桌面就会显示出来啦。

这里会有一些差异。菜单仍然是XFCE菜单,而不是Xubuntu菜单。某些图标也不会出现在顶部面板中。但是这些小问题都不足以让我们花时间卸载Ubuntu然后重装Xubuntu。

下一篇文章中,我会介绍如何自定义Xubuntu以及XFCE桌面。


via : http://linux.about.com/od/dist/fl/Ubuntu-With-XFCE-vs-Xubuntu-Linux.htm

作者:Gary Newell 译者:zhouj-sh 校对:wxy

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

来源:https://linux.cn/article-5095-1.html

Linux:如何使用 backupninja 来备份 Debian 系统

小心谨慎或灾难体验会让每一个系统管理都认识到频繁的系统备份的重要性。你可以通过编写管用的旧式 shell 脚本,或使用一个(或几个)适合这项工作的备份工具来完成备份任务。因此,当你要实施一个备份解决方案时,你了解的备份工具越多,你做出的决策就会越明智。

在这篇文章中,我们将为你介绍 backupninja ,这是一个轻量且易于配置的系统备份工具。在诸如 rdiff-backup, duplicity, mysqlhotcopymysqldump 等程序的帮助下, Backupninja 可以提供常用的备份功能,如执行远程的、安全的和增量式的文件系统备份,加密备份以及 MySQL/MariaDB 数据库备份。你可以选择性地开启使用 Email 状态报告功能,也可以对一般的硬件和系统的信息进行备份。 backupninja 的一个关键功能是它拥有一个内建的基于控制台的向导程序(被称为 ninjahelper),而后者允许你为不同的备份情景轻松地创建配置文件。

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

(题图来自:blogspot.com)

如果非要说的话,backupninja 的缺点是:为了充分使用其所有的功能,它要求安装一些其他“助手”程序。尽管 backupninja 有针对基于 Red Hat(红帽)的发行版本的 RPM 安装包,但 backupninja 针对 Debian 及其衍生发行版本的依赖进行了优化。所以不建议在基于 Red Hat 的系统上尝试 backupninja 。

在这篇教程中,我们将介绍如何在基于 Debian 的发行版本上安装 backupninja 。

安装 Backupninja

以 root 账户来运行下面的命令:

# aptitude install backupninja

在安装的过程中,有几个文件和目录将被创建:

  • /usr/sbin/backupninja 是个 bash shell 的主脚本;
  • /etc/cron.d/backupninja, 默认情况下,设置 cron 任务来每隔一个小时运行上面的主脚本;
  • /etc/logrotate.d/backupninja 截断由 backupninja 程序产生的日志;
  • /etc/backup.d/ 是备份操作的配置文件驻留的目录;
  • /etc/backupninja.conf 是包含一般选项的主配置文件。这个文件带有良好的注释且详细解释了每个选项的含义;
  • /usr/share/backupninja 是那些 backupninja 所使用的脚本所处的目录。这些脚本文件负责执行实际的工作。在这个目录中,你还可以找到 .helper文件,它们可以被用来配置和设定 ninjahelper 的菜单;
  • /usr/share/doc/backupninja/examples 含有操作配置文件(即通过 ninjahelper 产生的文件)的模板。

首次运行 Ninjahelper

当我们尝试启动 ninjahelper 时,我们可以看到可能需要一个内部依赖程序。假如系统进行了提示,请输入 “yes” 并敲下回车键来安装 dialog(一个用于从 shell 脚本中显示友好对话框的工具)。

当你在键入 yes 后再敲回车键时,backupninja 将会安装 dialog,一旦安装完成,将呈现出下面的截屏:

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

案例 1: 备份硬件和系统信息

在启动了 ninjahelper 之后,我们将创建一个新的备份操作:

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

如果必要的助手程序没有被安装,下面的截屏将会呈现在我们眼前。假如这些软件包已经在你的系统上安装了,请跳过这一步。

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

接下来的一步需要你选取相关条目来作为此次备份任务的一部分。前四个条目已经默认被选上了,但你可以通过在条目上按空格键来撤消选择。

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

一旦你完成了上面的步骤,按 OK 选项来继续。接着你将能够选择是愿意使用默认的配置文件(/etc/backup.d/10.sys)来完成这次备份操作,还是创建一个新的配置文件。若为后者,一个含有与默认配置文件内容相同的文件将会在相同的目录下被创建,但它被命名为 11.sys,后续的备份操作将会创建类似的文件(注:只不过命名的序号不同)。需要说明的是一旦这个新的配置文件被创建,你便可以使用你喜爱的文本编辑器来编辑该文件。

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

案例 2: 一个远程目录的增量式 Rsync 拉取备份

正如你最有可能知道的那样, rsync 被广泛地用于通过网络同步文件或文件夹。在接下来的例子中,我们将讨论一个使用硬链接来为一个远程目录做增量式拉取备份的方法,它被用来保存历史数据以及在我们本地的文件服务器中恢复这些历史数据。这个方法将帮助我们节省空间并增强位于服务器端的安全性。

步骤 1:编写一个带有如下内容的自定义脚本,放在 /etc/backup.d,并将它的权限设置为 600 。需要说明的是,除了一般的配置文件,这个目录可能还包含当 backupninja 执行时你想运行的一些脚本文件,它们可以发挥出位于主配置文件中的变量的优势。

# REMOTE USER
user=root
# REMOTE HOST
host=dev1
# REMOTE DIRECTORY
remotedir=/home/gacanepa/
# LOCAL DIRECTORY
localdir=/home/gacanepa/backup.0
# LOCAL DIRECTORY WHERE PREVIOUS BACKUP WAS STORED
localdirold=/home/gacanepa/backup.1
mv $localdir $localdirold
# RSYNC
rsync -av --delete --recursive --link-dest=$localdirold $user@$host:$remotedir $localdir

在上面的配置中, rsync 的 ‘–link-dest’ 选项的作用是为位于 $localdir-old 目录中那些没有改变的文件(包含所有属性) 硬链接到目标目录($localdir)。

步骤 2:在 backupninja 第一次运行之前,上层目录(这个例子中指的是 /home/gacanepa) 是空的。第一次我们执行下面的命令:

# backupninja -n

backup.0 目录就被创建了,并在接下来的过程中,它的名称将会被更改为 backup.1。

当我们第二次运行 backupninja 时, backup.0 将会被重新创建,而 backup.1 保持不动。

Linux:如何使用 backupninja 来备份 Debian 系统
Linux:如何使用 backupninja 来备份 Debian 系统

步骤 3: 确保 backup.1 里面的文件硬链接到 backup.0 里的文件,我们可以通过比较文件的 inode(i 节点)数和目录的大小来达到此目的。

总结

Backupninja 不仅是一个经典的备份工具,它也是一个易于配置的实用程序。你可以通过编写你自己的控制脚本,用放在 /etc.backup.d中的不同的配置文件来运行 backupninja 。甚至你还可以为 ninjahelper 编写助手程序,并将其包括在 ninjahelper 的主界面上。

例如,假如你在 /usr/share/backupninja目录中创建了一个名为 xmodulo 的控制脚本,它将自动运行那些位于 /etc/backup.d目录中以 .xmodulo 为后缀的每个文件。如果你决定添加你的 xmodulo 控制脚本到 ninjahelper 中, 你可以编写相应的助手程序,即 xmodulo.helper 。另外,假如你想 让 backupninja 运行其它的脚本,只需把它添加到 /etc/backup.d目录中就可以了。

欢迎使用下面的评论框来留下你的评论、问题或建议。听到你的回应将会使我们很高兴。


via: http://xmodulo.com/backup-debian-system-backupninja.html

作者:Gabriel Cánepa 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5096-1.html

Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy

这是一款提取网站数据的开源工具。Scrapy框架用Python开发而成,它使抓取工作又快又简单,且可扩展。我们已经在virtual box中创建一台虚拟机(VM)并且在上面安装了Ubuntu 14.04 LTS。

安装 Scrapy

Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy

Scrapy依赖于Python、开发库和pip。Python最新的版本已经在Ubuntu上预装了。因此我们在安装Scrapy之前只需安装pip和python开发库就可以了。

pip是作为python包索引器easy_install的替代品,用于安装和管理Python包。pip包的安装可见图 1。

sudo apt-get install python-pip

Fig:1 Pip installation

图:1 pip安装

我们必须要用下面的命令安装python开发库。如果包没有安装那么就会在安装scrapy框架的时候报关于python.h头文件的错误。

sudo apt-get install python-dev

Fig:2 Python Developer Libraries

图:2 Python 开发库

scrapy框架既可从deb包安装也可以从源码安装。在图3中我们用pip(Python 包管理器)安装了deb包了。

sudo pip install scrapy

Fig:3 Scrapy Installation

图:3 Scrapy 安装

图4中scrapy的成功安装需要一些时间。

Fig:4 Successful installation of Scrapy Framework

图:4 成功安装Scrapy框架

使用scrapy框架提取数据

基础教程

我们将用scrapy从fatwallet.com上提取商店名称(卖卡的店)。首先,我们使用下面的命令新建一个scrapy项目“store name”, 见图5。

$sudo scrapy startproject store_name
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy

图:5 Scrapy框架新建项目

上面的命令在当前路径创建了一个“store_name”的目录。项目主目录下包含的文件/文件夹见图6。

$sudo ls –lR store_name
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy

图:6 store_name项目的内容

每个文件/文件夹的概要如下:

  • scrapy.cfg 是项目配置文件
  • store_name/ 主目录下的另一个文件夹。 这个目录包含了项目的python代码
  • store_name/items.py 包含了将由蜘蛛爬取的项目
  • store_name/pipelines.py 是管道文件
  • store_name/settings.py 是项目的配置文件
  • store_name/spiders/, 包含了用于爬取的蜘蛛

由于我们要从fatwallet.com上如提取店名,因此我们如下修改文件(LCTT 译注:这里没说明是哪个文件,译者认为应该是 items.py)。

import scrapy
class StoreNameItem(scrapy.Item):
   name = scrapy.Field()   #  取出卡片商店的名称

之后我们要在项目的store_name/spiders/文件夹下写一个新的蜘蛛。蜘蛛是一个python类,它包含了下面几个必须的属性:

  1. 蜘蛛名 (name )
  2. 爬取起点url (start_urls)
  3. 包含了从响应中提取需要内容相应的正则表达式的解析方法。解析方法对爬虫而言很重要。

我们在storename/spiders/目录下创建了“storename.py”爬虫,并添加如下的代码来从fatwallet.com上提取店名。爬虫的输出写到文件(StoreName.txt)中,见图7。

from scrapy.selector import Selector
from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.http import FormRequest
import re
class StoreNameItem(BaseSpider):
name = "storename"
allowed_domains = ["fatwallet.com"]
start_urls = ["http://fatwallet.com/cash-back-shopping/"]
def parse(self,response):
output = open('StoreName.txt','w')
resp = Selector(response)
tags = resp.xpath('//tr[@class="storeListRow"]|
         //tr[@class="storeListRow even"]|
         //tr[@class="storeListRow even last"]|
          //tr[@class="storeListRow last"]').extract()
for i in tags:
i = i.encode('utf-8', 'ignore').strip()
store_name = ''
if re.search(r"class="storeListStoreName">.*?<",i,re.I|re.S):
store_name = re.search(r"class="storeListStoreName">.*?<",i,re.I|re.S).group()
store_name = re.search(r">.*?<",store_name,re.I|re.S).group()
store_name = re.sub(r'>',"",re.sub(r'<',"",store_name,re.I))
store_name = re.sub(r'&',"&",re.sub(r'&',"&",store_name,re.I))
#print store_name
output.write(store_name+""+"n")
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
Linux:如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy

图:7 爬虫的输出

注意: 本教程的目的仅用于理解scrapy框架


via: http://linoxide.com/ubuntu-how-to/scrapy-install-ubuntu/

作者:nido 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5098-1.html

Linux:20个 Unix/Linux 命令技巧

让我们用这些Unix/Linux命令技巧开启新的一年,提高在终端下的生产力。我已经找了很久了,现在就与你们分享。

Linux:20个 Unix/Linux 命令技巧
Linux:20个 Unix/Linux 命令技巧

删除一个大文件

我在生产服务器上有一个很大的200GB的日志文件需要删除。我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘IO造成的,要删除这个大文件,输入:

> /path/to/file.log
# 或使用如下格式
: > /path/to/file.log
# 然后删除它
rm /path/to/file.log

如何记录终端输出?

试试使用script命令行工具来为你的终端输出创建输出记录。

script my.terminal.sessio

输入命令:

ls
date
sudo service foo stop

要退出(结束script会话),输入 exit 或者 logout 或者按下 control-D

exit

要浏览输入:

more my.terminal.session
less my.terminal.session
cat my.terminal.session

还原被删除的 /tmp 文件夹

我在文章Linux和Unix shell,我犯了一些错误。我意外地删除了/tmp文件夹。要还原它,我需要这么做:

mkdir /tmp
chmod 1777 /tmp
chown root:root /tmp
ls -ld /tmp

锁定一个文件夹

为了我的数据隐私,我想要锁定我文件服务器下的/downloads文件夹。因此我运行了:

chmod 0000 /downloads

root用户仍旧可以访问,而ls和cd命令则不工作。要还原它用:

chmod 0755 /downloads

在vim中用密码保护文件

害怕root用户或者其他人偷窥你的个人文件么?尝试在vim中用密码保护,输入:

vim +X filename

或者,在退出vim之前使用:X 命令来加密你的文件,vim会提示你输入一个密码。

清除屏幕上的乱码

只要输入:

reset

易读格式

传递-h或者-H(和其他选项)选项给GNU或者BSD工具来获取像ls、df、du等命令以易读的格式输出:

ls -lh
# 以易读的格式 (比如: 1K 234M 2G)
df -h
df -k
# 以字节、KB、MB 或 GB 输出:
free -b
free -k
free -m
free -g
# 以易读的格式输出 (比如 1K 234M 2G)
du -h
# 以易读的格式显示文件系统权限
stat -c %A /boot
# 比较易读的数字
sort -h -a file
# 在Linux上以易读的形式显示cpu信息
lscpu
lscpu -e
lscpu -e=cpu,node
# 以易读的形式显示每个文件的大小
tree -h
tree -h /boot

在Linux系统中显示已知的用户信息

只要输入:

## linux 版本 ##
lslogins
## BSD 版本 ##
logins

示例输出:

UID USER      PWD-LOCK PWD-DENY LAST-LOGIN GECOS
  0 root             0        0   22:37:59 root
  1 bin              0        1            bin
  2 daemon           0        1            daemon
  3 adm              0        1            adm
  4 lp               0        1            lp
  5 sync             0        1            sync
  6 shutdown         0        1 2014-Dec17 shutdown
  7 halt             0        1            halt
  8 mail             0        1            mail
 10 uucp             0        1            uucp
 11 operator         0        1            operator
 12 games            0        1            games
 13 gopher           0        1            gopher
 14 ftp              0        1            FTP User
 27 mysql            0        1            MySQL Server
 38 ntp              0        1
 48 apache           0        1            Apache
 68 haldaemon        0        1            HAL daemon
 69 vcsa             0        1            virtual console memory owner
 72 tcpdump          0        1
 74 sshd             0        1            Privilege-separated SSH
 81 dbus             0        1            System message bus
 89 postfix          0        1
 99 nobody           0        1            Nobody
173 abrt             0        1
497 vnstat           0        1            vnStat user
498 nginx            0        1            nginx user
499 saslauth         0        1            "Saslauthd user"

我如何删除意外在当前文件夹下解压的文件?

我意外在/var/www/html/而不是/home/projects/www/current下解压了一个tarball。它搞乱了/var/www/html下的文件,你甚至不知道哪些是误解压出来的。最简单修复这个问题的方法是:

cd /var/www/html/
/bin/rm -f "$(tar ztf /path/to/file.tar.gz)"

对top命令的输出感到疑惑?

正经地说,你应该试一下用htop代替top:

sudo htop

想要再次运行相同的命令

只需要输入!!。比如:

/myhome/dir/script/name arg1 arg2
# 要再次运行相同的命令
!!
## 以root用户运行最后运行的命令
sudo !!

!!会运行最近使用的命令。要运行最近运行的以“foo”开头命令:

!foo
# 以root用户运行上一次以“service”开头的命令
sudo !service

!$用于运行带上最后一个参数的命令:

# 编辑 nginx.conf
sudo vi /etc/nginx/nginx.conf
# 测试 nginx.conf
/sbin/nginx -t -c /etc/nginx/nginx.conf
# 测试完 "/sbin/nginx -t -c /etc/nginx/nginx.conf"你可以用vi再次编辑这个文件了
sudo vi !$

在终端上提醒你必须得走了

如果你需要提醒离开你的终端,输入下面的命令:

leave +hhmm

这里:

  • hhmm – 时间是以hhmm的形式,hh表示小时(12时制或者24小时制),mm代表分钟。所有的时间都转化成12时制,并且假定发生在接下来的12小时。

甜蜜的家

想要进入刚才进入的地方?运行:

cd -

需要快速地回到你的家目录?输入:

cd

变量CDPATH定义了目录的搜索路径:

export CDPATH=/var/www:/nas10

现在,不用输入cd */var/www/html/ 这样长了,我可以直接输入下面的命令进入 /var/www/html:

cd html

在less浏览时编辑文件

要编辑一个正在用less浏览的文件,可以按下v。你就可以用变量$EDITOR所指定的编辑器来编辑了:

less *.c
less foo.html
## 按下v键来编辑文件 ##
## 退出编辑器后,你可以继续用less浏览了 ##

列出你系统中的所有文件和目录

要看到你系统中的所有目录,运行:

find / -type d | less
# 列出$HOME 所有目录
find $HOME -type d -ls | less

要看到所有的文件,运行:

find / -type f | less
# 列出 $HOME 中所有的文件
find $HOME -type f -ls | less

用一条命令构造目录树

你可以用mkdir加上-p选项一次创建一颗目录树:

mkdir -p /jail/{dev,bin,sbin,etc,usr,lib,lib64}
ls -l /jail/

将文件复制到多个目录中

不必运行:

cp /path/to/file /usr/dir1
cp /path/to/file /var/dir2
cp /path/to/file /nas/dir3

运行下面的命令来复制文件到多个目录中:

echo /usr/dir1 /var/dir2 /nas/dir3 |  xargs -n 1 cp -v /path/to/file

留下创建一个shell函数作为读者的练习。

快速找出两个目录的不同

diff命令会按行比较文件。但是它也可以比较两个目录:

ls -l /tmp/r
ls -l /tmp/s
# 使用 diff 比较两个文件夹
diff /tmp/r/ /tmp/s/
Linux:20个 Unix/Linux 命令技巧
Linux:20个 Unix/Linux 命令技巧

图片: 找出目录之间的不同

文本格式化

你可以用fmt命令重新格式化每个段落。在本例中,我要用分割超长的行并且填充短行:

fmt file.txt

你也可以分割长的行,但是不重新填充,也就是说分割长行,但是不填充短行:

fmt -s file.txt

可以看见输出并将其写入到一个文件中

如下使用tee命令在屏幕上看见输出并同样写入到日志文件my.log中:

mycoolapp arg1 arg2 input.file | tee my.log

tee可以保证你同时在屏幕上看到mycoolapp的输出并写入文件  my.log。


via: http://www.cyberciti.biz/open-source/command-line-hacks/20-unix-command-line-tricks-part-i/

作者:nixCraft 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5099-1.html

Linux:Linux 有问必答:如何使用yum来下载RPM包而不进行安装

问题:我想从Red Hat 的标准仓库中下载一个RPM包,我能使用yum命令来下载一个RPM包但是不进行安装吗?

yum是基于Red Hat的系统(如CentOS、Fedora、RHEl)上的默认包管理器。使用yum,你可以安装或者更新一个RPM包,并且他会自动解决包依赖关系。但是如果你只想将一个RPM包下载到你的系统上该怎么办呢? 例如,你可能想要获取一些RPM包在以后使用,或者将他们安装在另外的机器上。

这里说明了如何从yum仓库上下载一个RPM包。

Linux:Linux 有问必答:如何使用yum来下载RPM包而不进行安装
Linux:Linux 有问必答:如何使用yum来下载RPM包而不进行安装

方法一:yum

yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了--downloadonly(只下载)的选项来达到这个目的。

$ sudo yum install --downloadonly 

默认情况下,一个下载的RPM包会保存在下面的目录中:

/var/cache/yum/x86_64/[centos/fedora-version]/[repository]/packages

以上的[repository]表示下载包的来源仓库的名称(例如:base、fedora、updates)

如果你想要将一个包下载到一个指定的目录(如/tmp):

$ sudo yum install --downloadonly --downloaddir=/tmp 

注意,如果下载的包包含了任何没有满足的依赖关系,yum将会把所有的依赖关系包下载,但是都不会被安装。

另外一个重要的事情是,在CentOS/RHEL 6或更早期的版本中,你需要安装一个单独yum插件(名称为 yum-plugin-downloadonly)才能使用--downloadonly命令选项:

$ sudo yum install yum-plugin-downloadonly

如果没有该插件,你会在使用yum时得到以下错误:

Command line error: no such option: --downloadonly
Linux:Linux 有问必答:如何使用yum来下载RPM包而不进行安装
Linux:Linux 有问必答:如何使用yum来下载RPM包而不进行安装

方法二: Yumdownloader

另外一个下载RPM包的方法就是通过一个专门的包下载工具–yumdownloader。 这个工具是yum工具包(包含了用来进行yum包管理的帮助工具套件)的子集。

$ sudo yum install yum-utils

下载一个RPM包:

$ sudo yumdownloader 

下载的包会被保存在当前目录中。你需要使用root权限,因为yumdownloader会在下载过程中更新包索引文件。与yum命令不同的是,任何依赖包不会被下载。


via: http://ask.xmodulo.com/yum-download-rpm-package.html

译者:theo-l 校对:wxy

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

来源:https://linux.cn/article-5100-1.html

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

也许你没有从我先前关于 backupninjabackup-manager 的两篇文章中发现,我是一个超级备“粉”。当提到备份,我宁愿备份的太多而不希望备份不足,因为如果我们有需要的话,你将会感激你为重要数据生成额外的拷贝所付出的时间和精力。

在这篇文章中,我将向你介绍 BackupPC,一个跨平台的备份服务器软件,它可以通过网络为 Linux,Windows 和 MacOS 等系统上的客户端主机拉取备份。BackupPC 添加了一系列的特点使得管理备份变为一件快乐的事。

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

BackupPC 的特点

BackupPC 自带有一个健壮的 Web 界面,允许你以集中化的方式来收集和管理其他远程客户端主机上的备份。通过使用它的 Web 界面,你可以检查日志和配置文件、为其他远程主机启动/取消/安排备份任务以及可视化备份任务的当前状态。你也可以非常容易地浏览归档的文件以及从备份的归档中恢复单个文件或整个备份。要恢复单个文件,你可以直接通过 Web 界面来下载任何先前备份的文件。不仅如此,客户端主机并不需要安装特别的客户端软件。在 Windows 客户端上, 使用的是原生的 SMB 协议,而对于 *nix 客户端,你将使用 rsync或 通过 SSH, RSH 或 NFS 来使用 tar

安装 BackupPC

在 Debian,Ubuntu 和它们的衍生版本上,运行下面的命令:

# aptitude install backuppc

在 Fedora上, 使用 yum命令。请注意软件包名字对大小写敏感。

在 CentOS/RHEL 6 上,首先要启用 EPEL 软件仓库。在 CentOS/RHEL 7 上,请替代启用 Nux Dextop 软件仓库。然后接着使用 yum命令:

# yum install BackupPC

同往常一样,这两种包管理系统都会自动解决依赖问题。另外,作为安装过程中的一部分,你可能需要新配置或修改配置用于图形用户界面的 Web 服务器。下面的截图来自于 Debian 系统:

通过空格键来确定你的选择,然后使用 tab 键移动到 Ok 选项并敲回车键。

接着类似于下面的截屏将会呈现在你眼前,通知你创建了一个用来管理 BackupPC 的名为 ‘backuppc’的管理员用户以及相应的密码(如果你需要,这个密码以后可以更改)。这里需要注意的是:这里创建了同样名为 ‘backuppc’的 HTTP 账户和常规的 Linux 账户,它们使用相同的密码。需要前者的目的是来访问受保护的 BackupPC 的 Web 界面,而后者则是为了通过 SSH 来使用 rsync来执行备份任务。

你可以使用下面的命令来更改 HTTP 账户 ‘backuppc’ 的默认密码:

# htpasswd /path/to/hash/file backuppc

至于常规的 ‘backuppc’ Linux账户,可以使用 passwd命令来更改它的默认密码:

# passwd backuppc

需要提及的是:安装过程中会自动创建 Web 和程序的配置文件。

启动 BackupPC 并设置备份

首先,打开一个浏览器窗口并指向 http://<服务器名称或 IP 地址>/backuppc/ 。当弹出提示框时,输入先前向你创建的默认 HTTP 用户凭据(注:即用户名 backuppc 和相应的默认密码)。假如认证成功,你就会被带入到 Web 界面的主页:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

你想做的第一件事最有可能是通过新增一个客户端主机来备份。进入任务窗格中的 “编辑主机”选项。我们将添加两个客户端主机:

  • Host #1: CentOS 7 [IP 192.168.0.17]
  • Host #2: Windows 7 [IP 192.168.0.103]

我们将通过 SSH 使用 rsync来备份 CentOS 主机,使用 SMB 来备份 Windows 主机。在执行备份之前,我们需要向我们的 CentOS 主机设置 基于密钥认证 以及在我们的 Windows 主机中设置一个共享目录。

下面是关于如何为一个远程 CentOS 主机设置基于密钥认证的指导。我们创建 ‘backuppc’ 用户的 RSA 密钥对,并将其公钥传输给 CentOS 主机上的 root 账户。

# usermod -s /bin/bash backuppc
# su - backuppc
# ssh-keygen -t rsa
# ssh-copy-id root@192.168.0.17

当弹出提示框时,键入 yes 并为 192.168.0.17 键入 root 用户的密码:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

你需要一个远程的 CentOS 主机的 root 权限,以获得在该主机中的文件系统中写权限,以防要恢复的备份文件或目录的所有者为 root 账户。

一旦 CentOS 和 Windows 主机都准备完毕,使用 Web 界面将它们添加到 BackupPC:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

下一步更改每个主机的备份设置:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

接下来的图片展示了 Windows 主机的备份设置:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

而接着的截图展示了 CentOS 主机的备份设置:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

开始一个备份任务

为了开始备份,到每个主机的设定选项,然后点击“开始全备份”:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

在任何时候,你都可以通过点击如上图展示的每个主机的备份主页来查看备份任务的状态。假如因为某些原因备份失败,在主机菜单中将会出现一个指向包含错误信息的网页的链接。当一个备份任务成功完成后,在服务器的 /var/lib/backuppc/pc 目录下会创建一个命名为主机名或 IP 地址的目录。

我们也可以随意地在命令行中浏览这个目录中的文件,但存在一个更加简单的方式来查找和恢复这些文件。

恢复备份

要浏览这些保存的文件,进入每个主机的主菜单下的 “浏览备份”选项,你可以一目了然地看到目录和文件,并选择那些你想恢复的文件。另外,你还可以通过点击文件来使用默认程序打开文件或右击文件并选择“另存为”来下载该文件到你当前的机器上:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

如若你想,你可以下载一个包含所有你想备份的内容的 zip 或 tar 文件:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

或只是恢复文件:

Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器
Linux:如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

总结

有句俗话说,”越简单,越好”,而这正是 BackupPC 所提供的东西。在 BackupPC 中,你将不仅找到了一个备份工具,而且还找到了一个无需任何客户端应用来在几个不同的操作系统中管理你的备份的方法。我相信这就有足够的理由让你去尝试一下。

欢迎使用下面的评论框来留下你的评论和问题,假如你有的话。我总是乐于听取读者想说的话!


via: http://xmodulo.com/backuppc-cross-platform-backup-server-linux.html

作者:Gabriel Cánepa 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5097-1.html

Linux:使用Nemiver调试器来调试 C/C++ 程序

如果你读过我写的使用GDB命令行调试器调试C/C++程序,你就会明白一个调试器对一段C/C++程序来说有多么的重要和有用。然而,如果一个像GDB这样的命令行对你而言听起来更像一个问题而不是一个解决方案的话,那么你也许会对Nemiver更感兴趣。Nemiver 是一款基于 GTK+ 的用于C/C++程序的图形化的独立调试器,它以GDB作为其后端。最令人赞赏的是其速度和稳定性,Nemiver是一个非常可靠,具备许多优点的调试工具。

Nemiver的安装

基于Debian发行版,它的安装时非常直接简单,如下:

$ sudo apt-get install nemiver

在Arch Linux中安装如下:

$ sudo pacman -S nemiver

在Fedora中安装如下:

$ sudo yum install nemiver

如果你选择自己编译,GNOME 网站上有最新源码包。

最令人欣慰的是,它能够很好地与GNOME环境像结合。

Nemiver的基本用法

启动Nemiver的命令:

$ nemiver

你也可以通过执行一下命令来启动:

$ nemiver [需要调试的可执行程序的路径]

注意,如果在调试模式下编译程序(在 GCC 中使用 -g 选项)将会对 nemiver 更有帮助。

还有一个优点是Nemiver的加载很快,所以你马上就可以看到主屏幕的默认布局。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

默认情况下,断点通常位于主函数的第一行。这样就可以空出时间让你去认识调试器的基本功能:

  • 执行到下一行 (按键是F6)
  • 执行到函数内部即停止(F7)
  • 执行到函数外部即停止(Shift+F7)

不过我个人喜欢“Run to cursor(运行至光标所在行)”,该选项使你的程序准确的运行至你光标所在行,它的默认按键是F11。

断点是很容易使用的。最快捷的方式是在一行代码上按下F8来设置一个断点。但是Nemiver在“Debug”菜单下也有一个更复杂的菜单,它允许你在一个特定的函数,某一行,二进制文件中的位置,或者类似异常、分支或者exec的事件上设置断点。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

你也可以通过追踪来查看一个变量。在“Debug”中,你可以用一个表达式的名字来检查它的值,然后也可以通过将其添加到列表中以方便访问。这可能是最有用的一个功能,虽然我从未有兴趣将鼠标悬停在一个变量来获取它的值。值得注意的是,虽然鼠标悬停可以取到值,如果想要让它更好地工作,Nemiver是可以看到结构并给出所有成员的变量的赋值。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

谈到方便地访问信息,我也非常欣赏这个程序的布局。默认情况下,代码在上半部分,功能区标签在下半部分。这可以让你访问终端的输出、上下文追踪器、断点列表、注册器地址、内存映射和变量控制。但是请注意在“Edit”-“Preferences”-“Layout”下你可以选择不同的布局,包括一个可以修改的动态布局。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

自然,当你设置了全部断点,观察点和布局,您可以在“File”菜单下很方便地保存该会话,以便你下次打开时恢复。

Nemiver的高级用法

到目前为止,我们讨论的都是Nemiver的基本特征,例如,你马上开始调试一个简单的程序需要了解什么。如果你有更高的需求,特别是对于一些更加复杂的程序,你应该会对接下来提到的这些特征更感兴趣。

调试一个正在运行的进程

Nemiver允许你驳接到一个正在运行的进程进行调试。在“File”菜单,你可以筛选出正在运行的进程,并驳接到某个进程。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

通过TCP连接远程调试一个程序

Nemiver支持远程调试,你可以在一台远程机器上设置一个轻量级调试服务器,然后你在另外一台机器上启动 nemiver 去调试运行在调试服务器上的程序。如果出于某些原因,你不能在远程机器上很好地驾驭 Nemiver或者GDB,那么远程调试对于你来说将非常有用。在“File”菜单下,指定二进制文件、共享库位置、远程地址和端口。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

使用你的GDB二进制程序进行调试

如果你的Nemiver是自行编译的,你可以在“Edit(编辑)”-“Preferences(首选项)”-“Debug(调试)”下给GDB指定一个新的位置。如果你想在Nemiver下使用定制版本的GDB,那么这个选项对你来说是非常实用的。

跟随一个子进程或者父进程

当你的程序分支时,Nemiver是可以设置为跟随子进程或者父进程的。想激活这个功能,请到“Debugger”下面的“Preferences(首选项)”。

Linux:使用Nemiver调试器来调试 C/C++ 程序
Linux:使用Nemiver调试器来调试 C/C++ 程序

总而言之,Nemiver大概是我最喜欢的不在IDE里面的调试程序。在我看来,它甚至可以击败GDB,它和命令行程序一样深深吸引了我。所以,如果你从未使用过的话,我会强烈推荐你使用。我十分感谢它背后的开发团队给了我这么一个可靠、稳定的程序。

你对Nemiver有什么见解?你是否也考虑它作为独立的调试工具?或者仍然坚持使用IDE?让我们在评论中探讨吧。


via: http://xmodulo.com/debug-program-nemiver-debugger.html

作者:Adrien Brochard 译者:disylee 校对:wxy

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

来源:https://linux.cn/article-5107-1.html

Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2

Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2
Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2

KDE Plasma 5.2已经发布一段时间了,在本篇中我们将看到如何在Ubuntu 14.10 上安装KDE Plasma 5.2。

Ubuntu的默认桌面环境Unity很漂亮还有很多特性,但是如果你问任何有经验的Linux用户关于桌面定制能力,他的回答将是KDE。KDE在定制上是王者并且它得到流行大概是由于Ubuntu有官方的KDE版本,也就是Kubuntu3

对于Ubuntu(或者任何其他的Linux系统)而言的一个好消息是它们没有绑定在任何特定的桌面环境上,你可以安装额外的桌面环境并在不同的桌面环境间切换。早先我们已经了解如下的桌面环境的安装。

今天我们要展示如何在Ubuntu 14.10 中如何安装KDE Plasma。

如何在Ubuntu 14.10 上安装KDE Plasma 5.2

在Ubuntu 14.10上安装Plasma之前,你要知道这会下载大概1GB的内容。因此在安装KDE之前要考虑速度和数据存放空间。我们下载所使用的PPA是KDE社区官方提供的。在终端中使用下面的命令:

sudo apt-add-repository ppa:kubuntu-ppa/next-backports
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install kubuntu-plasma5-desktop plasma-workspace-wallpapers

在安装中,我们要选择默认的显示管理器。我选择的是默认的LightDM。安装完成后,重启系统。在登录时,点击登录区域旁边的Ubuntu图标。这里选择Plasma。

Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2
Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2

你现在就登录到KDE Plasma了。这里有一个KDE Plasma 5.2在Ubuntu 14.10下的截图:

Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2
Linux:如何在 Ubuntu 14.10 上安装 KDE Plasma 5.2

从Ubuntu中卸载KDE Plasma

如果你想要卸载它,使用下面的命令从Ubuntu 14.10中卸载KDE Plasma。

sudo apt-get install ppa-purge
sudo apt-get remove kubuntu-plasma5-desktop
sudo ppa-purge ppa:kubuntu-ppa/next

via: http://itsfoss.com/install-kde-plasma-ubuntu-1410/

作者:Abhishek 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5121-1.html

Linux:Linux中的15个基本‘ls’命令示例

ls命令是Linux系统中最被频繁使用的命令之一,我相信ls命令一定是你进入一台Linux系统的电脑打开命令提示符后第一个使用的命令。我们每天都在频繁地使用ls命令,即使我们可能没有意识也从来用不到所有可用的选项。本文中,我们将讨论下一些基本的ls命令并且覆盖尽可能多的有关参数来讲解。

Linux:Linux中的15个基本‘ls’命令示例
Linux:Linux中的15个基本‘ls’命令示例

Linux的ls命令

1. 不带任何选项列出文件

不带选项的ls命令来光秃秃地列出文件和目录,我们是不能看到像文件类型、大小、修改日期和时间、权限以及链接这样具体的信息的。

# ls
0001.pcap        Desktop    Downloads         index.html   install.log.syslog  Pictures  Templates
anaconda-ks.cfg  Documents  fbcmd_update.php  install.log  Music               Public    Videos

2 带 –l 选项列出文件列表

你看,ls -l(-l是字母不是“1”)就能展示出是文件还是目录,它的大小、修改日期和时间、文件或目录的名字以及文件的属主和它的权限。

# ls -l
total 176
-rw-r--r--. 1 root root   683 Aug 19 09:59 0001.pcap
-rw-------. 1 root root  1586 Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Documents
drwxr-xr-x. 4 root root  4096 Aug 16 02:55 Downloads
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Videos

3. 浏览隐藏文件

列出所有文件包括以‘.’开头的隐藏文件。

# ls -a
.                .bashrc  Documents         .gconfd          install.log         .nautilus     .pulse-cookie
..               .cache   Downloads         .gnome2          install.log.syslog  .netstat.swp  .recently-used.xbel
0001.pcap        .config  .elinks           .gnome2_private  .kde                .opera        .spice-vdagent
anaconda-ks.cfg  .cshrc   .esd_auth         .gtk-bookmarks   .libreoffice        Pictures      .tcshrc
.bash_history    .dbus    .fbcmd            .gvfs            .local              .pki          Templates
.bash_logout     Desktop  fbcmd_update.php  .ICEauthority    .mozilla            Public        Videos
.bash_profile    .digrc   .gconf            index.html       Music               .pulse        .wireshark

4. 用 -lh 选项来以易读方式列出文件

用-lh组合选项,以易读方式来显示大小。

# ls -lh
total 176K
-rw-r--r--. 1 root root  683 Aug 19 09:59 0001.pcap
-rw-------. 1 root root 1.6K Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Documents
drwxr-xr-x. 4 root root 4.0K Aug 16 02:55 Downloads
-rw-r--r--. 1 root root  21K Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root  46K Jul 31 09:58 index.html
-rw-r--r--. 1 root root  48K Jul 31 02:17 install.log
-rw-r--r--. 1 root root  12K Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Music
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Public
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Templates
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Videos

5. 以尾部以‘/’字符结尾的方式列出文件和目录

使用 ls 命令的 -F 选项,会在每个目录的末尾添加“/”字符显示。

# ls -F
0001.pcap        Desktop/    Downloads/        index.html   install.log.syslog  Pictures/  Templates/
anaconda-ks.cfg  Documents/  fbcmd_update.php  install.log  Music/              Public/    Videos/

6. 倒序列出文件

ls -r 选项能以倒序方式显示文件和目录。

# ls -r
Videos     Public    Music               install.log  fbcmd_update.php  Documents  anaconda-ks.cfg
Templates  Pictures  install.log.syslog  index.html   Downloads         Desktop    0001.pcap

7. 递归列出子目录

ls -R 选项能列出非常长的目录树,来看看示例输出:

# ls -R
total 1384
-rw-------. 1 root     root      33408 Aug  8 17:25 anaconda.log
-rw-------. 1 root     root      30508 Aug  8 17:25 anaconda.program.log
./httpd:
total 132
-rw-r--r--  1 root root     0 Aug 19 03:14 access_log
-rw-r--r--. 1 root root 61916 Aug 10 17:55 access_log-20120812
./lighttpd:
total 68
-rw-r--r--  1 lighttpd lighttpd  7858 Aug 21 15:26 access.log
-rw-r--r--. 1 lighttpd lighttpd 37531 Aug 17 18:21 access.log-20120819
./nginx:
total 12
-rw-r--r--. 1 root root    0 Aug 12 03:17 access.log
-rw-r--r--. 1 root root  390 Aug 12 03:17 access.log-20120812.gz

8. 以修改时间倒序列出

带-ltr组合选项能以文件或目录的最新修改时间的次序来显示它们。

# ls -ltr
total 176
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-------. 1 root root  1586 Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Videos
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Documents
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
drwxr-xr-x. 4 root root  4096 Aug 16 02:55 Downloads
-rw-r--r--. 1 root root   683 Aug 19 09:59 0001.pcap

9. 按文件大小排序

带-lS组合选项能按文件从大到小的次序显示。

# ls -lS
total 176
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Documents
drwxr-xr-x. 4 root root  4096 Aug 16 02:55 Downloads
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root  4096 Jul 31 02:48 Videos
-rw-------. 1 root root  1586 Jul 31 02:17 anaconda-ks.cfg
-rw-r--r--. 1 root root   683 Aug 19 09:59 0001.pcap

10. 显示文件或目录的索引节点号

我们有时候可以看到一些数字打印在文件或目录名之前,带-i选项就能列出文件或目录的索引节点号。

# ls -i
20112 0001.pcap        23610 Documents         23793 index.html          23611 Music     23597 Templates
23564 anaconda-ks.cfg  23595 Downloads            22 install.log         23612 Pictures  23613 Videos
23594 Desktop          23585 fbcmd_update.php     35 install.log.syslog  23601 Public

11. 显示ls命令的版本

查看ls命令的版本。

# ls --version
ls (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Richard M. Stallman and David MacKenzie.

12. 显示帮助页面

列出ls命令的选项帮助页面。

# ls --help
Usage: ls [OPTION]... [FILE]...

13. 列出目录信息

用ls -l命令列出/tmp目录下的文件,其中-ld参数可以只显示/tmp目录的信息。

# ls -l /tmp
total 408
drwx------. 2 narad narad   4096 Aug  2 02:00 CRX_75DAF8CB7768
-r--------. 1 root  root  384683 Aug  4 12:28 htop-1.0.1.tar.gz
drwx------. 2 root  root    4096 Aug  4 11:20 keyring-6Mfjnk
drwx------. 2 root  root    4096 Aug 16 01:33 keyring-pioZJr
drwx------. 2 gdm   gdm     4096 Aug 21 11:26 orbit-gdm
drwx------. 2 root  root    4096 Aug 19 08:41 pulse-gl6o4ZdxQVrX
drwx------. 2 narad narad   4096 Aug  4 08:16 pulse-UDH76ExwUVoU
drwx------. 2 gdm   gdm     4096 Aug 21 11:26 pulse-wJtcweUCtvhn
-rw-------. 1 root  root     300 Aug 16 03:34 yum_save_tx-2012-08-16-03-34LJTAa1.yumtx

# ls -ld /tmp/
drwxrwxrwt. 13 root root 4096 Aug 21 12:48 /tmp/

14. 显示文件的UID和GID

用ls -n命令来显示文件和目录的UID(译者注:userid,用户ID)和GID(译者注:groupid,组ID)。

# ls -n
total 36
drwxr-xr-x. 2 500 500 4096 Aug  2 01:52 Downloads
drwxr-xr-x. 2 500 500 4096 Aug  2 01:52 Music
drwxr-xr-x. 2 500 500 4096 Aug  2 01:52 Pictures
-rw-rw-r--. 1 500 500   12 Aug 21 13:06 tmp.txt
drwxr-xr-x. 2 500 500 4096 Aug  2 01:52 Videos

15. ls命令和它的别名

我们给ls命令设置如下别名之后,当我们执行ls命令的时候它会默认执行-l选项并且像上文提到的那样显示长列表。

# alias ls="ls -l"

注意:我们可以通过不加任何参数的alias命令来看到目前系统中可用的所有alias设置,当然它们同时也可以unalias来取消。

# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

删除一项之前定义的alias设置,只需用unalias命令即可。

# unalias ls

下篇文章我们将讨论更多更高级的ls命令以及示例,如果我们在本文有遗漏了任何东西,请通过评论让我们获悉。


via: http://www.tecmint.com/15-basic-ls-command-examples-in-linux/

作者:Ravi Saive 译者:ZTinoZ 校对:wxy

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

来源:https://linux.cn/article-5109-1.html

Linux:在Ubuntu/Fedora/CentOS中安装Gitblit

Git是一款注重速度、数据完整性、分布式支持和非线性工作流的分布式版本控制工具。Git最初由Linus Torvalds在2005年为Linux内核开发而设计,如今已经成为被广泛接受的版本控制系统。

和其他大多数分布式版本控制系统比起来,不像大多数客户端-服务端的系统,每个Git工作目录是一个完整的仓库,带有完整的历史记录和完整的版本跟踪能力,不需要依赖网络或者中心服务器。像Linux内核一样,Git也是在GPLv2许可证下分发的自由软件。

本篇教程我会演示如何安装 gitlit 服务器。gitlit的最新稳定版是1.6.2。Gitblit是一款开源、纯Java开发的用于管理、浏览和提供Git仓库服务的软件。它被设计成一款为希望托管中心仓库的小型工作组服务的工具。

mkdir -p /opt/gitblit; cd /opt/gitblit; wget http://dl.bintray.com/gitblit/releases/gitblit-1.6.2.tar.gz

列出解压后目录内容:

root@vps124229 [/opt/gitblit]# ls
./                      docs/                 gitblit-stop.sh*            LICENSE              service-ubuntu.sh*
../                     ext/                  install-service-centos.sh*  migrate-tickets.sh*
add-indexed-branch.sh*  gitblit-1.6.2.tar.gz  install-service-fedora.sh*  NOTICE
authority.sh*           gitblit.jar           install-service-ubuntu.sh*  reindex-tickets.sh*
data/                   gitblit.sh*           java-proxy-config.sh*       service-centos.sh*

默认配置文件在data/gitblit.properties,你可以根据需要自己修改。

启动gitlit服务:

通过service命令:

root@vps124229 [/opt/gitblit]# cp service-centos.sh /etc/init.d/gitblit
root@vps124229 [/opt/gitblit]# chkconfig --add gitblit
root@vps124229 [/opt/gitblit]# service gitblit  start
Starting gitblit server
.

手动启动:

root@vps124229 [/opt/gitblit]# java -jar gitblit.jar --baseFolder data
2015-01-10 09:16:53 [INFO ] *****************************************************************
2015-01-10 09:16:53 [INFO ]             _____  _  _    _      _  _  _
2015-01-10 09:16:53 [INFO ]            |  __ (_)| |  | |    | |(_)| |
2015-01-10 09:16:53 [INFO ]            | |  / _ | |_ | |__  | | _ | |_
2015-01-10 09:16:53 [INFO ]            | | __ | || __|| '_  | || || __|
2015-01-10 09:16:53 [INFO ]            | |_ | || |_ | |_) || || || |_
2015-01-10 09:16:53 [INFO ]             ____/|_| __||_.__/ |_||_| __|
2015-01-10 09:16:53 [INFO ]                          Gitblit v1.6.2
2015-01-10 09:16:53 [INFO ]
2015-01-10 09:16:53 [INFO ] *****************************************************************
2015-01-10 09:16:53 [INFO ] Running on Linux (3.8.13-xxxx-grs-ipv6-64-vps)
2015-01-10 09:16:53 [INFO ] Logging initialized @842ms
2015-01-10 09:16:54 [INFO ] Using JCE Unlimited Strength Jurisdiction Policy files
2015-01-10 09:16:54 [INFO ] Setting up HTTPS transport on port 8443
2015-01-10 09:16:54 [INFO ]    certificate alias = localhost
2015-01-10 09:16:54 [INFO ]    keyStorePath   = /opt/gitblit/data/serverKeyStore.jks
2015-01-10 09:16:54 [INFO ]    trustStorePath = /opt/gitblit/data/serverTrustStore.jks
2015-01-10 09:16:54 [INFO ]    crlPath        = /opt/gitblit/data/certs/caRevocationList.crl
2015-01-10 09:16:54 [INFO ] Shutdown Monitor listening on port 8081
2015-01-10 09:16:54 [INFO ] jetty-9.2.3.v20140905
2015-01-10 09:16:55 [INFO ] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IRuntimeManager]----
2015-01-10 09:16:55 [INFO ] Basefolder  : /opt/gitblit/data
2015-01-10 09:16:55 [INFO ] Settings    : /opt/gitblit/data/gitblit.properties
2015-01-10 09:16:55 [INFO ] JVM timezone: America/Montreal (EST -0500)
2015-01-10 09:16:55 [INFO ] App timezone: America/Montreal (EST -0500)
2015-01-10 09:16:55 [INFO ] JVM locale  : en_US
2015-01-10 09:16:55 [INFO ] App locale  : 
2015-01-10 09:16:55 [INFO ] PF4J runtime mode is 'deployment'
2015-01-10 09:16:55 [INFO ] Enabled plugins: []
2015-01-10 09:16:55 [INFO ] Disabled plugins: []
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.INotificationManager]----
2015-01-10 09:16:55 [WARN ] Mail service disabled.
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IUserManager]----
2015-01-10 09:16:55 [INFO ] ConfigUserService(/opt/gitblit/data/users.conf)
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IAuthenticationManager]----
2015-01-10 09:16:55 [INFO ] External authentication disabled.
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----    [com.gitblit.transport.ssh.IPublicKeyManager]----
2015-01-10 09:16:55 [INFO ] FileKeyManager (/opt/gitblit/data/ssh)
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IRepositoryManager]----
2015-01-10 09:16:55 [INFO ] Repositories folder : /opt/gitblit/data/git
2015-01-10 09:16:55 [INFO ] Identifying repositories...
2015-01-10 09:16:55 [INFO ] 0 repositories identified with calculated folder sizes in 11 msecs
2015-01-10 09:16:55 [INFO ] Lucene will process indexed branches every 2 minutes.
2015-01-10 09:16:55 [INFO ] Garbage Collector (GC) is disabled.
2015-01-10 09:16:55 [INFO ] Mirror service is disabled.
2015-01-10 09:16:55 [INFO ] Alias UTF-9 & UTF-18 encodings as UTF-8 in JGit
2015-01-10 09:16:55 [INFO ] Preparing 14 day commit cache. please wait...
2015-01-10 09:16:55 [INFO ] 0 repositories identified with calculated folder sizes in 0 msecs
2015-01-10 09:16:55 [INFO ] built 14 day commit cache of 0 commits across 0 repositories in 2 msecs
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IProjectManager]----
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IFederationManager]----
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IGitblit]----
2015-01-10 09:16:55 [INFO ] Starting services manager...
2015-01-10 09:16:55 [INFO ] Federation passphrase is blank! This server can not be PULLED from.
2015-01-10 09:16:55 [INFO ] Fanout PubSub service is disabled.
2015-01-10 09:16:55 [INFO ] Git Daemon is listening on 0.0.0.0:9418
2015-01-10 09:16:55 [INFO ] SSH Daemon (NIO2) is listening on 0.0.0.0:29418
2015-01-10 09:16:55 [WARN ] No ticket service configured.
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] ----[com.gitblit.manager.IPluginManager]----
2015-01-10 09:16:55 [INFO ] No plugins
2015-01-10 09:16:55 [INFO ]
2015-01-10 09:16:55 [INFO ] All managers started.

打开浏览器,依据你的配置进入http://localhost:8080 或者 https://localhost:8443。 输入默认的管理员授权:admin / admin 并点击Login 按钮

Linux:在Ubuntu/Fedora/CentOS中安装Gitblit
Linux:在Ubuntu/Fedora/CentOS中安装Gitblit

添加用户:

Linux:在Ubuntu/Fedora/CentOS中安装Gitblit
Linux:在Ubuntu/Fedora/CentOS中安装Gitblit

添加仓库:

Linux:在Ubuntu/Fedora/CentOS中安装Gitblit
Linux:在Ubuntu/Fedora/CentOS中安装Gitblit

用命令行创建新的仓库:

touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin ssh://admin@142.4.202.70:29418/Programming.git
git push -u origin master

从命令行推送已有的仓库:

git remote add origin ssh://admin@142.4.202.70:29418/Programming.git
git push -u origin master

完成!


via: http://www.unixmen.com/install-gitblit-ubuntu-fedora-centos/

作者:M.el Khamlichi 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-5108-1.html

Linux:OpenDaylight的Helium(氦)版本安装

pt-sdn-ODLHelium install-2014-10-14

OpenDaylight(以下简写为ODL)的Helium(氦)版本已发布,具体详情可参考ODL官网。Helium(氦)版本只发布了一个版本,下载链接地址为http://www.opendaylight.org/software/downloads/helium。官网中分别共享了版本、安装向导、用户向导、开发者向导手册,可进行下载学习。

1 Helium安装

本文介绍的Helium(氦)版本基于Ubuntu12.04进行安装,ODL源文件版本是完全可移植的,但是需要Java7.0以上兼容JVM来运行。如果是用到Oracle的话,JDK 版本在 1.7.0_45以上。

解压已获取的安装包文件,并进入解压目录:

# unzip distribution-karaf-0.2.0-Helium.zip# cd distribution-karaf-0.2.0-Helium/# cd bin# ./karaf

经验证,此时执行./karaf时,会出现线程异常且No route to host错误。解决办法是需要进入上级目录修改文件org.apache.karaf.management.cfg:

# cd ..# cd etc# vi org.apache.karaf.management.cfg #打开此文件

serviceUrl = service:jmx:rmi://0.0.0.0:${rmiServerPort}/jndi/rmi://0.0.0.0:${rmiRegistryPort}/karaf-${karaf.name} 修改成 serviceUrl = service:jmx:rmi://127.0.0.1:${rmiServerPort}/jndi/rmi://127.0.0.1:${rmiRegistryPort}/karaf-${karaf.name},

再次进入ODL启动目录:

# cd bin
# ./karaf  ##执行karaf文件

出现下图界面,表示安装正确:

odl-he-karaf

2 功能组件安装

Helium版本安装相对简单,但它是由很多功能组件组成,例如Web UI组件,需要另外安装才能查看ODL的Web界面。为了使用Web UI界面,必须先安装DLUX web接口,且安装ODL需要使用的基本功能组件,安装DLUX步骤如下:

注意:在OpenDaylight Web界面,使用DLUX可以显示OpenFlow流程序、L2层交换机组件绘制信息,以及有关该网络的拓扑结构、流统计数据、主机的位置等信息。当安装这些组件中的其中一个,其他组件都会自动安装。

安装支持REST API的组件:

opendaylight-user@root>feature:install odl-restconf

安装L2 switch和OpenFlow插件:

opendaylight-user@root>feature:install odl-l2switch-switch
opendaylight-user@root>feature:install odl-openflowplugin-all

opendaylight-user@root>feature:install odl-mdsal-apidocs##此组件写错,很容易无法登录安装基于karaf控制台的md-sal控制器功能,包括nodes、yang UI、Topology:

安装DLUX功能

opendaylight-user@root>feature:install odl-dlux-all

安装基于karaf控制台的ad-sal功能,包括Connection manager、Container、Network、Flows:

opendaylight-user@root>feature:install odl-adsal-northbound

odl-he-install

注意:请按照一定的顺序安装,安装顺序不合理的话, 会导致后面Web界面无法访问!且记录遇到的一个问题:在没有按照顺序安装组件的情况下,无法登录进入ODL主界面。解决方法是通过logout退出 karaf平台,进入上级目录,删除data目录:rm –r data,进入bin目录:cd bin,执行./karaf clean,再次重复上面的安装组件操作。

3 界面访问

顺利安装ODL其他功能组件成功,可以登录ODL的Web UI界面进行访问。用Chrome浏览器访问此版本的网址:http://[ODL_host_ip]:8181/dlux/index.html, [ODL_host_ip]为安装ODL所在的主机IP地址,特别注意的是此版本的ODL访问端口为8181,因8080端口被karaf控制台进程所占用。

登录与之前版本一致,用户名为admin,密码为admin,如下图:

odl-he-login

4 简单实验验证

ODL的Helium(氦)版本已安装成功且已安装基本的OpenFlow功能组件。接下来将通过Mininet模拟网络设备简单地验证ODL的功能,包括拓扑、链路发现、交换机管理等等。

打开装有Mininet的设备,执行命令创建模拟拓扑,并连接ODL,本文实现安装ODL的主机IP地址为192.168.5.111:

sudo mn--controller=remote,ip=192.168.5.111,port=6633

登录后显示ODL氦版本新界面,如下两图分别是Topology界面和Nodes界面:

odl-he-topology odl-he-nodes

5 附录

具体的ODL氦版本功能组件列表如下:

odl-he-table

表中兼容性能力说明:

  • “all”:意味着它可以与任何其它功能一起运行。
  • “self+all”:表示该功能可以与其他使用“all”值的功能一起安装,不能与带有“self+all”值的功能一起安装。

具体feature功能详情可通过feature键查看:

opendaylight-user@root>feature
feature               feature:info           feature:install        feature:list
feature:repo-add      feature:repo-list      feature:repo-refresh   feature:repo-remove
feature:uninstall     feature:version-list

6 总结

在本次研究当中,发现ODL的氦版本较之前1.0版本安装简单且容易理解很多。其中遇到的主要问题是之前可以正常登录进入ODL进行操作,后期再次安装时会时常出现无法登录进入主界面的问题。经过多次试验且各位研究ODL氦版本的大神指导,找到解决问题的办法,学习到很多。

来源:http://www.sdnlab.com/1931.html

Linux:4 个 lvcreate 常用命令举例

4 个 lvcreate 常用命令举例

逻辑卷管理(LVM)是广泛使用的技术,并拥有极其灵活磁盘管理方案。主要包含3个基础命令:

  1. 创建物理卷使用pvcreate
  2. 创建卷组并给卷组增加分区vgcreate
  3. 创建新的逻辑卷使用lvcreate
Linux:4 个 lvcreate 常用命令举例
Linux:4 个 lvcreate 常用命令举例

下列例子主要讲述在已经存在的卷组上使用lvcreate创建逻辑卷。lvcreate命令可以在卷组的可用物理扩展池中分配逻辑扩展。通常,逻辑卷可以随意使用底层逻辑卷上的任意空间。修改逻辑卷将释放或重新分配物理卷的空间。这些例子已经在CentOS 5, CentOS 6, CentOS 7, RHEL 5, RHEl 6 和 RHEL 7 版本中测试通过。

4个lvcreate命令例子

  1. 在名为vg_newlvm的卷组中创建15G大小的逻辑卷:

    [root@centos7 ~]# lvcreate -L 15G vg_newlvm
    
  2. 在名为vgnewlvm的卷组中创建大小为2500MB的逻辑卷,并命名为centos7newvol,这样就创建了块设备/dev/vgnewlvm/centos7newvol:

    [root@centos7 ~]# lvcreate -L 2500 -n centos7_newvol vg_newlvm
    
  3. 可以使用lvcreate命令的参数-l来指定逻辑卷扩展的大小。也可以使用这个参数以卷组的大小百分比来扩展逻辑卷。这下列的命令创建了centos7newvol卷组的50%大小的逻辑卷vgnewlvm:

    [root@centos7 ~]# lvcreate -l 50%VG -n centos7_newvol vg_newlvm
    
  4. 使用卷组剩下的所有空间创建逻辑卷

    [root@centos7 ~]# lvcreate --name centos7newvol -l 100%FREE vgnewlvm

更多帮助,使用lvcreate命令–help选项来查看:

[root@centos7 ~]# lvcreate --help

  lvcreate: Create a logical volume(创建逻辑卷)
lvcreate
        [-A|--autobackup {y|n}](自动备份)
        [-a|--activate [a|e|l]{y|n}]
        [--addtag Tag](增加标签)
        [--alloc AllocationPolicy](分配策略)
        [--cachemode CacheMode](Cache模式)
        [-C|--contiguous {y|n}]
        [-d|--debug]
        [-h|-?|--help]
        [--ignoremonitoring](忽略监控)
        [--monitor {y|n}](监控)
        [-i|--stripes Stripes [-I|--stripesize StripeSize]]
        [-k|--setactivationskip {y|n}]
        [-K|--ignoreactivationskip]
        {-l|--extents LogicalExtentsNumber[%{VG|PVS|FREE}] |(逻辑扩展数)
         -L|--size LogicalVolumeSize[bBsSkKmMgGtTpPeE]}(逻辑卷大小)
        [-M|--persistent {y|n}] [--major major] [--minor minor]
        [-m|--mirrors Mirrors [--nosync] [{--mirrorlog {disk|core|mirrored}|--corelog}]](镜像)
        [-n|--name LogicalVolumeName](逻辑卷名字)
        [--noudevsync]
        [-p|--permission {r|rw}]
        [--[raid]minrecoveryrate Rate]
        [--[raid]maxrecoveryrate Rate]
        [-r|--readahead ReadAheadSectors|auto|none](读取头扇区)
        [-R|--regionsize MirrorLogRegionSize](镜像逻辑区域尺寸)
        [-T|--thin  [-c|--chunksize  ChunkSize](块大小)
          [--discards {ignore|nopassdown|passdown}]
          [--poolmetadatasize MetadataSize[bBsSkKmMgG]]]
          [--poolmetadataspare {y|n}]
        [--thinpool ThinPoolLogicalVolume{Name|Path}] (精简池逻辑卷)
        [-t|--test]
        [--type VolumeType](卷类型)
        [-v|--verbose]
        [-W|--wipesignatures {y|n}]
        [-Z|--zero {y|n}]
        [--version]
        VolumeGroupName [PhysicalVolumePath...]

via: http://www.ehowstuff.com/4-lvcreate-command-examples-on-linux/

作者:skytech 译者:Vic020 校对:wxy

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

来源:https://linux.cn/article-5117-1.html

Linux:权威指南:构建个人私有云,拿回你的数据隐私的控制权!

这篇鸿篇巨制(多达上万字)不但剖析了在你被那些“免费”的服务供养的背后所损失的隐私。事实上,Google、百度、360们比你更了解你自己;而且提出了具体的解决方案,对于稍有技术基础的人来,完整地指导了如何搭建私有云,提供全功能、商业级的邮件服务和云服务。

此外,文章中的邮件系统部分相当完善,而且,文章的思路清晰,简明扼要。其中包括基础的 SMTP/IMAP 服务自不必提,反垃圾邮件服务、灰名单、SPF、DKIM、Webmail,应有尽有,可以作为搭建产品环境中的邮件系统参考。

8年里40000多次搜索!这是我的Google搜索历史。你的呢?(可以在这里自己找一下)有经过这么长时间积累下来的这么多数据点,Google已经能非常精确的推测你对什么感兴趣、曾经的想法、担忧过的事情,以及从你第一次获得Google帐号后这些年里所有这些的变化!

很多非常私人的信息不受自己控制地存储在世界范围内的服务器上

比如说你也像我一样从2006年到2013年都是Gmail用户,意味着你收到了30000封以上的电子邮件,以及在这7年里写了差不多5000封电子邮件。这些发送或收到的电子邮件里有很多是非常私人的,私人到你甚至不希望自己的家人或好友可以系统地查看。也许你还写过一些草稿邮件,因为最后一分钟改变主意而从没发出去。但是尽管你从未发出去,这些邮件仍然保存在服务器上的某个地方。结论是,说Google服务器比你最亲密的朋友或家人都更了解你的个人生活一点也不过分。

从统计数据来看,我可以很保险地打赌你拥有一部智能手机。如果不使用联系人应用的话手机将基本没法用,而它默认会将你的联系人信息保存到Google服务器上的Google联系人里。所以,现在Google不仅知道了你的电子邮件,还有了你的离线联系人:你喜欢打给谁、谁来过电话、你发过短信给谁,以及发了些什么。你也不需要听我的片面之词,可以自己检查一下,看看你开放给类似Google Play服务的一些应用的权限,用来读取来电信息以及收到的短信。你是否还会用到手机里自带的日历应用?除非你在设置日程的时候明确地去掉同步,那么Google将精确地知道你将要做什么,一天里的每个时段、每一天、每一年。用iPhone代替Android手机也是一样的,只是Apple会代替Google来掌握你的往来邮件、联系人和日程计划。

你是否还会非常小心地同步自己的联系人信息,在你朋友,同事或家人换工作或换服务商的时候更新他们的电子邮件地址和手机号?这给Google提供了一副你的社交网络的非常精确的、最新的描绘。还有你非常喜欢手机的GPS功能,经常配合Google地图使用。这意味着Google不仅能从日程里知道你在干什么,还知道你在哪儿、住在哪儿、在哪儿工作。然后再关联用户之间的GPS位置信息,Google还能知道你现在可能正在和哪些人来往。

这种泄漏自己私人信息的日常爱好会以一种甚至没人能够预测的方式影响你的生活

总结一下,如果你是一个普通的因特网用户,Google拥有过去差不多10年里你最新的、深度的信息,关于你的兴趣、忧虑、热情、疑问。它还收集了一些你很私人的信息(电子邮件、短信),精确到小时的你的日常活动和位置,一副你社交网络的高精度的描绘。关于你的如此私密的数据,很可能已经超越了你最亲密的朋友,家人或爱人对你的了解。

不敢想象把这些深度的个人信息交给完全陌生的人,就好像把这些信息拷到一个U盘里,然后随便放到某个咖啡厅的桌上,留张纸条说“Olivier Martin的个人数据,请随便”。谁知道什么人会拿到它以及用来干嘛?然而,我们毫不犹豫地把自己的主要信息交给那些对我们的数据很感兴趣的IT公司的陌生人(这是他们制造面包的材料)以及世界级的数据分析专家手里,也许只是因为我们在点击那个绿色的’接受’按钮时根本没有想这么多。

有这么多的高质量信息,这么多年里,Google可能会比你希望自我了解的更了解你自己:尼玛,回想我过去的数字生活,5年前发出的邮件里有一半我已经不记得了。我很高兴能重新发现早在2005年对xxx主义的兴趣以及第二年加入了ATTAC(一个致力于通过征收金融交易税来限制投机和改善社会公平的组织)。天知道为什么我竟然在2007年这么喜欢跳舞。这些都是无关紧要的信息(你不指望我能爆出什么猛料,是吧?;-)。但是,连接起这些高质量数据点,关于你生活的方方面面(做什么、什么时候、和谁一起、在哪里,…),并跨越这么长时间间隔,应该能推测出你的未来状态。比如说,根据一个17岁女孩的购物习惯,超市甚至可以在他父亲听说之前断定这个女孩怀孕了(这是一个真实的故事)。谁知道通过像Google所掌握的这些远远超出购物习惯的高质量数据能做些什么?连接起这些点,也许有人能预测你未来几年里口味或观点的变化。如今,你从未听过的公司声称拥有你500项数据点,包括宗教信仰、性取向和政治观点。提到政治,如果说你决定今后10年内进入政坛会怎么样?你的生活会改变,你的观点也一样,甚至你有时候会有所遗忘,但是Google不会。那你会不会担心你的对手会接触一些可以从Google访问你数据的人并会从你过去这些年里积累的个人数据深渊里挖出一些猛料呢?就像最近Sony被黑一样,多久以后会轮到Google或Facebook,以致让你的个人信息最终永远暴露?

我们大多数人把自己的个人数据托付给这些公司的一个原因就是它们提供免费服务。但是真的免费吗?一般的Google帐号的价值根据评估方式不同会有些差别:你花在写邮件上的时间占到1000美元/年,你的帐号对于广告产业的价值差不多在220美元/年500美元/年之间。所以这些服务并不是真的免费:会通过广告和我们的数据在未来的一些未知使用来间接付费。

我写的最多的是Google,这是因为这是我托付个人数字信息的,以及目前我所知道做的最好的公司。但是我也提到过Apple或Facebook。这些公司通过它们在设计、工程和我们(曾经)喜欢每天使用的服务方面的神奇进步实实在在地改变了世界。但是这并不是说我们应该把所有我们最私人的个人数据堆积到它们的服务器上并把我们的数字生活托付给它们:潜在的危害实在太大了。

只要5小时,拿回自己以及关心的人的隐私权

Linux:权威指南:构建个人私有云,拿回你的数据隐私的控制权!
Linux:权威指南:构建个人私有云,拿回你的数据隐私的控制权!

(题图来自 ttgtmedia.com)

但是事实并不是一定必须这样的。你可以生活在21世纪,拿着智能手机,每天都用电子邮件和GPS,却仍然可以保留自己的隐私。你所需要的就是拿回自己个人数据的控制权:邮件、日程、联系人、文件,等等。Prism-Break.org网站上列出了一些能帮你掌握个人数据命运的软件。除此以外,控制自己个人数据的最安全和最有效的方式是架设自己的服务器并搭建自己的云。不过你也许只是没有时间或精力去研究具体该怎么做以及如何让它能流畅工作。

这也是这篇文章的意义所在。仅仅5个小时内,我们将配置出一台服务器来支撑你的邮件、联系人、日程表和各种文件,为你、你的朋友和你的家人。这个服务器将设计成一个个人数据中心或云,所以你能时刻保留它的完整控制。数据将自动在你的台式机/笔记本、手机和平板之间同步。从根本上来说,我们将建立一个系统来代替Gmail、Google文件/Dropbox、Google联系人、Google日历和Picasa

为自己做这件事情已经是迈出很大一步了。但是,你个人信息的很大一部分将仍然泄漏出去并保存到硅谷的一些主机上,只是因为和你日常来往的太多人在用Gmail和使用智能手机,所以最好是带上你一些比较亲近的人加入这次探险。

我们将构建的系统能够:

  • 支持任意数目的域名和用户。这样就能轻易地和你的家人朋友共享这台服务器,所以他们也能掌控自己的个人数据,并且还能和你一起分摊服务费用。和你一起共享服务器的人可以使用他们自己的域名或者共享你的。
  • 允许你从任意网络发送和接收电子邮件,需要成功登录服务器之后。这样,你可以通过任意的邮件地址、任意设备(台式机、手机、平板)、任意网络(家里、公司、公共网络、…)来发送电子邮件。
  • 在发送和接收邮件的时候加密网络数据,这样,你不信任的人不能钓出你的密码,也不能看到你的私人邮件。
  • 提供最先进的反垃圾邮件技术,结合了已知垃圾邮件黑名单、自动灰名单、和自适应垃圾邮件过滤。如果邮件被误判了只需要简单地把它拖入或拖出垃圾目录就可以重新调校垃圾邮件过滤器。而且,服务器还会为基于社区的反垃圾邮件努力做出贡献。
  • 一段时间里只需要几分钟的维护,基本上只是安装安全更新和简单地检查一下服务器日志。添加一个新的邮件地址只需要在数据库中插入一条记录。除此之外,你可以忘记它的存在过自己的生活。我在14个月之前搭建了本文描述的这个系统,从那以后就一直顺利运行。所以我完全把它给忘了,直到我最近觉得随便按下手机上的‘检查邮件’会导致电子信号一路跑到冰岛(我放置服务器的地方)再回来的想法有点好笑才想起来。

要完成这篇文章里的工作,你需要一点基本的技术能力。如果你知道SMTP和IMAP的区别,什么是DNS,以及对TCP/IP有基本了解的话,就够了。你还将需要一点基本的Unix知识(在命令行下和文件一起工作,基本的系统管理)。然后你需要花总共5小时时间来搭建。

下面是我们将要做的事情的概述。

  • 申请一个虚拟私人服务器,一个域名,并把它们配置好
  • 设置postfix和dovecot来收发电子邮件
  • 阻止垃圾邮件进入你的收件箱
  • 确保你发出的邮件能通过垃圾邮件过滤器
  • 使用Owncloud提供日历,联系人,文件服务并配置webmail
  • 在云上同步你的设备

来源:https://linux.cn/article-5125-1.html

Linux:性能优化:使用ramlog将日志文件转移到内存中

Ramlog 以系统守护进程的形式运行。在系统启动时它创建虚拟磁盘(ramdisk),将 /var/log 下的文件复制到虚拟磁盘中,同时把虚拟磁盘挂载为/var/log。然后所有的日志就会更新到虚拟磁盘上。而当 ramlog 重启或停止时,需要记录到硬盘上的日志就会保留在目录/var/log.hdd中。而关机的时候,(ramdisk上的)日志文件会重新保存到硬盘上,以确保日志一致性。Ramlog 2.x默认使用tmpfs文件系统,同时也可以支持ramfs和内核ramdisk。使用rsync(译注:Linux数据镜像备份工具)这个工具来同步日志。

注意:如果突然断电或者内核崩溃(kernel panic)时,没有保存进硬盘的日志将会丢失。

如果你拥有够多的可用内存,而又想把日志放进虚拟磁盘,就安装ramlog吧。它是笔记本用户、带有UPS的系统或是直接在flash中运行的系统的优良选择,可以节省日志的写入时间。

Linux:性能优化:使用ramlog将日志文件转移到内存中
Linux:性能优化:使用ramlog将日志文件转移到内存中

Ramlog的运行机制以及步骤如下:

  1. Ramlog 由第一个守护进程(这取决于你所安装过的其它守护进程)启动。

  2. 然后创建目录/var/log.hdd并将其硬链至/var/log。

  3. 如果使用的是tmpfs(默认)或者ramfs 文件系统,将其挂载到/var/log上。

  4. 而如果使用的是内核ramdisk,ramdisk会在/dev/ram9中创建,并将其挂载至/var/log。默认情况下ramlog会占用所有ramdisk的内存,其大小由内核参数”ramdisk_size”指定。

  5. 接着其它的守护进程被启动,并在ramdisk中更新日志。Logrotate(译注:Linux日志轮替工具)和 ramdisk 配合的也很好。

  6. 重启(默认一天一次)ramlog时,目录/var/log.hdd将借助rsync与/var/log保持同步。日志自动保存的频率可以通过cron(译注:Linux例行性工作调度)来控制。默认情况下,ramlog 的调度任务放置在目录/etc/cron.daily下。

  7. 系统关机时,ramlog在最后一个守护进程关闭之前关闭。

  8. 在ramlog关闭期间,/var/log.hdd中的文件将被同步至/var/log,接着/var/log和/var/log.hdd都被卸载,然后删除空目录/var/log.hdd。

注意:- 此文仅面向高级用户

在Ubuntu中安装Ramlog

首先需要用以下命令,从这里下载.deb安装包:

wget http://www.tremende.com/ramlog/download/ramlog_2.0.0_all.deb

下载ramlog_2.0.0_all.deb安装包完毕,使用以下命令进行安装:

sudo dpkg -i ramlog_2.0.0_all.deb

这一步会完成整个安装,现在你需要运行以下命令:

sudo update-rc.d ramlog start 2 2 3 4 5 . stop 99 0 1 6 .

现在,在更新sysklogd的初始化顺序,使之能在ramlog停止运行前正确关闭:

sudo update-rc.d -f sysklogd remove
sudo update-rc.d sysklogd start 10 2 3 4 5 . stop 90 0 1 6 .

然后重启系统:

sudo reboot

系统重启完毕,运行’ramlog getlogsize’来获取你当前的/var/log的空间大小。在此基础之上多分配40%的空间,确保ramdisk有足够的空间(这整个都将作为ramdisk的空间大小)。

编辑引导配置文件,如/etc/grub.conf,、/boot/grub/menu.lst 或/etc/lilo.conf(译注:具体哪个配置文件视不同引导加载程序而定),给你的当前内核的新增选项 ‘ramdisk_size=xxx’ ,其中xxx是ramdisk的空间大小。

配置Ramlog

基于deb的系统中,Ramlog的配置文件位于/etc/default/ramlog,你可以在该配置文件中设置以下变量:

RAMDISKTYPE=0
# 取值:
# 0 -- tmpfs (可被交换到交换分区) -- 默认
# 1 -- ramfs (旧内核不能设置最大空间大小,
# 不能被交换到交换分区,和 SELinux 不兼容)
# 2 -- 老式的内核 ramdisk
TMPFS_RAMFS_SIZE=
# 可以用于 tmpfs 或 ramfs 的最大内存大小
# 这个值可以是百分比或数值(单位是 Mb),例如:
# TMPFS_RAMFS_SIZE=40%
# TMPFS_RAMFS_SIZE=100m
# 该值为空表示 tmpfs/ramfs 的大小是全部内存的 50%
# 更多选项可以参考 ‘man mount' 中的‘Mount options for tmpfs' 一节
# (补充,在较新的内核中,ramfs  支持大小限制,
# 虽然 man 中说没有这个挂载选项)
# 该选项仅用于 RAMDISKTYPE=0 或 1 时
KERNEL_RAMDISK_SIZE=MAX
#以 kb 为单位指定的内核 ramdisk 大小,或者使用 MAX 来使用整个 ramdisk。
#该选项仅用于 RAMDISKTYPE=2 时
LOGGING=1
# 0=关闭, 1=打开 。记录自身的日志到 /var/log/ramdisk
LOGNAME=ramlog
# 自身的日志文件名 (用于 LOGGING=1时)
VERBOSE=1
# 0=关闭, 1=打开 (设置为 1时,启动或停止失败时会调用 teststartstop 将细节
# 写到日志中)

在Ubuntu中卸载ramlog

打开终端运行以下命令:

sudo dpkg -P ramlog

注意:如果ramlog卸载之前仍在运行,需要重启系统完成整个卸载工作。


via: http://www.ubuntugeek.com/improve-system-performance-by-moving-your-log-files-to-ram-using-ramlog.html

作者:ruchi 译者:soooogreen 校对:wxy

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

来源:https://linux.cn/article-5118-1.html

Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件
Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

智能手机都拥有一些平滑地融入手机外观的天气小插件,现在幸亏有了 Flair Weather Conky,你便可以在你的 Linux 桌面中拥有像智能手机一样的天气外观。我们将使用一个 GUI 工具Conky Manager 在 Linux 中轻松地管理 Conky。那就先让我们看看如何在 Ubuntu 14.10,14.04、Linux Mint 17 及其他 Linux 发行版本中安装 Conky Manager 吧。

安装 Conky Manager

打开一个终端并使用下面的命令:

sudo add-apt-repository ppa:teejee2008/ppa
sudo apt-get update
sudo apt-get install conky-manager

你可以阅读这篇关于如何在 Linux 中使用 Conky Manager 的文章。

确保 curl已被安装

请确保 curl 已被安装。如果没有安装它,可以使用下面的命令来安装:

sudo apt-get install curl

下载 Flair Weather Conky

从下面的链接下载 Flair Weather Conky 的脚本:

在 Conky Manager 中使用 Flair Weather Conky 脚本

步骤 1:

同你在 Ubuntu 14.04 中安装主题一样,在你的家目录中应该有一个 .conky目录。假如你使用命令行,我想我不需要告诉你如何找到这个目录。对于新手,请用文件管理器切换到你的家目录下,并按 Ctrl+H在 Ubuntu 中显示隐藏文件。在这里查找 .conky文件夹,假如没有这个文件夹,则创建一个。

步骤 2:

.conky目录中,解压下载到的 Flair Weather 文件。请注意在默认情况下它会自动解压到一个名为 .conky目录下。所以请进入这个目录,将其中的 Flair Weather 文件夹从中取出,然后将它粘贴到真正的 .conky目录下。

步骤 3:

Flair Weather 使用 Yahoo 的天气服务,但它不能自动地识别你的位置。你需要手动地编辑它。到Yahoo 天气 网页,然后通过键入你的城市/Pin 码来得到你所在城市的位置 ID号。你可以从网页地址栏中取得位置 ID 号。

Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件
Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

步骤 4:

打开 Conky Manager,它应该能够读取新安装的 Conky 脚本。这里有两款样式可用,黑色主题或亮丽主题。你可以选择你偏爱的那一款。当你选择后,你就可以在桌面上看到 conky 的显示了。

在 Flair Weather 中,默认位置被设定为 Melbourne。你必须手动编辑 conky 文件来修改。

Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件
Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

步骤 5:

在上面的截图中,你可以看到有一个编辑选定 conky 脚本的选项,在打开的编辑器中,查找 location 或 WOEID ,更换它为你在 步骤 3中得到的位置 ID 号。然后重启 Conky。

Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件
Linux:如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

在上面查找的相同位置,假如你将u=c替换为u=f,则温度的单位将从摄氏温标改为华氏温标 。不要忘了重启 Conky 来查看已经做出的修改。

可能的故障排除

在 Ubuntu 14.04 和 Ubuntu 14.10 中,假如你发现 Conky 展示的时间有重叠现象,则请编辑 conky 脚本。查找下面的这些行:

## cairo-compmgr
own_window_type override
own_window_argb_visual no

然后将内容更换为下面的这些行:

## cairo-compmgr
own_window_type dock
own_window_argb_visual no

保存更改并重启 conky。这就应该解决了这个问题。感谢 Jesse(这个 Conky 脚本的开发者)给我们提供了这个解决方法和为其他相关问题给予的支持。

尝试一下

在这篇文章中,我们实际上学到了不少东西。我们见证了如何轻松地使用任何 Conky 脚本,如何编辑脚本以及如何使用 Conky Manager 来达到不同的目的。我希望这些对你有用。

需要留心的是,Ubuntu 14.10 用户可能会看到重叠的时间数字。请在开发者 Jesse 绝妙的Google + 主页 中报告任何相关的问题。

我已经向你展示了在我的系统上 Flair Weather conky 外观的截图。现在是该你尝试它并炫耀你的桌面的时间了。


via: http://itsfoss.com/weather-conky-linux/

作者:Abhishek 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-5122-1.html