Gabriel Cánepa 发布的文章

Web 服务器(也被称为 HTTP 服务器)是在网络中将内容(最为常见的是网页,但也支持其他类型的文件)进行处理并传递给客户端的服务。

FTP 服务器是最为古老且最常使用的资源之一(即便到今天也是这样),在身份认证不是必须的情况下,它可通过客户端在一个网络访问文件,因为 FTP 使用没有加密的用户名和密码,所以有些情况下不需要验证也行。

在 RHEL 7 中可用的 web 服务器是版本号为 2.4 的 Apache HTTP 服务器。至于 FTP 服务器,我们将使用 Very Secure Ftp Daemon (又名 vsftpd) 来建立用 TLS 加固的连接。

配置和加固 Apache 和 FTP 服务器

RHCSA: 安装,配置及加固 Apache 和 FTP 服务器 – Part 9

在这篇文章中,我们将解释如何在 RHEL 7 中安装、配置和加固 web 和 FTP 服务器。

安装 Apache 和 FTP 服务器

在本指导中,我们将使用一个静态 IP 地址为 192.168.0.18/24 的 RHEL 7 服务器。为了安装 Apache 和 VSFTPD,运行下面的命令:

# yum update && yum install httpd vsftpd

当安装完成后,这两个服务在开始时是默认被禁用的,所以我们需要暂时手动开启它们并让它们在下一次启动时自动地开启它们:

# systemctl start httpd
# systemctl enable httpd
# systemctl start vsftpd
# systemctl enable vsftpd

另外,我们必须打开 80 和 21 端口,它们分别是 web 和 ftp 守护进程监听的端口,为的是允许从外面访问这些服务:

# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --zone=public --add-service=ftp --permanent
# firewall-cmd --reload

为了确认 web 服务工作正常,打开你的浏览器并输入服务器的 IP,则你应该可以看到如下的测试页面:

确认 Apache Web 服务器

确认 Apache Web 服务器

对于 ftp 服务器,在确保它如期望中的那样工作之前,我们必须进一步地配置它,我们将在几分钟后来做这件事。

配置并加固 Apache Web 服务器

Apache 的主要配置文件位于 /etc/httpd/conf/httpd.conf 中,但它可能依赖 /etc/httpd/conf.d 中的其他文件。

尽管默认的配置对于大多数的情形都够用了,但熟悉在 官方文档 中介绍的所有可用选项是一个不错的主意。

同往常一样,在编辑主配置文件前先做一个备份:

# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d)

然后用你钟爱的文本编辑器打开它,并查找下面这些变量:

  • ServerRoot: 服务器的配置,错误和日志文件保存的目录。
  • Listen: 通知 Apache 去监听特定的 IP 地址或端口。
  • Include: 允许包含其他配置文件,要包含的文件必须存在,否则,服务器将会失败。它恰好与 IncludeOptional 相反,假如特定的配置文件不存在,它将静默地忽略掉它们。
  • UserGroup: 运行 httpd 服务的用户/组的名称。
  • DocumentRoot: Apache 为你的文档所服务的目录。默认情况下,所有的请求将在这个目录中被获取,但符号链接和别名可能会被用于指向其他位置。
  • ServerName: 这个指令将设定用于识别它自身的主机名(或 IP 地址)和端口。

安全措施的第一步将包含创建一个特定的用户和组(如 tecmint/tecmint)来运行 web 服务器,以及更改默认的端口为一个更高的端口(在这个例子中为 9000) (LCTT 译注:如果你的 Web 服务器对外公开提供服务,则不建议修改为非默认端口。):

ServerRoot "/etc/httpd"
Listen 192.168.0.18:9000
User tecmint
Group tecmint
DocumentRoot "/var/www/html"
ServerName 192.168.0.18:9000

你可以使用下面的命令来测试配置文件:

# apachectl configtest

假如一切 OK,接着重启 web 服务器。

# systemctl restart httpd

并别忘了在防火墙中开启新的端口(并禁用旧的端口):

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
# firewall-cmd --zone=public --add-port=9000/tcp --permanent
# firewall-cmd --reload

请注意,由于 SELinux 策略,你只能给给 web 服务器使用如下命令所返回的端口。

# semanage port -l | grep -w '^http_port_t'

假如你想让 httpd 服务使用另一个端口(如 TCP 端口 8100),你必须将它加到 SELinux 的端口上下文:

# semanage port -a -t http_port_t -p tcp 8100

添加 Apache 端口到 SELinux 策略

添加 Apache 端口到 SELinux 策略

为了进一步加固你安装的 Apache,请遵循以下步骤:

  1. 运行 Apache 的用户不应该拥有访问 shell 的能力:
# usermod -s /sbin/nologin tecmint
  1. 禁用目录列表功能,这是为了阻止浏览器展示一个未包含 index.html 文件的目录里的内容。

编辑 /etc/httpd/conf/httpd.conf (以及虚拟主机的配置文件,假如有的话),并确保出现在顶层的和Directory 块中的 Options 指令都被设置为 None:

Options None
  1. 在 HTTP 响应中隐藏有关 web 服务器和操作系统的信息。像下面这样编辑文件 /etc/httpd/conf/httpd.conf
ServerTokens Prod 
ServerSignature Off

现在,你已经做好了从 /var/www/html 目录开始服务内容的准备了。

配置并加固 FTP 服务器

和 Apache 的情形类似, Vsftpd 的主配置文件 /etc/vsftpd/vsftpd.conf 带有详细的注释,且虽然对于大多数的应用实例,默认的配置应该足够了,但为了更有效率地操作 ftp 服务器,你应该开始熟悉相关的文档和 man 页 man vsftpd.conf(对于这点,再多的强调也不为过!)。

在我们的示例中,使用了这些指令:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

通过使用 chroot_local_user=YES,(默认情况下)本地用户在登录之后,将被限制在以用户的家目录为 chroot 监狱的环境中。这意味着本地用户将不能访问除其家目录之外的任何文件。

最后,为了让 ftp 能够在用户的家目录中读取文件,设置如下的 SELinux 布尔值:

# setsebool -P ftp_home_dir on

现在,你可以使用一个客户端例如 Filezilla 来连接一个 ftp 服务器:

查看 FTP 连接

查看 FTP 连接

注意, /var/log/xferlog 日志将会记录下载和上传的情况,这与上图的目录列表一致:

监视 FTP 的下载和上传情况

监视 FTP 的下载和上传情况

另外请参考: 在 Linux 系统中使用 Trickle 来限制应用使用的 FTP 网络带宽

总结

在本教程中,我们解释了如何设置 web 和 ftp 服务器。由于这个主题的广泛性,涵盖这些话题的所有方面是不可能的(如虚拟主机)。因此,我推荐你也阅读这个网站中有关 Apache 的其他卓越的文章。


via: http://www.tecmint.com/rhcsa-series-install-and-secure-apache-web-server-and-ftp-in-rhel/

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

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

作为一名系统管理员,你将经常使用一个终端模拟器来登录到一个远程的系统中,执行一系列的管理任务。你将很少有机会坐在一个真实的(物理)终端前,所以你需要设定好一种方法来使得你可以登录到你需要去管理的那台远程主机上。

事实上,当你必须坐在一台物理终端前的时候,就可能是你登录到该主机的最后一种方法了。基于安全原因,使用 Telnet 来达到以上目的并不是一个好主意,因为穿行在线缆上的流量并没有被加密,它们以明文方式在传送。

另外,在这篇文章中,我们也将复习如何配置网络服务来使得它在开机时被自动开启,并学习如何设置网络和静态或动态地解析主机名。

RHCSA: 安全 SSH 和开启网络服务

RHCSA: 安全 SSH 和开启网络服务 – Part 8

安装并确保 SSH 通信安全

对于你来说,要能够使用 SSH 远程登录到一个 RHEL 7 机子,你必须安装 opensshopenssh-clientsopenssh-servers 软件包。下面的命令不仅将安装远程登录程序,也会安装安全的文件传输工具以及远程文件复制程序:

# yum update && yum install openssh openssh-clients openssh-servers

注意,也安装上服务器所需的相应软件包是一个不错的主意,因为或许在某个时刻,你想使用同一个机子来作为客户端和服务器。

在安装完成后,如若你想安全地访问你的 SSH 服务器,你还需要考虑一些基本的事情。下面的设定应该出现在文件 /etc/ssh/sshd_config 中。

1、 更改 sshd 守护进程的监听端口,从 22(默认的端口值)改为一个更高的端口值(2000 或更大),但首先要确保所选的端口没有被占用。

例如,让我们假设你选择了端口 2500 。使用 netstat 来检查所选的端口是否被占用:

# netstat -npltu | grep 2500

假如 netstat 没有返回任何信息,则你可以安全地为 sshd 使用端口 2500,并且你应该在上面的配置文件中更改端口的设定,具体如下:

Port 2500

2、 只允许协议 2(LCTT 译注:SSHv1 已经被证明不安全,默认情况下 SSHv1 和 SSHv2 都支持,所以应该显示去掉如下配置行的注释,并只支持 SSHv2。):

Protocol 2

3、 配置验证超时的时间为 2 分钟,不允许以 root 身份登录,并将允许通过 ssh 登录的人数限制到最小:

LoginGraceTime 2m
PermitRootLogin no
AllowUsers gacanepa

4、 假如可能,使用基于公钥的验证方式而不是使用密码:

PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes

这假设了你已经在你的客户端机子上创建了带有你的用户名的一个密钥对,并将公钥复制到了你的服务器上。

配置网络和名称的解析

1、 每个系统管理员都应该对下面这个系统配置文件非常熟悉:

  • /etc/hosts 被用来在小型网络中解析“名称” <---> “IP 地址”。

文件 /etc/hosts 中的每一行拥有如下的结构:

IP address - Hostname - FQDN

例如,

192.168.0.10    laptop  laptop.gabrielcanepa.com.ar

2、 /etc/resolv.conf 特别指定 DNS 服务器的 IP 地址和搜索域,它被用来在没有提供域名后缀时,将一个给定的查询名称对应为一个全称域名。

在正常情况下,你不必编辑这个文件,因为它是由系统管理的。然而,若你非要改变 DNS 服务器的 IP 地址,建议你在该文件的每一行中,都应该遵循下面的结构:

nameserver - IP address

例如,

nameserver 8.8.8.8

3、 /etc/host.conf 特别指定在一个网络中主机名被解析的方法和顺序。换句话说,告诉名称解析器使用哪个服务,并以什么顺序来使用。

尽管这个文件由几个选项,但最为常见和基本的设置包含如下的一行:

order bind,hosts

它意味着解析器应该首先查看 resolv.conf 中特别指定的域名服务器,然后到 /etc/hosts 文件中查找解析的名称。

4、 /etc/sysconfig/network 包含了所有网络接口的路由和全局主机信息。下面的值可能会被使用:

NETWORKING=yes|no
HOSTNAME=value

其中的 value 应该是 全称域名 FQDN

GATEWAY=XXX.XXX.XXX.XXX

其中的 XXX.XXX.XXX.XXX 是网关的 IP 地址。

GATEWAYDEV=value

在一个带有多个网卡的机器中, value 为网关设备名,例如 enp0s3。

5、 位于 /etc/sysconfig/network-scripts 中的文件(网络适配器配置文件)。

在上面提到的目录中,你将找到几个被命名为如下格式的文本文件。

ifcfg-name

其中 name 为网卡的名称,由 ip link show 返回:

检查网络连接状态

检查网络连接状态

例如:

网络文件

网络文件

除了环回接口(loopback),你还可以为你的网卡指定相似的配置。注意,假如设定了某些变量,它们将为这个指定的接口覆盖掉 /etc/sysconfig/network 中定义的默认值。在这篇文章中,为了能够解释清楚,每行都被加上了注释,但在实际的文件中,你应该避免加上注释:

HWADDR=08:00:27:4E:59:37 ### 网卡的 MAC 地址
TYPE=Ethernet ### 连接类型
BOOTPROTO=static ### 这代表着该网卡指定了一个静态地址。
                      ### 如果这个值指定为 dhcp,这个网卡会从 DHCP 服务器获取 IP 地址,并且就不应该出现以下两行。
IPADDR=192.168.0.18
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NM_CONTROLLED=no ### 应该给以太网卡设置,以便可以让 NetworkManager 可以修改这个文件。
NAME=enp0s3
UUID=14033805-98ef-4049-bc7b-d4bea76ed2eb
ONBOOT=yes ### 操作系统会在启动时打开这个网卡。

设定主机名

在 RHEL 7 中, hostnamectl 命令被同时用来查询和设定系统的主机名。

要展示当前的主机名,输入:

# hostnamectl status

在RHEL 7 中检查系统的主机名

检查系统的主机名

要更改主机名,使用

# hostnamectl set-hostname [new hostname]

例如,

# hostnamectl set-hostname cinderella

要想使得更改生效,你需要重启 hostnamed 守护进程(这样你就不必因为要应用更改而登出并再登录系统):

# systemctl restart systemd-hostnamed

在 RHEL7 中设定系统主机名

设定系统主机名

另外, RHEL 7 还包含 nmcli 工具,它可被用来达到相同的目的。要展示主机名,运行:

# nmcli general hostname

且要改变主机名,则运行:

# nmcli general hostname [new hostname]

例如,

# nmcli general hostname rhel7

使用 nmcli 命令来设定主机名

使用 nmcli 命令来设定主机名

在开机时开启网络服务

作为本文的最后部分,就让我们看看如何确保网络服务在开机时被自动开启。简单来说,这个可通过创建符号链接到某些由服务的配置文件中的 [Install] 小节中指定的文件来实现。

以 firewalld(/usr/lib/systemd/system/firewalld.service) 为例:

[Install]
WantedBy=basic.target
Alias=dbus-org.fedoraproject.FirewallD1.service

要开启该服务,运行:

# systemctl enable firewalld

另一方面,要禁用 firewalld,则需要移除符号链接:

# systemctl disable firewalld

在开机时开启服务

在开机时开启服务

总结

在这篇文章中,我们总结了如何安装 SSH 及使用它安全地连接到一个 RHEL 服务器;如何改变主机名,并在最后如何确保在系统启动时开启服务。假如你注意到某个服务启动失败,你可以使用 systemctl status -l [service]journalctl -xn 来进行排错。

请随意使用下面的评论框来让我们知晓你对本文的看法。提问也同样欢迎。我们期待着你的反馈!


via: http://www.tecmint.com/rhcsa-series-secure-ssh-set-hostname-enable-network-services-in-rhel-7/

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

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

在上一篇文章(RHCSA 系列(六))中,我们解释了如何使用 parted 和 ssm 来设置和配置本地系统存储。

配置 ACL 及挂载 NFS/Samba 共享

RHCSA 系列: 配置 ACL 及挂载 NFS/Samba 共享 – Part 7

我们也讨论了如何创建和在系统启动时使用一个密码来挂载加密的卷。另外,我们告诫过你要避免在挂载的文件系统上执行危险的存储管理操作。记住了这点后,现在,我们将回顾在 RHEL 7 中最常使用的文件系统格式,然后将涵盖有关手动或自动挂载、使用和卸载网络文件系统(CIFS 和 NFS)的话题以及在你的操作系统上实现 访问控制列表 Access Control List 的使用。

前提条件

在进一步深入之前,请确保你可使用 Samba 服务和 NFS 服务(注意在 RHEL 7 中 NFSv2 已不再被支持)。

在本次指导中,我们将使用一个IP 地址为 192.168.0.10 且同时运行着 Samba 服务和 NFS 服务的机器来作为服务器,使用一个 IP 地址为 192.168.0.18 的 RHEL 7 机器来作为客户端。在这篇文章的后面部分,我们将告诉你在客户端上你需要安装哪些软件包。

RHEL 7 中的文件系统格式

从 RHEL 7 开始,由于 XFS 的高性能和可扩展性,它已经被作为所有的架构中的默认文件系统。根据 Red Hat 及其合作伙伴在主流硬件上执行的最新测试,当前 XFS 已支持最大为 500 TB 大小的文件系统。

另外,XFS 启用了 user_xattr(扩展用户属性) 和 acl(POSIX 访问控制列表)来作为默认的挂载选项,而不像 ext3 或 ext4(对于 RHEL 7 来说,ext2 已过时),这意味着当挂载一个 XFS 文件系统时,你不必显式地在命令行或 /etc/fstab 中指定这些选项(假如你想在后一种情况下禁用这些选项,你必须显式地使用 no_aclno_user_xattr)。

请记住扩展用户属性可以给文件和目录指定,用来存储任意的额外信息如 mime 类型,字符集或文件的编码,而用户属性中的访问权限由一般的文件权限位来定义。

访问控制列表

作为一名系统管理员,无论你是新手还是专家,你一定非常熟悉与文件和目录有关的常规访问权限,这些权限为所有者,所有组和“世界”(所有的其他人)指定了特定的权限(可读,可写及可执行)。但如若你需要稍微更新下你的记忆,请参考 RHCSA 系列(三).

但是,由于标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限,所以 ACL 便被引入了进来,为的是为文件和目录定义更加详细的访问权限,而不仅仅是这些特别指定的特定权限。

事实上, ACL 定义的权限是由文件权限位所特别指定的权限的一个超集。下面就让我们看看这个转换是如何在真实世界中被应用的吧。

  1. 存在两种类型的 ACL:访问 ACL,可被应用到一个特定的文件或目录上;以及默认 ACL,只可被应用到一个目录上。假如目录中的文件没有 ACL,则它们将继承它们的父目录的默认 ACL 。
  2. 从一开始, ACL 就可以为每个用户,每个组或不在文件所属组中的用户配置相应的权限。
  3. ACL 可使用 setfacl 来设置(和移除),可相应地使用 -m 或 -x 选项。

例如,让我们创建一个名为 tecmint 的组,并将用户 johndoe 和 davenull 加入该组:

# groupadd tecmint
# useradd johndoe
# useradd davenull
# usermod -a -G tecmint johndoe
# usermod -a -G tecmint davenull

并且让我们检验这两个用户都已属于追加的组 tecmint:

# id johndoe
# id davenull

检验用户

检验用户

现在,我们在 /mnt 下创建一个名为 playground 的目录,并在该目录下创建一个名为 testfile.txt 的文件。我们将设定该文件的属组为 tecmint,并更改它的默认 ugo/rwx 权限为 770(即赋予该文件的属主和属组可读、可写和可执行权限):

# mkdir /mnt/playground
# touch /mnt/playground/testfile.txt
# chown :tecmint /mnt/playground/testfile.txt
# chmod 770 /mnt/playground/testfile.txt

接着,依次切换为 johndoe 和 davenull 用户,并在文件中写入一些信息:

# su johndoe
$ echo "My name is John Doe" > /mnt/playground/testfile.txt
$ su davenull
$ echo "My name is Dave Null" >> /mnt/playground/testfile.txt

到目前为止,一切正常。现在我们让用户 gacanepa 来向该文件执行写操作 – 则写操作将会失败,这是可以预料的。

$ su gacanepa
$ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt

管理用户的权限

管理用户的权限

但实际上我们需要用户 gacanepa(他不是组 tecmint 的成员)在文件 /mnt/playground/testfile.txt 上有写权限,那又该怎么办呢?首先映入你脑海里的可能是将该用户添加到组 tecmint 中。但那将使得他在所有该组具有写权限位的文件上均拥有写权限,但我们并不想这样,我们只想他能够在文件 /mnt/playground/testfile.txt 上有写权限。

现在,让我们给用户 gacanepa 在 /mnt/playground/testfile.txt 文件上有读和写权限。

以 root 的身份运行如下命令:

# setfacl -R -m u:gacanepa:rwx /mnt/playground

则你将成功地添加一条 ACL,允许 gacanepa 对那个测试文件可写。然后切换为 gacanepa 用户,并再次尝试向该文件写入一些信息:

$ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt

要观察一个特定的文件或目录的 ACL,可以使用 getfacl 命令:

# getfacl /mnt/playground/testfile.txt

检查文件的 ACL

检查文件的 ACL

要为目录设定默认 ACL(它的内容将被该目录下的文件继承,除非另外被覆写),在规则前添加 d:并特别指定一个目录名,而不是文件名:

# setfacl -m d:o:r /mnt/playground

上面的 ACL 将允许不在属组中的用户对目录 /mnt/playground 中的内容有读权限。请注意观察这次更改前后 getfacl /mnt/playground 的输出结果的不同:

在 Linux 中设定默认 ACL

在 Linux 中设定默认 ACL

在官方的 RHEL 7 存储管理指导手册的第 20 章 中提供了更多有关 ACL 的例子,我极力推荐你看一看它并将它放在身边作为参考。

挂载 NFS 网络共享

要显示你服务器上可用的 NFS 共享的列表,你可以使用带有 -e 选项的 showmount 命令,再跟上机器的名称或它的 IP 地址。这个工具包含在 nfs-utils 软件包中:

# yum update && yum install nfs-utils

接着运行:

# showmount -e 192.168.0.10

则你将得到一个在 192.168.0.10 上可用的 NFS 共享的列表:

检查可用的 NFS 共享

检查可用的 NFS 共享

要按照需求在本地客户端上使用命令行来挂载 NFS 网络共享,可使用下面的语法:

# mount -t nfs -o [options] remote_host:/remote/directory /local/directory

其中,在我们的例子中,对应为:

# mount -t nfs 192.168.0.10:/NFS-SHARE /mnt/nfs

若你得到如下的错误信息:Job for rpc-statd.service failed. See "systemctl status rpc-statd.service" and "journalctl -xn" for details.,请确保 rpcbind 服务被启用且已在你的系统中启动了。

# systemctl enable rpcbind.socket
# systemctl restart rpcbind.service

接着重启。这就应该达到了上面的目的,且你将能够像先前解释的那样挂载你的 NFS 共享了。若你需要在系统启动时自动挂载 NFS 共享,可以向 /etc/fstab 文件添加一个有效的条目:

remote_host:/remote/directory /local/directory nfs options 0 0

上面的变量 remote\_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 NFS 共享时使用的一样。按照我们前面的例子,对应为:

192.168.0.10:/NFS-SHARE /mnt/nfs nfs defaults 0 0

挂载 CIFS (Samba) 网络共享

Samba 代表一个特别的工具,使得在由 *nix 和 Windows 机器组成的网络中进行网络共享成为可能。要显示可用的 Samba 共享,可使用带有 -L 选项的 smbclient 命令,再跟上机器的名称或它的 IP 地址。这个工具包含在 samba\_client 软件包中:

你将被提示在远程主机上输入 root 用户的密码:

# smbclient -L 192.168.0.10

检查 Samba 共享

检查 Samba 共享

要在本地客户端上挂载 Samba 网络共享,你需要已安装好 cifs-utils 软件包:

# yum update && yum install cifs-utils

然后在命令行中使用下面的语法:

# mount -t cifs -o credentials=/path/to/credentials/file //remote_host/samba_share /local/directory

其中,在我们的例子中,对应为:

# mount -t cifs -o credentials=~/.smbcredentials //192.168.0.10/gacanepa /mnt/samba

其中 .smbcredentials 的内容是:

username=gacanepa
password=XXXXXX

它是一个位于 root 用户的家目录(/root/) 中的隐藏文件,其权限被设置为 600,所以除了该文件的属主外,其他人对该文件既不可读也不可写。

请注意 samba\_share 是 Samba 共享的名称,由上面展示的 smbclient -L remote_host 所返回。

现在,若你需要在系统启动时自动地使得 Samba 分享可用,可以向 /etc/fstab 文件添加一个像下面这样的有效条目:

//remote_host:/samba_share /local/directory cifs options 0 0

上面的变量 remote\_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 Samba 共享时使用的一样。按照我们前面的例子中所给的定义,对应为:

//192.168.0.10/gacanepa /mnt/samba  cifs credentials=/root/smbcredentials,defaults 0 0

结论

在这篇文章中,我们已经解释了如何在 Linux 中设置 ACL,并讨论了如何在一个 RHEL 7 客户端上挂载 CIFS 和 NFS 网络共享。

我建议你去练习这些概念,甚至混合使用它们(试着在一个挂载的网络共享上设置 ACL),直至你感觉掌握了。假如你有问题或评论,请随时随意地使用下面的评论框来联系我们。另外,请随意通过你的社交网络分享这篇文章。


via: http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/

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

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

在本篇文章中,我们将讨论在 RHEL 7 中如何使用传统的工具来设置和配置本地系统存储,并介绍系统存储管理器(也称为 SSM),它将极大地简化上面的任务。

配置和加密系统存储

RHCSA: 配置和加密系统存储 – Part 6

请注意,我们将在这篇文章中展开这个话题,但由于该话题的宽泛性,我们将在下一期中继续介绍有关它的描述和使用。

在 RHEL 7 中创建和修改分区

在 RHEL 7 中, parted 是默认的用来处理分区的程序,且它允许你:

  • 展示当前的分区表
  • 操纵(扩大或缩小分区的大小)现有的分区
  • 利用空余的磁盘空间或额外的物理存储设备来创建分区

强烈建议你在试图增加一个新的分区或对一个现有分区进行更改前,你应当确保该设备上没有任何一个分区正在使用(umount /dev/分区),且假如你正使用设备的一部分来作为 swap 分区,在进行上面的操作期间,你需要将它禁用(swapoff -v /dev/分区) 。

实施上面的操作的最简单的方法是使用一个安装介质例如一个 RHEL 7 的 DVD 或 USB 安装盘以急救模式启动 RHEL(TroubleshootingRescue a Red Hat Enterprise Linux system),然后当让你选择一个选项来挂载现有的 Linux 安装时,选择“跳过”这个选项,接着你将看到一个命令行提示符,在其中你可以像下图显示的那样开始键入与在一个未被使用的物理设备上创建一个正常的分区时所用的相同的命令。

RHEL 7 急救模式

RHEL 7 急救模式

要启动 parted,只需键入:

# parted /dev/sdb

其中 /dev/sdb 是你将要创建新分区所在的设备;然后键入 print 来显示当前设备的分区表:

创建新的分区

创建新的分区

正如你所看到的那样,在这个例子中,我们正在使用一个 5 GB 的虚拟驱动器。现在我们将要创建一个 4 GB 的主分区,然后将它格式化为 xfs 文件系统,它是 RHEL 7 中默认的文件系统。

你可以从一系列的文件系统中进行选择。你将需要使用 mkpart 来手动地创建分区,接着和平常一样,用 mkfs.类型 来对分区进行格式化,因为 mkpart 并不支持许多现代的文件系统的到即开即用。

在下面的例子中,我们将为设备设定一个标记,然后在 /dev/sdb 上创建一个主分区 (p),它从设备的 0% 开始,并在 4000MB(4 GB) 处结束。

在 Linux 中设定分区名称

标记分区的名称

接下来,我们将把分区格式化为 xfs 文件系统,然后再次打印出分区表,以此来确保更改已被应用。

# mkfs.xfs /dev/sdb1
# parted /dev/sdb print

在 Linux 中格式化分区

格式化分区为 XFS 文件系统

对于旧一点的文件系统,在 parted 中你可以使用 resize 命令来改变分区的大小。不幸的是,这只适用于 ext2, fat16, fat32, hfs, linux-swap, 和 reiserfs (若 libreiserfs 已被安装)。

因此,改变分区大小的唯一方式是删除它然后再创建它(所以,确保你对你的数据做了完整的备份!)。毫无疑问,在 RHEL 7 中默认的分区方案是基于 LVM 的。

使用 parted 来移除一个分区,可以用:

# parted /dev/sdb print
# parted /dev/sdb rm 1

在 Linux 中移除分区

移除或删除分区

逻辑卷管理(LVM)

一旦一个磁盘被分好了分区,再去更改分区的大小就是一件困难或冒险的事了。基于这个原因,假如我们计划在我们的系统上对分区的大小进行更改,我们应当考虑使用 LVM 的可能性,而不是使用传统的分区系统。这样多个物理设备可以组成一个逻辑组,以此来存放任意数目的逻辑卷,而逻辑卷的增大或减少不会带来任何麻烦。

简单来说,你会发现下面的示意图对记住 LVM 的基础架构或许有用。

LVM 的基本架构

LVM 的基本架构

创建物理卷,卷组和逻辑卷

遵循下面的步骤是为了使用传统的卷管理工具来设置 LVM。由于你可以通过阅读这个网站上的 LVM 系列来扩展这个话题,我将只是概要的介绍设置 LVM 的基本步骤,然后与使用 SSM 来实现相同功能做个比较。

: 我们将使用整个磁盘 /dev/sdb/dev/sdc 来作为物理卷(PV),但是否执行相同的操作完全取决于你。

1. 使用 /dev/sdb 和 /dev/sdc 中 100% 的可用磁盘空间来创建分区 /dev/sdb1/dev/sdc1

# parted /dev/sdb print
# parted /dev/sdc print

创建新分区

创建新分区

2. 分别在 /dev/sdb1 和 /dev/sdc1 上共创建 2 个物理卷。

# pvcreate /dev/sdb1
# pvcreate /dev/sdc1

创建两个物理卷

创建两个物理卷

记住,你可以使用 pvdisplay /dev/sd{b,c}1 来显示有关新建的物理卷的信息。

3. 在上一步中创建的物理卷之上创建一个卷组(VG):

# vgcreate tecmint_vg /dev/sd{b,c}1

在 Linux 中创建卷组

创建卷组

记住,你可使用 vgdisplay tecmint\_vg 来显示有关新建的卷组的信息。

4. 像下面那样,在卷组 tecmint\_vg 之上创建 3 个逻辑卷(LV):

# lvcreate -L 3G -n vol01_docs tecmint_vg       [vol01_docs → 3 GB]
# lvcreate -L 1G -n vol02_logs tecmint_vg       [vol02_logs → 1 GB]
# lvcreate -l 100%FREE -n vol03_homes tecmint_vg    [vol03_homes → 6 GB]

在 LVM 中创建逻辑卷

创建逻辑卷

记住,你可以使用 lvdisplay tecmintvg 来显示有关在 tecmintvg 之上新建的逻辑卷的信息。

5. 格式化每个逻辑卷为 xfs 文件系统格式(假如你计划在以后将要缩小卷的大小,请别使用 xfs 文件系统格式!):

# mkfs.xfs /dev/tecmint_vg/vol01_docs
# mkfs.xfs /dev/tecmint_vg/vol02_logs
# mkfs.xfs /dev/tecmint_vg/vol03_homes

6. 最后,挂载它们:

# mount /dev/tecmint_vg/vol01_docs /mnt/docs
# mount /dev/tecmint_vg/vol02_logs /mnt/logs
# mount /dev/tecmint_vg/vol03_homes /mnt/homes

移除逻辑卷,卷组和物理卷

7.现在我们将进行与刚才相反的操作并移除逻辑卷、卷组和物理卷:

# lvremove /dev/tecmint_vg/vol01_docs
# lvremove /dev/tecmint_vg/vol02_logs
# lvremove /dev/tecmint_vg/vol03_homes
# vgremove /dev/tecmint_vg
# pvremove /dev/sd{b,c}1

8. 现在,让我们来安装 SSM,我们将看到如何只用一步就完成上面所有的操作!

# yum update && yum install system-storage-manager

我们将和上面一样,使用相同的名称和大小:

# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 /mnt/docs /dev/sd{b,c}1
# ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 /mnt/logs /dev/sd{b,c}1
# ssm create -n vol03_homes -p tecmint_vg --fstype ext4 /mnt/homes /dev/sd{b,c}1

是的! SSM 可以让你:

  • 初始化块设备来作为物理卷
  • 创建一个卷组
  • 创建逻辑卷
  • 格式化逻辑卷,以及
  • 只使用一个命令来挂载它们

9. 现在,我们可以使用下面的命令来展示有关物理卷、卷组或逻辑卷的信息:

# ssm list dev
# ssm list pool
# ssm list vol

检查有关物理卷、卷组或逻辑卷的信息

检查有关物理卷、卷组或逻辑卷的信息

10. 正如我们知道的那样, LVM 的一个显著的特点是可以在不停机的情况下更改(增大或缩小)逻辑卷的大小:

假定在 vol02logs 上我们用尽了空间,而 vol03homes 还留有足够的空间。我们将把 vol03homes 的大小调整为 4 GB,并使用剩余的空间来扩展 vol02logs:

# ssm resize -s 4G /dev/tecmint_vg/vol03_homes

再次运行 ssm list pool,并记录 tecmint\_vg 中的剩余空间的大小:

查看卷的大小

查看卷的大小

然后执行:

# ssm resize -s+1.99 /dev/tecmint_vg/vol02_logs

: 在 -s 后的加号暗示特定值应该被加到当前值上。

11. 使用 ssm 来移除逻辑卷和卷组也更加简单,只需使用:

# ssm remove tecmint_vg

这个命令将返回一个提示,询问你是否确认删除卷组和它所包含的逻辑卷:

移除逻辑卷和卷组

移除逻辑卷和卷组

管理加密的卷

SSM 也给系统管理员提供了为新的或现存的卷加密的能力。首先,你将需要安装 cryptsetup 软件包:

# yum update && yum install cryptsetup

然后写出下面的命令来创建一个加密卷,你将被要求输入一个密码来增强安全性:

# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/docs /dev/sd{b,c}1
# ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/logs /dev/sd{b,c}1
# ssm create -n vol03_homes -p tecmint_vg --fstype ext4 --encrypt luks /mnt/homes /dev/sd{b,c}1

我们的下一个任务是往 /etc/fstab 中添加条目来让这些逻辑卷在启动时可用,而不是使用设备识别编号(/dev/something)。

我们将使用每个逻辑卷的 UUID (使得当我们添加其他的逻辑卷或设备后,我们的设备仍然可以被唯一的标记),而我们可以使用 blkid 应用来找到它们的 UUID:

# blkid -o value UUID /dev/tecmint_vg/vol01_docs
# blkid -o value UUID /dev/tecmint_vg/vol02_logs
# blkid -o value UUID /dev/tecmint_vg/vol03_homes

在我们的例子中:

找到逻辑卷的 UUID

找到逻辑卷的 UUID

接着,使用下面的内容来创建 /etc/crypttab 文件(请更改 UUID 来适用于你的设置):

docs UUID=ba77d113-f849-4ddf-8048-13860399fca8 none
logs UUID=58f89c5a-f694-4443-83d6-2e83878e30e4 none
homes UUID=92245af6-3f38-4e07-8dd8-787f4690d7ac none

然后在 /etc/fstab 中添加如下的条目。请注意到 devicename (/dev/mapper/devicename) 是出现在 /etc/crypttab 中第一列的映射标识:

# Logical volume vol01_docs:
/dev/mapper/docs        /mnt/docs       ext4    defaults        0       2
# Logical volume vol02_logs
/dev/mapper/logs        /mnt/logs       ext4    defaults        0       2
# Logical volume vol03_homes
/dev/mapper/homes       /mnt/homes      ext4    defaults        0       2

现在重启(systemctl reboot),则你将被要求为每个逻辑卷输入密码。随后,你可以通过检查相应的挂载点来确保挂载操作是否成功:

确保逻辑卷挂载点

确保逻辑卷挂载点

总结

在这篇教程中,我们开始探索如何使用传统的卷管理工具和 SSM 来设置和配置系统存储,SSM 也在一个软件包中集成了文件系统和加密功能。这使得对于任何系统管理员来说,SSM 是一个非常有价值的工具。

假如你有任何的问题或评论,请让我们知晓 – 请随意使用下面的评论框来与我们保存联系!


via: http://www.tecmint.com/rhcsa-exam-create-format-resize-delete-and-encrypt-partitions-in-linux/

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

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

我们将概括和简要地复习从你按开机按钮来打开你的 RHEL 7 服务器到呈现出命令行界面的登录屏幕之间所发生的所有事情,以此来作为这篇文章的开始。

RHEL 7 开机过程

Linux 开机过程

请注意:

  1. 相同的基本原则也可以应用到其他的 Linux 发行版本中,但可能需要较小的更改,并且
  2. 下面的描述并不是旨在给出开机过程的一个详尽的解释,而只是介绍一些基础的东西

Linux 开机过程

  1. 初始化 POST(加电自检)并执行硬件检查;
  2. 当 POST 完成后,系统的控制权将移交给启动管理器的 第一阶段 first stage ,它存储在一个硬盘的引导扇区(对于使用 BIOS 和 MBR 的旧式的系统而言)或存储在一个专门的 (U)EFI 分区上。
  3. 启动管理器的第一阶段完成后,接着进入启动管理器的 第二阶段 second stage ,通常大多数使用的是 GRUB(GRand Unified Boot Loader 的简称),它驻留在 /boot 中,然后开始加载内核和驻留在 RAM 中的初始化文件系统(被称为 initramfs,它包含执行必要操作所需要的程序和二进制文件,以此来最终挂载真实的根文件系统)。
  4. 接着展示了 闪屏 splash 过后,呈现在我们眼前的是类似下图的画面,它允许我们选择一个操作系统和内核来启动:

RHEL 7 开机屏幕

启动菜单屏幕

  1. 内核会对接入到系统的硬件进行设置,当根文件系统被挂载后,接着便启动 PID 为 1 的进程,这个进程将开始初始化其他的进程并最终呈现给我们一个登录提示符界面。

注意:假如我们想在启动后查看这些信息,我们可以使用 dmesg 命令,并使用这个系列里的上一篇文章中介绍过的工具(注:即 grep)来过滤它的输出。

登录屏幕和进程的 PID

登录屏幕和进程的 PID

在上面的例子中,我们使用了大家熟知的 ps 命令来显示在系统启动过程中的一系列当前进程的信息,它们的父进程(或者换句话说,就是那个开启这些进程的进程)为 systemd(大多数现代的 Linux 发行版本已经切换到的系统和服务管理器):

# ps -o ppid,pid,uname,comm --ppid=1

记住 -o(为 -format 的简写)选项允许你以一个自定义的格式来显示 ps 的输出,以此来满足你的需求;这个自定义格式使用 man ps 里 STANDARD FORMAT SPECIFIERS 一节中的特定关键词。

另一个你想自定义 ps 的输出而不是使用其默认输出的情形是:当你需要找到引起 CPU 或内存消耗过多的那些进程,并按照下列方式来对它们进行排序时:

# ps aux --sort=+pcpu              # 以 %CPU 来排序(增序)
# ps aux --sort=-pcpu              # 以 %CPU 来排序(降序)
# ps aux --sort=+pmem              # 以 %MEM 来排序(增序)
# ps aux --sort=-pmem              # 以 %MEM 来排序(降序)
# ps aux --sort=+pcpu,-pmem        # 结合 %CPU (增序) 和 %MEM (降序)来排列

https://img.linux.net.cn/data/attachment/album/201509/18/143623k9xzqohboobbbhbv.png

自定义 ps 命令的输出

systemd 的一个介绍

在 Linux 世界中,很少有能比在主流的 Linux 发行版本中采用 systemd 引起更多的争论的决定。systemd 的倡导者根据以下事实来表明其主要的优势:

  1. 在系统启动期间,systemd 允许并发地启动更多的进程(相比于先前的 SysVinit,SysVinit 似乎总是表现得更慢,因为它一个接一个地启动进程,检查一个进程是否依赖于另一个进程,然后等待守护进程启动才可以启动的更多的服务),并且
  2. 在一个运行着的系统中,它用作一个动态的资源管理器。这样在启动期间,当一个服务被需要时,才启动它(以此来避免消耗系统资源)而不是在没有一个合理的原因的情况下启动额外的服务。
  3. 向后兼容 sysvinit 的脚本。

另外请阅读: 'init' 和 'systemd' 背后的故事

systemd 由 systemctl 工具控制,假如你了解 SysVinit,你将会对以下的内容感到熟悉:

  • service 工具,在旧一点的系统中,它被用来管理 SysVinit 脚本,以及
  • chkconfig 工具,为系统服务升级和查询运行级别信息
  • shutdown 你一定使用过几次来重启或关闭一个运行的系统。

下面的表格展示了使用传统的工具和 systemctl 之间的相似之处:

旧式工具Systemctl 等价命令描述
service name startsystemctl start name启动 name (这里 name 是一个服务)
service name stopsystemctl stop name停止 name
service name condrestartsystemctl try-restart name重启 name (如果它已经运行了)
service name restartsystemctl restart name重启 name
service name reloadsystemctl reload name重载 name 的配置
service name statussystemctl status name显示 name 的当前状态
service - status-allsystemctl显示当前所有服务的状态
chkconfig name onsystemctl enable name通过一个特定的单元文件,让 name 可以在系统启动时运行(这个文件是一个符号链接)。启用或禁用一个启动时的进程,实际上是增加或移除一个到 /etc/systemd/system 目录中的符号链接。
chkconfig name offsystemctl disable name通过一个特定的单元文件,让 name 可以在系统启动时禁止运行(这个文件是一个符号链接)。
chkconfig -list namesystemctl is-enabled name确定 name (一个特定的服务)当前是否启用。
chkconfig - listsystemctl - type=service显示所有的服务及其是否启用或禁用。
shutdown -h nowsystemctl poweroff关机
shutdown -r nowsystemctl reboot重启系统

systemd 也引进了单元(unit)(它可能是一个服务,一个挂载点,一个设备或者一个网络套接字)和目标(target)(它们定义了 systemd 如何去管理和同时开启几个相关的进程,可以认为它们与在基于 SysVinit 的系统中的运行级别等价,尽管事实上它们并不等价)的概念。

总结归纳

其他与进程管理相关,但并不仅限于下面所列的功能的任务有:

1. 在考虑到系统资源的使用上,调整一个进程的执行优先级:

这是通过 renice 工具来完成的,它可以改变一个或多个正在运行着的进程的调度优先级。简单来说,调度优先级是一个允许内核(当前只支持 >= 2.6 的版本)根据某个给定进程被分配的执行优先级(即友善度(niceness),从 -20 到 19)来为其分配系统资源的功能。

renice 的基本语法如下:

# renice [-n] priority [-gpu] identifier

在上面的通用命令中,第一个参数是将要使用的优先级数值,而另一个参数可以是进程 ID(这是默认的设定),进程组 ID,用户 ID 或者用户名。一个常规的用户(即除 root 以外的用户)只可以更改他或她所拥有的进程的调度优先级,并且只能增加友善度的层次(这意味着占用更少的系统资源)。

在 Linux 中调整进程的优先级

进程调度优先级

2. 按照需要杀死一个进程(或终止其正常执行):

更精确地说,杀死一个进程指的是通过 kill 或 pkill 命令给该进程发送一个信号,让它优雅地(SIGTERM=15)或立即(SIGKILL=9)结束它的执行。

这两个工具的不同之处在于前一个被用来终止一个特定的进程或一个进程组,而后一个则允许你通过进程的名称和其他属性,执行相同的动作。

另外, pkill 与 pgrep 相捆绑,pgrep 提供将受符合的进程的 PID 给 pkill 来使用。例如,在运行下面的命令之前:

# pkill -u gacanepa

查看一眼由 gacanepa 所拥有的 PID 或许会带来点帮助:

# pgrep -l -u gacanepa

找到用户拥有的 PID

找到用户拥有的 PID

默认情况下,kill 和 pkiill 都发送 SIGTERM 信号给进程,如我们上面提到的那样,这个信号可以被忽略(即该进程可能会终止其自身的执行,也可能不终止),所以当你因一个合理的理由要真正地停止一个运行着的进程,则你将需要在命令行中带上特定的 SIGKILL 信号:

# kill -9 identifier               # 杀死一个进程或一个进程组
# kill -s SIGNAL identifier        # 同上
# pkill -s SIGNAL identifier       # 通过名称或其他属性来杀死一个进程

结论

在这篇文章中,我们解释了在 RHEL 7 系统中,有关开机启动过程的基本知识,并分析了一些可用的工具来帮助你通过使用一般的程序和 systemd 特有的命令来管理进程。

请注意,这个列表并不旨在涵盖有关这个话题的所有花哨的工具,请随意使用下面的评论栏来添加你自已钟爱的工具和命令。同时欢迎你的提问和其他的评论。


via: http://www.tecmint.com/rhcsa-exam-boot-process-and-process-management/

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

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

作为系统管理员的日常职责的一部分,每个系统管理员都必须处理文本文件,这包括编辑已有文件(大多可能是配置文件),或创建新的文件。有这样一个说法,假如你想在 Linux 世界中挑起一场圣战,你可以询问系统管理员们,什么是他们最喜爱的编辑器以及为什么。在这篇文章中,我们并不打算那样做,但我们将向你呈现一些技巧,这些技巧对使用两款在 RHEL 7 中最为常用的文本编辑器: nano(由于其简单和易用,特别是对于新手来说)和 vi/m(由于其自身的几个特色使得它不仅仅是一个简单的编辑器)来说都大有裨益。我确信你可以找到更多的理由来使用其中的一个或另一个,或许其他的一些编辑器如 emacs 或 pico。这完全取决于你自己。

学习 Nano 和 vi 编辑器

RHCSA: 使用 Nano 和 Vim 编辑文本文件 – Part 4

使用 Nano 编辑器来编辑文件

要启动 nano,你可以在命令提示符下输入 nano,或可选地跟上一个文件名(在这种情况下,若文件存在,它将在编辑模式中被打开)。若文件不存在,或我们省略了文件名, nano 也将在编辑模式下开启,但将为我们开启一个空白屏以便开始输入:

Nano 编辑器

Nano 编辑器

正如你在上一张图片中所见的那样, nano 在屏幕的底部呈现出一些可以通过指定的快捷键来触发的功能(^,即插入记号,代指 Ctrl 键)。它们中的一些是:

  • Ctrl + G: 触发一个帮助菜单,带有一个关于功能和相应的描述的完整列表;

Nano 编辑器帮助菜单

Nano 编辑器帮助菜单

  • Ctrl + O: 保存更改到一个文件。它可以让你用一个与源文件相同或不同的名称来保存该文件,然后按 Enter 键来确认。

Nano 编辑器保存更改模式

Nano 编辑器的保存更改模式

  • Ctrl + X: 离开当前文件,假如更改没有被保存,则它们将被丢弃;
  • Ctrl + R: 通过指定一个完整的文件路径,让你选择一个文件来将该文件的内容插入到当前文件中;

Nano: 插入文件内容到主文件中

Nano: 插入文件内容到主文件中

上图的操作将把 /etc/passwd 的内容插入到当前文件中。

  • Ctrl + K: 剪切当前行;
  • Ctrl + U: 粘贴;
  • Ctrl + C: 取消当前的操作并返回先前的屏幕;

为了轻松地在打开的文件中浏览, nano 提供了下面的功能:

  • Ctrl + F 和 Ctrl + B 分别先前或向后移动光标;而 Ctrl + P 和 Ctrl + N 则分别向上或向下移动一行,功能与箭头键相同;
  • Ctrl + space 和 Alt + space 分别向前或向后移动一个单词;

最后,

  • 假如你想将光标移动到文档中的特定位置,使用 Ctrl + \_ (下划线) 并接着输入 X,Y 将准确地带你到 第 X 行,第 Y 列。

在 nano 中定位到具体的行,列

在 nano 中定位到具体的行和列

上面的例子将带你到当前文档的第 15 行,第 14 列。

假如你可以回忆起你早期的 Linux 岁月,特别是当你刚从 Windows 迁移到 Linux 中,你就可能会同意:对于一个新手来说,使用 nano 来开始学习是最好的方式。

使用 Vim 编辑器来编辑文件

Vim 是 vi 的加强版本,它是 Linux 中一个著名的文本编辑器,可在所有兼容 POSIX 的 *nix 系统中获取到,例如在 RHEL 7 中。假如你有机会并可以安装 Vim,请继续;假如不能,这篇文章中的大多数(若不是全部)的提示也应该可以正常工作。

Vim 的一个出众的特点是可以在多个不同的模式中进行操作:

  • 命令模式 Command Mode 将允许你在文件中跳转和输入命令,这些命令是由一个或多个字母组成的简洁且大小写敏感的组合。假如你想重复执行某个命令特定次数,你可以在这个命令前加上需要重复的次数(这个规则只有极少数例外)。例如, yy(或 Y,yank 的缩写)可以复制整个当前行,而 4yy(或 4Y)则复制整个从当前行到接下来的 3 行(总共 4 行)。
  • 我们总是可以通过敲击 Esc 键来进入命令模式(无论我们正工作在哪个模式下)。
  • 末行模式 Ex Mode 中,你可以操作文件(包括保存当前文件和运行外部的程序或命令)。要进入末行模式,你必须从命令模式中(换言之,输入 Esc + :)输入一个冒号(:),再直接跟上你想使用的末行模式命令的名称。
  • 对于 插入模式 Insert Mode ,可以输入字母 i 进入,然后只需要输入文字即可。大多数的击键结果都将出现在屏幕中的文本中。

现在,让我们看看如何在 vim 中执行在上一节列举的针对 nano 的相同的操作。不要忘记敲击 Enter 键来确认 vim 命令。

为了从命令行中获取 vim 的完整手册,在命令模式下键入 :help 并敲击 Enter 键:

vim 编辑器帮助菜单

vim 编辑器帮助菜单

上面的部分呈现出一个内容列表,这些定义的小节则描述了 Vim 的特定话题。要浏览某一个小节,可以将光标放到它的上面,然后按 Ctrl + ] (闭方括号)。注意,底部的小节展示的是当前文件的内容。

1、 要保存更改到文件,在命令模式中运行下面命令中的任意一个,就可以达到这个目的:

:wq!
:x!
ZZ (是的,两个 ZZ,前面无需添加冒号)

2、 要离开并丢弃更改,使用 :q!。这个命令也将允许你离开上面描述过的帮助菜单,并返回到命令模式中的当前文件。

3、 剪切 N 行:在命令模式中键入 Ndd

4、 复制 M 行:在命令模式中键入 Myy

5、 粘贴先前剪贴或复制过的行:在命令模式中按 P键。

6、 要插入另一个文件的内容到当前文件:

:r filename

例如,插入 /etc/fstab 的内容,可以这样做:

在 vi 编辑器中插入文件的内容

在 vi 编辑器中插入文件的内容

7、 插入一个命令的输出到当前文档:

:r! command

例如,要在光标所在的当前位置后面插入日期和时间:

在 vi 编辑器中插入时间和日期

在 vi 编辑器中插入时间和日期

在另一篇我写的文章中,(LFCS 系列(二)),我更加详细地解释了在 vim 中可用的键盘快捷键和功能。或许你可以参考那个教程来查看如何使用这个强大的文本编辑器的更深入的例子。

使用 grep 和正则表达式来分析文本

到现在为止,你已经学习了如何使用 nano 或 vim 创建和编辑文件。打个比方说,假如你成为了一个文本编辑器忍者 – 那又怎样呢? 在其他事情上,你也需要知道如何在文本中搜索正则表达式。

正则表达式(也称为 "regex" 或 "regexp") 是一种识别一个特定文本字符串或模式的方式,使得一个程序可以将这个模式和任意的文本字符串相比较。尽管利用 grep 来使用正则表达式值得用一整篇文章来描述,这里就让我们复习一些基本的知识:

1、 最简单的正则表达式是一个由数字和字母构成的字符串(例如,单词 "svm") ,或者两个(在使用两个字符串时,你可以使用 |(或) 操作符):

# grep -Ei 'svm|vmx' /proc/cpuinfo

上面命令的输出结果中若有这两个字符串之一的出现,则标志着你的处理器支持虚拟化:

正则表达式示例

正则表达式示例

2、 第二种正则表达式是一个范围列表,由方括号包裹。

例如, c[aeiou]t 匹配字符串 cat、cet、cit、cot 和 cut,而 [a-z][0-9] 则相应地匹配小写字母或十进制数字。假如你想重复正则表达式 X 次,在正则表达式的后面立即输入 {X}即可。

例如,让我们从 /etc/fstab 中析出存储设备的 UUID:

# grep -Ei '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}' -o /etc/fstab

在 Linux 中从一个文件中析出字符串

从一个文件中析出字符串

方括号中的第一个表达式 [0-9a-f] 被用来表示小写的十六进制字符,{8}是一个量词,暗示前面匹配的字符串应该重复的次数(在一个 UUID 中的开头序列是一个 8 个字符长的十六进制字符串)。

在圆括号中,量词 {4}和连字符暗示下一个序列是一个 4 个字符长的十六进制字符串,接着的量词 ({3})表示前面的表达式要重复 3 次。

最后,在 UUID 中的最后一个 12 个字符长的十六进制字符串可以由 [0-9a-f]{12} 取得, -o 选项表示只打印出在 /etc/fstab中匹配行中的匹配的(非空)部分。

3、 POSIX 字符类

字符类匹配 …
[:alnum:]任意字母或数字 [a-zA-Z0-9]
[:alpha:]任意字母 [a-zA-Z]
[:blank:]空格或制表符
[:cntrl:]任意控制字符 (ASCII 码的 0 至 32)
[:digit:]任意数字 [0-9]
[:graph:]任意可见字符
[:lower:]任意小写字母 [a-z]
[:print:]任意非控制字符
[:space:]任意空格
[:punct:]任意标点字符
[:upper:]任意大写字母 [A-Z]
[:xdigit:]任意十六进制数字 [0-9a-fA-F]
[:word:]任意字母,数字和下划线 [a-zA-Z0-9\_]

例如,我们可能会对查找已添加到我们系统中给真实用户的 UID 和 GID(参考“RHCSA 系列(二): 如何进行文件和目录管理”来回忆起这些知识)感兴趣。那么,我们将在 /etc/passwd 文件中查找 4 个字符长的序列:

# grep -Ei [[:digit:]]{4} /etc/passwd

在文件中查找一个字符串

在文件中查找一个字符串

上面的示例可能不是真实世界中使用正则表达式的最好案例,但它清晰地启发了我们如何使用 POSIX 字符类来使用 grep 分析文本。

总结

在这篇文章中,我们已经提供了一些技巧来最大地利用针对命令行用户的两个文本编辑器 nano 和 vim,这两个工具都有相关的扩展文档可供阅读,你可以分别查询它们的官方网站(链接在下面给出)以及使用“RHCSA 系列(一): 回顾基础命令及系统文档”中给出的建议。

参考文件链接


via: http://www.tecmint.com/rhcsa-exam-how-to-use-nano-vi-editors/

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

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