《Linux就该这么学》读书笔记


开源文档地址: https://www.linuxprobe.com/docs/LinuxProbe.pdf

第一章,部署虚拟环境安装 Linux 系统

直接用阿里云学的,这个就不看啦。

如果您刚刚接手了一台 Linux 系统,要先确定是否为 RHEL 7 系统。如果是,然后再 进行下面的操作。 

[root@liruilong ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@liruilong ~]#


RPM(红帽软件包管理器) 

RPM 机制则为解决这些问题而设计的。RPM 有点像 Windows 系统中的控制面板,会建 立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系.

Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安 装到系统。

 

第2章新手必须掌握的Linux命令

常用系统工作命令

1.echo 命令 

echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。

2.date 命令 

date 命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。 只需在强大的 date 命令中输入以“+”号开头的参数

[root@liruilong ~]# date "+%Y-%m-%d %H:%M:%S"
2020-11-06 22:17:15
[root@liruilong ~]# date $DATEFORM
date: extra operand ‘%H:%M:%S’
Try 'date --help' for more information.
[root@liruilong ~]# DATEFORM="+%Y-%m-%d-%H:%M:%S"
[root@liruilong ~]# date $DATEFORM
2020-11-06-22:18:15
[root@liruilong ~]# 

3.reboot 命令 

reboot 命令用于重启系统,其格式为 reboot。 由于重启计算机这种操作会涉及硬件资源的管理权限,因此默认只能使用 root 管理员来 重启

 4.poweroff 命令 

poweroff 命令用于关闭系统,其格式为 poweroff。 该命令与 reboot 命令相同,都会涉及硬件资源的管理权限,因此默认只有 root 管理员才 可以关闭电脑,

[root@liruilong ~]# echo liruilong.com
liruilong.com
[root@liruilong ~]# echo $shell

[root@liruilong ~]# echo $SHELL
/bin/bash
[root@liruilong ~]#

5.wget 命令 

wget 命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。 
 

6.ps 命令 

ps 命令用于查看系统中的进程状态,格式为“ps [参数]”。 

在 Linux 系统中,有 5 种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,

  •  R(运行):进程正在运行或在运行队列中等待。
  •  S(中断) :进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该   状态。
  •  D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
  • Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数 后将进程释放。
  •  T(停止):进程收到停止信号后停止运行。

当执行 ps aux 命令后通常会看到如表进程状态,

7.top 命令 

top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。 top 命令相当强大,能够动态地查看系统运维状态,完全将它看作 Linux 中的“强化版的 Windows 任务管理器”。

8.pidof 命令 

pidof 命令用于查询某个指定服务进程的 PID 值,格式为“pidof [参数] [服务名称]”。 每个进程的进程号码值(PID)是唯一的,因此可以通过 PID 来区分不同的进程。例如, 可以使用如下命令来查询本机上 sshd 服务程序的 PID: 
 

[root@liruilong]# pidof sshd
2156 

9.kill 命令 

kill 命令用于终止某个指定 PID 的服务进程格式为“kill [参数] [进程 PID]”。 接下来,我们使用 kill 命令把上面用 pidof 命令查询到的 PID 所代表的进程终止掉,其命 令如下所示。这种操作的效果等同于强制停止 sshd 服务。 

10.killall 命令 

killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [进 程名称]”。 通常来讲,复杂软件的服务程序会有多个进程协同为用户提供服务,如果逐个去结束这 些进程会比较麻烦,此时可以使用 killall 命令来批量结束某个服务程序带有的全部进程。下 面以 httpd 服务程序为例,来结束其全部进程。由于 RHEL7 系统默认没有安装 httpd 服务程序, 因此大家此时只需看操作过程和输出结果即可,等学习了相关内容之后再来实践

1.ifconfig 命令 

ifconfig 命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]” 。 使用 ifconfig 命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就 是网卡名称、inet 参数后面的 IP 地址、ether 参数后面的网卡物理地址(又称为 MAC 地址), 以及 RX、TX 的接收数据包与发送数据包的个数及累计流量(即下面加粗的信息内容)

[root@liruilong ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.57.70  netmask 255.255.240.0  broadcast 172.17.63.255
        ether 00:16:3e:12:20:cb  txqueuelen 1000  (Ethernet)
        RX packets 122763  bytes 51583964 (49.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 90921  bytes 15046271 (14.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@liruilong ~]# uname -a
Linux liruilong 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@liruilong ~]#

2.uname 命令 

uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。 在使用 uname 命令时,一般会固定搭配上-a 参数来完整地查看当前系统的内核名称、主 机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统 名称等信息。 
  

3.uptime 命令 

uptime 用于查看系统的负载信息,格式为 uptime。 uptime 命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以 及平均负载值等信息。平均负载值指的是系统在近 1 分钟、5 分钟、15 分钟内的压力情 况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要 超过 5。 


  4.free 命令 

free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。 为了保证 Linux 系统不会因资源耗尽而突然宕机,运维人员需要时刻关注内存的使用量。 在使用 free 命令时,可以结合使用-h 参数以更人性化的方式输出当前内存的实时使用量信息。 表 2-8 所示为在刘遄老师的电脑上执行 free -h 命令之后的输出信息。需要注意的是,输出信 息中的中文注释是作者自行添加的内容,实际输出时没有相应的参数解释。 

 5.who 命令 

who 用于查看当前登入主机的用户终端信息,格式为“who [参数]”。 这三个简单的字母可以快速显示出所有正在登录本机的用户的名称以及他们正在开启的 终端信息。表 2-9 所示为执行 who 命令后的结果

[root@liruilong ~]# who
root     tty1         2020-07-05 22:13
root     pts/0        2020-10-09 04:17 (111.194.50.179)
root     pts/1        2020-10-09 04:59 (111.194.50.179)
[root@liruilong ~]#

6.last 命令 

last 命令用于查看所有系统的登录记录,格式为“last [参数]”。 使用 last 命令可以查看本机的登录记录。但是,由于这些信息都是以日志文件的形式保 存在系统中,因此黑客可以很容易地对内容进行篡改。千万不要单纯以该命令的输出信息而 判断系统有无被恶意入侵! 
 7.history 命令 
history 命令用于显示历史执行过的命令,格式为“history [-c]”。 history 命令应该是作者喜欢的命令。执行 history 命令能显示出当前用户在本地计算机 中执行过的近 1000 条命令记录。如果觉得 1000 不够用,还可以自定义/etc/profile 文件中的 HISTSIZE 变量值。在使用 history 命令时,如果使用-c 参数则会清空所有的命令历史记录。 还可以使用“!编码数字”的方式来重复执行某一次的命令。总之,history 命令有很多有趣的 玩法等待您去开发。

2.6  文本文件编辑命令 

 1.cat 命令 

cat 命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”。 Linux 系统中有多个用于查看文本内容的命令,每个命令都有自己的特点,比如这个 cat 命令就是用于查看内容较少的纯文本文件的。cat 这个命令也很好记,

2.more 命令 

more 命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。 

3.head 命令 

head 命令用于查看纯文本文档的前 N 行,格式为“head [选项] [文件]”。 

[root@liruilong ~]# head nohup.out

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)

2020-02-29 22:25:39.873  INFO 20912 --- [           main] com.liruilong.hros.HrosApplication       : Starting HrosApplication v0.0.1-SNAPSHOT on liruilong with PID 20912 (/root/hros-0.0.1-SNAPSHOT.jar started by root in /root)

[root@liruilong ~]# tail nohup.out
2020-07-05 21:13:17.014  INFO 6470 --- [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats    : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 212 total, 1 closed abnormally (1 connect failure, 0 send limit, 28 transport error)], stompSubProtocol[processed CONNECT(210)-CONNECTED(210)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1929], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 460], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 1946024]

4.tail 命令 

tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail [选项] [文件]”。 只需要执行“tail -n 20 文件名”命令

tail 命令强悍的功能是可以持续刷新一个文件的内容,当想要实时 查看新日志文件时,这特别有用,此时的命令格式为“tail -f 文件名”:  

5.tr 命令 

tr 命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。 

6.wc 命令 

wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。 

7.stat 命令 

stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。 

[root@liruilong ~]# stat nohup.out
  File: ‘nohup.out’
  Size: 612547045       Blocks: 1196392    IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 132546      Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-10-11 08:49:04.564740893 +0800
Modify: 2020-07-05 21:54:05.297348682 +0800
Change: 2020-07-05 21:54:05.297348682 +0800
 Birth: -

8.cut 命令 

cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。

 9.diff 命令 

diff 命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。 

在使用 diff 命令时,不仅可以使用--brief 参数来确认两个文件是否不同,还可以使用-c 参数来详细比较出多个文件的差异之处,这绝对是判断文件是否被篡改的有力神器。例如, 先使用 cat 命令分别查看 diff_A.txt 和 diff_B.txt 文件的内容,然后进行比较:

1.touch 命令 

touch 命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。 

mkdir 命令 

mkdir 命令用于创建空白的目录,格式为“mkdir [选项] 目录”。 在 Linux 系统中,文件夹是常见的文件类型之一。除了能创建单个空白目录外,mkdir 命令还可以结合-p 参数来递归创建出具有嵌套叠层关系的文件目录。
  

3.cp 命令 

cp 命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。 大家对文件复制操作应该不陌生,在 Linux 系统中,复制操作具体分为 3 种情况: 

4.mv 命令 

mv 命令用于剪切文件或将文件重命名,格式为“mv [选项] 源文件 [目标路径|目标文件名]” 。
 剪切操作不同于复制操作,因为它会默认把源文件删除掉,只保留剪切后的文件。如果 在同一个目录中对一个文件进行剪切操作,其实也就是对其进行重命名:

5.rm 命令 

rm 命令用于删除文件或目录,格式为“rm [选项] 文件”。 在 Linux 系统中删除文件时,系统会默认向您询问是否要执行删除操作,如果不想总是 看到这种反复的确认信息,可在 rm 命令后跟上-f 参数来强制删除。另外,想要删除一个目录, 需要在 rm 命令后面一个-r 参数才可以,

6. dd 命令 

dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]” 。 

但在 Linux 系统中可以直接 使用 dd 命令来压制出光盘镜像文件,将它编程一个可立即使用的 iso 镜像:

[root@liruilong liruilong]# dd if=/dev/zero of=560_file count=1 bs=60M
1+0 records in
1+0 records out
62914560 bytes (63 MB) copied, 0.106262 s, 592 MB/s
[root@liruilong liruilong]# ls
560_file  liruilong.html  lirui.txt

[root@liruilong liruilong]# dd if=/dev/zero of=Demo.iso

下面举一个吃货的例子进行 解释。假设小明的饭量(即需求)是一个固定的值,用来盛饭的勺子的大小即 bs 块大小, 而用勺子盛饭的次数即 count 块个数。小明要想吃饱(满足需求),则需要在勺子大小(bs 块大小)与用勺子盛饭的次数(count 块个数)之间进行平衡。勺子越大,用勺子盛饭的次数 就越少。有上可见,bs 与 count 都是用来指定容量的大小,只要能满足需求,可随意组合搭 配方式。

7.file 命令 

file 命令用于查看文件的类型,格式为“file 文件名”。 在 Linux 系统中,由于文本、目录、设备等所有这些一切都统称为文件

[root@liruilong liruilong]# file 60_file
60_file: data
[root@liruilong liruilong]# file Demo.iso
Demo.iso: data
[root@liruilong liruilong]# file lirui.txt
lirui.txt: UTF-8 Unicode text, with very long lines
[root@liruilong liruilong]#

1.tar 命令 

tar 命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。 在Linux 系统中,常见的文件格式比较多,其中主要使用的是.tar 或.tar.gz 或.tar.bz2 格式,我 们不用担心格式太多而记不住,其实这些格式大部分都是由 tar 命令来生成的 

[root@liruilong ~]# tar -czvf etc.tar.gz /etc
tar: Removing leading `/' from member names

2.grep 命令 

grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为 “grep [选项] [文件]” 。 grep 命令的参数及其作用如表 2-15 所示

[root@liruilong ~]# grep -nv INFO  nohup.out

3.find 命令 

find 命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。 

课后习题:

  • .在 RHEL 7 系统及众多的 Linux 系统中,常使用的 Shell 终端是什么? 答:Bash(Bourne-Again SHell)解释器
  • .执行 Linux 系统命令时,添加参数的目的是什么? 答:为了让 Linux 系统命令能够更贴合用户的实际需求进行工作。 
  • .Linux 系统命令、命令参数及命令对象之间,普遍应该使用什么来间隔? 答:应该使用一个或多个空格进行间隔。 
  • .请写出用 echo 命令把 SHELL 变量值输出到屏幕终端的命令。 答:echo $SHELL。 
  • .简述 Linux 系统中 5 种进程的名称及含义。 答:在 Linux 系统中,有下面 5 种进程名称。 
    •   R(运行):进程正在运行或在运行队列中等待。
    •  S(中断) :进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
    •   D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
    •  Z(僵死) :进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数 后将进程释放。
    • T(停止):进程收到停止信号后停止运行。 
  •  .请尝试使用 Linux 系统命令关闭 PID 为 5529 的服务进程。 答:执行 kill 5529 命令即可;若知道服务的名称,则可以使用 killall 命令进行关闭。 
  • 7.使用 ifconfig 命令查看网络状态信息时,需要重点查看的 4 项信息分别是什么? 答:这 4 项重要信息分别是网卡名称、IP 地址、网卡物理地址以及 RX/TX 的收发流量数 据大小。 
    •  
      [root@liruilong ~]# ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 172.17.57.70  netmask 255.255.240.0  broadcast 172.17.63.255
              ether 00:16:3e:12:20:cb  txqueuelen 1000  (Ethernet)
              RX packets 251960  bytes 122897204 (117.2 MiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 184157  bytes 62783060 (59.8 MiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
      lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
              inet 127.0.0.1  netmask 255.0.0.0
              loop  txqueuelen 1  (Local Loopback)
              RX packets 10  bytes 528 (528.0 B)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 10  bytes 528 (528.0 B)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
  • 8.使用 uptime 命令查看系统负载时,对应的负载数值如果是 0.91、0.56、0.32,那么近 15 分钟内负载压力大的是哪个时间段? 答:通过负载数值可以看出,近 1 分钟内的负载压力是大的。 
  • 9.使用history 命令查看历史命令的执行记录时,命令前面的数字除了排序外还有什么用处? 答:还可以用“!数字”的命令格式重复执行某一次的命令记录,从而避免了重复输入较 长命令的麻烦。 
  •  
  • 10.若想查看的文件具有较长的内容,那么使用 cat、more、head、tail 中的哪个命令 合适? 答:文件内容较长,使用 more 命令;反之使用 cat 命令。 
  •  
  • 11.在使用 mkdir 命令创建有嵌套关系的目录时,应该加上什么参数呢?  答:应该加上-p 递归迭代参数,从而自动化创建有嵌套关系的目录。 
  • 12.在使用 rm 命令删除文件或目录时,可使用哪个参数来避免二次确认呢?  答:可使用-f 参数,这样即可无需二次确认。 
  •  
  • 13.若有一个名为 backup.tar.gz 的压缩包文件,那么解压的命令应该是什么?  答:应该用 tar 命令进行解压,执行 tar -xzvf backup.tar.gz 命令即可。 
  •  
  • 14.使用 grep 命令对某个文件进行关键词搜索时,若想要进行文件内容反选,应使用什么 参数? 答:可使用-v 参数来进行匹配内容的反向选择,即显示出不包含某个关键词的行。

第三章,管道符、重定向与环境变量 

简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到 屏幕的数据信息写入到指定文件中

[root@liruilong ~]# man bash > reame.txt 
[root@liruilong ~]# echo "加油" > reame.txt
-bash: $'ech\345\212\240\346\262\271': command not found
[root@liruilong ~]# echo "I am Liruilong Love sy" > reame.txt
[root@liruilong ~]# cat reame.txt
I am Liruilong Love sy
[root@liruilong ~]#
[root@liruilong ~]# echo "sunyu 不喜欢 我 " >> reame.txt
[root@liruilong ~]# cat reame.txt
I am Liruilong Love sy
sunyu 不喜欢 我

管道命令符 

其执行格式为“命令 A | 命令 B”。命令符的作用也 可以用一句话来概括“把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输 入”

[root@liruilong ~]# wwc -l <reame.txt
35
[root@liruilong ~]# more reame.txt  | wc -w
308

比如用翻页的形 式查看/etc 目录中的文件列表及属性信息

命令行的通配符 

 重要的环境变量 

[root@liruilong mongodb4]# export  PATH=/usr/local/mongodb4/bin:$PATH
[root@liruilong ~]# TEMP=/liruilong/loruilong/liruitong
[root@liruilong ~]# echo TEMP
TEMP
[root@liruilong ~]# echo $TEMP
/liruilong/loruilong/liruitong

1. 显示环境变量HOME

$ echo $HOME
/home/redbooks

2. 设置一个新的环境变量hello

$ export HELLO="Hello!"
$ echo $HELLO
Hello!

3. 使用env命令显示所有的环境变量

$ env
HOSTNAME=redbooks.safe.org
PVM_RSH=/usr/bin/rsh
Shell=/bin/bash
TERM=xterm
HISTSIZE=1000

4. 使用set命令显示所有本地定义的Shell变量

$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0

5. 使用unset命令来清除环境变量
set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:

$ export TEST="Test..." #增加一个环境变量TEST
$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test...
$ unset $TEST #删除环境变量TEST
$ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了

6. 使用readonly命令设置只读变量
如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

$ export TEST="Test..." #增加一个环境变量TEST
$ readonly TEST #将环境变量TEST设为只读
$ unset TEST #会发现此变量不能被删除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #会发现此也变量不能被修改
-bash: TEST: readonly variable


环境变量的设置位于/etc/profile文件
如果需要增加新的环境变量可以添加下属行

export path=$path:/path1:/path2:/pahtN

==============================================================
1.Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:

  • 1.1 永久的:需要修改配置文件,变量永久生效。
  • 1.2 临时的:使用export命令声明即可,变量在关闭shell时失效。

2.设置变量的三种方法

2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】

用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量

# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。

2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】

用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile

$ vi /home/guok/.bash.profile
添加如下内容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。


2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

3.环境变量的查看

3.1 使用echo命令查看单个环境变量。例如:

echo $PATH

3.2 使用env查看所有环境变量。例如:

env

3.3 使用set查看所有本地定义的环境变量。

unset可以删除指定的环境变量。

4.常用的环境变量

PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$

1.把 ls 命令的正常输出信息追加写入到 error.txt 文件中的命令是什么? 答:ls >> error.txt 
 
2.请简单概述管道符的作用。 答:把左面(前面)命令的输出值作为右面(后面)命令的输入值以便进一步处理信息。
 
 
3.Bash 解释器的通配符中,星号(*)代表几个字符? 答:零个或多个。 
 
4.PATH 变量的作用是什么? 答:设定解释器搜索所执行的命令的路径。 
 

5.使用什么命令可以把名为 LINUX 的一般变量转换成全局变量? 答:export LINUX。 

第四章 Vim 编辑器与 Shell 命令脚本 

 配置主机名称 

[root@liruilong /]# vim /etc/hostname
[root@liruilong /]#

 配置网卡信息 

在 RHEL 5、RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为 eth0,第 2 块网卡为 eth1;以此类推。而在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg 开始, 加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名变 化外也没有其他大的区别。 

第1步:首先切换到/etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)。

[root@liruilong /]# NETWORK=/etc/sysconfig/network-scripts/
[root@liruilong /]# ls $NETWORK
ifcfg-eth0   ifdown-ippp    ifdown-sit       ifup-bnep  ifup-plip    ifup-Team          network-functions-ipv6
ifcfg-lo     ifdown-ipv6    ifdown-Team      ifup-eth   ifup-plusb   ifup-TeamPort
ifdown       ifdown-isdn    ifdown-TeamPort  ifup-ib    ifup-post    ifup-tunnel
ifdown-bnep  ifdown-post    ifdown-tunnel    ifup-ippp  ifup-ppp     ifup-wireless
ifdown-eth   ifdown-ppp     ifup             ifup-ipv6  ifup-routes  init.ipv6-global
ifdown-ib    ifdown-routes  ifup-aliases     ifup-isdn  ifup-sit     network-functions
[root@liruilong /]#

第2步:使用 Vim 编辑器修改网卡文件 ifcfg-eno16777736,逐项写入下面的配置参数并 保存退出。由于每台设备的硬件及架构是不一样的,因此请读者使用 ifconfig 命令自行确认各 自网卡的默认名称

  • ¾ 设备类型:TYPE=Ethernet
  • ¾ 地址分配模式:BOOTPROTO=static
  • ¾ 网卡名称:NAME=eno16777736
  • ¾ 是否启动:ONBOOT=yes
  • ¾ IP 地址:IPADDR=192.168.10.10
  • ¾ 子网掩码:NETMASK=255.255.255.0
  • ¾网关地址:GATEWAY=192.168.10.1
  • ¾ DNS 地址:DNS1=192.168.10.1
[root@liruilong /]# vim $NETWORK/ifcfg-eth1
[root@liruilong /]#
[root@liruilong /]# cd $NETWORK
[root@liruilong network-scripts]# ls
ifcfg-eth0   ifdown-eth   ifdown-post    ifdown-TeamPort  ifup-eth   ifup-plip    ifup-sit       init.ipv6-global
ifcfg-eth1   ifdown-ib    ifdown-ppp     ifdown-tunnel    ifup-ib    ifup-plusb   ifup-Team      network-functions
ifcfg-lo     ifdown-ippp  ifdown-routes  ifup             ifup-ippp  ifup-post    ifup-TeamPort  network-functions-ipv6
ifdown       ifdown-ipv6  ifdown-sit     ifup-aliases     ifup-ipv6  ifup-ppp     ifup-tunnel
ifdown-bnep  ifdown-isdn  ifdown-Team    ifup-bnep        ifup-isdn  ifup-routes  ifup-wireless
[root@liruilong network-scripts]# cat ifcfg-eth1
TYPE=Ethernet
BOOTPRPOTO=static
NAME=en1demo_Liruilong
ONBOOT=no
IP=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1
d
[root@liruilong network-scripts]#

第3步:重启网络服务并测试网络是否联通。 进入到网卡配置文件所在的目录,然后编辑网卡配置文件,在其中填入下面的信息

执行重启网卡设备的命令(在正常情况下不会有提示信息),然后通过 ping 命令测试网络能否 联通。由于在 Linux 系统中 ping 命令不会自动终止,因此需要手动按下 Ctrl-c 键来强行结束进程。 

[root@liruilong network-scripts]# systemctl restart network
[root@liruilong network-scripts]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.57.70  netmask 255.255.240.0  broadcast 172.17.63.255
        ether 00:16:3e:12:20:cb  txqueuelen 1000  (Ethernet)
        RX packets 287708  bytes 128706099 (122.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 213179  bytes 76660947 (73.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 17  bytes 908 (908.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 908 (908.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@liruilong network-scripts]# ping 172.17.57.70
PING 172.17.57.70 (172.17.57.70) 56(84) bytes of data.
64 bytes from 172.17.57.70: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 172.17.57.70: icmp_seq=2 ttl=64 time=0.030 ms
64 bytes from 172.17.57.70: icmp_seq=3 ttl=64 time=0.031 ms
64 bytes from 172.17.57.70: icmp_seq=4 ttl=64 time=0.028 ms
64 bytes from 172.17.57.70: icmp_seq=5 ttl=64 time=0.039 ms
64 bytes from 172.17.57.70: icmp_seq=6 ttl=64 time=0.029 ms
64 bytes from 172.17.57.70: icmp_seq=7 ttl=64 time=0.029 ms
64 bytes from 172.17.57.70: icmp_seq=8 ttl=64 time=0.030 ms
64 bytes from 172.17.57.70: icmp_seq=9 ttl=64 time=0.030 ms
^C

 配置 Yum 软件仓库 

  • 第1步:进入到/etc/yum.repos.d/目录中(因为该目录存放着 Yum 软件仓库的配置文件)。
  • 第2步:使用 Vim 编辑器创建一个名为 rhel7.repo 的新配置文件(文件名称可随意,但后 缀必须为.repo),逐项写入下面加粗的配置参数并保存退出(不要写后面的中文注释)。
    •  [rhel-media] :Yum 软件仓库唯一标识符,避免与其他仓库冲突。
    • name=linuxprobe:Yum 软件仓库的名称描述,易于识别仓库用处。
    •  baseurl=file:///media/cdrom:提供的方式包括 FTP(ftp://..)、HTTP(http://..)、本地 (file:///..)。
    •  enabled=1:设置此源是否可用;1 为可用,0 为禁用。
    •  gpgcheck=1:设置此源是否校验文件;1 为校验,0 为不校验。
    •  gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校 验,那么请指定公钥文件地址。
  • 第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab 文件中。
  • 第4步:使用“yum install httpd -y”命令检查 Yum 软件仓库是否已经可用。 进入/etc/yum.repos.d 目录中后创建 Yum 配置文件: 
[root@liruilong ~]# YUM_CONFIG=/etc/yum.repos.d/
[root@liruilong ~]# ls $YUM_CONFIG
CentOS-Base.repo  epel.repo  mysql-community.repo  mysql-community-source.repo
[root@liruilong ~]# cd $YUM_CONFIG
[root@liruilong yum.repos.d]#

apt-get: command not found,这个的出现是因为系统的原因。

Linux系统分为两种:

  • 1.RedHat系列:Redhat、Centos、Fedora等
  • 2.Debian系列:Debian、Ubuntu等

RedHat系列的包管理工具是yum,Debian系列的包管理工具是apt-get

编写Shell脚本 

Shell 脚本命令的工作方式有两种:交互式和批处理。

  • 交互式(Interactive):用户每输入一条命令就立即执行。
  •  批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本 中诸多的命令。 在 Shell 脚本中不仅会用到前面学习过的很多 Linux 命令以及正则表达式、管道符、数据 流重定向等语法规则,还需要把内部功能模块化后通过逻辑语句进行处理,终形成日常所 见的 Shell 脚本。 
#!/bin/bash

echo "当前的脚本名称为 $0"
echo "总计有:$# 个参数进来,分别为:$*"
echo "第一个参数为:$1, 下雨了... sy 好想你"
~                                                 
[root@liruilong ~]# vim demo.sh
[root@liruilong ~]# sh demo.sh 
当前的脚本名称为 demo.sh
[root@liruilong ~]# vim demo.sh 
[root@liruilong ~]# vim demo.sh 
[root@liruilong ~]# bash demo.sh 
当前的脚本名称为 demo.sh
总计有:0 个参数进来,分别为:
第一个参数为:, 下雨了... sy 好想你
[root@liruilong ~]# ./demo.sh
-bash: ./demo.sh: Permission denied
[root@liruilong ~]# chmod u+x demo.sh 
[root@liruilong ~]# ./demo.sh
当前的脚本名称为 ./demo.sh
总计有:0 个参数进来,分别为:
第一个参数为:, 下雨了... sy 好想你
[root@liruilong ~]# 

判断用户的参数 :

。Shell 脚本中的条 件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。 条件测试语法的执行格式如图 4-16 所示。切记,条件表达式两边均应有一个空格。 

按照测试对象来划分,条件测试语句可以分为 4 种:

  •  文件测试语句;
  •  逻辑测试语句;
  •  整数值比较语句;
  • 字符串比较语句。

文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符

在 Shell 终端中

  1. 逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令
  2. 逻辑或它在 Linux 系统中的运算符号为||,表示当前面的 命令执行失败后才会执行它后面的命令

[root@liruilong ~]# [ -e /dev/cdrom ] && echo 'Ecist'
Ecist
[root@liruilong ~]# echo $USER
root
[root@liruilong ~]# [ $USER = root]  || 'user'
-bash: [: missing `]'
-bash: user: command not found

 

[root@liruilong ~]# [ 10 -gt 10 ]
[root@liruilong ~]# echo $?
1
[root@liruilong ~]# [ 10 -eg 10 ] && echo $?
-bash: [: -eg: binary operator expected
[root@liruilong ~]# [ 10 -eg 10 ]
-bash: [: -eg: binary operator expected
[root@liruilong ~]# echo $?
2
[root@liruilong ~]# [ 10 -eg 10 ]
-bash: [: -eg: binary operator expected
[root@liruilong ~]# [ 10 -eq 10 ]
[root@liruilong ~]# echo $?
0
[root@liruilong ~]#

  free 命令

它可以用来获取当前系统正在使用及可用的内存量信息。 接下来先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤 出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,后用 FreeMem=`语句`的方式把语句内执行的结果赋值给变量。 

[root@liruilong ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1839         786         137           0         916         892
Swap:             0           0           0
[root@liruilong ~]# free -m | grep Men:
[root@liruilong ~]# free -m | grep Mem:
Mem:           1839         786         136           0         916         891
[root@liruilong ~]# free -m | grep Mem: | awk '{pring $4}'
[root@liruilong ~]# free -m | grep Mem: | awk '{pring $6}'
[root@liruilong ~]# free -m | grep Mem: | awk '{pring $4}'
[root@liruilong ~]# FreeMem=`free -m | grep Mem: | awk '{pring $4}'`
[root@liruilong ~]# echo FreemMem
FreemMem
[root@liruilong ~]# echo $FreemMem

[root@liruilong ~]# [ $FreeMem -lt 1024 ] && echo "Insufficiient Memory"
-bash: [: -lt: unary operator expected
[root@liruilong ~]# [ $FreeMem -lt 1024 ] && echo "Insufficiient Memory"
-bash: [: -lt: unary operator expected

 

[root@liruilong ~]# echo $LANG
en_US.UTF-8
[root@liruilong ~]# [ $LANG != 'en.US' ] && echo 'Not en.US'
Not en.US
[root@liruilong ~]#

 流程控制语句 

if 条件测试语句 

[root@liruilong ~]# vim
[root@liruilong ~]# vim mkcdrow.sh
[root@liruilong ~]# sh m
mkcdrow.sh                                  mysql57-community-release-el7-8.noarch.rpm
mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz
[root@liruilong ~]# sh mkcdrow.sh
[root@liruilong ~]# ls
applog                        lishaoqing
consul                        media
consul_0.7.5_linux_amd64.zip  mkcdrow.sh
consul_1.6.2_linux_amd64.zip  mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz
D:                            mysql57-community-release-el7-8.noarch.rpm
demo-0.0.1-SNAPSHOT.jar       nohup.out
demo_0719.sh                  practice
demo.sh                       reame.txt
hros-0.0.1-SNAPSHOT.jar       sh_script
LIR.txt                       wget-log
liruilong                     www.linuxprobe.com
liruilong.txt
[root@liruilong ~]#
#!/bin/bash
DIR="media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

[root@liruilong ~]# vim chkhost.sh
[root@liruilong ~]#
[root@liruilong ~]# sh ./chkhost.sh
./chkhost.sh: line 2: /dve/null: No such file or directory
Host  is Off-line.
[root@liruilong ~]# chmod u+x ./chkhost.sh
[root@liruilong ~]# sh ./chkhost.sh
./chkhost.sh: line 2: /dve/null: No such file or directory
Host  is Off-line.
[root@liruilong ~]# sh ./chkhost.sh 39.97.241.18
./chkhost.sh: line 2: /dve/null: No such file or directory
Host 39.97.241.18 is Off-line.
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dve/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi

[root@liruilong ~]# bash chkscore.sh 
Enter your score (0 - 100 ):30
chkscore.sh: line 4: [: -ge: unary operator expected
30 is 不及格的 
[root@liruilong ~]# bash chkscore.sh 
Enter your score (0 - 100 ):99
chkscore.sh: line 4: [: -ge: unary operator expected
99 is 不及格的 
[root@liruilong ~]# vim chkscore.sh 
[root@liruilong ~]# bash chkscore.sh 
Enter your score (0 - 100 ):99
chkscore.sh: line 4: [: -ge: unary operator expected
99 is 不及格的 
[root@liruilong ~]# vim chkscore.sh 
[root@liruilong ~]# bash chkscore.sh 
Enter your score (0 - 100 ):90
chkscore.sh: line 4: [: -ge: unary operator expected
90 is 不及格的 
[root@liruilong ~]# vim chkscore.sh 
[root@liruilong ~]# bash chkscore.sh 
Enter your score (0 - 100 ):99
99 is 优秀的
#!/bin/bash

read -p "Enter your score (0 - 100 ):" GR
if [ $GR -ge 85 ] && [ $GR -le 100 ] ; then
echo "$GR is 优秀的"
elif [ $GR -ge 70 ] && [ $GR -le 84 ] ; then
echo "$GR is 良好的" 
else      
echo "$GR is 不及格的 "
fi        
        

 for 条件循环语句 

echo "PSW" | password --stdin $UNAME &> /dev/nullME in `cat users.txt`
do
id $UNAME  &> /dev/null
if [ $? -eq 0 ]
then
echo "Alredy exists"
else
useradd $UNAME &> /dev/null
echo "PSW" | password --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done

如尝试让脚本从文本中自动读取主 机列表,然后自动逐个测试这些主机是否在线。

[root@liruilong ~]# sh ./CheckHosts.sh
ping: $: Name or service not known
嗯,这个 192.168.10.10 不通
ping: $: Name or service not known
嗯,这个 192.168.10.11 不通
ping: $: Name or service not known
嗯,这个 192.168.10.12 不通
[root@liruilong ~]# 

#!/bin/bash

for IP in `cat ipadds.txt`
do
ping -c 3 -i 0.2 -W $IP $> /dev/null
if [ $? -eq 0 ]  ; then
echo "嗯 这个 $IP  通啦"
else
echo "嗯,这个 $IP 不通"
fi
done

/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等 同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。 

 while 条件循环语句 

root@liruilong ~]# sh ./Guess.sh 
./Guess.sh: line 2: espr: command not found
商品实际价格为 0-999 之间,猜猜看是多少?
请输入您猜测的价格:45
./Guess.sh: line 9: [: 45: unary operator expected
./Guess.sh: line 13: [: 45: unary operator expected
太低了
请输入您猜测的价格:45
./Guess.sh: line 9: [: 45: unary operator expected
./Guess.sh: line 13: [: 45: unary operator expected
太低了
请输入您猜测的价格:45
./Guess.sh: line 9: [: 45: unary operator expected
./Guess.sh: line 13: [: 45: unary operator expected
太低了



#!/bin/bash
PR=$(espr $RANDOM % 1000 )
TIMES=0
echo "商品实际价格为 0-999 之间,猜猜看是多少?"
while true
do
        read -p "请输入您猜测的价格:" INT
        let TIMES++
        if [ $INT -eq $PR ] ; then
                echo "答对啦 ;价格为: $PR"
                echo "您一共猜了: $TIMES 次 "
                exit 0
        elif [ $INT -gt $PR ] ; then
                echo "太高了"
        else
                echo "太低了"
        fi
done

case 条件测试语句 

[root@liruilong ~]# vim CheckKeys.sh
[root@liruilong ~]# sh ./CheckKeys.sh
请输入一个字符串,并按Enter键结束4
您输的是数字
[root@liruilong ~]# 


#!/bin/bash
read -p "请输入一个字符串,并按Enter键结束" KEY
case "$KEY" in [a-z]|[A-Z])
echo "您输入的是一个字符"
;;
[0-9])
echo "您输的是数字"
;;
*)
echo "您输的乱七八糟"
esac

计划任务服务程序(定时任务) 

在指定的时间段自动 启用或停止某些服务或命令,从而实现运维的自动化。

计划任务分为

一次性计划任务

  • 一次性计划任务只执行一次,一般用于满足临时的工作需求。我们可以用 at 命令实现这种功能,只需要写成“at 时间”的形式就可以。如果想要查看已设置好但还未执 行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号”。在 使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系 统设置为在今晚 23:30 分自动重启网站服务。
[root@liruilong ~]# at 23:30
at> java -jar liruilong.jar &
at> <EOT>
job 2 at Wed Oct 28 23:30:00 2020
[root@liruilong ~]# at -l
2	Wed Oct 28 23:30:00 2020 a root
1	Wed Oct 28 23:30:00 2020 a root
[root@liruilong ~]# atrm 1
[root@liruilong ~]# at -l
2	Wed Oct 28 23:30:00 2020 a root
[root@liruilong ~]# echo "java -jar liruilong.jar &" | 23:00
-bash: 23:00: command not found
[root@liruilong ~]# echo "java -jar liruilong.jar &" |at 23:00
job 3 at Wed Oct 28 23:00:00 2020
[root@liruilong ~]# at-l
-bash: at-l: command not found
[root@liruilong ~]# at -l
2	Wed Oct 28 23:30:00 2020 a root
3	Wed Oct 28 23:00:00 2020 a root
[root@liruilong ~]# 

长期性计划任务

  • 如果我们希望 Linux 系统能够周期性地、有规律地执行某些具体的任务,那么 Linux 系统 中默认启用的 crond 服务简直再适合不过了。创建、编辑计划任务的命令为“crontab -e”,查看 当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”。另外,如果您 是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务
  • 1.Vim 编辑器的三种模式分别是什么? 答:命令模式、末行模式与输入模式(也叫编辑模式或插入模式)。 
  • 2.怎么从输入模式切换到末行模式? 答:需要先敲击 Esc 键退回到命令模式,然后敲击冒号(:)键后进入末行模式。 
  • 3.一个完整的 Shell 脚本应该哪些内容? 答:应该包括脚本声明、注释信息和可执行语句(即命令)。 
  • 4.分别解释 Shell 脚本中$0 与$3 变量的作用。 答:在 Shell 脚本中,$0 代表脚本文件的名称,$3 则代表该脚本在执行时接收的第三 个参数。 
  • 5.if 条件测试语句有几种结构,灵活且复杂的是哪种结构? 答:if 条件测试语句包括单分支、双分支与多分支等三种结构,其中多分支结构是灵活 且复杂的结构,其结构形式为 if…then…elif…then…else…fi。 
  • 6.for 条件循环语句的循环结构是什么样子的? 答:for 条件循环语句的结构为“for 变量名 in 取值列表 do 命令序列 done”,如图 4-20 所示。
  • 7.若在 while 条件循环语句中使用 true 作为循环条件,那么会发生什么事情? 答:因条件测试值永久为 true,因此脚本中循环部分会无限地重复执行下去,直到碰到 exit 命令才会结束。 
  • 8.如果需要依据用户的输入参数执行不同的操作,方便的条件测试语句是什么? 答:case 条件语句。 
  • 9.Linux 系统的长期计划任务所使用的服务是什么,其参数格式是什么? 答:长期计划任务需要使用 crond 服务程序,参数格式是“分、时、日、月、星期 命令”。

第五章 用户身份与文件权限 

管理员 UID 为 0:系统的管理员用户。 ¾ 系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提 权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏 范围。 ¾ 普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。 需要注意的是,UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。 

为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用 户组号码(GID,Group IDentification),

在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且 这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户 组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,

useradd 命令 

可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会 被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名 的基本用户组。这些默认设置可以根据表 5-1 中的 useradd 命令参数自行修改

useradd 命令用于创建新的用户,格式为“useradd [选项] 用户名”。 可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会 被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名 的基本用户组。

[root@liruilong ~]# useradd -d /home/08091104 -e 2020-08-10 -u 10003 -g root -N useraddDemo080911 
[root@liruilong ~]# tail -n 5 /etc/passwd
eric:x:1006:1006::/home/eric:/bin/bash
george:x:1007:1007::/home/george:/bin/bash
liruilongdemo:x:10000:10000::/home/liruilongdemo:/bin/bash
data:x:10001:10002::/home/username:/bin/bash
useraddDemo080911:x:10003:0::/home/08091104:/bin/bash
[root@liruilong ~]# 

 groupadd 命令 

groupadd 命令用于创建用户组,格式为“groupadd [选项] 群组名”。 为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同 一个组里面,这样便可以针对一类用户统一安排权限。创建用户组的步骤非常简单,例如使 用如下命令创建一个用户组 ronny: 

[root@liruilong ~]# useradd -d /home/liruilongdemo -u 10000  liruilongdemo
[root@liruilong ~]# group
groupadd   groupdel   groupmems  groupmod   groups     
[root@liruilong ~]# groupadd ronny
[root@liruilong ~]# usermod 

usermod 命令 

usermod 命令用于修改用户的属性,格式为“usermod [选项] 用户名”。 用户的信息保存在/etc/passwd 文件中,

可以直接用文本编辑器来修改其中的 用户参数项目,

也可以用 usermod 命令修改已经创建的用户信息,诸如用户的 UID、基本/扩 展用户组、默认终端等。

usermod 命令的参数以及作用如表 5-2 所示

[root@liruilong ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@liruilong ~]# id liruilong
id: liruilong: no such user
[root@liruilong ~]# id liruilongdemo
uid=10000(liruilongdemo) gid=10000(liruilongdemo) groups=10000(liruilongdemo)
[root@liruilong ~]# 
[root@liruilong ~]# usermod  -G root  useraddDemo080911
[root@liruilong ~]# usermod -u 1555 useraddDemo080911

passwd 命令 

passwd 命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]” 。
 普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他所 有人的密码、

root 管理员在 Linux 系统中修改自己或他人的密码时不需要验证旧密 码,这一点特别方便。既然 root 管理员可以修改其他用户的密码,就表示完全拥有该用户的 管理权限。passwd 命令中可用的参数以及作用如表 5-3 所示。

chage

chage -d 0 用户名  # 修改密码,用于设置初始密码
chage -l 用户名 # 查看密码的状态和规则
chage -m 9 -M 30 -W 14 用户名  # 密码有效期 最长 警告天数


[root@liruilong ~]# passwd 
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@liruilong ~]# userdel -fr useraddDemo080911
[root@liruilong ~]# id useraddDemo080911
id: useraddDemo080911: no such user
[root@liruilong ~]# 

5.2  文件权限与归属 

5.3  文件的特殊权限 

5.3.1  SUID 

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行 passwd 命令 来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现 它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的 权限。

[root@liruilong ~]# ls -la /etc/shadow
---------- 1 root root 1121 Nov  6 23:21 /etc/shadow
[root@liruilong ~]# ls -lah /bin/pass*
-rwsr-xr-x 1 root root 28K Apr  1  2020 /bin/passwd
[root@liruilong ~]# 
[root@liruilong ~]#>>$chage -l root
Last password change					: Nov 06, 2020
Password expires					: never
Password inactive					: never
Account expires						: never
Minimum number of days between password change		: 0
Maximum number of days between password change		: 99999
Number of days of warning before password expires	: 7
[root@liruilong ~]#>>$

5.3.2  SGID 

SGID 主要实现如下两种功能: 

让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置); 

在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。 

[root@liruilong tmp]# ls -ald testdir/
drwxrwxrwx 2 root root 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# chmod u-x testdir/
[root@liruilong tmp]# ls -ald testdir/
drw-rwxrwx 2 root root 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# chmod g+s testdir/
[root@liruilong tmp]# ls -ald testdir/
drw-rwsrwx 2 root root 4096 Nov  7 02:11 testdir/

命令位置:

[root@liruilong tmp]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[root@liruilong tmp]# which ls
alias ls='ls --color=auto'
	/usr/bin/ls
[root@liruilong tmp]#

chmod 命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参 数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、所 属组可读可、其他人没有任何权限,则相应的字符法表示为 rwxrw----,其对应的数字法表示 为 760。

这里使用的命令为 chown,其格式为“chown [参数] 所有者:所属组 文件或目录名称”

是针对目录进行操作时需要加上大写参数-R 来表示递归操作,

[root@liruilong tmp]# ls -ald testdir/
drwxrwxrwx 2 root root 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# chown root:bin testdir/
[root@liruilong tmp]# ls -ald testdir/
drw-rwsrwx 2 root bin 4096 Nov  7 02:11 testdir/

子母法:u g o a 

[root@liruilong tmp]# !l
ls -ld /
dr-xr-xr-x. 21 root root 4096 Nov  5 22:11 /
[root@liruilong tmp]# ls -ld testdir/
d-----S--- 2 root bin 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# chmod a=- testdir/
[root@liruilong tmp]# ls -ld testdir/
d-----S--- 2 root bin 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# chmod go+r testdir/
[root@liruilong tmp]# !l
ls -ld testdir/
d---r-Sr-- 2 root bin 4096 Nov  7 02:11 testdir/
[root@liruilong tmp]# 

5.3.3  SBIT 

SBIT 特殊权限位可确保用户只能删除自己的文件,而 不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录 中的文件就只能被其所有者执行删除操作了。

[root@liruilong tmp]# chmod o+t testdir/
[root@liruilong tmp]# !l
ls -ld testdir/
d---r-Sr-T 2 root bin 4096 Nov  7 02:11 testdir/

数字表示: 7777 

5.4  文件的隐藏属性 

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏 起来的权限,默认情况下不能直接被用户发觉

5.4.1  chattr 命令 

chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐 藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件, 则需要追加“-参数”

[root@liruilong tmp]# chattr -R +ia testdir/
[root@liruilong tmp]# chattr -R +ia testdir/
[root@liruilong tmp]# chattr -R +ias testdir/
[root@liruilong tmp]# chattr -R +iasA testdir/
[root@liruilong tmp]# chattr -R +iasAb testdir/
Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...

lsattr命令  

lsattr 命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在 Linux 系统中,文 件的隐藏权限必须使用 lsattr 命令来查看

[root@liruilong tmp]# lsattr -a  testdir/
s---ia-A-----e-- testdir/.
-------------e-- testdir/..
[root@liruilong tmp]# ls
crontab.cp4b9Z   +~JF3807956979297397557.tmp  testdir                          tomcat.7151372715267221723.8083
crontab.eQFCIn   +~JF6254427487714294215.tmp  tomcat.2057303081224246633.8083  tomcat.7654033927032040791.8083
hsperfdata_root  mongodb-27017.sock           tomcat.5407954538588136141.8083
[root@liruilong tmp]# ls -la testdir/
total 8
d---r-Sr-T   2 root bin  4096 Nov  7 02:11 .
drwxrwxrwt. 13 root root 4096 Nov  7 03:21 ..
[root@liruilong tmp]# 
[root@liruilong tmp]# ls
2020.txt  crontab.cp4b9Z  hsperfdata_root  mongodb-27017.sock  testdir  tomcat.7151372715267221723.8083  tomcat.7654033927032040791.8083
[root@liruilong tmp]# lsattr -a testdir/
s---ia-A-----e-- testdir/.
-------------e-- testdir/..
[root@liruilong tmp]# lsattr -a testdir
s---ia-A-----e-- testdir/.
-------------e-- testdir/..
[root@liruilong tmp]# lsattr -a 
-------------e-- ./.X11-unix
-------------e-- ./crontab.cp4b9Z
lsattr: Operation not supported While reading flags on ./mongodb-27017.sock
-------------e-- ./.XIM-unix
-------------e-- ./hsperfdata_root
-------------e-- ./2020.txt
-------------e-- ./.
-------------e-- ./tomcat.7654033927032040791.8083
-------------e-- ./.Test-unix
-------------e-- ./.ICE-unix
-------------e-- ./.font-unix
-------------e-- ./..
-------------e-- ./tomcat.7151372715267221723.8083
s---ia-A-----e-- ./testdir
[root@liruilong tmp]# 

 5.5文件访问控制列表 :

基于普通文件或目录设置 ACL 其实就是针对指定 的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录 中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

5.5.1  setfacl 命令

setfacl 命令用于管理文件的 ACL 规则,格式为“setfacl [参数] 文件名称”。文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令 可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,

针对目录 文件需要使用-R 递归参数;

针对普通文件则使用-m 参数;

如果想要删除某个文件的 ACL, 则可以使用-b 参数。

5.5.2  getfacl 命令

getfacl 命令用于显示文件上设置的 ACL 信息,格式为“getfacl 文件名称”。,用的是 setfacl 命令;要想查看 ACL,则用 的是 getfacl 命令。下面使用 getfacl 命令显示在 root 管理员家目录上设置的所有 ACL 信息

[root@liruilong tmp]# mkdir demo0813
[root@liruilong tmp]# ls
2020.txt        demo0813         mongodb-27017.sock  tomcat.7151372715267221723.8083
crontab.cp4b9Z  hsperfdata_root  testdir             tomcat.7654033927032040791.8083
[root@liruilong tmp]# setfacl -Rm u:root:rwx demo0813
[root@liruilong tmp]# ls -l getfacl demo0813
ls: cannot access getfacl: No such file or directory
demo0813:
total 0
[root@liruilong tmp]# getfacl demo0813
# file: demo0813
# owner: root
# group: root
user::rwx
user:root:rwx
group::r-x
mask::rwx
other::r-x

[root@liruilong tmp]# 
[root@liruilong tmp]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
group::r-x
other::---

[root@liruilong tmp]# 

5.6  su 命令与 sudo 服务

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切 换到其他用户,比如从 root 管理员切换至普通用户。

[root@liruilong tmp]# su liruilongdemo
[liruilongdemo@liruilong tmp]$ id
uid=10000(liruilongdemo) gid=10000(liruilongdemo) groups=10000(liruilongdemo)
[liruilongdemo@liruilong tmp]$ su - liruilongdemo
Password: 
su: Authentication failure
[liruilongdemo@liruilong tmp]$ su root
Password: 
su: Authentication failure
[liruilongdemo@liruilong tmp]$ exit
exit
[root@liruilong tmp]# 

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为“sudo [参数] 命令名称

 限制用户执行指定的命令:

  • ¾ 记录用户执行的每一条命令;
  • ¾ 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
  • ¾ 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。 

使用 sudo 命令提供的 visudo 命令 来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还 可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。 

只有 root 管理员才可以使用 visudo 命令编辑 sudo 服务的配置文件。 

谁可以使用  允许使用的主机=(以谁的身份)  可执行命令的列表 

#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
liruilongdemo ALL=(ALL) ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
~                                                                                                                                          
~                                                                                                                                          
~             

以添加 NOPASSWD 参数, 使得用户执行 sudo 命令时不再需要密码验证: 
 

课后题

  • 在 RHEL 7 系统中,root 管理员是谁? 答:是 UID 为 0 的用户,默认是 root 管理员。 
  • 如何使用 Linux 系统的命令行来添加或删除用户? 答:添加和删除用户的命令分别是 useradd 与 userdel。 
  • .若某个文件的所有者具有文件的读/写/执行权限,其余人仅有读权限,那么用数字法表示 应该是什么? 答:所有者权限为 rwx,所属组和其他人的权限为 r--,因此数字法表示应该是 744
  • 如果希望用户执行某命令时临时拥有该命令所有者的权限,应该设置什么特殊权限? 答:特殊权限中的 SUID
  • .若对文件设置了隐藏权限+i,则意味着什么? 答:无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能 新建或删除文件。 
  • 使用访问控制列表(ACL)来限制 linuxprobe 用户组,使得该组中的所有成员不得在/tmp 目录中写入内容。 答:想要设置用户组的 ACL,则需要把 u 改成 g,即 setfacl -Rm g:linuxprobe:r-x /tmp。 
  • 当普通用户使用 sudo 命令时是否需要验证密码? 答:系统在默认情况下需要验证当前登录用户的密码,若不想要验证,可添加 NOPASSWD 参数。

第 6 章 ,存储结构与磁盘划分 

 物理设备的命名规则 

/dev/目录中保存的应当是硬件设备文件;其次,sd 表示是存储设备;然后,a 表 示系统中同类接口中第一个被识别到的设备,最后,5 表示这个设备是一个逻辑分区。

 “/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件.

硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中 第一个扇区最重要,它里面保存着主引导记录与分区表信息。

就第一个扇区来讲:

  • 主引导记录需要占用 446 字节,
  • 分区表为 64 字节,
  • 结束符占用 2 字节

其中分区表中每记录一个分区 信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,

这 4 个分区就 是 4 个主分区。第一个扇区中的数据信息如图

为了解决分区个数不够,的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩 展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更 像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针

用户 一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区, 从而来满足多分区(大于 4 个)的需求.

所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个 分区的指针,这种指针结构将形成一个单向链表。 

6.3文件系统与数据资料

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依 靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux 系统支持数十种的文件系统:

  • Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分, 然后尝试进行修复。
  •  Ext4:Ext3 的改进版本,作为 RHEL6 系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系 统能够批量分配 block 块,从而极大地提高了读写效率。
  • XFS:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的 优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的 日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB, 这几乎满足了所有需求。 

在拿到了一块新的硬盘存储设备后,也需要先分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;您也 可以选择不进行分区,但是必须对硬盘进行格式化处理.

日常在硬盘需要保存的数据实在太多了,因此 Linux 系统中有一个名为 super block 的“硬 盘地图”。

Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整 个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大, 而且文件内容的查询与写入速度也会变得很慢。

Linux 只是把每个文件的权限与属性记录在 inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记 录着如下信息: 

  • 该文件的访问权限(read、write、execute);
  • 该文件的所有者与所属组(owner、group);
  •  该文件的大小(size);
  •  该文件的创建或内容修改时间(ctime);
  •  该文件的最后一次访问时间(atime);
  •  该文件的修改时间(mtime);
  • 文件的特殊权限(SUID、SGID、SBIT);
  •  该文件的真实数据地址(point)。 

而文件的实际内容则保存在 block 块中(大小可以是 1KB、2KB 或 4KB),一个 inode 的 默认大小仅为 128B(Ext3),记录一个 block 则消耗 4B。当文件的 inode 被写满后,

Linux 系 统会自动分配出一个 block 块,专门用于像 inode 那样记录其他 block 块的信息,这样把各个 block 块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的 block 块,有下面两种常见情况(以 4KB 的 block 大小为例进行说明)。 

  • 情况 1:文件很小(1KB),但依然会占用一个 block,因此会潜在地浪费 3KB。
  • 情况 2:文件很大(5KB),那么会占用两个 block(5KB-4KB 后剩下的 1KB 也要占 用一个 block)。 

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用 关心底层的硬盘结构,

Linux 内核中的软件层为用户程序提供了一个 VFS(Virtual File System, 虚拟文件系统)接口。

这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作 

6.4挂载硬件设备

—当用户需要使用 硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联 动作就是“挂载”。

6.4.1 mount命令

mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录” 。mount 命令中可 用的参数及作用如表 :

只需使用 mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设 备中的数据了。

[root@liruilong ~]# mount /dev/sdb2 /backup
mount: mount point /backup does not exist
[root@liruilong ~]# 

如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式 “设备文件 挂载目录 格式类型 权限选项 自检 优先级”(各字段的意义见表 6-4)写入到 /etc/fstab 文件中 

 如果想将文件系统为 ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并 保持默认权限且无需开机自检,就需要在/etc/fstab 文件中写入下面的信息,这样在系统重启 后也会成功挂载。 
 

6.4.2 umount命令

umount 命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。

[root@liruilong ~]# umount /dev/sdb2
umount: /dev/sdb2: mountpoint not found
[root@liruilong ~]# 

6.5添加硬盘设备

6.5.1 fdisk命令

在 Linux 系统中,管理硬盘设备最常用的方法就当属 fdisk 命令了。

fdisk 命令用于管理磁盘 分区,格式为“fdisk  [磁盘名称]”,

它提供了集添加、删除、转换分区等功能于一身的“一站式 分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。 

[root@liruilong dev]# fdisk  vda1
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x162dcee5.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 2
First sector (2048-83883998, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83883998, default 83883998): +1GB^H^[[3~
Unsupported suffix: 'G'.
Supported: 10^N: KB (KiloByte), MB (MegaByte), GB (GigaByte)
            2^N: K  (KibiByte), M  (MebiByte), G  (GibiByte)
Last sector, +sectors or +size{K,M,G} (2048-83883998, default 83883998): +1G
Partition 2 of type Linux and of size 1 GiB is set

Command (m for help): p

Disk vda1: 42.9 GB, 42948607488 bytes, 83883999 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x162dcee5

Device Boot      Start         End      Blocks   Id  System
vda1p2            2048     2099199     1048576   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@liruilong dev]# mkfs.xfs vda1
mkfs.xfs: vda1 contains a mounted filesystem
Usage: mkfs.xfs
/* blocksize */		[-b log=n|size=num]
/* metadata */		[-m crc=0|1,finobt=0|1,uuid=xxx]
/* data subvol */	[-d agcount=n,agsize=n,file,name=xxx,size=num,
			    (sunit=value,swidth=value|su=num,sw=num|noalign),
			    sectlog=n|sectsize=num
/* force overwrite */	[-f]
/* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,
			    projid32bit=0|1]
/* no discard */	[-K]
/* log subvol */	[-l agnum=n,internal,size=num,logdev=xxx,version=n
			    sunit=value|su=num,sectlog=n|sectsize=num,
			    lazy-count=0|1]
/* label */		[-L label (maximum 12 characters)]
/* naming */		[-n log=n|size=num,version=2|ci,ftype=0|1]
/* no-op info only */	[-N]
/* prototype file */	[-p fname]
/* quiet */		[-q]
/* realtime subvol */	[-r extsize=num,size=num,rtdev=xxx]
/* sectorsize */	[-s log=n|size=num]
/* version */		[-V]
			devicename
<devicename> is required unless -d name=xxx is given.
<num> is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),
      xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB).
<value> is xxx (512 byte blocks).
[root@liruilong dev]# mkdir /newFS
[root@liruilong /]# mount /dev/vda1 /newFS/
[root@liruilong /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        911M     0  911M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M  448K  920M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
/dev/vda1        40G  8.9G   29G  24% /
tmpfs           184M     0  184M   0% /run/user/0
[root@liruilong /]# 

在 Linux 系统中用于格式化操作的命令是 mkfs。

完成了存储设备的分区和格式化操作,

接下来就是要来挂载并使用存储设备了。与 之相关的步骤也非常简单:

首先是创建一个用于挂载设备的挂载点目录;然后使用 mount 命 令将存储设备与挂载点进行关联;

最后使用 df -h 命令来查看挂载状态和硬盘使用量信息。 

6.5.2 du命令.

用于查看文件数据占用量的 du 命令,其格式为“du [选项] [文件]”。

简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可 以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小

如果想让这个设备文件的挂载永久有效,则需要把挂载 的信息写入到配置文件中: 

6.6添加交换分区

添加交换分区 :SWAP(交换)分区是一种通过在

硬盘中预先划分一定的空间,然后将把内存中暂时不常 用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设 计目的是为了解决真实物理内存不足的问题

但由于交换分区毕竟是通过硬盘设备读写数据的, 速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。 

在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍,为了让大家更明显地感受交换分区空间的变化,这 里取出一个大小为 5GB 的主分区作为交换分区资源。在分区创建完毕后保存并退出即可: 

使用 SWAP 分区专用的格式化命令 mkswap,对新建的主分区进行格式化操作: 

使用 swapon 命令把准备好的 SWAP 分区设备正式挂载到系统中。我们可以使用 free -m 命令 查看交换分区的大小变化(由 2047MB 增加到 7167MB) 

为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入 到配置文件中,

6.7磁盘容量配额

可以使用 quota 命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。

quota 命令还有软限制和硬限制的功能。

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  •  硬限制:当达到硬限制时会提示用户,且强制终止用户的操作

6.7.1 xfs_quota命令

xfs_quota 命令是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令,

格式为“quota [参数] 配额 文件系统”。其中,

  • -c 参数用于以参数的形式设置要执行的命令;
  • -x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。

接下来我们使用 xfs_quota 命令来设置用户 tom 对/boot 目录的 quota 磁盘容量配额。

具体的限额控制包括:硬盘使用量的软 限制和硬限制分别为 3MB 和6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。 

6.7.2 edquota命令

edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。

在为用 户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,

  • -u 参数表示要针对哪个用户进行设置;
  • -g 参数表示要针对哪个用户组进行设置。

edquota 命令会 调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节。下面把用户 tom 的硬盘使用 量的硬限额从 5MB 提升到 8MB: 
 

6.8软硬方式链接In命令

在 Linux 系统中存在硬链接和软连接两种文件。

  •  硬链接(hard link):可以将它理解为一个“指向原始文件 inode 的指针”,系统不为 它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只 是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只 有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际 上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文 件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行 链接。
  • 软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链 接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件 也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。 

ln 命令用于创建链接文件,格式为“ln [选项] 目标”,在使用 ln 命令时,是否添加-s 参数,将创建出性质不同的两种“快捷方式”。

[root@liruilong ~]# ls
$                             consul_1.6.2_linux_amd64.zip  ipadds.txt     mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz   sh_script
applog                        D:                            LIR.txt        mysql57-community-release-el7-8.noarch.rpm  testmongobackup
CheckHosts.sh                 demo-0.0.1-SNAPSHOT.jar       liruilong      nohup.out                                   users.txt
CheckKeys.sh                  demo_0719.sh                  liruilong.txt  practice                                    wget-log
chkhost.sh                    demo.sh                       lishaoqing     reame.txt
chkscore.sh                   Example.sh                    li.txt         redis-5.0.7
consul                        Guess.sh                      media          redis-5.0.7.tar.gz
consul_0.7.5_linux_amd64.zip  hros-0.0.1-SNAPSHOT.jar       mkcdrow.sh     save.txt
[root@liruilong ~]# ln -s hros-0.0.1-SNAPSHOT.jar demo.jar
[root@liruilong ~]# java -jar demo.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)
[root@liruilong ~]# ls -l hros-0.0.1-SNAPSHOT.jar 
-rw-r--r-- 1 root root 51484868 Feb 29  2020 hros-0.0.1-SNAPSHOT.jar
[root@liruilong ~]# 

 即相当于针对原始文件的硬盘存储位置创建 了一个指针,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会 因为原始文件的删除而导致无法读取。同时可以看到创建硬链接后,原始文件的硬盘链接数 量增加到了 2。 

[root@liruilong ~]# ln hros-0.0.1-SNAPSHOT.jar  demos.jar
[root@liruilong ~]# ls -l hros-0.0.1-SNAPSHOT.jar 
-rw-r--r-- 2 root root 51484868 Feb 29  2020 hros-0.0.1-SNAPSHOT.jar
[root@liruilong 
  • 1./home 目录与/root 目录内存放的文件有何相同点以及不同点?
    • 答:这两个目录都是用来存放用户的家目录数据的,但是,/root 目录存放的是 root 管理 员的家目录数据。  
  • 2.假如一个设备的文件名称为/dev/sdb,可以确认它是主板第二个插槽上的设备吗?
    • 答:不一定,因为设备的文件名称是由系统的识别顺序来决定的。 
  • 3.如果硬盘中需要 5 个分区,至少需要几个逻辑分区?
    • 答:可以选用创建 3 个主分区+1 个扩展分区的方法,然后把扩展分区再分成 2 个逻辑分 区,即有了 5 个分区。 
  • 4./dev/sda5 是主分区还是逻辑分区?
    • 答:逻辑分区。 
  • 5.哪个服务决定了设备在/dev 目录中的名称?
    • 答:udev 设备管理器服务。 
  • 6.用一句话来描述挂载操作。
    • 答:当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进 行关联,而这个关联动作就是“挂载”。 
  • 7.在配置 quota 磁盘容量配额服务时,软限制数值必须小于硬限制数值么?
    • 答:不一定,软限制数值可以小于等于硬限制数值。 
  • 8.若原始文件被改名,那么之前创建的硬链接还能访问到这个原始文件么?
    • 答:可以。

第7章使用RAID与LVM磁盘阵列技术

7.1  RAID(独立冗余磁盘阵列) 

RAID 技术 通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列

并把数据切割成多个区 段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的 性能

同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据 冗余备份效果。

RAID 技 术的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现 代企业更看重的则是 RAID 技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升

RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度

RAID 0、RAID 1、RAID 5 与 RAID 10 这 4 种常见的方案。 

7.1.1 RAID 0

RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成 一个大的卷组,并将数据依次写入到各个物理硬盘中。

在理想的状态下,硬盘 设备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。

RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错 误修复能力

数据被分别写入到不同的硬盘设备中,即 disk1 和 disk2 硬盘设 备会分别保存数据资料,终实现分开写入、读取的效果。 

7.1.2 RAID 1

如果生产环境对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时, 就需要用到 RAID 1 技术了。

RAID1 把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。

当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常 使用。 

从理论上来说RAID1 硬盘空间的真实可用率 只有 50%,由三块硬盘设备组成的 RAID 1 磁盘阵列的可用率只有 33%左右.

7.1.3 RAID 5

RAID 5 技术在理论上兼顾了三者(读写速度、数据安全性、成本)
RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。 RAID 5 磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到 除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命 缺陷;

  RAID 5 技术实 际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试 重建损坏的数据。parity 部分存放的就是数据的奇偶校验信息

RAID 5这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性 与存储成本问题。

 

7.1.4 RAID 10

RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”。

RAID 10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列

然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设 备的读写速度。这样从理论上来讲,只要坏的不是同一组中的所有硬盘,那么多可以损 坏 50%的硬盘设备而不丢失数据

7.1.5部署磁盘阵列

[root@liruilong ~]# mdadm --help
mdadm is used for building, managing, and monitoring
Linux md devices (aka RAID arrays)
Usage: mdadm --create device options...
            Create a new array from unused devices.
       mdadm --assemble device options...
            Assemble a previously created array.
       mdadm --build device options...
            Create or assemble an array without metadata.
       mdadm --manage device options...
            make changes to an existing array.
       mdadm --misc options... devices
            report on or modify various md related devices.
       mdadm --grow options device
            resize/reshape an active array
       mdadm --incremental device
            add/remove a device to/from an array as appropriate
       mdadm --monitor options...
            Monitor one or more array for significant changes.
       mdadm device options...
            Shorthand for --manage.
Any parameter that does not start with '-' is treated as a device name
or, for --examine-bitmap, a file name.
The first such name is often the name of an md device.  Subsequent
names are often names of component devices.

 For detailed help on the above major modes use --help after the mode
 e.g.
         mdadm --assemble --help
 For general help on options use
         mdadm --help-options
[root@liruilong ~]# 

 

使用 mdadm 命令创建 RAID 10,名称为“/dev/md0”。  

  • -C 参数代表创建一个 RAID 阵列卡;
  • -v 参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0 就是创建后的 RAID 磁盘阵列的名称;
  • -a yes 参数代表自动创建设备文件;
  • -n 4 参数代表使用 4 块硬盘来部 署这个 RAID 磁盘阵列;
  • -l 10 参数则代表 RAID 10 方案;后再加上 4 块硬盘设备的名称 就搞定了。 

 

把制作好的 RAID 磁盘阵列格式化为 ext4 格式。 

创建挂载点然后把硬盘设备进行挂载操作。挂载成功后可看到可用空间为 40GB。 
 

查看/dev/md0 磁盘阵列的详细信息,并把挂载信息写入到配置文件中,使其永久 生效。 
 

7.1.6损坏磁盘阵列及修复

理硬盘设备出现损坏而不能继续正常使用后,应该使用 mdadm 命令将其 移除,然后查看 RAID 磁盘阵列的状态,可以发现状态已经改变

在 RAID 10 级别的磁盘阵列中,当 RAID 1 磁盘阵列中存在一个故障盘时并不影响 RAID 10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令来予以替换即可.

7.1.7磁盘阵列+备份盘

7.2LVM (逻辑卷管理器)

LVM (逻辑卷管理器)。LVM 可以允许用户对硬盘资源进行动态调整。 

LVM 技术是在硬 盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行 卷组合并。

用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分 区的动态调整.

7.2.1部署逻辑卷

妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需 要把这些面粉(物理卷[PV,Physical Volume])揉成一个大面团(卷组[VG,Volume Group]), 然后再把这个大团面分割成一个个小馒头(逻辑卷[LV,Logical Volume]),而且每个小馒头 的重量必须是每勺面粉(基本单元[PE,Physical Extent])的倍数。

yum -y install lvm2 

  • 新硬盘进行创建物理卷的操作,可以将该操 作简单理解成让硬盘设备支持 LVM 技术,或者理解成是把硬盘设备加入到 LVM 技术可 用的硬件资源池中,
  • 然后对这两块硬盘进行卷组合并,卷组的名称可以由用户来自定义。
  • 接下来,根据需求把合并后的卷组切割出一个约为 150MB 的逻辑卷设备,后把这个逻 辑卷设备格式化成 EXT4 文件系统后挂载使用

在对逻辑卷进行切割时有两种计量单位。第一种是以容 量为单位,所使用的参数为-L。例如,使用-L 150M 生成一个大小为 150MB 的逻辑卷。另外 一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为 4MB。例 如,使用-l 37 可以生成一个大小为 37×4MB=148MB 的逻辑卷。 

  • Linux 系统会把 LVM 中的逻辑卷设备存放在/dev 设备目录中(实际上是做了一个符号链 接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组 名称/逻辑卷名称)。 
  • 查看挂载状态,并写入到配置文件,使其永久生效。 

7.2.2扩容逻辑卷

只要卷组中 有足够的资源,就可以一直为逻辑卷扩容。扩展前请一定要记得卸载设备和挂载点的关联。

  • 把上一个实验中的逻辑卷 vo 扩展至 290MB 
  •  检查硬盘完整性,并重置硬盘容量。 
  •  重新挂载硬盘设备并查看挂载状态。 

7.2.3缩小逻辑卷

在对 LVM 逻辑卷进 行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执 行缩容操作前记得先把文件系统卸载掉。 

  • 第1步:检查文件系统的完整性。
     
  • 第2步:把逻辑卷 vo 的容量减小到 120MB。
     
  • 第3步:重新挂载文件系统并查看系统状态

7.2.4逻辑卷快照

LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。

可 以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快 照卷进行覆盖还原。

LVM 的快照卷功能有两个特点:

  •  快照卷的容量必须等同于逻辑卷的容量;
  • 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。 

首先查看卷组的信息

[root@linuxprobe ~]# vgdisplay 
  •  第1步:使用-s 参数生成一个快照卷,使用-L 参数指定切割的大小。另外,还需要在命 令后面写上是针对哪个逻辑卷执行的快照操作。 
  • 第2步:在逻辑卷所挂载的目录中创建一个 100MB 的垃圾文件,然后再查看快照卷的状 态。可以发现存储空间占的用量上升了。 
  • 第3步:为了校验 SNAP 快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记 得先卸载掉逻辑卷设备与目录的挂载。
  • 第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来 的 100MB 的垃圾文件也被清除了。

      

7.2.5删除逻辑卷

当生产环境中想要重新部署 LVM 或者不再需要使用 LVM 时,则需要执行 LVM 的删除 操作。为此,需要提前备份好重要的数据信息,

然后依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒 

  • 第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数
  • 第2步:删除逻辑卷设备,需要输入 y 来确认操作。
     
  • 第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。 
  • 第4步:删除物理卷设备。 
  • 再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信 息时就不会再看到信息了

复习题

1. RAID 技术主要是为了解决什么问题呢答:RAID 技术可以解决存储设备的读写速度问题及数据的冗余备份问题。 
 
2.
RAID 0 和 RAID 5 哪个更安全? 答:RAID 0 没有数据冗余功能,因此 RAID 5 更安全。 
 

3.假设使用 4 块硬盘来部署 RAID 10 方案,外加一块备份盘,多可以允许几块硬盘同时损 坏呢答:多允许 5 块硬盘设备中的 3 块设备同时损坏。 
 
4.位于 LVM 底层的是物理卷还是卷组? 答:底层的是物理卷,然后在通过物理卷组成卷组。 
 
5. LVM 对逻辑卷的扩容和缩容操作有何异同点呢? 答:扩容和缩容操作都需要先取消逻辑卷与目录的挂载关联;扩容操作是先扩容后检查文 件系统完整性,而缩容操作为了保证数据的安全,需要先检查文件系统完整性再缩容。 
 

6. LVM 的快照卷能使用几次? 答:只可使用一次,而且使用后即自动删除。 
 
7. LVM 的删除顺序是怎么样的?
答:依次移除逻辑卷、卷组和物理卷。 

第8章iptables与firewalld防火墙

8.1防火墙管理工具

在公网与企业内网 之间充当保护屏障的防火墙有软件或硬件之分,

主要功能都是依据策略对 穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,

然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在 企业内网和外部公网之间流动了。 
 

8.2 iptables

iptables 服务会把配置好的防火墙策略交由内核层面的 netfilter 网络过滤器来处理,

firewalld 服务 则是把配置好的防火墙策略交由内核层面的 nftables 包过滤框架来处理。

8.2.1策略与规则链

一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行) 一种是“堵”(即阻止)。

当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否 则谁都进不来;

如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防 火墙也就失去了防范的作用

iptables 服务把用于处理或过滤流量的策略条目称之为规则链,规则链依据数据包处理位置的不同进行分类

  • 在进行路由选择前处理数据包(PREROUTING);
  • 处理流入的数据包(INPUT);
  • 处理流出的数据包(OUTPUT);
  • 处理转发的数据包(FORWARD);
  • 在进行路由选择后处理数据包(POSTROUTING)。 

从内网向外网发送的流量一般都是可控且良性的因此使用多的就是 INPUT 规则链,该规则链可以增大黑客人员从外网入侵内网的难度。

拒绝策略iptables 服务 的术语:

  • ACCEPT(允许流量通过)、
  • REJECT(拒绝流量通过)、 则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息
  • LOG(记录日志信息) 、
  • DROP(拒绝流量通过) 。是直接将流量丢弃而且不响应 

8.2.2 iptables中基本的命令参数

iptables 是一款基于命令行的防火墙策略管理工具,具有大量参数,学习难度较大。

iptables 命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,

一旦匹配成功,iptables 就会根据策略规则所预设的动作来处理这些流量。

防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则 放到前面

[root@liruilong ~]# ipt
iptables          iptables-restore  iptables-save     iptables-xml      iptunnel          
[root@liruilong ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@liruilong ~]# iptables -P INPUT DROP

规则链的默认拒绝动作只能是 DROP,而不能是 REJECT。

  向 INPUT 链中添加允许 ICMP 流量进入的策略规则:

在日常运维工作中,经常会使用 ping 命令来检查对方主机是否在线,而向防火墙的 INPUT规则链中添加一条允许ICMP流量进入的策略规则就默认允许了这种ping命令检 测行为

iptables -D INPUT 1
iptables -p INPUT ACCEPT
iptables -L
# 删除 INPUT 规则链中刚刚加入的那条策略(允许 ICMP 流量),并把默认策略设置为 允许: 
iptables -I INPUT -s  192.168.10.10/24 -p tcp --dport 22 -j ACCERT
iptables -A INPUT -p tcp  --dport 22 -j REJECT
# 将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口,拒绝来自其他所有 主机的流量: 

 防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到 拒绝动作前面,否则所有的流量就将被拒绝掉,

  • iptables -I INPUT -p icmp -j ACCEPT
    • # 向 INPUT 链中添加允许 ICMP 流量进入的策略规则: 
  • iptables -D INPUT 1
  • iptables -p INPUT ACCEPT
  • iptables -L
    • # 删除 INPUT 规则链中刚刚加入的那条策略(允许 ICMP 流量),并把默认策略设置为 允许: 
  • iptables -I INPUT -s                                                                                                                      
  • iptables -D INPUT 1
  • iptables -p INPUT ACCEPT
  • iptables -L
    • # 删除 INPUT 规则链中刚刚加入的那条策略(允许 ICMP 流量),并把默认策略设置为 允许: 
  • iptables -I INPUT -s  192.168.10.10/24 -p tcp --dport 22 -j ACCERT
  • iptables -A INPUT -p tcp  --dport 22 -j REJECT
    • # 将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口,拒绝来自其他所有 主机的流量: 
  • iptables -I INPUT -P tcp --dport 12345 -j REJECT
    • # 向 INPUT 规则链中添加拒绝所有人访问本机 12345 端口的策略规则: 
  • iptables -I INPUT -P tcp -s 192.168.10.6 --dport 80 -j  REJECT
    • # 向 INPUT 规则链中添加拒绝 192.168.10.5 主机访问本机 80 端口(Web 服务)的策略 规则:
  • iptables -A INPUT -P tcp --dport 1000:1024 -j REJECT
  • iptables -A INPUT -P udp --dport 1000:1024 -j REJECT
    • # 向 INPUT 规则链中添加拒绝所有主机访问本机 1000~1024 端口的策略规则: 

使用 iptables 命令配置的防火墙规则默认会在系统下一次重启时失效,如果 想让配置的防火墙策略永久生效,还要执行保存命令: 

  • service iptables save 

8.3 firewalld

firewalld(Dynamic Firewall Manager of Linux systems,Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于 CLI(命 令行界面)和基于 GUI(图形用户界面)的两种管理方式

相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone) 的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板)

8.3.1终端管理工具

使用 firewalld 配置的防火墙策略默认 为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。

如果想让配 置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用 firewall-cmd 命令正常设置防火墙策略时添加--permanent 参数,需要重启。

[root@liruilong ~]# firewall --get-default-zone
-bash: firewall: command not found
[root@liruilong ~]# yum install firewalld 
Loaded plugins: fastestmirror
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
 * base: mirrors.cloud.aliyuncs.com
 * extras: mirrors.cloud.aliyuncs.com
 * updates: mirrors.cloud.aliyuncs.com
base                                                                      | 3.6 kB  00:00:00     
epel                                                                      | 4.7 kB  00:00:00     
extras                                                                    | 2.9 kB  00:00:00     
mongdb-org                                                                | 2.5 kB  00:00:00     
mysql-connectors-community                                                | 2.5 kB  00:00:00     
mysql-tools-community                                                     | 2.5 kB  00:00:00     
mysql57-community                                                         | 2.5 kB  00:00:00     
updates                                                                   | 2.9 kB  00:00:00     
(1/3): updates/7/x86_64/primary_db                                        | 4.5 MB  00:00:00     
(2/3): epel/x86_64/updateinfo                                             | 1.0 MB  00:00:00     
(3/3): epel/x86_64/primary_db                                             | 6.9 MB  00:00:00     
Package firewalld-0.6.3-8.el7_8.1.noarch already installed and latest version
Nothing to do
[root@liruilong ~]# 

 查看 firewalld 服务当前所使用的区域: 

  •  firewall-cmd --get-default-zone 

查询 eno16777728 网卡在 firewalld 服务中的区域: 

  • firewall-cmd --get-zone-of-interface=eno16777728 

把 firewalld 服务中 eno16777728 网卡的默认区域修改为 external,并在系统重启后生效。分 别查看当前与永久模式下的区域名称:

  • firewall-cmd --permanent --zone=external --change-interface= eno16777728
  • firewall-cmd --get-zone-of-interface=eno16777728 
  • firewall-cmd --permanent --get-zone-of-interface=eno16777728 

把 firewalld 服务的当前默认区域设置为 public: 

  •  firewall-cmd --set-default-zone=public 

启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器 时请慎用):

  •  firewall-cmd --panic-on 
  • firewall-cmd --panic-off 

查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量: 

  •  firewall-cmd --zone=public --query-service=ssh 
  •  firewall-cmd --zone=public --query-service=https 

把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效: 

  • firewall-cmd --permanent --zone=public --remove-service=http 
  •  firewall-cmd --reload  

把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效: 

  •  firewall-cmd --zone=public --add-port=8080-8081/tcp 
  • firewall-cmd --zone=public --list-ports 

把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效

  • firewall-cmd --permanent --zone=public --add-forward-port= port=888:proto=tcp:toport=22:toaddr=192.168.10.10 
  • firewall-cmd --reload 

firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端 口号、源地址和目标地址等诸多信息进行更有正对性的策略配置。

它的优先级在所有的防火 墙策略中也是高的。

比如,我们可以在 firewalld 服务中配置一条富规则,使其拒绝 192.168.10.0/24 网段的所有用户访问本机的 ssh 服务(22 端口): 

  • firewall-cmd --permanent --zone=public --add-rich-rule=" rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject" 
  • firewall-cmd --reload 

8.3.2图形管理工具

 SNAT(Source Network Address Translation,源网络地址转换)技术。SNAT 是一种为了解决 IP 地址匮乏而设计的技术,它 可以使得多个内网中的用户通过同一个外网 IP 接入 Internet。该技术的应用非常广泛。

局域网中有多台 PC,如果网关服务器没有应用 SNAT 技术,则互 联网中的网站服务器在收到 PC 的请求数据包,并回送响应数据包时,将无法在网络中找到这 个私有网络的 IP 地址,所以 PC 也就收不到响应数据包了。在图 8-7 所示的局域网中,由于 网关服务器应用了 SNAT 技术,所以互联网中的网站服务器会将响应数据包发给网关服务器, 再由后者转发给局域网中的 PC。 

8.4服务的访问控制列表

TCP Wrappers 是RHEL 7 系统中默认启用的一款流量监控程序,它能够根据来访主机的地址 与本机的目标服务程序作出允许或拒绝的操作。

Linux 系统中其实有两个层面的防火 墙,第一种是前面讲到的基于 TCP/IP 协议的流量过滤工具,而 TCP Wrappers 服务则是能允许或 禁止 Linux 系统提供服务的防火墙,从而在更高层面保护了 Linux 系统的安全运行。

 TCP Wrappers 服务的防火墙策略由两个控制列表文件所控制,

  • 可以编辑允许控制列表文件来放行对服务的请求流量,
  • 也可以编辑拒绝控制列表文件来阻止对服务的请求流量

控制列表 文件修改后会立即生效,

系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应 的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若 找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量

在配置 TCP Wrappers 服务时需要遵循两个原则:

  • 编写拒绝策略规则时,填写的是服务名称,而非协议名称; 
  • 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。
#
# hosts.deny    This file contains access rules which are used to
#               deny connections to network services that either use
#               the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               The rules in this file can also be set up in
#               /etc/hosts.allow with a 'deny' option instead.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
sshd:*
#
# hosts.allow   This file contains access rules which are used to
#               allow or deny connections to network services that
#               either use the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers

sshd:192.168.10.
#

禁止访问本机 sshd 服务的所有流量(无须/etc/hosts.deny 文 件中修改原有的注释信息),在允许策略规则文件中添加一条规则,使其放行源自 192.168.10.0/24 网段,访 问本机 sshd 服务的所有流量。可以看到,服务器立刻就放行了访问 sshd 服务的流量 
 

[root@liruilong ~]# vim /etc/hosts.deny 
[root@liruilong ~]# vim /etc/hosts.allow 
[root@liruilong ~]# 

复习题

.在 RHEL 7 系统中,iptables 是否已经被 firewalld 服务彻底取代?

  • 答:没有,iptables 和 firewalld 服务均可用于 RHEL 7 系统。 

请简述防火墙策略规则中 DROP 和 REJECT 的不同之处。

  • 答:DROP 的动作是丢包,不响应;REJECT 是拒绝请求,同时向发送方回送拒绝信息

如何把 iptables 服务的 INPUT 规则链默认策略设置为 DROP?

  • 答:执行命令 iptables -P INPUT DROP 即可。 

怎样编写一条防火墙策略规则,使得 iptables 服务可以禁止源自 192.168.10.0/24 网段的流 量访问本机的 sshd 服务(22 端口)?

  • 答:执行命令 iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j REJECT 即可。  

请简述 firewalld 中区域的作用。

  • 答:可以依据不同的工作场景来调用不同的 firewalld 区域,实现大量防火墙策略规则的快 速切换

如何在 firewalld 中把默认的区域设置为 dmz?

  • 答:执行命令 firewall-cmd --set-default-zone=dmz 即可。 

如何让 firewalld 中以永久(Permanent)模式配置的防火墙策略规则立即生效?

  • 答:执行命令 firewall-cmd --reload。

使用 SNAT 技术的目的是什么?

  • 答:SNAT 是一种为了解决 IP 地址匮乏而设计的技术,它可以使得多个内网中的用户通过 同一个外网 IP 接入 Internet(互联网)。 

TCP Wrappers 服务分别有允许策略配置文件和拒绝策略配置文件,请问匹配顺序是 怎么样的?

  • 答:TCP Wrappers 会先依次匹配允许策略配置文件,然后再依次匹配拒绝策略配置文件, 如果都没有匹配到,则默认放行流量。 

第9章使用ssh服务管理远程主机

第9章使用ssh服务管理远程主机

9.1配置网络服务

用 nmtui 命令来配置网络,如果服务没有启动,需要重新启动。

[root@liruilong ~]# nmtui
NetworkManager is not running.
[root@liruilong ~]# systemctl start NetworkManager
[root@liruilong ~]# nmtui

 

9.1.1配置网络参数

使用 Vim 编辑器将网卡配置文件中的 ONBOOT 参数修改成 yes,这样在系统重启后网卡就被激活了。 

当修改完 Linux 系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服 务程序获取到新的配置文件,需要手动重启相应的服务,之后就可以看到网络畅通了: 

9.1.2创建网络会话

RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网 络配置的守护进程,能够让网络设备保持连接状态。可以使用 nmcli 命令来管理 Network Manager 服务。nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多。它可以轻松 地查看网络信息或网络状态: 

  • 显示所有包括不活动连接:nmcli con show
  • 显示所有活动连接: nmcli con show –active
  • 显示网络连接配置:nmcli con show "System eth0“
  • 显示设备状态:nmcli dev status
  • 显示网络接口属性:nmcli dev show eno16777736
[root@liruilong ~]# nmcli  con show
NAME         UUID                                  TYPE      DEVICE 
System eth0  5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
[root@liruilong ~]# nmcli  con show -active
NAME         UUID                                  TYPE      DEVICE 
System eth0  5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
[root@liruilong ~]# nmcli  con show "System eth0"
connection.id:                          System eth0
connection.uuid:                        5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
connection.stable-id:                   --
connection.type:                        802-3-ethernet

RHEL7 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似 于 firewalld 防火墙服务中的区域技术)。如果我们在公司网络中使用笔记本电脑时需要手动指 定网络的 IP 地址,而回到家中则是使用 DHCP 自动分配 IP 地址。这就需要麻烦地频繁修改 IP 地址,但是使用了网络会话功能后一切就简单多了—只需在不同的使用环境中激活相应 的网络会话,就可以实现网络配置信息的自动切换了

以使用 nmcli 命令并按照“connection add con-name type ifname”的格式来创建网络会 话。假设将公司网络中的网络会话称之为 company,将家庭网络中的网络会话称之为 house, 现在依次创建各自的网络会话。

# 使用con-name参数指定公司所使用的网络会话名称company,然后依次用ifname参数指定本机的网卡名称,用autoconnect  no参数设>置该网络会话默认不被自动激活,以及用ip4及gw4参数手动指定网络的IP地址:
nmcli connection add con-name company ifname eno16777736  autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1 
# 使用con-name参数指定家庭所使用的网络会话名称house
nmcli connection add con-name house type ethernet ifname  eno16777736
  
# 在成功创建网络会话后,可以使用nmcli命令查看创建的所有网络会话:
nmcli connection show
  
  
# 使用nmcli命令配置过的网络会话是永久生效的,这样当我们下班回家后,顺手启用house网络会话,网卡就能自动通过DHCP获取到IP地址了。
nmcli connection up house

 如果大家使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式,

9.1.3绑定两块网卡

一般来讲,生产环境必须提供7×24小时的网络传输服务。借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。

网卡绑定的理论知识类似于前面学习的RAID硬盘组,我们需要对参与绑定的网卡设备逐个进行“初始设置”。需要注意的是,这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于“主”网卡,不应该再有自己的IP地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定

还需要将绑定后的设备命名为bond0并把IP地址等信息填写进去,这样当用户访问相应服务的时候,实际上就是由这两块网卡设备在共同提供服务

让Linux内核支持网卡绑定驱动。常见的网卡绑定驱动有三种模式—mode0、mode1和mode6。下面以绑定两块网卡为例,讲解使用的情景。

  • mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。
  • mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。
  • mode6(平衡负载模式):平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持

下面使用Vim文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的bond0网卡设备能够支持绑定技术(bonding);同时定义网卡以mode6模式进行绑定,且出现故障时自动切换的时间为100毫秒。

内核模块是可以按需加载或卸载的内核代码,可以不重启系统就扩充内核的功能。使用 /etc/modprobe.d/中的文件:要通过配置文件传递参数,在 /etc/modprobe.d/ 中放入任意名称 .conf 文件

[root@liruilong ~]# ls /etc/modprobe.d/
blacklist-nouveau.conf  disable_ipv6.conf       mlx4.conf       tuned.conf
dccp-blacklist.conf     firewalld-sysctls.conf  truescale.conf
alias bond0 bonding
options bond0 miimon=100 mode=6

重启网络服务后网卡绑定操作即可成功。正常情况下只有bond0网卡设备才会有IP地址等信息: systemctl restart network

9.2远程控制服务.

SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式。

想要使用SSH协议来远程管理Linux系统,则需要部署配置sshd服务程序。sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:

  • 基于口令的验证—用账户和密码来验证登录;
  • 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。

9.2.1 配置sshd服务

sshd服务的配置信息保存在/etc/ssh/sshd_config文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号。sshd服务配置文件中包含的重要参数如表9-1所示。

如果禁止以root管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的几率。下面进行相应配置。首先使用Vim文本编辑器打开sshd服务的主配置文件,然后把第48行#PermitRootLogin yes参数前的井号(#)去掉,并把参数值yes改成no,这样就不再允许root管理员远程登录了。记得最后保存文件并退出。

9.2.2安全密钥验证

密是对信息进行编码和解码的技术,它通过一定的算法(密钥)将原本可以直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在传输数据时,如果担心被他人监听或截获,就可以在传输前先使用公钥对数据加密处理,然后再行传送。这样,只有掌握私钥的用户才能解密这段数据,除此之外的其他人即便截获了数据,一般也很难将其破译为明文信息。

9.2.3远程传输命令

scp(secure copy)是一个基于SSH协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件远程帐户@远程IP地址:远程目录”。

scp不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。例如,如果想把一些文件通过网络从一台主机传递到其他主机,这两台主机又恰巧是Linux系统,这时使用scp命令就可以轻松完成文件的传递了。

类似于putty的上传下载,windows到linux的远程传输

9.3不间断会话服务

screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用screen服务程序同时在多个远程会话中自由切换,能够做到实现如下功能

  • 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
  • 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
  • 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。

9.3.1管理远程会话

screen命令能做的事情非常多:可以用-S参数创建会话窗口;用-d参数将指定会话进行离线处理;用-r参数回复指定会话;用-x参数一次性恢复所有的会话;用-ls参数显示当前已有的会话;以及用-wipe参数把目前无法使用的会话删除,等等。

9.3.2会话共享功能

creen命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。

复习题

  • 1.在Linux系统中有多种方法可以配置网络参数,请列举几种。答:配置网卡参数可以使用nmtui命令、nmcli命令或者直接编辑网卡配置文件来实现对网卡参数的修改。
  • 2.在RHEL 7系统中使用网卡会话技术的目的是什么?答:使用nmcli命令来管理网卡会话的目的是为了快速切换网卡参数,以便适应不同的工作场景。
  • 3.请简述网卡绑定技术mode6模式的特点。答:平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。
  • 4.在Linux系统中,当通过修改其配置文件中的参数来配置服务程序时,若想要让新配置的参数生效,还需要执行什么操作?答:需要重新启动相关的服务程序,或让服务程序重新加载配置文件,或重启系统。
  • 5.sshd服务的口令验证与密钥验证方式,哪个更安全?答:一般情况下,密钥验证方式更加安全。若用户若认证有更高的安全需求,还可以再对密钥文件进行口令加密,从而实现双重加密。
  • 6.想要把本地文件/root/out.txt传送到地址为192.168.10.20的远程主机的/home目录下,且本地主机与远程主机均为Linux系统,最为简便的传送方式是什么?答:执行命令scp /root/out.txt [email protected]:/home,并在进行口令验证后即可开始传送。
  • 7.请简述配置Yum仓库的步骤。答:首先应该创建挂载目录并把光盘镜像文件与其关联,然后修改Yu m的配置文件,填写入相关参数,尤其需要注意挂载目录的存放路径要正确无误,最后便可使用Yu m命令来安装相关的服务程序了。
  • 8. screen服务程序能够让用户实现远程控制的不间断会话服务,即便网络发生中断也不丢失对远程主机的会话控制。那么,当想要恢复到一个名为linux的会话窗口时,应该怎么做呢?答:执行命令screen -r linux即可恢复到这个会话窗口中。

第10章使用Apache服务部署静态网站

10.1网站服务程序

10.2配置服务文件参数

10.3 SELinux安全子系统

10.3.1 semanage命令

10.4个人用户主页功能

10.5虚拟主机功能

10.5.1基于IP地址

10.5.2基于主机域名

10.5.3基于端口号

10.6 Apache的i问控制习题

第11章使用vsftpd服务传输文件

11.1文件传输协议

FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口。

其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端 发出的相关 FTP 命令与参数

FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特 点。而且有些 FTP 客户端工具还可以支持文件的多点下载以及断点续传技术,因此 FTP 服务 得到了广大用户的青睐。FTP 协议的传输拓扑。

  • FTP 服务器是按照 FTP 协议在互联网上提供文件存储和访问服务的主机,
  • FTP 客户端则是向服务器发送连接请求,以建立数据传输链路的主机。

FTP 协议有下面两种工作模式。

  • 主动模式:FTP 服务器主动向客户端发起连接请求。
  • 被动模式:FTP 服务器等待客户端发起连接请求(FTP 的默认工作模式)

防火墙一般是用于过滤从外网进入内网的流 量,因此有些时候需要将 FTP 的工作模式设置为主动模式,才可以传输数据。

vsftpd(very secure ftp daemon,非常安全的 FTP 守护进程是一款运行在 Linux 操作系 统上的 FTP 服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以 及支持虚拟用户验证等其他 FTP 服务程序不具备的特点

grep 命令后面添加-v 参数,过滤并反选出没有包含井号(#)的参 数行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配 置文件中:

[root@liruilong ~]# 
[root@liruilong ~]# iptables -F
[root@liruilong ~]# service iptables save
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
[root@liruilong ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@liruilong ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak  > /etc/vsftpd/vsftpd.conf
[root@liruilong ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@liruilong ~]# 

11.2 vsftpd服务程序

vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到 FTP 服务 器上。

  • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录 到 FTP 服务器。
  •  本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名 开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可 以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。
  •  虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独 建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使 黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

ftp 是 Linux 系统中以命令行界面的方式来管理 FTP 传输服务的客户端工具。我们首先手 动安装这个 ftp 客户端工具,以便在后续实验中查看结果

yum install ftp

11.2.1匿名开放模式

[root@liruilong ~]# systemctl restart vsftpd
[root@liruilong ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@liruilong ~]# ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
ln: failed to create symbolic link ‘/etc/systemd/system/multi-user.target.wants/vsftpd.service’: File exists
[root@liruilong ~]# systemctl start vsftpd.service
[root@liruilong ~]# systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-10-28 19:47:49 CST; 12min ago
 Main PID: 21698 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─21698 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Oct 28 19:47:49 liruilong systemd[1]: Starting Vsftpd ftp daemon...
Oct 28 19:47:49 liruilong systemd[1]: Started Vsftpd ftp daemon.
[root@liruilong ~]# 
[root@liruilong ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

11.2.2本地用户模式

11.2.3虚拟用户模式

我们最后讲解的虚拟用户模式是这三种模式中最安全的一种认证模式,当然,因为安全 性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些。

1.创建用于进行 FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密 码。例如,我们分别创建出 zhangsan 和 lisi 两个用户,密码均为 redhat:

[root@liruilong ~]# vim /etc/vsftpd/vuser.list
[root@liruilong ~]# 

 要使 用 db_load 命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低 数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件 删除

[root@liruilong vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@liruilong vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@liruilong vsftpd]# chmod 600 vuser.db
[root@liruilong vsftpd]# rm -f vuser.list
[root@liruilong vsftpd]#

第2步:创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地 用户。FTP 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

由于 Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三” 新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此, 需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录 到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于 这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。

[root@liruilong vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@liruilong vsftpd]# ls -ld /var/ftproot
drwx------ 2 virtual virtual 4096 Oct 31 13:33 /var/ftproot
[root@liruilong vsftpd]# 

第3步:建立用于支持虚拟用户的 PAM 文件。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

通俗来讲,PAM 是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认 证方式,而不必对应用程序进行任何修改。PAM 采取了分层设计(应用程序层、应用接口层、 鉴别模块层)的思想

新建一个用于虚拟用户认证的 PAM 文件 vsftpd.vu,其中 PAM 文件内的“db=”参数为 使用 db_load 命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:

auth required pam_userdb.so db=/etc/vsftpd/vuser
account requierd pam_userdb.db=/etc/vsftpd/vuser

 第4步:在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证 文件的名称修改为 vsftpd.vu,PAM 作为应用程序层与鉴别模块层的连接纽带,可以让应用程 序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要 PAM 认证时,则需要在 应用程序中定义负责认证的 PAM 配置文件,实现所需的认证功能。

在 vsftpd 服务程序的主配置文件中默认就带有参数 pam_service_name=vsftpd,表 示登录 FTP 服务器时是根据/etc/pam.d/vsftpd 文件进行安全认证的。现在我们要做的就是把 vsftpd 主配置文件中原有的 PAM 认证文件 vsftpd 修改为新建的 vsftpd.vu 文件即可


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
listen=NO
listen_ipv6=YES

guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vn
allow_writeable_chroot=YES
userlist_enable=YES
tcp_wrappers=YES
~                  

 第5步:为虚拟用户设置不同的权限。虽然账户 zhangsan 和 lisi 都是用于 vsftpd 服务程 序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、 修改、查看、删除文件,只允许李四查看文件。这可以通过 vsftpd 服务程序来实现。只需新 建一个目录,在里面分别创建两个以 zhangsan 和 lisi 命名的文件,其中在名为 zhangsan 的文 件中写入允许的相关权限(使用匿名用户的参数):

11.3简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于 UDP 协议在客户端 和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服 务(可将其当作 FTP 协议的简化版本)。

TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP 服务。而且,由于 TFTP 在传输文件时采用的是 UDP 协议,占用的端口号为 69,因此 文件的传输过程也不像 FTP 协议那样可靠。但是,因为 TFTP 不需要客户端的权限认证, 也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率 更高。

在 RHEL 7 系统中,TFTP 服务是使用 xinetd 服务程序来管理的。xinetd 服务可以用来管理 多种轻量级的网络服务,而且具有强大的日志功能。简单来说,在安装 TFTP 软件包后,还需 要在 xinetd 服务程序中将其开启,把默认的禁用(disable)参数修改为 no:

1.简述 FTP 协议的功能作用以及所占用的端口号。

答:FTP 是一种在互联网中进行文件传输的协议,默认使用 20、21 号端口,其中端口 20 (数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端发起的相关 FTP 命 令与参数。

2.vsftpd 服务程序提供的三种用户认证模式各自有什么特点?

答:匿名开放模式是任何人都可以无需密码认证即可直接登录到 FTP 服务器的验证方式; 本地用户模式是通过系统本地的账户密码信息登录到 FTP 服务器的认证方式;虚拟用户 模式是通过创建独立的 FTP 用户数据库文件来进行认证并登录到 FTP 服务器的认证方式, 相较来说它也是最安全的认证模式。

3. 使用匿名开放模式登录到一台用 vsftpd 服务程序部署的 FTP 服务器上时,默认的 FTP 根 目录是什么?

答:使用匿名开放模式登录后的 FTP 根目录是/var/ftp 目录,该目录内默认还会有一个名 为 pub 的子目录。

4.简述 PAM 的功能作用。

答:PAM 是一组安全机制的模块(插件),系统管理员可以用来轻易地调整服务程序的认 证方式,而不必对应用程序进行过多修改。

5.使用虚拟用户模式登录 FTP 服务器的所有用户的权限都是一样的吗?

答:不一定,可以通过分别定义用户权限文件来为每一位用户设置不同的权限。

6.TFTP 协议与 FTP 协议有什么不同?

答:TFTP 协议提供不复杂、开销不大的文件传输服务(可将其当作 FTP 协议的简化版本)。

第12章使用Samba或NFS实现文件共享

1987 年,微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息 块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间 共享文件变得越来越简单。

12.1 Samba文件共享

Samba 服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过 Yum 软件仓库来安装 Samba 服务程序

[root@liruilong ~]# mv  /etc/samba/smb.conf /etc/samba/smb.conf.bak
[root@liruilong ~]# ls
1.mp4  3.mp4                        applog  demo-0.0.1-SNAPSHOT.jar  redis-5.0.7
2.mp4  apache-tomcat-9.0.21.tar.gz  demo    nohup.out                redis-5.0.7.tar.gz
[root@liruilong ~]# cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/sa
samba/ sasl2/ 
[root@liruilong ~]# cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
[root@liruilong ~]# ls
1.mp4  3.mp4                        applog  demo-0.0.1-SNAPSHOT.jar  redis-5.0.7
2.mp4  apache-tomcat-9.0.21.tar.gz  demo    nohup.out                redis-5.0.7.tar.gz
[root@liruilong ~]# cd /etc/samba/
[root@liruilong samba]# ls
lmhosts  smb.conf  smb.conf.bak  smb.conf.example
[root@liruilong samba]# 

 

第1步:创建用于访问共享资源的账户信息。在 RHEL 7 系统中,Samba 服务程序默认 使用的是用户口令认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问 共享资源,而且验证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户 口令认证模式。另外,Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则 日后创建文件时将导致文件的权限属性混乱不堪

pdbedit 命令用于管理 SMB 服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。 在第一次把账户信息写入到数据库时需要使用-a 参数,以后在执行修改密码、删除账户等操 作时就不再需要该参数了。

[root@liruilong samba]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@liruilong samba]# pdbedit -a -u root
new password:
retype new password:
Unix username:        root
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-1487495890-3169242684-2109286927-1000
Primary Group SID:    S-1-5-21-1487495890-3169242684-2109286927-513
Full Name:            root
Home Directory:       \\liruilong\root
HomeDir Drive:        
Logon Script:         
Profile Path:         \\liruilong\root\profile
Domain:               LIRUILONG
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          Wed, 06 Feb 2036 23:06:39 CST
Kickoff time:         Wed, 06 Feb 2036 23:06:39 CST
Password last set:    Sat, 31 Oct 2020 15:06:10 CST
Password can change:  Sat, 31 Oct 2020 15:06:10 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题, 而且由于/home 目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的 SELinux 安全 上下文所带来的限制。在前面对 Samba 服务程序配置文件中的注释信息进行过滤时,这些过 滤的信息中就有关于 SELinux 安全上下文策略的说明,我们只需按照过滤信息中有关 SELinux 安全上下文策略中的说明中给的值进行修改即可。修改完毕后执行 restorecon 命令,让应用于 目录的新 SELinux 安全上下文立即生效。

[root@liruilong ~]# mkdir /home/database
[root@liruilong ~]# chown -Rf root:root /home/database/
[root@liruilong ~]# restorecon  -Rv /home/database/

 第3步:设置 SELinux 服务与策略,使其允许通过 Samba 服务程序访问普通用户家目录。 执行 getsebool 命令,筛选出所有与 Samba 服务程序相关的 SELinux 域策略,根据策略的名称 (和经验)选择出正确的策略条目进行开启即可:

第4步:在 Samba 服务程序的主配置文件中,根据表 12-2 所提到的格式写入共享信息。 在原始的配置文件中,[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打 印机设备。这两项如果在今后的工作中不需要,可以像刘遄老师一样手动删除,这没有任何 问题。

12.1.1配置共享盗源

12.1.2 Windows访问文件共享服务

12.1.3 Linux访问文件共享服务

12.2 NFS (网络文件系统)

12.3 autofs自动挂载服务

复习题

嗯。越看越乱,后面的感觉不太适合照着书上敲,全是问题,这本书就看到这里了,有時間在看剩下的,總體來講,是不錯的一本書,通俗易懂。適合小白學習   2020.10.31

猜你喜欢

转载自blog.csdn.net/sanhewuyang/article/details/107145661