Gabriel Cánepa 发布的文章

几个月前, Linux 基金会发起了 LFCS ( Linux 基金会认证系统管理员 Linux Foundation Certified System administrator )认证,以帮助世界各地的人来验证他们能够在 Linux 系统上做基本的中级系统管理任务:如系统支持、第一手的故障诊断和处理、以及何时向上游支持团队提出问题的智能决策。

Learning VI Editor in Linux

在 Linux 中学习 vi 编辑器

请简要看看一下视频,里边介绍了 Linux 基金会认证的程序。

这篇文章是系列教程的第二讲,在这个部分中,我们会介绍 vi/vim 基本的文件编辑操作,帮助读者理解编辑器中的三个模式,这是 LFCS 认证考试中必须掌握的。

使用 vi/vim 执行基本的文件编辑操作

vi 是为 Unix 而生的第一个全屏文本编辑器。它的设计小巧简单,对于仅仅使用过诸如 NotePad++ 或 gedit 等图形界面的文本编辑器的用户来说,使用起来可能存在一些困难。

为了使用 vi,我们必须首先理解这个强大的程序操作中的三种模式,方便我们后边学习这个强大的文本处理软件的相关操作。

请注意,大多数的现代 Linux 发行版都集成了 vi 的变种——— vim( 改进版 VI Vi IMproved ),相比于 vi,它有更多新功能。所以,我们会在本教程中交替使用 vi 和 vim。

如果你的发行版还没有安装 vim,你可以通过以下方法来安装:

  • Ubuntu 及其衍生版:apt-get update && apt-get install vim
  • 以 Red-Hat 为基础的发行版:yum update && yum install vim
  • openSUSE :zypper update && zypper install vim

我为什么要学习 vi

至少有以下两个理由:

  1. 因为它是 POSIX 标准的一部分,所以不管你使用什么发行版 vi 总是可用的。
  2. vi 基本不消耗多少系统资源,并且允许我们仅仅通过键盘来完成任何可能的任务。

此外,vi 有着非常丰富的内置帮助手册,程序打开后就可以通过 :help 命令来查看。这个内置帮助手册比 vi/vim 的 man 页面包含了更多信息。

vi Man Pages

vi Man 页面

启动 vi

可以通过在命令提示符下输入 vi 来启动。

Start vi Editor

使用 vi 编辑器

然后按下字母 i,你就可以开始输入了。或者通过下面的方法来启动 vi:

# vi filename

这样会打开一个名为 filename 的 缓存区 buffer (稍后会详细介绍缓存区),在你编辑完成之后就可以存储在磁盘中了。

理解 vi 的三个模式

  1. 命令 command 模式中,vi 允许用户浏览该文件并输入由一个或多个字母组成的、简短的、大小写敏感的 vi 命令。这些命令的大部分都可以增加一个前缀数字表示执行次数。
    比如:yy(或Y) 复制当前的整行,3yy(或3Y) 复制当前整行和下边紧接着的两行(总共3行)。通过 Esc 键可以随时进入命令模式(而不管当前工作在什么模式下)。事实上,在命令模式下,键盘上所有的输入都被解释为命令而非文本,这往往使得初学者困惑不已。
  2. 末行 ex 模式中,我们可以处理文件(包括保存当前文件和运行外部程序)。我们必须在命令模式下输入一个冒号(:),才能进入这个模式,紧接着是要在末行模式下使用的命令。执行之后 vi 自动回到命令模式。
  3. 文本输入 insert 模式(通常在命令模式下使用字母 i 进入这个模式)中,我们可以随意输入文本。大多数的键入将以文本形式输出到屏幕(一个重要的例外是Esc键,它将退出文本编辑模式并回到命令模式)。

vi Insert Mode

vi 文本插入模式

vi 命令

下面的表格列出常用的 vi 命令。文件编辑的命令可以通过添加叹号的命令强制执行(如,:q! 命令强制退出编辑器而不保存文件)。

关键命令描述
h 或 ←光标左移一个字符
j 或 ↓光标下移一行
k 或 ↑光标上移一行
l (小写字母 L) 或 →光标右移一个字符
H光标移至屏幕顶行
L光标移至屏幕末行
G光标移至文件末行
w光标右移一个词
b光标左移一个词
0 (数字零)光标移至行首
^光标移至当前行第一个非空格字符
$光标移至当前行行尾
Ctrl-B向后翻页
Ctrl-F向前翻页
i在光标所在位置插入文本
I (大写字母 i)在当前行首插入文本
J (大写字母 j)将下一行与当前行合并(下一行上移到当前行)
a在光标所在位置后追加文本
o (小写字母 O)在当前行下边插入空白行
O (大写字母 O)在当前行上边插入空白行
r替换光标所在位置的一个字符
R从光标所在位置开始覆盖插入文本
x删除光标所在位置的字符
X立即删除光标所在位置之前(左边)的一个字符
dd剪切当前整行文本(为了之后进行粘贴)
D剪切光标所在位置到行末的文本(该命令等效于 d$
yX给出一个移动命令 X (如 hjHL 等),复制适当数量的字符、单词或者从光标开始到一定数量的行
yyY复制当前整行
p粘贴在光标所在位置之后(下一行)
P粘贴在光标所在位置之前(上一行)
. (句点)重复最后一个命令
u撤销最后一个命令
U撤销最后一行的最后一个命令,只有光标仍在最后一行才能执行。
n在查找中跳到下一个匹配项
N在查找中跳到前一个匹配项
:n下一个文件,编辑多个指定文件时,该命令加载下一个文件。
:e file加载新文件来替代当前文件
:r file将新文件的内容插入到光标所在位置的下一行
:q退出并放弃更改
:w file将当期打开的缓存区保存为file。如果是追加到已存在的文件中,则使用 :w >> file 命令
:wq保存当前文件的内容并退出。等效于 x!ZZ
:r! command执行 command 命令,并将命令的输出插入到光标所在位置的下一行

vi 选项

下列选项可以让你在运行 Vim 的时候很方便(需要写入到 ~/.vimrc 文件):

# echo set number >> ~/.vimrc
# echo syntax on >> ~/.vimrc
# echo set tabstop=4 >> ~/.vimrc
# echo set autoindent >> ~/.vimrc

vi Editor Options

vi编辑器选项

  • set number 当 vi 打开或新建文件时,显示行号。
  • syntax on 打开语法高亮(对应多个文件扩展名),以便源码文件和配置文件更具可读性。
  • set tabstop=4 设置制表符间距为 4 个空格(默认为 8)。
  • set autoindent 将前一行的缩进应用于下一行。

查找和替换

vi 具有通过查找将光标移动到(在单独一行或者整个文件中的)指定位置。它还可自动或者通过用户确认来执行文本替换。

a) 在行内查找。f 命令在当前行查找指定字符,并将光标移动到指定字符出现的位置。

例如,命令 fh 会在本行中将光标移动到字母h下一次出现的位置。注意,字母 f 和你要查找的字符都不会出现在屏幕上,但是当你按下回车的时候,要查找的字符会被高亮显示。

比如,以下是在命令模式按下 f4 之后的结果。

Search String in Vi

在 vi 中查找字符

b) 在整个文件内查找。使用 / 命令,紧接着需要查找的单词或短语。这个查找可以通过使用 n 命令或者 N 重复查找上一个查找的字符串。以下是在命令模式键入 /Jane 的查找结果。

Vi Search String in File

在 vi 中查找字符

c) vi 通过使用命令来完成多行或者整个文件的替换操作(类似于 sed)。我们可以使用以下命令,使得整个文件中的单词 “old” 替换为 “young”。

:%s/old/young/g

注意:冒号位于命令的最前面。

Vi Search and Replace

vi 的查找和替换

冒号 (:) 进入末行模式,在本例中 s 表示替换,% 是从第一行到最后一行的表示方式(也可以使用 nm 表示范围,即第 n 行到第 m 行),old 是查找模式,young 是用来替换的文本,g 表示在每个查找出来的字符串都进行替换。

另外,在命令最后增加一个 c,可以在每一个匹配项替换前进行确认。

:%s/old/young/gc

将旧文本替换为新文本前,vi/vim 会向我们显示以下信息:

Replace String in Vi

vi 中替换字符串

  • y: 执行替换(yes)
  • n: 跳过这个匹配字符的替换并转到下一个(no)
  • a: 在当前匹配字符及后边的相同项全部执行替换
  • qEsc: 取消替换
  • l (小写 L): 执行本次替换并退出
  • Ctrl-e, Ctrl-y: 下翻页,上翻页,查看相应的文本来进行替换

同时编辑多个文件

我们在命令提示符输入 vim file1 file2 file3 如下:

# vim file1 file2 file3

vim 会首先打开 file1,要跳到 file2 需用 :n 命令。当需要打开前一个文件时,:N 就可以了。

为了从 file1 跳到 file3

a) :buffers 命令会显示当前正在编辑的文件列表

:buffers

Edit Multiple Files

编辑多个文件

b) :buffer 3 命令(后边没有 s)会打开第三个文件 file3 进行编辑。

在上边的图片中,标记符号 # 表示该文件当前已被打开,但是是在后台,而 %a 标记的文件是正在被编辑的。另外,文件号(如上边例子的 3)后边的空格表示该文件还没有被打开。

vi 的临时缓存区

(LCTT 译注:临时缓存区,也叫做“命名缓存区”,或“ 寄存器 register ”)

为了复制连续的多行(比如,假设为 4 行)到一个名为 a 的临时缓存区(与文件无关),并且还要将这些行粘贴到在当前 vi 会话文件中的其它位置,我们需要:

  1. 按下 Esc 键以确认 vi 处在命令模式
  2. 将光标放在我们希望复制的第一行文本
  3. 输入 "a4yy 复制当前行和接下来的 3 行,进入一个名为 a 的缓存区。我们可以继续编辑我们的文件————我们不需要立即插入刚刚复制的行。
  4. 当到了需要使用刚刚复制的那些行的位置,在 p(小写)或 P(大写)命令前使用"a来将复制行插入到名为 a 的 缓存区:
* 输入 `"ap`,复制行将插入到光标位置所在行的下一行。
* 输入 `"aP`,复制行将插入到光标位置所在行的上一行。

如果愿意,我们可以重复上述步骤,将缓存区 a 中的内容插入到我们文件的多个位置。像本节中这样的一个临时缓存区,会在当前窗口关闭时释放掉。

总结

像我们看到的一样,vi/vim 在命令接口下是一个强大而灵活的文本编辑器。通过以下链接,随时分享你自己的技巧和评论。

参考链接


via: http://www.tecmint.com/vi-editor-usage/

作者:Gabriel Cánepa 译者:GHLandy 校对:东风唯笑, wxy

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

Linux 基金会宣布了一个全新的 LFCS( Linux 基金会认证系统管理员 Linux Foundation Certified Sysadmin )认证计划。这一计划旨在帮助遍布全世界的人们获得其在处理 Linux 系统管理任务上能力的认证。这些能力包括支持运行的系统服务,以及第一手的故障诊断、分析,以及为工程师团队在升级时提供明智的决策。

Linux Foundation Certified Sysadmin

Linux 基金会认证系统管理员——第一讲

请观看下面关于 Linux 基金会认证计划的演示:

该系列将命名为《LFCS 系列第一讲》至《LFCS 系列第十讲》并覆盖关于 Ubuntu、CentOS 以及 openSUSE 的下列话题。

  • 第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件
  • 第二讲:如何安装和使用 vi/m 全功能文字编辑器
  • 第三讲:归档文件/目录并在文件系统中寻找文件
  • 第四讲:为存储设备分区,格式化文件系统和配置交换分区
  • 第五讲:在 Linux 中挂载/卸载本地和网络(Samba & NFS)文件系统
  • 第六讲:组合分区作为 RAID 设备——创建&管理系统备份
  • 第七讲:管理系统启动进程和服务(使用 SysVinit, Systemd 和 Upstart)
  • 第八讲:管理用户和组,文件权限和属性以及启用账户的 sudo 权限
  • 第九讲:用 Yum,RPM,Apt,Dpkg,Aptitude,Zypper 进行 Linux 软件包管理
  • 第十讲:学习简单的 Shell 脚本编程和文件系统故障排除
重要提示:由于自 2016/2 开始 LFCS 认证要求有所变化,我们增加发布了下列必需的内容。要准备这个考试,推荐你也看看我们的 LFCE 系列。
  • 第十一讲:怎样使用 vgcreate、lvcreate 和 lvextend 命令创建和管理 LVM
  • 第十二讲:怎样安装帮助文档和工具来探索 Linux
  • 第十三讲:怎样配置和排错 GRUB

本文是覆盖这个参加 LFCS 认证考试的所必需的范围和技能的十三个教程的第一讲。话说了那么多,快打开你的终端,让我们开始吧!

处理 Linux 中的文本流

Linux 将程序中的输入和输出当成字符流或者字符序列。在开始理解重定向和管道之前,我们必须先了解三种最重要的I/O( 输入和输出 Input and Output )流,事实上,它们都是特殊的文件(根据 UNIX 和 Linux 中的约定,数据流和外围设备(设备文件)也被视为普通文件)。

在 > (重定向操作符) 和 | (管道操作符)之间的区别是:前者将命令与文件相连接,而后者将命令的输出和另一个命令相连接。

# command > file
# command1 | command2

由于重定向操作符会静默地创建或覆盖文件,我们必须特别小心谨慎地使用它,并且永远不要把它和管道混淆起来。在 Linux 和 UNIX 系统上管道的优势是:第一个命令的输出不会写入一个文件而是直接被第二个命令读取。

在下面的操作练习中,我们将会使用这首诗——《A happy child》(作者未知)

cat command

cat 命令样例

使用 sed

sed 是 流编辑器 stream editor 的缩写。为那些不懂术语的人额外解释一下,流编辑器是用来在一个输入流(文件或者管道中的输入)执行基本的文本转换的工具。

sed 最基本的用法是字符替换。我们将通过把每个出现的小写 y 改写为大写 Y 并且将输出重定向到 ahappychild2.txt 开始。g 标志表示 sed 应该替换文件每一行中所有应当替换的实例。如果这个标志省略了,sed 将会只替换每一行中第一次出现的实例。

基本语法:

# sed 's/term/replacement/flag' file

我们的样例:

# sed 's/y/Y/g' ahappychild.txt > ahappychild2.txt

sed command

sed 命令样例

如果你要在替换文本中搜索或者替换特殊字符(如 /,\,&),你需要使用反斜杠对它进行转义。

例如,我们要用一个符号来替换一个文字,与此同时我们将把一行最开始出现的第一个 I 替换为 You。

# sed 's/and/\&/g;s/^I/You/g' ahappychild.txt

sed replace string

sed 替换字符串

在上面的命令中,众所周知 ^(插入符号)是正则表达式中用来表示一行开头的符号。

正如你所看到的,我们可以通过使用分号分隔以及用括号包裹来把两个或者更多的替换命令(并在它们中使用正则表达式)连接起来。

另一种 sed 的用法是显示或者删除文件中选中的一部分。在下面的样例中,将会显示 /var/log/messages 中从6月8日开始的头五行。

# sed -n '/^Jun  8/ p' /var/log/messages | sed -n 1,5p

请注意,在默认的情况下,sed 会打印每一行。我们可以使用 -n 选项来覆盖这一行为并且告诉 sed 只需要打印(用 p来表示)文件(或管道)中匹配的部分(第一个命令中指定以“Jun 8” 开头的行,第二个命令中指定一到五行)。

最后,可能有用的技巧是当检查脚本或者配置文件的时候可以保留文件本身并且删除注释。下面的单行 sed 命令删除(d)空行或者是开头为#的行(| 字符对两个正则表达式进行布尔 OR 操作)。

# sed '/^#\|^$/d' apache2.conf

sed match string

sed 匹配字符串

uniq 命令

uniq 命令允许我们返回或者删除文件中重复的行,默认写到标准输出。我们必须注意到,除非两个重复的行相邻,否则uniq 命令不会删除他们。因此,uniq 经常和一个前置的 sort 命令(一种用来对文本行进行排序的算法)搭配使用。默认情况下,sort 使用第一个字段(用空格分隔)作为关键字段。要指定一个不同的关键字段,我们需要使用 -k 选项。

样例

du –sch /path/to/directory/* 命令将会以人类可读的格式返回在指定目录下每一个子文件夹和文件的磁盘空间使用情况(也会显示每个目录总体的情况),而且不是按照大小输出,而是按照子文件夹和文件的名称。我们可以使用下面的命令来让它通过大小排序。

# du -sch /var/* | sort -h

sort command

sort 命令样例

你可以通过使用下面的命令告诉 uniq 比较每一行的前6个字符(-w 6)(这里是指定的日期)来统计日志事件的个数,而且在每一行的开头输出出现的次数(-c)。

# cat /var/log/mail.log | uniq -c -w 6

Count Numbers in File

文件中的统计数字

最后,你可以组合使用 sort 和 uniq 命令(通常如此)。看看下面文件中捐助者、捐助日期和金额的列表。假设我们想知道有多少个捐助者。我们可以使用下面的命令来分隔第一字段(字段由冒号分隔),按名称排序并且删除重复的行。

# cat sortuniq.txt | cut -d: -f1 | sort | uniq

Find Unique Records in File

寻找文件中不重复的记录

grep 命令

grep 在文件(或命令输出)中搜索指定正则表达式,并且在标准输出中输出匹配的行。

样例

显示文件 /etc/passwd 中用户 gacanepa 的信息,忽略大小写。

# grep -i gacanepa /etc/passwd

grep Command

grep 命令样例

显示 /etc 文件夹下所有 rc 开头并跟随任意数字的内容。

# ls -l /etc | grep rc[0-9]

List Content Using grep

使用 grep 列出内容

tr 命令使用技巧

tr 命令可以用来从标准输入中转换(改变)或者删除字符,并将结果写入到标准输出中。

样例

把 sortuniq.txt 文件中所有的小写改为大写。

# cat sortuniq.txt | tr [:lower:] [:upper:]

Sort Strings in File

排序文件中的字符串

压缩ls –l输出中的分隔符为一个空格。

# ls -l | tr -s ' '

Squeeze Delimiter

压缩分隔符

cut 命令使用方法

cut 命令可以基于字节(-b选项)、字符(-c)或者字段(-f)提取部分输入(从标准输入或者文件中)并且将结果输出到标准输出。在最后一种情况下(基于字段),默认的字段分隔符是一个制表符,但可以由 -d 选项来指定不同的分隔符。

样例

从 /etc/passwd 中提取用户账户和他们被分配的默认 shell(-d 选项允许我们指定分界符,-f 选项指定那些字段将被提取)。

# cat /etc/passwd | cut -d: -f1,7

Extract User Accounts

提取用户账户

将以上命令结合起来,我们将使用 last 命令的输出中第一和第三个非空文件创建一个文本流。我们将使用 grep 作为第一过滤器来检查用户 gacanepa 的会话,然后将分隔符压缩至一个空格(tr -s ' ')。下一步,我们将使用 cut 来提取第一和第三个字段,最后使用第二个字段(本样例中,指的是IP地址)来排序之后,再用 uniq 去重。

# last | grep gacanepa | tr -s ‘ ‘ | cut -d’ ‘ -f1,3 | sort -k2 | uniq

last command

last 命令样例

上面的命令显示了如何将多个命令和管道结合起来,以便根据我们的要求得到过滤后的数据。你也可以逐步地使用它以帮助你理解输出是如何从一个命令传输到下一个命令的(顺便说一句,这是一个非常好的学习经验!)

总结

尽管这个例子(以及在当前教程中的其他实例)第一眼看上去可能不是非常有用,但是他们是体验在 Linux 命令行中创建、编辑和操作文件的一个非常好的开始。请随时留下你的问题和意见——不胜感激!

参考链接


via: http://www.tecmint.com/sed-command-to-create-edit-and-manipulate-files-in-linux/

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

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

尽管现在有很多在线联系方式,电子邮件仍然是一个人传递信息给远在世界尽头或办公室里坐在我们旁边的另一个人的有效方式。

下面的图描述了电子邮件从发送者发出直到信息到达接收者收件箱的传递过程。

电子邮件如何工作

电子邮件如何工作

要实现这一切,背后发生了好多事情。为了使电子邮件信息从一个客户端应用程序(例如 Thunderbird、Outlook,或者 web 邮件服务,例如 Gmail 或 Yahoo 邮件)投递到一个邮件服务器,并从其投递到目标服务器并最终到目标接收人,每个服务器上都必须有 SMTP(简单邮件传输协议)服务。

这就是为什么我们要在这篇博文中介绍如何在 RHEL 7 中设置 SMTP 服务器,从本地用户发送的邮件(甚至发送到另外一个本地用户)被 转发 forward 到一个中央邮件服务器以便于访问。

在这个考试的要求中这称为 无客户端 null-client 安装。

在我们的测试环境中将包括一个 起源 originating 邮件服务器和一个中央服务器或 中继主机 relayhost

  • 起源邮件服务器: (主机名: box1.mydomain.com / IP: 192.168.0.18)
  • 中央邮件服务器: (主机名: mail.mydomain.com / IP: 192.168.0.20)

我们在两台机器中都会使用你熟知的 /etc/hosts 文件做名字解析:

192.168.0.18    box1.mydomain.com       box1
192.168.0.20    mail.mydomain.com       mail

安装 Postfix 和防火墙/SELinux 注意事项

首先,我们需要(在两台机器上):

1、 安装 Postfix:

# yum update && yum install postfix

2、 启动服务并启用开机自动启动:

# systemctl start postfix
# systemctl enable postfix

3、 允许邮件流量通过防火墙:

# firewall-cmd --permanent --add-service=smtp
# firewall-cmd --add-service=smtp

在防火墙中开通邮件服务器端口

在防火墙中开通邮件服务器端口

4、 在 box1.mydomain.com 配置 Postfix

Postfix 的主要配置文件是 /etc/postfix/main.cf。这个文件本身是一个很大的文本文件,因为其中包含了解释程序设置的用途的注释。

为了简洁,我们只显示了需要编辑的行(没错,在起源服务器中你需要保留 mydestination 为空;否则邮件会被存储到本地,而不是我们实际想要发往的中央邮件服务器):

myhostname = box1.mydomain.com
mydomain = mydomain.com
myorigin = $mydomain
inet_interfaces = loopback-only
mydestination =
relayhost = 192.168.0.20

5、 在 mail.mydomain.com 配置 Postfix

myhostname = mail.mydomain.com
mydomain = mydomain.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.0.0/24, 127.0.0.0/8

如果还没有设置,还要设置相关的 SELinux 布尔值永久为真:

# setsebool -P allow_postfix_local_write_mail_spool on

设置 Postfix SELinux 权限

设置 Postfix SELinux 权限

上面的 SELinux 布尔值会允许中央服务器上的 Postfix 可以写入 邮件池 mail spool

6、 在两台机子上重启服务以使更改生效:

# systemctl restart postfix

如果 Postfix 没有正确启动,你可以使用下面的命令进行错误处理。

# systemctl -l status postfix
# journalctl -xn
# postconf -n

测试 Postfix 邮件服务

要测试邮件服务器,你可以使用任何 邮件用户代理 Mail User Agent,MUA ,例如 mail 或 mutt

由于我个人喜欢 mutt,我会在 box1 中使用它发送邮件给用户 tecmint,并把现有文件(mailbody.txt)作为信息内容:

# mutt -s "Part 9-RHCE series" [email protected] < mailbody.txt

测试 Postfix 邮件服务器

测试 Postfix 邮件服务器

现在到中央邮件服务器(mail.mydomain.com)以 tecmint 用户登录,并检查是否收到了邮件:

# su – tecmint
# mail

检查 Postfix 邮件服务器发送

检查 Postfix 邮件服务器发送

如果没有收到邮件,检查 root 用户的邮件池看看是否有警告或者错误提示。你也许需要使用 nmap 命令确保两台服务器运行了 SMTP 服务,并在中央邮件服务器中打开了 25 号端口:

# nmap -PN 192.168.0.20

Postfix 邮件服务器错误处理

Postfix 邮件服务器错误处理

总结

像本文中展示的设置邮件服务器和中继主机是每个系统管理员必须拥有的重要技能,也代表了理解和安装更复杂情景的基础,例如一个邮件服务器托管有多个邮件账户(甚至成百上千)的域名。

(请注意这种类型的设置需要有 DNS 服务器,这不在本文的介绍范围),但你可以参照下面的文章设置 DNS 服务器:

最后,我强烈建议你熟悉 Postfix 的配置文件(main.cf)和这个程序的帮助手册。如果有任何疑问,别犹豫,使用下面的评论框或者我们的论坛 Linuxsay.com 告诉我们吧,你会从世界各地的 Linux 高手中获得几乎是及时的帮助。


via: http://www.tecmint.com/setup-postfix-mail-server-smtp-using-null-client-on-centos/

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

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

如果你是一个负责维护和确保 web 服务器安全的系统管理员,你需要花费最大的精力确保服务器中处理和通过的数据任何时候都受到保护。

使用 SSL/TLS 设置 Apache HTTPS

RHCE 系列:第八部分 - 使用网络安全服务(NSS)为 Apache 通过 TLS 实现 HTTPS

为了在客户端和服务器之间提供更安全的连接,作为 HTTP 和 SSL( Secure Sockets Layer 安全套接层 )或者最近称为 TLS( Transport Layer Security 传输层安全 )的组合,产生了 HTTPS 协议。

由于一些严重的安全漏洞,SSL 已经被更健壮的 TLS 替代。由于这个原因,在这篇文章中我们会解析如何通过 TLS 实现你 web 服务器和客户端之间的安全连接。

这里假设你已经安装并配置好了 Apache web 服务器。如果还没有,在进入下一步之前请阅读下面站点中的文章。

安装 OpenSSL 和一些工具包

首先,确保正在运行 Apache 并且允许 http 和 https 通过防火墙:

# systemctl start http
# systemctl enable http
# firewall-cmd --permanent –-add-service=http
# firewall-cmd --permanent –-add-service=https

然后安装一些必需的软件包:

# yum update && yum install openssl mod_nss crypto-utils

重要:请注意如果你想使用 OpenSSL 库而不是 NSS( Network Security Service 网络安全服务 )实现 TLS,你可以在上面的命令中用 mod\_ssl 替换 mod\_nss(使用哪一个取决于你,但在这篇文章中我们会使用 NSS,因为它更加安全,比如说,它支持最新的加密标准,比如 PKCS #11)。

如果你使用 mod\_nss,首先要卸载 mod\_ssl,反之如此。

# yum remove mod_ssl

配置 NSS(网络安全服务)

安装完 mod\_nss 之后,会创建默认的配置文件 /etc/httpd/conf.d/nss.conf。你应该确保所有 Listen 和 VirualHost 指令都指向 443 号端口(HTTPS 默认端口):

nss.conf – 配置文件


Listen 443
VirtualHost _default_:443

然后重启 Apache 并检查是否加载了 mod\_nss 模块:

# apachectl restart
# httpd -M | grep nss

在 Apache 中检查 mod_nss 模块

检查 Apache 是否加载 mod\_nss 模块

下一步,在 /etc/httpd/conf.d/nss.conf 配置文件中做以下更改:

1、 指定 NSS 数据库目录。你可以使用默认的目录或者新建一个。本文中我们使用默认的:

NSSCertificateDatabase /etc/httpd/alias

2、 通过保存密码到数据库目录中的 /etc/httpd/nss-db-password.conf 文件来避免每次系统启动时要手动输入密码:

NSSPassPhraseDialog file:/etc/httpd/nss-db-password.conf

其中 /etc/httpd/nss-db-password.conf 只包含以下一行,其中 mypassword 是后面你为 NSS 数据库设置的密码:

internal:mypassword

另外,要设置该文件的权限和属主为 0640 和 root:apache:

# chmod 640 /etc/httpd/nss-db-password.conf
# chgrp apache /etc/httpd/nss-db-password.conf

3、 由于 POODLE SSLv3 漏洞,红帽建议停用 SSL 和 TLSv1.0 之前所有版本的 TLS(更多信息可以查看这里)。

确保 NSSProtocol 指令的每个实例都类似下面一样(如果你没有托管其它虚拟主机,很可能只有一条):

NSSProtocol TLSv1.0,TLSv1.1

4、 由于这是一个自签名证书,Apache 会拒绝重启,并不会识别为有效发行人。由于这个原因,对于这种特殊情况我们还需要添加:

NSSEnforceValidCerts off

5、 虽然并不是严格要求,为 NSS 数据库设置一个密码同样很重要:

# certutil -W -d /etc/httpd/alias

为 NSS 数据库设置密码

为 NSS 数据库设置密码

创建一个 Apache SSL 自签名证书

下一步,我们会创建一个自签名证书来让我们的客户机可以识别服务器(请注意这个方法对于生产环境并不是最好的选择;对于生产环境你应该考虑购买第三方可信证书机构验证的证书,例如 DigiCert)。

我们用 genkey 命令为 box1 创建有效期为 365 天的 NSS 兼容证书。完成这一步后:

# genkey --nss --days 365 box1

选择 Next:

创建 Apache SSL 密钥

创建 Apache SSL 密钥

你可以使用默认的密钥大小(2048),然后再次选择 Next:

选择 Apache SSL 密钥大小

选择 Apache SSL 密钥大小

等待系统生成随机比特:

生成随机密钥比特

生成随机密钥比特

为了加快速度,会提示你在控制台输入随机字符,正如下面的截图所示。请注意当没有从键盘接收到输入时进度条是如何停止的。然后,会让你选择:

  1. 是否发送验证签名请求(CSR)到一个验证机构(CA):选择 No,因为这是一个自签名证书。
  2. 为证书输入信息。

最后,会提示你输入之前给 NSS 证书设置的密码:

# genkey --nss --days 365 box1

Apache NSS 证书密码

Apache NSS 证书密码

需要的话,你可以用以下命令列出现有的证书:

# certutil –L –d /etc/httpd/alias

列出 Apache NSS 证书

列出 Apache NSS 证书

然后通过名字删除(如果你真的需要删除的,用你自己的证书名称替换 box1):

# certutil -d /etc/httpd/alias -D -n "box1"

如果你需要继续进行的话,请继续阅读。

测试 Apache SSL HTTPS 连接

最后,是时候测试到我们服务器的安全连接了。当你用浏览器打开 https://,你会看到著名的信息 “This connection is untrusted”:

检查 Apache SSL 连接

检查 Apache SSL 连接

在上面的情况中,你可以点击 添加例外 Add Exception 然后 确认安全例外 Confirm Security Exception - 但先不要这么做。让我们首先来看看证书看它的信息是否和我们之前输入的相符(如截图所示)。

要做到这点,点击上面的 视图 View... -> 详情 Details 选项卡,当你从列表中选择发行人你应该看到这个:

确认 Apache SSL 证书详情

确认 Apache SSL 证书详情

现在你可以继续,确认例外(限于此次或永久),然后会通过 https 把你带到你 web 服务器的 DocumentRoot 目录,在这里你可以使用你浏览器自带的开发者工具检查连接详情:

在火狐浏览器中,你可以通过在屏幕中右击,然后从上下文菜单中选择 检查元素 Inspect Element 启动开发者工具,尤其要看“ 网络 Network ”选项卡:

检查 Apache HTTPS 连接

检查 Apache HTTPS 连接

请注意这和之前显示的在验证过程中输入的信息一致。还有一种方式通过使用命令行工具测试连接:

左图(测试 SSLv3):

# openssl s_client -connect localhost:443 -ssl3

右图(测试 TLS):

# openssl s_client -connect localhost:443 -tls1

测试 Apache SSL 和 TLS 连接

测试 Apache SSL 和 TLS 连接

参考上面的截图了解更详细信息。

总结

我想你已经知道,使用 HTTPS 会增加会在你站点中输入个人信息的访客的信任(从用户名和密码到任何商业/银行账户信息)。

在那种情况下,你会希望获得由可信验证机构签名的证书,正如我们之前解释的(步骤和设置需要启用例外的证书的步骤相同,发送 CSR 到 CA 然后获得返回的签名证书);否则,就像我们的例子中一样使用自签名证书即可。

要获取更多关于使用 NSS 的详情,可以参考关于 mod-nss 的在线帮助。如果你有任何疑问或评论,请告诉我们。


via: http://www.tecmint.com/create-apache-https-self-signed-certificate-using-nss/

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

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

在本系列的前一篇文章,我们回顾了如何在可能包括多种类型操作系统的网络上配置 Samba 共享。现在,如果你需要为一组类 Unix 客户端配置文件共享,很自然的你会想到网络文件系统,或简称 NFS。

设置使用 Kerberos 进行身份验证的 NFS 服务器

RHCE 系列:第七部分 - 设置使用 Kerberos 进行身份验证的 NFS 服务器

在这篇文章中我们会介绍配置基于 Kerberos 身份验证的 NFS 共享的整个流程。假设你已经配置好了一个 NFS 服务器和一个客户端。如果还没有,可以参考 安装和配置 NFS 服务器 - 它列出了需要安装的依赖软件包并解释了在进行下一步之前如何在服务器上进行初始化配置。

另外,你可能还需要配置 SELinuxfirewalld 以允许通过 NFS 进行文件共享。

下面的例子假设你的 NFS 共享目录在 box2 的 /nfs:

# semanage fcontext -a -t public_content_rw_t "/nfs(/.*)?"
# restorecon -R /nfs
# setsebool -P nfs_export_all_rw on
# setsebool -P nfs_export_all_ro on

(其中 -P 标记指示重启持久有效)。

最后,别忘了:

创建 NFS 组并配置 NFS 共享目录

1、 新建一个名为 nfs 的组并给它添加用户 nfsnobody,然后更改 /nfs 目录的权限为 0770,组属主为 nfs。于是,nfsnobody(对应请求用户)在共享目录有写的权限,你就不需要在 /etc/exports 文件中使用 norootsquash(LCTT 译注:设为 root\_squash 意味着在访问 NFS 服务器上的文件时,客户机上的 root 用户不会被当作 root 用户来对待)。

# groupadd nfs
# usermod -a -G nfs nfsnobody
# chmod 0770 /nfs
# chgrp nfs /nfs

2、 像下面那样更改 export 文件(/etc/exports)只允许从 box1 使用 Kerberos 安全验证的访问(sec=krb5)。

注意:anongid 的值设置为之前新建的组 nfs 的 GID:

exports – 添加 NFS 共享

/nfs box1(rw,sec=krb5,anongid=1004)

3、 再次 exprot(-r)所有(-a)NFS 共享。为输出添加详情(-v)是个好主意,因为它提供了发生错误时解决问题的有用信息:

# exportfs -arv

4、 重启并启用 NFS 服务器以及相关服务。注意你不需要启动 nfs-lock 和 nfs-idmapd,因为系统启动时其它服务会自动启动它们:

# systemctl restart rpcbind nfs-server nfs-lock nfs-idmap
# systemctl enable rpcbind nfs-server

测试环境和其它前提要求

在这篇指南中我们使用下面的测试环境:

  • 客户端机器 [box1: 192.168.0.18]
  • NFS / Kerberos 服务器 [box2: 192.168.0.20] (也称为密钥分发中心,简称 KDC)。

注意:Kerberos 服务是至关重要的认证方案。

正如你看到的,为了简便,NFS 服务器和 KDC 在同一台机器上,当然如果你有更多可用机器你也可以把它们安装在不同的机器上。两台机器都在 mydomain.com 域。

最后同样重要的是,Kerberos 要求客户端和服务器中至少有一个域名解析的基本方式和网络时间协议服务,因为 Kerberos 身份验证的安全一部分基于时间戳。

为了配置域名解析,我们在客户端和服务器中编辑 /etc/hosts 文件:

host 文件 – 为域添加 DNS

192.168.0.18    box1.mydomain.com    box1
192.168.0.20    box2.mydomain.com    box2

在 RHEL 7 中,chrony 是用于 NTP 同步的默认软件:

# yum install chrony
# systemctl start chronyd
# systemctl enable chronyd

为了确保 chrony 确实在和时间服务器同步你系统的时间,你可能要输入下面的命令两到三次,确保时间偏差尽可能接近 0:

# chronyc tracking

用 Chrony 同步服务器时间

用 Chrony 同步服务器时间

安装和配置 Kerberos

要设置 KDC,首先在客户端和服务器安装下面的软件包(客户端不需要 server 软件包):

# yum update && yum install krb5-server krb5-workstation pam_krb5

安装完成后,编辑配置文件(/etc/krb5.conf 和 /var/kerberos/krb5kdc/kadm5.acl),像下面那样用 mydomain.com 替换所有 example.com。

下一步,确保 Kerberos 能功过防火墙并启动/启用相关服务。

重要:客户端也必须启动和启用 nfs-secure:

# firewall-cmd --permanent --add-service=kerberos
# systemctl start krb5kdc kadmin nfs-secure   
# systemctl enable krb5kdc kadmin nfs-secure       

现在创建 Kerberos 数据库(请注意这可能会需要一点时间,因为它会和你的系统进行多次交互)。为了加速这个过程,我打开了另一个终端并运行了 ping -f localhost 30 到 45 秒):

# kdb5_util create -s

创建 Kerberos 数据库

创建 Kerberos 数据库

下一步,使用 kadmin.local 工具为 root 创建管理权限:

# kadmin.local
# addprinc root/admin

添加 Kerberos 服务器到数据库:

# addprinc -randkey host/box2.mydomain.com

在客户端(box1)和服务器(box2)上对 NFS 服务同样操作。请注意下面的截图中在退出前我忘了在 box1 上进行操作:

# addprinc -randkey nfs/box2.mydomain.com
# addprinc -randkey nfs/box1.mydomain.com

输入 quit 和回车键退出:

添加 Kerberos 到 NFS 服务器

添加 Kerberos 到 NFS 服务器

为 root/admin 获取和缓存 票据授权票据 ticket-granting ticket

# kinit root/admin
# klist

缓存 Kerberos

缓存 Kerberos

真正使用 Kerberos 之前的最后一步是保存被授权使用 Kerberos 身份验证的规则到一个密钥表文件(在服务器中):

# kdadmin.local
# ktadd host/box2.mydomain.com
# ktadd nfs/box2.mydomain.com
# ktadd nfs/box1.mydomain.com

最后,挂载共享目录并进行一个写测试:

# mount -t nfs4 -o sec=krb5 box2:/nfs /mnt
# echo "Hello from Tecmint.com" > /mnt/greeting.txt

挂载 NFS 共享

挂载 NFS 共享

现在让我们卸载共享,在客户端中重命名密钥表文件(模拟它不存在)然后试着再次挂载共享目录:

# umount /mnt
# mv /etc/krb5.keytab /etc/krb5.keytab.orig

挂载/卸载 Kerberos NFS 共享

挂载/卸载 Kerberos NFS 共享

现在你可以使用基于 Kerberos 身份验证的 NFS 共享了。

总结

在这篇文章中我们介绍了如何设置带 Kerberos 身份验证的 NFS。和我们在这篇指南中介绍的相比,该主题还有很多相关内容,可以在 Kerberos 手册 查看,另外至少可以说 Kerberos 有一点棘手,如果你在测试或实现中遇到了任何问题或需要帮助,别犹豫在下面的评论框中告诉我们吧。


via: http://www.tecmint.com/setting-up-nfs-server-with-kerberos-based-authentication/

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

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

为了确保你的 RHEL 7 系统安全,你需要通过查看日志文件来监控系统中发生的所有活动。这样,你就可以检测到任何不正常或有潜在破坏的活动并进行系统故障排除或者其它恰当的操作。

Linux 中使用 Rsyslog 和 Logrotate 轮换日志文件

RHCE 考试 - 第五部分:使用 Rsyslog 和 Logrotate 管理系统日志

在 RHEL 7 中,rsyslogd 守护进程负责系统日志,它从 /etc/rsyslog.conf(该文件指定所有系统日志的默认路径)和 /etc/rsyslog.d 中的所有文件(如果有的话)读取配置信息。

Rsyslogd 配置

快速浏览一下 rsyslog.conf 会是一个好的开端。该文件分为 3 个主要部分:模块(rsyslong 按照模块化设计),全局指令(用于设置 rsyslogd 守护进程的全局属性),以及规则。正如你可能猜想的,最后一个部分指示记录或显示什么以及在哪里保存(也称为 选择子 selector ),这也是这篇文章关注的重点。

rsyslog.conf 中典型的一行如下所示:

Rsyslogd 配置

Rsyslogd 配置

在上面的图片中,我们可以看到一个选择子包括了一个或多个用分号分隔的 “设备:优先级” Facility:Priority 对,其中设备描述了消息类型(参考 RFC 3164 4.1.1 章节,查看 rsyslog 可用的完整设备列表),优先级指示它的严重性,这可能是以下几种之一:

  • debug
  • info
  • notice
  • warning
  • err
  • crit
  • alert
  • emerg

尽管 none 并不是一个优先级,不过它意味着指定设备没有任何优先级。

注意:给定一个优先级表示该优先级以及之上的消息都应该记录到日志中。因此,上面例子中的行指示 rsyslogd 守护进程记录所有优先级为 info 以及以上(不管是什么设备)的除了属于 mail、authpriv、以及 cron 服务(不考虑来自这些设备的消息)的消息到 /var/log/messages。

你也可以使用逗号将多个设备分为一组,对同组中的设备使用相同的优先级。例如下面这行:

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

也可以这样写:

*.info;mail,authpriv,cron.none                /var/log/messages

换句话说,mail、authpriv 以及 cron 被分为一组,并使用关键字 none。

创建自定义日志文件

要把所有的守护进程消息记录到 /var/log/tecmint.log,我们需要在 rsyslog.conf 或者 /etc/rsyslog.d 目录中的单独文件(这样易于管理)添加下面一行:

daemon.*    /var/log/tecmint.log

然后重启守护进程(注意服务名称不以 d 结尾):

# systemctl restart rsyslog

在随便重启两个守护进程之前和之后查看下自定义日志的内容:

Linux 创建自定义日志文件

创建自定义日志文件

作为一个自学练习,我建议你重点关注设备和优先级,添加额外的消息到已有的日志文件或者像上面那样创建一个新的日志文件。

使用 Logrotate 轮换日志

为了防止日志文件无限制增长,logrotate 工具用于轮换、压缩、移除或者通过电子邮件发送日志,从而减轻管理会产生大量日志文件系统的困难。(译者注:日志轮换(rotate)是系统管理中归档每天产生的日志文件的自动化过程)

Logrotate 作为一个 cron 任务(/etc/cron.daily/logrotate)每天运行,并从 /etc/logrotate.conf 和 /etc/logrotate.d 中的文件(如果有的话)读取配置信息。

对于 rsyslog,即使你可以在主文件中为指定服务包含设置,为每个服务创建单独的配置文件能帮助你更好地组织设置。

让我们来看一个典型的 logrotate.conf:

Logrotate 配置

Logrotate 配置

在上面的例子中,logrotate 会为 /var/log/wtmp 进行以下操作:尝试每个月轮换一次,但至少文件要大于 1MB,然后用 0664 权限、用户 root、组 utmp 创建一个新的日志文件。下一步只保存一个归档日志,正如轮换指令指定的:

每月 Logrotate 日志

每月 Logrotate 日志

让我们再来看看 /etc/logrotate.d/httpd 中的另一个例子:

轮换 Apache 日志文件

轮换 Apache 日志文件

你可以在 logrotate 的 man 手册(man logrotateman logrotate.conf)中阅读更多有关它的设置。为了方便你的阅读,本文还提供了两篇文章的 PDF 格式。

作为一个系统工程师,很可能由你决定多久按照什么格式保存一次日志,这取决于你是否有一个单独的分区/逻辑卷给 /var。否则,你真的要考虑删除旧日志以节省存储空间。另一方面,根据你公司和客户内部的政策,为了以后的安全审核,你可能必须要保留多个日志。

保存日志到数据库

当然检查日志可能是一个很繁琐的工作(即使有类似 grep 工具和正则表达式的帮助)。因为这个原因,rsyslog 允许我们把它们导出到数据库(OTB 支持的关系数据库管理系统包括 MySQL、MariaDB、PostgreSQL 和 Oracle 等)。

指南的这部分假设你已经在要管理日志的 RHEL 7 上安装了 MariaDB 服务器和客户端:

# yum update && yum install mariadb mariadb-server mariadb-client rsyslog-mysql
# systemctl enable mariadb && systemctl start mariadb

然后使用 mysql_secure_installation 工具为 root 用户设置密码以及其它安全考量:

保证 MySQL 数据库安全

保证 MySQL 数据库安全

注意:如果你不想用 MariaDB root 用户插入日志消息到数据库,你也可以配置用另一个用户账户。如何实现的介绍已经超出了本文的范围,但在 MariaDB 知识 中有详细解析。为了简单在这篇指南中我们会使用 root 账户。

下一步,从 GitHub 下载 createDB.sql 脚本并导入到你的数据库服务器:

# mysql -u root -p < createDB.sql

保存服务器日志到数据库

保存服务器日志到数据库

最后,添加下面的行到 /etc/rsyslog.conf:

$ModLoad ommysql
$ActionOmmysqlServerPort 3306
*.* :ommysql:localhost,Syslog,root,YourPasswordHere

重启 rsyslog 和数据库服务器:

# systemctl restart rsyslog 
# systemctl restart mariadb

使用 SQL 语法查询日志

现在执行一些会改变日志的操作(例如停止和启动服务),然后登录到你的数据库服务器并使用标准的 SQL 命令显示和查询日志:

USE Syslog;
SELECT ReceivedAt, Message FROM SystemEvents;

在数据库中查询日志

在数据库中查询日志

总结

在这篇文章中我们介绍了如何设置系统日志,如果轮换日志以及为了简化查询如何重定向消息到数据库。我们希望这些技巧能对你准备 RHCE 考试 和日常工作有所帮助。

正如往常,非常欢迎你的反馈。用下面的表单和我们联系吧。


via: http://www.tecmint.com/manage-linux-system-logs-using-rsyslogd-and-logrotate/

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

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