编辑
2025-08-10
undefined
00
请注意,本文编写于 122 天前,最后修改于 122 天前,其中某些信息可能已经过时。

目录

1、第一阶段 Linux 基础
技术面试的降维打击指南
0、面试技巧
1、企业故障案例
1、公司突然连不上阿里云服务器
2、磁盘相关
3、rsync 之 delete 案例
4、nginx 相关错误案例
1、nfs 路径问题
2、知乎登录界面跳转不过去
3、404 Not Found
4、502 Bad Gateway
5、403
6、时间同步
第一阶段 Linux 基础篇
1、安装 VMware 虚拟机
1、安装 Kykin 操作系统
2、修改虚拟机交换信息
3、安装 Ubuntu 操作系统
4、通过 xshell 连接
xshell 连接 Kylin
xshell 连接 Ubuntu
5、安装操作系统方法
2、连接失败排错思路
1、xshell 连接操作系统必要信息
2、无法连接操作系统排查思路:crown:
1、教室上网流程
2、xshell 连接虚拟机流程
3、xshell 无法远程连接 kylin 思路:crown:
1)系统 ip 是否正确:ip a,要注意 ip 后面必须是/24 的子网掩码,状态必须是 UP
2)检查虚拟交换机配置是否正确:必须在 10.0.0.0 255.255.255.0
3)检查 windows 是否有 vmnet8 网卡并且 ip 地址是否和虚拟机在同一网段 10.0.0 段
4) 检查用户名密码,端口,ssh 协议
注意事项:
3、虚拟机无法连接到网络:crown:
1、虚拟机上网流程
2、无法上网排查思路:crown:
1)IP 地址配置是否正确 10.0.0.200
2)检查路由网关是否配置正确 10.0.0.2 也就是路由器的地址
3)windows 必须可以上网
4)DNS 配置正确,域名解析
3、命令提示符
4、系统命令:crown:
1、关机
2、常用命令:crown:
3、面板命令快捷键
4、一级目录的作用:crown:
5、查看网卡路径:crown:
5、etc 下重要配置文件:crown:
1、网卡配置文件
1、 重启演示
2、etc/hosts:crown:
1 、如何修改 windows 系统 hosts 内容
3、etc/hostname:crown:
4、/etc/rc.local:crown:
演示:
5、/etc/inittab
6、/etc/profile:crown:
7、/etc/fstab:crown:
8、/etc/motd
9、总结/etc 重要系统配置文件
10、/etc/ resolv.conf:crown:
11、/etc/issue
12、/etc/os-release:crown:
6、proc 下配置文件:crown:
1、/proc/cpuinfo
2、/proc/meminfo
3、/proc/loadavg:crown:
4、/proc/mounts
5、查看磁盘信息:crown:
7、整理到现在学的 linux 命令
8、var 下重要配置文件:crown:
1、/var/log/messages
2、/var/log/secure
9、vim 故障
10、Linux 系统优化:crown:
1、YUM 仓库优化
2、防火墙优化
3、字符集优化
4、时间同步
5、卸载/tmp
6、重点小结
11、系统核心命令:crown:
1、echo(输出)
2、重定向符号
3、less
4、sort(排序)
5、知识点小结
6、uniq(去重)
7、wc(统计)
8、;和 || 和&&
12、软件安装
1、kylin 软件安装
2、ubuntu 软件安装
12、文件详细属性
1、inode 号
2、文件类型
3、文件权限
4、硬链接
5、软链接
13、find👑
1、find 结果交给其他命令
2、小结
14、打包压缩
1、tar 打包压缩
2、zip 打包压缩
15、正则表达式👑
1、^ 查找以什么开头的行
2、$ 过滤以什么结尾的行
3、. 表示任意单个字符
4、*前 1 个字符出现 0 次及 0 次以上
5、.和.​关键区别总结
6、[] 表示任意单个字符
16、扩展正则:crown:
1、+ 前 1 个字符出现 1 次及 1 次以上
2、| 或者的含义
3、{} 前一个字符最大匹配的次数
4、() 表示一个整体
5、重点
17、sed:crown:
1、sed 之精确查找行
2、sed 之模糊过滤
3、sed 之删除
4、sed 之增加内容
5、sed 之替换
6、小结
18、sed 后向引用:crown:
19、awk:crown:
1、awk 取行
2、awk 取列
3、指定分隔符
4、模糊过滤
5、awk 模式 + 动作
三剑客练习题
20、用户管理:crown:
1、用户分类
2、用户家目录模版
3、创建用户
4、删除用户
5、修改用户
6、设置用户密码
7、知识点小结
8、切换用户
9、用户密码管理
10、sudo 提权
21、用户相关命令:crown:
1 用户重点总结
22、MD5 校验
23、文件权限:crown:
1、如何知道当前用户对于文件的权限是什么
2、修改文件权限
3、rwx 对于文件的作用
4、rwx 对于目录的含义
5、umask 值
6、隐藏权限
7、特殊权限
24、定时任务:crown:
1、系统定时任务
2、定时任务注意事项
3、普通用户定时任务
4、小结
25、磁盘
1、磁盘分类
2、Raid 磁盘阵列
3、磁盘分区 fdisk:crown:
4、磁盘分区 parted:crown:
5、磁盘面试题:crown:
26、开机启动流程
27、进程:crown:
1、进程基本概述
2、监控进程状态:crown:
3、使用 top 命令查看当前的进程状态
4、管理进程状态
5、管理后台进程:crown:
28、Linux 网络篇
1、网络基础
1、什么是网络
2、如何通过网络实现多台主机之间的通讯
2、网络设备说明介绍
1、什么是交换机
2、什么是路由器
1、路由的概念
3、静态路由
1、配置一个路由
2、配置两个路由
3、配置三个路由
4、动态路由
3、网络层次结构:crown:
1、 网络拓扑
2、网络类型
3、网络层次模型(OSI7 层模型):crown:
4、TCP/IP 模型(4 层模型):crown:
4、数据包封装与解封装
5、DNS 解析过程:crown:
1.域名是什么 ?
6、主机到主机层协议介绍
1、控制字段介绍
2、TCP 三次握手:crown:
3、TCP 四次挥手:crown:
4、为什么要四次挥手
5、TCP11 种状态集表示含义
6、因特网层协议介绍
7、网络接入层介绍
7、IP 地址:crown:
1、IP 地址基本概念
2、IP 地址格式:crown:
3、IP 地址分配
4、IP 地址类型
5、IP 地址常见分类:crown:
6、特殊 ip 地址
7、子网掩码:crown:
8、网关
9、抓包方式
10、常用网络命令
1、nc
2、telnet
3、netstat
4、ss
5、iftop
6、nmap
7、tracert
6、重点

1、第一阶段 Linux 基础

技术面试的降维打击指南

0、面试技巧

bash
1、学会讲故事,比如推销自己,xxx问题,自己怎么解决的 2、碰见不会的技术,不要直接说不会,而是要说,这个我虽然没有接触过,但我有个思路。。。 3、让面试官感觉到你的上进心,能给公司创造价值,在别的公司怎么做的 4、也没啥问题,我感觉贵公司跟我之前做的都差不多,我觉得我能胜任这份工作
bash
#指定查看某个目录总大小 面试 [root@oldboy ~]#du -sh /tmp 1001M /tmp

1、企业故障案例

1、公司突然连不上阿里云服务器

image-20250330123315480

bash
公司要远程连接阿里云服务器(116.63.0.10),首先出网要经过宽带运营商,比如电信、联通、移动,然后再经过骨干网,才能连接到阿里云服务器, 阿里云服务器防火墙只允许公司的公网ip(1.2.3.4)地址连接,其他地方都无法连接。首先要先查看公司的公网ip地址(是否是1.2.3.4) #windows百度ip138.com,linux:curl cip.cc 然后ping一下公司服务器通不通,检查一下防火墙设置是否正确(放行的网段是否是1.2.3段),检查用户名密码以协议端口,如果以上都没问题,那 可能就是运营商给我们修改ip了,比如改成33.44.55.66了,实际上是通过33.44.55.66这个ip去访问服务器的,就会失败。 怎么知道我们的ip被修改了呢,就需要tcpdump进行抓包? 1、通过其他方式连接上阿里云随便抓一个端口,tcpdump -nni ens33 prot 12345 2、在公司的xshell上访问telnet 116.63.0.10 12345 3、一抓数据包就过去,在阿里云看到的服务器ip地址就是33.44.55.66

image-20250330123243060

image-20250330123303175

2、磁盘相关

bash
案例1:在系统运行过程中出现OOM(内存溢出)现象。导致业务中断 Linux自我保护机制: 当内存满了,自动杀死占用最高内存的进程。 swap分区: 磁盘的一个分区,当内存不够用时,临时充当内存使用、速度较慢 swap分区大小: 内存的1-1.5倍,如果内存大于8G 则swap最多分8G即可。 # 关闭swap分区 [root@m01 ~/ansible]#swapoff -a [root@m01 ~/ansible]#free -h total used free shared buff/cache available Mem: 948Mi 206Mi 234Mi 12Mi 507Mi 577Mi Swap: 0B 0B 0B # 开启swap分区 [root@m01 ~/ansible]#swapon -a [root@m01 ~/ansible]#free -h total used free shared buff/cache available Mem: 948Mi 208Mi 231Mi 12Mi 507Mi 575Mi Swap: 2.0Gi 0B 2.0Gi OOM原因: 1.java代码问题。 2.用户量较大(正常) 增加内存 3.黑客攻击(防火墙) 4.内部原因(打包备份 用某些占用内存的命令 dd find ab..) 解决OOM: 1.正常情况下流量较大、增加内存(禁止使用swap) 2.使用占用内存命令、内部测试服务器 业务波动比较大使用swap分区。 swap分区: 方法1.安装操作系统分swap分区 [root@oldboy ~]#free -h total used free shared buff/cache available Mem: 1.9Gi 187Mi 1.5Gi 16Mi 204Mi 1.6Gi Swap: 2.0Gi 0B 2.0Gi 方法2.安装完操作系统后可以临时分swap 1.卸载/tmp [root@oldboy ~]#umount /tmp # 卸载/tmp 2.生成1G大小的文件 [root@oldboy ~]#dd if=/dev/zero of=/tmp/1g bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB, 1000 MiB) copied, 7.1743 s, 146 MB/s 3.格式化成swap格式的空间 [root@oldboy ~]#mkswap /tmp/1g mkswap: /tmp/1g: insecure permissions 0644, 0600 suggested. Setting up swapspace version 1, size = 1000 MiB (1048571904 bytes) no label, UUID=0f9b724a-081c-46f4-9b81-468af370d0d4 4.挂载空间到swap [root@oldboy ~]#swapon /tmp/1g swapon: /tmp/1g: insecure permissions 0644, 0600 suggested. [root@oldboy ~]#free -h total used free shared buff/cache available Mem: 1.9Gi 188Mi 560Mi 16Mi 1.2Gi 1.6Gi Swap: 3.0Gi 0B 3.0Gi 5.卸载swap [root@oldboy ~]#swapoff /tmp/1g [root@oldboy ~]#free -h total used free shared buff/cache available Mem: 1.9Gi 188Mi 559Mi 16Mi 1.2Gi 1.6Gi Swap: 2.0Gi 0B 2.0Gi 6.开机自动挂载 [root@oldboy ~]#tail -1 /etc/fstab /opt/1g none swap defaults 0 0 案例2.导致无法写入磁盘的原因 1.inode号满,小文件太多导致 df -i 如何查找系统中的小文件? find / -type d -size +1M 如何查找系统中的大文件? find / -type f -size +100M #查看当前目录总大小 [root@oldboy ~]#du -sh 280K 案例3.解决磁盘不够用 需求: 服务输出日志---->/var/log/test.log 目前日志 10g (系统盘50G) 将10G的文件转义到大空间的磁盘中,但是日志的输出路径不变。 1.插入4T磁盘 2.格式化磁盘 mkfs.xfs /dev/sdb1 3.挂载磁盘 [root@oldboy ~]#mount /dev/sdc /data [root@oldboy ~]#df -h /dev/sdc 4.9T 35G 4.9T 1% /data 4.生成大文件 5.将/root/0321/目录移动到/data目录 [root@oldboy ~]#mv 0321/ /data #已经移动过去了 [root@oldboy ~]#ll /data total 0 drwxr-xr-x 3 root root 27 Mar 25 07:30 0321 6.做软链接到/root/data 源文件的位置已经被移动到data/0321/ [root@oldboy ~]#ln -s /data/0321/ /root/data [root@oldboy ~]#ll total 127280 -rw-r--r-- 1 root root 0 Mar 25 08:27 1.txt -rw-r--r-- 1 root root 235 Mar 25 08:28 access.log lrwxrwxrwx 1 root root 11 Mar 26 03:42 data -> /data/0321/

3、rsync 之 delete 案例

image-20250401171533575

bash
网站收到黑客攻击,导致各种文件被窜改,将网站www.oldboyedu.com改成了www.bang.com,首先要恢复业务 第一、将/data下被篡改的文件移动到/tmp目录,保留现场,看看篡改了哪些代码 第二、找到备份文件,拷贝到/data,通过定时任务查找 第三、执行rsync -avz --deleted /data root@www.oldboyedu.com:/ #谁在前以谁为准

4、nginx 相关错误案例

1、nfs 路径问题
2、知乎登录界面跳转不过去
bash
#同桌出现知乎界面登录不上去,浏览器安装界面填好信息后点完成后自动跳转到第一步,然后我把nginx配置了一遍,知乎代码重新解压了,各个方面都排查一遍,显示没问题,经过排查,原来是ip冲突了,执行ip a,又两个相同的ip地址
3、404 Not Found
bash
没有目录
4、502 Bad Gateway
bash
php-frm.server服务停止了被导致的
5、403
bash
#1.搭建负载均衡访问浏览器报错403找不到文件,通过查看错误日志/var/log/nginx/error.log发现directory index of "/code/s/" is forbidden,翻译过来就是/code/s目录被禁止,通过排查才知道是本地host文件没有被解析成负载均衡的服务器ip #2.index index.html,index.htm;语法错误导致directory index of "/code/" is forbidden,把逗号换成空格就好了
6、时间同步
bash
搭建lnmp架构,单台访问业务没问题,配置文件全对,加上负载均衡页面登录不进去,解决了一个多小时才知道是时间没同步,经过 ntpdate ntp1.aliyun.com做完时间同步才解决

第一阶段 Linux 基础篇

1、安装 VMware 虚拟机

1)选择文件-> 新建虚拟机向导,选择自定义,下一步

b16f3406-25e4-4034-a0e1-552e931fd9f6

2)默认,下一步

500f45b0-64cc-4ab4-b77d-61320b8a71e9

3)选择稍后安装操作系统,下一步

62c943c2-360e-4dba-87b9-bc99be255285

4)选择 linux,下一步 注意:版本中没有 kylin,选择 CentOS 就行

d31efd33-1eb1-4250-97ee-a54a1b9e2ddd

5)选好存储位置,注意安装位置不要放在 c 盘

03d592ce-d1ce-49e8-bb0d-e54897f87f9a

6)默认,下一步

67435ecb-2259-4013-af75-4ab5ee599e1d

7)内存分配 2G

b275a317-5a65-4d12-a8a1-fc2186d560ae

8)默认,下一步

b7a09184-2f10-4079-b6e3-7eec4ba187c9

9)默认,下一步

e9ed422f-3ead-46a9-9ddb-520040fdedb0

10)默认,下一步

f74337be-1718-4cd6-85b2-e630c6f52e7b

11)选择磁盘大小 50G 即可

b9770046-1614-4786-9c50-64b497824848

1、安装 Kykin 操作系统

1)编辑虚拟机设置

4dc2fd31-5dc2-4f2f-9f18-66fe748ff2d3

2)选择 kylin 映像文件,然后确定

e4c2a90f-76c4-4f43-83be-cad2bfc11c22

3)如下图,开启此虚拟机

9727764d-31d5-461b-af2d-5d91b6e431a9

4)安装,回车确定

5cd027d2-3c0c-4b86-ba15-3bfba3e87d77

5)选择中文,继续

6)选择安装目的地,点击完成即可,返回查看,红色叹号消失

7)点击软件选择

5d613ac2-4f2b-4f84-86f6-dd19f5ae6bd0

8)选最小安装,选择附加软件

934c6353-5025-4c1f-a799-8afab24f5903

30456fae-efca-481b-a083-1247ce44c98e

9)点击网络和主机名

73bd1bb5-89ac-41f1-addf-10b5814e1beb

10)点击配置

8f03ea20-a01a-4939-b938-8659cd3e4480

11)常规,根据图片选择,下一步

d07257ce-a6e0-4ec3-aad2-26ad787d240b

12)依次点击 IPv4 设置。方法选择手动,输入地址,点击保存

71bffaa1-634a-4a1c-a085-59cd0ced1fd6

13)连接以太网,主机名输入 oldboy,点完成

7d79d7ef-afb4-4e8f-a9f8-31970d61e3a5

14)选择 Root 密码

e2877915-9daf-4696-b67d-1e495eaf14fe

15)设置 root 密码。密码 Sdms2018

065198fd-b710-450e-a077-81885d710aae

15)开始安装

ad21eb27-19cd-47c6-beeb-db46a0262c4c

483f3719-ebe0-43a5-97c2-1f73514a3f42

16)等待的过程是漫长的,点击重启

49b2db35-a8a7-4adf-af98-e22793fad3f0

17)重启后,选择 1、2、c、c 进入登陆页面

a8a4e87d-0fe6-45ac-8dec-a7f7f2d46aa7

18)输入用户名密码,登录成功

3d28be9e-55f1-4346-bfff-14675166abf9

2、修改虚拟机交换信息

1)编辑-> 虚拟网络编辑器

4fb8d2a9-a6ed-40a5-be67-10bb9f5f9ceb

2)选择 NAT 设置,修改网关

cdb72dcd-00a8-435e-aaed-542bb90a301c

3b470c4b-548a-4158-a6f3-e74659add83d

3)配置虚拟机网络协议

d625f861-b96c-415b-b2ce-f7e4f2e9b617

3、安装 Ubuntu 操作系统

首先也是要新建虚拟机,下面只记录跟上述不一样的操作

创建虚拟机的时候,版本要选择 Ubntu 64 位

17ae28a2-33d3-4776-b4da-df14f05b66b8

选好位置命名虚拟机,注意位置不要放在 c 盘

32019518-ed9f-4365-a6ee-e5c93d9d280d

内核数量选择 2

46b6096d-7ac5-43b5-9829-e38e0ef877df

1)选择 English,回车确认

cca973f9-3143-4788-8433-8da3548bae67

2)选择 Done,继续

3447ac7c-0272-49f3-9755-8bc3d9a78090

3)选择 Done,继续

9e802c76-80a2-4c82-8912-c51fc44ec0fa

注意,这里要断网,因为安装过程中官方会去更新软件,导致安装特别慢

虚拟机-> 设置-> 网络适配器,设备状态

51693d99-81bf-4603-9a11-75aa229e9bd2

4)光标移到 NAME 下 ens33 这里回车确认

a8dbb8db-217e-4b0b-ad34-df5b24b0b46f

5)选择上面的 Edit IPv4,回车,选择下面的 Manual

51ae3b73-9a6b-40e3-8fd7-e1a969d9f7f4

6)依次输入,保存退出

cff62c15-ff37-4163-95bd-1698c694ad7b    

7)tab 键到下面,回车确认

f9762ea4-b3ab-4849-9d69-226c6a998f74

8)直接 Done

23ac3fb5-a05d-46e2-af76-d50d3a2c0c28

9)Done

0c0e7c61-807f-410a-b871-3041a3e67185

10)Done

25d18d8a-494d-40cb-9431-bb4cc0a757da

11)Done

4a960774-d32a-4907-9bc0-c9b31226c0ab

12)选择 Continue

cf7a7b4c-d254-4f2a-89e4-63db639bbf90

13)设置名字及名称和普通用户密码,密码为 1,

ddc59ef7-348e-4a6a-992b-15c3a22f8d60

14)选择第一个,空格表示确认,带 x 就是确认

8835c00e-8cb4-4914-a837-1c794d7bb4d9

15)选择第二个

c8a19c06-be01-4bd1-9495-a1d697cfc60a

16)报错不用管,回车

213ca44b-be60-4207-9e83-e3f16d0c818e

17)装完之后把网络恢复

6f9e8067-bfa2-4a67-94f7-cf32b2852388

4、通过 xshell 连接

xshell 连接 Kylin

0dc09954-8e0a-4db7-b4ae-20a8ac1b2e72

78787e88-34c7-4fe2-8ff8-6e01731d5679

02073ab3-ecac-4e1b-bf98-004264035d5b

xshell 连接 Ubuntu

148d8b37-b92c-4d70-85a4-61fb8e18b127

bb36d1bb-4ece-43c0-9594-8bf9197df391

75adc27a-127f-4cf1-a90a-85819a5a97d2

5、安装操作系统方法

bash
windows安装的方式都适用于linux 光盘-->光驱 -->外置光驱 U盘--->系统 网络安装系统 自动化安装 kickstart cobbler(扩展安装部署) 进入官网下载,写入到U盘,开机bios调试用u盘启动进入安装界面、选择语言、然后给磁盘分区、下一步配置ip系统、系统优化 安装完操作系统必须做系统优化: 做过哪些系统优化:

2、连接失败排错思路

1、xshell 连接操作系统必要信息

IP 地址

bash
kylin系统ip:10.0.0.200 ubuntu系统ip:10.0.0.201 公网ip:在任何可以上网的地方都可以访问到的网站都是公网ip,比如百度,谷歌,搜狗 私网ip:在局域网内可以访问,出了局域网访问不到,比如教室内,公司

端口号

bash
远程连接使用的是22端口,22端口表示服务是否开启,默认是开启状态 22端口是一个ssh服务

用户名/密码

协议

2、无法连接操作系统排查思路:crown:

1、教室上网流程

f31b9bcf-2b03-4e85-bd1d-328f9a5a54e7

bash
pc端为什么能通过ip地址连接到讲师机的VNC:因为所处的网段相同,都是192.168.13.xxx,并且pc端的网线都连接到了教室的交换机上面,所以相同 网段可以相互通信,如果把网关删掉,也是可以连接的,这种方式就是局域网,只是无法连接外网。 如想讲师机访问百度,那么可以通过教室交换机的上联口连接到老男孩教育机房,最终连接到路由器上面,通过路由器就可以访问百度了,为什么需要路由 器,因为现在处于局域网内,也就是私网,只能在局域网内互相访问,没办法直接访问百度。因为百度的IP地址是公网地址,只有公网才可以访问公网, 我们通过购买运营商带宽,通过拨号的方式路由器就会获取到一个公网IP地址,这样就可以互通了。 NAT网络地址转换:通过路由来把私网ip转换成公网ip从而可以访问公网地址
2、xshell 连接虚拟机流程

6c8637e8-d04b-4351-a9ab-aa0a5db5a159

bash
通过xshell连接虚拟机:两个pc端相互通信那么就需要在同一个网段,kylin的IP地址是10.0.0.200,而我们本地IP是192.168.13.253,显然 是不在同一网段,其实在安装VMware的时候,给我们的电脑虚拟了一块网卡VMnet8,我们把VMnet8的ip地址配置成10.0.0.1,这样就在同一网段了,中间通过了虚拟网络编辑器(虚拟交换机),配置IP成10.0.0.0,虚拟网络编辑器一端与VMnet8连接,一端与虚拟机连接(所有的虚拟机都与网络编辑器连接),这样通过xshell就可以打通了
3、xshell 无法远程连接 kylin 思路:crown:
1)系统 ip 是否正确:ip a,要注意 ip 后面必须是/24 的子网掩码,状态必须是 UP
bash
[root@oldboy network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:0f:d0:2e brd ff:ff:ff:ff:ff:ff inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::c0e4:8f3a:f68f:8466/64 scope link noprefixroute valid_lft forever preferred_lft forever

6333157d-28ad-4bba-8d50-ed62559ced12

bash
1、如果IP为空,说明安装过程中IP配置选项的位置出现错误 2、如果状态为down,可能是网卡没有连接,右键虚拟机--设置--网卡--已连接 3、如果IP地址显示10.0.0.128,装系统的的时候没有将DHCP修改为手动
2)检查虚拟交换机配置是否正确:必须在 10.0.0.0 255.255.255.0

03022cac-1285-460f-9e14-7a8421c66602

3)检查 windows 是否有 vmnet8 网卡并且 ip 地址是否和虚拟机在同一网段 10.0.0 段

13562e37-5c52-4270-a6e0-c512b2c41c53

31c12a3d-9f25-4bd1-8974-2a3df47ee1f8

4) 检查用户名密码,端口,ssh 协议

a0e59aa0-2fe4-4bcc-8bdf-a0ec17de0cbc

注意事项:

e1e499ff-ee19-4673-92f7-a3a2648831b3

bash
红框表示自动获取IP地址,这里的DHCP实际是指机房里的交换机自动获取的,如果虚拟机VMnet8系统配置好自动获取IP,那么勾选它后DHCP也可以 自动获取,也可以连接虚拟机 为什么选择手动获取IP呢,因为我们是服务器,服务器的IP是不能乱变的,还一个就是怕不小心把DHCP给勾掉,那么服务器的IP就会变, 手动给它指定ip后不管DHCP开没开都可以访问到虚拟机。

3、虚拟机无法连接到网络:crown:

1、虚拟机上网流程

a760422e-68ea-4422-9047-2a442c40db09

bash
正常电脑上网是电脑连接到交换机,然后交换机跟路由器可以通过网卡相连接进行上网,但是虚拟交换机跟路由器是无法通过网卡进行连接的,但是当我们安装好vmware后,就会虚拟了一个虚拟交换机跟虚拟路由器,虚拟交换机默认连接到虚拟路由器,这个虚拟路由器功能也是NAT转换,就是把虚拟机的IP(10.0.0.200)地址转换成我们本地的IP(192.168.13.253)地址,然后再通过交换机连接到路由器,再连接到网络。刚开始配置虚拟机时候配置了一个网关10.0.0.2,因为上网就得指定网关,路由器的地址就是网关地址,先通过配置的10.0.0.2找到模拟路由器的位置,通过这个模拟路由器的网关地址通过NAT转换成192.168.13.253,再转换成公网ip地址,这样就可以上网。 虚拟机上网:虚拟机--虚拟交换机--虚拟路由器--本地网络--交换机--路由器--网络 windows上网:本地网络--交换机--路由器--网络 虚拟机上网经过了两次转换,而windows上网只需要转换一次
2、无法上网排查思路:crown:
1)IP 地址配置是否正确 10.0.0.200
bash
[root@oldboy ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:0f:d0:2e brd ff:ff:ff:ff:ff:ff inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::c0e4:8f3a:f68f:8466/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@oldboy ~]#
2)检查路由网关是否配置正确 10.0.0.2 也就是路由器的地址

虚拟机的网关

03022cac-1285-460f-9e14-7a8421c66602

fa3ed5f6-78a5-4935-bafa-9ae5bd0f4281

检查系统的网关 route -n,这里的网关就是装虚拟机的时候指定的网关地址

bash
[root@oldboy ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 ens33 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 [root@oldboy ~]#

 65852981-af89-46a7-8226-85614707db4a

检查虚拟路由器,作用将虚拟机的 ip 地址转换成本地网卡段。一般不会出问题

6b9c8eac-7bc5-4815-a87d-687a5d20ec1d

3)windows 必须可以上网
4)DNS 配置正确,域名解析
bash
DND作用:将用户输入的域名解析成IP地址 计算机和计算机之间或者服务器之间通信最终都是使用IP地址进行通信

016e6d8d-80f1-4f10-b530-760abc85f9c7

bash
#查看使用哪个DNS服务器做的解析,只要解析成功当前可以上网 [root@oldboy ~]# nslookup www.baidu.com Server: 223.5.5.5 # 阿里云服务器的DNS Address: 223.5.5.5#53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 180.101.51.73 Name: www.a.shifen.com Address: 180.101.49.44 Name: www.a.shifen.com Address: 240e:e9:6002:1fd:0:ff:b0e1:fe69 Name: www.a.shifen.com Address: 240e:e9:6002:1ac:0:ff:b07e:36c5

3、命令提示符

shell
#在命令提示符的后面输入linux系统命令 [root@oldboy ~] # [] # 中括号,好看没实际作用 root # 当前登录系统的用户 @ # 没啥用,分隔符 oldBoy # 主机名称 ~ # 表示家目录,当前所在的路径 # # 用户提示符,管理员是#,普通用户是$

4、系统命令:crown:

1、关机

shell
#linux系统关机命令 1、shutdown #系统关机 [root@oldboy ~]# shutdown Shutdown scheduled for Thu 2025-02-27 19:16:47 CST, use 'shutdown -c' to cancel. # 系统将于1分钟后关机,使用shutdown -c取消关机 参数选项: shutdown -h now # 立刻关闭 shutdown -h 5 # 5分钟后关闭系统 shutdown -r # 表示重启,默认一分钟后重启 shutdown -r 5 # 表示5分钟后重启系统 shutdown -r now # 立刻重启 2、init 0 # 表示直接关机 3、init 6 # 表示直接重启 4、poweroff # 表示关机 5、reboot # 直接重启

2、常用命令:crown:

shell
1、相对路径: 从当前开始的路径 oldboy.txt 绝对路径: 从/开始的路径 /root/oldboy.txt 2、cd # 改变路径 进入到哪个目录 change directory 语法结构: cd # 直接回车 回到家目录 cd . # .表示当前的目录 cd .. # 返回到上级目录 cd - # 快速回到上一次所在的位置 类似安装了定位器 cd ~ # 快速回到家目录 等同于直接回车 3.ls # 显示当前目录下所有的文件 list 语法结构: ls # 直接回车 ls file # 查看文件是否存在 ls file1 file2 # 同时查看多个文件 ls /opt/ # 查看opt目录下有哪些文件 参数选项: ls -l # 显示文件以及文件的详细信息 ll 相当于执行 ls -l # ll不是系统命令 而是ls -l的外号 执行ll相当于系统执行了ls -l 案例1.查看1.txt是否存在 [root@oldboy ~]# ls 1.txt 1.txt [root@oldboy ~]# ls 1.txttttttttttttt ls: 无法访问 '1.txttttttttttttt': 没有那个文件或目录 案例2.查看多个目录下有哪些文件 [root@oldboy ~]# ls /opt/ /run/ /opt/: 1.txt kylin-sm-package patch_workspace /run/: abrt cockpit cryptsetup faillock gssproxy.sock lock mdadm named plymouth samba sm-notify.pid systemd udev agetty.reload console dbus firewalld httpd log motd NetworkManager podman sepermit sshd.pid systemtap user atd.pid crond.pid dmeventd-client fsck initctl lsm motd.d pesign rpcbind setrans sssd.pid tmpfiles.d utmp chrony cron.reboot dmeventd-server gssproxy.pid initramfs lvm mount pluto rsyslogd.pid setroubleshoot sudo tuned xtables.lock [root@oldboy ~]# 4、touch # 创建普通文件 # 注意如果文件已经存在,只会修改文件的创建时间。不会影响文件中的内容。 5、mkdir #创建目录 make directory 递归创建mkdir -p 1/2/3 6、cat # 查看文件的内容 猫 语法结构: cat 文件名 cat /etc/hosts # 查看带路径的文件内容 cat 文件1 文件2 # 查看多个文件内容 参数选项: cat -n /etc/hosts # 显示文件的行号 7、tree #树状结构显示目录 [root@oldboy ~]# tree . ├── 1.txt ├── 2025 │ └── 1 │ └── 2 ├── anaconda-ks.cfg └── initial-setup-ks.cfg 3 directories, 3 files 8、cp # 复制文件 语法结构: cp 复制谁 复制到哪里 cp 1.txt /opt/ cp 1.txt 2.txt /opt # 复制多个文件 cp 1.txt a.txt # 复制后改名 cp 目录 复制到哪里 # 复制目录 [root@oldboy ~]# cp 1.txt 1.txt.back 注意:复制文件后重新命名,命名规范最好是.back结尾 [root@oldboy opt]# cp /root/zwx.txt . [root@oldboy opt]# ll 总用量 4 -rw-r--r-- 1 root root 0 3月 1 07:15 ho -rw-r--r-- 1 root root 158 3月 1 01:33 hosts -rw-r--r-- 1 root root 0 3月 1 07:26 zwx.txt [root@oldboy opt]# cp /root/zwx.txt ./ cp:是否覆盖'./zwx.txt'? y 注意:./和.相同 都是当前目录 #注意:拷贝文件夹要带-r 递归,将/etc文件夹拷贝到当前目录 [root@oldboy opt]# cp -r /etc . [root@oldboy opt]# ll 总用量 16 drwxr-xr-x 121 root root 8192 3月 1 07:28 etc -rw-r--r-- 1 root root 0 3月 1 07:15 ho -rw-r--r-- 1 root root 158 3月 1 01:33 hosts -rw-r--r-- 1 root root 0 3月 1 07:26 zwx.txt #在2025/3/29复习时突然出现个问题,第二次cp同一个文件时竟然不提示覆盖,接着查询了系统alias变量,发现不止cpmvrm都没变量了 [root@oldboy ~]#alias alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' #然后就把/etc/profile重新配置了下,重新登录xshell,问题解决 [root@oldboy ~]#alias alias cp='cp -i' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' ##注意:cp时有重复文件就会提示是否覆盖,如果默认覆盖,就需要转义,使用转义\ (俗称撬棍) 取消别名 忽略系统默认给的安全参数 [root@oldboy opt]# cp -r /etc . cp:是否覆盖'./etc/skel/.bash_logout'? y cp:是否覆盖'./etc/skel/.bash_profile'? y cp:是否覆盖'./etc/skel/.bashrc'? y cp:是否覆盖'./etc/skel/.zshrc'? y cp:是否覆盖'./etc/popt.d/pesign.popt'? y cp:是否覆盖'./etc/request-key.d/id_resolver.conf'? y cp:是否覆盖'./etc/request-key.d/cifs.idmap.conf'? y cp:是否覆盖'./etc/request-key.d/cifs.spnego.conf'? y cp:是否覆盖'./etc/nginx/mime_mailcap.types'? y cp:是否覆盖'./etc/gamin/gaminrc'? ^C [root@oldboy opt]# \cp -r /etc . [root@oldboy opt]# 9、#查看目录占用总大小 [root@oldboy opt]# du -sh /etc 25M /etc 10、#mv移动 语法结构: mv 源文件 移动到哪里 mv 1.txt a.txt mv 1.txt 2.txt /opt # 移动多个文件 mv 目录 /opt/ # 移动目录 [root@oldboy ~]# \mv 1.txt /opt/ #注意:强制覆盖目标文件,跟cp用法一样,禁止移动系统目录 #移动多个目录到/root下,移动目录不用加-r [root@oldboy opt]# mv 20250304 20250305 /root [root@oldboy opt]# ll /root 总用量 20 -rw-r--r-- 1 root root 10 2月 28 03:51 11.txt drwxr-xr-x 3 root root 15 2月 28 09:58 2025 drwxr-xr-x 2 root root 6 3月 1 07:43 20250303 drwxr-xr-x 2 root root 6 3月 1 07:44 20250304 drwxr-xr-x 2 root root 6 3月 1 07:44 20250305 移动/root下2025文件夹到当前目录并隐藏 [root@oldboy opt]# mv /root/2025 .2025 查看隐藏目录 [root@oldboy opt]# ll -a 总用量 28 drwxr-xr-x 5 root root 108 3月 1 07:46 . dr-xr-xr-x. 18 root root 238 3月 1 01:32 .. drwxr-xr-x 3 root root 15 2月 28 09:58 .2025 11、查看系统的别名 [root@oldboy opt]# alias alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' 12、rm # remove 删除文件或目录 语法结构: rm [参数选项] 文件 rm 文件|目录 删除opt目录下所有的文件,*表示所有,建议进入目录,删除 [root@oldboy opt]# rm -rf * [root@oldboy opt]# ll 总用量 0 13、vim #编辑文档 语法格式: vim 文件 # 如果文件不存在则自动创建 vim /opt/1.txt # 目录必须存在 视图模式: 移动光标 Home 快速到行首 数字0 ^ End 快速到行尾 $ shift+0 10G 快速到第10行 10gg 1G 快速到第1行 1gg G 快速移动到文件的末尾 删除动作: dd 快速光标所在行 3dd 删除光标所在往下3行 dG 删除光标所在到文件的末尾 d3k 删除光标所在往上3行 D 删除光标所在到行尾 d+^ d+0 d+Home 删除光标所在到行首 ctrl+v 块模式 使用↑↓←→选择后使用x删除所选 dw 删除单词 u 恢复操作 复制粘贴 yy 复制光标所在行 3yy 复制光标往下3行 p 粘贴到光标下一行 P 粘贴到光标上一行 3p 粘贴3次 进入编辑模式: a i 在当前光标进入编辑模式 o 在当前行下一行进入编辑模式 O 在当前行的上一行进入编辑模式 C 删除光标所在到行尾并且进入编辑模式 底行模式: :set nu # 显示行号

3、面板命令快捷键

shell
ctrl+a # 快速切换光标到行首 home也行 ctrl+e # 快速切换光标到行尾 end也行 ctrl+c # 强制结束当前命令 ctrl+u # 剪切光标所在到行首 ctrl+y # 粘贴剪切的内容 ctrl+l # 清屏 ctrl+d # 退出

4、一级目录的作用:crown:

bash
bin:二进制,直接可以执行的命令 sbin:超级管理员用的命令 usr:unix system resource简称,里面存放用户相关的东西 boot:内核存放的位置,引导启动核心文件,内核,不能动 dev:硬件目录,包括cpu,硬盘,不能动 etc:系统管理所需要的配置文件 mnt:临时挂载点 proc:内存的映射目录 root:管理员的家 var:可变目录,存放经常会修改的东西,一般放各种日志。可以动 home:每一个用户都有自己的主目录,随便动 tmp:临时目录,临时存放,可以动,随便动 opt:可选目录,第三方软件包位置,随便动

5、查看网卡路径:crown:

bash
centos和kylin网卡路径相同: kylin:cat /etc/sysconfig/network-scripts/ifcfg-ens33 ubuntu:cat /etc/netplan/00-installer-config.yaml ubuntu: 1、 oldboy@oldboy1nb:~$ sudo su - # 切换到管理员 [sudo] password for oldboy: # 输入oldboy用户密码1 root@oldboy1nb:~# 2、 root@oldboy1nb:~# cat /etc/netplan/00-installer-config.yaml # 查看ubuntu网卡 # This is the network config written by 'subiquity' network: ethernets: ens33: addresses: - 10.0.0.202/24 nameservers: addresses: - 223.5.5.5 search: [] routes: - to: default via: 10.0.0.2 version: 2

5、etc 下重要配置文件:crown:

1、网卡配置文件

bash
网卡配置文件:存放的是ip地址、网关、子网掩码、Dns决定了是否可以上网连接 [root@oldboy ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet # 网卡类型 默认都是以太网 BOOTPROTO=none # 配置IP地址的方式有两种,一种是DHCP自动获取,一种是手动配置,家里上网是路由器上开启了DHCP功能,自动获取IP地址上网,企业在交换机上,服务器上不能自动获取,否则用户通过dns解析不到,所以必须配置为固定ip:none static NAME=ens33 # 网卡在系统中的名称 UUID=02fbd962-cf4c-4ad9-9f72-747495b5e068 # 硬件唯一标识 系统会给每个硬件都会分配一个身份证号删除此UUID即可。 DEVICE=ens33 # 网卡的硬件名称 ONBOOT=yes # 开机是否自动运行,必须是yes IPADDR=10.0.0.200 # IP地址 类似家庭住址。局域网内唯一。 PREFIX=24 # 子网掩码NETMASK 决定了局域网内可用的IP地址数量 GATEWAY=10.0.0.2 # 网关 去往不同网段的必经之路。 DNS1=223.5.5.5 # 域名解析服务 将域名解析成IP地址 DNS2=114.114.114.114 # 当dns1不通的适合再访问这个 第一步:优化网卡配置 [root@oldboy ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet BOOTPROTO=none NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=10.0.0.200 PREFIX=24 GATEWAY=10.0.0.2 DNS1=223.5.5.5 DNS2=114.114.114.114 第二步:配置修改完成重启生效 第一种重启方法: centos kylin系统 [root@oldboy ~]# ifdown ens33 && ifup ens33 # 先把网卡关闭再启动,&&表示前面命令执行成功才执行后面 第二种重启方法: systemctl restart network centos默认支持此方法 kylin不支持,可以安装命令让kylin支持此功能。 #安装前保证网络可以联通 [root@oldboy ~]# yum -y install network-scripts 在使用systemctl重启 [root@oldboy ~]# systemctl restart network 第三种重启方法: reboot #重启虚拟机 ubt网卡重启方法: root@oldboy:~# netplan apply root@oldboy:~# reboot

查看网卡名称,ip a 看到的是什么,网卡名就是什么

b76e49f1b45842b9a27a1de2c0de6fd3

1、 重启演示
bash
第一种重启方法: centos kylin系统 执行ifdown ens33,网卡关闭了,ip消失

268fdf4a-ecb2-481f-bb3d-019807802978

cfcea5b8-223f-4008-a549-8bb678ad56fd

bash
再执行ifup ens33,显示网卡启动成功了,ip可以看到了

96113789-a321-438f-b0de-ccf8e5b99dc3

bash
执行ifdown ens33 && ifup ens33,重启网卡成功

4a67dfd3-b9ab-451c-92ed-bcb61843a96d

bash
第二种重启方法

8f27a53e-d8b7-492c-9b8e-449f6958839a

bash
第三种重启方法,重启虚拟机

d837c21a-4977-49ba-b4f0-59847f5ace33

bash
ubuntu重启

3b331083-1100-4693-aaad-f2a6dd5cc00b

2、etc/hosts:crown:

bash
作用: 本地的域名解析 www.baidu.com---/etc/hosts-->DNS 223.5.5.5 在访问www.baidu.com解析过程中浏览器会先查找本地的/etc/hosts,如果有对应的解析则返回给浏览器,如果hosts没有才会去查询223.5.5.5服务器。 DNS劫持:如果我们修改了本地/etc/hosts文件,最后加了一条10.0.0.202 www.baidu.com的内容,那么我们在ping www.baidu.com的时候,真正访问的ip地址是10.0.0.202,这个就是DNS劫持。 [root@oldboy ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1 、如何修改 windows 系统 hosts 内容
bash
1、进入C:\Windows\System32\drivers\etc 可以看到hosts文件

1ddfd9da-8fde-4881-99ed-9f8bc5221725

bash
2、把hosts文件拖到桌面,这样文件夹里面就没有了

91d36a6c-cdb4-4478-b224-9e424111e32e

bash
3、桌面新建文本文档,双击打开,然后拖拽hosts文件到文档里面

16a8e4da-ed9f-4e06-8a4a-6c752f046b85

bash
4、编辑保存,把桌面的hosts文件拖回去

3、etc/hostname:crown:

bash
作用: 存放主机名的配置文件,主机名就是本机,ping主机名就是ping本机ip,注意如果ping出来的不是ip,需要/etc/hosts中添加主机名与ip的映射。 [root@oldboy ~]# cat /etc/hostname oldboy 修改主机名: 临时修改,重启系统失效。 企业连接的是客户的主机,临时上去操作的服务器。 第一步: 修改主机名称 [root@oldboy ~]# hostname test 第二步: 退出xshell重新连接k [root@test ~]# 注意:此方法是写到内存中,重启失效 永久生效: 临时生效+重启生效 (注意主机名称不能用_) 第一步: 修改主机名称 [root@test ~]# hostnamectl set-hostname oldboyedu [root@test ~]# cat /etc/hostname oldboyedu 第二步: 退出xshell重新连接 [root@oldboyedu ~]# 或者直接编辑配置文件修改主机名称: 必须重启系统生效(退出xshell重新不生效)

4、/etc/rc.local:crown:

bash
作用: 开机自动执行里面的命令。 第一步: vim /etc/rc.local mkdir /root/rc_test 第二步: 给rc.local可执行权限/etc/rc.local是/etc/rc.d/rc.local文件的快捷方式,编辑/etc/rc.local 实际编辑的是/etc/rc.d/rc.local #注意给源文件执行x权限 [root@oldboyeducom ~]# chmod +x /etc/rc.d/rc.local /etc/rc.d/rc.local 第三步: 重启系统测试 [root@oldboyeducom ~]# reboot 面试题: 如何开机自动执行一条命令,或者运行一个服务。 将命令写入到/etc/rc.local文件里,注意给文件执行权限
演示:

1、编辑 vim /etc/rc.local,写入 mkdir /root/rc_test

800ede32-cae1-4764-aee2-dd2a9d4ea9a7

2、chmod +x /etc/rc.d/rc.local 给执行权限

4846e26d-6669-4abf-aa29-7aff00b4044b

3、reboot 重启后查看

b305377c-8019-474d-9553-20c43adafa19

5、/etc/inittab

bash
作用: 配置开机自动运行级别的配置文件 centos7 kylin不使用此文件.直接使用命令配置启动级别 笔试题: 写出Linux操作系统的运行级别。 7个运行级别.每个运行级别的功能不同。 类似红绿灯 0 # 表示关机 1 # 表示单用户,密码忘记了可以进入此界面修改密码 2 # 表示多用户,不支持NFS网络文件系统服务 3 # 表示完全多用户 默认所在此级别 4 # 保留待开发 5 # 表示桌面模式 6 # 表示重启 init 0 # 表示关机 init 6 # 表示重启 [root@oldboy ~]# runlevel 查看所属级别 N 3 作业: 修改root的密码。

6、/etc/profile:crown:

bash
作用: 存放环境变量的配置文件 什么是环境变量,用一个固定的值,表示一堆不固定的值。 name=oldboy name称为变量名称 oldboy变量的值 变量可以让用户更好的使用操作系统。 [root@oldboy ~]# dir=/etc/sysconfig/network-scripts/ifcfg-ens33 [root@oldboy ~]# echo $dir /etc/sysconfig/network-scripts/ifcfg-ens33 [root@oldboy ~]# cat $dTYPE=Ethernet BOOTPROTO=none NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=10.0.0.200 PREFIX=24 GATEWAY=10.0.0.2 DNS1=223.5.5.5.5.5.5 注意自己定义的变量是临时变量,重新登录就没有了,如果想永久生效,那么就需要把变量定义在/etc/profile里面 vim /etc/profile # 粘贴到最后一行 dir=/etc/sysconfig/network-scripts/ifcfg-ens33 系统变量PATH的作用:执行命令的时候会自动在此变量位置中搜索命令位置 命令执行流程: 第一步: 用户输入touch命令 touch 1.txt 第二步: 系统会自动查找PATH变量中所有的路径(也就是下面echo $PATH的结果)看是否有touch命令(which touch能看到touch的路径),如果有则调用touch创建1.txt. 如果没有这个命令则系统提示command notfound [root@oldboy ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin 查看命令的绝对路径:所以,/usr/bin/touch 1.txt这个命令也是可以成功的 [root@oldboyeducom ~]# which touch /usr/bin/touch [root@oldboy ~]# lll -bash: lll: command not found 输入lll的命令他会去$PATH里面去找lll的命令,找不到返回command not found 演示PATH作用: 1、将/usr/bin/touch移动到opt目录下 [root@oldboy ~]# mv /usr/bin/touch /opt #如果忘记touch变量位置,那么可以用下面命令查找 [root@oldboy ~]#find / -type f -name "touch" /opt/touch [root@oldboy ~]# ll /opt total 96 -rwxr-xr-x 1 root root 96512 Apr 21 2022 touch 2、执行创建文件,找不到这个命令,因为PATH变量里面的路径没有touch命令 [root@oldboy ~]# touch 2.txt -bash: touch: command not found 3、将opt目录添加到PATH变量里面 [root@oldboy ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin [root@oldboy ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/opt [root@oldboy ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/opt 4、再次创建,成功 [root@oldboy ~]# touch 2.txt [root@oldboy ~]# ll total 16 -rw-r--r-- 1 root root 22 Mar 5 15:31 1.bak -rw-r--r-- 1 root root 0 Mar 5 16:28 1.txt这个命令也是可以成功的 drwxr-xr-x 2 root root 6 Mar 5 15:51 2025fff -rw-r--r-- 1 root root 0 Mar 5 16:37 2.txt -rw-r--r-- 1 root root 356 Mar 1 11:34 config_eth0 -rw-r--r-- 1 root root 158 Mar 1 11:32 hosts -rw-r--r-- 1 root root 1809 Mar 1 11:32 passwd 3.1、也可以用opt/touch执行,成功 [root@oldboy ~]# /opt/touch 3.txt [root@oldboy ~]# ll total 16 -rw-r--r-- 1 root root 22 Mar 5 15:31 1.bak -rw-r--r-- 1 root root 0 Mar 5 16:28 1.txt这个命令也是可以成功的 drwxr-xr-x 2 root root 6 Mar 5 15:51 2025fff -rw-r--r-- 1 root root 0 Mar 5 16:37 2.txt -rw-r--r-- 1 root root 0 Mar 5 16:40 3.txt -rw-r--r-- 1 root root 356 Mar 1 11:34 config_eth0 -rw-r--r-- 1 root root 158 Mar 1 11:32 hosts -rw-r--r-- 1 root root 1809 Mar 1 11:32 passwd 注意练习完成后移动回/usr/bin目录 [root@oldboyeducom ~]# mv /opt/touch /usr/bin/ [root@oldboyeducom ~]# which touch /usr/bin/touch

7、/etc/fstab:crown:

bash
作用: 开机自动挂载的配置文件 #光驱插入到或者u盘插入linux系统无法使用,必须给它设置一个入口才可以 第一步:将iso镜像放入到cdrom光驱中,装系统已经放进去了 第二步: 在linux系统重查看光驱 [root@oldboy ~]# ll /dev/cdrom lrwxrwxrwx 1 root root 3 Mar 5 15:51 /dev/cdrom -> sr0 看一下源文件 [root@oldboy ~]# ll /dev/sr0 brw-rw---- 1 root cdrom 11, 0 Mar 5 15:51 /dev/sr0 第三步: 挂载光驱,给光驱提供一个入口目录,临时挂载到mnt目录 [root@oldboy ~]# mount /dev/cdrom /mnt mount: /mnt: WARNING: source write-protected, mounted read-only. 就可以看到光驱里面的文件了 [root@oldboy ~]# ll /mnt total 544 dr-xr-xr-x 3 root root 2048 Mar 15 2023 EFI dr-xr-xr-x 3 root root 2048 Mar 15 2023 images dr-xr-xr-x 2 root root 2048 Mar 15 2023 isolinux dr-xr-xr-x 5 root root 2048 Mar 24 2023 kylin-sm-package -r--r--r-- 1 root root 441 Mar 31 2023 LICENSE dr-xr-xr-x 2 root root 2048 Mar 15 2023 manual dr-xr-xr-x 2 root root 538624 Mar 24 2023 Packages dr-xr-xr-x 2 root root 4096 Mar 24 2023 repodata -r--r--r-- 1 root root 2883 Mar 31 2023 TRANS.TBL mnt可以进入,但是是只读的,不能新建,不能删除 [root@oldboy mnt]# touch 1.txt touch: cannot touch '1.txt': Read-only file system 第四步:查看是否挂载成功

89c966b4-c088-40d9-8c06-bf8541a8f833

bash
第五步:卸载光驱的入口,显示成功,卸载光驱要退出mnt目录再执行卸载命令

1c559599-3046-4afb-9414-f29e0db3ce5a

bash
mount命令是临时挂载,重启系统失效。 使用开机自动挂载光驱,将挂载数据写入到fstab cat /etc/fstab /dev/cdrom /mnt iso9660 defaults 0 0 /dev/cdrom 第一列: 文件系统的名称 /mnt 第二列: 挂载点,入口的目录 ios9660 第三列:文件系统类型 default 第四列:挂载的参数,默认即可 0 第五列:是否备份,1为备份 0 第六列:是否开机自检,1为自检 #查看光驱类型 [root@xxx ~]#blkid /dev/mapper/klas-root: UUID="89f0feb8-1d19-432d-aa45-a7d3e4ca3fbc" BLOCK_SIZE="512" TYPE="xfs" /dev/sda2: UUID="E7DWIB-JSAH-0Oy4-Q3uU-OVqD-s8fO-PczyUU" TYPE="LVM2_member" PARTUUID="954862ae-02" /dev/mapper/klas-swap: UUID="57080d5e-202a-4c2a-8b41-a6f281186fc5" TYPE="swap" /dev/sdb: UUID="7352f91e-6e61-4d5b-b6c1-5be538c78fec" BLOCK_SIZE="512" TYPE="xfs" /dev/sr0: BLOCK_SIZE="2048" UUID="2023-03-31-21-06-57-00" LABEL="Kylin-Server-10" TYPE="iso9660" /dev/sdc: UUID="69dfcab4-a582-4d31-ab32-4142a81cc04a" BLOCK_SIZE="512" TYPE="xfs" /dev/sda1: UUID="1d887d78-ffde-4069-ba3e-146fdd561a6c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="954862ae-01" #卸载注意事项 1.出门在卸载 [root@oldboyeducom ~]# cd /mnt/ [root@oldboyeducom mnt]# umount /mnt umount: /mnt: target is busy. # 目标在忙,需 要退出/mnt卸载 /etc/motd 总结/etc重要系统配置文件 2.出门了还是无法卸载使用强制卸载 [root@oldboyeducom ~]# umount -f /mnt 3.无法挂载,查看光驱中是否有iso镜像,是否是已连接状态

8、/etc/motd

bash
作用:开机自动显示此文件里的内容 vim /etc/motd 写入内容

9、总结/etc 重要系统配置文件

bash
重点总结: 1、/etc/sysconfig/network-scripts/ifcfg-ens33 网卡每行的含义,删除无用的行 重启网卡服务 #安装 yum -y install network-scripts systemctl restart network ifdown ens33 && ifup ens33 2、/etc/hostname 临时: hostname 主机名称 永久: hostnamectl set-hostname 主机名称,设置完不需要reboot重启系统,退出xshell重新连接即可。 3、/etc/rc.local 开机系统自动读取此文件执行里面的命令 第一步: vim /etc/rc.local 写入开机自动要运行的命令 touch /root/local.txt 第二步: 给源文件执行权限 chmod +x /etc/rc.d/rc.local # 只需要执行1次即可。 第三步: 重启系统测试 面试: 如何让一个命令开机自动执行 将命令写入/etc/rc.local 然后给源文件执行权限 4、/etc/inittab 面试题: linux的7种运行级别 0 关机 1 单用户 可以找回修改密码 2 多用户,不支持服务 NFS 3 完全多用户 默认所在级别 4 保留待开发 5 桌面模式 6 重启 5./etc/profile 永久存放环境变量配置文件 name=oldboy # 重新连接xshell失效 每次连接让name变量生效,需要写入/etc/profile vim /etc/profile name=oldboy 系统变量PATH变量,存放系统命令的路径 [root@oldboyeducom ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin 知识点1.命令的执行流程 第一步: 输入命令touch 第二步: 系统会自动在PATH变量中所有的路径搜索是否存在touch 第三步: 搜索到则执行,搜索不到提示command not found 知识点2.PATH变量可以定义 可以让自己安装的命令的路径重新定义给PATH 软件的命令路径/opt/下--->加入到PATH变量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/opt/ 知识点3.命令都可以直接使用绝对路径执行 [root@oldboyeducom ~]# which mkdir /usr/bin/mkdir [root@oldboyeducom ~]# /usr/bin/mkdir aaa [root@oldboyeducom ~]# ll drwxr-xr-x 2 root root 6 Mar 5 11:49 aaa 6./etc/fstab 作用: 开机自动挂载的配置文件 知识点1: 笔试题 /dev/cdrom /mnt iso9660 defaults 0 0 第一列: 设备名称 第二列: 挂载点,硬件的入口目录 第三列: 文件类型 第四列: 挂载的参数 使用默认即可 第五列: 开机是否备份 0不备份 1备份 第六列: 开机是否自检 0不自检 1自检 知识点2:挂载cdrom 第一步: 镜像插入cdrom 第二步: ll /dev/cdrom 第三步: 挂载 mount /dev/cdrom /mnt 第四步: 检查 df -h 卸载硬件 [root@oldboyeducom ~]# umount /mnt [root@oldboyeducom ~]# umount -f /mnt # 强制卸载 7./etc/motd # 了解 将连接后显示的内容写入此文件。

10、/etc/ resolv.conf:crown:

bash
#作用:存放DNS的配置文件,定义去找哪个DNS服务器来解析,比如修改/etc/resolv.conf的DNS服务器为114.114.114.114,虽然配置的网关服务 #器是223.5.5.5,执行nslookup www.baidu.com,显示的DNS服务器是114.114.114.114,但是重启后修正为223.5.5.5 1、刚开始装系统配置的网关是223.5.5.5,所以/etc/resolv.conf也是223.5.5.5 2、网卡中的DNS会覆盖resolv.conf,如果修改网关的DNS为114.114.114.114,那么/etc/resolv.conf也会变成114.114.114.114 3、如果网卡中不配置DNS,则resolv.conf为空,手动配置resolv.conf 则不会被网卡的配置覆盖。 4、修改resolv.conf 不需要重启任何服务 直接生效 5、网卡和resolv.conf中可以配置多个DNS

73f12e56-f305-45aa-8932-7c91d41ba5c6

11、/etc/issue

bash
1、/etc/issue 2、/etc/issue.net 3、/etc/motd #开机显示以上三个文件中的内容,清空文件内容 开启web控制台:可以登录web页面 root@oldboy ~]# systemctl enable --now cockpit.socket Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket. [root@oldboy ~]# netstat -tnulp 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 1108/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1108/sshd: /usr/sbi tcp6 0 0 :::9090 :::* LISTEN 1/systemd udp 0 0 127.0.0.1:323 0.0.0.0:* 754/chronyd udp6 0 0 ::1:323 :::* 754/chronyd

244d047d-6c06-4e14-8f31-3a42edd57a50

bash
关闭web页面:9090端口就没了 [root@oldboy ~]# systemctl disable --now cockpit.socket Removed /etc/systemd/system/sockets.target.wants/cockpit.socket. [root@oldboy ~]# netstat -tnulp 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 1108/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1108/sshd: /usr/sbi udp 0 0 127.0.0.1:323 0.0.0.0:* 754/chronyd udp6 0 0 ::1:323

12、/etc/os-release:crown:

bash
作用: 操作系统版本 [root@oldboy ~]# cat /etc/os-release(记这个) #操作系统名称 NAME="Kylin Linux Advanced Server" #版本 VERSION="V10 (Lance)" ID="kylin" VERSION_ID="V10" PRETTY_NAME="Kylin Linux Advanced Server V10 (Lance)" ANSI_COLOR="0;31" #查看系统版本 [root@oldboy ~]# uname -a 内核 Linux oldboy 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64 x86_64 x86_64 GNU/Linux #查看内核版本号 [root@oldboy ~]# uname -r 4.19.90-52.22.v2207.ky10.x86_64 #查看系统版本 [root@oldboy ~]# hostnamectl Static hostname: oldboy Icon name: computer-vm Chassis: vm Machine ID: 8341eff4f7464552aaa35ed6abfd6493 Boot ID: 7318786921784efdb1ff3f75251c7442 Virtualization: vmware Operating System: Kylin Linux Advanced Server V10 (Lance) Kernel: Linux 4.19.90-52.22.v2207.ky10.x86_64 Architecture: x86-64

6、proc 下配置文件:crown:

1、/proc/cpuinfo

bash
作用: 查看cpu的信息 查看CPU信息的命令: lscpu [root@oldboy ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 45 bits physical, 48 bits virtual CPU(s): 4 #cpu核心数 On-line CPU(s) list: 0-3 #cpu核心列表 Thread(s) per core: 1 Core(s) per socket: 2 Socket(s): 2 #一共几个cpu

2、/proc/meminfo

bash
MemTotal: 2003132 kB #内存总大小 MemFree: 1588496 kB #空闲内存 MemAvailable: 1623744 kB #可用内存 Buffers: 2724 kB #缓冲区(写缓冲) Cached: 156540 kB #缓存区(读缓存) cpu-->内存-->磁盘 数据要写到磁盘,程序要在内存允许 如果有大量数据,如果从cpu直接写到磁盘,那磁盘跟不上cpu的速度,会一直占用cpu,因为cpu的速度想当与火箭,而磁盘相当于自行车,cpu会一直 等着磁盘写完,所以先写到内存,然后由内存再写到磁盘,这是缓冲区。缓存区是从磁盘放入内存,然后读内存的内容,这是缓存区 使用命令查看内存: free [root@oldboy ~]# free -h 总大小 使用 空闲 共享内存 缓冲/缓存 可用内存 total used free shared buff/cache available Mem: 1.9Gi 219Mi 1.4Gi 8.0Mi 259Mi 1.5Gi Swap: 2.0Gi 0B 2.0Gi swap分区:磁盘分区的时候,用磁盘的空间充当2G的内存使用。 linux系统运行概念:当前系统内存不够用时,跑满了,系统为了让系统正常的运行会自动杀死占用最高内存的进程。swap分区当内存不够的时候,临时充当内存使用,为了不让系统杀死进程。但是速度会下降。 在企业中能加内存不能用swap。学习过程中,企业测试环境中,没有办法直接添加内存情况下必须保证系统正常运行。 swap分区 分内存的1-1.5倍 如果内存大于8G,则swap最高给8G即可。 为什么上面空闲内存1.4g,而可用内存为1.5g,因为内存具有欺骗行为 欺骗行为一:如果电脑内存有50g,分给虚拟机内存2g,但是虚拟机内存只用了500m,抛去其他占用情况,那么电脑内存50g-500m=49.5g

2af13c63-9814-494a-bf91-1849eab4e1cc

bash
欺骗行为二:共享内存,调用了两个服务,虽然都调用了lib库,但是lib库只运行了一次,所以只算一次的内存

3、/proc/loadavg:crown:

bash
作用: 查看系统负载信息 查看系统负载: /proc/loadavg、uptime、w [root@oldboy ~]# cat /proc/loadavg 0.00 0.00 0.00 1/190 1743 1分钟 5分钟 15分钟系统平均负载 什么是系统负载: 系统负载系统的繁忙程度 如果CPU核心数量: 4 平均负载达到4则说明非常繁忙。 [root@oldboy ~]# uptime 当前时间 运行了多久 当前登录用户数 平均负载1分钟 5分钟 15分钟平均负载 17:11:23 up 1:11, 1 user, load average: 0.00, 0.00, 0.00 [root@oldboy ~]# w 17:15:06 up 1:15, 2 users, load average: 0.05, 0.01, 0.00 USER TTY LOGIN@ IDLE JCPU PCPU WHAT root pts/0 15:59 1.00s 0.04s 0.00s w root pts/1 17:12 2:58 0.04s 0.04s -bash 面试题: 说一下负载的三个值的含义。 1分 5分钟 15分钟的一个平均负载

4、/proc/mounts

bash
作用: 查看挂载信息

5、查看磁盘信息:crown:

bash
[root@oldboy ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 8.9M 970M 1% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.8G 44G 8% / tmpfs 979M 0 979M 0% /tmp /dev/sr0 4.3G 4.3G 0 100% /mnt /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 Filesystem: 文件系统 硬件名称 Size: 大小 Used: 使用大小 笔记本100G 虚拟机分区50G实际笔记 本可用: 100-3.8G=96.2G Avail: 可用大小 Use%: 磁盘使用百分比 使用的/总X100 Mounted on: 挂载点、入口 Linux系统中sda 开头表示第一块磁盘 sdb表示第二块磁盘 面试题: 1.查看内存 free -h 2.查看负载 后面三个值的含义 /proc/loadavg、uptime、w 3.查看磁盘 df -h

7、整理到现在学的 linux 命令

bash
1、shutdow 关机、重启 2、reboot 重启 3、init 0表示关机、6表示重启 4、man 5、pwd 6、cd 7、ls 8、touch 9、mkdir 10、tree 11、cat 12、vim 13、cp 14、mv 15、rm 16、history 17、which 18、lscpu 19、free 20、df 21、w 22、hostnamectl 23、hostname 24、uptime 25、mount 26、umount 27、date 28、ifdown 29、ifup 30、systemctl restart network 31、nslookup 32、ping 33、ip a 34、route -n 35、exit 36、uname 37、blkid 38、du
bash
#查看每个硬件的UUID和类型 [root@oldboy ~]# blkid /dev/mapper/klas-swap: UUID="57080d5e-202a-4c2a-8b41-a6f281186fc5" TYPE="swap" /dev/sr0: BLOCK_SIZE="2048" UUID="2023-03-31-21-06-57-00" LABEL="Kylin-Server-10" TYPE="iso9660" /dev/mapper/klas-root: UUID="89f0feb8-1d19-432d-aa45-a7d3e4ca3fbc" BLOCK_SIZE="512" TYPE="xfs" /dev/sda2: UUID="E7DWIB-JSAH-0Oy4-Q3uU-OVqD-s8fO-PczyUU" TYPE="LVM2_member" PARTUUID="954862ae-02" /dev/sda1: UUID="1d887d78-ffde-4069-ba3e-146fdd561a6c" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="954862ae-01" [root@oldboy ~]#

8、var 下重要配置文件:crown:

1、/var/log/messages

bash
作用: 系统日志 tail # 显示文件末尾10行 参数选项: -n 显示n行 n为参数 -n5 -n n可以直接写成数字 -5 -f 实时显示文件最新内容 案例1.查看文件末尾10行 [root@oldboy ~]# tail -n 10 /var/log/messages Mar 6 17:38:59 oldboy systemd[1]: kylin-kms-activation.service: Service RestartSec=30s expired, scheduling restart. Mar 6 17:38:59 oldboy systemd[1]: kylin-kms-activation.service: Scheduled restart job, restart counter is at 66. Mar 6 17:38:59 oldboy systemd[1]: Stopped run kylin_kms_daemon at boot time. Mar 6 17:38:59 oldboy systemd[1]: Started run kylin_kms_daemon at boot time. Mar 6 17:39:59 oldboy systemd[1]: kylin-kms-activation.service: Main process exited, code=exited, status=255/EXCEPTION Mar 6 17:39:59 oldboy systemd[1]: kylin-kms-activation.service: Failed with result 'exit-code'. Mar 6 17:40:29 oldboy systemd[1]: kylin-kms-activation.service: Service RestartSec=30s expired, scheduling restart. Mar 6 17:40:29 oldboy systemd[1]: kylin-kms-activation.service: Scheduled restart job, restart counter is at 67. Mar 6 17:40:29 oldboy systemd[1]: Stopped run kylin_kms_daemon at boot time. Mar 6 17:40:29 oldboy systemd[1]: Started run kylin_kms_daemon at boot time. 案例2.查看文件末尾5行 [root@oldboy ~]# tail -5 /var/log/messages Mar 6 17:41:29 oldboy systemd[1]: kylin-kms-activation.service: Failed with result 'exit-code'. Mar 6 17:41:59 oldboy systemd[1]: kylin-kms-activation.service: Service RestartSec=30s expired, scheduling restart. Mar 6 17:41:59 oldboy systemd[1]: kylin-kms-activation.service: Scheduled restart job, restart counter is at 68. Mar 6 17:41:59 oldboy systemd[1]: Stopped run kylin_kms_daemon at boot time. Mar 6 17:41:59 oldboy systemd[1]: Started run kylin_kms_daemon at boot time. head # 显示头部10行 语法格式: head /etc/passwd 参数选项: -n # -n 3 显示前3行 -3 # 显示前3行 案例1.显示passwd前10行 [root@oldboy ~]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin 案例2.head显示ip a输出结果的前2行 [root@oldboy ~]# ip a|head -2 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 案例3.显示查看hosts内容的最后1行 [root@oldboy ~]# cat /etc/hosts |tail -1 10.0.0.200 oldboy 案例4.显示文件中的第10-15行 [root@oldboy ~]# cat -n /etc/passwd |head -15|tail -6 10 operator:x:11:0:operator:/root:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin 14 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin 15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

2、/var/log/secure

bash
作用: 记录系统登录退出日志 案例1.查看最新的日志 [root@oldboy ~]# tail -f /var/log/secure
bash
1.查看内存 free -h 2.查看磁盘 df -h 3.查看负载 负载三个值的含义 4.查看系统版本号 5./var/log/messages 6./var/log/secure 7.head 8.tail

9、vim 故障

bash
1、vim编辑过程中,目录必须存在 2、vim直接回车是查看vim本身的版本信息 直接退出即可 3、vim编辑文件时提示找到了一个swap件 注意:出来显示中文,将字体改为英文 编辑/etc/profile 粘贴到最后一行 vim /etc/profile export LANG=en_US.UTF-8 重新退出重新连接,输入lll回车是否是英文提示。 vim 1.txt 问题: vim编辑文件过程中如果没有正常退出,则会在当前位置产生一个隐藏的交换文件.1.txt.swp,保存着我们修改后的内容。 解决方法1.想要修改后的内容 第一步: 使用vim -r 1.txt 第二步: 保存并退出文件 第三步: 删除隐藏文件 rm -f .1.txt.swp,如果不删除隐藏文件,那么vim文件时会一直提示swap文件 解决方法2.不想要修改后的内容 第一步: 使用 rm -f .1.txt.swp,如果不删除隐藏文件,那么vim文件时会一直提示swap文件 第二步: 正常编辑1.txt恢复正常 什么原因导致出现.swp文件 1.没有保存文件,直接关闭了xshell 2.多个窗口同时打开了一个文件有提示。 [root@oldboy ~]# w 15:30:05 up 6:17, 2 users, load average: 0.00, 0.00, 0.00 USER TTY LOGIN@ IDLE JCPU PCPU WHAT root pts/0 15:20 29.00s 0.07s 0.01s vim 1.bak root pts/1 15:29 5.00s 0.02s 0.00s w 使用w命令可以看到有多个窗口 3.同事同时编辑一个文件。 4.服务器断电。

10、Linux 系统优化:crown:

1、YUM 仓库优化

bash
YUM仓库是什么? 通过yum仓库下载安装软件,类似手机的应用商店。 类似windows下载软件网站。华军软件园 centos系统默认的仓库地址是在国外,通过国外网站下载速度肯定很慢,所以需要将仓库地址修改为国内的仓库。 国内YUM仓库: 1.阿里源 https://developer.aliyun.com/mirror/ 2.清华源 https://mirrors.tuna.tsinghua.edu.cn/ 3.重庆大学源 4.华为源 5.腾讯源 扩展的仓库地址epel: 经常使用的软件在基础仓库中没有,所以安装一个扩展的仓库。 查看仓库信息 [root@oldboy ~]# yum repolist repo id repo name ks10-adv-os Kylin Linux Advanced Server 10 - Os ks10-adv-updates Kylin Linux Advanced Server 10 - Updates 1.查看默认的仓库地址 [root@oldboy ~]# ll /etc/yum.repos.d/ # yum仓库的配置文件 total 4 -rw-r--r-- 1 root root 701 Sep 8 2022 kylin_x86_64.repo 2.查看yum仓库的配置文件 [root@oldboy ~]# cat /etc/yum.repos.d/kylin_x86_64.repo ###Kylin Linux Advanced Server 10 - os repo### [ks10-adv-os] name = Kylin Linux Advanced Server 10 - Os baseurl = https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/$basearch/ gpgcheck = 1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin enabled = 1 [ks10-adv-updates] name = Kylin Linux Advanced Server 10 - Updates baseurl = https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/updates/$basearch/ #仓库地址update.cs2c.com.cn gpgcheck = 1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin enabled = 1 [ks10-adv-addons] name = Kylin Linux Advanced Server 10 - Addons baseurl = https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/addons/$basearch/ gpgcheck = 1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin enabled = 0 判断IP地址的归属。 1、ping#仓库地址update.cs2c.com.cn [root@oldboy ~]# ping update.cs2c.com.cn PING aitqzjav.slt.sched.tdnsv8.com (120.222.152.206) 56(84) bytes of data. 64 bytes from 120.222.152.206 (120.222.152.206): icmp_seq=1 ttl=128 time=16.2 ms 64 bytes from 120.222.152.206 (120.222.152.206): icmp_seq=2 ttl=128 time=16.9 ms 64 bytes from 120.222.152.206 (120.222.152.206): icmp_seq=3 ttl=128 time=21.6 ms 2、拿到仓库域名对应的IP地址120.222.152.206浏览器打开ip138.com

03ff21e7-9889-4a07-a1b0-5d64678044e8

bash
如果是国内的地址就不用改 2、kylin系统可以安装扩展的仓库epel,需要先备份其他epel源,经过查看,/etc/yum.repos.d目录下没有epel源

ac297923-ce7d-4d46-b707-ae4f647a5dce

b3361dcb-27b3-4346-b606-abe84e104a07

bash
#安装,将https://mirrors.aliyun.com/repo/epel-7.repo保存到/etc/yum.repos.d目录下,名字叫epel.repo [root@oldboy ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo --2025-03-07 01:32:42-- https://mirrors.aliyun.com/repo/epel-7.repo Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 36.144.23.233, 36.144.23.232, 36.144.23.227, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|36.144.23.233|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 664 [application/octet-stream] Saving to: ‘/etc/yum.repos.d/epel.repo’ /etc/yum.repos.d/epel.repo 100%[===========================================================================================>] 664 --.-KB/s in 0s 2025-03-07 01:32:42 (7.71 MB/s) - ‘/etc/yum.repos.d/epel.repo’ saved [664/664]

e613dca9-fb9a-4a63-b5c9-5169a03c4eec

bash
经过查看/etc/yum.repos.d目录下已经有了epel源,注意点,我们要扩展仓库,必须放到yum.repos.d目录下才会生效 [root@oldboy ~]# cat /etc/yum.repos.d/epel.repo [epel] name=Extra Packages for Enterprise Linux 7 - $basearch baseurl=http://mirrors.aliyun.com/epel/7/$basearch failovermethod=priority enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 [epel-debuginfo] name=Extra Packages for Enterprise Linux 7 - $basearch - Debug baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug #已经变成阿里云了 failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=0 [epel-source] name=Extra Packages for Enterprise Linux 7 - $basearch - Source baseurl=http://mirrors.aliyun.com/epel/7/SRPMS failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=0 再次查看仓库信息 [root@oldboy ~]# yum repolist repo id repo name epel Extra Packages for Enterprise Linux 7 - x86_64 ks10-adv-os Kylin Linux Advanced Server 10 - Os ks10-adv-updates Kylin Linux Advanced Server 10 - Updates #sl命令只能通过扩展仓库才可以安装。 [root@oldboy ~]# yum -y install sl

79fc8063-4f37-46f4-9f18-66feaefee79e

bash
ubuntu系统修改YUM仓库: 第一步: 切换到root用户 oldboy@oldboy:~$ sudo su - root [sudo] password for oldboy: # 输入密码 1 查看yum仓库的配置文件 root@oldboy1nb:~# cat /etc/apt/sources.list # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://archive.ubuntu.com/ubuntu/ jammy main restricted # deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted 判断IP地址的归属。 ping#仓库地址archive.ubuntu.com root@oldboy1nb:~# ping archive.ubuntu.com PING archive.ubuntu.com (185.125.190.81) 56(84) bytes of data. 64 bytes from ubuntu-mirror-1.ps5.canonical.com (185.125.190.81): icmp_seq=1 ttl=128 time=302 ms 64 bytes from ubuntu-mirror-1.ps5.canonical.com (185.125.190.81): icmp_seq=2 ttl=128 time=301 ms 64 bytes from ubuntu-mirror-1.ps5.canonical.com (185.125.190.81): icmp_seq=3 ttl=128 time=301 ms 拿到仓库域名对应ip185.125.190.82.206浏览器打开ip138.com,显示在英国

81738472-54e0-47e8-9de8-7d3f57bbd43f

bash
第二步: 备份默认的仓库配置 root@oldboy:~# cp /etc/apt/sources.list /tmp/ 第三步: 编辑配置文件vim /etc/apt/sources.list dG全删除 # 删除所有内容 后 粘贴一下内容 (注意进入编辑模式后粘贴) 第四步: 执行更新命令 root@oldboy1nb:~# apt update # 查看当前系统默认的YUM仓库 root@oldboy1nb:~# apt-cache policy Package files: 100 /var/lib/dpkg/status release a=now 100 https://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 Packages release v=20.04,o=Ubuntu,a=focal-backports,n=focal,l=Ubuntu,c=universe,b=amd64 origin mirrors.aliyun.com 100 https://mirrors.aliyun.com/ubuntu focal-backports/main amd64 Packages release v=20.04,o=Ubuntu,a=focal-backports,n=focal,l=Ubuntu,c=main,b=amd6

2、防火墙优化

bash
1.centos系统和kylin系统防火墙的名称相同 firewalld 2.ubt系统防火墙名称 ufw 关闭防火墙: 步骤1: 系统退出防火墙 [root@oldboy ~]# systemctl stop firewalld 查看防火墙状态是否关闭 [root@oldboy ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled(开机自动启动); vendor preset: enabled) Active: inactive (dead) since Thu 2025-02-27 21:17:07 CST; 1min 40s ago Docs: man:firewalld(1) Process: 840 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS) Main PID: 840 (code=exited, status=0/SUCCESS) 2月 27 16:44:11 oldboy systemd[1]: Starting firewalld - dynamic firewall daemon... 2月 27 16:44:18 oldboy systemd[1]: Started firewalld - dynamic firewall daemon. 2月 27 21:17:07 oldboy systemd[1]: Stopping firewalld - dynamic firewall daemon... 2月 27 21:17:07 oldboy systemd[1]: firewalld.service: Succeeded. 2月 27 21:17:07 oldboy systemd[1]: Stopped firewalld - dynamic firewall daemon. 步骤2: 开机禁止启动防火墙 [root@oldboy ~]# systemctl disable firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 查看防火墙状态: [root@oldboy ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled(开机禁止启动); vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) 2月 27 16:44:11 oldboy systemd[1]: Starting firewalld - dynamic firewall daemon... 2月 27 16:44:18 oldboy systemd[1]: Started firewalld - dynamic firewall daemon. 2月 27 21:17:07 oldboy systemd[1]: Stopping firewalld - dynamic firewall daemon... 2月 27 21:17:07 oldboy systemd[1]: firewalld.service: Succeeded. 2月 27 21:17:07 oldboy systemd[1]: Stopped firewalld - dynamic firewall daemon. systemctl 动作 服务名称 动作: start 启动 stop 停止 restart 重启 reload 重新加载 enabled 开机自动运行 disable 开机禁止启动 status 查看服务状态 ubt系统关闭防火墙: 1.退出防火墙 root@oldboy1nb:~# systemctl stop ufw 2.禁止开机自动启动 root@oldboy:~# systemctl disable ufw #什么是防火墙? 过滤网络流量。限制、允许流量。防火墙一般放在网络的最前端,防止别人攻击,比如说路由器的前面放一个,你想访问网站,必须先经过防火墙才行,开启防火墙后上网慢。 什么情况下开启防火墙? 服务器有公网的情况下开启防火墙。网站业务 游戏业务 APP业务。 什么情况下关闭防火墙? 服务器没有公网情况下关闭防火墙。测试服务器 虚拟机,公司内部服务器 业务流量大的情况下需要关闭firewalld。用户数量过载。开启硬件防火墙。

3、字符集优化

bash
字符集: 不同国家的文字在系统中表现方式 UTF-8: 万国码,哪个国家的都支持 GBK: 国标 查看字符集配置文件:kylin系统默认的是中文。因为装系统的时候是把字符集改成英文的变量存到了/etc/process里面,所以没读取配置文件,把/etc/process的变量删除,就会读取配置文件,就会显示中文。怎么确定显示中文,输入命令报错显示 [root@oldboy ~]# cat /etc/locale.conf LANG="zh_CN.UTF-8" 1.查看默认的字符集 root@oldboy1nb:~# echo $LANG zh_CN.UTF-8 2.修改字符集 临时修改,重启系统失效 [root@oldboy ~]# LANG=en_US.UTF-8 [root@oldboy ~]# echo $LANG en_US.UTF-8 3.永久修改 方法1: 1、修改配置文件 [root@oldboy ~]# vim /etc/locale.conf LANG="en_US.UTF-8" 2、让配置文件生效有两种方法 一是: 重新连接xshell生效 二是: 使用source 文件名称让变量直接生效 [root@oldboy ~]# source /etc/locale.conf [root@oldboy ~]# echo $LANG en_US.UTF-8 方法2:使用命令设置语言(笔记) [root@oldboy ~]# localectl set-locale LANG=en_US.UTF-8 [root@oldboy ~]# cat /etc/locale.conf LANG="en_US.UTF-8" ubt: 修改语言 #配置文件/etc/default/locale root@oldboy1nb:~# cat /etc/default/locale LANG=en_US.UTF-8 root@oldboy1nb:~# source /etc/default/locale

4、时间同步

bash
企业服务器必须保证时间正确的,如果不正确导致业务出现问题。 系统有两种时间,一种是硬件时间,一种是系统时间。 硬件时间:服务器的硬件,比如bios,如果笔记本不装系统,开机也能看到配置界面,上面有时间。 系统时间:linux时间,windows时间 1.查看系统时间 [root@oldboy ~]# date 2025年 02月 27日 星期四 22:24:26 CST #按照以下格式输出 [root@oldboy ~]# date +%F-%H-%M-%S 2025-02-27-22-27-10 2.修改系统时间 [root@oldboy ~]# date -s 20250307 2025年 03月 07日 星期五 00:00:00 CST 3.系统时间同步 #安装命令ntpdate [root@oldboy ~]# yum -y install ntpdate [root@oldboy ~]# ntpdate ntp1.aliyun.com 7 Mar 17:57:55 ntpdate[5842]: step time server 121.199.69.55 offset +64584.344553 sec [root@oldboy ~]# date 2025年 03月 07日 星期五 17:58:34 CST 如果当前系统时间不正确,不让我们下载安装软件,需要手动配置大概的正确时间。 [root@oldboy ~]# date -s "20250307 11:37:00" #注意硬件时间必须和系统时间保持一致 [root@oldboy ~]# clock 硬件时间 2025-03-07 18:09:32.146448+08:00 [root@oldboy ~]# date 2025年 03月 07日 星期五 18:09:34 CST #将系统时间同步给硬件时间 [root@oldboy ~]# hwclock -w [root@oldboy ~]# date 2025年 03月 07日 星期五 18:12:07 CST [root@oldboy ~]# clock 2025-03-07 18:12:12.772055+08:00 Ubt: 修改时区 root@oldboy1nb:~# timedatectl set-timezone Asia/Shanghai root@oldboy1nb:~# date Fri Mar 7 06:06:45 PM CST 2025 时区的配置文件位置: root@oldboy:~# cat /etc/timezone Asia/Shanghubt 系统查看硬件时间 timedatectlai 安装timedatectlai命令 root@oldboy1nb:~# apt -y install timedatectl root@oldboy1nb:~# timedatectl Local time: Fri 2025-03-07 18:15:51 CST Universal time: Fri 2025-03-07 10:15:51 UTC RTC time: Fri 2025-03-07 10:15:51 # RTC time就是硬件时间 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no

5、卸载/tmp

bash
分配2g内存,会默认给tmp分配1g内存,造成内存的浪费 https://kb.kylinos.cn/view/faq/9733 1、umount /tmp 2、systemctl mask tmp.mount [root@oldboy ~]#systemctl mask tmp.mount Unit tmp.moun.service does not exist, proceeding anyway. Created symlink /etc/systemd/system/tmp.moun.service → /dev/null.

img

6、重点小结

bash
1.headtail的语法格式 ip a|head -2 # 显示ip a结果的前2行 df -h|tail -3 # 显示磁盘信息后3行 2.yum仓库 默认仓库国内服务器 /etc/yum.repos.d/xx.repo ubt仓库: /etc/apt/ 知道当前系统通过哪个仓库安装的软件。 yum repolist 也可以直接安装软件 yum -y install wget kylin系统安装扩展的仓库epel ubt修改为国内的仓库 必会的是: kylin安装配置扩展的epel仓库 ubt将默认的仓库地址修改为阿里云 3.优化防火墙 systemctl stop firwalld systemctl disable firewalld 4.字符集优化 方法1: vim /etc/locale.conf LANG=en_US.UTF-8 重新连接或者 sourc /etc/locale.conf 方法2: 使用命令 localectl set-locale LANG=en_US.UTF-8 ubt系统配置文件: /etc/default/locale 5.时间同步 clock # 查看硬件时间 date # 查看系统时间 ntpdate ntp1.aliyun.com # 同步系统时间 提前需要安装yum -y install ntpdate 系统时间同步给硬件 hwclock -w 面试题: 操作系统都优化过什么? 1.yum仓库国内,配置扩展epel 2.优化防火墙 3.字符集优化 4.时间同步 5.安装常用软件

11、系统核心命令:crown:

1、echo(输出)

bash
echo # 输出字符串到屏幕或者文件中 语法结构: echo 字符串 echo 序列 案例1.输出字符串到屏幕 [root@oldboy /]#echo oldboyedu oldboyedu 案例2.支持空格输出 [root@oldboy /]#echo old boy old boy 案例3.激活特殊的含义,-e \n 回车符 \t tab键 [root@oldboy /]#echo -e "old\nboy" old boy [root@oldboy /]#echo -e "old\tboy" old boy 案例4.支持序列 [root@oldboy /]#echo {1..5} 1 2 3 4 5 [root@oldboy /]#echo {01..5} 01 02 03 04 05 案例5.支持字母序列 [root@oldboy /]#echo {a..d} a b c d 案例6.进行拼接,前面的字母和序列数字依次拼接 [root@oldboy /]#echo a{1..3} a1 a2 a3 案例7.后面的字母和序列依次拼接 [root@oldboy /]#echo {1..3}b 1b 2b 3b 案例8.拼出以下文件的格式 1.txt 2.txt 3.txt [root@oldboy /]#echo {1..3}.txt 1.txt 2.txt 3.txt 案例9.批量创建3个.txt文件 touch {1..3}.txt 案例10.批量创建test01-test03 3个目录 [root@oldboy ~]#mkdir text{1..3} [root@oldboy ~]#ll total 0 drwxr-xr-x 2 root root 6 Mar 9 04:52 text1 drwxr-xr-x 2 root root 6 Mar 9 04:52 text2 drwxr-xr-x 2 root root 6 Mar 9 04:52 text3 案例11.其他命令调用序列 [root@oldboy ~]# rm -rf text{1..3} 案例12.字母序列拼接 [root@oldboy ~]# echo {a..c}.txt a.txt b.txt c.txt [root@oldboy ~]# echo txst{a..c} txsta txstb txstc 案例13.前后拼接 [root@oldboy ~]# echo a{1..3}b a1b a2b a3b 案例14.不连续的拼接 [root@oldboy ~]# echo test{1,5,8} test1 test5 test8 [root@oldboy ~]# echo test{a,c,f} testa testc testf 案例13.路径的拼接 需求: 在test目录下创建 test/a test/b [root@oldboy ~]# mkdir -p test/{a,b} [root@oldboy ~]# mkdir -p test/{a,b}/1 [root@oldboy ~]# tree . ├── anaconda-ks.cfg ├── initial-setup-ks.cfg └── test ├── a │ └── 1 └── b └── 1 5 directories, 2 files #需求在oldboy目录下分别创建bbs blog www目录 重点 [root@oldboy ~]# mkdir -p oldboy/{bbs,blog,www} [root@oldboy ~]# tree . ├── anaconda-ks.cfg ├── initial-setup-ks.cfg ├── oldboy │   ├── bbs │   ├── blog │   └── www └── test ├── a │   └── 1 └── b └── 1 9 directories, 2 files

2、重定向符号

bash
> # 标准正确输出重定向 可以简写 > >> # 标准正确追加输出重定向 可以简写 >> 2> # 标准错误输出重定向 2>> # 标准错误追加输出重定向 # 将屏幕上的内容输入到文件中 #将oldboy字符串写入到1.txt,1.txt原来的内容被清空,如果1.txt文件不存在则会创建。 [root@oldboy ~]# echo oldboy >1.txt [root@oldboy ~]# cat 1.txt oldboy [root@oldboy ~]# echo hehe >1.txt [root@oldboy ~]# cat 1.txth 案例2.追加内容到1.txt [root@oldboy ~]# echo oldboy >>1.txt [root@oldboy ~]# cat 1.txt hehe oldboy 案例3.将ll输出的结果定向到1.txt [root@oldboy ~]# ll >1.txt [root@oldboy ~]# cat 1.txt 总用量 8 -rw-r--r-- 1 root root 0 2月 26 19:05 1.txt -rw------- 1 root root 2705 2月 26 17:16 anaconda-ks.cfg -rw-r--r-- 1 root root 3112 2月 26 17:19 initial-setup-ks.cfg drwxr-xr-x 5 root root 40 2月 26 19:00 oldboy drwxr-xr-x 4 root root 24 2月 26 18:58 test 案例4.将df -h的/信息 追加到1.txt [root@oldboy ~]# df -h >>1.txt [root@oldboy ~]# cat 1.txt 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 8.9M 970M 1% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 979M 12K 979M 1% /tmp /dev/sda1 1014M 151M 864M 15% /boot tmpfs 196M 0 196M 0% /run/user/0 #注意: > >> 只接收正确的结果,错误的不要,错误的写不进去,但会把文件清空 正确命令以及正确的结果,所有的执行的都要正确的 [root@oldboy ~]# llll > 1.txt -bash: llll:未找到命令 案例5.只要正确的结果错误的结果不要 [root@oldboy ~]# ech test -bash: ech:未找到命令 [root@oldboy ~]# ech test > 1.txt -bash: ech:未找到命令 案例6.接收错误的结果。2> 2>> 只要错误的结果,不要正确的 [root@oldboy ~]# echo ll 2>2.txt ll [root@oldboy ~]# cat 2.txt 正确的输入不进来 案例7.正确和错误的都接收。 #如果正确的追加到1.txt 如果错误的追加到2.txt echo oldboy >>1.txt 2>>2.txt [root@oldboy ~]# echo oldboy >>1.txt 2>>2.txt [root@oldboy ~]# cat 1.txt 2.txt oldboy #错误命令直接追加到2.txt里面 [root@oldboy ~]# echoooo oldboy >>1.txt 2>>2.txt [root@oldboy ~]# cat 1.txt 2.txt oldboy -bash: echoooo:未找到命令 [root@oldboy ~]# cat 2.txt -bash: echoooo:未找到命令 #正确的追加到1.txt里面,错误的也追加到1.txt里面 [root@oldboy ~]# ech ooo >>1.txt 2>>1.txt [root@oldboy ~]# cat 1.txt oldboy -bash: ech:未找到命令 案例8.正确和错误的存放同一个文件,2>&1表示跟1一样,1(正确)往哪里写,2(错误)往哪里写,1追加2就是追加 [root@oldboy ~]# echo oldby2025 >1.txt 2>&1 [root@oldboy ~]# cat 1.txt oldby2025 [root@oldboy ~]# ll oldboy.txt >>1.txt 2>&1 [root@oldboy ~]# cat 1.txt oldby2025 ls: 无法访问 'oldboy.txt': 没有那个文件或目录 案例9.正确的错误的放到同一个文件 [root@oldboy ~]# echo oldboy &>1.txt [root@oldboy ~]# cat 1.txt oldboy 将结果定向到相同文件三种写法: echo oldboy >>1.txt 2>>1.txt echo oldboy >>1.txt 2>&1 echo oldboy &>>1.txt 案例10.拿到运行命令的结果即可,不想看命令的输出。 [root@oldboy ~]# tou 1111 &>1.txt [root@oldboy ~]# echo $? 127 #表示上条命令执行错误错误 [root@oldboy ~]# echo 111 &>1.txt [root@oldboy ~]# echo $? 0 #表示执行成功 [root@oldboy ~]# ping -c5 www.baidu.com >1.txt [root@oldboy ~]# echo $? 0

3、less

bash
一页一页的查看文件内容,适合查看大文件。 [root@oldboy ~]# ll -h services #查看大小 -rw-r--r-- 1 root root 677K 2月 26 20:41 services #查看行数 [root@oldboy ~]# wc -l services 11473 services 查找单词出现的次数 [root@oldboy ~]#grep root -o /etc/passwd|wc -l [root@oldboy ~]# cat services services services >>all.txt [root@oldboy ~]# ll -h all.txt -rw-r--r-- 1 root root 2.0M 2月 26 20:44 all.txt 语法结构: less 文件 less -N file # 显示行号 cat file|less ip a|less # 其他命令输出,然后再用less一页一页的查看。 快捷键: f # 往下翻页 空格表示往下翻页 b # 往上翻页 100g # 快速到100行 g # 快速到首行 G # 快速到文件的末尾 /内容 # 搜索查找内容 n # 往下查找 N # 往上查找 q # 退出less命令 2.more命令 了解

4、sort(排序)

bash
作用: 排序 语法结构: sort 文件名称 #按照首列排序 其他命令输出|sort 参数选项: -n # 按照数字排序 -r # 逆序排序 -k # 指定列排序 默认空格 案例1.对文件的内容进行排序,默认按照首字母排序 [root@oldboy ~]#sort 1.txt a ab cc cd ef ui 案例2.对文件的数字进行排序,默认按照首列排序 [root@oldboy ~]#cat 1.txt 100 10 123 15 22 59999 90 [root@oldboy ~]#sort 1.txt 10 100 123 15 22 59999 90 案例3.按照数字的正序进行排序 [root@oldboy ~]#sort -n 1.txt 10 15 22 90 100 123 59999 案例4.按照数字的逆序排序 -r逆序 [root@oldboy ~]# sort -rn 1.txt 59999 123 100 90 22 15 10 案例5.取出前3 [root@oldboy ~]#sort -rn 1.txt |head -3 59999 123 100 案例6.按照成绩的正序排序,k2表示第二列 [root@oldboy ~]#sort -nk2 count.txt 王亚楠 60 尹德城 62 张欣 67 案例7.按照程序的逆序排序, [root@oldboy ~]#sort -nrk2 count.txt 马鑫 100 邢月超 100

5、知识点小结

bash
1.PS1 了解 2.echo 练习使用 使用序列拼接路径,交给其他命令执行 echo拼接练习 3.符号重点 1> 简写 > 1>> 简写 >> 2> 2>> 正确和错误的输入到同一个文件。重点 echo 1 >>1.txt 2>>1.txt echo 1 >>1.txt 2>&1 echo 1 &>>1.txt 4.less 命令查看大文件 快捷键 b f /搜索内容 n N q 退出 5.sort 重要 -r 逆序排序 -n 按照数字排序 -k 指定列排序 -rnk2 按照第2列的数字逆序排序。

6、uniq(去重)

bash
作用: 去重 参数选项: uniq -c # 去重并统计 案例1.统计字符串出现的次数 [root@oldboy ~]# sort 2.txt |uniq -c 1 liukai 1 oldb 2 oldboy 2 zhangge 案例2.统计相同的数字出现的次数 [root@oldboy ~]# sort 1.txt |uniq -c 3 1 1 16 3 191 1 20 1 46 案例3.按照出现的数字多少正序排序 [root@oldboy ~]# cat 1.txt |sort|uniq -c|sort -n 1 16 1 20 1 46 1 5555 3 13 案例4.按照出现次数的多少逆序排序,取出top10 [root@oldboy ~]#cat aa.txt |sort |uniq -c|sort -rn|head 案例5.数字去重统计 [root@oldboy ~]# cat 1.txt |sort|uniq -c 3 1 1 16 3 191 1 20 1 46 1 5555

7、wc(统计)

bash
作用: 统计文件 语法结构: wc passwd # 统计passwd信息 cat 1.txt|wc # 统计1.txt的信息 参数选项: -l # 统计行数 案例1.统计文件的行数 [root@oldboy ~]# cat /etc/passwd|wc -l 34 案例3.统计df -h总共输出多少 行[root@oldboy ~]# df -h|wc -l 9 案例2:统计secure文件中出现from的次数 grep from /var/log/secure -o|wc -l

8、;和 || 和&&

符合名称作用执行条件
;命令分隔符分隔多个命令,按顺序执行,无论前一个命令是否成功无条件执行所有命令
||逻辑或只有前一个命令失败,才会执行下一个命令。前一个命令失败则执行后续
&&逻辑与只有前一个命令成功,才会执行下一个命令。前一个命令成功则执行后续
bash
#; 顺序执行命令,无论前一条命令是否成功,都会继续执行下一条命令 [root@backup ~]#mkdir 12;cd 12 [root@backup ~/12]# #无论 echo 或 touch 是否成功,都会执行后续命令。 [root@backup ~]#ecsho "Hello" ; touch file.txt ; ls -bash: ecsho: command not found file.txt #|| 只有当前一条命令执行失败时,才会执行后面的命令。 [root@backup ~]#mkdi 14||touch 1111.txt -bash: mkdi: command not found [root@backup ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 31 20:19 1111.txt #如果前面执行成功,则不会执行后面 [root@backup ~]#mkdir 14||touch 222.txt [root@backup ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 31 20:19 1111.txt drwxr-xr-x 2 root root 6 Mar 31 20:19 14 #若 rm 删除文件失败(如文件不存在),则输出提示。 [root@backup ~]#rm file.txt || echo "删除失败" rm: cannot remove 'file.txt': No such file or directory 删除失败 #&& 前面执行成功才会执行后面 [root@web01 ~/1]#touch 22 && echo "223">22 [root@web01 ~/1]#cat 22 223

12、软件安装

1、kylin 软件安装

bash
1、yum安装 特点: 1.类似在手机应用商店点击下载安装 2.自动解决依赖问题(在PC电脑上玩手游,必须安装手游模拟器) 3.类似去饭店吃饭 鱼香肉丝。 4.必须可以连网 yum安装语法结构: yum -y install wget # 安装wget命令 yum -y install wget lrzsz tree # 安装多个命令 yum -y remove wget # 卸载wget命令 yum -y remove wget tree lrzsz #卸载多个命令 [root@oldboy ~]# yum -y install wget Last metadata expiration check: 2:12:43 ago on Tue 11 Mar 2025 11:25:27 AM CST. Dependencies resolved. ================================================================================================================================================================================= 安装包名称 平台 版本号 用哪个仓库安装 大小 Package Architecture Version Repository Size Installing: wget x86_64 1.20.3-6.ky10 ks10-adv-updates 643 k Installing dependencies:安装的依赖 libmetalink x86_64 0.1.3-8.ky10 ks10-adv-os 27 k Transaction Summary ================================================================================================================================================================================= Install 2 Packages Total download size: 670 k Installed size: 2.9 M Downloading Packages: (1/2): libmetalink-0.1.3-8.ky10.x86_64.rpm 174 kB/s | 27 kB 00:00 (2/2): wget-1.20.3-6.ky10.x86_64.rpm 2.0 MB/s | 643 kB 00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 2.0 MB/s | 670 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : libmetalink-0.1.3-8.ky10.x86_64 1/2 Installing : wget-1.20.3-6.ky10.x86_64 2/2 Running scriptlet: wget-1.20.3-6.ky10.x86_64 2/2 Verifying : libmetalink-0.1.3-8.ky10.x86_64 1/2 Verifying : wget-1.20.3-6.ky10.x86_64 2/2 Installed: libmetalink-0.1.3-8.ky10.x86_64 wget-1.20.3-6.ky10.x86_64 Complete! 1字节=8bit 1K=1024byte字节 1M=1024K 1G=1024M 1T=1024G 1PB=1024T 1EB=1024PB 案例2.安装多个命令 [root@oldboy ~]# yum -y install wget lrzsz Last metadata expiration check: 2:28:14 ago on Tue 11 Mar 2025 11:25:27 AM CST. Dependencies resolved. ================================================================================================================================================================================= Package Architecture Version Repository Size ================================================================================================================================================================================= Installing: lrzsz x86_64 0.12.20-46.ky10 ks10-adv-os 82 k wget x86_64 1.20.3-6.ky10 ks10-adv-updates 643 k Installing dependencies: libmetalink x86_64 0.1.3-8.ky10 ks10-adv-os 27 k Transaction Summary ================================================================================================================================================================================= Install 3 Packages Total download size: 752 k Installed size: 3.1 M Downloading Packages: (1/3): libmetalink-0.1.3-8.ky10.x86_64.rpm 270 kB/s | 27 kB 00:00 (2/3): lrzsz-0.12.20-46.ky10.x86_64.rpm 683 kB/s | 82 kB 00:00 (3/3): wget-1.20.3-6.ky10.x86_64.rpm 3.4 MB/s | 643 kB 00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 3.8 MB/s | 752 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : libmetalink-0.1.3-8.ky10.x86_64 1/3 Installing : wget-1.20.3-6.ky10.x86_64 2/3 Installing : lrzsz-0.12.20-46.ky10.x86_64 3/3 Running scriptlet: lrzsz-0.12.20-46.ky10.x86_64 3/3 Verifying : libmetalink-0.1.3-8.ky10.x86_64 1/3 Verifying : lrzsz-0.12.20-46.ky10.x86_64 2/3 Verifying : wget-1.20.3-6.ky10.x86_64 3/3 Installed: libmetalink-0.1.3-8.ky10.x86_64 lrzsz-0.12.20-46.ky10.x86_64 wget-1.20.3-6.ky10.x86_64 Complete! 案例3.安装rz和sz命令 rz:将本地文件上传到linux系统,简单方法鼠标拖拽 sz:将服务器文件下载到本地 #安装某些命令软件时,命令提示在仓库中找不到 原因: 1.安装的命令名称或者软件包的名不正确 2.仓库中确实没有这个命令 3.安装的命令属于其他的包 4.一个包包含了多个命令 举例: rz 和sz命令属于 lrzsz包里的命令。 #注意不能上传空文件到linux系统 #查看某个命令属于哪个包 方法1.通过yum自带的参数搜索。了解 [root@oldboy ~]#yum provides rz [root@oldboy ~]#yum search rz #安装的时候注意全名或者不带版本号都可以 [root@oldboy ~]#yum -y install net-tools-2.0-0.54.ky10.x86_64 或者直接不带版本号信息 [root@oldboy ~]#yum -y install net-tools 方法2.百度 案例4.卸载wget命令 [root@oldboy ~]#yum -y remove wget 案例5.卸载多个命令 [root@oldboy ~]#yum -y remove wget lrzsz tree 查看仓库信息: [root@oldboy ~]# yum repolist repo id repo name ks10-adv-os Kylin Linux Advanced Server 10 - Os ks10-adv-updates 清理YUM仓库缓存: 在无法安装软件尝试清理 [root@oldboy ~]#yum clean all 21 files removed 查看仓库中可用的软件: 类似查看手机软件商店里都有哪些软件 [root@oldboy ~]#yum list 覆盖安装软件,在命令无法正常使用,无法卸载时,可以使用reinstall尝试覆盖安装 [root@oldboy ~]#yum -y reinstall wget 案例6.yum只下载软件,但是不安装 #注意下载的软件使用yum必须联网 --downloaddir=/opt/ --downloadonly #将wget命令以及它的依赖下载到/opt下不安装。 [root@oldboy ~]# yum -y --downloaddir=/opt/ --downloadonly install wget Last metadata expiration check: 2:59:26 ago on Tue 11 Mar 2025 11:25:27 AM CST. Dependencies resolved. ================================================================================================================================================================================= Package Architecture Version Repository Size ================================================================================================================================================================================= Installing: wget x86_64 1.20.3-6.ky10 ks10-adv-updates 643 k Installing dependencies: libmetalink x86_64 0.1.3-8.ky10 ks10-adv-os 27 k Transaction Summary ================================================================================================================================================================================= Install 2 Packages Total download size: 670 k Installed size: 2.9 M YUM will only download packages for the transaction. Downloading Packages: (1/2): libmetalink-0.1.3-8.ky10.x86_64.rpm 159 kB/s | 27 kB 00:00 (2/2): wget-1.20.3-6.ky10.x86_64.rpm 2.3 MB/s | 643 kB 00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 2.3 MB/s | 670 kB 00:00 Complete! The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executing 'yum clean packages'. [root@oldboy ~]# ll /opt total 672 -rw-r--r-- 1 root root 27188 Mar 11 14:24 libmetalink-0.1.3-8.ky10.x86_64.rpm -rw-r--r-- 1 root root 658912 Mar 11 14:24 wget-1.20.3-6.ky10.x86_64.rpm 2、rpm安装 特点: 1.类似windows下载软件.exe,然后安装 2.先下载.rpm包,在安装 3.无法解决依赖问题,手动依赖 4.类似吃饭点速冻水饺.买锅 买勺子 碗 酱油醋 辣椒 蒜筷子 5.仓库中默认已经存在,下载后上传到无法连网的服务器上进行安装 6.默认仓库中软件不存在,需要到第三方软件官网下载软件安装(服务) 7.操作系统安装过程中使用的rpm包的方式安装的 语法结构: 58 rpm -ivh 包名称 xx.rpm -i # 安装软件 不能省略 -v # 显示过程 -h # 进度 -e # 卸载软件 或者使用yum -y remove -qa # 查看系统已经安装过的软件 -ql # 查看安装了哪些文件 rpm -ql wget -qc # 查看服务 案例1.安装wget软件包配置文件的位置 [root@oldboy ~]# rpm -ivh /opt/*.rpm Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:libmetalink-0.1.3-8.ky10 ################################# [ 50%] 2:wget-1.20.3-6.ky10 ################################# [100%] [root@oldboy ~]# rpm -qa wget wget-1.20.3-6.ky10.x86_64 [root@oldboy ~]# ll /opt 案例3.方法一,卸载wget命令,已经卸载 [root@oldboy ~]# rpm -e wget [root@oldboy ~]# rpm -qa wget 方法2.yum方式卸载 [root@oldboy ~]# yum -y remove wget 案例4.查看某个软件是否安装 [root@oldboy ~]#rpm -qa wget # 啥都不显示说明没有安装 查看多个软件是否安装 [root@oldboy ~]# rpm -qa wget lrzsz tree tree-1.8.0-2.ky10.x86_64 lrzsz-0.12.20-46.ky10.x86_64 案例6.查看软件安装后的所有文件 了解 [root@oldboy ~]#rpm -ql wget 案例7.只显示安装命令或者服务的配置文件所在位置 了解 [root@oldboy ~]# rpm -qc wget /etc/wgetrc 知识点小结: 软件安装 yum安装 必须可以上网,自动解决依赖 yum -y install 包名称 包名称 # 不知道包名称查百度 yum -y remove 包名称 包名称 # 卸载软件包 yum -y clean all # 清理yum缓存 yum repolist # 查看YUM仓库 yum -y --downloaddir=/opt/ --downloadonly install wget # 前提wget没有安装过。使用环境是有的虚拟机没网,通过有网的虚拟机下载 yum -y localinstall x.rpm # 可以自动解决依赖问题。 yum -y reinstall # 覆盖安装 yum provides # 查看属于哪个软件 yum search # 查看属于哪个软件 rpm 手动解决依赖 rpm -ivh xx.rpm # 安装rpm包 -ivh # 一起使用 安装软件显示进度 -qa wget # 查看wget是否安装 -e wget # 卸载软件 -ql # 查看安装了哪些文件 了解 -qc # 查看配置文件位置 了解安装

2、ubuntu 软件安装

bash
1.默认的yum仓库修改国内 2.安装软件 root@oldboy:~# apt -y install wget 3.卸载软件 root@oldboy:~# apt -y remove wget 4.centos kylin系统rpm包,ubt系统.deb包 dpkg -i xx.deb # -i install dpkg -r xx.deb # -r remove dpkg -l wget # 查看是否存在wget

12、文件详细属性

bash
#ls -l # 详细信息 -a # 显示所有包括隐藏的文件 -h # 人类可读大小 -d # 只显示目录的详细信息 -r # 逆序显示文件 -i # 显示inode号码 -t # 按照创建时间显示 [root@oldboy ~]# ll -i total 2736 69120244 -rw-r--r-- 1 root root 32 Mar 11 09:34 1.txt 69120222 -rw-r--r-- 1 root root 42 Mar 11 12:48 2.txt 69120213 -rw-r--r-- 1 root root 2076756 Feb 26 20:44 all.txt 69133898 -rw------- 1 root root 2705 Feb 26 17:16 anaconda-ks.cfg 67167318 -rw-r--r-- 1 root root 7762 Nov 21 2023 default 68919477 -rw-r--r-- 1 root root 3112 Feb 26 17:19 initial-setup-ks.cfg 872284 drwxr-xr-x 5 root root 40 Feb 26 19:00 oldboy 69120209 -rw-r--r-- 1 root root 692252 Feb 26 20:41 services 103038216 drwxr-xr-x 4 root root 24 Feb 26 18:58 test 案例1.查看目录下面的文件详细信息 [root@oldboy ~]# ll oldboy total 0 drwxr-xr-x 2 root root 6 Feb 26 19:00 bbs drwxr-xr-x 2 root root 6 Feb 26 19:00 blog drwxr-xr-x 2 root root 6 Feb 26 19:00 www 案例2.只查看oldboy目录本身的详细信息 [root@oldboy ~]# ll -d oldboy drwxr-xr-x 5 root root 40 Feb 26 19:00 oldboy 案例3.按照时间的逆序进行显示文件排序,最新创建的文件显示到末尾 [root@oldboy ~]# ll -rt total 2736 -rw-r--r-- 1 root root 7762 Nov 21 2023 default -rw------- 1 root root 2705 Feb 26 17:16 anaconda-ks.cfg -rw-r--r-- 1 root root 3112 Feb 26 17:19 initial-setup-ks.cfg drwxr-xr-x 4 root root 24 Feb 26 18:58 test drwxr-xr-x 5 root root 40 Feb 26 19:00 oldboy -rw-r--r-- 1 root root 692252 Feb 26 20:41 services -rw-r--r-- 1 root root 2076756 Feb 26 20:44 all.txt -rw-r--r-- 1 root root 32 Mar 11 09:34 1.txt -rw-r--r-- 1 root root 42 Mar 11 12:48 2.txt -rw-r--r-- 1 root root 0 Mar 11 15:23 311.txt 案例4.按照时间的逆序进行显示文件排序,最新创建的文件显示在头部 [root@oldboy ~]# ll -t total 2736 -rw-r--r-- 1 root root 0 Mar 11 15:23 311.txt -rw-r--r-- 1 root root 42 Mar 11 12:48 2.txt -rw-r--r-- 1 root root 32 Mar 11 09:34 1.txt -rw-r--r-- 1 root root 2076756 Feb 26 20:44 all.txt -rw-r--r-- 1 root root 692252 Feb 26 20:41 services drwxr-xr-x 5 root root 40 Feb 26 19:00 oldboy drwxr-xr-x 4 root root 24 Feb 26 18:58 test -rw-r--r-- 1 root root 3112 Feb 26 17:19 initial-setup-ks.cfg -rw------- 1 root root 2705 Feb 26 17:16 anaconda-ks.cfg -rw-r--r-- 1 root root 7762 Nov 21 2023 default

1、inode 号

bash
作用: inode存放着文件具体的指针指向和文件的详细信息。 类似书本的目录 [root@oldboy ~]# ll -i 1.txt 69071705 -rw-r--r-- 1 root root 182 Mar 12 01:19 1.txt 也就是-rw-r--r-- 1 root root 182 Mar 12 01:19是存放到69071705这个inode号里面的,而1.txt是存放到上级目录里面的 系统: inode # 书本的目录 每个文件最少占用一个inode block # 磁盘50G 整本书 每个文件最少占用一个block 每个文件最少占用1个inode和1个block inode号用尽或者block用尽,说明磁盘无法存储数据。 查看磁盘的inode总数 [root@oldboy ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on devtmpfs 246341 468 245873 1% /dev tmpfs 250387 1 250386 1% /dev/shm tmpfs 250387 716 249671 1% /run tmpfs 250387 17 250370 1% /sys/fs/cgroup /dev/mapper/klas-root 24619008 123600 24495408 1% / tmpfs 250387 13 250374 1% /tmp /dev/sda1 524288 340 523948 1% /boot tmpfs 250387 6 250381 1% /run/user/0

b23fb553-e62a-406f-8e1d-b778d653442d

bash
一个10k的文件会占用1个inode号跟3个block块(1个block占用4k,如果第3个没用完新文件也不会往里写入),用户去访问这个文件,indoe会把此文件占用的block块组合起来返回给用户 如果inode号用尽,磁盘再有空间也写不进去,但是inode占用的磁盘空间非常小,创建10万个文件,占用10万个inode号,占用空间3.8M

2、文件类型

bash
[root@oldboy ~]# ll total 684 -rw-r--r-- 1 root root 182 Mar 12 01:19 1.txt -rw-r--r-- 1 root root 0 Mar 12 01:05 2.txt -rw-r--r-- 1 root root 692252 Mar 12 01:10 services #目录:目录的block中存放的是下级所有的文件名称,目录本身的大小取决于下级文件的数量,目录本身几乎不占用容量 第0位: - # 表示普通文件,压缩包,rpm包,视频音频 d # 表示目录 l # 软链接文件,类似windows的快捷方式 b # 块设备文件,硬盘,光驱 c # 字节设备 p # 管道文件 s # 接口文件 # 软连接 [root@oldboy ~]# ll /etc/rc.local lrwxrwxrwx 1 root root 13 Apr 20 2022 /etc/rc.local -> rc.d/rc.local # 块设备 [root@oldboy ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Mar 11 18:38 /dev/sda [root@oldboy ~]# ll /dev/sr0 #sr0是光驱 brw-rw---- 1 root cdrom 11, 0 Mar 11 18:38 /dev/sr0 # 字节设备 定时任务 编程常用的 [root@oldboy ~]# ll /dev/null crw-rw-rw- 1 root root 1, 3 Mar 11 18:38 /dev/null [root@oldboy ~]# ll /dev/zero crw-rw-rw- 1 root root 1, 5 Mar 11 18:38 /dev/zero /dev/null # 空文件 类似于黑洞,用来接收不想要的内容,只要结果 [root@oldboy ~]# ping -c1 -w1 www.baidu.com &>/dev/null [root@oldboy ~]# echo $? 0 [root@oldboy ~]# ll &>/dev/null [root@oldboy ~]# echo $? 0 #生成固定大小的文件用来测试使用,测试磁盘的IO INPUT OUTPUT [root@oldboy ~]# ll /dev/zero crw-rw-rw- 1 root root 1, 5 Mar 11 18:38 /dev/zero [root@oldboy ~]# dd if=/dev/zero of=1g.txt bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB, 1000 MiB) copied, 116.433 s, 9.0 MB/s [root@oldboy ~]# ll -h total 1001M -rw-r--r-- 1 root root 1000M Mar 12 03:07 1g.txt -rw-r--r-- 1 root root 182 Mar 12 01:19 1.txt drwxr-xr-x 2 root root 6 Mar 12 02:42 2025 -rw-r--r-- 1 root root 0 Mar 12 01:05 2.rpm -rw-r--r-- 1 root root 0 Mar 12 02:37 3.mp3 -rw-r--r-- 1 root root 0 Mar 12 02:37 4.avi -rw-r--r-- 1 root root 677K Mar 12 01:1 dd # 使用dd命令生成的数据无法查看的 if # input file 从哪个文件读取数据 of # out file 输出到哪个文件 bs # block size 块大小 每次拷贝的大小 count # 总共拷贝的次数 #使用cat合并文件 将结尾输入1.txt中,这个可以查看 [root@oldboy ~]# cat /etc/services /etc/services /etc/services /etc/services > 1.txt [root@oldboy ~]# dd if=1.txt of=2.txt bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00791272 s, 133 MB/s [root@oldboy ~]# ll -h total 1005M -rw-r--r-- 1 root root 1000M Mar 12 03:07 1g.txt -rw-r--r-- 1 root root 2.7M Mar 12 03:16 1.txt drwxr-xr-x 2 root root 6 Mar 12 02:42 2025 -rw-r--r-- 1 root root 0 Mar 12 01:05 2.rpm -rw-r--r-- 1 root root 1.0M Mar 12 03:16 2.txt -rw-r--r-- 1 root root 0 Mar 12 02:37 3.mp3 -rw-r--r-- 1 root root 0 Mar 12 02:37 4.avi -rw-r--r-- 1 root root 677K Mar 12 01:10 services

3、文件权限

bash
#九位权限位 rw-r--r-- rw- # 表示主人的权限 文件属于哪个用户的。 r-- # 中间三位 表示小组的权限 小组默认只有用户1个人系统创建完用户自动创建一个组 组内只有当前的用户 例如: 我创建一个用户oldboy,系统会自动创建oldboy小组,小组内成员只有oldboy用户 r-- # 后三位 陌上人的权限 既不是主人,也没在小组内。 rwx r # read 可以读取文件 cat less w # write 可以写入内容到文件 vim echo x # execute 可执行权限 脚本(文件中都是可执行的命令)

4、硬链接

bash
硬链接的特点: 1.inode相同的互为硬链接 2.相当于给文件新开了一个入口 3.相当于超市新开了一个门 4.不同的门指向的是相同的block 5.目录不能做硬链接,文件可以做硬链接 6.目录默认硬链接个数是2,文件默认的硬链接为1 7.硬链接不能跨文件系统(不能跨磁盘),因为两边inode相同的话会冲突 #ln: failed to create hard link '/mnt/1': Read-only file system ln:无法创建硬链接“/data1/1”=>“1”:跨设备链接无效 8.删除硬链接不影响源文件,inode为0,则文件被删除 语法格式: ln 源文件 链接文件 案例1.创建一个硬链接 [root@oldboy ~]#ln 1.txt 1.txt_back [root@oldboy ~]#ll total 0 -rw-r--r-- 2 root root 0 Mar 13 01:03 1.txt -rw-r--r-- 2 root root 0 Mar 13 01:03 1.txt_back [root@oldboy ~]#ll -i total 0 67167318 -rw-r--r-- 2 root root 0 Mar 13 01:03 1.txt 67167318 -rw-r--r-- 2 root root 0 Mar 13 01:03 1.txt_back #如果写入源文件内容,那么备份文件也会实时写入 [root@oldboy ~]#echo 1111 >1.txt [root@oldboy ~]#cat 1.txt 1111 [root@oldboy ~]#cat 1.txt_back 1111 文件默认硬链接数量: 1 目录默认硬链接数量: 2 #目录的inode号 [root@oldboy ~]#mkdir 2025 [root@oldboy ~/2025]#ll -di ../2025 871836 drwxr-xr-x 2 root root 6 Mar 13 01:08 ../2025 025 #目录中的.也表示当前的目录入口 [root@oldboy ~/2025]#ll -ai total 0 871836 drwxr-xr-x 2 root root 6 Mar 13 01:08 . 67157057 dr-xr-x--- 5 root root 185 Mar 13 01:08 .. 保证操作系统重要的配置文件不被误删除

5、软链接

bash
特点: 1.软链接和源文件inode不同 2.目录可以做软链接 3.软链接可以跨文件系统(跨磁盘) 4.相当于windows的快捷方式 5.软链接中存放着源文件的路径 指针指向 6.删除源文件影响软链接 7.删除软链接不影响源文件 语法结构: ln -s 源文件 链接文件 案例1.给1.txt创建软链接2.txt [root@oldboy ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 13 01:18 1.txt drwxr-xr-x 2 root root 6 Mar 13 01:08 2025 lrwxrwxrwx 1 root root 5 Mar 13 01:18 2.txt -> 1.txt 案例2,不管是源文件写入内容还是软链接文件写入内容,两个文件都能看到写入的内容 [root@oldboy ~]#echo "20250313">1.txt [root@oldboy ~]#cat 1.txt 20250313 [root@oldboy ~]#cat 2.txt 20250313 案例3.使用软链接解决磁盘不够用的情况

087b5718-b7b7-4ad2-a116-d8e63d121dfd

bash
案例1.企业中版本升级 创建nginx的软链接 [root@oldboy ~]#mkdir nginx-1.10-1 [root@oldboy ~]#ll total 0 drwxr-xr-x 2 root root 6 Mar 13 01:24 nginx-1.10-1 [root@oldboy ~]#ln -s nginx-1.10-1 nginx [root@oldboy ~]#ll total 0 lrwxrwxrwx 1 root root 12 Mar 13 01:24 nginx -> nginx-1.10-1 drwxr-xr-x 2 root root 6 Mar 13 01:24 nginx-1.10-1 现在nginx升级成2.0版本,重新链接是没用的 [root@oldboy ~]#ln -s nginx-2.10-7 nginx [root@oldboy ~]#ll total 0 lrwxrwxrwx 1 root root 12 Mar 13 01:24 nginx -> nginx-1.10-1 drwxr-xr-x 2 root root 26 Mar 13 01:26 nginx-1.10-1 drwxr-xr-x 2 root root 6 Mar 13 01:26 nginx-2.10-7 要先删除原有的软连接再重新创建软连接 [root@oldboy ~]#ln -s nginx-2.10-7 nginx [root@oldboy ~]#ll total 0 lrwxrwxrwx 1 root root 12 Mar 13 01:28 nginx -> nginx-2.10-7 drwxr-xr-x 2 root root 26 Mar 13 01:26 nginx-1.10-1 drwxr-xr-x 2 root root 6 Mar 13 01:26 nginx-2.10-7
bash
面试题,笔试题 硬链接和软链接的区别: --------------inode号----------- 1.硬链接inode相同,软链接inode不同 --------------创建方式------------ 2.目录可以做软链接,不能做硬链接 3.硬链接不能跨文件系统,软链接可以跨文件系统。 4.创建方式不同,硬ln 软链接ln -s -------------删除方式-------------- 5.删除硬链接不影响源文件,删除软链接不影响源文件。删除软链接的源文件影响软链接 6.删除一个文件inode号为0,并且没有被进程所占用,才真正的被删除。 故障案例.删除大文件发现磁盘空间未释放 第一步: 生成10G大文件 [root@oldboy ~]#dd if=/dev/zero of=10g.txt bs=1M count=10000 10000+0 records in 10000+0 records out 10485760000 bytes (10 GB, 9.8 GiB) copied, 209.018 s, 50.2 MB/s [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 25M 954M 3% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 14G 34G 29% / tmpfs 979M 4.0K 979M 1% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 [root@oldboy ~]#ll -h total 9.8G -rw-r--r-- 1 root root 9.8G Mar 13 01:35 10g.txt lrwxrwxrwx 1 root root 12 Mar 13 01:28 nginx -> nginx-2.10-7 drwxr-xr-x 2 root root 26 Mar 13 01:26 nginx-1.10-1 drwxr-xr-x 2 root root 6 Mar 13 01:26 nginx-2.10-7 第二步:模拟文件被进程调用 [root@oldboy ~]#tail 10g.txt 第三步: 新打开一个窗口删除10g.txt [root@oldboy ~]#rm -rf 10g.txt [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 25M 954M 3% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 14G 34G 29% / tmpfs 979M 4.0K 979M 1% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 [root@oldboy ~]#ll total 0 lrwxrwxrwx 1 root root 12 Mar 13 01:28 nginx -> nginx-2.10-7 drwxr-xr-x 2 root root 26 Mar 13 01:26 nginx-1.10-1 drwxr-xr-x 2 root root 6 Mar 13 01:26 nginx-2.10-7 第四步: 查看磁盘空间发现未释放#lsof查看文件被进程所占用,ps是查看系统所有的进程 [root@oldboy ~]#lsof |grep 10g.txt tail 5748 root 3r REG 253,0 10485760000 68919477 /root/10g.txt (deleted) 第五步: 杀死进程PID,空间 [root@oldboy ~]#kill -9 5748 [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 25M 954M 3% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 979M 4.0K 979M 1% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0

13、find👑

bash
作用: 查找文件名称 语法结构: find 在哪里找 找什么类型 find 路径 类型 find 路径 名称 find 路径 大小 find 路径 时间 -o or # 或者 -a and # 并且 类型: f 普通文件 d 目录 l 软链接 b 块设备 c 字节设备文件 创建练习环境: [root@oldboy ~]# mkdir oldboy [root@oldboy oldboy]# touch {1..3}.txt {1..3}.TXT [root@oldboy oldboy]# mkdir oldboy{1..3} [root@oldboy oldboy]# ll total 0 -rw-r--r-- 1 root root 0 Mar 12 03:25 1.txt -rw-r--r-- 1 root root 0 Mar 12 03:25 1.TXT -rw-r--r-- 1 root root 0 Mar 12 03:25 2.txt -rw-r--r-- 1 root root 0 Mar 12 03:25 2.TXT -rw-r--r-- 1 root root 0 Mar 12 03:25 3.txt -rw-r--r-- 1 root root 0 Mar 12 03:25 3.TXT drwxr-xr-x 2 root root 6 Mar 12 03:25 oldboy1 drwxr-xr-x 2 root root 6 Mar 12 03:25 oldboy2 drwxr-xr-x 2 root root 6 Mar 12 03:25 oldboy3 ###########按照文件名称查找################ 案例1.找出oldboy目录下名称是1.txt的文件 #使用绝对路径查找 [root@oldboy oldboy]# find /root/oldboy -name "1.txt" /root/oldboy/1.txt #使用相对路径查找 [root@oldboy oldboy]# find ./ -name "1.txt" ./1.txt 案例2.查找出名称为1.txt的忽略大小写,加个i [root@oldboy oldboy]# find ./ -iname "1.txt" ./1.txt ./1.TXT 查出所有名称为.txt结尾的 [root@oldboy oldboy]# find ./ -name "*.txt" ./1.txt ./2.txt ./3.txt 查出所有名称为.txt结尾的,忽略大小写 [root@oldboy oldboy]# find ./ -iname "*.txt" ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TXT ./3.TXT 案例3.查找出名称是1.txt或者2.txt的文件,-o是或者的意思 [root@oldboy oldboy]# find ./ -name "1.txt" -o -name "2.txt" ./1.txt ./2.txt ######按照文件类型查找########### 案例1.查找出oldboy目录下所有的普通文件 [root@oldboy oldboy]# find ./ -type f ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TX T./3 案例2.查找出所有的目录.TXT ./ ./oldboy1 ./oldboy2 ./oldboy 案例3.查找出所有的快设备 [root@oldboy ~/oldboy]#find / -type b /dev/dm-1 /dev/dm-0 /dev/sr0 ########并且和或者 案例1.查找出是普通文件并且名称是4的 [root@oldboy ~/oldboy]#find ./ -type f -a -name "4" ./4 # -a可以省略,默认是-a并且 [root@oldboy ~/oldboy]#find ./ -type f -name "4" ./4 案例2.查找目录并且名称是5的 [root@oldboy ~/oldboy]#find ./ -type d -name "5" ./5 案例3.查找出名称为1.txt 或者名称是5的 [root@oldboy ~/oldboy]#find ./ -name "1.txt" -o -name "5" ./1.txt ./5 按照目录的深度等级查找 案例1.查找出当前目录以及目录下所有的普通文件 [root@oldboy ~/oldboy]#find ./ -type f ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TXT ./3.TXT ./oldboy1/oldboy1 ./oldboy1/oldboy2 ./oldboy1/oldboy3 ./oldboy1/oldboy4 ./oldboy1/oldboy5 ./oldboy1/oldboy6 ./oldboy1/oldboy7 ./oldboy1/oldboy8 ./oldboy1/oldboy9 ./oldboy1/oldboy10 ./4 案例2.查找出当前深度为1级的目录下所有的普通文件 [root@oldboy ~/oldboy]#find ./ -maxdepth 1 -type f ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TXT ./3.TXT ./4 ##############按照文件大小size查找##################### 案例1.查找出大于5M的文件 语法结构: find ./ -size 5M # 等于5M find ./ -size +5M # 大于5M find ./ -size -5M # 小于5M find ./ -size +1G # 大于1G的文件 [root@oldboy ~/oldboy]#find ./ -size +5M ./2.txt ./3.txt 案例1.查找出小于5M的文件 [root@web02 ~]#find ./ -size -5M ./ ./1.txt ./1.TXT ./2.TXT ./3.TXT 并且和或者 案例4.查找出普通文件大于5M的 [root@oldboy ~/oldboy]#find ./ -type f -size +5M ./2.txt ./3.txt 案例5.查找出文件名称为1.txt 或者大于10M的文件 [root@oldboy ~/oldboy]#find ./ -name "1.txt" -o -size +10M ./1.txt ./2.txt 在企业中经常用来查找大文件使用(当磁盘不够用的时候)服务器当前运行着业务,使用find最好使用相对路径查找,禁止在/开始查找 文件的时间有三种: [root@oldboy ~/oldboy]#stat 1.txt File: ‘1.txt’ Size: 2769008 Blocks: 5416 IO Block: 4096 regular file Device: fd00h/64768d Inode: 34150863 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2025-03-12 04:12:21.318417757 +0800 Modify: 2025-03-12 04:12:04.001207326 +0800 Change: 2025-03-12 04:12:04.001207326 +0800 Birth: - Access #访问时间 cat less vim后会变 Modify #echo vim后会变 Change #文件属性修改时间 vim chmod后会变 ###########find 按照时间查找文件####### 案例1.查找出7天前被修改过的文件####### [root@oldboy ~/oldboy]#find ./ -mtime +7 ./ ./test1.txt ./test2.txt ./test3.txt ./test4.txt ./test5 案例2.查找文件修改时间30天前.txt [root@oldboy ~/oldboy]#find ./ -mtime +30 ./ ./test1.txt ./test2.txt ./test3.txt ./test4.txt ./test5 案例3.查找7天内被修改过的文件(企业中遇到文件黑客攻击使用此命令查找出被修改过的文件).txt [root@oldboy ~/oldboy]#find ./ -mtime -7 ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TXT 案例4.查找24小时内被修改的文件 [root@oldboy ~/oldboy]#find ./ -mtime 0 ./1.txt ./2.txt ./3.txt ./1.TXT ./2.TXT ./3.TXT

1、find 结果交给其他命令

bash
方法1:使用xargs将屏幕上的结果甩到最后面,起到传递作用 案例1.find执行的结果交给ll查看文件的详细信息 [root@oldboy ~/oldboy]#find ./ -name "1.txt"|xargs ls -l -rw-r--r-- 1 root root 2769010 Mar 12 19:19 ./1.txt 案例2.find执行结果交给cat命令使用 [root@oldboy ~/oldboy]#find ./ -name "1.TXT"|xargs cat 新年好 find两个文件交给cat使用 [root@oldboy ~/oldboy]#find ./ -name "1.TXT" -o -name "3.TXT"|xargs cat 新年好 你也是 #注意xargs后面别名失效 ll 失效 rm -i 失效,所以删除文件会不提示,就直接删掉了 案例3.find执行结果交给rm命令删除 [root@oldboy ~/oldboy]#find ./ -name "3.txt"|xargs rm 删除目录已经需要加-r参数,因为虽然不提示,但是-r不是属于别名 [root@oldboy ~/oldboy]#find ./ -name "5"|xargs rm rm: cannot remove './5': Is a directory [root@oldboy ~/oldboy]#find ./ -name "5"|xargs rm -r [root@oldboy ~/oldboy]#ll total 18944 -rw-r--r-- 1 root root 2769010 Mar 12 19:19 1.txt -rw-r--r-- 1 root root 10 Mar 12 19:23 1.TXT -rw-r--r-- 1 root root 16614048 Mar 12 04:13 2.txt -rw-r--r-- 1 root root 0 Mar 12 03:25 2.TXT -rw-r--r-- 1 root root 10 Mar 12 19:24 3.TXT -rw-r--r-- 1 root root 0 Mar 12 03:58 4 drwxr-xr-x 2 root root 157 Mar 12 04:05 oldboy1 drwxr-xr-x 2 root root 6 Mar 12 03:25 oldboy2 drwxr-xr-x 2 root root 6 Mar 12 03:25 oldboy3 -rw-r--r-- 1 root root 0 Aug 12 2015 test1.txt -rw-r--r-- 1 root root 0 Aug 12 2015 test2.txt -rw-r--r-- 1 root root 0 Aug 12 2015 test3.txt -rw-r--r-- 1 root root 0 Aug 12 2015 test4.txt -rw-r--r-- 1 root root 0 Aug 12 2015 test5.txt 案例4.xargs按照指定列显示字符 [root@oldboy ~/oldboy]#echo {1..10}|xargs -n2 1 2 3 4 5 6 7 8 9 10 [root@oldboy ~/oldboy]#echo {1..10}|xargs -n4 1 2 3 4 5 6 7 8 9 10 [root@oldboy ~/oldboy]#echo {1..10}|xargs -n5 1 2 3 4 5 6 7 8 9 10 统计4.txt文件中单词出现的次数,先分到一列,再排序,再显示重复次数,再倒序,再取前10 [root@oldboy ~/oldboy]# cat 4.txt|xargs n1|sort |uniq -c|sort -rn|head 案例5.find结果使用xargs交给cp命令,加个i参数,把前面的结果放到{}里 [root@oldboy ~/oldboy]#find ./ -name "1.txt"|xargs -i cp {} /opt [root@oldboy ~/oldboy]#ll /opt total 2712 -rw-r--r-- 1 root root 2769010 Mar 12 19:51 1.txt -rw-r--r-- 1 root root 4 Mar 12 19:48 2.txt 方法二、使用execexec是处理屏幕的内容,把内容放到{}里去,把;转义,让它表示命令结束,而不是分割命令 案例1.find结果交给ls -l命令 [root@oldboy ~/oldboy]#find ./ -name "1.txt" -exec ls -l {} \; -rw-r--r-- 1 root root 2769010 Mar 12 19:19 ./1.txt 案例2.find结果交给cat命令 [root@oldboy ~/oldboy]#find ./ -name "2.txt" -exec cat {} \; 111 案例3.find结果交给cp命令 [root@oldboy ~/oldboy]#find ./ -name "2.txt" -exec cp {} /opt \; [root@oldboy ~/oldboy]#ll /opt total 4 -rw-r--r-- 1 root root 4 Mar 12 19:48 2.txt 方法3: find结果交给 反引号处理 `` $() 案例1.find结果交给ll命令,先执行``里面的内容,再执行前面的 [root@oldboy ~/oldboy]#ll `find ./ -name "2.txt"` -rw-r--r-- 1 root root 4 Mar 12 19:47 ./2.txt $()也是一样的结果 [root@oldboy ~/oldboy]#ll $(find ./ -name "2.txt") -rw-r--r-- 1 root root 4 Mar 12 19:47 ./2.txt 案例2.find结果交给cp命令 [root@oldboy ~/oldboy]#cp `find ./ -name "2.txt"` /tmp [root@oldboy ~/oldboy]#ll /tmp total 4 -rw-r--r-- 1 root root 4 Mar 12 19:56 2.txt 笔试题: 查找出/data目录下修改时间为30天前的文件,然后删除。 方法1:find ./ -mtime +30|xargs rm -rf 方法2:find ./ -mtime +30 exec rm -rf {} \; 方法3:rm -rf `find ./ mtime +30` 三种方式查看内容1.txt的信息 [root@oldboy ~]#find ./ -name "1.txt"|xargs -i ls -l {} -rw-r--r-- 1 root root 2769008 Mar 12 03:16 ./1.txt -rw-r--r-- 1 root root 2769010 Mar 12 19:19 ./oldboy/1.txt [root@oldboy ~]#find ./ -name "1.txt" -exec ls -l {} \; -rw-r--r-- 1 root root 2769008 Mar 12 03:16 ./1.txt -rw-r--r-- 1 root root 2769010 Mar 12 19:19 ./oldboy/1.txt [root@oldboy ~]#ls -l `find ./ -name "1.txt"` -rw-r--r-- 1 root root 2769008 Mar 12 03:16 ./1.txt -rw-r--r-- 1 root root 2769010 Mar 12 19:19 ./oldboy/1.txt #只保留100.log,其他全部删除 [root@web02 /opt]#ll total 24 -rw-r--r-- 1 root root 34 May 18 13:43 1 -rw-r--r-- 1 root root 0 May 18 13:58 100.log -rw-r--r-- 1 root root 4 May 18 14:00 1.log -rw-r--r-- 1 root root 68 May 18 13:44 1.txt -rw-r--r-- 1 root root 149 May 18 11:13 access.log -rw-r--r-- 1 root root 34 May 18 11:13 data.txt -rw-r--r-- 1 root root 57 May 18 11:13 employees.csv [root@web02 /opt]#find ./ ! -name 100.log -type f|xargs rm rm: missing operand Try 'rm --help' for more information. [root@web02 /opt]#ll total 0 -rw-r--r-- 1 root root 0 May 18 13:58 100.log

2、小结

bash
1.ubt安装软件 apt -y install wget apt -y remove wget dpkg -i xx.deb # 类似kylin rpm包安装 dpkg -r xx # 卸载rpm 也可以用apt -y remove卸载 2.inode号 系统定量的inode号和block 查看inode df -i 查看block磁盘存储 df -h 3.文件类型 普通文件 目录 块设备 字节设备 软链接 - d b c l 字节设备文件 /dev/null # 写定时任务和编程常用 ping -c1 -W1 www.baidu.com &>/dev/null yum -y install wget &>/dev/null /dev/zero # 测试生成文件使用 dd if=/dev/zero of=1.txt bs=2M count=10 4.find查找文件 find ./ -name "xx" # 按照名称查找 find ./ -iname "xx" # 忽略大小写 find ./ -name "*.txt" # 查找所有.txt结尾的文件 find ./ -maxdepth 1 -name "xx" # 按照深度等级 查找 find ./ -type f # 查找所有的普通文件 find ./ -type d # 查找所有的目录 find ./ -type f -name "1.txt" # 查找是1.txt的普通文件 find ./ -size 10M # 查找等于10M的 find ./ -size +10M # 查找大于10M的 find ./ -size -10M # 查找小于10M的 find ./ -type d -size 1M # 查找目录等于1M的 find ./ -type d -o -size 1M # 查找出目录或者等于1M的所有的文件 find ./ -mtime +7 # 查找7天前修改过的文件 find ./ -mtim -7 # 7天内修改过的文件 5.find结果交给其他命令 方法1: xargs find ./ -name "1.txt"|xargs ls -l find ./ -name "1.txt"|xargs cat find ./ -name "1.txt"|xargs rm -r find ./ -name "1.txt"|xargs -i cp {} /opt/ 方法2: -exec find ./ -name "1.txt" -exec ls -l {} \; find ./ -name "1.txt" -exec cat {} \; find ./ -name "1.txt" -exec cp {} /opt/ \; find ./ -name "1.txt" -exec rm -rf {} \; 方法3: `` 或者 $() ll `find ./ -name "1.txt"` cat `find ./ -name "1.txt"` rm -rf `find ./ -name "1.txt"` cp `find ./ -name "1.txt"` /opt/

14、打包压缩

bash
为什么打包? 1.节省磁盘空间 2.节省网络带宽(备份时间) 3.减少磁盘IO 在什么时间压缩打包? 业务低谷期(业务不同,低谷期不同) 监控软件

1、tar 打包压缩

bash
tar命令 语法结构: tar 参数 框子 水果 tar zcvf 压缩包的名称.tar.gz 文件 目录 参数: z # 压缩 c # create 创建 v # verbose显示压缩过程 f # 指定文件名称 tf # 查看压缩包中都有啥文件 xf # 解压缩 案例1.打包1.txt 名称为1.tar.gz [root@oldboy ~]#tar -zcvf 11.tar.gz 1.txt 1.txt #查看压缩包里有什么文件 [root@web01 ~]#tar -tf tar.gz ./.pass.txt ./2.txt ./3.txt 案例2.打包多个文件 1.txt a.txt 名称为txst.tar.gz [root@oldboy ~]#tar -zcvf test.tar.gz 1txt 2txt 3txt 1txt 2txt 3txt [root@oldboy ~]#ll total 8 -rw-r--r-- 1 root root 115 Mar 13 01:56 1txt -rw-r--r-- 1 root root 0 Mar 13 01:55 2txt -rw-r--r-- 1 root root 0 Mar 13 01:55 3txt -rw-r--r-- 1 root root 282 Mar 13 01:57 test.tar.gz 案例2.可以使用序列 [root@oldboy ~]#tar -zcvf 1test.tar.gz {1..3}txt 1txt 2txt 3txt 案例3.打包当前目录所有的文件 [root@oldboy ~]#tar -zcvf all.tar.gz ./* ./1test.tar.gz ./1txt ./2txt ./3txt ./test.tar.gz 案例4.打包/etc/hosts文件为hosts.tar.gz 相对路径打包: [root@oldboy ~]#cd /etc [root@oldboy /etc]#ll hosts -rw-r--r-- 1 root root 158 Mar 11 16:05 hosts [root@oldboy /etc]#tar zcvf host.tar.gz hosts hosts [root@oldboy /etc]#ll host.tar.gz -rw-r--r-- 1 root root 166 Mar 13 02:04 host.tar.gz 绝对路径打包/etc/hosts #注意系统为了保护文件安全,自动会将/删除掉 [root@oldboy /etc]#tar zcvf host.tar.gz /etc/hosts tar: Removing leading `/ from member names /etc/hosts 案例5.打包当前目录的1.txt 2.txt 将压缩包放到/opt目录下1.tar.gz [root@oldboy ~]#touch 1.txt 2.txt [root@oldboy ~]#ll /opt/ 第一种方法: 不建议 [root@oldboy ~]#cd /opt/ [root@oldboy /opt]#tar zcvf 1.tar.gz /root/{1..2}.txt 第二种方式: 压缩包的名称前面加路径即可 [root@oldboy ~]#tar zcvf /opt/1.tar.gz 1.txt 2.txt 解压文件: 语法格式: tar xf test.tar.gz [root@oldboy ~]#tar xf host.tar.gz [root@oldboy ~]#ll total 20 -rw-r--r-- 1 root root 282 Mar 13 01:59 1test.tar.gz -rw-r--r-- 1 root root 115 Mar 13 01:56 1txt -rw-r--r-- 1 root root 0 Mar 13 01:55 2txt -rw-r--r-- 1 root root 0 Mar 13 01:55 3txt -rw-r--r-- 1 root root 589 Mar 13 02:01 all.tar.gz drwxr-xr-x 2 root root 19 Mar 13 02:11 etc -rw-r--r-- 1 root root 170 Mar 13 02:06 host.tar.gz -rw-r--r-- 1 root root 282 Mar 13 01:57 test.tar.gz 案例2.指定解压test.tar.gz的内容到/opt目录下 使用-C参数 [root@oldboy ~]#tar xf host.tar.gz -C /opt [root@oldboy ~]#ll /opt total 2708 -rw-r--r-- 1 root root 2769010 Mar 12 21:01 1.txt drwxr-xr-x 2 root root 19 Mar 13 02:12 etc 第二种方法进入到opt目录解压 [root@oldboy /opt]#tar xf /root/host.tar.gz [root@oldboy /opt]#ll total 0 drwxr-xr-x 2 root root 19 Mar 13 02:14 etc 扩展项: 案例1.打包当前所有的.txt文件,排除2.txt [root@oldboy ~/oldboy]#tar zcvf all.tar.gz --exclude=./2.txt ./* ./1.txt ./3.txt ./4.txt ./5.txt 注意: kylin的exclude参数只能放到所有文件的前面 [root@oldboy ~/oldboy]#tar zcvf all.tar.gz exclude--./2.txt --exclude=3.txt ./* centos的exclude可以放到最后面 [root@linuxnc ~/he]$tar zcvf all.tar.gz ./* --exclude=./2.txt --exclude=3.txt ./1.txt 案例2.排除文件中的文件名称,文件a中有1.txt与2.txt的内容,所有排除这两个,剩余的都打包 [root@oldboy ~/oldboy]#cat a.txt 1.txt 2.txt [root@oldboy ~/oldboy]#tar zcvf allll.tar.gz --exclude-from=a.txt ./* ./3.txt ./4.txt ./5.txt ./all.tar.gz ./a.txt

2、zip 打包压缩

bash
案例1.打包1.txt名称为test.zip [root@oldboy ~]#zip 1.zip 1 adding: 1 (stored 0%) [root@oldboy ~]#ll total 4 -rw-r--r-- 1 root root 0 Mar 14 15:53 1 -rw-r--r-- 1 root root 152 Mar 14 15:53 1.zip 案例2.打包1.txt 将文件放到opt目录 [root@oldboy ~]#zip /opt/1.zip 1 adding: 1 (stored 0%) [root@oldboy ~]#ll /opt total 20 -rw-r--r-- 1 root root 292 Mar 13 03:05 1txt -rw-r--r-- 1 root root 152 Mar 14 15:54 1.zip 案例3.解压缩 [root@oldboy ~]#unzip 1.zip Archive: 1.zip extracting: 1 [root@oldboy ~]#ll total 4 -rw-r--r-- 1 root root 0 Mar 14 15:53 1 -rw-r--r-- 1 root root 152 Mar 14 15:53 1 案例4.指定解压到opt目录下 -d [root@oldboy ~]#unzip 1.zip -d /opt Archive: 1.zip extracting: /opt/1

15、正则表达式👑

bash
作用: 模糊过滤文件内容,显示过滤到内容的整行 grep语法结构: grep '字符串' 文件 其他命令输出|grep 'xx' 参数选项: -v # 取反 -r # 递归过滤文件的内容 -w # 过滤单词 -E # 支持扩展正则 egrep -i # 忽略大小写 -o # 显示匹配过程 -A # 过滤出当前行以及下n行 -B # 过滤出当前行以及上n行 -C # 过滤出当前行上下各n行 案例: grep企业案例 www.oldboyedu.com--->www.cang.com 1.DNS劫持-->引流 运营商 2.代码文件被篡改(最常见) 医院 3.服务器漏洞 攻击(难) #-r精确查找在哪个文件,过滤被修改过的文件 [root@oldboy ~]#grep -r 'www.111.com' ./ ./od.html:www.111.com [root@oldboy ~]#find ./ -type f|xargs grep 'www.111.com' ./od.html:www.111.com grep -w的精确匹配,只会匹配shell [root@oldboy ~]#grep -w 'shell' test.txt shell shell shell 过滤User及往下多显示两行 [root@oldboy ~]#grep -A2 'User' test_grep_simple.txt INFO: User alice logged in ERROR: File not found WARNING: Disk space low

1、^ 查找以什么开头的行

bash
案例1.查找以1开头的行 [root@oldboy ~]#grep '^1' oldboy.txt 123qqqq 案例2.查找以m开头的行 [root@oldboy ~]#grep '^m' oldboy.txt my blog is http: blog.51cto.com my qq num is 593528156 案例3.查找以#开头的行 [root@oldboy ~]#grep '^#' oldboy.txt ####$$$$$%%%%$$ 案例4.查找出df -h结果中以/dev/m开头的行 [root@oldboy ~]#df -h|grep '^/dev/sda1' /dev/sda1 1014M 169M 846M 17% /boot

2、$ 过滤以什么结尾的行

bash
案例1.查找以t结尾的行 [root@oldboy ~]#grep 't$' oldboy.txt test 案例2.查找以空格结尾的行 [root@oldboy ~]#grep ' $' oldboy.txt not 572891888887. ^^^^^^^^66$$$$$$$^^^$$ lizhenyalizhenyalizheny a 案例3.在每行的末尾显示$ -A参数, 了解。 [root@oldboy ~]#cat -A oldboy.txt I am lizhenya teacher!$ 123qqqq$ I teach linux.$ test$ I like badminton ball ,billiard ball and$ chinese chess!$ my blog is http: blog.51cto.com$ our site is http:www.lizhenya.com$ my qq num is 593528156$ aaaa,$ not 572891888887. $ ^^^^^^^^66$$$$$$$^^^$$ $ lizhenyalizhenyalizheny a $ ####$$$$$%%%%$$$ 案例4.查找出文件中的空行^$, [root@oldboy ~]#grep '^$' oldboy.txt 案例5.查找出除了空行以外所有的行,-v表示取反 [root@oldboy ~]#grep -v '^$' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. test I like badminton ball ,billiard ball and chinese chess! 案例6.查找出文件的空格的行 [root@oldboy ~]#grep ' ' oldboy.txt I am lizhenya teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! 案例7.查找出除了空格的行以外的所有的行 [root@oldboy ~]#grep -v ' ' oldboy.txt 123qqqq test aaaa, ####$$$$$%%%%$$ ---------------单引号和双引号的区别-------------------- [root@oldboy ~]#name=lizhenya [root@oldboy ~]#grep $name oldboy.txt I am lizhenya teacher! our site is http:www.lizhenya.com lizhenyalizhenyalizhenya [root@oldboy ~]#grep "$name" oldboy.txt 结果跟上面一样 I am lizhenya teacher! our site is http:www.lizhenya.com lizhenyalizhenyalizheny a [root@oldboy ~]#grep '$name' oldboy.txt 单引号不能解析变量,不加引号和加双引号可以解析变量 案例8.过滤出文件中生效的行,对空行和#进行取反 [root@oldboy ~]#grep -v '^$' /etc/selinux/config|grep -v '^#' [root@oldboy ~]#grep -Ev '^$|^#' /etc/selinux/config SELINUX=enforcing SELINUXTYPE=targeted SETLOCALDEFS=0

3、. 表示任意单个字符

bash
[root@oldboy ~]#grep '.' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. te 案例1.统计每个字符出现的次数 [root@oldboy ~]#grep '.' oldboy.txt -o|sort|uniq -c|sort -rn|head 28 17 a 16 $ 15 l 15 i 14 e 12 t 12 n 11 h 案例2.查找任意字符结尾的行,会显示每个字符结尾 [root@oldboy ~]#grep '.$' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. test I like badminton ball ,billiard ball and chinese chess! my blog is http: blog.51cto.com 案例3.查找以.结尾的行,\代表转义,让.不再表示任意 [root@oldboy ~]#grep '\.$' oldboy.txt I teach linux.

4、*前 1 个字符出现 0 次及 0 次以上

bash
表示8出现0次及以上 [root@oldboy ~]#grep '8*' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. test I like badminton ball ,billiard ball and chinese chess! my blog is http: blog.51cto.com our site is http:www.lizhenya.com my qq num is 593528156 aaaa, not 572891888887. ^^^^^^^^66$$$$$$$^^^$$ lizhenyalizhenyalizheny a ####$$$$$%%%%$$

3e91ad65-c745-4c0c-833a-e9e9d7fd5079

bash
注意: 如果过滤的4*内容没有 则显示所有内容。 [root@oldboy ~]#grep '4*' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. test I like badminton ball ,billiard ball and chinese chess! 案例4.查找出所有内容 [root@oldboy ~]#grep '.*' oldboy.txt I am lizhenya teacher! 123qqqq I teach linux. test I like badminton ball ,billiard ball and chinese chess! 案例5.查找以任意字符和!组合的行 [root@oldboy ~]#grep '.!' oldboy.txt I am lizhenya teacher! chinese chess! 案例6.查找包含 foo 且后面跟着 bar 的行(即 foo 和 bar 在同一行)。 [root@oldboy ~]#grep 'foo.*bar' example.txt

5、.和.关键区别总结

特性..*
匹配长度仅匹配 1 个字符匹配 0 到多个字符
贪婪性无(只匹配一个字符)贪婪(尽可能匹配最长字符串)
常见用途精确匹配某个位置的单个字符模糊匹配任意长度的占位符

6、[] 表示任意单个字符

bash
案例1.找出文件中包含a的或者b的或者c的行 [root@oldboy ~]#grep [abc] oldboy.txt

5cc42dd1-8e19-4a56-b3e1-ebc09868fbe0

bash
案例2.找出以.结尾的行 [root@oldboy ~]#grep '\.$' oldboy.txt 带特殊含义的符号放到[]还原了本意 [root@oldboy ~]#grep [.*] oldboy.txt .或者*结尾的 [root@oldboy ~]#grep '[.*]$' oldboy.txt I teach linux.

e387f6c1-390e-4800-9ef4-0a3a684f646f

bash
案例4.过滤以I或者m开头的行 [root@oldboy ~]#grep '^[Im]' oldboy.txt

1155a890-2cf9-4822-903f-ea0443b02b3b

bash
案例5.[^] 表示取反 过滤除了I或者m的字符 [root@oldboy ~]#grep '[^Im]' oldboy.txt

43f3e78b-46ca-4cac-8c18-4866b32682bb

bash
案例6.对特殊的符号进行取反,第一个^表示取反,之后的^表示特殊字符,也就是除了括号里面的符号,其他都要 [root@oldboy ~]#grep '[^!,.*^$]' oldboy.txt

4351f998-f83e-4d06-b7fe-2110db0520d8

bash
案例7.支持序列匹配a-z所有字母的行 [root@oldboy ~]#grep '[a-z]' oldboy.txt

7f6e95e2-7a9d-4339-8592-2933e845c265

bash
案例8.包含大小写字母 [root@oldboy ~]#grep '[a-Z]' oldboy.txt [root@oldboy ~]#grep '[a-zA-Z]' oldboy.txt

d2440ed9-d651-47d9-bd02-70f9d15dacc4

181f32ce-7bec-4c9a-9c2a-52fe13629965

bash
案例9.字母数字组合 [root@oldboy ~]#grep '[0-9]' oldboy.txt

505f58c5-7824-444c-a422-96fd30620f8f

bash
#包含了数字和字母的大小写 [root@oldboy ~]#grep '[0-Z]' oldboy.txt

38e75098-81c2-4580-960c-9a3a57606fd4

16、扩展正则:crown:

1、+ 前 1 个字符出现 1 次及 1 次以上

bash
[root@oldboy ~]#grep -E '8+' oldboy.txt my qq num is 593528156 nGot *572891888887. [root@oldboy ~]#grep -E '18+' oldboy.txt nGot *572891888887. 案例2.匹配连续的字符 [root@oldboy ~]#grep -E '[a-z]+' oldboy.txt

d8428627-4cfd-49b0-8285-9e2f279cf7cc

bash
案例3.统计单词出现的次数(前提条件 单词和单词之间必须有空格) [root@oldboy ~]#grep -E '[a-Z]+' oldboy.txt -o|sort|uniq -c|sort -rn|head 3 is 3 I 2 my 2 lizhenya 2 http 2 com 2 ball 1 www 1 test 1 teacher 案例4.提取所有版本号(格式 vX.Y.Z),v拼接,/.转义成.+表示一个或者多个 [root@oldboy ~]#grep -Eo 'v[0-9]+\.[0-9]+\.[0-9]+' test_grep_simple.txt v111111.22222.3412412

2、| 或者的含义

bash
案例1.找出包含linux或者blog的行 [root@oldboy ~]#grep -E 'www|test' oldboy.txt test our site is http:www.lizhenya.com 案例2.只显示文件中生效的行排除空行和#注释 [root@oldboy ~]#grep -Ev '^$|#' /etc/selinux/config SELINUX=enforcing SELINUXTYPE=targeted SETLOCALDEFS=0

3、{} 前一个字符最大匹配的次数

bash
案例1.匹配连续3个8 [root@oldboy ~]#grep -E '8{3}' oldboy.txt nGot *572891888887. [root@oldboy ~]#grep -E '8{3}' oldboy.txt -o 888 案例2.显示数字至少出现2次的,和最多出现3次的。 [root@oldboy ~]#grep -E '[0-9]{2,3'} oldboy.txt

4c80327b-14f9-47c7-a235-ad0ef150f9f1

bash
案例3.提取所有日志时间戳(格式 YYYY-MM-DD HH:MM:SS) [root@oldboy ~]#grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}' test_grep.txt -o 2023-10-05 08:30:22 2023-10-05 08:32:45 2023-10-05 08:35:11 2023-10-05 08:40:00

4、() 表示一个整体

bash
sed的后向引用。 [root@oldboy ~]#grep -E 'lizhenya+' oldboy.txt I am lizhenya teacher! 123qqqqlizhenya our site is http:www.lizhenya.com lizhenyalizhenyalizhenya lizhenya lizhenya # 执行流程是一列一列的输出,因为不是一个整体,+号表示前一个字符出现1次及1次以上 [root@oldboy ~]#grep -E 'lizhenya+' oldboy.txt -o lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenya #加个括号表示前面括号里字符串出现的一次及一次以上当成一个整体匹配 [root@oldboy ~]#grep -E '(lizhenya)+' oldboy.txt -o lizhenya lizhenya lizhenya lizhenyalizhenyalizhenya lizhenya lizhenya lizhenya lizhenya lizhenya lizhenyalizhenya #将u和y扩起来作为一个整体。找出来的结果是lizhenua或者lizhenya的 [root@oldboy ~]#grep -E 'lizhen(u|y)a' oldboy.txt

41871a0b-8429-4f77-a578-5566f63c71ca

bash
如果没有小括号,找出来的是lizhenu或者ya的,两者意义buyiyang [root@oldboy ~]#grep -E 'lizhenu|ya' oldboy.txt

84ee7dbd-a6ac-4441-8965-d1eed734c8f5

5、重点

bash
重点 1.^ grep '^r' file 2.$ grep 'm$' file grep '^$' file # 过滤空行 3.* grep '8*' file # 了解 4.. grep '.' file # 过滤任意单个字符 了解 5. .* 表示任意所有字符 grep '.*' file grep '.*am' file # 过滤任意的字符串和am一起的行 6.[] 表示任意单个字符 grep '[abc]' file # 过滤文件中包含a 或 b或c的行 grep 'abc' file # 过滤出包含abc的行 grep '[a-z]' [a-Z] [0-9] [0-Z] [^abc] 对a或b或c取反 [.$^] # 对特殊含义的字符进行转义 7.+ #前一个字符出现1次及1次以上 grep -E '8+' file # 连续出现的8 grep -E '[0-9]+' # 任意连续数字 grep -E '[a-z]+' # 任意连续的字符 8.{} egrep '[0-9]{18}' # 连续的18个数字 egrep '[0-9]{3,5}'# 最多5次,最少3次的数字 9.| #或者 egrep 'blog|linux' file egrep -v '^$|#' file # 排除空行和#注释的行 10.() # 作为一个整体 了解 egrep '(lizhenya)+' # 前面lizhenya字符串连续出现1次及1次上 作为1次进行输出

17、sed:crown:

bash
作用: 1.精确匹配行 2.模糊过滤 3.内容替换 4.内容增加 5.删除替换 6.后向引用 常用两种: 1.匹配行 2.替换 sed语法结构 sed '模式+动作' 文件 sed '找谁+干啥' 文件 找谁: 精确过滤行,模糊过滤 干啥: 增加 删除 替换

1、sed 之精确查找行

bash
语法: sed -n '3p' file # 输出文件的第3行 sed -n '3,5p' file # 第3-5行 表示区间范围 sed -n '5,$p' file # 第5到文件的末尾 -n # 取消默认输出,有n就有p p # print 输出 环境准备: [root@oldboy ~]#cat -n /etc/passwd |head > 3.txt [root@oldboy ~]#cat 3.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例1.输出第3行 [root@oldboy ~]#sed -n '3p' 3.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

img

bash
sed的执行流程,一行一行的输出,3p就是找第三行,从第一行开始存放到模式空间,因为不是想找的那一行所以输出到屏幕,当找到第三行存放到到模式空间就会多打印输出一次,-n取消默认输出,就是取消模式空间里的
bash
案例2.输出3到5行 [root@oldboy ~]#sed -n '3,5p' 3.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 案例3.输出第5行到文件的末尾 [root@oldboy ~]#sed -n '5,$p' 3.txt 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例4.显示文件的最后一行 [root@oldboy ~]#sed -n '$p' 3.txt 10 operator:x:11:0:operator:/root:/sbin/nologin

2、sed 之模糊过滤

bash
语法结构: grep '字符串' 文件 sed -n '/字符串/p' 文件 sed -n '//,//p 文件,' #字符串的区间范围,最好是唯一的 sed -r 加-r表示扩展正则,类似于grep -E 案例1.模糊过滤包含root的行 [root@oldboy ~]#sed -n '/root/p' 3.txt 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin 案例2.模糊过滤adm的行 [root@oldboy ~]#sed -n '/adm/p' 3.txt 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 案例3.支持正则表达式 过滤以t结尾的行 [root@oldboy ~]#sed -n '/t$/p' 3.txt 8 halt:x:7:0:halt:/sbin:/sbin/halt 案例4.支持正则表达式 过滤以r开头的行 [root@oldboy ~]#sed -n '/^r/p' 5.txt root:x:0:0:root:/root:/bin/bash 案例5.包含abc的行 [root@oldboy ~]#sed -n '/abc/p' 3.txt 案例6.查找包含或a或b或c的行 [root@oldboy ~]#sed -n '/[abc]/p' 3.txt root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例7.查找包含root或者adm的行 [root@oldboy ~]#sed -rn '/root|adm/p' 3.txt root:x:0:0:root:/root:/bin/bash 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例8.查找出包含数字的任意行 [root@oldboy ~]#sed -n '/[0-9]/p' 3.txt root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例9.查找出oldboy到test之间的行, [root@oldboy ~]#sed -n '/oldboy/,/test/p' 3.txt oldboy 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4o adm:x:3:4:adm:/var/adm:/sbin/nologin test #匹配注意事项 一个开头对应一个结尾,如果连续两个开头,也找一个结尾,如果有第二个开头,没有第二个结尾会全部匹配出来 企业: 找时间的区间范围 [root@oldboy ~]#sed -n '/Mar 15 16:32:45/,/Mar 15 16:34:15/p' /var/log/messages Mar 15 16:32:45 oldboy systemd[1]: kylin-kms-activation.service: Service RestartSec=30s expired, scheduling restart. Mar 15 16:32:45 oldboy systemd[1]: kylin-kms-activation.service: Scheduled restart job, restart counter is at 1002. Mar 15 16:32:45 oldboy systemd[1]: Stopped run kylin_kms_daemon at boot time. Mar 15 16:32:45 oldboy systemd[1]: Started run kylin_kms_daemon at boot time. Mar 15 16:33:45 oldboy systemd[1]: kylin-kms-activation.service: Main process exited, code=exited, status=255/EXCEPTION Mar 15 16:33:45 oldboy systemd[1]: kylin-kms-activation.service: Failed with result 'exit-code'. Mar 15 16:34:15 oldboy systemd[1]: kylin-kms-activation.service: Service RestartSec=30s expired, scheduling restart.

3、sed 之删除

bash
语法结构: sed '3d' 文件 sed '3,5d' 文件 sed '/root/d' 文件 sed '/n$/d' 文件 sed -i '3,5d' # 修改原文件 删除3-5行内容 案例1.删除第3行 [root@oldboy ~]#sed '3d' 3.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 案例2.删除3,5行 [root@oldboy ~]#sed '3,5d' 3.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 案例3.删除包含root的行 [root@oldboy ~]#sed '/root/d' 3.txt 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 案例4.删除包含root或者adm的行 [root@oldboy ~]#sed -r '/adm|root/d' 3.txt 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 案例5.删除以n结尾所有行 [root@oldboy ~]#sed '/n$/d' 3.txt 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 案例6.修改源文件内容,需要加-i参数 [root@oldboy ~]#sed -i '/n$/d' 3.txt [root@oldboy ~]#cat 3.txt 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 案例7.删除区间范围的行 [root@oldboy ~]#sed '/root/,/adm/d' 3.txt 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

4、sed 之增加内容

bash
语法结构: sed '3c 字符串' 文件 #替换内容 sed '3i 字符串' 文件 #第三行插入 sed '3a 字符串' 文件 #第三行下方插入 sed '3w 1.txt' 文件 #保存第三行 案例1.在第3行处插入oldboy字符串,原来第三行下移了 [root@oldboy ~]#sed '3i oldboy' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin oldboy 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 案例2.在第3行下插入oldboy字符串 [root@oldboy ~]#sed '3a testold' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin testold 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 在第2,3行下都插入oldboy字符串 [root@oldboy ~]#sed '2,3a testold' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin testold 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin testold 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 案例3.将第3行修改为oldboy字符串,c就change [root@oldboy ~]#sed '3c oldboy' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin oldboy 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 案例4.将第3行保存到new.txt文件中,文件名称不存在则自动创建 [root@oldboy ~]#sed '3w new.txt' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin [root@oldboy ~]#cat new.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 这种方法也可以 [root@oldboy ~]#sed -n '3p' 3.back >nnn.txt [root@oldboy ~]#cat nnn.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 案例5.替换第8行的配置文件(修改了源文件) sed -i '8c SELINUX=disabled' /etc/selinux/config

5、sed 之替换

bash
语法结构: 注意: 如果只有动作,默认会处理所有的行。 sed 's#内容#替换成什么#g' file sed 's/内容/替换成什么/g' file sed 's@@@g' file 案例1.替换文件中所有的root为back [root@oldboy ~]#cat 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@oldboy ~]#sed 's#root#back#g' 3.back 1 back:x:0:0:back:/back:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 案例2.注意如果不加g则替换是每行出现的第一个单词 [root@oldboy ~]#sed 's#root#back#' 3.back 1 back:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/back:/sbin/nologin 案例3.替换文件中的root或者adm为oldboy #字符串都可以支持正则 [root@oldboy ~]#sed -r 's#root|adm#oldboy#g' 3.back 1 oldboy:x:0:0:oldboy:/oldboy:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 oldboy:x:3:4:oldboy:/var/oldboy:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/oldboy:/sbin/nologin 案例4.将root删除掉 [root@oldboy ~]#sed 's#root##g' 3.back 1 :x:0:0::/:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 案例5.将文件中所有的特殊符号 替换成空格 #将:/替换成空格 [root@oldboy ~]#sed 's#:/# #g' 3.back 1 root:x:0:0:root root bin/bash 2 bin:x:1:1:bin bin sbin/nologin #将:或者/替换成空格 [root@oldboy ~]#sed -r 's#[:/]# #g' 3.back 1 root x 0 0 root root bin bash 2 bin x 1 1 bin bin sbin nologin 3 daemon x 2 2 daemon sbin sbin nologin 4 adm x 3 4 adm var adm sbin nologin 5 lp x 4 7 lp var spool lpd sbin nologin [root@oldboy ~]#sed -r 's#:|/# #g' 3.back 1 root x 0 0 root root bin bash 2 bin x 1 1 bin bin sbin nologin 3 daemon x 2 2 daemon sbin sbin nologin 案例6.将所有的数字和特殊字符删除 [root@oldboy ~]#sed 's#[0-9:/x]# #g' 3.back root root root bin bash bin bin bin sbin nologin daemon daemon sbin sbin nologin adm adm var adm sbin nologin lp lp var spool lpd sbin nologin sync sync sbin bin sync shutdown shutdown sbin sbin shutdown halt halt sbin sbin halt mail mail var spool mail sbin nologin operator operator root sbin nologin 案例7.统计单词出现的次数 [root@oldboy ~]#sed 's#[0-9:/x]# #g' 3.back |xargs -n1|sort|uniq -c|sort -rn 12 sbin 6 nologin 5 bin 4 root 3 var 3 sync 3 shutdown 3 mail vim替换: %s///g # 全局替换 模式+动作 找谁+干啥 # 修改第3行的adm为root [root@oldboy ~]#sed '4s#adm#root#g' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 root:x:3:4:root:/var/root:/sbin/nologin # 修改3-5行的sbin为AAA [root@oldboy ~]#sed 3,5s#sbin#AAA#g 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/AAA:/AAA/nologin 4 adm:x:3:4:adm:/var/adm:/AAA/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/AAA/nologin # 替换包含root的行的nologin为AAA [root@oldboy ~]#sed '/root/s#nologin#AAA#g' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/AAA 案例1.将第3行的sbin替换成oldboy [root@oldboy ~]#sed '3s#sbin#oldboy#g' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/oldboy:/oldboy/nologin 案例2.将1,3行的bin替换成AA [root@oldboy ~]#sed '1,3s#bin#AA#g' 3.back 1 root:x:0:0:root:/root:/AA/bash 2 AA:x:1:1:AA:/AA:/sAA/nologin 3 daemon:x:2:2:daemon:/sAA:/sAA/nologin 案例3.注意语法格式的问题,把/替换成A [root@oldboy ~]#head -1 3.txt|sed 's/\//A/g' 1 root:x:0:0:root:Aroot:AbinAbash [root@oldboy ~]#head -1 3.txt|sed 's#\/#A#g' 1 root:x:0:0:root:Aroot:AbinAbash 案例4.将3,5行进行注释 [root@oldboy ~]#sed '3,5s/^/#/g' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin # 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 案例5. 将最后一行插入; [root@web02 /opt]#sed 's/$/;/g' data.txt apple 5; banana 3; apple 2; orange 8; 案例6. 将最前面一行插入; [root@web02 /opt]#sed 's/^/;/g' data.txt ;apple 5 ;banana 3 ;apple 2 ;orange 8 vim替换 :3,5s/^/#/g # 方法1 进入快模式 ctrl+v # 方法2 上下键批量选择--->按大写的I 进入编辑模式-->写入内容-->按ESC键

6、小结

bash
知识点小结: 1.grep参数 -v:取反 -r:过滤文件内容 -E:扩展正则要加 -i:忽略大小写 2.sed sed -n '3p' file sed -n '3,5p' file sed -n '$p' file sed '3d' file # 删除第3行 sed '3,5d' file # 删除3,5行 sed '3c oldboy' file # 将第3行替换成oldboy sed '3i|3a|3w' file # 了解 sed -n '/root/p' file sed -n '/^r/p' file sed -n '/n$/d' file sed -n '//,//p' file sed 's###g' file sed 's#[a-z]##g' file sed -r 's#root|adm#oldboy#g' file sed '3,5s#nologin##g' file sed '/root/s#root#OLDBOY#g' file

18、sed 后向引用:crown:

bash
作用: 利用正则表达式取出想要的内容 \1表示取前面第一个ie()里的内容 [root@oldboy ~]#echo oldboy|sed -r 's#ol(db)oy#\1#g' db [root@oldboy ~]#echo oldboy|sed -r 's#.*(db).*#\1#g' db [root@oldboy ~]#echo oldboy|sed -r 's#ol(db)(oy)#\2#g' oy [root@oldboy ~]#echo oldboy|sed -r 's#ol(db)(oy)#\1 \2#g' db oy #后向引用或者IP地址 [root@oldboy ~]#ip a |sed -n '/ens33$/p' inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute ens33 # 表示要取的内容在*.net后面,/24前面 [root@oldboy ~]#ip a |sed -nr '/ens33$/s#/*.net(.*)/24.*#\1#gp' 10.0.0.200 #获取本机的IP地址 [root@oldboy ~]#hostname -I 10.0.0.200 #取出908 [root@oldboy ~]#awk 'NR==5' data5.txt|sed -nr 's#.*\)(.*) j.*#\1#gp' 908 [root@oldboy ~]#cat data5.txt aaaaaaaaaaaaa bbbb bbbbbbbbbbbbbb i am zjc 1046(88)908 jiayou #另一种简单方法取出908 [root@oldboy ~]#sed -nr '/^i/s#.*\)(.*) j.*#\1#gp' data5.txt 908 #取出婷婷 [root@oldboy ~]#sed -nr '/^ss/s#.*a5(.*)521.*#\1#gp' data5.txt 婷婷 [root@oldboy ~]#cat data5.txt sss11387231994122334???/. BAM;aa5婷婷521aa<>a;''aAAa9)(a--=aaa bbbb bbbbbbbbbbbbbb i am zjc 1046(88)908 jiayou #取出65536 [root@oldboy ~]#ip a|sed -n '/^1:/'p 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 [root@oldboy ~]#ip a|sed -nr '/^1:/s#.*u (.*) qd.*#\1#g'p 65536 取出cf4c [root@oldboy ~]#sed -n '/^U/'p /etc/sysconfig/network-scripts/ifcfg-ens33 UUID=02fbd962-cf4c-4ad9-9f72-747495b5e068 [root@oldboy ~]#sed -nr '/^U/s#.*2-(.*)-4.*#\1#g'p /etc/sysconfig/network-scripts/ifcfg-ens33 cf4c

19、awk:crown:

bash
作用: a w k三个人属于GNU项目中的成员 编程语言 1.取行 2.取列 3.模糊过滤 4.if判断 5.for循环 6.while循环 7.数组 8.格式化输出 语法格式: awk '找谁{动作}' 文件 awk '找谁{print}' 文件 其他命令输出|awk '找谁{干啥}'

1、awk 取行

bash
语法结构: awk 'NR==3' file NR内置变量,里面存储着每行的行号 行的比较符号: == 相等的行 != 不等于 > 大于 >= 大于等于 < 小于 <= 小于等于 || 或者 && 并且 案例1.取出文件中的第3行 [root@oldboy ~]#awk 'NR==3' 3.back # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 案例2.取出大于5的行 [root@oldboy ~]#awk 'NR>5' 3.back 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例3.取出小于5的行 [root@oldboy ~]#awk 'NR<5' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 案例4.找出不等于5的行 [root@oldboy ~]#awk 'NR!=5' 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例5.找出等于1或者等于5的行 [root@oldboy ~]#awk 'NR==1||NR==5' 3.back 1 root:x:0:0:root:/root:/bin/bash 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 案例4.找出小于3并且等于1的行 [root@oldboy ~]#awk 'NR<3 && NR==1' 3.back 1 root:x:0:0:root:/root:/bin/bash #可以省略print 默认就是输出 [root@oldboy ~]#awk 'NR==3{print}' 3.back # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

2、awk 取列

bash
语法结构: awk '{print $n}' file , 逗号awk的内置变量存储着空格 NF是awk的内置变量,存储着最后一列的列号 默认以空格或tab键为列的分隔符 n为数字从1开始。 0表示每行的内容 1表示第一列 2表示第二列 案例1.取出文件中的第一列 [root@oldboy ~]#awk '{print $1}' 1.txt 10 9 18 76 案例2.取出第2列 [root@oldboy ~]#awk '{print $2}' 1.txt 20 109 68 221 案例3.取出第1和第3列以空格分隔 [root@oldboy ~]#awk '{print $1,$2}' 1.txt 10 20 9 109 18 68 76 221 取出第1和第3列以-分隔 [root@oldboy ~]#awk '{print $1"-"$2}' 1.txt 10-20 9-109 18-68 76-221 案例4.输出文件最后的列号,也就是有几列 [root@oldboy ~]#awk '{print NF}' 1.txt 3 3 4 5 案例5.输出最后一列的内容 [root@oldboy ~]#awk '{print $NF}' 1.txt 30 43 86 101 [root@oldboy ~]#cat 1.txt 10 20 30 9 109 43 18 68 90 86 76 221 86 54 101 输出倒数第二列的内容 [root@oldboy ~]#awk '{print $(NF-1)}' 1.txt 20 109 90 54 案例6.输出df -h结果最后一列的内容 [root@oldboy ~]#df -h|awk '{print $NF}' on /dev /dev/shm /run /sys/fs/cgroup / /tmp /boot /run/user/0

3、指定分隔符

bash
awk指定分隔符 -F 语法结构: awk -F: '{print $1}' file awk -F ":" '{print $1}' file 案例1.取出文件中的第一列,以冒号分隔 [root@oldboy ~]#cat 3.back 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin # 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin [root@oldboy ~]#awk -F: '{print $1}' 3.back 1 root 2 bin # 3 daemon # 4 adm # 5 lp 6 sync 7 shutdown 8 halt 9 mail 10 operator 案例2.取出文件的最后一列,以冒号分隔 [root@oldboy ~]#awk -F: '{print $NF}' 3.back /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /sbin/nologin 案例3.指定多个分隔符,取出文件的第6列不带/ [root@oldboy ~]#awk -F: '{print $6}' 3.back /root /bin /sbin /var/adm /var/spool/lpd /sbin /sbin /sbin /var/spool/mail /root [root@oldboy ~]#awk -F: '{print $6}' 3.back |sed 's#/##g' root bin sbin varadm varspoollpd sbin sbin sbin varspoolmail root [root@oldboy ~]#awk -F :/ '{print $2}' 3.back root bin sbin var/adm var/spool/lpd sbin sbin sbin var/spool/mail root [root@oldboy ~]#awk -F ":/" '{print $2}' 3.back root bin sbin var/adm var/spool/lpd sbin sbin sbin var/spool/mail root 案例4.取出文件中的x列和root列 [root@oldboy ~]#awk -F ":|/" '{print $2,$7}' 3.back x root x bin x sbin x var x var x sbin x sbin x sbin x var x root [root@oldboy ~]#awk -F "[:/]" '{print $2,$7}' 3.back x root x bin x sbin x var x var x sbin x sbin x sbin x var x root [root@oldboy ~]#cat 3.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin +的作用就是前一个字符出现1次及1次以上,如果出现:/说明算作出现1次 [root@oldboy ~]#cat 3.back |awk -F '[:/]+' '{print $2,$5}' x root x bin x daemon x adm x lp x sync x shutdown x halt x mail x operator 案例5.+的作用 [root@oldboy ~]#echo test--+-:/oldboy--+:/edu---|awk -F "[-+:/]" '{print $7}' oldboy [root@oldboy ~]#echo test--+-:/oldboy--+:/edu---|awk -F "[-+:/]+" '{print $2}' oldboy 案例6.awk -F 万物皆可指定 [root@oldboy ~]#echo oldboy |awk -Fd '{print $1}' ol

4、模糊过滤

bash
语法结构: awk '/字符串/' 文件 awk '//,//' 文件 区间范围 案例1.输出包含root的行 [root@oldboy ~]#awk '/root/' 3.back 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin 案例2.输出包含root或者adm的行 [root@oldboy ~]#awk '/root|adm/' 3.back 1 root:x:0:0:root:/root:/bin/bash # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 案例3.找出以r开头的行 [root@oldboy ~]#awk '/^r/' 5.txt 案例4.查找以/结尾的行 [root@oldboy ~]#df -h|awk '/\/$/' /dev/mapper/klas-root 47G 3.7G 44G 8% / 案例5.找出包含的数字的行 [root@oldboy ~]#df -h|awk "/[7-8]/" tmpfs 467M 0 467M 0% /dev/shm tmpfs 467M 13M 454M 3% /run tmpfs 467M 0 467M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 467M 0 467M 0% /tmp /dev/sda1 1014M 169M 846M 17% /boot 字符串比对 awk '$1=="root"' 文件 awk '$2!="0"' 文件 案例1.输出第一列等于root字符串的行 [root@oldboy ~]#awk -F: '$1=="root"' 03.txt root:x:0:0:root:/root:/bin/bash 案例2.输出第三列不等于0的行 [root@oldboy ~]#awk -F: '$3!="0"' 03.txt bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin 案例3.输出最后一列的内容等于bash的行 [root@oldboy ~]#awk -F "[:/]+" '$NF=="bash"' 03.txt root:x:0:0:root:/root:/bin/bash [root@oldboy ~]#awk -F "[:/]+" '$NF=="nologin"' 03.txt bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin 案例4.匹配支持正则表达式 扩展了解 [root@oldboy ~]#awk -F: '/^r/' 03.txt root:x:0:0:root:/root:/bin/bash 表示最后一列做正则匹配,匹配以b开头的,不带~语法错误 [root@oldboy ~]#awk -F "[:/]+" '$NF ~ /^b/' 03.txt root:x:0:0:root:/root:/bin/bash 表示第一列做正则匹配,匹配以b开头的,不带~语法错误 [root@oldboy ~]#awk -F "[:/]+" '$1 ~ /^b/' 03.txt bin:x:1:1:bin:/bin:/sbin/nologin

5、awk 模式 + 动作

bash
语法结构: awk '找谁{干啥}' 文件 找谁: awk 'NR==5' awk 'NR>5' awk 'NR>5&&NR<10' awk '/root/' awk '$1=="root"' awk '$NF=="nologin"' 补充NR的案例: 统计成绩大于60并且小于100的 [root@oldboy ~]#awk '$3>60&&$3<100' cc.txt|wc -l [root@oldboy ~]#awk '$3>60&&$3<90' 1.txt 76 221 86 54 101 统计成大于小于60分的总共人数 [root@oldboy ~]#awk '$3<60' cc.txt|wc -l 案例1.输出第一行的最后一列 [root@oldboy ~]#awk -F: 'NR==1{print $NF}' 1.txt 10 20 30 案例2.输出第3行的第四列 [root@oldboy ~]#cat 03.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@oldboy ~]#awk -F: 'NR==3{print $5}' 03.txt daemon 案例3.输出第3-6行的第一列 [root@oldboy ~]#awk -F: 'NR>=3&&NR<=6{print $1}' 03.txt daemon adm lp sync 面试题: 想要输出文件的第3行的第5列如何做? awk 'NR==3{print $5}' file 案例4.输出包含root行的最后列 [root@oldboy ~]#awk -F: '/root/{print $NF}' 03.txt /bin/bash /sbin/nologin 案例5.输出以n结尾行的第一列内容 [root@oldboy ~]#awk -F: '/n$/{print $1}' 03.txt bin daemon adm lp shutdown mail operator [root@oldboy ~]#cat 03.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

三剑客练习题

bash
#案例:我们有多个应用的配置文件,需要将数据库连接地址从old_db_address替换为new_db_address。 1、查看old_db_address哪个文件里面有 [root@web02 ~/zhang]#grep -r old_db_address ./* ./db_server:db_name:old_db_address ./myfine/dbconnn:db_name:old_db_address 2、old_db_address替换成new_db_address [root@web02 ~/zhang]#grep -rl old_db_address ./* |xargs sed -i 's#old_db_address#new_db_address#g' sed -i 直接修改文件内容 grep -rl 组合: -r 递归查找 -l 只显示包含匹配内容的文件名 3、验证 [root@web02 ~/zhang]#grep -r new_db_address ./* ./db_server:db_name:new_db_address ./myfine/dbconnn:db_name:new_db_address

20、用户管理:crown:

1、用户分类

bash
1.用户分类,默认分三类 用户 UID 权限作用 管理员 0 最高权限类似皇帝(运维) 普通用户 999+ 只能管理自己相关的数据 类似普通人 /home/oldboy/ (开发 测试) 虚拟用户(傀儡用户) 1-999 不允许登录系统,运行程序的用户。所有的程序运行必须要拥有一个身份。 #注意如果我们自己创建用户可以指定UID号 #自己创建的普通账号UID可以设置为1-999之间没有使用过的UID 2.passwd文件每列的含义 [root@oldboy ~]#cat /etc/passwd|head -2 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 第一列: 用户名 第二列: 密码 第三列: uid 类似我们的身份证号 唯一的 不冲突的。 第四列: gid 类似小组的号码 第五列: 描述 说明 没啥用 第六列: 用户的家目录 第七列: 命令解释器 /bin/bash 系统默认的解释器/sbin/nologin 不允许登录系统

2、用户家目录模版

bash
/etc/skel 创建用户的过程: 1.用户执行创建用户命令useradd oldboy 2.系统会自动在/home下创建oldboy目录 /home/oldboy # oldboy的家目录 3.创建完成后会复制/etc/skel/下隐藏的文件到/home/oldboy目录 4.并且修改属主属组为oldboy

3、创建用户

bash
语法结构: useradd 用户名称 # 创建一个普通账号 一次只能创建一个账号 不支持创建多个账号 参数选项: -u # 指定UID号 -M # 不创建家目录 -s # 指定解释器 -g # 指定gid号 案例1.创建一个普通账号oldboy1 创建用户 [root@oldboy ~]#useradd oldboy1 过滤passwd文件中是否有oldboy1账号 [root@oldboy ~]#grep oldboy1 /etc/passwd oldboy1:x:1001:1001::/home/oldboy1:/bin/bash 查看用户是否存在id [root@oldboy ~]#id oldboy1 uid=1001(oldboy1) gid=1001(oldboy1) groups=1001(oldboy1) 案例2.给oldboy1设置一个密码 test123.com [root@oldboy ~]#passwd oldboy1 Changing password for user oldboy1. New password: Retype new password: passwd: all authentication tokens updated successfully. 通过xshell使用oldboy账号登录kylin系统 案例3.指定UID方式创建普通账号oldboy2 此种方法不建议使用。 [root@oldboy ~]#useradd -u888 oldboy3 [root@oldboy ~]#id oldboy3 uid=888(oldboy3) gid=1003(oldboy3) groups=1003(oldboy3) #查看oldboy2发现gid自动往后排.创建用户的时候uid和gid尽量相同。 案例4.创建一个uid和gid都为889的账号oldboy3 笔试题。 第一步: 先创建gid为889的小组 [root@oldboy ~]#groupadd -g889 oldboy4 第二步: 在指定uid和gid [root@oldboy ~]#useradd -u889 -g889 oldboy4 [root@oldboy ~]#id oldboy4 uid=889(oldboy4) gid=889(oldboy4) groups=889(oldboy4) 案例5.创建一个uid和gid为666的傀儡用户www 笔试题。 第一步: 先创建gid为666的小组www [root@oldboy ~]#groupadd -g666 www 第二步: 在指定uid和gid [root@oldboy ~]#useradd -u666 -g666 -M -s /sbin/nologin www 第三步:查看 id www -------------------kylin和centos创建用户过程------------------ 1.用户是否存在 [root@oldboy ~]#grep oldboy1 /etc/passwd [root@oldboy ~]#id oldboy1 2.创建普通用户(kylin centos默认创建普通用户)如果指定GID需要先创建组 [root@oldboy ~]#groupadd -g777 oldboy4 [root@oldboy ~]#useradd -u777 -g777 oldboy4 3.测试账号 远程登录 -------------------ubt创建用户--------------------------------- ubt默认创建的是傀儡用户 oldboy@oldboy:~$ sudo su - # 切换到管理员 [sudo] password for oldboy: # 输入oldboy 普通用户的密码 1 root@oldboy:~# id oldboy1 id: ‘oldboy1’: no such user root@oldboy:~# useradd oldboy1 root@oldboy:~# su - oldboy1 su: warning: cannot change directory to /home/oldboy1: No such file or directory 创建普通账号需要使用参数 ubt参数选项: -u # uid -g # gid -m # 创建家目录 -s # 指定解释器 root@oldboy:~# useradd -m -s /bin/bash oldboy1

4、删除用户

bash
#centos kylin ubt相同的 userdel -r 用户名

5、修改用户

bash
usermod # 了解 -u -g -s -c 1.可以登录的普通账号 2.运行程序的傀儡账号

6、设置用户密码

bash
1.交互式 kylin centos ubt 语法格式: passwd # 直接回车 修改当前登录用户密码 passwd oldboy # 修改指定用户的密码 案例1.修改oldboy用户密码为test123.com kylin系统设置密码要求复杂度 [root@oldboy ~]#passwd oldboy Changing password for user oldboy. New password: # test123.com Retype new password: #test123.com passwd: all authentication tokens updated successfully. 案例2.ubt设置密码 可以为简单的 root@oldboy:~# passwd oldboy1 New password: Retype new password: passwd: password updated successfully 2.非交互式设置密码 #centos和kylin系统 echo 密码|passwd --stdin 用户名 [root@oldboy ~]#echo "hehe123.com"|passwd --stdin oldboy Changing password for user oldboy. passwd: all authentication tokens updated successfully. #ubt非交互式设置密码 echo 用户名:密码|chpasswd root@oldboy:~# echo oldboy1:3|chpasswd

7、知识点小结

bash
awk重点: 1.awk取行 awk 'NR==3' file awk 'NR>3' file # 取出大于3的行 awk 'NR<4' file # 取出小于4的行 != # 不等于 && # 并且 || # 或者 2.awk取列 awk '{print $1}' file # 取出文件的第一列 awk '{print $1,$2}' file # 表示以空格分隔 awk '{print $NF}' file # 输出文件的最后一列 awk '{print $(NF-1)}' file # 输出倒数第2列 指定分隔符 awk -F: '{print $1}' file awk -F ":" '{print $1}' file awk -F ":/" awk -F ":|/""[:/]" 任意单个 或者的意思 awk -F "[:/]+" 3.awk模糊过滤 awk '/字符串/' file awk '/^r/' file awk '//,//' file # 匹配日志的时间段 4.模式+动作 awk 'NR==3{print $3}' file awk 'NR>5&&NR<10{print $NF}' file awk '/root|adm/{print $1}' file 用户管理: 1.passwd文件每列的含义 2./etc/skel/家目录的模版 3.创建用户 -u # uid -g # gid -m # 创建家目录 ubt -M # 不创建家目录 -s # 指定解释器 /bin/bash /sbin/nologin centos kylin创建普通用户 指定组 groupadd -g666 oldboy useradd -u666 -g666 oldboy ubt系统创建普通账号指定gid groupadd -g888 oldboy useradd -u888 -g888 -m -s /bin/bash oldboy centos kylin ubt创建虚拟用户 groupadd -g777 oldboy1 useradd -u777 -g777 -M -s /sbin/nologin oldboy1 4.删除用户 注意ubt不要删除oldboy用户 userdel -r oldboy1 5.设置密码 方法1 交互式 passwd 用户名 方法2 非交互式 kylin centos: echo test123.com|passwd --stdin 用户名 ubt: echo oldboy:密码|chpasswd

8、切换用户

bash
如何用用户登录操作系统 1.直接登录 2.远程登录 xshell 3.用户间切换 语法结构: su - 用户名称 # - 更新环境变量 普通用户切换到root账号 # 需要root的密码 普通用户切换到普通用户 # 需要切换到普通账号的密码 root管理员切换到普通用户 # 不需要密码 皇帝 案例1.oldboy1账号远程登录,使用su切换到root账号测试 [root@oldboy ~]#su - oldboy Last login: Wed Mar 19 09:09:58 CST 2025 on pts/0 [oldboy@oldboy ~]#su - root Password: Last login: Wed Mar 19 08:14:05 CST 2025 from 10.0.0.1 on pts/0 Last failed login: Wed Mar 19 09:10:10 CST 2025 on pts/0 There was 1 failed login attempt since the last successful login. 案例2.root账号切换到普通账号(不需要普通账号的密码,所以普通账号不设置密码也可以切换过去) [root@oldboy ~]#su - oldboy Last login: Wed Mar 19 13:00:42 CST 2025 on pts/0 [oldboy@oldboy ~]# 案例3.普通账号切换到普通账号 需要密码 [oldboy@oldboy ~]#su - oldboy1 Password: #需要输入oldboy1的密码:Sdms2023 Last failed login: Wed Mar 19 12:58:24 CST 2025 on pts/0 There was 1 failed login attempt since the last successful login. su: warning: cannot change directory to /home/oldboy1: Permission denied -bash: /home/oldboy1/.bash_profile: Permission denied

9、用户密码管理

bash
1.设置密要求复杂度,禁止弱口令 [root@oldboy ~]#echo "I?am.]old'[boUy#ed$u.c_om"|passwd --stdin oldboy2 2.密码管理 链接地址: www.keepass.info

10、sudo 提权

bash
作用: 让普通用户执行命令拥有root的权限,类似皇帝下发尚方宝剑 黄马褂 免死金牌 企业中: 除了运维 其他岗位 开发 测试没有root的权限 [oldboy@oldboy ~]#cat /var/log/messages cat: /var/log/messages: Permission denied 1.查看oldboy拥有的sudo权限 [oldboy@oldboy ~]#sudo - l [sudo] password for oldboy: #输入oldboy的密码 oldboy is not in the sudoers file. This incident will be reported. 2.使用root账号给oldboy1用户授权cat 授权: visudo ======== vim /etc/sudoers 一、# 拥有语法检测功能或者直接vim编辑/etc/sudoers [root@oldboy ~]#visudo 二、#看一下cat的路径 [root@oldboy ~]#which cat /usr/bin/cat 三、复制命令路径到visudo的101行粘贴进去

image-20250319153748602

bash
四、查看 [root@oldboy ~]#grep oldboy /etc/sudoers oldboy ALL=(ALL) /usr/bin/cat 3.回到oldboy1账号查询sudo权限 [oldboy@oldboy ~]#sudo -l [sudo] password for oldboy: #需要输入oldboy的密码:Sdms2022 Matching Defaults entries for oldboy on oldboy: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin User oldboy may run the following commands on oldboy: (ALL) /usr/bin/cat # 当前拥有了cat的权限 4.使用sudo提权后的cat查看日志 [oldboy@oldboy ~]#cat /var/log/messages cat: /var/log/messages: Permission denied 5.用sudo提权才能查看 [oldboy@oldboy ~]#sudo cat /var/log/messages |head Feb 26 17:18:37 oldboy kernel: [ 0.000000] Linux version 4.19.90-52.22.v2207.ky10.x86_64 (KYLINSOFT@COMPILE.MACHINE) (gcc version 7.3.0 (GCC)) #1 SMP Tue Mar 14 12:19:10 CST 2023 Feb 26 17:18:37 oldboy kernel: [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-4.19.90-52.22.v2207.ky10.x86_64 root=/dev/mapper/klas-root ro resume=/dev/mapper/klas-swap rd.lvm.lv=klas/root rd.lvm.lv=klas/swap rhgb quiet crashkernel=1024M,high audit=0 Feb 26 17:18:37 oldboy kernel: [ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' 授权多个命令: #授权前执行touch命令 [oldboy@oldboy ~]#sudo touch /opt/1.txt Sorry, user oldboy is not allowed to execute '/usr/bin/touch /opt/1.txt' as root on oldboy. #授权 [root@oldboy ~]#visudo root ALL=(ALL) ALL oldboy ALL=(ALL) /usr/bin/cat,/usr/bin/touch [root@oldboy ~]#grep oldboy /etc/sudoers oldboy ALL=(ALL) /usr/bin/cat,/usr/bin/touch #授权后执行touch命令 [oldboy@oldboy ~]#sudo touch /opt/111111111111111111 [oldboy@oldboy ~]#ll /opt total 24 -rw-r--r-- 1 root root 0 Mar 14 15:53 1 -rw-r--r-- 1 root root 0 Mar 19 14:09 111111111111111111 #运维人员: 给运维设置ALL的权限,不需要输入普通用户的密码 [root@oldboy ~]#grep oldboy /etc/sudoers oldboy1 ALL=(ALL) NOPASSWD: ALL #授权的命令进行取反,不允许cat跟sudoers [root@oldboy ~]#grep oldboy /etc/sudoers oldboy ALL=(ALL) ALL,!/usr/bin/cat,!/usr/bin/touch [oldboy@oldboy ~]#sudo mkdir -p /opt/0319 [oldboy@oldboy ~]#sudo ls -l /opt/0319/ total 0 [oldboy@oldboy ~]#ls -l /opt/ total 24 drwxr-xr-x 2 root root 6 Mar 19 14:21 0319 [oldboy@oldboy ~]#sudo touch /opt/111111111111111111 [sudo] password for oldboy: Sorry, user oldboy is not allowed to execute '/usr/bin/touch /opt/111111111111111111' as root on oldboy.

21、用户相关命令:crown:

bash
1.useradd 2.userdel 3.groupadd 4.id oldboy 5.chown 语法结构: chown oldboy.oldboy file 案例1.修改1.txt文件属主属组为oldboy [root@oldboy ~]#chown oldboy.oldboy 1.txt [root@oldboy ~]#ll total 24 -rw-r--r-- 1 oldboy oldboy 6 Mar 19 14:49 1.txt 案例2.修改属主或者属组 #修改属主 [root@oldboy ~]#chown oldboy 2.txt [root@oldboy ~]#ll total 20 -rw-r--r-- 1 oldboy root 10 Mar 19 14:49 2.txt #修改属组 [root@oldboy ~]#chown .oldboy 2.txt [root@oldboy ~]#ll total 20 -rw-r--r-- 1 oldboy oldboy 10 Mar 19 14:49 2.txt 案例3.递归授权目录及目录下所有文件属主属组oldboy [root@oldboy ~]#chown -R oldboy.oldboy oldboy/ [root@oldboy ~]#ll drwxr-xr-x 2 oldboy oldboy 32 Mar 19 15:16 oldboy [root@oldboy ~]#cd oldboy/ [root@oldboy ~/oldboy]#ll total 0 -rw-r--r-- 1 oldboy oldboy 0 Mar 19 15:15 1.txt -rw-r--r-- 1 oldboy oldboy 0 Mar 19 15:16 2.txt last# 辅助排查系统安全问题13:33 - 14:53 (01:20),13:33登录,14:53退出,呆了1小时20分钟 [root@oldboy ~]#last root pts/0 10.0.0.1 Wed Mar 19 14:57 still logged in root pts/1 10.0.0.1 Wed Mar 19 13:33 - 14:53 (01:20) root pts/0 10.0.0.1 Wed Mar 19 08:14 - 14:53 (06:39) reboot system boot 4.19.90-52.22.v2 Wed Mar 19 08:11 still running root pts/1 10.0.0.1 Tue Mar 18 13:35 - crash (18:35) root pts/0 10.0.0.1 Tue Mar 18 08:08 - 15:37 (07:28) 查看自己出网的公网IP地址 1.windows查看 百度 输入ip 2.linux系统查看 [root@oldboy ~]#curl cip.cc IP : 112.36.10.221 地址 : 中国 山东 滨州 运营商 : 移动 数据二 : 中国山东滨州 | 移动 数据三 : 中国山东省滨州市 | 移动 URL : http://www.cip.cc/112.36.10.221 #辅助排查系统安全命令 [root@oldboy ~]#lastlog Username Port From Latest root pts/0 10.0.0.1 Wed Mar 19 14:57:50 +0800 2025 bin **Never logged in** daemon **Never logged in**

1 用户重点总结

bash
1.用户分类 UID 2./etc/passwd 每列的含义 3./etc/skel/ 了解 4.创建用户 useradd -u -g -s -m -M groupadd -g 普通用户 傀儡用户 id 用户名 # 查看用户是否存在 5.删除用户 userdel -r 用户名称 6.设置密码 passwd 用户名 echo 11|passwd --stdin xx ubt: echo 用户名:密码|chpasswd 7.切换用户 su - 用户名 8.修改文件属主属组 chown -R www.www /data/ 9.sudo提权(练习 如何提权限,提权后普通账号如何使用) 10.md5sum(练习 笔记)

22、MD5 校验

bash
将数字或者字符串生成固定的哈希值 [oldboy@oldboy ~]#echo 1|md5sum b026324c6904b2a9cb4b88d6d61c81d1 - [oldboy@oldboy ~]#echo 2|md5sum 26ab0db90d72e28ad0ba1e22ee510510 - 案例1.Md5可以防止文件被篡改 第一步: 对文件生成一个哈希值 [oldboy@oldboy ~]#echo abb|md5sum 53f0b0c7028cc2ad7ea6df6x337368714 - [oldboy@oldboy ~]#cat 1.txt|md5sum 53f0b0c7028cc2ad7ea6df6337368714 - 第二步: 修改文件内容 [oldboy@oldboy ~]#cat 1.txt abc 第三步: 重新Md5校验发现结果变化 [oldboy@oldboy ~]#md5sum 1.txt 0bee89b07a248e27c83fc3d5951213c1 1.txt #将保存abc结果的文件1.txt保留md5log里面: [oldboy@oldboy ~]#md5sum 1.txt >md5.log [oldboy@oldboy ~]#cat md5.log 0bee89b07a248e27c83fc3d5951213c1 1.txt [oldboy@oldboy ~]#md5sum -c md5.log 1.txt: OK #如果修改1.txt的内容 [oldboy@oldboy ~]#echo abc|md5sum 0bee89b07a248e27c83fc3d5951213c1 - [oldboy@oldboy ~]#echo xxx >1.txt [oldboy@oldboy ~]#cat 1.txt xxx #再次进行比对 [oldboy@oldboy ~]#md5sum -c md5.log 1.txt: FAILED md5sum: WARNING: 1 computed checksum did NOT match #注意绝对路径的概念 要放在绝对路径下,这样就可以从绝对路径下找到1.txt文件进行md5校验,如果不是绝对路径,那么如果在/opt目录下执行校验,那么opt下没有1.txt文件就显示找不到文件 案例2.如果有多个文件怎么做MD5校验 [root@oldboy ~]#md5sum /root/*.txt 59f0a395c37b00cfa495eb72d88d509b /root/1.txt 99e4808594dedc4ac0a7914a0db3e1de /root/2.txt 0a8a3b234cd2ebae03601070ea87dde5 /root/3.txt 6cb11e73866b94c41c4d0c638b79a166 /root/4.txt 988fcdeaed602bed3d8f4befd1ba33fe /root/5.txt [root@oldboy ~]#md5sum /root/*.txt>md5.log [root@oldboy ~]#cat md5.log 59f0a395c37b00cfa495eb72d88d509b /root/1.txt 99e4808594dedc4ac0a7914a0db3e1de /root/2.txt 0a8a3b234cd2ebae03601070ea87dde5 /root/3.txt 6cb11e73866b94c41c4d0c638b79a166 /root/4.txt 988fcdeaed602bed3d8f4befd1ba33fe /root/5.txt [root@oldboy ~]#md5sum -c md5.log /root/1.txt: OK /root/2.txt: OK /root/3.txt: OK /root/4.txt: OK /root/5.txt: OK #或者使用find命令 [root@oldboy ~]#find /root/*.txt -type f|xargs md5sum 59f0a395c37b00cfa495eb72d88d509b /root/1.txt 99e4808594dedc4ac0a7914a0db3e1de /root/2.txt 0a8a3b234cd2ebae03601070ea87dde5 /root/3.txt 6cb11e73866b94c41c4d0c638b79a166 /root/4.txt 988fcdeaed602bed3d8f4befd1ba33fe /root/5.txt [root@oldboy ~]#find /root/*.txt -type f|xargs md5sum >md5.log [root@oldboy ~]#cat md5.log 59f0a395c37b00cfa495eb72d88d509b /root/1.txt 99e4808594dedc4ac0a7914a0db3e1de /root/2.txt 0a8a3b234cd2ebae03601070ea87dde5 /root/3.txt 6cb11e73866b94c41c4d0c638b79a166 /root/4.txt 988fcdeaed602bed3d8f4befd1ba33fe /root/5.txt [root@oldboy ~]#md5sum -c md5.log /root/1.txt: OK /root/2.txt: OK /root/3.txt: OK /root/4.txt: OK /root/5.txt: OK #模拟被篡改 [root@oldboy ~]#echo 11111 >1.txt [root@oldboy ~]#echo 111asda11 >2.txt [root@oldboy ~]#md5sum -c md5.log /root/1.txt: FAILED /root/2.txt: FAILED /root/3.txt: OK /root/4.txt: OK /root/5.txt: OK md5sum: WARNING: 2 computed checksums did NOT match

23、文件权限:crown:

1、如何知道当前用户对于文件的权限是什么

bash
[oldboy@oldboy ~]#ll /etc/passwd -rw-r--r-- 1 root root 1978 Mar 19 12:57 /etc/passwd 1.你是谁(当前登录的系统用户是什么) 2.当前的身份和文件的关系是什么 # 对于以上文件oldboy1属于陌生人 3.通过关系找到对应的权限 # 对应的权限为九位权限位的后三位 r-- 九位权限位置: 前三位: 属主 中三位: 属组 后三位: 陌生人 测试是否可以查看: [oldboy@oldboy ~]#cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

2、修改文件权限

bash
方法1: 使用ugo方式授权,ugo表示权限的三个位置 u 表示的是属主 g 表示的是属组 o 表示是陌生人 r # 可读 w # 可写 x # 可执行 脚本才用执行权限 文本中是命令。 语法结构: chmod u+w file # 授权文件可写的权限 chmod u-w file # 去除w权限 chmod u=w file # 先清空后赋值 chmod ugo+ ======= chmod a+ 案例1.给属主一个x权限 [root@oldboy ~]#ll total 0 -rwxr--r-- 1 root root 0 Mar 19 15:51 1.txt 案例2.去掉属主的x权限 [root@oldboy ~]#chmod u-x 1.txt [root@oldboy ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 19 15:51 1.txt 案例3.授权属组w权限 [root@oldboy ~]#chmod g+w 1.txt [root@oldboy ~]#ll total 0 -rw-rw-r-- 1 root root 0 Mar 19 15:51 1.txt 案例4.属主属组去掉w权限 [root@oldboy ~]#chmod ug-w 1.txt [root@oldboy ~]#ll total 0 -r--r--r-- 1 root root 0 Mar 19 15:51 1.txt 案例6.给所有的位置增加w权限 [root@oldboy ~]#chmod ugo+w 1.txt [root@oldboy ~]#ll total 0 -rw-rw-rw- 1 root root 0 Mar 19 15:51 1.txt [root@oldboy ~]#chmod a-w 1.txt [root@oldboy ~]#ll total 0 -r--r--r-- 1 root root 0 Mar 19 15:51 1.txt [root@oldboy ~]#chmod a+w 1.txt [root@oldboy ~]#ll total 0 -rw-rw-rw- 1 root root 0 Mar 19 15:51 1.txt 案例7.啥都加 默认只给属主增加w权限 [root@oldboy ~]#chmod +w 1.txt [root@oldboy ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 19 15:51 1.txt #x和r默认可以对所有位置授权 [root@oldboy ~]#chmod +r 1.txt [root@oldboy ~]#ll total 0 -rwxr-xr-x 1 root root 0 Mar 19 15:51 1.txt [root@oldboy ~]#chmod -x 1.txt [root@oldboy ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 19 15:51 1.txt 方法2: 使用数字方式授权 r 4 w 2 x 1 [root@oldboy ~]#ll total 0 -rw-r--r-- 1 root root 0 Mar 19 15:51 1.txt -rw-r--r-- 每个三位相加得到权限: 644 -r-xr-xr-x 每个三位相加得到权限: 555 案例1.修改文件权限为755 [root@oldboy ~]#chmod 755 1.txt [root@oldboy ~]#ll total 0 -rwxr-xr-x 1 root root 0 Mar 19 15:51 1.txt 案例2.修改权限为600权限 [root@oldboy ~]#chmod 600 1.txt [root@oldboy ~]#ll total 0 -rw------- 1 root root 0 Mar 19 15:51 1.txt 案例3.授权1.txt为rw-r-xrw- 权限 [root@oldboy ~]#chmod 656 1.txt [root@oldboy ~]#ll total 0 -rw-r-xrw- 1 root root 0 Mar 19 15:51 1.txt

3、rwx 对于文件的作用

bash
#创建文件默认权限是644 #测试读的权限,root执行,只给1.txt读的权限 [root@oldboy /oldboy]#chmod u=r 1.txt [root@oldboy /oldboy]#ll total 4 -r--r--r-- 1 oldboy oldboy 4 Mar 19 23:14 1.txt #oldboy用户执行,可以看到1.txt里面的内容,有读的权限 [oldboy1@oldboy /oldboy]#ll total 4 -r--r--r-- 1 oldboy oldboy 4 Mar 19 23:14 1.txt [oldboy1@oldboy /oldboy]#cat 1.txt pwd #写入内容,显示权限被拒接 [oldboy1@oldboy /oldboy]#echo 222>>1.txt -bash: 1.txt: Permission denied #r权限对于文件只有可读的权限,没有其他权限,可以强制写入 #即使root用户没有写入权限,依旧可以写入内容,因为它是皇帝 [root@oldboy /oldboy]#ll total 4 -r--r--r-- 1 oldboy oldboy 8 Mar 19 23:29 1.txt [root@oldboy /oldboy]#echo "222">> 1.txt [root@oldboy /oldboy]#cat 1.txt pwd 222 #测试写的权限,root执行,只给1.txt写的权限 [root@oldboy /oldboy]#chmod u=w 1.txt [root@oldboy /oldboy]#ll total 4 --w-r--r-- 1 oldboy oldboy 19 Mar 19 23:45 1.txt #oldboy用户能写入不能查看 [oldboy@oldboy /oldboy]#echo "zhongguo" >>1.txt [oldboy@oldboy /oldboy]#cat 1.txt cat: 1.txt: Permission denied #w权限啥都不能干,只能echo > >> 但是没有意义,因为你无法查看里面的内容,所以echo什么内容没意义,如果vim进去看不到之前的内容,如果随意添加强制保存的话会把之前的内容给清空 #测试执行的权限,root执行,只给1.txt执行的权限 [root@oldboy /oldboy]#chmod u=x 1.txt #oldboy用户执行 [oldboy@oldboy /oldboy]#cat 1.txt cat: 1.txt: Permission denied [oldboy@oldboy /oldboy]#./1.txt bash: ./1.txt: Permission denied [oldboy@oldboy /oldboy]#echo "aaa">>1.txt -bash: 1.txt: Permission denied #x权限啥都不能干。 对于文件来讲:r是查看内容,w是编辑内容,x是执行 文件可读写必须拥有rw权限配合 文件可以执行必须拥有rx权限配合 对于脚本来讲最高权限是rwx:777 对于文件(存放字符串)最高的权限是rw-rw-rw:666

4、rwx 对于目录的含义

bash
#创建目录默认权限是755 [root@oldboy /oldboy]#chown oldboy.oldboy /oldboy/ [root@oldboy /oldboy]#ll -d /oldboy/ drwxr-xr-x 2 root root 45 Mar 19 23:52 /oldboy/ #测试目录的r权限 [root@oldboy /oldboy]#chmod =r /oldboy/ [root@oldboy /oldboy]#ll -d /oldboy/ dr--r--r-- 2 oldboy oldboy 45 Mar 19 23:52 /oldboy/ #用普通用户进不去/oldboy目录,r权限对于目录啥用都没有。只能看到文件名称 [oldboy@oldboy /]#cd /oldboy/ -bash: cd: /oldboy/: Permission denied [oldboy@oldboy /]#ll /oldboy/ ls: cannot access '/oldboy/2.txt': Permission denied ls: cannot access '/oldboy/3.txt': Permission denied ls: cannot access '/oldboy/1.txt': Permission denied total 0 -????????? ? ? ? ? ? 1.txt -????????? ? ? ? ? ? 2.txt -????????? ? ? ? ? ? 3.txt #测试目录w权限,w权限对于目录啥用都没有 [root@oldboy /oldboy]#chmod u=w /oldboy/ [root@oldboy /oldboy]#ll -d /oldboy/ d-w-r--r-- 2 oldboy oldboy 45 Mar 19 23:52 /oldboy/ #oldboy用户执行 [oldboy@oldboy /]#cd /oldboy/ -bash: cd: /oldboy/: Permission denied [oldboy@oldboy /]#ll /oldboy/ ls: cannot open directory '/oldboy/': Permission denied #测试目录的x权限,x权限只可以进入目录,但是其他权限没有 [root@oldboy /oldboy]#chmod u=x /oldboy/ [root@oldboy /oldboy]#ll -d /oldboy/ d--xr--r-- 2 oldboy oldboy 45 Mar 19 23:52 /oldboy/ #oldboy用户执行 [oldboy@oldboy /]#cd /oldboy/ [oldboy@oldboy /oldboy]#ll ls: cannot open directory '.': Permission denied 小结: rwx对于目录的作用,x是进入目录,w是增删改,r是查看文件属性信息 想要进入目录,并且可以查看文件的内容,必须有r-x权限 想要进入目录,可以增删改查,必须有rwx权限 注意事项: 如果要cp /opt/passwd到/oldboy目录下,要保证oldboy目录有rwx权限,/opt/passwd目录有rx权限能查看内容就够了 如果要mv /opt/passwd到/oldboy目录下,要保证oldboy目录有rwx权限,/opt/passwd目录必须有rwx权限

img

bash
1.能不能删除看上级目录是否有rwx 2.通过当前登录的用户 找出对应上级目录的权限位

5、umask

bash
umask作用控制默认创建目录和文件的权限 # 了解 系统创建目录默认权限 755 系统创建文件默认权限 644 [oldboy@oldboy /oldboy]#umask 0022 目录最高权限减去umask#默认创建目录的权限 777-022=755 文件的最高权限减去umask#默认创建文件的权限,普通文件不需要执行权限 666-022=644 测试umask值,临时修改 [root@oldboy ~]#umask 044 [root@oldboy ~]#umask 0044 创建目录和文件 777-044=733 目录权限 666-044=622 文件权限 [root@oldboy ~]#ll total 0 #733 drwx-wx-wx 2 root root 6 Mar 20 10:06 oldboy #622 -rw--w--w- 1 root root 0 Mar 20 10:06 1.txt 特殊地址: 如果umask值为有奇数位,则文件创建后权限需要加1,目录不需要加 [root@oldboy ~]#umask 032 [root@oldboy ~]#mkdir oldboy [root@oldboy ~]#ll total 0 #745 drwxr--r-x 2 root root 6 Mar 20 10:07 oldboy [root@oldboy ~]#touch 1.txt [root@oldboy ~]#ll total 0 #644,666-032=634,因为032的3是奇数位,所以要+1 -rw-r--r-- 1 root root 0 Mar 20 10:07 1.txt

6、隐藏权限

bash
#笔记 a # 只能追加内容到文件中 不能删除不能改名 i # 啥都不能干 1.查看隐藏权限 [root@oldboy /oldboy]#lsattr pass.txt -------------------- pass.txt 2.设置隐藏权限a [root@oldboy /oldboy]#chattr +a pass.txt [root@oldboy /oldboy]#lsattr pass.txt -----a-------------- pass.txt 3.测试文件,显示操作不允许 [root@oldboy /oldboy]#rm -rf pass.txt rm: cannot remove 'pass.txt': Operation not permitted [root@oldboy /oldboy]#mv pass.txt pass.txttxt mv: cannot move 'pass.txt' to 'pass.txttxt': Operation not permitted [root@oldboy /oldboy]#echo "111"> pass.txt -bash: pass.txt: Operation not permitted #只能进行追加 [root@oldboy /oldboy]#echo "111">>pass.txt [root@oldboy /oldboy]#cat pass.txt mmm 111 4.取消隐藏权限a [root@oldboy /oldboy]#chattr -a pass.txt [root@oldboy /oldboy]#lsattr pass.txt -------------------- pass.txt 1.设置隐藏权限i [root@oldboy /oldboy]#chattr +i pass.txt [root@oldboy /oldboy]#lsattr pass.txt ----i--------------- pass.txt [root@oldboy /oldboy]#mv pass.txt pass mv: cannot move 'pass.txt' to 'pass': Operation not permitted [root@oldboy /oldboy]#rm -rf pass.txt rm: cannot remove 'pass.txt': Operation not permitted [root@oldboy /oldboy]#echo 'xxx'>> pass.txt -bash: pass.txt: Operation not permitted 2.[root@oldboy /oldboy]#chattr -i pass.txt [root@oldboy /oldboy]#lsattr pass.txt -------------------- pass.txt #企业中可能出现没有隐藏权限但是无法修改文件,因为有第三方安全软件控制。

7、特殊权限

bash
#了解 1.suid # 用户执行命令的时候拥有命令属主的权限。 #用户没有在etc目录下创建文件的权限,如果想要创建文件,一、切换到管理员,二、加w权限,三、sudo提权,四、suid [oldboy@oldboy /oldboy]#touch /etc/11 touch: cannot touch '/etc/11': Permission denied #查看touch路径 [oldboy@oldboy /oldboy]#which touch /usr/bin/touch #给usr/bin/touch的属主加上s权限 [root@oldboy /oldboy]#chmod u+s /usr/bin/touch [root@oldboy /oldboy]#ll /usr/bin/touch -rwsr-xr-x 1 root root 96512 Apr 21 2022 /usr/bin/touch [root@oldboy /oldboy]#stat /usr/bin/touch File: ‘/usr/bin/touch’ Size: 96512 Blocks: 192 IO Block: 4096 regular file Device: fd00h/64768d Inode: 67391053 Links: 1 Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2025-03-19 08:12:17.247057096 +0800 Modify: 2022-04-21 15:20:38.000000000 +0800 Change: 2025-03-20 02:03:25.727193600 +0800 Birth: - #oldboy就可以创建了,但是属主还是root [oldboy@oldboy /oldboy]#touch /etc/11 [oldboy@oldboy /oldboy]#ll /etc/11 -rw-r--r-- 1 root root 0 Mar 20 02:07 /etc/11 #去掉s权限 [root@oldboy /oldboy]#chmod u-s /usr/bin/touch 2.sgid # 用户执行命令拥有属组的权限 3.粘滞位,只能管理自己的 [root@oldboy ~]##创建目录 让所有的用户都可以在此目录下创建文件,o+wrx权限 [root@oldboy /data]##第二个需求 只能管理自己的文件 无法删除其他用户的文件 [root@oldboy /oldboy]#chmod 1777 /oldboy/ [root@oldboy /oldboy]#stat /oldboy/ File: ‘/oldboy/’ Size: 22 Blocks: 0 IO Block: 4096 directory Device: fd00h/64768d Inode: 871838 Links: 2 Access: (1777/drwxrwxrwt) Uid: ( 1000/ oldboy) Gid: ( 1000/ oldboy) Access: 2025-03-20 01:20:03.395800467 +0800 Modify: 2025-03-20 01:20:01.800043563 +0800 Change: 2025-03-20 02:21:24.862667214 +0800 Birth: - [root@oldboy /oldboy]#ll -d /oldboy/ drwxrwxrwt 2 oldboy oldboy 22 Mar 20 01:20 /oldboy/

24、定时任务:crown:

bash
1.数据统计 2.时间同步 3.定时打包备份,打包吃资源,cpu占用过多,所以在业务低谷期 什么时间备份: 业务低谷期 通过监控,不能影响业务,减少磁盘IO 定时任务状态: [root@oldboy /oldboy]#systemctl status cron ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2025-03-19 08:12:20 CST; 18h ago Main PID: 1065 (crond) Tasks: 1 Memory: 4.3M CGroup: /system.slice/crond.service └─1065 /usr/sbin/crond -n Mar 19 17:01:01 oldboy CROND[5519]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 18:01:01 oldboy CROND[5806]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 19:01:01 oldboy CROND[5988]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 20:01:01 oldboy CROND[6170]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 21:01:01 oldboy CROND[6345]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 22:01:01 oldboy CROND[6518]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 23:01:01 oldboy CROND[6711]: (root) CMD (run-parts /etc/cron.hourly) Mar 20 00:01:01 oldboy CROND[7480]: (root) CMD (run-parts /etc/cron.hourly) Mar 20 01:01:01 oldboy CROND[7876]: (root) CMD (run-parts /etc/cron.hourly) Mar 20 02:01:01 oldboy CROND[8200]: (root) CMD (run-parts /etc/cron.hourly) linux定时任务配置方式有两种 1.系统定时任务 2.用户定时任务

image-20250320193925340

1、系统定时任务

bash
[root@oldboy /oldboy]#cat /etc/crontab SHELL=/bin/bash # 解释器 PATH=/sbin:/bin:/usr/sbin:/usr/bin # PATH变量,在文件中自定义的 MAILTO=root # 邮件收件人 # For details see man 4 crontabs #语法结构 # Example of job definition: # .---------------- minute (0 - 59) # 分钟 # | .------------- hour (0 - 23) # 小时 晚上凌晨12点用0表示 (中午12点就是12表示) # | | .---------- 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 # 周几 (周日用0或者7示) # | | | | | # * * * * * user-name command to be executed 分 时 日 月 周 root 可执行命令 * # 表示每的含义,每1分钟都要执行,如果是1就是每小时的第1分钟执行一次,如果是5就是每小时的第5分钟执行一次 */5 # 表示间隔5分钟 1:03 按照整点计算下次执行时间1:05 1:10 1:15 5 * * * * # 表示每小时的第5分钟执行1次 , # 表示时间的间隔 - # 表示区间范围 案例1.每分钟执行输出一次姓名到/root/name.txt */1 * * * * root echo "zhang" >>/root/name.txt 案例2.每分钟执行输出一次姓名到/root/name.txt * * * * * root echo "zhang" >>/root/name.txt 案例3.每间隔15分钟进行一次时间同步 */15 * * * * root ntpdate ntp1.aliyun.com &>/dev/null 案例4.每天上午7点半执行一个命令,明天检查一下 30 07 * * * root mkdir -p /root/0321/zhangweixiang &>/dev/null 案例5.每天晚上凌晨12点执行备份动作将etc目录备份到/opt下 笔试题,前面如果是*,那就说明12点的每一分钟都要去执行 00 00 * * * root tar -zcf /root/pass.tar.gz /etc/passwd # 表示晚上12:00 准时执行定时任务 * 00 * * * root tar zcf /opt/etc.tar.gz /etc # 表示凌晨12.01 12.02 12..59都要执行一次 案例6.每天晚上10点和凌晨的3点各执行1次定时任务,前面如果是*,那就说明每一分钟都要去执行 00 22,03 * * * root touch /root/{1..3}.txt 案例7.每天上午7点-10点和下午的2-5点执行定时任务 00 7-10,14-17 * * * root tar zcf /opt/etc.tar.gz /etc 案例8.每分钟备份一次etc目录。按照时间命令`` $()相同 * * * * * root tar zcf /opt/`date +\%F_\%H:\%M:\%S`-etc.tar.gz /etc/
bash
#这个没执行,通过查看cat /var/log/cron文件,显示用户未知 Mar 20 20:27:01 oldboy crond[1065]: (tar) ERROR (getpwnam() failed - user unknown) Mar 20 20:28:01 oldboy crond[1065]: (tar) ERROR (getpwnam() failed - user unknown) Mar 20 20:29:01 oldboy crond[1065]: (tar) ERROR (getpwnam() failed - user unknown) #经过查看,确实没加root用户,加上后再次测试,已经执行了 [root@oldboy ~]#ll /opt total 5268 -rw-r--r-- 1 root root 5392043 Mar 20 20:32 2025-03-20_20:32:01-etc.tar.gz 案例9.创建以IP+主机名称+时间命名的目录 [root@oldboy ~]#echo `hostname`-`hostname -I|awk '{print $1'}`-date-`date +\%F_\%H:\%M:\%S` oldboy-10.0.0.200-date-2025-03-20_20:39:17 定时任务作业: -------------脚本-可以复用--------- 1.在/opt以IP地址 主机名称 时间命名的目录 * * * * * root tar -zcf 0321.tar.gz /etc/hosts /etc/passwd /opt/`hostname -I|awk '{print $1}'`-`hostname`-`date +\%F_\%H:\%M:\%S` 2.每天凌晨3:00打包压缩/etc/hosts /etc/passwd 打包上面创建好的目录下 [root@oldboy ~]#host=`hostname` [root@oldboy ~]#echo $host oldboy [root@oldboy ~]#Time=`date +%F-%H-%M-%S` [root@oldboy ~]#echo $Time 2025-03-21-12-01-55 [root@oldboy ~]#IP=`hostname -I|awk '{print $1}'` [root@oldboy ~]#echo $IP 10.0.0.200 [root@oldboy ~]#echo ${host}_${IP}_$Time oldboy_10.0.0.200_2025-03-21-12-01-55 [root@oldboy /server/scripts]#cat tar.sh #1.创建目录 host=`hostname` Time=`date +%F-%H-%M-%S` IP=`hostname -I|awk '{print $1}'` dir=/opt/${host}_${IP}_$Time mkdir $dir #2.打包重要的数据放到上面的目录 cd /etc tar zcf $dir/all.tar.gz passwd hosts 3.查找/opt下修改时间在7天前的文件删除 * * * * * root find /root -mtime +7|xargs rm -rf -------------定时任务--------------

2、定时任务注意事项

bash
定时任务日志文件: /var/log/cron 1.定时任务中不识别% 解决方法1.使用\ * * * * * root tar zcf /opt/`date +\%F-\%H-\%M-\%S`.tar.gz /etc/ 解决方法2.将命令写入到脚本中,然后定时任务调用脚本 [root@oldboy ~]#mkdir -p /server/scripts [root@oldboy ~]#cd /server/scripts #写脚本 [root@oldboy /server/scripts]#cat tar.sh tar zcf /opt/`date +%F-%H-%M-%S`.tar.gz /etc/ #定时任务执行脚本 * * * * * root sh /server/scripts/tar.sh 2.每个定时任务写上注释 #etc目录打包备份 * * * * * root sh /server/scripts/tar.sh 3.定时任务命令超过2条,则使用脚本代替 4.定时任务执行结果可以输入到文件中也可以定向到空 * * * * * root tar zcvf /opt/`date +%F-%H-%M-%S`.tar.gz /etc &>>/root/err.log #查看内容 [root@oldboy /server/scripts]#cat /opt/error.log tar: Removing leading `/' from member names * * * * * root tar zcvf /opt/`date +%F-%H-%M-%S`.tar.gz /etc &>/dev/null

3、普通用户定时任务

bash
配置方式两种: 配置方式1: crontab -e 编辑定时任务 实际编辑的/var/spool/cron/root # 语法检查功能 配置方式2: vim /var/spool/cron/root # 默认文件不存在、为空 案例1.配置每分钟输出姓名到1.txt #编辑 [root@oldboy ~]#crontab -e #查看配置的定时任务 [root@oldboy /server/scripts]#crontab -l * * * * * echo "oldboy" >> /root/1.txt [root@oldboy ~]#cat /var/spool/cron/root * * * * * echo "oldboy" >> /root/1.txt #查看结果 [root@oldboy ~]#cat 1.txt oldboy 系统定时任务和用户定时任务区别: 1.系统需要加执行的用户root * * * * * root echo oldboy >> oldboy.txt 2.用户定时任务不需要加root * * * * * echo oldboy >> oldboy.txt 3.用户定时任务默认识别的路径只有/bin/ /usr/bin #编辑 [root@oldboy ~]#crontab -l * * * * * ntpdate ntp1.aliyun.com &>>/root/ntp.log #没执行,下面日志显示,显示找不到命令,因为去bin/sh下面去找了 [root@oldboy ~]#cat /root/ntp.log /bin/sh: ntpdate: command not found /bin/sh: ntpdate: command not found #查看ntpdate路径 [root@oldboy ~]#which ntpdate /usr/sbin/ntpdate #重新定义PATH变量 [root@oldboy ~]#crontab -l PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin * * * * * ntpdate ntp1.aliyun.com &>>/root/ntp.log #成功了 [root@oldboy ~]#date Thu Mar 20 21:17:21 CST 2025 案例.第二天2.30执行1次定时任务,后面不在执行此定时任务。 30 02 * * * root ntpdate ntp1.aliyun.com &>/dev/null * * * * * root sed -i '/ntpdate/d' /etc/crontab

4、小结

bash
权限管理: 1.当前的用户对于某个文件的权限 2.授权命令 chmod ugo chmod 644 chmod -R # 递归是连同目录一起修改了权限 需求: 只修改oldboy目录下所有子目录下所有的普通文 件权限为600 [root@oldboy ~]#tree oldboy oldboy ├── 1.txt ├── 2.txt ├── 3.txt └── test ├── 1.log ├── 2.log └── 3.log 3.rwx对于文件的作用 4.rwx对于目录的作用 定时任务 系统定时任务/etc/crontab * * * * * 分 时 日 月 周 * 表示每的意思 */5 表示间隔的含义 , 表示时间间隔 5,10 - 表示区间范围 系统定时任务日志/var/log/cron /var/log/syslog 用户定时任务配置文件/var/spool/cron/root cront -e 编辑配置文件 cront -l 查看定时任务列表 注意事项: 1.2条命令以上最好写脚本 2.每条定时任务有注释 3.不识别的是%,可以用\ 也可以写到脚本中 4.用户的定时任务只识别的路径/bin /usr/bin 需要重新定义PATH变量

25、磁盘

1、磁盘分类

bash
磁盘类型: 磁盘类型: 存放数据的 大片 视频 学习资料 笔记本(500G 1T 2T) 机械磁盘: 里面做机械运动(类似于光驱转圈读取数据) 特点:慢、容量较大、重、价格低 固态磁盘: SAS接口、SATA接口 芯片存储数据 特点:读取速度快、成本较高 Nvme磁盘 笔记本接口 接口类型: 类似壶嘴 IDE 淘汰 SCSI 淘汰 SATA 笔记本(企业 内部测试 存储服务器) 速度慢:转速7.2K 10K SAS 企业级标配 转速:10K 15K(300G 600G 900G)

SATA:

image-20250321144650972

image-20250321144747751

SAS

image-20250321144907461

image-20250321145850002

2、Raid 磁盘阵列

bash
磁盘阵列 RAID卡 阵列卡 作用: 将多个磁盘逻辑的组合在一起 获得更大的容量 获得更高的性能 获得更好的安全性 RAID组合级别: raid 0: 具有最高的存储性能(磁盘容量不浪费,读写很快),这些磁盘的总和10*1TB raid 0, 要制作RAID 0至少要1块物理磁盘,不做raid不能安装系统 安全:任何一块硬盘损坏,所有的数据无法使用 raid 1: 镜像:损失50%的数据容量。例如2块1T的盘,做完RAID 1后容量为1T raid只能2块硬盘 Mirror不能提高存储性能。理论上写性能和单盘相差不大 raid 5: 需要至少3块,损失一块硬盘 6*600G 安全:最多可以损坏一块硬盘 性能:写入速度不快,读取Ok raid 10: 最少4块硬盘,增加硬盘必须是2的倍数;所有硬盘容量的一半 安全:最多损坏一半硬盘 性能:写入和读取 都很快 面试题: 说一下RAID 0 1 5 10的区别: RAID级别 需要几块盘 容量 安全 性能 使用场景 0 至少1 总和 不安全 读写最快 只要速度,不要求安全 1 只能2块 一半 安全可以坏一块 读写较慢 只要安全,不要速度 5 至少3 n-1块 可以损1块 0和1的折中 稳定型业务 10 至少4 一半 安全 读写较快 并发较高的业务/流量较高的业务 具体怎么组装raid?不通服务器组raid的方式不一样,进入bios方式也不同,根据服务器的raid文档进入到raid里面,选择要把哪几块盘组成raid几, 上面都有标明,然后根据流程,下一步下一步

3、磁盘分区 fdisk:crown:

bash
第一块磁盘: sda 第一个分区: sda1 第二个分区: sda2 第二块磁盘: sdb 第一个分区: sdb1 第二个分区: sdb2 第一个逻辑分区: sdb5 第三块磁盘: sdc 磁盘系统分区概念: 第一种分区方案: /boot # 系统引导程序 内核 / # 将剩余所有空间分配给/分区 第二种分区方案: /boot / swap # 当内存不够用的时候临时充当内存使用。 测试服务器 自己使用测试虚拟机 磁盘分区: 磁盘格式 MBR # 小于2T的磁盘 fdisk,最多只支持4个主分区,多的就是逻辑分区,主分区-扩展分区(包括逻辑分区,现在不怎么用了,速度慢) GPT格式# 大于2T的磁盘 parted

image-20250321153839860

image-20250321154142835

image-20250321154410356

bash
第一步: 将磁盘插入服务器中 (服务器支持热插拔 服务器运行中可以直接插拔 前提是没有数据读取和写入) 第二步: 重启虚拟机 [root@oldboy ~]#reboot 第三步: 查看磁盘信息 [root@oldboy ~]#fdisk -l Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x954862ae Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 2099199 2097152 1G 83 Linux /dev/sda2 2099200 104857599 102758400 49G 8e Linux LVM Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Disk model: VMware Virtual S 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 /dev/mapper/klas-root: 46.96 GiB, 50419728384 bytes, 98476032 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 /dev/mapper/klas-swap: 2.04 GiB, 2189426688 bytes, 4276224 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 第四步: 磁盘分区(购买的房子打隔断) [root@oldboy ~]#fdisk /dev/sdb Command (m for help): m # m 显示菜单 Help: d delete a partition # 删除分区 l list known partition types # 列出分区类型 n add a new partition # 添加分区 p print the partition table # 输出分区表 m print this menu # 显示菜单 Save & Exit w write table to disk and exit # 保存并退出 q quit without saving changes # 退出不保存 Command (m for help): n # 1.创建一个新的分区 Partition type p primary (0 primary, 0 extended, 4 free) # 主分区 e extended (container for logical partitions) # 扩展分区 Select (default p): p # 2.使用默认的主分区 Partition number (1-4, default 1): # 3.分区编号 First sector (2048-209715199, default 2048): # 4.开始的大小 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715199, default 209715199): +10G # 5.大小 Created a new partition 1 of type 'Linux' and of size 10 GiB. Command (m for help): p # 6.查看分区表 Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x478fcf34 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux # 第一个分区 Command (m for help): w # 7.保存分区信息 The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. ------------------省略其他分区创建过程-------------------- Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux /dev/sdb2 20973568 41945087 20971520 10G 83 Linux /dev/sdb3 41945088 62916607 20971520 10G 83 Linux /dev/sdb4 62916608 83888127 20971520 10G 83 Linux #创建四个主分区的情况下无法创建新的分区, 要创建更多的分区,首先用扩展分区替换主分区。 Command (m for help): n To create more partitions, first replace a primary with an extended partition. #删除第4个分区 Command (m for help): d Partition number (1-4, default 4): 4 Partition 4 has been deleted. Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux /dev/sdb2 20973568 41945087 20971520 10G 83 Linux /dev/sdb3 41945088 62916607 20971520 10G 83 Linux Command (m for help): n Partition type p primary (3 primary, 0 extended, 1 free) e extended (container for logical partitions) Select (default e): e #创建扩展分区 Selected partition 4 First sector (62916608-209715199, default 62916608): Last sector, +/-sectors or +/-size{K,M,G,T,P} (62916608-209715199, default 209715199): Created a new partition 4 of type 'Extended' and of size 70 GiB. Command (m for help): p Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x478fcf34 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux /dev/sdb2 20973568 41945087 20971520 10G 83 Linux /dev/sdb3 41945088 62916607 20971520 10G 83 Linux /dev/sdb4 62916608 209715199 146798592 70G 5 Extended Command (m for help): w # 保存并退出 #新增逻辑分区 Command (m for help): n All primary partitions are in use. Adding logical partition 5 First sector (62918656-209715199, default 62918656): Last sector, +/-sectors or +/-size{K,M,G,T,P} (62918656-209715199, default 209715199): Created a new partition 5 of type 'Linux' and of size 70 GiB. Command (m for help): p Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x478fcf34 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux /dev/sdb2 20973568 41945087 20971520 10G 83 Linux /dev/sdb3 41945088 62916607 20971520 10G 83 Linux /dev/sdb4 62916608 209715199 146798592 70G 5 Extended /dev/sdb5 62918656 209715199 146796544 70G 83 Linux #这个的磁盘容量占用的是扩展分区也就是sdb4的空间大小 第五步: 格式化分区 [root@oldboy ~]#mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=2621440, 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@oldboy ~]#mkdir /data1 [root@oldboy ~]#mount /dev/sdb1 /data1 [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 451M 0 451M 0% /dev tmpfs 467M 0 467M 0% /dev/shm tmpfs 467M 6.8M 460M 2% /run tmpfs 467M 0 467M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 467M 0 467M 0% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 94M 0 94M 0% /run/user/0 /dev/sdb1 10G 104M 9.9G 2% /data1 # 挂载成功 第七步: 开机自动挂载 [root@oldboy ~]#tail -1 /etc/fstab 企业中使用磁盘方式: 1.插磁盘 2.格式化磁盘 [root@oldboy ~]#mkfs.xfs -f /dev/sdb #已经有分区的情况下强制格式化 3.挂载磁盘 [root@oldboy ~]#mount /dev/sdb /data1 4.开机自动挂载 [root@oldboy ~]#tail -1 /etc/fstab /dev/sdb1 /data1 xfs defaults 0 0 作业: DELL服务器如何做RAID 找几篇文章看看。

4、磁盘分区 parted:crown:

bash
面试题: 小于2T的磁盘用什么命令分区 fdisk MBR支持4个主分区 大于2T的磁盘用什么命令分区 parted gpt支持128个主分区 大于2T的磁盘分区步骤: 虚拟机插入磁盘需要重启,物理机和云服务器都不需要重启操作。 #第一步: 插入大于2T的磁盘

image-20250324180649821

bash
#第二步: 重启系统 [root@oldboy ~]#reboot #第三步: parted分区 root@oldboy ~]#parted /dev/sdc GNU Parted 3.3 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) help # 显示菜单 mklabel,mktable LABEL-TYPE # 指定磁盘格式 mkpart PART-TYPE [FS-TYPE] START END # 创建分区 print # 输出分区表 quit # 退出 rm NUMBER # 删除分区 (parted) mklabel gpt # 指定分区格式 (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt # 成功修改为GPT格式 Disk Flags: Number Start End Size File system Name Flags (parted) mkpart # 分区 Partition name? []? primary # 分区的名称 可以自定义 File system type? [ext2]? xfs # 文件系统类型 Start? 0 # 开始大小 End? 500 # 结束大小 Warning: The resulting partition is not properly aligned for best performance: 34s % 2048s != 0s Ignore/Cancel? I # 输入I 忽略警告 (parted) print # 输出分区表 Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary #第二个分区 (parted) mkpart # 分区 Partition name? []? parimary # 分区的名称 可以自定义 File system type? [ext2]? xfs # 文件系统类型 Start? 500M # 开始大小 End? 1000G # 结束大小 (parted) print # 输出分区表 Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary 2 500MB 1000GB 999GB xfs parimary #划分第3个分区 (parted) mkpart # 分区 Partition name? []? primary # 分区的名称 可以自定义 File system type? [ext2]? xfs # 文件系统类型 Start? 1001 # 开始大小 End? 4000G # 结束大小 #警告:您请求的分区从1001MB到4000GB(扇区1955078..781250000000)。我们可以管理的最近位置是1000GB到4000GB(扇区1953124352..781250000000)。你还可以接受吗? Warning: You requested a partition from 1001MB to 4000GB (sectors 1955078..7812500000). The closest location we can manage is 1000GB to 4000GB (sectors 1953124352..7812500000). Is this still acceptable to you? Yes/No? yes #是 (parted) print # 输出分区表 Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary 2 500MB 1000GB 999GB xfs parimary 3 1000GB 4000GB 3000GB xfs primary #第四步: 格式化分区 [root@oldboy ~]#mkfs.xfs /dev/sdc1 meta-data=/dev/sdc1 isize=512 agcount=4, agsize=30517 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=122066, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=1368, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 #第五步: 挂载使用,可以看到/data1下有了445M的空间 [root@oldboy ~]#mount /dev/sdc1 /data1 [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 17M 962M 2% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 979M 0 979M 0% /tmp /dev/sdc1 472M 28M 445M 6% /data1 /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 #把/dev/sdc3挂载到/data1 [root@oldboy ~]#umount /data1 [root@oldboy ~]#df -h #可以看到/data1已经没了 Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 17M 962M 2% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 979M 0 979M 0% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 #格式化/dev/sdc3 [root@oldboy ~]#mkfs.xfs /dev/sdc3 meta-data=/dev/sdc3 isize=512 agcount=4, agsize=183105489 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=732421956, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=357627, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 #挂载/dev/sdc3 [root@oldboy ~]#mount /dev/sdc3 /data1 #可以看到/data1已经有了2.8t空间 [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 17M 962M 2% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / tmpfs 979M 0 979M 0% /tmp /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 /dev/sdc3 2.8T 20G 2.8T 1% /data1 ------------------parted支持非交互分区--------------- 案例1.进入到parted命令中 [root@oldboy ~]#parted /dev/sdc GNU Parted 3.3 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary 2 500MB 1000GB 999GB parimary #删除2 (parted) rm 2 (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary 案例2.在bash命令行可以直接分区 # 删除第3个分区 [root@oldboy ~]#parted /dev/sdc rm 3 Information: You may need to update /etc/fstab. [root@oldboy ~]#parted /dev/sdc mkpart primary xfs 200G 500G Information: You may need to update /etc/fstab. [root@oldboy ~]#parted /dev/sdc GNU Parted 3.3 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 5369GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500MB 500MB xfs primary 2 500MB 200GB 199GB parimary 3 200GB 500GB 300GB primary #企业中磁盘使用方法 第一步: 插入磁盘 第二步: 格式化磁盘 [root@oldboy ~]#mkfs.xfs -f /dev/sdc meta-data=/dev/sdc isize=512 agcount=5, agsize=268435455 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=1310720000, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 第三步: 挂载使用 [root@oldboy ~]#mount /dev/sdc /data1 [root@oldboy ~]#df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 963M 0 963M 0% /dev tmpfs 979M 0 979M 0% /dev/shm tmpfs 979M 17M 962M 2% /run tmpfs 979M 0 979M 0% /sys/fs/cgroup /dev/mapper/klas-root 47G 3.7G 44G 8% / /dev/sda1 1014M 169M 846M 17% /boot tmpfs 196M 0 196M 0% /run/user/0 /dev/sdc 4.9T 35G 4.9T 1% /data1 [root@oldboy ~]# 第四步: 写入/etc/fstab

5、磁盘面试题:crown:

bash
1.服务器的硬件配置、业务不同我们硬件配置也不同。 1U 2U 4U 1U=4.45厘米,U是服务器机箱的高度 CPU的个数: 服务器2或者4个 双路CPU32核 256或者512G内存 磁盘900X8块 存储: 24核 128G内存 4TX12块

26、开机启动流程

bash
面试题: Linux系统开机启动流程 https://www.processon.com/view/link/5bffde0ae4b0f012f2382181 https://blog.51cto.com/oldboy/791273 1.开机 2.BIOS自检(检查硬件 内存 CPU 磁盘) 3.MBR引导 4.GRUB菜单(内核) 5.加载内核(kernel) 6.运行第一个进程systemd 7.运行级别3下的服务并行启动 8.最后运行一个登录界面 硬件: 经常出现问题的硬件 1.内存(和主板不兼容 静电) 重新插拔内存 2.硬盘(更换硬盘 厂商3年售后) IDC机房 安装操作系统组装RAID 3.电源(更换) 4.主板(厂商->维修) 5.CPU烧了

linux 开机到登陆的启动过程描述(考试题答案系列)_老男孩 linux 培训

27、进程:crown:

1、进程基本概述

bash
1.什么是进程:当我们运行一个程序,那么我们将运行的程序叫进程 PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限 PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息 2.程序和进程的区别 程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中 进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中 3.程序的生命周期:一个对象从无到有、从有到无过程称为生命周期

image-20250325143515514

bash
当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息) 1.子进程在处理任务代码时,父进程会进入等待状态中 2.子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源 3.如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程 4.每个进程都有自己的PID号,子进程称为PPID

2、监控进程状态:crown:

bash
程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为:静态和动态两种方式 1.使用ps命令查看当前的进程状态(静态) ps –auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等 -a显示所有终端机下执行的进程,除了阶段作业领导者之外 -u以用户为主的格式来显示进程状况 -x显示所有进程,不以终端机来区分 -f用ASCII字符显示树状结构,表达进程间的相互关系 [root@oldboy ~]#ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.5 103576 11512 ? Ss Mar24 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 root 616 0.0 0.7 30848 14128 ? Ss Mar24 0:01 /usr/lib/systemd/systemd-journald root 633 0.0 0.4 36644 9100 ? Ss Mar24 0:00 /usr/lib/systemd/systemd-udevd root 745 0.0 0.0 2920 120 ? Ss Mar24 0:00 /sbin/mdadm --monitor --scan --syslog -f --pid-file=/run/mdadm/mdadm.pid root 749 0.0 0.2 9164 5116 ? Ss Mar24 0:00 /usr/libexec/bluetooth/bluetoothd dbus 751 0.0 0.2 26024 5776 ? Ss Mar24 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only root 760 0.0 0.4 231352 8028 ? Ss Mar24 0:00 /usr/bin/kylin_sock_server libstor+ 763 0.0 0.0 10576 1888 ? Ss Mar24 0:00 /usr/bin/lsmd -d chrony 764 0.0 0.1 87012 2464 ? S Mar24 0:00 /usr/sbin/chronyd polkitd 766 0.0 1.2 2588112 24592 ? Ssl Mar24 0:00 /usr/lib/polkit-1/polkitd --no-debug root 767 0.0 0.3 90832 6140 ? Ssl Mar24 0:03 /sbin/rngd -f root 770 0.0 0.2 10204 5368 ? Ss Mar24 0:00 /usr/sbin/smartd -n -q never root 773 0.0 0.5 250928 11424 ? Ss Mar24 0:00 /usr/sbin/sssd -i --logger=files root 848 0.0 0.6 251480 12340 ? S Mar24 0:00 \_ /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files root 858 0.0 1.7 264364 35880 ? S Mar24 0:00 \_ /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files root 859 0.0 0.4 231632 9964 ? S Mar24 0:00 \_ /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --logger=files root 784 0.0 0.5 470860 11240 ? Ssl Mar24 0:00 /usr/sbin/abrtd -d -s root 799 0.0 0.9 472232 19752 ? Ssl Mar24 0:01 /usr/sbin/NetworkManager --no-daemon root 920 0.0 0.4 26912 8492 ? Ss Mar24 0:00 /usr/lib/systemd/systemd-logind root 1058 0.0 0.3 163652 7612 ? Ssl Mar24 0:03 /usr/sbin/rsyslogd -n -i/var/run/rsyslogd.pid root 1060 0.0 0.3 21840 7392 ? Ss Mar24 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 1284 0.0 0.4 250332 9532 ? Ss Mar24 0:00 \_ sshd: root [priv] root 1306 0.0 0.2 244072 4840 ? S Mar24 0:01 | \_ sshd: root@pts/0 root 1311 0.0 0.2 223832 5484 pts/0 Ss+ Mar24 0:00 | \_ -bash root 3024 0.0 0.4 250332 9572 ? Ss 04:12 0:00 \_ sshd: root [priv] root 3034 0.0 0.2 244072 4864 ? S 04:12 0:00 \_ sshd: root@pts/1 root 3039 0.0 0.2 223568 5212 pts/1 Ss 04:12 0:00 \_ -bash root 3355 0.0 0.1 225212 3636 pts/1 R+ 05:43 0:00 \_ ps auxf # 把top进程定向到文件里 [root@web01 ~]#top -n1 -b >1.txt
标志含义
USER该 process 属于那个使用者账号的
PID该 process 的号码
%CPU该 process 使用掉的 CPU 资源百分比
%MEM该 process 所占用的物理内存百分比
VSZ该 process 使用掉的虚拟内存量 (Kbytes)
RSS该 process 占用的固定的内存量 (Kbytes)
TTY该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT该程序目前的状态
START该 process 被触发启动的时间
TIME该 process 实际使用 CPU 运作的时间
COMMAND该程序的实际指令[]内核态进程 无[] 用户进程,[]里面都是系统运行的
STAT 基本状态描述STAT 状态 + 符号描述
R进程运行s进程是控制进程, Ss 进程的领导者,父进程
S可中断睡眠<进程运行在高优先级上,S< 优先级较高的进程
T进程被暂停N进程运行在低优先级上,SN 优先级较低的进程
D不可中断睡眠+当前进程运行在前台,R+ 该表示进程在前台运行
Z僵尸进程l进程是多线程的,Sl 表示进程是以线程方式运行
bash
案例1: 1)在终端1上运行vim [root@lzy ~]# vim test 2)在终端2上运行ps命令查看状态 [root@lzy ~]# ps axu|grep test # S表示睡眠模式 +表示前台运行 root 14240 0.1 0.5 151868 5676 pts/1 S+ 10:48 0:00 vim test root 14271 0.0 0.0 112660 968 pts/2 R+ 10:48 0:00 grep --color=auto test 3)在终端1上挂起vim命令按下: ctrl+z 4) 回到终端2再次运行ps命令查看状态 root@lzy ~]# ps axu|grep test # T表示停止状态 root 14240 0.0 0.5 151868 5676 pts/1 T 10:48 0:00 vim test root 14279 0.0 0.0 112660 964 pts/2 R+ 10:51 0:00 grep --color=auto test 案例2 PS命令查看不可中断状态进程 使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+ [root@lzy ~]# ps axu|grep tar|grep -v grep root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var [root@lzy ~]# ps axu|grep tar|grep -v grep root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var [root@lzy ~]# ps axu|grep tar|grep -v grep root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var

3、使用 top 命令查看当前的进程状态

image-20250325145901619

任务含义
Tasks:73 total当前进程的总数
2 running正在运行的进程数
71 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数
%Cpu(s): 49.2 us系统用户进程使用 CPU 百分比,用户态
5.7 sy内核进程占用 CPU 百分比,内核是于硬件进行交互。内核态。
0.0 ni被更过优先级的用户进程所使用的 cpu 时间
45.2 id空闲 CPU 的百分比
0.0 waCPU 等待 IO 完成的时间
0.0 hi硬中断,占的 CPU 百分比,被迫停止当下工作去干其他工作
0.0 si软中断,占的 CPU 百分比,有计划停止当下工作去干其他工作
0.0 st比如虚拟机占用物理 CPU 的时间

用户态:用户操作系统占用 cpu 时间,比如用户执行 touch 命令,再按下回车的时候,系统会把操作交给内核来处理,因为内核要调用硬件来处理这一操作,比如调用硬盘来写入数据,调用 cpu,调用内存

内核态:内核操作硬件占用 cpu 的时间

4、管理进程状态

bash
当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们可以使用linux的kill命令对进程发送关闭新号,当然除了kill 还killall pkill 1)使用kill –l列出当前系统所支持的信号 [root@oldboy ~]#kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 虽然Linux信号很多,但是我们仅仅使用最常用的3个信号 1)SIGHUP 重新加载配置文件 1 不停机维护 2)SIGKILL 强制杀死进程 9 3)SIGTERM 终止进程,默认kill使用该信号 15 systemctl restart nginx #重启服务,服务断开,pid号会变 systemctl reload nginx #重新加载服务,主服务不断开,pid不会变 [root@lzy ~]# kill 15692 强制终止服务 kill -9 15692 2.Linux系统中killall,pkill命令用于杀死指定名字的进程,我们可以使用kill命令杀死指定进程的PID的进程,killall和pkill直接杀进程而不需要查pid 安装killall [root@lzy ~]# yum install psmisc -y 使用killall killall+进程的名称 [root@lzy ~]# killall nginx [root@lzy ~]# pkill nginx 使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出 [root@oldboy ~]#w 06:35:02 up 10:44, 2 users, load average: 0.11, 0.04, 0.01 USER TTY LOGIN@ IDLE JCPU PCPU WHAT root pts/0 06:28 0.00s 0.02s 0.00s w #管理员刚执行的w命令,所以这个是管理员bash root pts/1 06:34 18.00s 0.02s 0.02s -bash [root@lzy ~]# pkill -9 -t pts/1

5、管理后台进程:crown:

bash
1)什么是后台进程 运行的进程默认在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行 2)如何把程序放在后台 # 把进程放入后台运行 使用 & [root@lzy ~]# sleep 3000 & [1] 15909 # 把进程挂起放在后台 [root@lzy ~]# sleep 4000 ^Z [3]+ Stopped sleep 4000 [root@lzy ~]# # jobs 显示在后台运行的程序 [root@lzy ~]# jobs [1]- Running sleep 3000 & [2]+ Running sleep 4000 & # 让作业2在后台运行 [root@lzy ~]# bg %2 [2]+ sleep 4000 & [root@lzy ~]# jobs [1]- Running sleep 3000 & [2]+ Running sleep 4000 & 将作业1掉回到前台运行 [root@lzy ~]# fg %1 sleep 3000 # 终止后台PID为2的进程 [root@lzy ~]# kill %2 [root@lzy ~]# jobs [1]+ Stopped sleep 3000 [2]- Terminated sleep 4000 # & 后台运行 for i in {1..10};do echo $i;done & # 内容还是输出到屏幕 for i in {1..10};do echo $i;done &>/dev/null & # 内容定向到空 screen的使用 常用 1)安装 yum install –y screen 2) 使用方法 # screen 指定一个任务名称后进入到一个新bash中 screen -S wget_jenkins # 在新bash中执行一条下载命令 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm --no-check-certificate # 平滑退出screen 不会终止任务,如果使用exit则退出 ctrl+a+d # 平滑退出screen任务 # 查看正在运行的screen有哪些任务 [root@lzy ~]# screen -list There is a screen on: 43698.wget_jenkins (Detached) 1 Socket in /var/run/screen/S-root. # 进入正在执行的screen任务中 或者使用PID即可进入 [root@lzy ~]# screen -r wget_jenkins Nohup命令 nohup sleep 600 & nohup在运行过程中会在当前的目录生成一个nohup.out的临时文件,注意要把日志定向为空 面试题: 让一个进程在后台持续运行的方式 Screen Screen -S wget_test 输入在后台一直运行的命令 Ctrl+a+d 退出screen空间 # exit摧毁此空间 Screen -r wget_test # 进入到screen空间 Screen -list # 查看空间介质 Nohup Nohup 后台持续运行的命令 & Ps axu|grep 进程名称

28、Linux 网络篇

1、网络基础

1、什么是网络
bash
所谓网络,都是通过一定的形式连接起来的物体,物体与物体之间可以实现通信 用什么连接: 网线 网线分类:五类线、超五类、六类线(千兆)按箱子305米 水晶头:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 568B线序(568A线序) 8芯线: 4芯 1236芯 用来传输数据 其他4芯没用(额外供电 反向供电 POE供电) 传输距离100米(超过100米需要加信号放大器 交换机 HUB) 光纤 千兆万兆 多模光纤 传输距离近 2公里 单模光纤 传输距离远 120公里 wifi

image-20250325160533411

image-20250325160628480

bash
只用1236号线传输数据,另外4根线起到额外供电的作用,有的设备不插电,用这四根线来供电,这也叫反向供电(可以供电的前提是交换机支持反向供电poe交换机),比如摄像头,不需要插电源 这个也叫弱电,能照明的是强电,比如家用电
bash
物体于物体: 计算机-计算机 计算机-服务器 服务器-服务器 计算机-交换机 计算机-路由器 交换机-交换机 路由器-路由器 物联网: 所有的物体都是由网络进行互通互联ip不够用
2、如何通过网络实现多台主机之间的通讯
bash
1)在两台主机之间需要有传输介质(网线、光纤、无线等) 2)在两台主机上面需要有网卡设备 网卡: 全球唯一的地址(MAC) 类似家的位置 在发送信息时:将二进制(数字信号)信息转换为高低电压(电信号) #调至过程 在接收信息时:将高低电压(电信号)信息转换为二进制数(数字信号) #解调过程 3)在进行数据传输之前,需要协商网络传输速率。 网卡速度参数 100Mbps==100M bit 每秒==每秒钟传输多少个bit(0或1) 1M=1000k 100M=100000k 1k=1000b 100000k=100000000b 网络传输数据单位:比特 bit 1bit=1/8byte 磁盘存储数据单位:字节 byte 1byte=8bit 网卡的100Mbps同样是以bit/s来定义的 所以100Mb/S=100000KByte/s=(100000/8)KByte/s=12500KByte/s 在理论上1秒钟可以传输12.5MB的速据 考虑到 干扰的因素每秒传输只要超过10MB就是正常了 现在出现了1000Mbps的网卡那么速度就是100MB/S K是千 M是兆 G是吉咖 T是太拉 1Byte(字节)=8bit(位) 1KB=1024Byte(字节) 1MB=1024KB 1024MB=1GB 1024GB=1TB 真实的运营商下载带宽: ADSL拨号 用户名和密码 非对称式网络 上传和下载带宽不一样 家用 重启路由器重新获取新的公网IP地址 2M 4M 6M 8M 企业专线: 对称式网络 配置公网IP地址 上传和下载相同 价格翻好几倍 10MB 4-8万 运营商不同 ARP(Address Resolution Protocol): 用于将IP地址解析为MAC地址(物理地址)。 例如:当设备A(IP 192.168.1.2)想与同一局域网的设备B(IP 192.168.1.3)通信时,需要通过ARP查询设备B的MAC地址。 NAT(Network Address Translation): 用于将私有IP地址转换为公有IP地址,解决IPv4地址不足的问题。 例如:家庭路由器将内部设备(如192.168.1.100)的IP转换为公网IP(如203.0.113.5)以访问互联网。

2、网络设备说明介绍

1、什么是交换机
bash
把多台计算机连接起来形成一个局域网,把网线插到一个交换机就可以实现一个网络内多台主机之间的通讯 #如何利用交换机实现通讯 1. 在数据前面设置目标地址和源地址,目标地址和源地址用mac地址进行标识 mac称为物理地址,每块网卡上都有的一个标识身份信息的 mac地址全球唯一,不能进行修改,mac地址用16进制标识 2. 在网络通讯初期,会利用广播方式进行发送数据包,在通讯的过程,数据包的发送一定是有去有回的。 在一个交换网路中,如果产生了大量广播数据包时会产生广播风暴,影响主机性能,这样的问题称为广播风暴问题 #解决广播风暴问题思路: 减少广播产生数量,将一个大的交换网络切割为几个小的交换网络(局域网,广播域) #交换机的种类 傻瓜交换机(TP-link/Dlink/水星...) 4口 8口 12口 16口 24口 48口 程控交换机(存储程序控制交换机,配置管理,思科、华为、华三、锐捷、中兴、瑞斯康达) 二层交换 支持数据转发 vlan隔离端口 三层交换 功能比较多 DHCP ACL访问控制列表 支持路由器功能 OSI七层模型

image-20250326174525450

image-20250326180438653

bash
财务,总经办,技术的部门网线都连着交换机,因为都是一个交换机出来的,网段相同,所以别的部门也能访问财务,但是财务需要数据保密,所以需要vlan隔离。 二层交换机可以配置管理ip地址,也就是接入层,离用户最近的交换机是接入层,接入层交换机出来的网线连着机房的交换机,这个是三层交换机,也叫汇聚层,其他房间出来的网线也连着汇聚层,从汇聚层出来连着路由器 三层交换机可以做ACL访问控制策略,可以做DHCP自动下发IP地址
2、什么是路由器
1、路由的概念
bash
实现不同局域网之间主机通讯,可以隔离广播风暴(路由不同的接口连接不同广播域) 路由类似于现实生活中从A地去往B地可能需要先步行,在坐车,在做飞机才能到达B地,这样的整个过程在网络中对应数据的传递过程就称为路由。因此一个数据信息跨越不同的网段传递到目的地址,就可以把传递数据的过程称为路由,也可以看做每条传递数据的路径。 1)需要有身份标识信息:ip地址 逻辑地址(可以改变的地址/???) 利用10进制方式进行显示 C:\Users\z1340>tracert -d www.baidu.com #查看到baidu经过几个路由器,下面一行就是一个路由器,192、10、172都是局域网,其他都是公网 通过最多 30 个跃点跟踪 到 www.a.shifen.com [110.242.70.57] 的路由: 1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.13.1 #网关,从笔记本到楼上的路由器 2 1 ms 1 ms 1 ms 192.168.1.1 #局域网,汇聚层 3 3 ms 2 ms 2 ms 221.218.208.1 #公网,如果延迟比较高,说明从公司到机房有问题 4 * 3 ms * 61.148.162.57 5 3 ms 6 ms * 125.33.186.81 6 * * * 请求超时。 #网络设备,🈲tracert🈲ping,转发数据包 7 11 ms 11 ms 11 ms 110.242.66.186 8 11 ms 12 ms 11 ms 221.194.45.134 9 * * * 请求超时。 10 * * * 请求超时。 11 * * * 请求超时。 12 10 ms 11 ms 10 ms 110.242.70.57 #百度的ip 跟踪完成。 2)路由实现数据传输通讯时,会根据路由表信息进行数据包路由 实现不同网段之间通讯需要经过一条必经之路,这条路称为网关
3、静态路由
1、配置一个路由
bash
#配置通过一个路由器实现让不同网段通信 Router>? Exec commands: <1-99> Session number to resume connect Open a terminal connection disable Turn off privileged commands disconnect Disconnect an existing network connection enable Turn on privileged commands exit Exit from the EXEC logout Exit from the EXEC ping Send echo messages resume Resume an active network connection show Show running system information ssh Open a secure shell client connection telnet Open a telnet connection terminal Set terminal line parameters traceroute Trace route to destination Router>enable # 进入特权模式 可以简写en Router#show running-config #查看当前路由器的所有配置 Building configuration... Current configuration : 551 bytes ! version 12.4 no service timestamps log datetime msec no service timestamps debug datetime msec no service password-encryption ! hostname Router ! ! ! ! ! ! ! ! ip cef no ipv6 cef ! ! Router#configure terminal #进入到配置模式 Router(config)#interface fa0/0 #可以简写 int fa0/0 进入到这个接口 Router(config-if)#ip address 10.0.0.1 255.255.255.0 #配置IP地址为10.0.0.1 Router(config-if)#no shutdown #开启此端口,可以看到路由器fa0/0的灯从红色变绿色了 Router(config-if)#int fa0/1 # 切换到fa0/1接口 Router(config-if)#ip add 116.63.0.100 255.255.255.0 #配置IP地址为116.63.0.1 Router(config-if)#no shutdown #开启此端口,可以看到路由器fa0/1的灯从红色变绿色了

image-20250326191359160

bash
此时经过配置路由的网关,并且路由两边配置了ip地址,并且两台pc端都配置了网关,所以可以互相ping通 #面试题: 如何让不同的网段进行通信? 中间加个路由器。 #从特权模式查看路由表信息 Router#show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area * - candidate default, U - per-user static route, o - ODR P - periodic downloaded static route Gateway of last resort is not set #c代表直连网段,如果10网段请求116网段,那么需要10网段将数据包放在路由器,路由器查看自己的路由表,发现116是自己的直连网段,那么会直接把数据包发送到116网段 10.0.0.0/24 is subnetted, 1 subnets C 10.0.0.0 is directly connected, FastEthernet0/0 116.0.0.0/24 is subnetted, 1 subnets C 116.63.0.0 is directly connected, FastEthernet0/1 --------------------------------------------------------------
2、配置两个路由
bash
#两个路由器配置 Router#enable Router#configure t Configuring from terminal, memory, or network [terminal]? Enter configuration commands, one per line. End with CNTL/Z. #配置第一个路由器第一个接口 Router(config)#int fa0/0 Router(config-if)#add 10.0.0.1 255.255.255.0 Router(config-if)#no shutdown #配置第一个路由器第二个接口 Router(config-if)#int fa0/1 Router(config-if)#ip add 1.1.1.1 255.255.255.0 Router(config-if)#no shutdown #查看R1路由器路由表 enabl Router#show ip route 1.0.0.0/24 is subnetted, 1 subnets C 1.1.1.0 is directly connected,FastEthernet0/1 10.0.0.0/24 is subnetted, 1 subnets C 10.0.0.0 is directly connected,FastEthernet0/0 #配置第二个路由器第一个接口 Router>enable Router#config t Router#config terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#int fa0/0 Router(config-if)#ip add 1.1.1.2 255.255.255.0 Router(config-if)#no shut Router(config-if)#no shutdown #配置第二个路由第二个接口 Router(config)#int fa0/1 Router(config-if)#ip add 116.63.0.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#no shutdown 配置后不通,因为通过R1配置表发现只有两个直连的,也就是只有10.0.0.1跟1.1.1.1,不认识116段,R2也是,只有1.1.1.2和116.63.0.1,没有10段的

image-20250326200952768

bash
R1配置静态ip enable Router#config terminal Router(config)#ip route 116.63.0.0 255.255.255.0 1.1.1.2 1.0.0.0/24 is subnetted,l subnets c 1.1.1.0 is directly connected,FastEthernet0/1 10.0.0.0/24 is subnetted,l subnets c 10.0.0.0 is directly connected,FastEthernet0/0 116.0.0.0/24 is subnetted,l subnets s 116.63.0.0[1/0]via 1.1.1.2 R2配置静态ip enable Router#config terminal Router(config)#ip route 10.0.0.0 255.255.255.0 1.1.1.1 1.0.0.0/24 is subnetted,l subnets c 1.1.1.0 is directly connected,FastEthernet0/0 10.0.0.0/24 is subnetted,l subnets s 10.0.0.0[1/0]via 1.1.1.1 116.0.0.0/24 is subnetted,l subnets c 116.63.0.0 is directly connected,FastEthernet0/1

image-20250326202640768

bash
可以正常ping通
3、配置三个路由

img

bash
三个路由器配置: #修改R2路由器配置: Router(config)#int fa0/1 Router(config-if)#no ip address # 删除接口的IP地址 Router(config-if)#ip add 2.2.2.1 255.255.255.0 Router(config-if)#no shut Router(config)#ip route 116.63.0.0 255.255.255.0 2.2.2.2 #R3路由器配置 Router>enable Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#int fa0/0 Router(config-if)#ip add 2.2.2.2 255.255.255.0 Router(config-if)#no shut Router(config-if)#int fa0/1 Router(config-if)#ip add 116.63.0.1 255.255.255.0 Router(config-if)#no shut Router(config)#ip route 10.0.0.0 255.255.255.0 2.2.2.1

image-20250326205837025

image-20250326210258503

bash
可以通,ping不通的原因可能是arp缓存的mac地址跟硬件地址的缓存不一样,arp -a查看系统MAC地址,arp -d删除系统缓存
4、动态路由
bash
动态路由(路由自动学习过程) RIP OSPF EIGRP ISIS BGP 😜BGP,全称边界网关协议,听起来很高端大气上档次吧?其实简单来说,它就是不同自治系统之间的“翻译官”,让各个自治系统能够愉快地交流、传递信息。 💡为什么BGP这么重要呢?想象一下,如果全球的网络都是一个个独立的岛屿,那么BGP就是连接这些岛屿的桥梁。没有它,这些岛屿之间就无法沟通,网络世界也就变得支离破碎了。 😉而且,BGP还是个超级聪明的“翻译官”。它能自动选择最佳路径,确保信息能够快速、准确地到达目的地。这就像是一个聪明的导游,总能找到最便捷的路线,让你轻松到达目的地。 来老男孩学习(协议 RIP) R1 张前龙: 金融 厨师 将我会的技能告诉相邻的同桌(路由器)我会什么 金融 厨师 经理 PS 艺术 直播 R2 王亚楠: 经理 PS 自动从R1路由器学习了金融和厨 师技能,告诉相邻的路由我会什么 经理 PS 金融 厨师 艺术 直播 R3 黄雅萍 艺术 直播 自动从R2路由器学习到了 经理 PS 金融 厨师 告诉相邻的路由器我会什么 艺术 直播 最终的结果是每一个路由器都有去每一个网段的路由,全都学完了 #修改三个路由配置 enable Router#config terminal Router(config)#no ip route 10.0.0.0 255.255.255.0 1.1.1.1 #删除静态连接,让他们每一个路由直连 R1路由器配置: 第一步: 启动协议 Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#route rip # 进入到rip协议 第二步: 宣告自己的网段 Router(config-router)#network 10.0.0.0 Router(config-router)#network 1.1.1.0 R2路由器配置 Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#route rip #进入到rip协议,这样就学会了R1路由的网段 Router(config-router)#network 1.1.1.0 Router(config-router)#network 2.2.2.0 R3路由器配置 Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#route rip Router(config-router)#network 2.2.2.0 Router(config-router)#network 116.63.0.0

image-20250326214718706

3、网络层次结构:crown:

1、 网络拓扑
bash
网络层次结构 核心层:主要部署路由器设备,用于连接外网线路,还要具备冗余能力 汇聚层:主要部署三层交换设备,用于相应安全访问控制 进行链路汇聚 接入层:主要部署二层交换设备,用于终端设备接入 一层交换机:只支持物理层协议。 二层交换机:支持物理层和数据链路层协议。 三层交换机:支持物理层,数据链路层及网络层协议。

image-20250327161857039

2、网络类型
bash
局域网:本地私有的一个网络范围。规模较大的局域网,也会称为园区网。 教室 家庭 公司内 校园 公网: 全球任意一个可以上网的地方都可以直接访问到 城域网:网络的覆盖面积达到了一个城市,就可以称为城域网。 广域网:覆盖面积 达到了全国或全球,就称为广域网, 全球最大的广域网就是Internet互联网。
3、网络层次模型(OSI7 层模型):crown:
bash
OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 OSI7层模型意思是比如我现在要给另一台主机发送数据包,那我这个数据包要经过下面七层一层一层的处理,处理完成之后才能发出去
应用层产生数据包的地方,比如访问一个网站,显示的页面就是数据。为应用程序提供接口,使应用程序能够实现网络服务,常见的应用层协议 http(80)、telnet(23)、smtp(25)
表示层数据的解码和编码,数据的加密和解密,数据的压缩和解压缩
会话层在这层建立通道,建立、维护、管理应用程序之间的会话
传输层传输的方式是什么。负责网络中端到端的连接(TCP、UDP)。
网络层走哪条路,网络层的主要作用就是路由和寻址,主要接触到的是 IP 协议,即 IP 地址。
数据链路层组帧、物理编址、流量控制、差错控制、插入控制
物理层用的什么网线,MAC 地址。物理层标准规定了信号、连接器和电缆要求、接口类型、线缆类型、设备(集线器 hub)。

应用层协议介绍

bash
面试题: 面试官问 ssh默认端口 http默认端口? FTP 21 明文协议,文件传输协议,基于TCP #重点记 TFTP 69 简单文件传输协议,基于UDP SSH 22 安全外壳协议,远程连接,加密 #重点记 Telnet 23 明文协议,远程连接 #重点记 SNMP 161/162 简单网络管理协议,基于UDP SMTP 25 简单邮件传输协议,基于TCP HTTP 80 超文本传输协议 #重点 HTTPS 443 超文本传输安全协议 #重点 DHCP 67/68/546 动态主机设置协议,C(67),S(68),546(V6)
4、TCP/IP 模型(4 层模型):crown:

image-20250327203511188

4、数据包封装与解封装

bash
封装过程:由上至下进行封装 应用层、表示层、会话层 PDU 数据 传输层:分段 TCP协议 网络层:打包 TCP协议+IP地址 数据链路层:成帧 TCP协议+IP地址+MAC地址 物理层:位 数据成为比特

5、DNS 解析过程:crown:

1.域名是什么 ?
bash
举个例子,https://www.baidu.com,这个其实并不是域名,其中https是指协议,去掉https后,www.baidu.com.(注意最后面有一个点号)才是真正的域名。 域名的第一部分: www对应了一个业务 www.baidu.com--->百度的首页 news对应了另一个业务 news.baidu.com-->百度的新闻业务 www.baidu.com的www与news.baidu.com 的news 表示主机名 表示不同的业务 不同的页面 域名的第二部分: baidu sina weibo oldboyedu jd taobao 权威域名。全球唯一 不能冲突 域名的第三部分: .com 顶级域名服务器 .cn .org .net.中国 .我爱你。顶级域名 每个域名的最后面都有一个点号 "." 表示根域名,为了方便在实际使用的时候被省略了 根域名的下一级就是顶级域名了,.com也就是顶级域名,常见的顶级域名后缀有.com、.cn、.net、.org 等,这些都是固定的,用户不能自己修改,只能选择。 顶级域名的下一级又是权威域名,如baidu.com中的.baidu,这个权威域名就是我们自己可注册的域名。www.baidu.com www.weibo.com www.linuxnc.com顶级域名下就是主机名了,www是指主机名,这个是我们可以自己定义的,通常在http服务器如nginx中可以修改

img

bash
DNS流程: 浏览器缓存-->HOSTS-->windows缓存-->LDNS-->根 查看windows缓存: ipconfig/displaydns 清理windows缓存: ipconfig/flushdns DNS解析流程: 答:首先我们在浏览器输入域名,比如www.baidu.com,浏览器会先去查找本地的host文件,如果有百度与ip的对应关系,则返回ip与百度服务器建立连接,如果host文件没有,则我们的浏览器会去本地网卡配置的DNS(223.5.5.5)里面找有没有域名对应的ip地址,如果有则返回给浏览器和百度服务器建立连接,如果本地DNS服务器没有对应关系 LDNS会去查找全球的根域名(.)服务器,然后会去问根域名服务器,你没有没有www.baidu.com对应的ip地址。根域回复LDNS说没有,但是我存着顶级域.com服务器的ip地址。根域会把.com服务器的ip地址返回给LDNS服务器 LDNS会拿着.com的服务器的ip地址去问顶级域.com,你有没有www.baidu.com对应的ip地址,.com回复LDNS说没有,但是我有权威域baidu的服务器ip地址,权威域会把baidu的服务器ip地址返回给LDNS服务器 LDNS会拿着权威域的ip地址去问baidu权威域,你有没有www.baidu.com对应的ip地址,权威域回答,有,我自己在后台配置的域名和ip地址对应关系,权威域会把对应解析的ip地址返回给LDNS服务器,也就是真正的www.baidu.com的ip地址LDNS会自己缓存一份,返回给浏览器一份,浏览器拿着ip地址与百度服务器建立连接 1.浏览器--->本地HOSTS-->LDNS---> 2.LDNS--->根 根返回 顶级域.com 3.LDNS--->顶级域 顶级域返回权威域 4.LDNS--->权威域服务器 权威域名返回 A记录解析对应的服务器IP地址 5.浏览器-->百度IP建立连接 面试题: 1.浏览器输入www.baidu.com,会先查询浏览器缓存,如果有就返回IP与百度服务器建立连接,没有则查询本地的HOSTS 2.如果HOSTS有就返回IP与百度服务器建立连接,如果没有继续查询本地的DNS 3.本地DNS一般是我们自己配置的比如223.5.5.5、8.8.8.8、114.114.114.114,查询本地DNS是否有对应的IP 如果有返回给浏览器 如果没有则查询.根服务器 ----------1-3过程称为递归查询--------------- 4.根服务器不存储域名解析,会给LDNS返回顶级域.com的服务器IP地址 5.LDNS重新请求.com顶级域服务器 .com不存在域名解析,会返回权威域名服务器的IP地址给LDNS 6.LDNS重新请求baidu.com权威域名服务器,权威域服务器就是我们自己配置的A记录解析,将A记录对应的IP地址返回给LDNS 7.LDNS拿到后自己缓存一份 返回给浏览器一份 8.浏览器和拿到的百度服务器IP地址建立连接 ---------迭代查询 有去有回 1.浏览器--->本地HOSTS-->LDNS---> 2.LDNS--->根 根返回 顶级域.com 3.LDNS--->顶级域 顶级域返回权威域 4.LDNS--->权威域服务器 权威域名返回 A记录解析对应的服务器IP地址 5.浏览器-->百度IP建立连接

6、主机到主机层协议介绍

bash
TCP: 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。 特点:面向连接,可靠,传输效率低 应用场景:web浏览器(打开网页必须能看到,不能只查看到一半),电子邮件,文件传输程序 #打电话:电话接通-互相通话-挂断电话,都能收到反馈 UDP: 用户数据报协议,属于无连接的传输协议 特点:无连接、不可靠、快速传输,无法保证数据准确性 应用场景:视频流(比如直播,网卡视频卡了,然后就不能出现了),IP语音(没听清就不能复现了) #写信:对方是否收到-内容是否完整-顺序是否正确,都无法确认 TCP UDP协议端口号范围 1 - 65535 (可以的),真正端口号总数为2的16次方=65536

image-20250406122227939

1、控制字段介绍
bash
ACK:表示确认控制字段,确认数据是否接收到 SYN:表示请求建立连接字段,和主机建立连接时使用 FIN:表示请求断开连接字段,和主机断开连接时使用 PSH: 表示有DATA数据传输,PSH为1表示的是有真正的TCP数据包内容被传递 RST: 表示连接重置。一般是在FIN之后才会出现为1的情况,表示的是连接重置。 seq序列号:将大的数据进行拆分后标记序列信息,便于接收方将拆分后的数据信息进行组装,在原有序列号基础上+1进行回复,告知发送方下次再给我发送的数据是什么 注意:传输数据包,没有真正数据信息(三次握手过程),传输数据过程,在三次握手之后。
2、TCP 三次握手:crown:

image-20250327194951226

bash
第一次握手:客户端向服务器端发送报文,内容是想建立连接SYN=1,并且客户端向服务器发送数据包编号seq=x(用x表示第一个数据包) 第二次握手:服务器端收到后会响应客户端表示已经收到ACK=1,并且发出建立连接请求SYN=1,并且我给你发送我的第一个数据包seq=y,并且还会确认要给发我下一个数据包了Ack=x+1 第三次握手:客户端响应服务器端你的数据我收到了ACK=1,并且我给你发送第二个数据包了seq=x+1,并且你下次应该给我发第二个数据包了Ack=y+1 三次握手面试题: 1.伟苹想和仓姐姐搞对象,我想和你搞对象SYN=1,并且送给仓姐姐第一个礼物seq=x 2.仓姐姐说收到了你的渴望ACK=1。我也想和你搞对象SYN=1,并且也给伟苹送了第一个礼物seq=y。并且和你说你下次应该给我第二个礼物了Ack=x+1 3.伟苹确认收到了苍姐姐的信息ACK=1。并且给苍姐姐第二个礼物seq=x+1,并且说苍姐姐你下次应该给我第二个礼物了Ack=y+1。 4.伟苹和仓姐姐连接成功。 1.A向B请求建立连接 SYN=1 seq=x 2.B向A回复 ACK=1 SYN=1 seq=y,Ack=x+1 3.A向B回复 ACK=1,seq=x+1,Ack=y+1 为什么要三次握手: 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。 举个例子: “已失效的连接请求报文段”的产生在这样一种情况下:客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致 延误到连接释放以后的某个时间才到达服务端。本来这是一个早已失效的报文段。但服务端收到此失效的连接请求报文段后,就误认为是客户端再次发出 的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要服务端发出确认,新的连接就建立了。由于 现在客户端并没有发出建立连接的请求,因此不会理睬服务端的确认,也不会向服务端发送数据。但服务端却以为新的运输连接已经建立,并一直等待 客户端发来数据。这样,服务端的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务端 的确认发出确认。服务端由于收不到确认,就知道客户端并没有要求建立连接。” 这就很明白了,防止了服务器端的一直等待而浪费资源。

抓包

image-20250327202635325

bash
No Time Source Destination Protocol Length Info 13 1.058175 10.0.0.1 10.0.0.200 TCP 66 49153 → 22 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM #第一次握手0.1访问200地址,49153端口访问22端口,我想和你建立连接SYN,并且给了你第一个数据包Seq=0 ----------------------------------- 10.0.0.1 #Vmnet8 10.0.0.200 #目标地址 TCP #协议 49153 → 22 #客户端端口→ssh SYN #想建立连接 Seq=0 #第一个数据包用0表示 ------------------------------------- 14 1.058506 10.0.0.200 10.0.0.1 TCP 66 22 → 49153 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460 SACK_PERM WS=128 #第二次握手200地址收到了给0.1地址回复,由22端口回复49153端口,回复内容SYN我也想和你建立连接,并且你的数据包我收到了ACK,并且我给你第一个数据包Seq=0,你下次应该给我第二个数据包了Ack=1 ------------------------------------ 15 1.058787 10.0.0.1 10.0.0.200 TCP 54 49153 → 22 [ACK] Seq=1 Ack=1 Win=131328 Len=0 #第三次握手1地址向200地址回复,59153给22端口回复,确认你的包我收到了ACK,并且我给你第二个数据包Seq=1,你下次应该给我第二个包了Ack=1
3、TCP 四次挥手:crown:
bash
数据传输完毕后,双方都可以释放连接. 此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接. 1.客户端进程发出连接释放报文,并且停止发送数据。 释放数据报文首部,FIN=1,其序列号为seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 2.服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为 u + 1,并且带上自己的序列号seq = v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。 TCP服务器通知高层的应用进程,客户端向服务器请求了断开连接,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 3. 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据) 4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,确认序号为v + 1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq = w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w + 1,而自己的序列号是u + 1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进CLOSED状态。 6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。 小知识点:在网络传输层,tcp模块中有一个tcb(传输控制模块,transmitcontrolblock),它用于记录tcp协议 运行过程中的变量。对于有多个连接的tcp,每个连接都有一个tcb。tcb结构的定义包括这个连接使用的源端口、目的 端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列、应用层输出队列、tcp的重传有关变量。

image-20250327205454160

bash
四次挥手: 主动方要求关闭连接,FIN就是我想跟你断开连接 被动方收到了,说你稍等一下,我看看我还有没有数据要传给你或者你给我的数据我看看有没有接受完ACK。 确认完毕被动方给主动方发送断开连接请求FIN 然后主动方发送ACK确认,四次挥手断开 四次挥手: 1.伟苹向仓姐姐发送分手的请求。我要和你分手 FIN 2.苍姐姐收到回复 好的收到了 ACK 3.苍姐姐发送给伟苹 我们分手吧 FIN 4.伟苹回复 好的分吧 ACK SYN 请求建立连接 ACK 确认收到 seq 序列号 Ack 确认下次的序列号 FIN 分开 断开连接
4、为什么要四次挥手
bash
那四次分手又是为何呢? TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经 没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时 ,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据 要发送了,就会告诉主机1,我也没有数据要发送了,主机1收到主机2的FIN报文段时,回ACK,表示知道主机2也没有数据传输了,之后彼此就会愉快 的中断这次TCP连接。
5、TCP11 种状态集表示含义
bash
#查看开启的服务 [root@oldboy ~]#netstat -tnulp 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 1057/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1057/sshd: /usr/sbi udp 0 0 127.0.0.1:323 0.0.0.0:* 770/chronyd udp6 0 0 ::1:323 :::* 770/chronyd 客户端发送FIN给服务端-->ESTABLISHED-->FIN_WAIT1 第一次等待 服务端收到回复ACK: ESTABLISHED--->CLOSED_WAIT关闭等待收到后客户端:FIN_WAIT1-->FIN_WAIT2第二次等待服务端继续回复客户端FIN: CLISED_WAIT--->LAST_ACK 客户端回复确认ACK:FIN_WAIT2-->TIME_WAIT时间等待-->CLOSED状态最后服务端收到确认ACK: LAST_ACK---> CLOSED 各个状态的意义如下: CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”。 LISTEN :表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。 SYN_RCVD :表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED状态。 SYN_SENT :这个状态与SYN_RCVD状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。 ESTABLISHED :表示TCP连接已经成功建立。 FIN_WAIT_1 :这个状态得好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态有时仍可以用netstat看到。 FIN_WAIT_2 :上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2是没有超时的(不像TIME_WAIT状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个FIN_WAIT_2状态将一直保持到系统重启,越来越多的FIN_WAIT_2状态会导致内核崩溃。 TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文。TIME_WAIT状态下的TCP连接会等待2*MSL(MaxSegment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat/proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况) CLOSING :这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING状态,表示双方都正在关闭SOCKET连接。 CLOSE_WAIT :表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。 LAST_ACK :当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK状态。当收到对方的ACK报文后,也就可以进入到CLOSED可用状态了。
6、因特网层协议介绍
bash
ICMP Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 RARP 反向地址转换协议 ARP 地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。作用:有效的避免广播风暴的产生 动态ARP:自动完善ARP表信息,会定时更新ARP条目,自动更新ARP表时会消耗服务器性能,适用于主机更换频繁网络。 静态ARP:手工配置ARP表信息,不会实时更新ARP条目,节省服务器性能,适用于主机更换不频繁网络。
7、网络接入层介绍
bash
Ethernet 以太网(Ethernet)是一种计算机局域网技术。 FastEth 快速以太网(Fast Ethernet)是一类新型的局域网,其名称中的“快速”是指数据速率可以达到100Mbps,是标准以太网的数据速率的十倍。 Token Ring 令牌环网(Token Ring)是一种LAN协议,其中所有的工作站都连接到一个环上,每个工作站只能同直接相邻的工作站传输数据。 FDDI 光纤分布式数据接口,在光缆网络上发送数字和音频信号的一组协议。

7、IP 地址:crown:

1、IP 地址基本概念
bash
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址在网络层将不同的物理网络地址统一到了全球唯一的IP地址上(屏蔽物理网络差异),是唯一标识互联网上计算机的逻辑地址(相当于手机号码,可以通过唯一的手机号码找到手机),所以IP地址也被称为互联网地址(可见其重要性)。
2、IP 地址格式:crown:
bash
我们目前常用的IPv4中规定,IP地址长度为32位二进制,在表示时,一般将32位地址拆分为4个8位二进制,再转为4个十进制数表示,每个数字之间用点隔开,如127.0.0.1(localhost),这种描述方式被称为“点-数表示法” 点分十进制。 11111111 11111111 11111111 11111111 255.255.255.255 0 0 0 0 0 0 0 1 二进制 1 十进制 0 0 0 0 0 0 1 0 2 十进制 0 0 0 0 0 0 1 1 3 十进制 1 1 1 1 1 1 1 1 128 64 32 16 8 4 2 1 二进制转十进制算法: 将每个为1的位置相加得到十进制 0 0 0 0 0 1 0 1 转换成十进制 等于 5 0 1 0 0 0 0 0 0 转换成十进制 等于 64 1 1 0 0 0 0 0 0 转换成十进制 等于 192 1 1 1 1 1 1 1 1 转出成十进制 等于 255 十进制转二进制: 对每位为1的相减 做减法运算 1 1 1 1 1 1 1 1 128 64 32 16 8 4 2 1 将68十进制转换成二进制 0 1 0 0 0 1 0 0 将172十进制转换成二进制 1 0 1 0 1 1 0 0 将192.168.13.253十进制转换为二进制 192----1 1 0 0 0 0 0 0 168----1 0 1 0 1 0 0 0 13 ----0 0 0 0 1 1 0 1 253----1 1 1 1 1 1 0 1 IP地址层次:分为网络号和主机号两个层次。网络号表示主机所属网络,主机号表示主机本身。网络号与主机号的位数与IP地址分类有关

image-20250328150759630

image-20250328150839102

image-20250328150956871

3、IP 地址分配
bash
IP地址分配的基本原则是:要为同一网络(子网、网段)内不同主机分配相同的网络号,不同的主机号。
4、IP 地址类型
bash
#公有地址 公有地址(Public address)由InterNIC(Internet Network Information Center因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。全球唯一,不能出现重复. #私有地址 私有地址(Private address)属于非注册地址,专门为组织机构内部使用。缓解了地址枯竭 是可以重复使用的(不同局域网内) #以下列出留用的内部私有地址 A类 10.0.0.0--10.255.255.255 10.0.0.1-10.0.0.254 10.0.1.1=10.0.1.254 10.0.2.1=10.0.2.254 10.1.0.1=10.1.0.1=10.1.0.254 B类 172.16.0.0--172.31.255.255 172.16.0.1-172.16.0.254 172.16.1.1-172.16.1.254 11111111=255 C类 192.168.0.0--192.168.255.255 192.168.0.1-192.168.0.254 192.168.1.1-192.168.1.254 192.168.2.1-192.168.2.254
5、IP 地址常见分类:crown:
bash
#A类IP地址 一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。 A类IP地址 地址范围1.0.0.1到127.255.255.254 (二进制表示为:00000001 00000000 0000000000000001 - 01111111 11111111 1111111111111110)。最后一个是广播地址。 A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777212台。 #B类IP地址 一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。 B类IP地址地址范围128.0.0.1-191.255.255.254 (二进制表示为:10000000 00000000 0000000000000001----10111111 11111111 1111111111111110)。 最后一个是广播地址。 B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台。 #C类IP地址 一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。 C类IP地址范围192.0.0.1-223.255.255.254 (二进制表示为: 11000000 00000000 00000000 00000001 -11011111 11111111 11111111 11111110)。 C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台 #为什么网段是1-254,前三位表示网段,不能变,最后一个二进制00000000的8位多种排列组合加起来最大到254,二进制不能全为1,如果全为1表示网络位(网段),子网掩码决定你这个网络是什么网段的 #D类地址用于多点广播(Multicast)。 D类IP地址在历史上被叫做多播地址(multicastaddress),即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。 #E类IP地址 以“llll0”开始,为将来使用保留
6、特殊 ip 地址
bash
1.每一个字节都为0的地址(“0.0.0.0”)对应于当前主机; 2.IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址; 3.IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用。 4.IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试, 如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。 5.169.254.0.0~169.254.255.255,是开启了dhcp服务的设备但又无法获取到dhcp的会随机使用这个网段的ip 总结: 3类 A类 前1位网络位置 后三位主机位 127.0.0.1 127.255.255.254 B类: 前2位网络位置 后2位主机位 130.0.0.1 130.0.255.254 C类: 前3位网络位置 后1位为主机位 192.168.13.1 192.168.13.254
7、子网掩码:crown:
bash
子网掩码又叫网络掩码、地址掩码 上面我们说到IP地址分为网络号与主机号,但是路由如何区分网络号与主机号呢?就需要通过子网掩码。子网掩码必须与IP地址结合使用,A、B、C类的子网掩码分别为255.0.0.0,255.255.0.0与255.255.255.0(网络号字节为255,主机号字节为0)。 也就是说给你一个IP地址,那么怎么知道它的网络号和主机号各是多少位呢? 如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现 子网掩码的重要作用:就是将某个IP地址划分成网络地址和主机地址两部分。 子网掩码的位数就是网络的位数。A类网络的网络位数是8位,子网掩码就是255.0.0.0,B类网络的网络位数是16位,子网掩码是255.255.0.0,C类是24位,255.255.255.0。 /8 255.0.0.0 /16 255.255.0.0 /24 255.255.255.0
bash
例子1.不同子网下的主机能否直接通信(是否在同一网络网段) 假设两个IP地址分别是172.20.0.18和172.20.1.16,子网掩码都是255.255.255.0。 我们可以知道两者的网络标识分别是172.20.0和172.20.1,无法直接通信,也就无法PING通。要想能相互通信,需要将子网掩码改成255.255.0.0 例子2.如何理解172.20.1.0/18 11111111 11111111 11000000 00000000 前面18个1为网络位,前面两个1段为255.255,后面11二进制加起来为192 255.255.192.0

为什么要进行子网划分

bash
一个大的地址范围区域,你不进行划分的时候,会造成地址浪费 一个大的地址范围区域,可能会产生大量广播风暴,影响主机性能 一个大的地址访问区域,可能会造成网关路由器负载过高 将一个大的网段切割成一个一个小的局域网段,就称为子网划分 一个网段中可以有多少个地址=2的n次方-2 n表示的就是这个网段中有多少个主机位 -2 表示网络地址不能用,网络地址(主机位全 0) 表示广播地址不能用,广播地址(主机位全 1) 一个局域网中的地址在使用时要预留一个作为网关地址

image-20250328165827289

bash
网络位向右移动,占用主机位,即向主机位借位,生成新的网络位 其中/16就表示了子网掩码所指定的网络位个数,A类一般是/8 B类一般是/16 C类/24

image-20250328165922073

image-20250328163736940

bash
如果子网掩码/18表示的含义: 红线左边表示网络位,右边表示主机位,/18表示网络位需要向主机位借两位,那么会有4种可能,分别是00、01、10、11 如果是00,那么,网段就是从172.16.0.1-172.16.63.254(第三个网段后面全为1相加为63,第四个网段最高位254) 如果是01,那么,网段就是从172.16.64.1(第三个网段倒数第二位对应二进制为64)-172.16.127.254(63+64=127) 如果是10,那么,网段就是从172.16.128.1(第三个网段倒数第二位对应二进制为128)-172.16.191.254(63+128=191) 如果是11,那么,网段就是从172.16.192.1(第1位加第2位,128+64=192)-172.16.255.254(全部1相加为255)

image-20250328165755991

bash
运营商或者领导给我们一个IP地址加子网掩码我们必须要知道可配置的IP地址范围 116.63.0.10/29 网关: 116.63.0.9 https://www.36130.com/subnetmask/ 网关: 116.63.0.9 116.63.0.10 255.255.255.248 网关 116.63.0.9 配置到哪个服务器上.

image-20250328170225501

8、网关
bash
网关(Gateway)又称网间连接器,就是一个网络连接到另一个网络的“关口”。 网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为 255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是 不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机 处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它 自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络B向网络A转发数据包的过程。 所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由 功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。 # ifconfig route netstat 命令属于net-tools网络 工具包 ip add linux ifconfig linux ping linux windows nslookup linux route -n linux #查看到百度有几个路由器 tracert -d www.baidu.com windows [root@oldboy ~]#traceroute -n www.baidu.com #给网卡配置多个IP地址: 临时重启失效 笔记 [root@oldboy ~]#ip add add 10.0.0.210/24 dev ens33 [root@oldboy ~]#ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:0f:d0:2e brd ff:ff:ff:ff:ff:ff inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 10.0.0.210/24 scope global secondary ens33 #新配置的,可以ping通也可以连接,重启失效 valid_lft forever preferred_lft forever inet6 fe80::c0e4:8f3a:f68f:8466/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@oldboy ~]#ip address del 10.0.0.210/24 dev ens33 #临时删除网关: [root@oldboy ~]#ip route del 0/0 via 10.0.0.2 [root@oldboy ~]#route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 [root@oldboy ~]#ping www.baidu.com ping: www.baidu.com: Name or service not known #临时增加网关: [root@oldboy ~]#ip route add 0/0 via 10.0.0.2 [root@oldboy ~]#ping www.baidu.com PING www.a.shifen.com (110.242.69.21) 56(84) bytes of data. 64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=1 ttl=128 time=11.3 ms 64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=2 ttl=128 time=11.2 ms 64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=3 ttl=128 time=11.6 ms
9、抓包方式

Linux 抓包命令 tcpdump 是一个抓包工具,用于抓取互联网上传输的数据包

bash
tcpdump是一个用于截取网络分组,并输出分组内容的工具。凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具 tcpdump 支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息 #常用选项 [root@oldboyedu ~]#yum -y install tcpdump -i #监听哪一个网卡 -n #不把ip解析成主机名 -nn #不把端口解析成应用层协议 -c #指定抓包的数量 -S #不把随机序列和确认序列解析成绝对值 -w #将流量保存到文件中,文件中的信息是无法直接查看的 -r #读取文件中的内容 -v #输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。 -vv #输出详细的报文信息。 -nnvvi ens33 #抓取百度的包 [root@oldboy ~]#tcpdump -nnvvi ens33 host www.baidu.com dropped privs to tcpdump tcpdump: listening on ens33,5 link-type EN10MB (Ethernet), capture size 262144 bytes 18:32:42.220619 IP (tos 0x0, ttl 64, id 30900, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.0.200 > 110.242.69.21: ICMP echo request, id 1550, seq 1, length 64 18:32:42.231427 IP (tos 0x0, ttl 128, id 417, offset 0, flags [none], proto ICMP (1), length 84) #实例 企业中遇到无法远程连接拍错流程: IDC机房服务器 云服务器 1.ping通 2.通过页面或者机房插显示器连接服务器抓包 tcpdump -nni eth0 port 12345 3.在公司windows电脑使用telnet连接测试 cmd窗口-->telnet 服务器IP地址 12345 结果: 1.如果服务端可以看到来源公网IP地址 说明服务端做的限制 2.如果服务端来源IP地址不是公司公网IP地址 则需要放行抓取到的公网(打电话解决) 3.如果服务端收不到任何信息,说明是公司网络问题 保存到文件中 [root@oldboy:~]# tcpdump -w 1.txt -nnvvi ens33 dst www.baidu.com 查看文件中的内容 [root@oldboy:~]# tcpdump -r 1.txt 1、默认启动 tcpdump -vv #普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 2、过滤主机 tcpdump -i eth1 host 192.168.1.1 #抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据 tcpdump -i eth1 src host 192.168.1.1 #指定源地址,192.168.1.1 tcpdump -i eth1 dst host 192.168.1.1 #指定目的地址,192.168.1.1 3、过滤端口 tcpdump -i eth1 port 80 #抓取所有经过1,目的或源端口是80的网络数据 tcpdump -i eth1 src port 80 #指定源端口 tcpdump -i eth1 dst port 80 #指定目的端口 4、协议过滤 tcpdump -i eth1 arp tcpdump -i eth1 ip tcpdump -i eth1 tcp tcpdump -i eth1 udp tcpdump -i eth1 icmp #抓tcp某端口的数据包 tcpdump -i eth0 tcp port 21 -nn 5、常用表达式 非 : ! or "not" (去掉双引号) 且 : && or "and" 10. Linux常用网络命令 *1. 网卡命令规则* 或 : || or "or" #抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数 tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))' #抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据 tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))' #抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据 tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
10、常用网络命令
1、nc
bash
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具 #常用选项 -l #用于指定nc将处于侦听模式。 -u #指定nc使用UDP协议,默认为TCP -v #输出交互或出错信息,新手调试时尤为有用 -w #超时秒数,后面跟数字 -z #表示zero,表示扫描时不发送任何数据
2、telnet
bash
一种远程登录的工具。同样可以检查某个主机是否开启某个端口 默认端口23 #用法 主要功能链接路由器、交换机 telnet 192.168.13.1 [C:\~]$ telnet 10.0.0.99 22 Connecting to 10.0.0.99:22... Connection established. # 连接成功 说明22端口开启 To escape to local shell, press'Ctrl+Alt+]'. SSH-2.0-OpenSSH_7.4
3、netstat
bash
打印网络连接、路由表、tcp11种状态。 查看当前系统中运行了哪些服务端口 #常用选项 -l #只显示监听套接字。 -n #不做名字解析 -t #显示tcp端口 -u #显示udp端口 -p #显示pid和程序名字 -r #显示路由表 -a #显示所有的套接字 [root@oldboy ~]#netstat -tnulp 查看运行的服务 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 1068/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1068/sshd: /usr/sbi udp 0 0 127.0.0.1:323 0.0.0.0:* 782/chronyd udp6 0 0 ::1:323 :::* 782/chronyd [root@oldboy ~]#netstat -an|grep 10.0.0.200 tcp 0 0 10.0.0.200:22 10.0.0.1:60768 ESTABLISHED tcp 0 52 10.0.0.200:22 10.0.0.1:60009 ESTABLISHED #查看哪个ip端口和我建立的连接,当前状态是什么 [root@oldboy ~]#netstat -an|grep 10.0.0.200 tcp 0 52 10.0.0.200:22 10.0.0.1:53013 ESTABLISHED
4、ss
bash
跟netstat命令差不多。 #常用选项 -l #只显示监听套接字。 -n #不做名字解析 -t #显示tcp端口 -u #显示udp端口 -p #显示pid和程序名字 -r #解析主机名 -a #显示所有的套接字
5、iftop
bash
iftop界面说明: 界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。 中间的<= =>这两个左右箭头,表示的是流量的方向。 TX:发送流量 RX:接收流量 TOTAL:总流量 Cumm:运行iftop到目前时间的总流量 peak:流量峰值 rates:分别表示过去 2s 10s 40s 的平均流量 #常用选项 -i #设定监测的网卡 -B #以bytes为单位显示流量(默认是bits) -n #使host信息默认直接都显示IP -P #使host信息及端口信息默认就都显示 -m #设置界面最上边的刻度的最大值,刻度分五个大段显示 按q退出监控。 yum -y install dstat dstat -nf
6、nmap
bash
Nmap即网络映射器对Linux系统/网络管理员来说是一个开源且非常通用的工具。Nmap用于在远程机器上探测网络,执行安全扫描,网络审计和搜寻开放端口。 #常用选项 -p #指定端口号 -p22 #单个端口 -p22,80 #多个端口 -p1-1000 #1到1000之间的端口 企业案例: 写一个脚本 探测自己所有的服务器上开放的服务以及端口并且计算一些每个服务占用所有服务的百分比 100台服务器
7、tracert
bash
C:\Users\z1340>tracert www.baidu.com 通过最多 30 个跃点跟踪 到 www.a.shifen.com [110.242.70.57] 的路由: 1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.13.1 2 1 ms 1 ms 1 ms SMBSHARE [192.168.1.1] 3 3 ms 3 ms 2 ms 221.218.208.1 4 * * * 请求超时。 5 * * * 请求超时。 6 * * * 请求超时。 7 10 ms 11 ms 10 ms 110.242.66.186 8 10 ms 11 ms 11 ms 221.194.45.134 9 * * * 请求超时。 10 * * * 请求超时。 11 * * * 请求超时。 12 11 ms 10 ms 10 ms 110.242.70.57 跟踪完成。
6、重点
bash
网络重点: 1.网络常用命令 ping ip add route -n ifconfig nslookup tcpdump iftop iotop netstat -tnulp ss -an|grep tcp telnet tracert nmap windows ping nslookup mstsc cmd ipconfig/all ipconfig/flushdns ipconfig/displaydns 2.OSI七层模型 3.TCP三次握手 4.TCP四次挥手 5.DNS解析流程 6.子网掩码决定IP可用数量 7.静态路由动态路由理解

本文作者:张龙龙

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!