Linux运维开发

第一章 系统环境部署

1.1 下载操作系统


去阿里源、清华源。

1.2 安装操作系统


**步骤1:**创建虚拟机。(相当于准备一台物理主机)

选择《自定义》

直接下一步。

选择《稍后安装操作系统》

选择要安装的linux的系统类型、版本。

给虚拟机起名(任意名称)。

选择操作系统的安装位置。

设置虚拟机的处理器、处理器的内核数量。(给1核心,1内核)

设置虚拟机的内存。(给2G)

网络类型,选《NAT》

使用默认。

磁盘类型,选推荐的SCSI。(在物理机上,我们配置为 SATA 或 SAS)

创建新虚拟磁盘。

给磁盘设置容量大小(给20G),并且将虚拟磁盘拆分多个文件(有好处)。

**步骤2:**将镜像放入虚拟机光驱。

复制代码
右键虚拟机 => 设置  => cd-dvd选项  => 选择镜像所在的位置

如下图所示。

**步骤3:**开机,并配置操作系统。

(1)开机。

(2)修改网卡名称

复制代码
# 修改网卡的名称为eth0开头: 为了统一标准。centos7.x操作系统默认网卡名称都是ens开头。
按下图的图示,然后末尾按一个空格,然后输入'biosdevname=0 net.ifname=0'

(3)配置用什么语言显示界面。

注意:这里的"语言环境"指的是 CentOS 7 图形安装界面(GUI)的显示语言 ,而不是安装后的 命令行(终端)语言

(4)配置时区:选到亚洲

(5)再次确认语言显示界面。

注意:这里的"语言环境"指的是 CentOS 7 图形安装界面(GUI)的显示语言 ,而不是安装后的 命令行(终端)语言

(6)选择安装哪些软件(预安装软件)

圈出来的就是要安装的。

|-----------------------------------|----------|-------------------------------------------------------|--------------|
| 名称 | 中文含义 | 作用 | 是否推荐 |
| ✅ Debugging Tools | 调试工具 | 包含 gdb、strace、perf 等,用于排查程序崩溃、性能问题 | ⭐⭐ 开发者/运维需要 |
| ✅ Compatibility Libraries | 兼容性库 | 提供旧版 CentOS 的库支持(如旧版 glibc),避免老程序报错 | ⭐ 一般服务器可不选 |
| ✅ Development Tools | 开发工具 | 包含 gcc、make、autoconf、git、vim、cmake 等核心编译开发套件 | ⭐⭐⭐⭐ 强烈推荐开发者 |
| ✅ System Administration Tools | 系统管理工具 | 包含 nmtui、system-config-*、htop、netstat、iptables 等管理命令 | ⭐⭐⭐ 运维/服务器推荐 |

(7)磁盘分区

配置boot分区

配置swap分区。

配置根分区。

最后,点击同意修改。

(8)关闭自动报日志

(9)给虚拟机配静态IP(现在是安装时配置好,以后在配置文件中修改即可)

点击《Configure》进入网卡配置。

把这个自动连接勾上。

在Method:Manual(表示设置手动分配ip,非DHCP动态分配)。

要填写数据:ip地址、子网掩码、网关、DNS服务器。

(10)修改密码(将来通过命令修改也行)

向导配置完成!

步骤4:操作系统配置完毕后,登录操作系统,检查ip、网络是否配置正确。

(1)登录上去(密码:1)

(2)检查IP地址是否正确

(3)检查磁盘分区是否正确

1.3 ssh远程连接


一、ssh连接的必要信息。

复制代码
# 1.服务器的IP地址(服务器在网络中唯一的标识)
虚拟机IP地址: 10.0.0.200/24 
虚拟机可以配置的IP地址范围是?   //10.0.0.1-10.0.0.254

# 2.端口号(表示服务器中是否开启了远程连接的服务)
Linux默认远程连接端口号: 22 默认22端口已经开启的

# 3.用户名和密码
用户名: root
密码:   1

#4.协议(windows和linux服务器连接需要使用什么语言通信)
ssh协议

(1)填写要远程控制的服务器 的ip地址

(2)填写要远程连接的操作系统的 登录密码

二、xshell连接虚拟机线路图

解析整个过程

复制代码
# 1、连接上网原理
 虚拟网卡 <=> 虚拟交换机 <=> 虚拟机 <=> 虚拟路由器 <=> 真实网卡 <=> 真实路由器(连通外网) 
虚拟网卡:
配置ip地址为10.0.0.1   #在真实主机的虚拟网卡VMnet8中配置
虚拟交换机:
配置网段为10.0.0.0,配置子网掩码:255.255.255.0  #在安装过程或者配置文件中修改
虚拟机:
配置ip地址为10.0.0.200/24,配置网关为:10.0.0.2  #VMvare虚拟机中设置

虚拟路由器:
配置网关为10.0.0.2      #VMvare虚拟机中设置


# 2、问题
(1)为什么虚拟机、虚拟路由器要配置网关?
因为虚拟机要连接虚拟路由器实现连网。
(2)最终虚拟机可以连通外网?
因为虚拟机连接了虚拟路由器,而虚拟路由器连接真实网卡(宿主机),
真实网卡又连接了真实的路由器/wifi,从而达到连通外网。
(3)为什么虚拟网卡不用配置网关?
因为虚拟网卡仅用于连接到虚拟交换机,再通过虚拟交换机连接虚拟机,
虚拟网卡不需要上外网,仅仅用于连通虚拟机而已。

实操:配置各种设备的ip地址、网关

(1)虚拟机的ip地址、网关在哪配置?

(2)虚拟交换机的ip地址、虚拟路由器的网关在哪配置?

复制代码
在VMvare软件中 => 编辑(软件左上方) => 虚拟网络编辑器

(3)虚拟网卡(VMnet8)的ip地址在哪里配置?

三、无法连接虚拟机的排查思路(重要!)

1、检查本地连接中的虚拟网卡 (vmnet8)的IP地址、虚拟机IP地址,是否在相同的网段

复制代码
(1)虚拟网卡VMnet8的IP地址:10.0.0.1  # 这个虚拟出一个宿主机ip地址(真实物理机)
(2)VMvare虚拟交换机的网段:10.0.0.0  # 它要给linux主机分配ip地址,要和虚拟机在同个网段
(3)虚拟机的IP地址:10.0.0.200       # Linux服务器的ip地址
虚拟网卡VMnet8不用配网关  #因为不用上网,虚拟网卡作用就是帮助宿主机连接到虚拟机的。

2、检查虚拟机IP地址是否正确(10.0.0.200/24)

复制代码
# 操作
通过命令'ip a'来查看ip地址。
错误原因
情况1:如果是192.168开头的说明安装虚拟机的过程中配置错误。
情况2:如果IP地址没问题,查看配置文件,如果'BootProto=DHCP', #如上图
则是开启了DHCP动态分配地址,需要改为手动分配IP地址。
情况3:如果IP地址是空的啥都不显示,说明网络管理被NetworkManager接手了
Linux系统管理网络服务:
1)network 默认使用这个服务配置了10.0.0.200
2)NetworkManager 默认是空的地址
必须关闭一个服务: 关闭NetworkManager
命令:
'systemctl stop NetworkManager'
'systemctl disable NetworkManager'

3、检查虚拟交换机 的子网地址、虚拟机的IP地址,是否在相同网段

复制代码
# 1、找配置的地方
在VMvare软件 => 编辑 => 虚拟网络编辑器 => 更改设置

# 2、给虚拟交换机配置子网地址、子网掩码(是在VMvare软件 => 虚拟网络编辑器)
=> 选择vmnet8配置子网为10.0.0.0  255.255.255.0
3、给虚拟路由器配置网关(也是在VMvare软件 => 虚拟网络编辑器)
=> 在点击NAT设置网关地址为10.0.0.2

四、无法连接外网排错思路

复制代码
# ping命令在linux系统会持续不断的ping 停不下来 使用ctrl+c 强制结束
1.ping www.baidu.com   
[root@oldboyedu ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=128 time=21.1 ms    # 可以ping通
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=2 ttl=128 time=17.0 ms

1、检查虚拟机的ip地址、网关是否正确?

复制代码
# 查看虚拟机的网关
'ip route'

2、需要检查虚拟交换机的网段、子网掩码是否配置正确?

3、检查虚拟路由器的网关是否配置正确?

复制代码
VMvare软件 => 编辑(左上角) => 虚拟编辑器 => NAT => 网关:10.0.0.2

4、检查虚拟机DNS地址有没有配错?

复制代码
# 查看DNS服务器地址
'cat /etc/resolv.conf'
修改DNS服务器地址
'vi /etc/sysconfig/network-scripts/ifcfg-eth0'

第二章 Linux基础核心

2.1 系统核心目录


|-----------|--------------------------------------------------|-----------|------------------------------------------------------------------------------|
| 常用目录 | 功能 | 不常用目录 | 功能 |
| /bin | 二进制命令所在的目录(普通命令 => 普通用户和超级管理员root) | /boot | 系统内核的位置。系统引导程序所需要的文件目录,相当于Windows中的C盘 |
| /dev | /device缩写,设备文件目录,如磁盘、光驱 => /dev/sr0 | /lib | 共享库文件和内核模块存放目录,软件安装、运行依赖库文件.a、.so文件 |
| /etc | 系统配置文件目录,启动程序,几乎所有的软件都会把自己的 配置文件安装在/etc中 | /mnt | 临时储存设备的挂载点,如插入u盘、移动硬盘 ⇒ 先挂载 ⇒ /mnt中访问 其实可以是根目录下面的任意创建一个空目录,都可以用来当做临时挂载点。 |
| /home | 普通用户的家目录,默认用户数据存放目录,simida账号 => /home/simida文件夹 | /proc | process进程目录,操作系统运行时,进程信息和内核信息存放在这里(类似window任务管理器) |
| /opt | 额外的应用软件包, 安装qq、游戏、wps办公软件 | /usr | 用户或系统软件应用程序目录(类似Windows中的Program files) |
| /root | Linux超级权限用户root的家目录,超级管理员root => /root | /var | 日志文件所在的位置 |
| /sbin | 和管理系统相关的命令,【超级管理员用,s = super超级】 | | |
| /tmp | 临时文件目录,这个目录被当作回收站使用(类似window回收站) | | |

2.2 linux快捷键


|----------|----------------------------|
| 快捷键 | 功能 |
| Ctrl + L | 清屏 |
| Ctrl + C | 强制结束 |
| Ctrl + U | 剪切 |
| Ctrl + Y | 粘贴 |
| 复制 | 鼠标选中即为复制(需在XShell软件设置里面配置) |

2.3 特殊符号


|----------------|-----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| 符号 | 功能 | 示例 |
| A && B | 只有命令A执行成功,命令B才会被执行。 | cho hehe && touch 1.txt 结果:1.txt不会被执行。 |
| A || B | 只有命令A执行失败,命令B才会被执行。 | echo hehe || touc 1.txt 结果:hehe会被打印,1.txt不会被创建。 |
| A ; B | 不管命令A执行成功还是失败,命令B也会被执行。(用于分隔多条命令!) | |
| `` 或者 () | 被这两个符号包裹的命令,执行优先级最高! | rm -rf \`find oldboy -name "all"\` rm -rf (find oldboy -name "all") 结果:会先执行find,再执行rm。 |
| # | 注释 | |
| | (1)awk中,是用于取列。 (2)命令行中,读取环境变量。 (3)普通用户的命令提示符 | | | ! | (1)在vim编辑器中,表示强制。 (2)在find、awk中,表示取反。 (3)在命令前面,表示找出最近一次以该命令开头的命令,并执行。 | | | \| | 管道符。 | | | 单引号 | 不解析变量,仅仅当成内容看待。 | echo LANG 结果:LANG | | 双引号 | 如果有变量,会解析引号内的变量。 | echo LANG 结果:en_US.UTF-8 |
| 不加引号 | 和双引号的效果一致。 | |
| A > xx.txt | 先清空xx.txt文件的所有内容,然后将命令A的执行结果,会写入到xx.txt文件中。要求:命令A必须执行成功。 | |
| A >> xx.txt | 直接将命令A的执行结果,追加到xx.txt文件的末尾。要求:命令A必须执行成功。 | |
| A 2> xx.txt | 先清空xx.txt文件的所有内容,然后将命令A的执行结果,会写入到xx.txt文件中。要求:命令A必须执行失败。 | |
| A 2>> xx.txt | 直接将命令A的执行结果,追加到xx.txt文件的末尾。要求:命令A必须执行失败。 | |
| A < xx.txt | 将xx.txt文件的内容,作为命令A的输入。 | tr "o" "a" < a.txt 执行结果:把文件a.txt的所有字母o,全部替换成字母a。 |
| << | | |
| | 表示从括号内取出任意单个 | 例1:0-9,就会取出0-9任意一个数 例2:a..z,就会取出a、.、z中的任意一个 例3:a-z,就会取出a-z任意一个字母 |
| { } | 用于生成序列 | {1..3},就会生成1、2、3序列 |
| ? | 表示任意单个,是占位符,常常用于占位 | 例1:??.* 例2:??.??? |
| \ | 取消别名,还原原意 | 理解1:ll,其实就是ls -l。即:\ll则表示去掉参数,只剩ll,会提示命令不存在。 理解2:cp,其实是cp -i。即:\cp则就表示去掉默认的参数,只剩cp。 使用场景:cp复制过程中,如果目标位置已经存在同名文件,则会询问是否覆盖。 |

2.4 软硬链接


一、软链接(在企业中使用最多)

复制代码
# 一、软链接作用
(1)简化路径与版本管理。可以为深层目录创建快捷入口 或者 常用于去版本号。 
// 例如:ln -s /usr/local/nginx-1.24.0 /usr/local/nginx
(2)代码上线
(3)软件平滑升级与切换。当软件升级时,只需修改软链接的指向即可,无需修改引用该路径的所有脚本和配置。
//例如,将 Nginx 从 1.24.0 升级到 1.26.0,只需执行 ln -snf /usr/local/nginx-1.26.0 /usr/local/nginx 即可
(4)跨目录与跨磁盘引用。软链接可以指向不同文件系统(如不同分区或磁盘)上的文件或目录,
     有效解决磁盘空间不足的问题,实现资源共享。

*********************************************************************

# 二、判断是否软链接
通过命令:ls -lah,如果文件类型标识符开头是l,说明是软链接。
//命令执行结果:第一行开头的l,就代表软链接。
lrwxrwxrwx 1 root root 9 Aug link.txt -> test.txt   

*********************************************************************

# 三、软链接语法
格式:ln -s 目标源文件 软链接名称    //例如:ln -s gitlab-10-12.6_x86-64 gitlab

*********************************************************************

# 四、软链接的特点
(1)有独立的inode。                      //inode与目标源文件不一样
(2)可以跨文件系统。                     //可以跨磁盘分区。
(3)本质是路径文件,存放目标源文件的指针。 //删除软链接,不会影响目标源文件。
(4)依赖原文件。                         //把原文件删掉,那么软链接失效。(此时通过ll查看时,会红字显示)
(5)可链接目录、文件。

*********************************************************************

# 五、软链接易错踩坑
踩坑点1:
cp复制软链接时,默认只会复制软链接本身,而不是链接到目标源文件。 //若想通过cp复制原文件,需要加上选项-L

踩坑点2:
tar打包软链接陷阱,默认不会打包原文件。
//tar如果想打包原文件,需要加上选项-h。例如:tar -zcvhf test2.tar soft.txt real.txt

踩坑点3:
悬空软链接:软链接可以指向不存在的文件和目录,但不可以访问。

二**、硬链接(95%用不上)**

复制代码
# 一、硬链接作用
硬链接本质上是一个文件的"别名"或"附加入口",它允许同一个文件拥有多个不同的文件名,
这些文件名在文件系统中地位完全平等。 其核心作用包括:
1、数据保护与防误删:硬链接的最大价值在于保护重要文件。只要存在至少一个硬链接,文件数据就不会被真正删除。
2、节省存储空间:硬链接不复制文件数据,而是共享同一份数据块,因此能有效避免磁盘空间的浪费,常用于备份和快照场景。
3、实现多访问点:在不同目录下为同一文件创建硬链接,可以从多个位置访问和修改同一份数据,确保数据一致性。

*********************************************************************

# 二、怎么看是不是硬链接
方法1:通过命令:ls -l,看inode号码,如果两个或多个文件的inode号完全相同,则它们互为硬链接。
方法2:查看链接计数:使用 ls -l 命令,输出结果的第二列数字即为该文件的硬链接数量(link count)。
      普通文件初始值为1,每增加一个硬链接,该数字就加1。

*********************************************************************

# 三、硬链接语法
1、格式:ln 源文件 硬链接名。
2、示例:为 /etc/hosts 文件创建一个硬链接作为备份。
   执行命令:ln /etc/hosts /opt/hosts_bak

// 创建后,修改 /etc/hosts 文件,通过 /opt/hosts_bak 也能看到相同的修改
// 即使误删了 /etc/hosts,通过 /opt/hosts_bak 依然可以正常访问文件内容
// 硬链接和文件本身指向同一块磁盘空间,修改一个文件会影响到另一个文件。

*********************************************************************

# 四、硬链接特点
1、共享inode,地位平等。 //硬链接与原文件共享同一个inode,它们在文件系统中没有主次之分,地位完全平等。
                       //修改任何一个名字下的文件内容,都会同步反映到所有其他名字的文件上。
2、不能跨文件系统。   //由于inode编号只在同一文件系统内唯一,硬链接无法跨越不同的磁盘分区或文件系统创建。
3、不能链接目录。     //出于防止文件系统产生循环引用的安全考虑,普通用户不允许为目录创建硬链接(root用户也受限)。
4、目录的硬链接计数规则:
(1)一个空目录默认有2个硬链接(ls -l 输出第二列为2)。
 //这2个链接分别来自:当前目录的自引用 . 和父目录对该目录的引用。
(2)每当在该目录下创建一个新的子目录,父目录的链接计数就会增加1(因为子目录中的 .. 指向父目录)。
5、删除行为。     //删除一个硬链接(或原始文件名),只是减少了该文件的链接计数。
                 //只有当链接计数变为0时,系统才会释放该文件所占用的磁盘空间和数据块。

三、笔试题

复制代码
# 一、硬链接和软链接的区别
(1)硬链接和源文件的inode号码一样,软链接和原文件inode不同
(2)硬链接不能跨文件系统,软链接可以跨文件系统(等讲到磁盘就知道了)
(3)目录的硬链接默认有2个,文件有1个。
(4)删除硬链接不影响原文件,如果硬链接个数为0,则文件被删除
(5)删除软链接不影响原文件,如果删除源文件,则文件被删除
(6)软硬链接都是普通文件,可以直接使用rm删除
(7)inode号码为0,并且文件没有被进程调用,文件才真正的被删除。(一阶段结尾演示)
(8)目录不能作为硬链接,文件既可以硬链接、也可以软链接。  

2.5 文件属性、inode


一、inode、文件属性

复制代码
# 一、什么是inode号码?(面试题)
//形象理解:inode相当于档案室的卡片,记录文件所有属性、数据存放地址。
Linux文件系统中,用来存放文件元信息的一块空间,每一个inode拥有唯一编号,这就是inode号码。
inode保存的信息:
文件大小
文件权限(rwx)
属主、属组 uid/gid
文件时间戳(atime/mtime/ctime)
文件数据块指针(指向磁盘真正存放内容的 block 位置)

*****************************************************************

# 二、如何查看inode号码占用情况?
命令:【df -i】
//通过第二列可看到每个磁盘Inode号码总量。
//通过第三列可看到每个磁盘Inode号码已经使用的数量。
//通过第四列可看到每个磁盘Inode号码剩余可用数量。
文件系统           Inode 已用(I)   可用(I) 已用(I)% 挂载点
udev              980855    1906    978949       1% /dev
tmpfs            1000255    2432    997823       1% /run
/dev/sdd3        7159808  317164   6842644       5% /
tmpfs            1000255     284    999971       1% /dev/shm
tmpfs            1000255       5   1000250       1% /run/lock
tmpfs            1000255      17   1000238       1% /sys/fs/cgroup
/dev/sdd5        6561792     747   6561045       1% /data
/dev/sdd2          65536     291     65245       1% /boot
/dev/sdd1              0       0         0        - /boot/efi
tmpfs            1000255      45   1000210       1% /run/user/1002
/dev/sde1      947270488    9789 947260699       1% /media/zhangmiao/_dde_data

******************************************************************

# 三、易错坑点
踩坑点1:
inode不记录文件名称,文件名称是记录在目录中的。

二、面试题

复制代码
# 一、为什么明明电脑存储空间还有很多,却存不了文件了?
答:一台电脑只有固定的inode号码,其总量随磁盘大小变化,
每个文件最少占用1个inode号码,如果电脑上存储了大量的空文件,
会导致占用inode号码,导致无码可用(10M空文件 = 一千万inode号码)

2.6 块设备、字节设备

复制代码
# 一、查看块设备
[root@oldboyedu /]# ll /etc/dev
brw-rw----    1 root     disk 8,   0 Jul 31 08:50 sda
brw-rw----    1 root     disk 8,  16 Jul 31 08:50 sdb
brw-rw----    1 root     disk 8,  32 Jul 31 08:50 sdc

*****************************************************************

# 二、查看字节设备(有几个文件,有特殊作用)
(1)urandom文件:查看此文件时,会一直吐数据。(了解)
[root@oldboyedu /]# ll /dev/urandom
crw-rw-rw- 1 root root 1, 9 7月  31 08:50 /dev/urandom

(2)zero文件:从这个文件读取定量数据,然后写入到空文件,生成指定大小的文件。
# 工作中一般不用,但是做测试需要用到。
案例:我要生成一个10G大小的文件,那我上哪找去?
# 下面命令的含义:从/dev/zero里面取内容,输出到test.txt文件中,每次输出1M大小,输出10000次。
# if==>input file   of==>output file   bs==>block size(每次读取大小)
[root@oldboyedu /]# dd if=/dev/zero of=test.txt bs=1M count=10000

(3)null文件:类似黑洞,可以往里持续不断的吃
[root@oldboyedu /]# ping -W1 -c1 www.baidu.com > /dev/null  #此时输出的内容不会显示在屏幕上
[root@oldboyedu /]# echo $?   #$?用于判断上一条命令的执行结果,0表示成功,非0表示失败。

2.7 正则表达式

1 什么是正则表达式

复制代码
# 1、正则表达式的作用
(1)宏观层面:用于查找日志内容时,进行过滤。
(2)微观层面:找文件里面的内容、找文本、找字符串
2、如何区分通配符和正则表达式的区别
(1)不需要思考的判断方法:三剑客awk、grep、sed都是正则,其他都是通配符。
(2)区分通配符和正则表达式最简单的办法:
如果是找文件或者目录的名称,用通配符。
如果是找文件内容,用正则表达式。

2 正则表达式

复制代码
grep匹配的原则:按行匹配,每行互不影响。
1 普通正则表达式
(1)^   表示什么开头。
(2)[]  中括号表示从括号内取出一个字符,里面的内容是或的关系。
并且中括号内全是还原原意,没有元字符。
(3)$   表示以什么结尾。
(4).   点表示任意单个字符的意思。
(5)*   表示前面的字符,重复0次、1次、无数次。
如果前面不是字符,而是是元字符(匹配规则),那么表示重复执行前面的xx匹配规则。
(6).*  表示任意一串字符串。若前后没有其他限制,则表示一整行内容。(默认是贪婪匹配)
(7)
2 扩展正则(需要加选项 -E)
(1)+    表示前面的字符出现1次或1次以上。
(2)|    表示或者的意思。
(3){n,m}    表示前面的字符至少出现n次,最多出现m次。 //先匹配m次的,再匹配n次的
(4){n}  表示前面的字符恰好出现n次。
(5)()   表示一个整体。
(6)\w   表示单词字符  \w = a-z A-Z 0-9 _
(6)\b   表示边界,与非单词字符直接的界限。如果一边是\w,另一边肯定不是\w。
3 易错点
(1)^匹配的一行的开头第一个字符,$匹配的是一行的末尾的最后一个字符。
/*
例如:找一行里面,有没有包含字符串oldboy
错误写法: grep '^oldboy$' test.txt
正确写法: grep 'oldboy' test.txt
*/
3 实战演练1(普通正则)
(1)找以字母A开头的
grep '^A' test.txt
(2)找以字母A或者B或者C开头的
#注意:这个开头不是指单词开头,是一行的开头首字符是A或B或C
grep '^[ABC]' test.txt
(3)找出26个字母包含大小写
grep '[a-zA-Z]' test.txt
(4)找以字符.结尾的
grep '[.]' test.txt     #中括号内全是还原本意,不代表元字符,写什么就是找什么
或者: grep '.$' test.txt
(5)找除了oldboy以外的其他内容
^在中括号内表示取反,如果出现^^,第一个表示取反,第二个是原意。
grep '[^oldboy]' test.txt
或者 grep -v 'oldboy'
(6)找所有的数字
grep '[^a-Z]' test.txt
(7)找以字母M结尾的
#注意:$表示一行的末尾最后一个字符是M
grep 'M$' test.txt
(8)找出所有的空行
grep '^$' test.txt
(9)ab*表示什么含义

条件:那么a必须存在。b可以是0、1、无数个。
匹配:a、ab、abb、abbb都是满足的。
(10)要匹配:hello:test123
正则:h.*3 。含义:以h开头,中间可以是任意一串内容,以3结尾。
grep 'h.*3' test.txt(默认是贪婪匹配)
4 实战演练2(扩展正则,在grep后面加上选项 -E,才能使用扩展正则)
(1)找出所有的8出现1次或1次以上的。例如:8、88、888、8888、...
grep -e '8+' test.txt
(2)找出含linux、lizhenya的字符串
grep -e 'linux | lizhenya' test.txt
(3)把test.txt文件内的注释和空行给去掉
grep -ve '^# | ^$'  //v表示取反
(4)原文件3521325888888165,
grep -e '8{2,4}'    //得到的结果就是:8888。因为后面没有连续3个8了。
匹配过程:先匹配8有没有出现四次,即8888。后面再继续往后看,看8有没有出现三次,以此类推,
一直看到指定的n次。
(5)原文件352132588888888165
grep -e '8{2,4}'    //得到的结果就是:8888888。因为后面没有连续2个8了。
匹配过程:先匹配8有没有出现四次,即8888。后面再继续往后看,看8有没有出现三次,以此类推,
一直看到指定的n次。
(6)原文件:5495988888645
grep -e '8{2}'    //结果:8888。
匹配过程:先看有没有连续两个8,以此类推,继续看有没有连续两个8
(7)原文件:5495988888645
grep -e '8{3}'    //结果:888。
匹配过程:先看有没有连续三个8,以此类推,继续看有没有连续三个8
(8)找lizhengya 或者 lizhengua
grep -e 'lizhengya | lizhengua' test.txt
或者 grep -e 'lizheng(y|u)a' test.txt

第三章 文件管理

3.1 mkdir 创建目录


一、mkdir语法

复制代码
命令:mkdir [选项] 目录1 目录2...     #作用:默认创建一个或多个目录
选项: 
-p    #用于递归创建多级目录,如果目录不存在就创建

二、案例练习

复制代码
1、场景:在当前目录下,创建3个文件夹:test1、test2、test3
mkdir test1 test2 test3
或者
mkdir test{1..3}



2、场景:在test目录下,创建test01。在test01下再创建test02。
mkdir -p test/test01/test02

3.2 touch 创建文件


一、touch语法

复制代码
命令:touch 文件1 文件2..    #作用:用于创建一个或多个文件

二、易错踩坑

复制代码
1、touch不支持创建目录,在指定目录下创建文件,该目录必须存在。
   例如:touch test/test1/test2/a.txt,则test目录必须存在。

三、案例练习(touch)

复制代码
1、在根路径的etc目录下,创建一个文件a.txt
touch /etc/a.txt

2、在当前目录下,创建两个文件:a.txt、b.txt
touch a.txt b.txt

3.3 rm 删除文件/目录


一、rm语法

复制代码
命令:rm [选项] 文件1 文件2...    #作用:默认是用于删除指定的目录、文件。
选项:
-r    #递归删除(适用于删除目录)
-f    #表示强制删除,取消交互询问。即使该文件不存在,也不会报错。

二、易错踩坑

复制代码
1、rm 默认只能删除文件,删除目录必须加 -r。

2、系统默认别名 alias rm='rm -i',不加-f删除文件会弹出确认询问。

三、案例练习(rm)

复制代码
1、删除单个普通文件 test.txt
rm test.txt

2、删除文件,不弹出确认询问,强制删除
rm -f test.txt

3、删除空目录/非空目录(必须加-r)
rm -r testdir

4、强制递归删除目录,不进行交互询问(最常用)
rm -rf testdir

5、一次性删除多个文件 a.txt b.txt c.txt
rm -f a.txt b.txt c.txt

6、利用大括号批量删除 test1.txt test2.txt test3.txt
rm -f test{1..3}.txt

7、删除/tmp目录下指定文件
rm -f /tmp/log.txt

3.4 find 查找文件


一、find语法

复制代码
命令:find 目标位置 [选项 选项值]    #根据目标位置 递归 查找文件。
选项:
-maxdepth `目录层级`  #不递归,按指定目录层级查找。 例如:-maxdepth 1   
-iname               #按名称查找,且不区分大小写              
-name `文件名称`      #按文件名称查找。支持模糊查询,支持使用通配符* 
-type `文件类型`      #按文件类型查找。f文件、d目录 、c块设备、l软链接 、B字节设备   
-size `+-n单位`      #按文件大小查找。例如:+10G找大于10G,-10G找小于10G,10G找等于10G
-mtime `+-n`         #按修改时间查找。例如:+7找7天前,-7找7天内,7找第7天修改的 
-exec 命令 {} \;     #表示如果找到文件后,对找到的文件进行操作。(\;表示对分号转义)

二、易错踩坑

复制代码
踩坑1:
示例:find -type f '.txt'

踩坑2:
-maxdepth 选项必须紧跟查找路径后、所有过滤条件之前。
错误示例:find ./ -name '.txt' -maxdepth 1
正确示例:find ./ -maxdepth 1 -name '*.txt'

踩坑3:
3、-exec {} ; 格式固定,{} 和 ; 前后需要空格,缺少空格命令报错。
示例:

踩坑4:
多个条件默认是&&关系;需要||必须手动写: -or。

三、案例练习

复制代码
1、查找当前目录下的所有普通文件
find ./ -type f

2、查找当前目录下的所有目录
find ./ -type d

3、按照文件的名称查找
find ./ -name "指定文件/目录的名称"

4、按照文件名称进行模糊查找
find ./ -name "*.txt"

5、按照文件名称进行模糊查找(名称不区分大小写)
find ./ -iname "*.txt"

6、查找正好前第7天的那一天,被修改的文件(没意义)
find ./ -mtime 7

7、查找7天内,被修改的文件
find ./ -mtime -7

8、查找大于5M,并且小于10M的文件
find ./ -size +5M -size -10M

9、查找等于5M,或者小于10M的文件
find ./ -size 5M -or -size -10M

10、只在 ./oldboy 一级目录查找test.txt,不检索子目录
find ./oldboy -name "test.txt" -maxdepth 1 -type f

11、找到所有txt文件,使用ls列出详情(搭配-exec)
find ./ -name "*.txt" -exec ls -lh {} ;

12、找到7天前的日志文件并删除(生产慎用!建议先ls验证)
方法1:find ./log -name '.log' -mtime +7 -exec rm -f {} ;
方法2:find ./log -name '.log' -mtime +7 | xargs -I rm -rf {}
方法3:find ./log -name '*.log' -mtime +7 | xargs rm -rf

13、查找all.txt文件,找到后复制到/opt目录下
方法1:find ./ -name 'all.txt' -exec cp {} /opt/ ;
方法2:find ./ -name 'all.txt' | xargs -i @ cp @ /opt    //占位符可在 -I后面自定义

14、移动all.txt文件,移动到/opt目录下
方法1:find -name 'all.txt' | xargs -I {} mv {} /opt    //占位符可在 -I后面自定义
方法2:find -name 'all.txt' -exec cp {} /opt

四、生产环境下的应用

复制代码
1、场景:查找修改时间小于7天的文件,系统中病毒被黑客攻击,文件被篡改
#通过find查找前7天内修改的文件,看看哪些文件被篡改
find ./ -type f -mtime -7

2、场景:查找oldboy目录下修改时间为7天前的文件,找出来全部删除
方法1: find ./oldboy -mtime -7 | xargs rm  #rm的别名rm -i会失效。
方法2: find ./oldboy -mtime -7 -exec rm -f {} ;
方法3: rm -rf find ./oldboy -mtime -7  #使用反引号(会优先执行反引号里面的命令)

3.5 cp 复制文件/目录


一、cp的语法

复制代码
命令1:cp [选项] 原文件1 原文件2... 目标位置    #将指定文件或目录,移动到目标位置。
命令2:cp [选项] 原文件 目标位置/[文件新名称]   #复制1个文件到目标位置,并改名。
选项:
-r    //递归复制目录。但是在处理软链接、设备文件有缺陷。(不推荐)
-R    //递归复制目录。(推荐生产环境使用)
-i    //默认自带,无需手动添加

二、易错踩坑

复制代码
踩坑1:
cp默认受别名 alias cp='cp -i' 影响,覆盖文件会交互询问是否覆盖。

踩坑2:
\cp 反斜杠作用:临时取消别名,实现强制覆盖,不询问。

三、案例练习

复制代码
练习1:
把当前目录下的a.txt 拷贝到/test目录,并且将新文件名称改为a.txt.bak
cp ./a.txt /test/a.txt.bak

练习2:
复制当前目录下的test.txt、test01.txt这两个文件到目录/tmp下
cp test.txt test01.txt /tmp

练习3:
如果目标位置已经存在了要复制的文件,怎么避免询问每个文件要不要复制,强制复制?
\cp test.txt /tmp    //在命令前面加个反斜线

3.6 mv 移动文件/目录


一、mv语法

复制代码
写法1:mv 文件1 文件2... 目标位置      //将指定文件或目录,移动到目标位置
写法2:mv 源文件 目标位置/[文件新名称]  //将指定文件或目录,移动到目标位置,并改名。

3.7 vim 编辑文件


复制代码
# 1、先安装vim编辑器(默认CentOS9是没有自带vim)
执行命令:dnf -y install vim


# 2、vim的三种模式
(1)命令模式:通过vim刚刚进入时就是该模式,此状态下可以执行各种特殊指令。
(2)插入模式:在命令模式下,通过键盘按键:[a、i、o、O]可以进入插入模式,
在该模式下,可以对文件内容进行编辑。
在完成文件编辑后,通过键盘按键:[ESC]可以回到命令模式。
(3)底行模式:在命令模式下,通过键盘按键:[:wq 或者 :x]可以退出到linux命令行。

(1) 命令模式:复制、粘贴、移动光标、撤销与恢复。

小技巧:进 入vim编辑器,先查看左下角有没有提示信息,如果没有任何信息,代表你当前位于命令模式!

|----------|------------------------------|
| 命令 | 功能 |
| o | 在当前行后面插入一空行 |
| O | 在当前行前面插入一空行 |
| dd | 剪切或删除光标所在行 |
| ndd | 从光标位置向下连续剪切或删除 n 行 |
| yy | 复制光标所在行 |
| nyy | 从光标位置向下连续复制n行 |
| p | 粘贴 |
| u | 撤销上一次命令,相当于Windows中的Ctrl + Z |
| gg | 回到文件顶部 |
| G | 回到文件末尾 |
| Ctrl + R | 恢复,与u相对应 |

(2) 插入模式(编辑模式):只能编辑文件内容(写字)

如何进入编辑模式?(记住 i 即可)

i :在当前光标的前面插入内容

a:在当前光标的后面插入内容

o:在光标的后一行插入内容

O:在光标的前一行插入内容

(3) 底行模式(末行模式):保存文件、退出文件、显示行号、搜索关键词。

!叹号代表强制,强制保存、强制退出、强制保存并退出!

|-----------------|--------------------------|
| 命令 | 功能 |
| :w 文件 | 另存为 |
| :w | 保存(ctrl + s) |
| :q | 退出, 如果文件有修改且没有保存,此时不允许退出 |
| :q! | 强行退出, 不保存退出 |
| :wq | 保存并退出 |
| :x | 保存并退出 【建议运维选择】 |
| :set nu | 设置行号,取消行号使用:set nonu |
| :%s/旧关键词/新关键词/g | 文本替换 |
| :noh | 取消高亮 |
| /关键词 | 搜索某一关键词 |

复制代码
# 3、:wq和:x有什么区别(面试题)
情况1:如果文件内容有改变,两者的效果是一样的。
情况2:如果文件内容没有改变,:x不会改变文件的最后修改时间,但是:wq会更新文件的最后修改时间。 
总结:推荐使用[:x]
4、通过vim编辑后,如果忘记保存的话,会报错
报错原因:如果通过vim打开某个文件时,没有直接打开文件,而是一堆报错,
那代表你这个文件之前没有保存就强制退出了,触发了Vim的备份机制,
产生了一个名称为【.文件名称.swp】的备份文件。
解决方案:把产生的备份文件删掉,通过命令:【rm -rf .该文件名称.swp】

编辑

3.8 cat 查看文件


一、cat(看小文件)

复制代码
一、语法
命令:cat [选项] 文件1 文件2...    //一次性加载全部内容。可同时看多个文件。
选项:
-n    //显示行号
-A    //在结尾前加$符号,就可以看到该行以什么结尾


二、实战演练
1、查看网卡配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
2、合并文件
cat 1.txt 2.txt > all.txt

二、less(查看大文件)

复制代码
一、less语法
命令:less [选项] 文件名 
选项:
-N        #显示行号
操作键说明
空格键     #向下翻页。
b         #向上翻页。
键盘上下方向键   #控制向上/向下翻页。
/搜索词         #搜索某个关键词,并跳转到该词的位置。
q     #退出查看。
n     #跳到下一个匹配的搜索结果。
N     #跳到上一个匹配的搜索结果。
G     #快速到文件尾部
g     #快速到文件首行
100g  #快速到文件100行
200G  #快速到文件200行
h     #查看帮助信息

三、head(看前面10条内容)

复制代码
一、head语法
命令:head [选项] 文件    //默认查看文件前10行内容。
选项:
-n `行数`  //表示指定要查看的行数。若行数为负数,则查看除去最后这几行的其他所有内容
-v         //执行结果第一行显示文件名称。例如:==> test.txt <==


二、实战演练
1、查看前10行内容
head test.txt
2、查看前20行内容
head -n 20 test.txt

或者
head -n20 test.txt
3、查看除掉最后3行的其他所有内容
head -n -3 test.txt
4、打印前20行内容,要求显示文件名称
head -n 20 -v test.txt

四、tail(看后面10条内容)

复制代码
# 一、tail语法
命令:tail [选项] 文件     //默认看文件最后10条内容。  
选项:
-n 行数   //表示指定要查看的行数。 //从后往前看
-f       //是否持续显示文件末尾内容。(持续监控文件,文件必须存在)
-F       //是否持续显示文件末尾内容。(即使文件不存在,也能监控)
-v       //执行结果第一行显示文件名称,例如:==> test.txt <==

3.9 sort 排序


一、sort语法

复制代码
命令:sort [选项] 文件名    #默认按第一列正序排序,不会修改文件内容。
选项:
-r          #逆序排序
-n          #按数值从小到大排序
-k`数值`    #对指定列数进行排列
-o 文件名   #排序后的结果,输出到指定文件(相当于保存修改后的文件)
-u          #排序时去重(其实就是uniq的效果)

二、易错踩坑

复制代码
踩坑1:
sort 默认不修改原文件内容,只是在屏幕输出。

踩坑2:
sort以空格、tab为分隔符,来进行判断是第几列。

踩坑3:
想要覆盖原文件不要用:sort num.txt > num.txt   // > num.txt会优先执行,会先清空文件!
想要覆盖原文件请用:sort -u num.txt -o num.txt
或者:sort -u num.txt > tmp.txt

三、案例练习

复制代码
练习1:
对文件内的数字进行默认排序(默认排序有坑点!)
#原文件:1 5 6 2 10 (原文是竖着排列,为了节省笔记空间写成横着)
sort test.txt
#命令输出结果:1 10 2 5 6

练习2:
对文件内的单词按第二列降序排序

#原文件:
oldboy 4
lidao 10
test 22
lizhenya
oldboy 41
test 20
lidao 11
lidao 20
sort -nk2 test.txt

#命令输出结果:
lizhenya
oldboy 4
lidao 10
lidao 11
lidao 20
test 20
test 22
oldboy 41

练习3:
对文件内容排序,然后进行去重,最后写入到原文件中(实现原地覆盖)
#错误示范:sort test.txt | uniq > test.txt
#错误原因:这里涉及命令优先级。其中重定向 > 管道 > 命令分隔符(&&、||)
正确示范1:sort test.txt | uniq > tmp.txt  &&  mv tmp.txt test.txt
正确示范2:sort -u test.txt -o test.txt

#原文件
oldboy
lidao
test
lizhenya
oldbyo
test
lidao

#命令输出结果
lidao
lizhenya
oldboy
oldbyo
test

3.10 uniq 去重


一、uniq的语法

复制代码
命令:uniq [选项] 文件名    #只能对文件内相邻上下行的内容进行去重处理。(要先sort)
选项:
-c     #去重统计

二、易错踩坑

复制代码
踩坑1:
默认只去重相邻上下行的内容

踩坑2:
看行末尾有没有空格,空格会导致数据不一致,会影响排序。
可以通过命令:cat -A,查看末尾有没有空格。

三、案例练习

复制代码
练习1:
对文件内容进行去重
#原文件:
oldboy
lidao
test
oldboy
lidao
test
lidao

#第一次去重:咦,咋都没成功去重?噢噢,原来只能去重挨着的,那就sort排序一下
【执行命令】uniq test.txt
oldboy
lidao
test
oldboy
lidao
test
lidao

#第二次去重:咦,咋test还是重复的?
【执行命令】sort test.txt | uniq
lidao
oldboy
test
test

#此时可通过cat -A查看以什么字符结尾,有没有空格
【执行命令】cat test.txt | sort | uniq | cat -A
lidao $
oldboy $
test$
test $    #找到原因:原来是这里尾部多个空格

#最终完整版
命令:sort test.txt | uniq -c
3 lidao
2 oldboy
2 test


练习2:
统计出现单词最多的前三名
#原文件:
oldboy
lidao
test
oldboy
lidao
test
lidao
zhengyaoxian

【执行命令】cat test.txt | sort |uniq -c | sort -rn | head -3

#去重后:
2 oldboy
2 lidao
2 test

3.11 xargs 批处理(核心)


一、如何产生内存数据

管道(cmd1 | cmd2)、标准输入重定向(< File),都能生成内存数据。

不同点:

1、管道是从命令的输出结果读取数据,放入到内存。(可能不用经过磁盘IO)

2、标准输入重定向是从磁盘文件读取数据,放入到内存。(必须经过磁盘IO)

二、xargs的核心作用

xargs 是参数传递工具 **。**核心逻辑:读取内存中的数据 → 自动分割数据 → 作为参数传递给后续命令执行。

1、数据来源

只能读取内存数据,无法直接读取磁盘文件,日常搭配两种方式使用:

  • 管道 |:将前一个命令的输出结果存入内存,传给 xargs
  • 标准输入重定向 <:读取文件内容至内存,传给 xargs

2、数据分割规则

空格、换行、Tab 作为分隔符,将数据流切割为独立命令行参数。

3、适配的常用命令

rm、touch、mkdir、mv、cp、chmod、chown、ls

三、xargs语法

复制代码
命令:xargs [选项] 下游命令   #默认以空格、换行、tab为分隔符进行切割参数。
选项:
-nN             #以空格、换行、tab为分隔符进行切割参数,每次只传递N个参数
-I 指定占位符    #以占位符指定要插入的位置。如果加了-I,仅换行符(\n)作为分隔符,空格不再切割!

四、易错踩坑

复制代码
踩坑1:
xargs命令,只能读取内存数据,无法读取磁盘数据。
所以往往跟管道(|)、标准输入重定向(<) 这两种能把数据放到内存的方法联合使用。

五、案例练习(xargs)

复制代码
练习1:
场景:创建3个文件,并放入到指定位置/test文件里面去。
#使用-I,会导致不以空格、tab作分隔符,只认换行作为分隔符。
错误写法:echo 'file1.txt file2.txt file3.txt' | xargs -i @ touch /test/@
写法1:echo -e "a.txt\nb.txt\nc.txt" | xargs -I @ touch ./test/@
#前置:all.txt文件内,存储内容:1.txt 2.txt 3.txt(每个文件名都换行写)
写法2:cat all.txt | xargs -I @ touch ./test/@


练习2:
查找all.txt文件,找到后复制到/opt目录下
find -name 'all.txt' | xargs -i cp {} /opt


练习3:
移动all.txt文件,移动到/opt目录下
find -name 'all.txt' | xargs -i mv {} /opt


练习4:
批量删除文件(知识点:涉及标准输入重定向)
# 前置:test.txt文件内,存储内容:1.txt 2.txt 3.txt 4.txt(每个文件名都换行写)
# 原因分析:先执行< test.txt,读取文件的内容,然后把内容喂给xargs处理,
#         根据文件内的换行、空格,分割成一个个文件名,再把处理结果丢到rm的后面当成参数。
【执行命令】 xargs rm < test.txt  //等价于: cat test.txt | xargs rm


练习5:
把数字"1-6",写成两排
echo "1 2 3 4 5 6" | xargs -n 2 echo
#命令执行结果
1 2
3 4
5 6

六、案例练习(演示使用xargs和不适用的区别)

复制代码
练习1:
场景:echo "test.txt" | cat
/*
cat后面没有命令行参数,它就不会去磁盘读取内容,那么就要去内存读取内容,
此时刚好有个管道,把前面命令的执行结果输出到内存中,直接给cat读取。
执行结果:test.txt
*/

练习2:
场景:echo "test.txt" | xargs cat
/*
xargs不能直接从磁盘读取数据,只能从内存读取数据。
能把数据放入内存有两种方法:管道、<(标准输入重定向)。
执行结果: 报错,找不到test.txt文件
*/

练习3:
场景:echo "test.txt" | rm
/*
echo "test.txt"可以借助管道,把结果输出到内存
但是rm无法读取内存数据,此时后面没有文件,就报错了。
执行结果:报错,提示rm缺少参数。
*/

练习4:
场景:echo "test.txt" | xargs rm    #等价于:rm test.txt
#虽然rm无法读取内存数据,但是xargs命令会把内存数据转换成命令行参数,放到rm末尾。
执行结果:无任何提示,此时已经成功删除文件test.txt。

3.12 wc 统计字数


一、wc语法

复制代码
命令:wc [选项] 文件名       #统计文件信息
选项:
-l:统计行数(lines)
-w:统计单词数(words)
-c:统计字节数(bytes)
-m:统计字符数(characters)
-L:统计最长行的长度(最长行的字母个数)(length)

3.13 echo 打印到屏幕

3.14 标准输出重定向

直接看4.3.6章节的内容。

3.15 标准输入重定向


一、<的语法

复制代码
作用:和管道类似,读取文件的内容数据,放入到内存中。

语法1:< 文件名       //从文件读取数据,放入内存,供命令读取。
语法2:<< EOF        //从下方命令行读取数据,读到EOF结束,放入内存,供命令读取。
语法3:<<< "字符串"   //读取字符串,放入内存,供命令读取。

二、案例练习

复制代码
# 1、读取文件内容
/*
原文件:
aaa
bbb
*/
命令:cat < demo.txt     //等价于:cat demo.txt | cat
/*
命令执行结果:
aaa
bbb
*/

# 2、把密码写入到/etc/passwd文件
写法1:passwd --stdin testuser <<< "123456"
写法2:echo "123456" | passwd --stdin testuser

3.16 grep 查找文件内容


一、grep语法

复制代码
命令:grep [选项] '/正则/ 文件1 文件2...'   #找出匹配词所在的行!
选项:
-v    #表示取反
-r    #递归过滤
-w    #精准匹配
-n    #显示过滤的内容,所在的行号
-o    #不输出整行内容,只输出查找到的内容。(查看匹配过程)
-E    #表示扩展正则
-i    #不区分大小写
-c    #统计某个单词出现的次数
-F    #把查找内容当成字符串,不在意.是不是元字符,都变成普通字符。

二、案例练习

复制代码
练习1:
场景:要从a.txt和b.txt文件中查找出'linux'字符
grep 'linux' a.txt b.txt


练习2:
场景:要从一个查询结果的内容,去找出'linux'字符
cat a.txt b.txt | grep 'linux'


练习3:
场景:当前目录下,有一个文件code.txt,内容是:www.baidu.com,
     有一个目录test,里面有一个文件1.txt,内容是:www.baidu.com。
#存在问题,grep不加选项-r的情况下,默认只会对当前目录下的所有文件中查找,如果
#当前目录下,还有其他的目录,他不会进到目录里面去查找,所以要递归需要加选项-r。
grep -r 'www.baidu.com' *
或者 find ./ -type f | grep 'www.baidu.com' *

3.17 sed 查找删除文件内容


查找、删除都是基于找到的匹配词,然后把匹配词所在的行给删掉,而不是仅仅删除匹配词。但替换不一样,替换可以做到只删除匹配词,或者只找出匹配词。

一、sed的核心作用

sed 是流编辑器 ,主打文件流式处理(按行处理 ),默认仅操作内存中的文件内容,不修改原文件。核心能力:文件内容模糊过滤、精准查找、增删改查、字符替换、格式化输出、后向引用。

二、sed语法

复制代码
命令:sed [选项] '条件1 动作1; 条件2 动作2...' 文件名
[选项]
-n          #表示取消默认打印输出。因为sed会把查找时看过的内容全部打印到屏幕。
-r          #表示扩展正则
-i          #删除原文件中的内容。但是注意:这里不能加选项-n,否则看不到效果。

# 1、条件
(1)指定行:数值。     //如果不指定行,则默认会对每一行都进行处理。
/* 特殊说明:
找第三行:3
找3到5行:3,5
找最后一行:$
找第3行和第5行:3p;5p   //涉及到两个条件和动作
*/
(2)/正则/。          //正则会找到匹配词所在的行,找出整行、替换、删除整行。

# 2、动作
(1)p    //打印
(2)d    //删除
(3)s# 正则 # 替换成谁 #标识符     //只能替换掉匹配词,会替换掉每行所有匹配上的单词。
s@ 正则 @ 替换成谁 @标识符     //同上。
s/ 正则  / 替换成谁 /标识符    //同上。
标识符:g(全局匹配)、p(替换成功后,输出本行内容。记得配合选项-n使用。)、i(不区分大小写)
(4)a 要追加的内容    //在匹配行的下一行追加内容。
(5)i 要插入的内容    //在匹配行的上一行插入内容。
(6)c 要替换的内容    //把匹配行的整行替换成要替换的内容。
(7)w test.txt       //把匹配行的内容保存到test.txt文件中。

三、易错踩坑

复制代码
踩坑1:
sed -n '/[12]/p' test.txt。
错误理解:千万不要理解成找出第1行或者第2行。
正确理解:找出含有数字1或者数字2的行。

四、案例练习(查找)

复制代码
练习1:
场景:找第三行的内容
sed -n '3p' test.txt    #如果不加选项-n,会把整个文件的内容打印出来。

练习2:
场景:找文件最后一行的内容
错误写法:sed -n '$' test.txt
正确写法:sed -n '$p' test.txt    //要记住-n和p不分家。

练习3:
场景:找文件倒数第二行的内容(sed没有什么好办法)
tail -n2 test.txt | head -1
或者
tail -n2 test.txt | sed -n '1p'

练习4:
场景:找文件第二行和第四行的内容
sed -n '2p;4p' test.txt

练习5:
场景:找出文件第2-4行内容
sed -n '2,4p' test.txt

练习6:
场景:找出文件中带有'root'的行
sed -n '/root/p' test.txt

练习7:
场景:过滤出以r开头的行(支持正则)
sed -n '/^r/p' test.txt

练习8:
场景:找出文件以h结尾的行
sed -n '/h$/p' test.txt


练习9:
场景:过滤出字符串区间范围
/*
查找流程:
找以bb开头的内容,到以dd结尾的内容之间的内容,然后还会循环接着往下找,
继续看有没有以bb开头的内容,到以dd开头为结尾的内容之间的内容,如果最后有
以bb开头的内容,但是没有以dd开头为结尾的内容,那么会打印bb开头到后面的所有内容。
*/
sed -n '/^bb/,/^dd/p' test.txt //过滤出以bb开头,以dd开头之间的所有行


练习10:
场景:找出8点到9点半之间的日志文件内容
sed -n '/2026:08:00:15/,/2026:09:30:42/' /var/log/nginx/access.log

练习11:
场景:找出bb开头到dd开头结尾的所有行(找到第一个循环,第二个循环只有结尾,没有开头)

#源文件(前面的数值纯属自行添加,仅用于方便查看行号)
1 aaa
2 bbb
3 ccc
4 uuu
5 ddd
6 eee
7 fff
8 ddd
9 xxx

sed -n '/^bb/,/^dd/p' test.txt

#执行结果:(行号对应原文件的)
2 bbb
3 ccc
4 uuu
5 ddd
*/

练习12:
场景:找出bb开头到dd开头结尾的所有行(找到一个循环,第二个循环只有开头,没有结尾)

#源文件:(前面的数值仅用于表示行号,方便看效果)
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 bbb
7 xxx

sed -n '/^bb/,/^dd/p' test.txt

#执行结果:
2 bbb
3 ccc
4 ddd
6 bbb
7 xxx


练习13:
场景:找出bb开头到dd开头结尾的所有行(在第一个循环中,找到两行开头,然后下面只有一个结尾)

#源文件:(前面的数值仅用于表示行号,方便看效果)
1 bbb
2 ccc
3 bbb
4 yyy
5 fff
6 ddd
7 xxx

sed -n '/^bb/,/^dd/p' test.txt

#执行结果:找第一个bbb,但没有找到结尾,此时第二个循环的bbb出现了,
#         就会把第一个循环bbb到第二循环的bbb直接的全部打印出来。
1 bbb
2 ccc
3 bbb
4 yyy
5 fff
6 ddd

五、案例练习(删除)

复制代码
练习1:
场景:删除第3行内容
sed '3d' test.txt

练习2:
场景:删除第2到第4行内容
sed '2,4d' test.txt

练习3:
场景:删除第2行到最后1行
sed '2,$d' test.txt

练习4:
场景:找到包含hellokety字符串的所有行,并删除
sed '/hellokety/d' test.txt

练习5:
场景:找到b开头的所有行,并删除
sed '/^b/d' test.txt

练习6:
场景:删除所有包含b开头和l开头的所在行
sed '/^[bl]/d' test.txt
或者 sed -r '/^b|^l/d' test.txt      #因为|是来自于扩展正则,所以需要参数-r
或者 sed '/^b/d; /^l/d' test.txt

练习7:
场景:删除以bin开头开始,到以adm开头结尾之间的所有行
sed '/^bin/,/^adm/d' test.txt

练习8:
场景:删除文件中所有包含数字的行
sed '/[0-9]/d' test.txt

六、案例练习(替换)

复制代码
练习1:
场景:找到文件中的root字符串,全部替换成oldboy字符串,如果一行出现多个root,
      只能替换一行中出现的第一个root。
sed 's#root#oldboy#' test.txt

练习2:
场景:找到文件中的root字符串,全部替换成oldboy字符串,如果一行出现多个root,
     则需要把一行中所有的root都替换成oldboy
sed 's#root#oldboy#g' test.txt

练习3:
场景:将文件中的root都替换成空(实现删除该字符串的效果)
sed 's#root##g' test.txt

练习4:
场景:删除文件中所有的数字
sed 's#[0-9]##g' test.txt

练习5:
场景:删除文件中所有的字符串
sed 's#[a-Z]##g' test.txt

练习6:
场景:删除文件中所有的特殊符号(中括号内的^是取反的意思)
sed 's#[^0-9a-Z]' test.txt

练习7:
场景:统计/etc/passwd中单词出现的次数
sed 's#[:/0-9x]##' test.txt | xargs -n1 | sort |uniq -c | sort -rn

练习8:
场景:把所有的字符串bin都替换成字符串oldboy
#注意点:如果文件内容存在sbin,则会变成soldboy,这不是我们想要的效果。
#       此时,需要用到边界的写法,表明只能匹配到这个单词,左右不能有其他字符,可以是特殊符号。
写法1:sed 's#&lt;bin&gt;#oldboy#' test.txt   //边界:<>,反斜杠是怕<>符号有其他含义。
写法2:sed 's#\bbin\b#oldboy#' test.txt   //边界:\b,边界符本身就是\b

练习9:
场景:把第2行到第4行中的nologin替换成xxx
sed '2,4s#nologin#xxx#g' test.txt

练习10:
场景:将包含字符串adm所在的行给删掉
sed '/^adm/s#adm##g' test.txt   //模糊替换

#原文件:
adm:x:111
root:x:adm
ftp:x:222
admin test adm

#命令执行结果:
:x:111
root:x:adm
ftp:x:222
in test

练习11:
场景:把区间内容进行替换
sed '/adm/,/lp/s#adm#oldboy#g' test.txt

3.18 sed 后向引用


一、sed语法

复制代码
语法1:sed -r 's# 要查找的内容 # 操作 # 标记符'    #因为是扩展正则,所以要加参数-r
语法2:sed -r 's# 正则 # 操作 # 标记符' 

标记符:
g    #表示全局匹配
i    #表示忽略大小写
p    #替换成功后,输出本行内容。记得配合选项-n使用。
查找内容 或者 正则里面使用()表示引用内容,\1表示引用第一组(),\2表示引用第二组(),以此类推。

二、案例练习

复制代码
练习1:
场景:找到文件的每一行内容,在前面和后面分别加上<>符号
sed -r 's#(.*)#<\1>#'
#原文件
kongfu
kety
hello
#执行后结果:
<kongfu>
<kety>
<hello>

练习2:
场景:在文件中每一行的末尾都加上字符串hehe
sed -r 's#(.*)#\1 hehe#g' test.txt     #其中\1表示引用前面第一组()的内容
#原文件
kongfu
kety
hello
#执行后结果:
kongfu hehe
kety hehe
hello hehe

练习3:
场景:在文件内容中,每一行的开头都加上字符串touch
sed -r 's#(.*)#touch \1#g' test.txt      #其中\1表示引用前面第一组()的内容
#原文件
a.txt
b.txt
c.txt
#执行后结果:
touch a.txt
touch b.txt
touch c.txt
如果要执行屏幕上的命令,可以用:sed -r 's#(.*)#touch \1#g' test.txt | bash
#因为sed会把找到的东西打印输出到屏幕,而bash可以执行屏幕上显示的命令

练习4:
场景:把文件内容中的gagwoldboydawfaw,把子字符串db左右两边的内容给删掉。
sed -r 's#(.)(db)(.)#\2#g' test.txt
#原文件:
oldboy
#输出结果:
db

练习5:
场景:sed -r 's#ol(.*)(oy)#\1#g'
#原文件:
oldboy
#输出结果:
oy

练习6:
场景:sed -r 's#(ol)(.*)(oy)#\1#g'
#原文件:
oldboy
#输出结果:
ol
echo "oldboy" | sed -r 's#(ol)(.)(oy)#\2#g'
echo "oldboy" | sed -r 's#(ol)(.)(oy)#\3#g'
echo "oldboy" | sed -r 's#(ol)(.*)(oy)#\1---\2---\3#g'

练习7:
场景:直接看效果:sed -r 's#(.) test.$#\1#g'
#原文件: oldboy testfdfawfwaggwag
#输出结果:oldboy

练习8:
场景:使用后向引用取ip地址(ifconfig eth0)
方法1:ifconfig lo | sed -rn 's#^.inet ([^ ]+).#\1#p'
方法2:ifconfig wlan0 | sed -n '2p' | sed -r 's#(.)t (.) netm.$#\2#g'
方法3:ifconfig wlan0 | sed -n '/inet /s#.inet[ ]([0-9.]+)(.)#\1#p'

3.19 awk


一、awk的核心作用

(1)取行

(2)取列

(3)模糊过滤

(4)数据统计、数据运算

(5)支持for循环、if判断、属组

(6)格式化输出、awk后向引用

二、awk语法

复制代码
#默认就支持扩展正则,无需加参数。

内置变量1:NR。存储着文件每行的行号。
内置变量2:NF。表示最后一列的列号
$NF,表示最后一列的内容。
内置变量3:$0,存放着每一行的内容。
$1,表示第一列,默认是以空格和tab键为分隔符,如果没有空格和tab键,当成第一列。
$2,表示第二列,同上。
, ,逗号属于输出分隔符OFS,默认OFS = 表示空格。
条件表达式:
(1)==    等于第几行
(2)>     大于第几行
(3)<     小于第几行
(4)!=    不等于第几行
(5)&&    并且
(6)||    或
(7)~     包含(右侧必须是正则)

1、打印行、打印列
语法1: awk 选项 '条件{动作}' 文件名
/*
(1)动作:
{print $1}              执行一个动作
{print NR; print $1}    执行多个动作
{print NR; print $1,$2} 执行多个动作,且一次取多列
{print NR; print $1 任意键分隔 $2} 执行多个动作,且一次取多列,中间以任意符号隔开。
(2)条件:
'/正则/'         正则表达式
'NR==2'          指定行
'$2==100'        指定列
'NR>2 && NR<5'   指定多个条件
(3)如果只有条件,没有动作,那么默认动作是{print}
(4)如果不指定条件,则直接执行动作
*/

2、模糊过滤文件
语法2: awk 选项 '/条件/' 文件名           //模糊过滤。条件支持写正则。
语法3: awk 选项 '/条件1/,/条件2/' 文件名  //区间查找。条件支持写正则。
选项:
-F "xx"    //指定分隔符xx,可以写正则。(awk默认情况是以空格、tab键划分列)

三、易错踩坑

复制代码
练习1:
场景:如果字符串不加双引号,会被awk识别为变量。
例如:awk '{print $1"\t"$2}' test.txt

练习1:
场景:在 df -h 的结果中,我要求取出第一列且值为tmpfs,并打印出指定行的最后一列

#df-h的结果:
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.2G   16G  13% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0

错误写法:df -h | awk '$1 == tmpfs {print $NF}'
正确写法:df -h | awk '$1 == "tmpfs" {print $NF}'  //字符串需要加双引号!

四、案例练习(找行)

复制代码
练习1:
场景:找第3行
awk 'NR==3' test.txt    //等价于:sed -n'3p' test.txt

练习2:
场景:找第4行到最后
awk 'NR>3' test.txt

练习3:
场景:找第1行到第4行
awk 'NR<=4' test.txt

练习4:
场景:找除了第3行以外的其他所有行
awk 'NR!=3' test.txt

练习5:
场景:找第2行到第5行
awk 'NR>=2 && NR<=5' test.txt

练习6:
场景:找小于第二行,或者大于第四行
awk 'NR<2 || NR>4' test.txt

五、案例练习(模糊查找)

复制代码
练习1:
场景:查找包含'root'的行
awk '/root/' test.txt

练习2:
场景:找以'r'开头的行
awk '/^r/' test.txt

练习3:
场景:找区间范围:以2开头,到以4开头结尾。
awk '/^2/,/^4/' test.txt

六、案例练习(找列)

复制代码
练习1:
场景:按以下效果输出。

#原文件:
2 fagtw
3 fawgawhg
4 awehgwahg
5 wfafaw

awk '{print $1"---"$2}' test.txt    //打印第1列和第2列

#效果示例:
2---fagtw
3---fawgawhg
4---awehgwahg
5---wfafaw


练习2:
场景:取最后一列的列号
awk '{print NF}' test.txt

练习3:
场景:取最后一列的内容
awk '{print $NF}' test.txt

练习4:
场景:取出磁盘信息的第五列内容
df -h | awk '{print $5}'

练习5:
场景:取出倒数第二列的内容
df -h | awk '{print $(NF-1)}'

七、案例练习(指定分隔符查找)

复制代码
练习1:
场景:取出字符串root和oldboy

#原文件:
root:test:/oldboy:/bin/bash

方法1:awk -F "[:/]" '{print $2,$4}' test.txt
方法2:awk -F "[:/]+" '{print $2,$3}' test.txt    //此时:/会被看成整体

练习2:
场景:取出字符串root和oldboy

#原文件:
---test-+oldboy++::

awk -F "[-+:]+" '{print $1,$2}' test.txt

八、案例练习(正则表达式)

复制代码
练习1:
场景:在 df -h 的结果中,我要求取出第一列包含 /dev 的行,并打印出指定行的最后一列

#df-h的结果:
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.2G   16G  13% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0

错误写法:df -h | awk '/dev/ {print $NF}'
正确写法:df -h | awk '$1 ~ //dev/ {print $NF}'  //其中~表示包含


练习2:
场景:我要求取出第二列的值大于60的行,并打印出该行(原文件第二列必须是纯数字)
awk '$2 > 60 {print}'

3.20 tar打包、解压


一、tar打包语法

复制代码
命令:tar [选项] 打包后的包名称.tar.gz 文件1 文件2 ...     #包名是你自己随便定的
选项:
-c    #创建
-z    #使用gzip压缩
-j    #使用bzip2压缩
-v    #显示压缩的过程
-f    #用于指定文件名,该参数必须放最后面
--exclude 文件名    #打包压缩时,用于排除指定文件不进行打包压缩(必须写在打包文件前面)

正确写法:tar -zcvf --exclude=1.txt all.txt
错误写法:tar -zcvf all.txt --exclude=1.txt

二、tar解压语法

复制代码
命令:tar [选项] 要解压的包名称.tar.gz -C 解压到哪个目录   #如果不写-C,默认解压到当前目录下
选项:
-x    #解压
-f    #用于指定文件名,该参数必须放最后面
-t    #查看压缩包里面有哪些文件
-C    #用于指定解压的位置

三、案例练习

复制代码
练习1:
场景:将root目录下的文件,统一打包并压缩成root.tar.gz。
tar -zcvf root.tar.gz 公共/ 桌面/ 视频/ 图片/ 桌面/ a.txt

练习2:
场景:将1.txt、2.txt、3.txt打包压缩,名叫all.tar.gz,放到/opt目录下
tar -zcvf /opt/all.tar.gz 1.txt 2.txt 3.txt

练习3:
场景:解压
tar -xf test.tar.gz

练习4:
场景:查看压缩包里面有哪些文件(只能看文件名称,不能看内容)
tar -tf all.tar.gz

练习5:
场景:test目录下有5个文件1.txt、2.txt、3.txt、4.txt、5.txt,
但是我们只想压缩除了3.txt、5.txt以外的其他所有文件,怎么办?
tar -zcvf ./test.tar.gz  ./test/*.txt --exclude=3.txt --exclude=5.txt         */

练习6:
场景:test目录下有100个文件,但是我们只想压缩指定的70个,另外30个不压缩,怎么办?

#步骤1:先在一个文件exclude.list里,写下要排除的文件的名称,文件内容如下:
3.txt
5.txt
7.txt
9.txt
#步骤2:紧接着,开始操作
方法1:
命令:tar zcvf test.tar.gz -X exclude.list  test/
方法2:
命令:tar zcvf test.tar.gz test/ --exclude-from=exclude.list

3.21 zip打包、解压


一、zip打包语法

复制代码
命令:zip [选项] 自定义压缩包名称.zip 文件1 文件2 ...   
选项:
-r    #递归压缩(用于压缩文件夹)

二、zip解压语法

复制代码
命令:unzip 压缩包名称.zip [选项 解压位置]    #用于解压缩
选项:
-d    #用于指定解压位置。如果不指定,默认解压到当前路径

3.22 pwd 查看当前目录位置


一、pwd语法

复制代码
命令:pwd    #查看当前目录所在位置

二、案例练习

复制代码
练习1:
场景:当前在/etc目录下,查看当前位置
pwd
#命令执行结果: /etc

3.23 ls 查看目录


一、ls语法

复制代码
命令:ls [选项] 目录路径    #列出当前目录下的所有文件和目录。若不指定目标路径,默认为当前路径。
选项:
-a    #显示所有目录和文件。(包含隐藏文件)
-l    #以列表方式显示文件详细信息。 (但文件大小不显示单位)
-lh   #以人性化的方式显示文件详细信息。(其中文件大小是包含单位的)
-i    #inode号码,表示索引节点。类似于指针。例如:922871
-d    #查看目录本身信息(只是自身目录,不包含内部的子文件)
-t    #按时间顺序排序
-r    #逆序排序

二、ls执行结果分析

复制代码
[root@oldboyedu /]# ls -lhi
total 16K
113 lrwxrwxrwx.   1 root root    7 Jul  7 07:26 bin -> usr/bin
64 dr-xr-xr-x.   5 root root 4.0K Jul  7 07:31 boot
3 drwxr-xr-x.  19 root root 3.2K Aug  1 19:37 dev
16777281 drwxr-xr-x.  80 root root 8.0K Aug  3 22:33 etc
33693557 drwxr-xr-x.   2 root root    6 Apr 11  2018 home
117 lrwxrwxrwx.   1 root root    7 Jul  7 07:26 lib -> usr/lib
82 lrwxrwxrwx.   1 root root    9 Jul  7 07:26 lib64 -> usr/lib64
50332066 drwxr-xr-x.   2 root root    6 Apr 11  2018 media
83 drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
16778326 drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
1 dr-xr-xr-x. 110 root root    0 Aug  1 19:37 proc
33574977 dr-xr-x---.   4 root root  175 Aug  1 22:04 root
8694 drwxr-xr-x.  26 root root  680 Aug  3 23:00 run
118 lrwxrwxrwx.   1 root root    8 Jul  7 07:26 sbin -> usr/sbin
33693558 drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
1 dr-xr-xr-x.  13 root root    0 Aug  1 19:37 sys
16777288 drwxrwxrwt.   8 root root  127 Aug  2 23:05 tmp
33604287 drwxr-xr-x.  13 root root  155 Jul  7 07:26 usr
50331713 drwxr-xr-x.  19 root root  267 Jul  7 07:32 var


# 分析每列数据含义:
第一列:inode号码。
第二列:
第1位是文件类型。
(1)'-'用于表示文件。例如:普通文件、数据文件、压缩包、媒体文件、图片、视频、音频、二进制命令。
(2)'d'用于表示目录。
(3)'l'表示软连接,类似window的快捷键。 //软连接通常表示为:软连接 -> 源文件
(4)'b'表示块设备(block),也叫硬件设备。//例如:/dev/sda
(5)'c'表示字节设备。  //有特殊作用!
后9位是文件权限,3位为一组。
(1)前面三位:属主     //创建该文件的用户,文件的主人
(2)中间三位:属组     //小组内成员对于文件的权限。
(3)最后三位:其他位置 //陌生人,既不是用户、也不在用户组内
第三列:硬链接的数量。
第四列:文件属主。
第五列:文件属组。
第六列:文件占用磁盘空间大小。
第七列:文件创建或修改时间。(年月日时分)
第八列:文件名称,软链接指向。

三、案例练习

复制代码
练习1:
场景:查看根目录下有哪些文件、目录。
【执行命令】ls

#命令执行结果:
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt
proc  root  run  sbin  srv  sys  tmp  usr  var


练习2:
场景:查看当前目录下有哪些文件夹和文件,要把隐藏文件也显示出来
【执行命令】ls -a

练习3:
场景:查看当前目录下的内容,要显示每个文件和目录的详细信息。
【执行命令】ls -l

#命令执行结果:
total 20
lrwxrwxrwx.   1 root root    7 Jul  7 07:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jul  7 07:31 boot
drwxr-xr-x.  19 root root 3200 Jul 13 00:41 dev
drwxr-xr-x.  79 root root 8192 Jul 23 21:42 etc
drwxr-xr-x.   2 root root    6 Apr 11  2018 home
lrwxrwxrwx.   1 root root    7 Jul  7 07:26 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul  7 07:26 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x. 112 root root    0 Jul 13 00:41 proc
dr-xr-x---.   4 root root  175 Jul 23 20:12 root
drwxr-xr-x.  25 root root  660 Jul 22 00:25 run
lrwxrwxrwx.   1 root root    8 Jul  7 07:26 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Jul 13 00:41 sys
drwxrwxrwt.  14 root root 4096 Jul 23 20:28 tmp
drwxr-xr-x.  13 root root  155 Jul  7 07:26 usr
drwxr-xr-x.  19 root root  267 Jul  7 07:32 var


练习4:
场景:查看当前目录下有哪些文件夹和文件,以人性化的形式显示文件详细信息。
命令:ls -lh

#命令执行结果:
total 20K
lrwxrwxrwx.   1 root root    7 Jul  7 07:26 bin -> usr/bin
dr-xr-xr-x.   5 root root 4.0K Jul  7 07:31 boot
drwxr-xr-x.  19 root root 3.2K Jul 13 00:41 dev
drwxr-xr-x.  79 root root 8.0K Jul 23 21:42 etc
drwxr-xr-x.   2 root root    6 Apr 11  2018 home
lrwxrwxrwx.   1 root root    7 Jul  7 07:26 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul  7 07:26 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x. 112 root root    0 Jul 13 00:41 proc
dr-xr-x---.   4 root root  175 Jul 23 20:12 root
drwxr-xr-x.  25 root root  660 Jul 22 00:25 run
lrwxrwxrwx.   1 root root    8 Jul  7 07:26 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Jul 13 00:41 sys
drwxrwxrwt.  14 root root 4.0K Jul 23 20:28 tmp
drwxr-xr-x.  13 root root  155 Jul  7 07:26 usr
drwxr-xr-x.  19 root root  267 Jul  7 07:32 var

3.24 cd 切换目录


一、cd语法

复制代码
命令:cd 目录路径    #切换到指定目录  

# 常见写法
cd      #相当于cd ~
cd ~    #去home目录(root用户主目录是/root,其他用户是/home/用户名)
cd ..   #去上一级目录
cd ./   #去当前目录
cd /    #去根目录

3.25 du 统计目录占磁盘大小

复制代码
命令:du -sh   `指定目录`  //统计目录占磁盘大小

3.26 stat 查看文件属性信息

复制代码
1、更详细查看文件的信息
命令:stat 文件名

#命令执行结果
File:test.txt
Size:2631        Blocks:8          IO Block:4096   普通文件
Dervice:833h/2099d  Inode:930601      硬链接:1
Access:(0664/-rw-rw-r--)  Uid:( 1002/zhangmiao)   Gid:( 1002/zhangmiao)
Access:2026-08-06 11:38:26.527667738 +0800    #文件访问时间
Modify:2026-07-30 15:20:31.000000000 +0800    #这个是指文件内容修改
Change:2026-08-06 11:38:25.947668334 +0800    #这个指权限修改(修改权限、echo追加内容时变动)
Birth:-    //创建时间

笔试题

复制代码
笔试题1:
场景:查找文件修改时间为30天前的,并且删除
命令: find /data/ -type f -mtime +30 | xargs rm

第四章 系统和服务管理

4.1 查看系统基础信息


**目录:**linux系统、内核版本号、查看命令文件所在位置、查看日历。

一、查看linux系统版本号

方法1:通过配置文件查看

复制代码
文件位置:/etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

方法2:通过命令hostnamectl查看

复制代码
[root@oldboyedu etc]#  hostnamectl
Static hostname: oldboyedu
Icon name: computer-vm
Chassis: vm
Machine ID: 5056ad7098474dfca523ae1607f9a755
Boot ID: 1b2f9d7a65044b51aa3254f61730317c
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64

二、查看linux系统内核版本号

复制代码
1 查看linux内核版本。
命令:uname [选项]    
选项:
-a    //显示所有内核信息
-r    //只显示内核版本
-m    //只显示操作系统架构


2 案例演示
(1)查看所有内核信息
uname -a
#命令执行结果:
Linux oldboyedu 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

(2)只查看内核版本
uname -r
#命令执行结果:
3.10.0-1160.el7.x86_64

(3)只查看操作系统架构
uname -m
#命令执行结果:
x86_64

3 操作系统与系统内核的关系(左边是操作系统版本,右边是内核版本)
CentOS5.x
CentOS6.x  2.6.32
CentOS7.x  3.10.0 

三、查看命令文件所在位置

复制代码
命令:which `命令名称`

四、查看当前日历

复制代码
命令:cal

//命令执行结果:
[root@simida ~]$ cal
     August 2026    
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

4.2 配置主机名


一、配置主机名

方法1:临时修改。(重启系统后丢失)

复制代码
命令:hostname `主机名称`  #重启后失效,重新连接xshell后才能看到修改后的

方法2:永久修改。(重启系统后生效)

复制代码
命令:vim /etc/hostname   #重启后生效

方法3:临时 + 永久修改。(无需重启,生产推荐!

复制代码
命令:hostnamectl set-hostname 主机名称  

******************************************************

#原理:干了两件事情。
1. 修改磁盘文件 `/etc/hostname`(静态永久)
2. 同步更新内核内存瞬态主机名,**立刻生效,不需要重启服务器**

二、查看主机名

方法1:命令行直接看。

复制代码
#可见主机名称为oldboyedu
[root@oldboyedu network-scripts]# ping www.baidu.com   

方法2:通过命令查看。

复制代码
命令:hostname
或者
命令:hostnamectl

方法3:通过配置文件查看。

复制代码
命令:vim /etc/hostname

#配置文件内容:就只有主机名称
lhj-W515-PGUV-WBY0    

4.3 系统时间同步

一、查看系统时间、硬件时间

1、查看系统时间

复制代码
命令:date [选项]
选项:
+%F-%H-%M-%S    #显示年月日时分秒
+%F-%T          #显示年月日时分秒
-s `具体时间`   #修改当前时间(用于测试,修改后再通过时间同步回来)

#命令执行结果:
Mon Jul 27 23:48:52 CST 2026    CST译为中国标准时间。 UTC比CST落后8小时

2、查看硬件时间(bios上的时间)

复制代码
方法1:clock
方法2:hwclock -r

#命令执行结果:
Tue 28 Jul 2026 07:51:32 AM CST  -0.148378 seconds

二、从时间同步服务器读取时间,同步给系统时间 (要求:系统时间必须等 硬件时间,否则可能出问题!)

ntpdate ==> Network Time Protocol Date (网络时间协议)

1、同步系统时间

复制代码
步骤1:系统不存在ntpdate命令,先安装命令。
yum -y install ntpdate

步骤2:执行ntpdate命令
ntpdate ntp1.aliyun.com    //语法:ntpdate `时间同步服务器`

#命令执行结果
28 Jul 00:01:44 ntpdate[4064]: step time server 116.62.13.223 offset 1.678849 sec

2、同步给硬件时间(将系统时间同步给硬件时间)

复制代码
命令:hwclock [选项]
选项:
-w     //表示将系统时间同步给硬件时间
-r     //读取硬件时间

****************************************************

1、执行命令:hwclock -w

4.4 开机和重启

一、开机

复制代码
【方法1】
命令:shutdown [选项]    #默认一分钟后关机  
选项:
-h 5    #表示5分钟后关机
-h now  #表示立即关机

【方法2】
命令:poweroff    #直接关机

【方法3】
命令:init 0      #直接关机

二、重启

复制代码
【方法1】
命令:shutdown [选项]
选项:
-r      #默认一分钟后重启
-r 5    #表示5分钟后重启
-r now  #表示立即重启

【方法2】
命令:reboot  #直接重启

【方法3】
命令:init 6  #直接重启

4.5 软件安装、卸载

判断命令有没有安装

复制代码
【方法1】
直接输入`命令名称` 或者 `命令名称 --version`

【方法2】
输入`which 命令名称`,如果返回命令的安装位置则表示有安装
#例如:
zhangmiao@lhj-W515-PGUV-WBY0:/$ which mkdir
/usr/bin/mkdir

【方法3】
输入`rpm -qa 包名`,如果不显示任何信息,则表示已经删了

方法1:yum安装、卸载软件

复制代码
# 1、安装软件包
命令:【yum -y install 软件包名称1 软件包名称2...】  //可同时按照多个软件包
[选项]
-y    //安装交互。如果加这个参数,则安装过程中不会提示我们是否继续安装
安装过程:
Total download size:547k  //软件安装包的大小
Installed size:2.0M       //软件实际安装到电脑的大小
Is this ok[y/d/N]: fagawg  //这个写错命令怎么删除? 使用Ctrl+U剪切,或者按住Ctrl再按删除键
2、卸载软件包
命令:【yum -y remove 包名1 包名2...】
// 例如:同时卸载wget和lrzsz命令
执行命令:yum -y remove wget lrzsz

方法2:rpm安装、卸载软件(缺点:不能自动解决依赖问题)

复制代码
# 1、安装软件包
命令:rpm -ivh 软件包.rpm
选项:
-i    //install下载
-v    //显示安装过程
-h    //显示安装进度
-qa   //查看软件是否安装。如果不跟包名,直接输入【rpm -qa】,可以查看系统中已经安装的软件包

#使用rpm安装软件流程
步骤1:先下载rpm软件包
步骤2:使用命令【rpm -ivh 包】进行安装
步骤3:如果安装过程中,提示缺少xx依赖,直接复制xx包名,先安装依赖。
步骤4:依赖包都安装完成后,再安装。
2、卸载软件包(可以使用yum卸载)
命令:rpm [选项] 包名
选项:
-e    //卸载

3 安装不上、卸载不掉原因分析

复制代码
# 1、安装失败原因分析:
(1)没网
(2)仓库错误、没有仓库、仓库速度慢
(3)包的名称打错
(4)当前命令是包含在其他包里面
2、解决方案:
(1)查看仓库,如果使用默认仓库会很慢,需修改为阿里云的仓库
//步骤1:查看当前yum仓库使用的地址
[root@oldboyedu ~]# yum repolist
//命令执行结果
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base: mirrors.aliyun.com
extras: mirrors.aliyun.com
updates: mirrors.aliyun.com
//步骤2:yum仓库地址在本地有文件记录,此目录下存放了yum仓库的地址,不能删除。
配置文件:/etc/yum.repos.d/
//步骤3:先备份默认仓库地址
[root@oldboyedu ~]# mv /etc/yum/repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
//步骤4:下载阿里云仓库到本地(若没有yum,可以使用curl命令下载)
[root@oldboyedu ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
//步骤5:检查有没有下载成功
命令:yum repolist
(2)清理仓库缓存,有时候仓库有缓存,导致我们软件装不上
[root@oldboyedu ~]# yum clean all
(3)覆盖安装(很少用,但是有时候系统丢文件,你删不掉的情况下使用)
[root@oldboyedu ~]# yum -y reinstall 包名

4.6 上传和下载

前置:安装专用命令rz

复制代码
# 1、产生问题:怎么知道rz命令在哪个软件包?
(1)方法1:去百度查询。
(2)方法2:通过命令【yum provides rz】来进行查询。
// 命令执行结果
[root@oldboyedu ~]# yum provides rz
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base: mirrors.aliyun.com
extras: mirrors.aliyun.com
updates: mirrors.aliyun.com
lrzsz-0.12.20-36.el7.x86_64 : The lrz and lsz modem communications programs
Repo        : base
Matched from:
Filename    : /usr/bin/rz
(3)方法3:通过命令【yum search rz】来进行查询。
// 命令执行结果
[root@oldboyedu ~]# yum search rz
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base: mirrors.aliyun.com
extras: mirrors.aliyun.com
updates: mirrors.aliyun.com
================ N/S matched: rz ====================
lrzsz.x86_64 : The lrz and lsz modem communications programs
Name and summary matches only, use "search all" for everything.
2、确定好安装包名称后,开始安装rz命令
执行命令:【yum -y install lrzsz.x86_64】

1 上传

复制代码
# 1、把文件从window传到linux服务器    
方法1:使用rz命令
执行命令:【rz】  //此时会弹出对话框,让你选择文件(注意:只能文件,目录需要压缩后才能传)
方法2:直接拖拽window上的文件到linux指定目录下(本质也是执行rz命令,常用方法)

2 下载

复制代码
# 1、从linux系统中把文件下载到window系统

4.7 定时任务


到公司,要选择好定时任务的配置位置。要么在系统配置文件上写,要么在用户定时任务的配置文件上写,千万不要两个配置文件都写,因为两者是并行执行的。

一、设置系统定时任务

1、配置文件位置:/etc/crontab

2、进入配置文件。

复制代码
vim /etc/crontab

3、配置文件说明:

复制代码
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin  
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

*************************************************

# 1、为什么要设置一个PATH变量?
crontab是非登录式的,无法加载全局PATH,PATH是指定命令所在的位置。
告诉cron,执行定时任务命令时, **去这些目录找命令程序**,就不用写命令的绝对路径。

4、配置文件内,如何定义定时任务?(重要!)

书写格式

复制代码
# 格式
*  *  *  *  * root  可执行的命令  //两条及以上命令,直接写到脚本,执行脚本

特殊符号、书写格式参数说明

复制代码
# 五个星的含义:
第一个星:表示分钟(0 - 59)
第二个星:表示时(0 - 23)
第三个星:表示天(1 - 31)
第四个星:表示月(1 - 12)
第五个星:表示周(0 - 6)星期天可以用0或7

# 注意事项:
星期 和 天 不要一起使用

# 特殊符号:
*     //表示每(分钟、小时、天、周)的意思。
*/n   //表示每隔n(分钟、小时、天、周)。 
-     //表示范围。             
,    //表示间隔。

# 示例:
(1)*/5表示每隔5(分钟、小时、天、周)。
(2)* 1-8 * * * 表示凌晨1点到早上8点钟之间,每分钟执行xx任务。
     00 1-8 * * * 表示凌晨1点到早上8点之间的整点执行xx任务。
(3) * 1-8,14,17 * * * 表示凌晨1-8点,下午2点和5点每分钟执行xx任务。

二、设置root用户定时任务。

1、配置文件的位置

复制代码
/var/spool/cron/root

2、进入配置文件

复制代码
方法1:直接通过vim进入配置文件
vim /var/spool/cron/root

方法2:通过命令进入配置文件(好处:有语法检测功能)
crontab -e 

3、配置文件内部,情况说明。

复制代码
//空空如也。

***************************************************

# 1、默认Path变量:/usr/bin:/bin
查看问题:crontab -l 可以看到默认PATH配置的内容。
问题:这里容易出问题,有些命令不在/usr/bin、/bin目录中,会导致定时任务执行失败。
解决方案:通过$PATH,拿到所有命令的存放位置,手动在配置文件内声明。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:

4、配置文件内,如何定义定时任务?(书写格式上,与 系统定时任务稍有区别)

书写格式:

复制代码
# 格式
*  *  *  *  * 可执行的命令  //两条及以上命令,直接写到脚本,执行脚本

特殊符号、书写格式参数说明:

复制代码
# 五个星的含义:
第一个星:表示分钟(0 - 59)
第二个星:表示时(0 - 23)
第三个星:表示天(1 - 31)
第四个星:表示月(1 - 12)
第五个星:表示周(0 - 6)星期天可以用0或7

# 注意事项:
星期 和 天 不要一起使用

# 特殊符号:
*     //表示每(分钟、小时、天、周)的意思。
*/n   //表示每隔n(分钟、小时、天、周)。 
-     //表示范围。             
,    //表示间隔。

# 示例:
(1)*/5表示每隔5(分钟、小时、天、周)。
(2)* 1-8 * * * 表示凌晨1点到早上8点钟之间,每分钟执行xx任务。
     00 1-8 * * * 表示凌晨1点到早上8点之间的整点执行xx任务。
(3) * 1-8,14,17 * * * 表示凌晨1-8点,下午2点和5点每分钟执行xx任务。

5、查看用户设置了哪些定时任务

复制代码
crontab -l

三、定时任务的日志排查

1、先看定时任务的配置文件,看有没有配置错。

复制代码
用户定时任务:/var/spool/cron/root
系统定时任务:/etc/crontab

2、定时任务的日志文件

作用:查看定时任务有没有执行。缺点:无法显示命令执行结果和报错信息。

复制代码
/var/log/cron

3、系统邮件

作用:查看定时任务执行情况,包括执行结果 和 报错信息。

复制代码
/var/spool/mail/root  //比定时任务的日志文件更详细查看定时任务的执行情况

四、易错坑点

复制代码
1、定时任务要写注释。

2、如果一次要执行多条命令,那么把命令都写入脚本。让定时任务去执行这个脚本。
   定时任务中如果使用脚本,要用sh或者/bin/sh命令来运行脚本,不可以使用./
   可能会因为没有权限而执行不了,但是sh去执行命令就不需要权限。

3、定时任务中,date命令的%不会被识别,需要转义。(但是在脚本中会识别%)
   例如:date +\%F-\%T >> time.txt 2 >& 1
   
4、打包压缩时,使用相对路径

五、案例练习

复制代码
# 1、每隔5分钟,执行一次时间同步
*/5 * * * * root ntpdate ntp1.aliyun.com

# 2、以下两条定时任务的含义完全不一样
05 * * * * 表示每个小时5分钟执行一次,如:1.05、2.05、3.05...
*/5 * * * * 表示每隔5分钟执行一次,如:05、10、15、20...

六、笔试题

复制代码
1、如果没有开启邮件服务功能,定时任务产生大量小文件,执行结果会被写入到邮件,
   即:/var/spool/cron/root。占用系统inode号码,导致磁盘无法写入数据。 

模拟场景:systemctl stop postfix && systemctl disable postfix(关闭邮件服务)
           
解决方案:
(1)定时任务的执行结果要定向到黑洞(/dev/null),即所有定时任务加这个:>>/dev/null 2>&1
(2)开一个定时任务,每隔5分钟清空一次,即:rm -rf /var/spool/postfix/maildrop/*
(3)开启邮件服务。

4.8 查看系统负载

1 系统负载的理解

复制代码
# 1、系统负载
系统负载就是衡量操作系统的繁忙程度。
如果负载和cpu核心数量相同,说明系统繁忙。
2、产生问题:负载越高,就越不好吗?
企业服务器(负载高,不一定不好)
(1)对外提供服务:用户访问的平台、网站。
(2)对内服务:测试服务器、内部计算服务(挖矿)。 //这种情况下,负载高叫充分利用资源

2 查看系统负载的2种方法

复制代码
# 方法1:通过执行命令【uptime】,查看系统负载。
//执行结果
 14:55:59   up  5:58,    1 user,    load average:  6.63,  6.30,  6.24
//每个数据的含义
14:55:59     //当前时间
up  5:58     //已经运行时长
1 user       // 一个登录用户
load average //平均负载
6.63         //1分钟内的cpu的负载
6.30         //5分钟内的cpu的负载
6.24         //15分钟内的cpu的负载
方法2:通过执行命令【w】,查看系统负载。
//执行结果(第一行是负载信息,第二行是用户信息)
15:25:44 up  6:28,  1 user,  load average: 6.92, 6.73, 6.53
USER      TTY     FROM       LOGIN@   IDLE    JCPU   PCPU WHAT
zhangmia  pts/0   10.0.0.1   10:39    7.00s   0.36s  0.00s w
//后两行用户信息的含义
USER    //登录用户
TTY     //Teletype,登录用户使用的终端设备名称(虚拟机直接登录:tty1。xshell登录:pts/0)
FROM    //哪个IP连接linux系统
LOGIN   //登录时间
IDLE JCPU PCPU   //执行这个命令占用cpu的总时长

WHAT    //这个用户当前执行的命令(可以看到用户正在干嘛,如果是bash就表示用户在命令行界面)

4.9 查看cpu信息

目标:会看多少个cpu,有多少个核心。

方法1:通过配置文件查看

复制代码
# 1、配置文件位置
/proc/cpuinfo
文件内容:
processor       : 0
vendor_id       : GenuineIntel    //厂商名称
cpu family      : 6

model           : 165
model name      : Intel(R) Core(TM) i5-10200H CPU @ 2.40GHz
stepping        : 2
microcode       : 0xffffffff
cpu MHz         : 2400.007    //cpu当前运行频率
cache size      : 8192 KB
physical id     : 0           //cpu物理插槽数量(0表示第一个)
siblings        : 1
core id         : 0
cpu cores       : 1           //cpu物理核心的数量
apicid          : 0
initial apicid  : 0
fpu             : yes        //是否包含浮点运算单元
fpu_exception   : yes        //是否支持浮点异常捕获
cpuid level     : 22

wp              : yes        //写保护支持
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 4800.01
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual    //地址总线宽度

方法2:使用命令查看(推荐!)

复制代码
# 1、查看cpu信息
命令:lscpu
//命令执行结果
[root@oldboyedu ~]# lscpu
Architecture:          x86_64   //架构
CPU op-mode(s):        32-bit, 64-bit  //cpu运行模式
Byte Order:            Little Endian
CPU(s):                4    //cpu核心的总个数
On-line CPU(s) list:   0-3  //也是cpu核心总数,总共4个(0表示第一个)
Thread(s) per core:    1    //每个核心的线程数
Core(s) per socket:    1    //每个cpu物理插槽包含1个核心
Socket(s):             2    //cpu物理插槽的数量
NUMA node(s):          1
Vendor ID:             GenuineIntel   //cpu制造商
CPU family:            6
Model:                 165
Model name:            Intel(R) Core(TM) i5-10200H CPU @ 2.40GHz
Stepping:              2
CPU MHz:               2400.007  //CPU 的当前频率
BogoMIPS:              4800.01   //粗略计算的 CPU 性能指标(无实际意义)
Hypervisor vendor:     VMware    //虚拟化供应商,当前运行在Vmware虚拟化平台上
Virtualization type:   full      //支持的虚拟化技术(如 VT-x、AMD-V)
L1d cache:             32K       //一级数据缓存
L1i cache:             32K       //一级指令缓存
L2 cache:              256K
L3 cache:              8192K

4.10 查看内存信息

meninfo ==> Memory Information(存储信息)

方法1:通过配置文件查看

复制代码
# 1、配置文件位置
/proc/meminfo

方法2:通过命令查看(常用)

复制代码
# 1、查看内存信息(常用方法)
命令:free -h  //默认是以字节为单位显示,-h参数表示自动转换为可识别的大小单位,如Mb、G
//命令执行结果
[root@oldboyedu ~]# free -h
总大小       已使用     空闲       共享    缓冲/缓存     可用的内存
total       used       free      shared  buff/cache   available
Mem:       1.9G       232M       987M      9.5M     760M        1.5G
Swap:      2.0G       0B         2.0G
//free:表示空闲空间,完全未被使用的物理内存。
//free 的误区‌:如果 free 很小,新手常误以为内存满了,实际上是free空间转换成了buff/cache,
//            这些被占用的内存大部分是buff/cache,随时可以被回收
// 结论:只要 ‌available‌ 充足,即使 ‌free‌ 很少,系统内存也是健康的

4.11 systemctl管理服务

复制代码
CentOS7管理服务:systemctl
1、systemctl用于管理服务  //凡是被systemctl管理的服务,都可以使用enabled
命令:【systemctl 动作 服务名称】
服务:
NetworkMannager
network
firewalld
动作:
systemctl stop 服务        //停止服务
systemctl start 服务       //开启服务
systemctl restart 服务     //重启服务
systemctl disabled 服务    //开机禁止启动服务
systemctl enabled 服务     //开机自动启动服务
systemctl status 服务      //查看服务状态
systemctl reload 服务      //重新加载服务
2、不被systemctl管理的服务,怎么开启
那就把服务写入到/etc/rc.local配置文件,让其开机自启。
CentOS6管理服务:chkconfig(了解即可,现在不用了)
3、两个不被chkconfig接管的服务(CentOS6.x管理方式)
(1)netconsole
(2)network
4、chkconfig管理服务
chkconfig 服务 on|off
/etc/inittab/network start

4.12 查看系统已开启的服务

前置:安装专用命令netstat

复制代码
# 1、直接安装
执行命令:yum -y install net-tools

1 查看系统已开启的服务

复制代码
# 1、查看系统开启了哪些服务
命令:netstat -tnulp
//命令执行结果
[root@oldboyedu /]# netstat -tnulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1450/master

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1320/sshd

tcp6       0      0 ::1:25                  :::*                    LISTEN      1450/master

tcp6       0      0 :::22                   :::*                    LISTEN      1320/sshd

第五章 磁盘管理

6.1 磁盘物理结构

6.2 磁盘类型


一、接口类型

|----------|--------|----------------------|
| 接口类型 | 状态 | 适用场景 |
| IDE | 已淘汰 | 早期家用电脑,现已被 SATA 取代 |
| SCSI | 已淘汰 | 早期服务器/工作站,现已被 SAS 取代 |
| SATA | 家用主流 | 笔记本、台式机,性价比高 |
| SAS | 企业标配 | 服务器、数据中心,稳定且支持热插拔 |
| PCI-E | 企业标配 | 高性能 NVMe 固态硬盘,极致读写速度 |

复制代码
在企业服务器中,SAS 与 SATA 并非二选一,而是常被混用,按数据访问频率分层部署:

(1)SAS 盘:存放用户高频访问的数据(如数据库、核心业务),追求高吞吐与低延迟;
(2)SATA 盘:存放低频访问的数据(如备份、归档、日志),以容量和成本优先。

这种'热数据上 SAS、冷数据上 SATA'的混用策略,是企业在性能与成本之间最常见的平衡方案。

二、磁盘转速

要先明确一个概念:只有机械硬盘(HDD)才有转速这一说法,固态硬盘(SSD)没有转速。

复制代码
机械硬盘的常见转速档位如下: 

# 转速越高,盘片旋转越快,寻道与读写速度越快,但功耗、发热与噪音也随之上升。
5400 rpm:低功耗、低噪音,常见于大容量存储盘;
7200 rpm:家用台式机主流,性能与功耗均衡;
10k rpm:企业级高性能盘;
15k rpm:即 1.5 万转/分钟,企业级顶级性能盘,读写延迟最低。

三、服务器磁盘配置

复制代码
服务器按用途可分为 高性能服务器 与 存储服务器 两类,磁盘配置差异明显:

(1)高性能服务器(追求读写性能,多采用 15K 盘):

300G × 12块
600G × 12块
900G × 8块
(2)存储服务器(追求大容量,多采用大容量盘):

2T × 8块
 
高性能服务器以"小容量、高转速、多盘位"换取极致性能;存储服务器则以"大容量、低转速"换取海量空间。
理解这一配置逻辑,才能在后续磁盘管理中做出合理的分区与挂载决策。

6.3 RAID阵列


一、为什么需要RAID?

RAID(独立磁盘冗余阵列)是 Linux 磁盘管理的基础设施。安装操作系统时,系统要求必须设置至少一块 RAID 盘,

才能完成系统部署。它解决的核心问题是:单块磁盘在容量、安全、速度三个维度上的天然瓶颈

二、RAID的三大作用

复制代码
1. 增加可用空间
将多块物理磁盘组合为一个逻辑卷,突破单盘容量上限。 
例如:两块 900G 磁盘组合为 1.8T 的逻辑空间,可存放单块磁盘无法容纳大小为1T的数据文件。

2. 数据备份(冗余)
采用双盘镜像机制,一块磁盘存数据、另一块实时备份。当单块磁盘损坏时,
数据仍可从镜像盘完整恢复,防止因硬件故障导致的数据丢失。

3. 提高读写速度
多块磁盘并行写入扇区,将数据分散到多个盘面同时处理,显著缩短文件存储的总时长。并行度越高,吞吐能力越强。

三、RAID级别对比与选型(面试题)

|-------------------|----------|------------------------|-----------------|--------|------------------|-------------------------|
| 级别 | 最少盘数 | 安全冗余 | 可用容量 | 性能 | 使用场景 | 举例 |
| RAID0(条带式) | 2 块 | 无冗余(坏一块盘,就全坏) | 全部容量 | 读写最快 | 不要求安全,只要速度 | 数据库从库、临时数据 |
| RAID1(镜像) | 只能有2 块 | 100% 冗余 | 容量减半(一半存储,一半备份) | 写慢,读快 | 只追求数据的安全性,读速度没要求 | 系统盘、监控服务器 |
| RAID5(条带+校验) | 3 块 | 最多可坏 1 块 | 损失 1 块容量 | 读写均衡 | 对于数据安全、速度要求不高的 | 普遍数据库、存储访问量不高,像学校、企业的内网 |
| RAID10(条带+镜像) | 4 块 | 每组镜像对中可坏 1 块,最多可坏总盘数一半 | 容量减半 | 读写特快 | 对于安全和性能都要的 | 高并发或高访问量、数据库主库、存储 |

一句话记忆:RAID0 用安全换速度,RAID1 用容量换安全,RAID5 折中,RAID10 全都要。

6.4 磁盘两种分区格式


一、MBR分区结构规则

核心限制 :MBR 分区表最多只能记录 4 个分区,这也是 Windows 中 C/D/E/F 只有 4 个盘符上限的根本原因。

|----------|----------------|------------------|
| 分区类型 | 数量限制 | 能否存数据 |
| 主分区 | 最多 4 个 | ✅ 可以 |
| 扩展分区 | 最多 1 个 | ❌ 不可以(仅用于承载逻辑分区) |
| 逻辑分区 | 数量无限制(受磁盘空间约束) | ✅ 可以 |

两种合法组合

复制代码
(1)4个主分区(简单直接,但无法再扩展)
(3)3个主分区 + 1个扩展分区(扩展分区内,再划分G、H、I...等无上限个逻辑分区,只要磁盘空间够就行)

******************************************************

举例:想把磁盘空间划分为7个分区。
做法:划分3个主分区 + 1个扩展分区。扩展分区再划分出G、H、I、J这4个逻辑分区。

逻辑分区的好坏之处:

复制代码
好处:突破 4 分区上限,可划分任意多个分区。
坏处:数据写入路径变长(扩展分区 → 逻辑分区),写入速度会变慢。

二、GPT分区结构规则

复制代码
可以划分128个主分区,适合磁盘空间大于2T的时候,使用GPT格式。

三、面试题

复制代码
对大于2T的磁盘,用parted分区。 GPT格式 128个主分区

对小于2T的磁盘。用fdisk分区。 MBR格式 4个主分区

6.5 磁盘分区格式化(实操)


一、企业磁盘不够用, 添加新的磁盘

1、如果是物理主机,直接插上一块新的磁盘,支持热插拔,不用重启系统。

2、如果是云服务器,直接通过命令分配。

3、如果是linux虚拟机,新增硬盘流程如下:

步骤1:在虚拟机中新增一块硬盘。

找到虚拟机,右键设置 ,此时弹出对话框。点击添加 ,此时弹出对话框。选择硬盘 ,然后点下一步

磁盘类型选择《SCSI》(虽然现实中SCSI已经淘汰了,但是虚拟机还是推荐使用SCSI)

选择《创建新虚拟磁盘》

这里配置硬盘的容量

直接点完成。

最后,需要重启虚拟机。(物理机不需要重启,只有虚拟机才要。)

二、对硬盘进行分区、格式化、挂载

**步骤1:**查看硬盘是否存在分区。

复制代码
[root@simida ~]$ fdisk -l    #fdisk是磁盘的分区工具。

# sda表示第一块硬盘。   /dev/sda表示硬盘的位置。   21.5 GB是硬盘的总容量。
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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      #dos表示分区类型是MBR,gpt表示分区类型是GPT。
Disk identifier: 0x000aac7b

# 下面这几行数据,表示硬盘sda有分区。
     Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41943039    18668544   83  Linux

# sdb表示第二块硬盘。
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xb7acc649


# 下面没有数据了,表明硬盘sdb没有进行分区。

**步骤2:**给新添加的硬盘sdb进行分区。(相当于给房间打隔断,此时分配完还不能直接使用,需要格式化后才能用!)

复制代码
# 1、通过命令`fdisk /dev/设备名称`,进入分区界面。
[root@simida ~]$ fdisk /dev/sdb
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 0xb7acc649.

****************************************************************************

# 2、输入`m`,可以查看fdisk命令有哪些选项。(下面有注释的就是常用的)
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition                      #删除分区
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types              #分区类型(对应fdisk -l中的ID和System)
   m   print this menu                         #打印帮助信息,显示菜单(shell编程中讲解)
   n   add a new partition                     #创建新分区
   o   create a new empty DOS partition table
   p   print the partition table               #输出打印分区表
   q   quit without saving changes             #退出分区,不保存操作
   s   create a new empty Sun disklabel
   t   change a partition's system id           '
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit            #保存分区设置,并退出
   x   extra functionality (experts only)  
   

****************************************************************************

# 3、输入`n`,开始创建分区。
Command (m for help): n
Partition type:      #p表示主分区,e表示扩展分区。
   p   primary (0 primary, 0 extended, 4 free)  #括号内:0个主分区,0个扩展分区,4个空闲分区
   e   extended
Select (default p):                  #选择分区,默认是主分区。我们就是要配置主分区,直接回车
Partition number (1-4, default 1):   #选择分区编号,默认是1。使用默认值,直接回车
First sector (2048-41943039, default 2048):   #配置从哪个扇区开始。使用默认值,直接回车

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G   #给sdb1分区设置磁盘空间大小
Partition 1 of type Linux and of size 1 GiB is set   #表明对其中一个分区配置完成

Command (m for help): p    #打印出来看一下硬盘sdb的分区情况

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0x295ce5cc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

****************************************************************************
 
# 4、输入`d`,开始删除分区(默认从分区编号为4开始删)
Command (m for help): d              #如果只有一个分区,那么就直接被删除了,而不会弹出下面的会话。
Partition number (1-4, default 4):   #选择要删除的分区编号,我们就是要删4,直接回车。
Partition 4 is deleted               #表明4分区已经被删除了。

****************************************************************************

# 5、输入`n`,开始创建扩展分区(扩展分区只能配1个)
Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (12584960-41943039, default 12584960): 
Using default value 12584960
Last sector, +sectors or +size{K,M,G} (12584960-41943039, default 41943039): 
Using default value 41943039
Partition 4 of type Extended and of size 14 GiB is set

****************************************************************************

# 还没完,扩展分区没办法直接格式化,需要进一步配置逻辑分区。
# 6、此时输入n,默认就是进入到配置逻辑分区。
Command (m for help): n
All primary partitions are in use   #表明所有主分区被使用,后面再进行配置的是逻辑分区
Adding logical partition 7          #第七块分区
First sector (18882560-41943039, default 18882560): 
Using default value 18882560
Last sector, +sectors or +size{K,M,G} (18882560-41943039, default 41943039): +3G
Partition 7 of type Linux and of size 3 GiB is set

Command (m for help): p            #打印出来看一下效果(从名字上面看不出是主分区,还是逻辑分区)

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xb7acc649

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     6293503     2097152   83  Linux
/dev/sdb3         6293504    12584959     3145728   83  Linux
/dev/sdb4        12584960    41943039    14679040    5  Extended  #扩展分区本身不算的,往下都是逻辑分区
/dev/sdb5        12587008    14684159     1048576   83  Linux
/dev/sdb6        14686208    18880511     2097152   83  Linux
/dev/sdb7        18882560    25174015     3145728   83  Linux

*****************************************************************************

# 7、最后一步,输入`w`,保存退出(十分关键,如果不这样做,前面的配置白费力气)
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@simida ~]$ 

**步骤3:**给所有分区进行格式化。(格式化后,其实还不能直接使用,还需要挂载)

复制代码
 #格式化的类型:一般情况下,我们默认使用xfs就可以了。
 (1)reiserfs:reiserfs大量小文件业务,首选reiserfs(100k以内),单独安装。
 (2)xfs:有的门户的数据库MySQL业务会选择xfs。
 (3)ext4:视频下载、流媒体、数据库、小文件业务。
 (4)ext2:没有日志,蓝汛、网宿的cache业务,CDN网站加速服务的。
 
 *******************************************************************************
 
 # 1、对某一个分区进行格式化。语法:[mkfs.文件系统类型 分区路径]
 # 格式化后,开始给分区分配inode号、目录、文件、权限等。
 [root@simida ~]$ mkfs.    #按两次tab键,出现选项
mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs
 [root@simida ~]$ mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

**步骤5:**分区配置完成了,现在需要给每个新的分区进行挂载。(其实就是创建空目录,把新分区挂载上去)

复制代码
#创建空目录,作为挂载点
[root@simida ~]$ mkdir /sdb1         
# 1、把新分区挂载到指定目录。命令:[mount 分区路径]      
[root@simida ~]$ mount /dev/sdb1 /sdb1    #如果挂载目录本身已经有文件了,那么文件会被隐藏起来。

#如果要卸载下来,通过命令:[unmount 分区路径]

验证是否挂载成功: 通过命令【df -h】,查看正在使用的磁盘分区的 容量挂载情况。

复制代码
[root@simida ~]$ df -h

#文件系统         容量  已用  可用  已用% 挂载点
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.6M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.2G   16G  13%   /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/sdb1      1014M   33M  982M   4% /sdb1        #目前只挂载了这个新分区,其他分区按上述内容操作一遍即可。

**步骤6:**配置开机自动挂载。(如果没有做自动挂载,重启后又无法访问那个分区了) ⇒ 自动挂载

复制代码
# 1、先学习查看磁盘分区的UUID,后面配置自动挂载时会用到。命令:[blkid]
[root@simida ~]$ blkid
# 只有已经完成格式化的分区才会在下面列表中显示出来。
/dev/sda1: UUID="b7ceb5a2-a341-4155-ba2c-7fb365d99e30" TYPE="xfs" 
/dev/sda2: UUID="199b0c6b-8267-450f-83d2-727ee6980350" TYPE="swap" 
/dev/sda3: UUID="10ffee00-7444-456f-a2bd-b0b407279a25" TYPE="xfs" 
/dev/sdb1: UUID="4ca162eb-658b-4088-a8d2-18feb35dbd48" TYPE="xfs" 
/dev/sr0: UUID="2020-11-04-11-36-43-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"

*************************************************************************

# 2、配置磁盘分区自动挂载(磁盘开机自动挂载硬盘的配置文件:/etc/fstab)
# 笔试题:
第一列:设备唯一编码。
第二列:挂载点,设备入口,类似通过/mnt进入cdrom
第三列:文件系统类型。
第四列:挂载参数,默认defaults即可。
第五列:是否开机自检,0是不自检,1是自检。
第六咧:是否备份,0是不备份,1是备份。

# UUID                                    挂载点       文件系统类型  挂载参数   开机自检 是否备份
UUID=10ffee00-7444-456f-a2bd-b0b407279a25 /                xfs     defaults        0 0
UUID=b7ceb5a2-a341-4155-ba2c-7fb365d99e30 /boot            xfs     defaults        0 0
UUID=199b0c6b-8267-450f-83d2-727ee6980350 swap             swap    defaults        0 0
# 配置自动挂载方法1:使用UUID
UUID=4ca162eb-658b-4088-a8d2-18feb35dbd48 /sdb1            xfs     defaults        0 0  

# 配置自动挂载方法2:使用分区的路径
/dev/sdb1                                /sdb1             xfs     defaults        0 0

恭喜你,分区配置完成,并成功挂载,可以正常使用了!

三、重新格式化分区

**步骤1:**先检查磁盘是否被哪个软件占用,先解除占用

**步骤2:**先查看所有分区挂载状态。命令:【lsblk】

复制代码
# 方法1:
[root@simida ~]$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 17.8G  0 part /
sdb      8:16   0   20G  0 disk 
├─sdb1   8:17   0    1G  0 part /sdb1
├─sdb2   8:18   0    2G  0 part 
├─sdb3   8:19   0    3G  0 part 
├─sdb4   8:20   0    1K  0 part 
├─sdb5   8:21   0    1G  0 part 
├─sdb6   8:22   0    2G  0 part 
└─sdb7   8:23   0    3G  0 part 
sr0     11:0    1  4.4G  0 rom 

# 方法2:
[root@simida ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.6M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.2G   16G  13% /
/dev/sda1       197M  110M   88M  56% /boot
/dev/sdb1      1014M   33M  982M   4% /sdb1
tmpfs           199M     0  199M   0% /run/user/0

**步骤3:**卸载设备。

复制代码
[root@simida ~]$ umount /dev/sdb1

如果卸载时提示 target is busy,说明有进程正在访问该挂载点,无法直接卸载。可以使用以下命令查找并结束占用进程:

复制代码
# 查找占用进程
fuser -vm /dev/sdb1

# 或使用 lsof 查看具体占用的文件
lsof +D /mnt/data

# 强制结束占用该设备的所有进程(谨慎操作)
fuser -km /dev/sdb1

**步骤4:**对整块硬盘sdb进行重新格式化。(格式化后,所有分区会丢失,变成一整块未分区的硬盘)

如果对整块硬盘进行格式化,要提前将每一个分区进行卸载。

复制代码
# 1、对整块硬盘进行格式化,会先报警告信息,提示需要加 -f 选项进行强制执行。
[root@simida ~]$ mkfs.xfs /dev/sdb  
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

# 2、#加 -f 参数的原因:它觉得你的sdb1分区里面已经存储了文件,如果格式化会清空所有数据。用 -f 进行强制执行。
# 如果出现下面的内容,表示重新格式化成功。
[root@simida ~]$ mkfs.xfs -f /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

验证硬盘被格式化成功

复制代码
[root@simida ~]$ fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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: 0x000aac7b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41943039    18668544   83  Linux

# 看这里,下面已经没有分区信息了,说明硬盘sdb格式化成功。
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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

第六章 网络和安全管理


7.1 查看网卡信息

复制代码
# 1、查看网卡信息
//步骤一:先下载net-tools包,否则命令用不了
命令:yum -y net-tools
//步骤二:使用
命令:ifconfig [网卡名称]

7.2 查看网关

ip route

7.3 查看公网地址

复制代码
命令:curl cip.cc

7.4 查看网络状态

netstat命令用于显示网络状态。

利用netstat指令可让你得知整个Linux系统的网络情况。

复制代码
[root@VM_0_9_centos ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0    0.0.0.0:22    0.0.0.0:*      LISTEN   3308/sshd
tcp6       0      0         :::80         :::*      LISTEN   4624/httpd

7.5 配置网卡信息

复制代码
# 1、网卡配置    
//注意:ifcfg-eth0是网卡名,看个人主机配置而定
配置文件位置:/etc/sysconfig/network-scripts/ifcfg-eth0  //interface configuration
配置文件内容如下:
TYPE=Ethernet        //网络类型:以太网
BOOTPROTO=none       //ip地址的获取方式:none(和static一样)、static、dhcp
NAME=eth0            //网卡在系统中显示的名称
DEVICE=eth0          //硬件的名称
UUID=122a3e53-76c4-48f3-bbb9-242143964f9c    //网卡编号
ONBOOT=yes           //开机自启network服务
IPADDR=10.0.0.200    //服务器(网卡)ip地址
PREFIX=24            //子网掩码:决定局域网内可用的ip地址数量
GATEWAY=10.0.0.2     //网关
//DNS服务器:阿里云:223.5.5.5、223.6.6.6。 电信:114.114.114.114。 谷歌:8.8.8.8
DNS1=223.5.5.5    //DNS服务器
2、完成网络配置后要重启网卡,若不提示任何信息才说明成功
命令:systemctl restart network
3、检查ip是否正常
命令:ip add
4、最后检查网络是否能连通
命令:ping www.baidu.com

7.6 关闭NetworkManager

复制代码
# 1、网络管理的两个服务
(1)network:默认使用的,有这个才能正常使用网卡。
(2)networkManager:默认是开启的,必须关闭且禁止开机自启,如果不关闭的话,
     他会和network争抢网络管理控权,因为我们没有对NetworkManager配置过IP地址,
     那么使用服务器的过程中,就会出现IP地址为空的情况。

7.7 关闭防火墙

复制代码
# 1、防火墙作用
流量限制,流量分析(类似地铁安检员)。
2、查看防火墙状态(学习时关闭,企业中开启)
//绿色的running就是运行,dead就是关了
命令:systemctl status firewalld
3、临时关闭防火墙
命令:systemctl stop firewalld
4、禁止开机自启
//只要查看时,有enabled就是开机自启,要改成disabled
命令:systemctl disabled firewalld
5、什么时候需要开启防火墙?
(1)服务器在公网上
(2)用户可以直接访问的服务器
(3)有公网的云服务器
6、什么时候需要关闭防火墙?
(1)服务器在局域网(公司、教室)中不需要开启
(2)没有公网IP地址
(3)内部测试服务器
(4)高并发场景需要关闭(如,双11、618) 怎么解决安全?部署硬件防火墙

7.8 查看DNS解析

复制代码
# 1、查看用的是哪个DNS来解析
命令:nslookup `网站域名`     //例如:nslookup www.baidu.com

7.9 本地DNS配置

1 DNS查询原理

复制代码
# 1、DNS查询原理
(1) 先在本地(/ect/hosts)进行域名解析。
(2) 如果hosts中没有对应的关系,则去真正的DNS服务器去查询。

编辑

2 本地DNS配置

复制代码
# 1、本地DNS配置(可用于劫持)
配置文件位置:/etc/hosts
文件内容如下(初始是空文件,内容是从网卡配置中自动读取过来的)
183.240.99.22   www.baidu.com    //第一个是ip地址,第二个是域名

7.10 DNS配置

resolve.conf ==> resolve configuration (解析配置)

1 哪里配置

复制代码
# 1、配置文件
// 该文件用于指定DNS服务器的地址
位置:/ect/resolv.conf
文件内容:
//可以配置多个dns,默认调用网卡中我们配置好的DNS1=223.5.5.5
nameserver 223.5.5.5

nameserver 114.114.114.114
3、网卡配置文件中的DNS1和DNS配置文件中配置的有何区别?
网卡配置文件的位置:/etc/sysconfig/network-scripts/ifcfg-eth0
DNS配置文件的位置:/ect/resolv.conf
区别:
(1)如果重启网卡,那么网卡的dns配置会覆盖/etc/resolv.conf文件中的配置
(2)如果网卡中没有配置dns,那么不会覆盖/etc/resolv.conf文件中的配置

2 查看当前是哪个DNS服务器给我们域名解析的(以百度为例)

复制代码
//步骤1:先安装nslookup命令
执行命令:【yum -y install bind-utils】 
//步骤2:使用nslookup命令,查看当前使用的DNS服务器ip、域名对应的ip
语法:nslookup 要查询的域名 [指定哪一台dns服务器解析]
[root@oldboyedu /]# nslookup www.baidu.com
Server:    223.5.5.5       //本次解析使用的DNS服务器地址
Address:  223.5.5.5#53    //本次解析使用的DNS服务器完整地址
Non-authoritative answer:   //非权威数据(数据源于本地DNS缓存)
www.baidu.com  canonical name = www.a.shifen.com.
//百度为提升访问稳定性,配置了多个IPv4地址,客户端会随机选择一个连接
Name:  www.a.shifen.com
Address: 111.45.11.5
Name:  www.a.shifen.com
Address: 183.240.99.224
Name:  www.a.shifen.com
Address: 2409:8c54:870:310:0:ff:b0ed:40ac
Name:  www.a.shifen.com
Address: 2409:8c54:870:187:0:ff:b0d9:bb1c

3 企业中配置

复制代码
# 直接在网卡中配置dns,然后重启网卡,此时这些dns配置会覆盖到/etc/resolv.conf文件中
DNS1=223.5.5.5
DNS2=114.114.114
DNS3=8.8.8.8

第七章 日志管理


10.1 系统日志文件

复制代码
# 1、系统日志文件
配置文件位置:/var/log/messages
//执行结果
后期需补充!
2、什么时候看系统日志?
一般情况下,我们只需看服务的日志,在Nginx里面查看自身日志:/var/log/nginx/nginx.log
当有些服务的日志会默认将部分日志输出到message系统日志中,此时只能在这里查看。

10.2 系统登录和退出日志

复制代码
# 1、系统登录和退出日志文件
配置文件位置:/var/log/secure  //如果出现大量日志,说明有人在暴力破解

第八章 用户和权限管理

8.1 查看谁正在使用系统

复制代码
命令:whoami

8.2 查看谁登录过系统

复制代码
命令:last    #如果看到模式的ip,说明可能被入侵了。

8.3 退出登录

复制代码
命令:exit  #退出当前登录用户

如果是图形界面,退出当前终端;
如果是使用ssh远程登录,退出登陆账户;
如果是切换后的登陆用户,退出则返回上一个登陆账号。

8.4 用户相关配置文件


一、用户分类

复制代码
#一、用户分类
1)超级管理员(root)    
   作用:拥有最高权限,类似皇帝。
2)普通用户(自定义用户名)  
   作用:拥有个人用户的最高权限。登录系统(优化系统,更加安全)
3)虚拟用户( 傀儡用户 )  
   a. 不能登录系统(无法ssh、终端登录)
   b. 不给个人使用。此用户仅为了运行进程,进程的运行需要用户。
         举例:nginx、mysql、www 用户都属于虚拟用户
         

#二、判断root用户、普通用户、虚拟用户
【方法】通过配置文件/etc/passwd查看用户信息,查看用户id(uid号码)
管理员:0
普通用户:1000+
虚拟用户:1-999

二、3个配置文件

配置文件1 /etc/passwd【存储用户信息】

复制代码
//文件内部:
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
/*
第一列   zhangsan:  用户名
第二列   x:         密码占位符。真实密码加密后存储在配置文件:/etc/shadow
第三列   1001:      用户id
第四列   1001:      用户组id
第五列   空字段:    用户描述信息,可要可不用(平时没啥用)
第六列   /home/zhangsan: 用户家目录位置。
第七列   登录shell:
如果是/bin/bash,就是普通用户,运行登录操作系统。
           如果是/sbin/nologin,那么就是虚拟用户,不允许登录操作系统。
*/

配置文件2 /etc/shadow【存放用户密码信息】

复制代码
了解即可,不太重要。

配置文件3 /etc/skel【是所有用户的home模板】

复制代码
# 1、/etc/skel为啥是模板?
/etc/skel,其目录下有两个隐藏文件:.bash_profile、.bashrc。
每次创建用户,都会把这两个隐藏文件进行copy,然后粘贴到新用户的家目录里面。
比如创建了oldboy用户,那么/home/oldboy/目录下,就会有.bash_profile、.bashrc两个文件。

# 2、.bash_profile 和 .bashrc 的关系
关系:.bash_profile会默认加载.bashrc
// .bash_profile文件内部:
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# 3、.bash_profile 和 .bashrc 的加载时机
//.bash_profile 加载时机
(1)直接在linux服务器上登录,输入完用户名密码时会加载。
(2)通过ssh远程登录时,输入完用户名密码时会加载。
(3)通过 'su - 用户名' 进行切换用户时会加载。
(4)通过 source .bash_profile,手动加载。
//.bashrc 加载时机
(1).bash_profile文件被加载时,会主动调用并加载 .bashrc文件。
(2)通过 source .bash_profile,手动加载。

# 4、用户创建流程
步骤1:创建用户(useradd oldboy)
步骤2:系统会将/etc/skel/隐藏的环境变量文件(.bash_profile、.bashrc),
      复制到/home/用户名/中
步骤3:系统将家目录中的隐藏文件的属主属组修改为普通用户。

三、面试题

复制代码
# 1、如果命令行状态下,出现bash版本号而不显示用户名怎么解决?
PS1变量用于定义命令行格式
符号  含义
\u  当前登录用户名
\h  主机名,第一个点前面部分(如 server-01)
\H  完整主机名(带域名)
\w  当前工作目录完整路径
\W  当前目录最后一级名称
\d  日期
\t  24 小时制时间 HH:MM:SS
\T  12 小时制时间
@  12 小时制,带 am/pm
!  历史命令编号
#  当前 shell 会话命令序号
$  提示符符号:root 显示 #,普通用户显示 $(非常重要!)
[  开启颜色 / 特殊字符起始标记
]  关闭颜色标记
\n  换行
如何修改PS1变量?
方法1:临时修改
[root@zhangyida ~]# PS1='[\u \t@\h \w]\S'
方法2:永久修改(写入到/etc/profile文件)
最后一行写入:PS1='xxxx'
模拟不小心误删环境配置文件的后果
步骤1:先注释掉/etc/profile中的PS1变量。(注释掉全局环境配置文件)
步骤2:删除隐藏文件重新登录系统。 (删除用户的终端环境配置文件)
[root@zhangyida ~]# rm -rf .bash_profile .bashrc
[root@zhangyida ~]# exit
//此时命令行提示符变的丑陋如下:
-bash-4.2# cd /etc
-bash-4.2# pwd
-bash-4.2# ls -lah /etc
解决方案
步骤1:解决办法 复制模板文件到家目录
-bash-4.2# cp /etc/skel/.* ~/
//查看是否复制成功 .bash_profile、.bashrc
-bash-4.2# ll .bash*
步骤2:退出系统重新连接。
-bash-4.2# exit
或者通过 【source 文件】让配置文件重新执行一次
source .bash_profile    //.bash_profile会默认执行.bashrc

8.5 用户相关命令


一、创建用户

复制代码
命令:useradd [选项] 用户名
选项:
-s    //指定解释器。有两种:/bin/bash、/sbin/nologin
-u    //指定用户id(UID),如果不指定,就默认往后排。
-g    //指定用户组id(GID),如果不指定,就默认往后排。
-M    //不创建家目录。如果不使用-M,就会创建家目录。
-G    //指定附加组。(了解)
-c    //描述信息(了解)

二、查看用户

复制代码
命令:id 用户名

三、删除用户

复制代码
命令:userdel 用户名
选项:
-r    //删除用户相关的所有文件(如果不加该参数,用户家目录、邮件不会被删除)

四、切换用户

复制代码
命令:su - 用户名

五、修改用户登录密码

复制代码
方法1:passwd 用户名    //输完命令回车,此时会让你输入新密码,然后二次确认新密码
方法2:echo 新密码 | passwd --stdin 用户名(免交互设置密码)//stdin表示从标准输入读取内容
方法3:passwd --stdin 用户名 <<< "123456"

六、案例练习

复制代码
(1)创建用户oldboy,可以不加任何参数
useradd oldboy

(2)查看用户oldboy信息。
id oldboy
//命令执行结果:
uid=1000(oldboy) gid=1000(oldboy) groups=1000(oldboy)

(3)【易错点】创建用户test,指定uid为666,gid为666,不创建家目录,不允许登录(虚拟用户)
错误写法:useradd -u666 -g666 -M -s /sbin/nologin test
正确写法:先创建组,在创建用户时,组要存在才能被指定。
groupadd -666 test
useradd -u666 -g666 -M -s /sbin/nologin test

(4)使用seq+awk批量创建10个用户

(5)在登录root用户下,修改root密码
[root@simida skel]#  passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.

(6)在登录root用户下,修改用户test03密码
[root@simida skel]# passwd test03
Changing password for user test03.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.

# 一、创建用户

二、查看用户
命令:id 用户名
三、删除用户

四、切换用户

五、修改用户登录密码

六、修改文件属主、属组
命令1:chown [选项] 属主 文件名        //例如:chown test 1.txt
命令2:chown [选项] .属组 文件名        //例如:chown .test03 1.txt
命令2:chown [选项] 属主.属组 文件名  //例如:chown test.test01 1.txt
选项:
-R    //递归修改文件属主、属组(修改当前目录及子文件和子目录)
七、实战演练

6 用户组相关操作

复制代码
# 1 创建用户组
groupadd [选项] 用户组名称
选项:
-g 编号   //指定用户组的id编号,root超级管理员组编号为0,系统组编号1-999,自定义用户组从1000开始
2 修改用户组
groupmod [选项] 用户组名称
groupmod [选项] 用户组id
选项:
-g 修改后的编号       #要修改的用户组id编号
-n 修改后用户组名称    #要修改的用户组名称
3 删除用户组
groupdel 用户组名称

3 实战演练

1、在系统中创建一个admin用户组

复制代码
groupadd admin

2、在系统中创建一个test用户组,编号为2000

复制代码
groupadd -g 2000 test

3、将test用户组的的组id编号改为1002

复制代码
groupmod -g 1002

4、将admin用户组的组名称改为admins

复制代码
groupmod -n admins admin

2 语法

复制代码
1、【添加用户】
useradd [选项1 值 选项2 值 ...] 用户名称
选项:
-g 主组名称     #添加用户时指定用户所属的主组的编号(跟组相关的)
-G 附加组名称   #添加用户时指定用户所属的附加组的编号(跟组相关的)
-u 编号  #指定用户的id编号(必须唯一,0是超级管理员,1-999是系统用户,1000以后才能用于自定义用户)
-d 路径   #添加用户时指定家目录,如果不指定,默认为/home/用户名
-s 路径   #指定用户可以使用的shell脚本,主要有两个/bin/bash(普通用户)、/sbin/nologin(系统用户,不能用于登录操作系统)
-r    #代表创建的是系统账户,一般与-s /sbin/nologin参数组合使用
      #系统用户:一般是用于启动特定的应用程序
2、

8.6 sudo提权


一、sudo 核心作用

使用前提:必须在 【 /etc/sudoers 】配置文件中对用户进行授权配置,否则普通用户无法使用 sudo 命令。

复制代码
在 Linux 系统中,普通用户的权限通常较低,无法直接执行系统管理命令。
sudo 的核心作用就是临时赋予普通用户部分或全部 root 权限,且无需告知 root 密码。

二、进入sudo配置文件

【方法1】通过命令进入。(推荐!

复制代码
visudo    //自带语法检测,保存前自动校验,出错会提示,安全可靠。

【方法2】通过vim直接进入。(不推荐!

复制代码
vim /etc/sudoers    //严禁直接 vim 编辑,语法错误会导致所有用户 sudo 彻底报废!

三、编辑sudo配置文件

书写格式: 用户名 登录主机=(提权身份) 授权绝对命令的绝对路径

  • 用户名:需要被提权的普通用户

  • 登录主机:允许在哪台机器执行(ALL=所有主机,localhost=仅本机)

  • (提权身份):临时切换为哪个用户的权限((ALL)(root) 代表提权为 root)

  • 授权命令:必须写绝对路径,多个命令用逗号分隔

    用户可以通过任何主机登录,把命令cat提权为root用户权限

    //含义:用户oldboy,可通过所有主机登录,可提权执行 cat、cd
    oldboy ALL=(ALL) /usr/bin/cat/,/usr/bin/cd

    用户只能通过本机登录,把命令cat提权为root用户权限

    //含义:用户liuming,仅本机登录,仅可提权执行 cat
    liuming localhost=(root) /usr/bin/cat

    用户可以通过任何主机登录,把所有命令提权为root用户权限,并且无须输入用户密码。

    //含义:用户liuxi,所有命令提权无需输入用户密码,可直接 sudo su - 切 root。
    liuxi ALL=(ALL) NOPASSWD: ALL

    用户可以通过任何主机登录,把除了vim命令以外的所有命令提权为root用户权限,

    并且无须输入用户密码。

    //含义:用户liuxi 允许所有权限,但禁止使用 vim(防止篡改系统文件)
    liuxi ALL=(ALL) NOPASSWD: ALL !/usr/bin/vim

四、使用sudo提权

复制代码
sudo cat test.txt

五、查看当前登录用户所有sudo 授权权限

可直观看到:是否有提权权限、允许哪些命令、是否免密提权。

复制代码
没有给用户授权sudo

[test@simida ~]$ sudo -l
[sudo] password for test:     //这里要输入密码
Sorry, user test may not run sudo on simida.

六、易错坑点

复制代码
踩坑1:
场景:即使为 cd 命令配置了 sudo 提权,普通用户仍无法进入 /root 目录。

踩坑2:
场景:通常只建议对查看类命令(如 cat、ls)进行提权,避免对 sed、awk、rm 等能修改或删除文件的命令授权,以防误操作。

8.7 linux九位权限符


一、Linux文件权限

复制代码
r 可读:可以查看、读取文件内容(cat、more、less)
w 可写:可以修改、覆盖文件内容(vi、echo 重定向)
x 可执行:可以运行脚本/程序(bash、./ 执行)

*****************************************************

# 1、九位权限的表示方式
方式1:以字母的形式,表示权限rwx。
权限:rw-r--r--.  (r:可读。w:可写。x:可执行)

方式2:以数字的形式,来表示权限rwx。(每3位的权限位换算成数字进行相加)
// r===4  w===2 x===1
权限:rw-r--r--,表示为数字:644
权限:rw-r-xrw-,表示为数字:656
权限:rw-rw-r--,表示为数字:664

******************************************************

# 2、九位权限符号介绍
前面三位:rw-,表示文件属主的权限。(文件拥有者)
中间三位:r--,表示文件属组的权限。
后面三位:r--,表示其他用户的权限。(属主、属组以外的其他用户权限)

二、怎么看当前登录用户对某个文件的权限

复制代码
# 一、系统判断当前用户对文件的权限,优先级从上到下,匹配即停止:
1. 先判断:当前用户 是否是文件属主 → 匹配前3位权限
2. 若不是:判断当前用户是否属于文件属组 → 匹配中间3位权限
3. 都不匹配:使用 其他用户 → 匹配后3位权限


# 二、案例练习
(1)当前登录用户是root,test.txt文件属主也是root,那就看前三位权限:rw-(可读可写)
[root@simida ~]$ ll test.txt 
-rw-r--r--. 1 root root 70 Aug 20 00:08 test.txt

(2)当前登录用户是test,test.txt文件属主是oldboy,那对于test.txt来说,test是陌生人
    看最后三位权限:r--(只能读)
[test@simida ~]$ ll test.txt 
-rw-rw-r--. 1 oldboy oldboy 0 Aug 20 22:16 test.txt

三、rwx对文件、目录的作用

复制代码
# 一、rwx对文件的作用
重点:文件能否被删除,和文件本身的权限没关系,和文件所在的目录有关系。
(1)查看文件内容,必须拥有 r 权限。
(2)读写文件内容,必须拥有 rw 权限。
(3)执行文件,必须拥有 rx 权限。

普通文件的最高权限:666
企业中,所有普通文件的最高权限只能为:644

*************************************************

# 二、rwx对目录的作用
(1)只有 r 权限:只能ls看目录下有哪些文件名。
(2)只有 w 权限:理论上可以在目录内新增、删除、移动、复制文件或目录,
                 但是缺少了x权限,无法进去;缺少了r权限,看不到目录里面有什么文件。
                 所以,只有w权限,啥也干不成。
(3)只有 x 权限:可以cd进入目录。
如果能查看文件的内容,那么文件所在的目录,必须拥有 r 和 x 权限。
如果想要在目录下对文件进行创建、删除、移动,必须拥有 rwx 权限。

8.8 修改权限


一、chmod语法

复制代码
 语法:chmod 权限符 操作符 权限位 文件名

权限符:
u user → 属主 (owner)
g group → 属组 (group)
o other → 其他用户 (other)
a all → 全部 (u+g+o)

操作符:
+:增加权限
-:移除权限
=:直接设置为指定权限,覆盖原有

权限位:
r 读,w 写,x 执行

二、案例练习(使用字母rwx表示权限)

复制代码
(1)授权属主位增加x权限
chmod u+x test.txt

(2)把属主位的w权限给去掉
chmod u-w test.txt

(3)授权属组位wx权限
chmod g+wx test.txt

(4)取消属主的所有权限
chmod g-rwx test.txt

(5)授权属主和其他位置x权限
chmod uo+x test.txt

(6)授权所有位置去掉x权限
chmod ugo-x test.txt
或者
chmod a-x test.txt

(7)假设原权限位:rw-xr--rw-。属主位rw-中,我只想授权x权限    
chmod u=x test.txt

三、案例练习(使用数字表示权限)

复制代码
(1)授权文件权限为:rwxr--r--
chmod 744 test.txt

(2)授权文件权限为:rw-------
chmod 600 test.txt

(3)授权文件权限为:rwxr-xr-x
chmod 755 test.txt

8.9 系统默认权限umask


注意:umask只能作为学习了解,企业中不能去修改umask!

一、文件/目录的默认权限、最高权限

复制代码
# 1、文件/目录的最高权限
文件:666
目录:777

# 2、文件/目录的默认权限
文件默认权限:644,即rw-r--r--。(对其他用户来说,只能看文件,无法修改文件内容)
目录默认权限:755,即rwxr-xr-x。(对其他用户来说,只能看,无法新增、删除、移动目录)

# 3、默认权限计算过程:
默认文件/目录权限 = 文件或目录的最高权限 - umask值 
文件:666 - 022 = 644
目录:777 - 022 = 755

# 特殊情况
如果umask值为奇数,那么创建的文件权限,运算结果要加1(仅针对文件,目录正常运算)
原因:Linux 系统规定:新建普通文件,默认绝对不会自带可执行 x 权限。

二、查看umask值

复制代码
# 1、umask作用
用于计算出文件/目录的默认权限值。

# 2、语法
命令:umask  回车
[test@simida ~]$ umask
0022    

三、临时修改umask值

复制代码
命令:umask 数值

四、笔试题

复制代码
# 1、如果默认创建的文件权限为000,那么umask值是多少?
文件默认权限 = 文件最高权限值 - umask值
umask值 = 文件最高权限 - 文件默认权限 = 666 - 000 = 666

# 2、如果umask值为032,那么创建出来的文件权限默认是多少?
文件默认权限 = 文件最高权限值 - umask值(如果umask有奇数位,则算出结果后,需要在奇数位加1)
文件默认权限 = 666 - 032 = 634(mask值位032,中间那位是奇数)
则 最终文件默认权限 = 634 + 010 = 644

# 2、如果umask值为021,那么创建出来的文件权限默认是多少?
文件默认权限 = 文件最高权限值 - umask值(如果umask有奇数位,则算出结果后,需要在奇数位加1)
文件默认权限 = 666 - 021 = 645(mask值位021,最后那位是奇数)
则 最终文件默认权限 = 645 + 001 = 646

8.10 隐藏权限


注意:除了隐藏权限无法修改文件以外,还有第三方软件的限制,也会限制文件的权限。

如果通过查看文件隐藏权限发现没问题,就问领导是否有第三方软件的限制。

一、查看隐藏权限

复制代码
命令:lsattr 文件名
//命令执行结果:
----------------- 文件名

二、设置隐藏权限

复制代码
命令:chattr [选项] 文件名
选项:
+a    //无敌的,只能通过>>追加内容,无法vim。
+i    //无敌的,无法对文件做任何操作,包括增删改。

三、取消隐藏权限

复制代码
命令:chattr [选项] 文件名
选项:
-a    //无敌的,只能通过>>追加内容,无法vim。
-i    //无敌的,无法对文件做任何操作,包括增删改。

8.11 粘滞位


目前只有/tmp目录,默认是具备粘滞位的。

一、粘滞位的作用

复制代码
粘滞位的含义:控制自己的目录,只能由自己管理。

二**、粘滞位的语法**

复制代码
命令:chmod 1777 目录(那个权限位777前面的1就是粘滞位)

三、粘滞位使用场景

场景:当前登录用户是oldboy,有目录data,其权限为:drwxrwxrwx,目录里面有文件1.txt,2.txt。而oldboy对应最后三位权限位:rwx,所以理论上我是可以删除2.txt、3.txt文件的。但是我希望文件只能由文件属主进行控制,限制其他用户操作(增删改、移动、复制)。也就是说:要求oldboy不能删除2.txt、3.txt文件,2.txt只能由root用户控制,3.txt只能由test用户控制。

复制代码
-rw-rw-r-- 1 oldboy oldboy 0 Mar 22 12:14 1.txt
-rw-r--r-- 1 root   root   0 Mar 22 12:14 2.txt
-rw-rw-r-- 1 test   test   0 Mar 22 12:14 3.txt
[oldboy@db01]$ ll -d /data
drwxrwxrw  2 root   root  32 Mar 22 12:41 /data
[oldboy@db01]$ chmod 1777 /data
drwxrwxrwt  2 root   root  32 Mar 22 12:41 /data  //后三位权限变成:rwt

编辑

第九章 系统优化


4.12.2 关闭selinux

复制代码
# 1、为什么要关闭selinux?
(1)selinux是美国国家安全局开发的,用于限制root管理员。
(2)selinux默认开机自启的
方法1:临时开启和关闭selinux
命令:getenforce [选项]
选项:
-Enforcing    //开启
-Permissive   //关闭
1    //开启
0    //关闭
// 查看selinux是否开启,Enforcing表示开启,Permissive、disabled表示关闭
zhangmiao@lhj-W515-PGUV-WBY0:~$ getenforce
Enforcing
方法2:永久关闭selinux
//需要在配置文件修改:/etc/selinux/config,修改后记得重启!
SELINUX=disabled

4.12.3 关闭防火墙

4.12.6 修改yum仓库为阿里云

复制代码
# 1、为什么要修改yum仓库
yum仓库默认使用随机的yum仓库,在外国速度很慢,所以切换成国内的阿里云。
2、查看当前使用的yum仓库
命令:yum repolist
后期需补充命令执行结果!
3、yum仓库地址在本地有文件记录
配置文件:/etc/yum.repos.d/    //此目录下存放了yum仓库的地址,不能删除。
3、修改yum仓库为阿里云
//第一步:先备份默认仓库地址
命令:mv /etc/yum/repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
//第二步:下载阿里云仓库到本地(此时没有yum,可以使用curl命令下载)
命令:curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
//第三步:检查有没有下载成功
命令:yum repolist

4.12.7 配置扩展仓库

复制代码
# 1、为什么要配置多一个扩展仓库?
因为在yum仓库中只有一万多个包,有些包是没有的,需要多配置一个扩展仓库。
# 例如:尝试安装sl、cowsay
命令:yum -y install sl cowsay    //结果是安装不了,因为yum仓库没有
2、如何配置扩展仓库?
//第一步:先安装wget命令,默认是没有的
命令:yum -y install weget
//第二步:配置仓库。这个扩展仓库也是阿里云上面的
命令:wget -o /etc/yum.repos.d/eqel.repo https://mirrors.aliyun.com/repo/epel-7-repo
//第三步:查看是否有增加包
命令:yum repolist
//第四步:再尝试安装sl、cowsay
命令:yum -y install sl cowsay

4.12.8 SSH优化

复制代码
# 1、SSH
配置文件:/etc/ssh/sshd_config
作用:该服务用于我们使用远程连接工具来连接服务器的,默认是开启的,端口22。
2、优化
//第一步:打开配置文件
//第二步:找到文件115行的位置:UseDNS yes
命令:grep UseDNS /etc/ssh/sshd_config
//第三步:修改为no
修改为:UseDNS no
//第四步:重启服务
命令:systemctl restart sshd
3、优化原理:
SSH服务里面默认进行DNS反向解析,但是我们直接使用IP地址连接,不需要用到域名。
正向解析:将域名解析成IP地址。//常用,知道IP地址,直接连接即可
反向解析:将IP地址解析成域名。 10.0.0.200 --> 域名? //不需要这个过程!
4、测试能不能连接
命令:telnet ip地址:端口号    //例如:telnet 10.0.0.200:22

4.12.9 字符集优化

复制代码
# 1、作用
让中文可以正常在linux 系统中显示
2、字符集(重点:知道这两种即可)
(1)GBK
(2)UTF-8  //默认使用UTF-8,这就是为什么linux命令行可以显示中文
3、查看linux系统的字符集($符号在linux用于定义变量)
命令:echo $LANG
//执行结果:语言,编码
en_US,UTF-8
4、临时修改语言(正常使用英文,不要去修改)
命令:LANG='zh_CN,UTF-8'    //此时linux控制台显示的提示内容会变成中文
验证
命令:help man //此时看到提示内容都变成中文了
5、永久修改(我们不会去修改,可以不记)
去配置文件修改:/etc/locale.conf

4.12.10 安装自动补全工具

复制代码
# 1、两个自动补全工具
命令:yum -y install bash-completion.noarch bash-completion-extras.noarch

4.12.11 开机显示欢迎信息

复制代码
# 1、linux登录系统时,显示欢迎信息(仅仅好看,没有其他作用)
配置文件位置:/etc/motd
//文件内部(原来是空文件)

4.12.12 是否清除开机版本号

编辑

复制代码
# 1、清除开机版本显示  
//因为登录时会默认显示CentOS7版本号,是由于这两个文件导致的
配置文件位置:/etc/issue 、 /etc/issue.net
2、该文件仅用于显示版本号,一般我们清空两个文件的内容,开机就不会显示版本号了
命令:
> /etc/issue
> /etc/issue.net

4.12.13 环境变量配置(笔试题)

复制代码
# 1、配置环境变量
配置文件位置:/etc/profile

4.12.14 开机执行文件(面试题)

rc.local ==> Run Commands Local(本地运行命令)

复制代码
# 1、开机自动执行的配置文件(开机后会自动执行文件中的命令)
配置文件位置:/etc/rc.local
注意事项:该文件默认只能读,不能写,需手动添加写权限
命令:chmod +x /etc/rc.local  //只需执行一次
文件内部(初始是空的文件,内容自己写,写要在开机后自动执行的命令)
mkdir -p /root/test{1..10}

4.12.15 系统开机运行级别配置(笔试题)

inittab ==> Initialization Table‌(初始化表)

  • CentOS6:init 管理,依靠 /etc/inittab、runlevel 0~6

  • CentOS7+/RHEL7+:systemdinittab 失效,改用 target

    1、系统开机运行级别配置(CentOS6用的)

    配置文件位置:/etc/inittab
    文件内容:
    // inittab is no longer used when using systemd.
    // 注释:当前系统使用systemd作为初始化进程,/etc/inittab 文件已经不再生效
    // ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    // 注释:如果你在这个文件里添加任何配置,都不会对系统产生任何作用(写入无效)
    // Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
    // 注释:快捷键 Ctrl+Alt+Delete 重启功能,现在由 systemd 的 ctrl-alt-del.target 管理,
    // 不再由inittab控制
    // systemd uses 'targets' instead of runlevels. By default, there are two main targets:
    // 注释:systemd 使用 target(目标单元)替代传统init的运行级别(runlevel);默认有两个核心目标
    // multi-user.target: analogous to runlevel 3
    // 注释:multi-user.target = 多用户字符模式,等价于 CentOS6 的 运行级别3(命令行模式,无图形桌面)
    // graphical.target: analogous to runlevel 5
    // 注释:graphical.target = 图形模式,等价于 CentOS6 的 运行级别5(带图形桌面)
    // To view current default target, run:
    // 注释:查看系统开机默认启动目标,执行下面这条命令
    // systemctl get-default
    // 注释:查看默认启动模式命令示例
    // To set a default target, run:
    // 注释:设置开机默认启动目标,执行下面格式命令
    // systemctl set-default TARGET.target
    // 注释:修改默认启动模式语法,TARGET替换为对应目标(multi-user / graphical)
    笔试题:linux系统的运行级别
    0 //表示关机
    1 //表示单用户,忘记密码可以进入这里修改(类似window安全模式)
    2 //表示多用户,但不支持NFS、网络文件系统(缺少很多功能,而且没网,一般不用)
    3 //表示完全多用户,我们默认所在界面就是3运行级别
    4 //保留待开发
    5 //表示桌面级运行级别(需提前安装DESKTOP包,才能显示图形化界面)
    6 //表示重启
    2、查看系统运行级别
    命令:runlevel //结果 N 3
    3、切换运行级别
    命令:init 级别 //执行命令后会自动重启进入到里面

第十章 工具类

13.1 MD5校验文件是否被修改


一、使用md5sum,对单个文件做校验(学习md5sum语法)

复制代码
结论:修改文件内容,会导致文件的哈希值改变。

//步骤1:未修改文件前,把文件的哈希值记录到md5.log文件中
[root@simida ~]$ md5sum /root/test.txt > md5.log
[root@simida ~]$ cat md5.log
df59a4216c867523e164a45c0f4c43f5  /root/test.txt

//步骤2:修改文件内容
[root@simida ~]$ echo '111' >> test.txt

//步骤3:使用命令:md5sum -c 来校验md5.log文件是否发生改变,
// 如果出现【test.txt: FAILED】,表示test.txt文件被篡改。
// 如果出现【test.txt: ok】,表示test.txt文件没有被改动。
[root@simida ~]$ md5sum -c md5.log
test.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

二、使用md5sum,对整个目录做校验 (重点!)

复制代码
# 场景示例
目前有目录test,里面有三个文件:1.txt、2.txt、3.txt,一个目录test01,
里面有两个文件test01.txt、test02.txt。怎么对test目录下的所有文件进行批量生成哈希值?

# 问题
md5sum只会查找指定目录下的文件1.txt、2.txt、3.txt,问题是test目录下还有子目录test01,
子目录test01里面还有两个文件:test01.txt、test02.txt,它不会对test01里面的文件生成
哈希值。
//报错信息:md5sum: test/test01: Is a directory
[root@simida ~]$ md5sum test/*                                            */
d41d8cd98f00b204e9800998ecf8427e  test/1.txt
d41d8cd98f00b204e9800998ecf8427e  test/2.txt
d41d8cd98f00b204e9800998ecf8427e  test/3.txt
md5sum: test/test01: Is a directory

# 解决方案
通过find把指定目录下的文件全部查找出来,此时我们可以得到所有子文件的路径,
我们根据文件路径批量生成哈希值,保存到md5.log文件中。
注意:我们在使用find查找时,需要从根路径下找,才能得到子文件的绝对路径,
此时你的md5.log才可以做到放置在任意一个位置。

# 实现方法
//步骤1:先用find把test目录下的所有子文件找出来,批量生成哈希值,存储到md5.log中(得到文件路径)
[root@simida ~/test]$ find /root/test -type f | xargs md5sum > /root/md5.log
[root@simida ~/test]$ cat md5.log
d41d8cd98f00b204e9fa0998ecf8427e  /root/test/1.txt
241d8c12f00b2044180sg98ecf8427jr  /root/test/2.txt
541d8cd98f00b204e921a998ecf841h1  /root/test/3.txt
5g1d8cd98f00b204e9100998ecfgawhx  /root/test/test01/test01.txt
d21d8cd98f00b204aw800998eee5h2ha  /root/test/test01/test02.txt

//步骤2:偷偷修改1.txt文件
[root@simida ~/test]$ echo '111' >> 1.txt

//步骤3:校验test目录下的文件是否被修改过,发现1.txt:FAILED,说明被修改过了
[root@simida ~]$ md5sum -c /root/md5.log
/root/test/1.txt: FAILED
/root/test/2.txt: OK
/root/test/3.txt: OK
/root/test/test01/test01.txt: OK
/root/test/test01/test02.txt: OK
md5sum: WARNING: 1 computed checksum did NOT match

三、易错坑点

复制代码
# 问题1:md5.log文件移动位置引发路径问题。
//问题描述:
我们在使用md5sum test.txt >> md5.log,保存文件的哈希值到md5.log文件中。
此时md5.log内存储的是:fiahlgw56184651awwa test.txt。这个test.txt路径
是相对路径。如果此时我们把md5.log文件通过mv移动到其他位置,此时通过执行命令
md5sum -c md5.log时,会发现报错了,它说md5.log文件所在目录下找不到test.txt文件。
// 解决方案:
在一开始校验文件的时候,就给文件写绝对路径。
如单个文件时:md5sum /root/test.txt >> md5.log
如批量文件时:find /root/test -type f | xargs md5sum > /root/md5.log
find从根目录查找,找出来的文件就会带上绝对路径了。

四、生产环境下应用

复制代码
# 应用1:上线之前,对项目文件进行批量生成哈希值,保存到md5.log文件。
(1)开启定时任务,每隔五分钟执行一次定时任务,使用md5sum对项目所有文件进行md5校验。
(2)校验时,如果发现文件被篡改,会给开发人员和运维人员发送报错邮件。
(3)此时根据邮件内容,找到报错文件。询问是否开发人员修改?
     如果不是,则表示被黑客篡改。此时用备份文件覆盖被篡改的文件,解决问题。

# 应用2:上线后,如果确定开发人员对文件内容做了更新,此时md5.log文件肯定对应不上了。
(1)先关掉定时任务(注释掉代码)
(2)此时与开发人员沟通,当不再修改更新文件后,重新执行一次md5sum命令批量生成哈希码。

五、看一下find从 绝对路径 和 相对路径 查找的区别

编辑

第十一章 面试题

0、遇到不会的问题怎么办

复制代码
1、去慕课搜索课程 ---学习
2、去51CTO搜索买课 ---学习

1、linux系统启动流程

在视频(用户信息管理)第二节课,需补充图片

复制代码
# CentOS6启动步骤如下:
1、开机bios自检(检测硬件问题)
2、MBR引导
3、grub引导菜单
4、加载内核kernel
5、启动init进程
6、读取inittab文件,执行rc、sysinit等脚本
7、启动mingetty,进入登录界面
#企业中出错最多的问题
1、磁盘  出问题怎么办?(支持热插拔)
(1)是否在保质期内?保质期3年,联系售后换新。
(2)过了保质期,有库存吗,没有就联系采购。问领导更换硬盘流程。
(3)在保质期内更好流程
a.联系售后
b.联系IDC机房(带身份证、定个时间过去)
2、内存(内存不支持热插拔)
一般内存不会坏。
如果出问题,会有兼容性问题:关机重启或者刚开机无法启动服务器
解决办法:重新插拔内存条,拔出来擦拭金手指,然后插回去。
如果内存条很多的情况下:
方法1:全部拔下来擦拭。
方法2:一根一根的拔。拔下来一根,重启一次。
3、电源

坏了直接换新。服务器一般支持两块电源,一块备用。
4、主板

坏了直接换新。
5、cpu

2、磁盘RAID阵列说一下

3、磁盘分区

对大于2T的磁盘,用parted分区。 GPT格式 128个主分区

对小于2T的磁盘。用fdisk分区。 MBR格式 4个主分区

相关推荐
民乐团扒谱机16 分钟前
【读论文】基于波分复用和时分复用的单纤高精度双向时间传递系统
运维·服务器·网络
脚踏实地,坚持不懈!18 分钟前
Android ANR 内核底层全解析:从一次触摸到“应用无响应”
android·linux
夜雪一千18 分钟前
服务器快慢怎么测?从命令行到脚本的完整指南
运维·服务器
不会就选b22 分钟前
Linux之socket编程(三)
linux·运维·服务器
秋风&萧瑟30 分钟前
【Linux系统编程】Linux IPC 的使用
linux·运维·网络
DOLA_Tech41 分钟前
WIN电脑中VMware虚拟机网速慢的解决办法
运维·服务器
En^_^Joy1 小时前
Nginx 从入门到精通:配置、原理与实战详解
运维·nginx
玖石书2 小时前
WSL2 手动安装 Ubuntu 24.04 到指定磁盘位置
linux·运维·ubuntu·wsl
库玛西2 小时前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp