第一章 系统环境部署
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#<bin>#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+:
systemd,inittab 失效,改用 target1、系统开机运行级别配置(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个主分区