运维学习笔记

[up主专用,视频内嵌代码贴在这]

运维学习笔记

Linux云计算名词解释

云计算

云计算 = 公有云(阿里、华为、腾讯云) + 私有云 (OpenStack) + 混合云

云计算顾名思义,就是计算在云端

以公有云为例,是指比如我们有一个程序计算的任务,我放在了阿里云的服务器上,进行计算,得到结果。

而我不需要费心、费力准备一台机器了。

服务器是由云服务厂商提供的性能卓越、稳定可靠、弹性扩展的云计算服务。

云服务器免去了采购IT硬件的前期准备,让企业像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。

DevOps运维开发工程师

DevOps(Development和Operations的组合词),它是一组过程、方法与系统的统称,主要用于促进开发和运营保障团队之间的协作与沟通,从而提高应用程序和服务的交付响应速度。

  • 大概6:4 比例
  • 6 linux运维 : 4开发(Python/Go)

AIOps

2016年,Gartner提出利用AI技术的新一代IT运维,即AIOps(智能运维),可以解决未来企业可能遭遇的因IT故障而导致的业务中断。

AIOps是ITOM(IT运维管理软件)的升级和进步,它结合了大数据和机器算法、机器学习技术,通过海量信息的搜集和处理,发现、预测、解决故障,进一步推动了IT运维自动化,减少了人力成本。

CI/CD

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。

CI/CD 的核心概念是持续集成、持续交付和持续部署。

作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题。

Docker

Docker 是一个开源的应用容器引擎,通常包括客户端、守护进程、镜像、容器,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,再发布出去。

类似于一个集装箱,可以把货物规整的摆放起来

image-20250807171416595

特殊IP

  • 0.0.0.0

    • 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0 和端口 8080,那么通过这两个都能够访问该服务。
  • 127.0.0.1

    • 回环地址
    • IP从127.0.0.0到127.255.255.255都将环回到本地主机中;
    • 也就是你发送的数据来回在笔记本内绕圈。
    • 一般用于程序运行在本机,测试访问本机的该程序。
  • localhost

    • 是一个域名,主机名,一般和127.0.0.1绑定,同样是用作本地回环测试。

      image-20250808092441854

服务器是什么

  • 服务器指的是网络中能对其他机器提供某些服务的计算机系统,相对普通PC,服务器指的是高性能计算机,稳定性、安全性要求更高。
  • 服务器的高性能体现在高速的运转能力,长时间的可靠运行,强大的数据吞吐能力。

台式机可以当服务器用吗

仅仅从能够在网络中提供服务的角度来看,是可以的,但是个人台式机的性能、稳定性、安全性都达不到服务器的标准,因此更适合个人工作使用。

且个人笔记本、台式机一般都安装windows系统、易用,美观,处理日常工作。

而服务器一般安装linux系统,提供更强大、稳定的计算服务。

IP地址

提到“地址”,我们会想到快递,收发快递时候,得有发件人地址和收件人地址,才能保证快递能正确的送达目的地,比如这样

ip地址其实就是互联网上的地址,全称Internet Protocol Address,我们在网上刷知乎啊,刷美剧啊,和师妹聊天啊,其实就是一个一个数据包在互联网上收发的过程。

查看自己的IP(局域网)

IPv4(第四版本的IP协议)是构成现今互联网技术的基石协议;

查看自己的IP(公网)

访问该网址、即可得知自己在互联网中的IP地址。

IP地址理解

Ip地址由两部分组成,网络部分+主机部分

网络部分指的是同一个网段、好比咱们这间教室,就是路由器分配的一个局域网内,在这个局域网内的每一个人都有自己独立的主机地址。

于超老师 192.168.0.15

老王同学 192.168.0.46

其他同学 192.168.0.x

如果超哥想知道所有同学的IP,怎么办?

1.大伙现在查看一下自己的IP,然后发在微信群里

2.这个操作如果用自动化来实现该如何?

并且这个IP地址是有取值范围的,一个IP地址分为四段

1
2
3
a.b.c.d  用点分开

我们暂时只需要记住,a的取值范围是1~223 ,其他是0~255

特殊IP

  • 0.0.0.0
    • 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0 和端口 8080,那么通过这两个都能够访问该服务。
  • 127.0.0.1
    • 回环地址
    • IP从127.0.0.0到127.255.255.255都将环回到本地主机中;
    • 也就是你发送的数据来回在笔记本内绕圈。
    • 一般用于程序运行在本机,测试访问本机的该程序。
  • localhost
    • 是一个域名,主机名,一般和127.0.0.1绑定,同样是用作本地回环测试。

怎么使用特殊IP

  • 127.0.0.1是一个回环地址,属于虚拟的特殊地址,用于机器内部通信。
    • 程序部署在127.0.0.1上,只能自己访问调试。
  • 0.0.0.0才能够真正代表机器的网络地址。
    • 一个服务器可以有多个网卡、多个IP地址
    • 绑定0.0.0.0即表述注册在所有IP上,都可以访问到应用。

域名

任何连上互联网的电脑都可以通过一个公共IP地址访问到,但是IP地址比较难记忆,人类很难通过数字去区分网站的作用,并且IP地址会改变,那就更无法记忆了。

你能保证自己名字一直不变,但是你的手机号可能会换。

1
2
3
4
220.181.38.251 百度网 这个ip还不是固定的。。你换个网络环境,再试试百度的ip。
140.205.220.96 淘宝网

你会发现ip很难记忆,且难以使用。

为了解决这些问题,域名出现了。

域名说白了就是一个名字,就好比我们认人,不是喊名字,而是喊他的身份证号。。。。那必然不可行。

域名就是用于找到服务器位置的一串字母、数字的组合。

权威域名解释

腾讯云

https://cloud.tencent.com/document/product/242/8569

工信部域名管理说明

.XXX(顶级域名)为全球范围内的组织和个人提供经济可行的网上 展示平台,供其注册与公司名称或所提供服务一致的域名,旨在为 各行各业提供简单、全面、醒目的域名。

根据互联网名称与数字地址分配机构(ICANN)和国家政策法规 规定,.XXX 下二级域名注册应通过 ICANN2013 认证注册服务机构, 且该注册服务机构需获得国内电信主管部门批准。

域名的结构

一个域名是由几部分(有可能只是一部分,也许是两部分,三部分…)组成的简单结构,它被点分隔,不同于中文书写顺序,它需要从右到左阅读

www.yuchaoit.cn和yuchaoit.cn的关系是?

直接访问taobao.com和www.taobao.com区别是?

image-20211231100014740

image-20211230204848369

TLD (en-US) (Top-Level Domain,顶级域名)

顶级域名用于告诉用户该域名提供的服务类型。

顶级域名就是最后一个小数点,结尾的字母。

如.cn .net .com

世界上所有的顶级域名列表,可以在这里找到

https://www.icann.org/resources/pages/tlds-2012-02-25-en

未来我们可能会进入一个运维部门,专门维护企业内部DNS系统,就是要和域名打交道。

Secondary Level Domain, 二级域名

位于顶级域名前一个就叫做二级域名

taobao.com

yuchaoit.cn

父域名、子域名

域名总结

  • 顶级域
    • .cn
    • .com
    • .net
    • .gov
    • .edu
  • 二级域名(买域名就是二级域名,收费)
    • yuchaoit.cn
    • qq.com
    • baidu.com
    • taobao.com
  • 三级域名(从这里开始免费添加域名解析)
  • 依次类推、四级域名、五级域名

关于腾讯云做的域名解析

image-20250808093428676

公网/局域网/NAT

公网是什么

局域网是什么

NAT是什么

局域网的应用

  1. 你的家庭网络,使用的是路由器分配的一个局域网段,如192.168.1.0~192.168.1.255,这区间的IP数量,足够你家的电子产品使用。
  2. 局域网内的电子设备可以互相访问,你在家搭建了一个局域网游戏,CS枪战游戏,你隔壁的邻居不连你家WIFi的话,就没法和你一起玩。

公网的应用

  1. 运营商送你的一个光猫上存在一个公网IP地址,你家的局域网WIFI就是通过这个IP访问百度的。
  2. 你在腾讯游戏对战平台大厅,开了一个CS房间,密码超哥666,你邻居,很快速的加入到房间,你俩开始biubiubiu,开心的玩耍。这是因为你们两家,通过公网IP连接上了腾讯的游戏平台。

NAT网络地址转换

1.你连接家里的WIFI,路由器自动给你分配了一个局域网IP地址,但是能访问百度,就是路由器给你做了转换。

2.你家里会有多个联网设备,都会得到一个内网IP,每个设备都在刷抖音的时候,设备就是在向外发数据,你手机的内网IP被无线路由器转换为了公网IP。同理,抖音的视频数据,又被路由器转换后,发给了你的手机。

如果没有NAT功能,每个设备都需要一个独立的公网IP,那全世界的IPv4 IP地址,早就不够用了。

另外,在 IPv4 地址资源越来越紧张的今天,很多电信运营商,已经不再为用户分配公网 IP;而是直接在运营商自己的路由器上运营 NAT,为用户分配内网 IP。这样,只需要少量的 IP 地址,就可以支撑大量用户的上网需求。这样的 NAT 又叫做 CGN(Carrier-grade NAT,电信级 NAT)

家庭网络普遍使用端口映射的方式,NAT的核心是一张映射表(源IP地址,源端口,目的IP地址,目的端口),将内网源IP地址和端口映射到同一个公网地址的不同端口,如下图所示。

端口

我们通过ip可以找到服务器,问题是,服务器上会有很多的进程,该如何定位到具体的某一个应用程序呢?

下图是windows的任务管理器,比如微信,搜狗输入法,qq,都是每一个运行中的应用程序,称之为进程。

每一个进程都会有一个ID号,叫做PID,比如微信的进程ID号是15501,并且微信还打开了一个窗口,让我们用户可以和微信交互。

怎么理解这个窗口的概念?图解端口

image-20250808092927990

轻松理解端口

去银行办理业务,取钱===访问服务器上一张图片

找到银行地理位置===找到服务器IP,服务器位置

2号窗口办理取钱业务===80端口获取网站数据

常见端口

  • 80 http网站端口

  • 443 https网站端口

  • 22 linux连接端口

  • image-20250808095125109

image-20250808094818833

image-20250808095028358

image-20250808095348308

复习

关于特殊ip的实践

image-20250808100746525

image-20250808100716262

image-20250808112421210

linux安装流程

Linux命令入门

为什么要学Linux命令

  • Linux从诞生就是黑屏界面,所有操作倚靠命令完成,如磁盘读写、文件操作、网络管理等
  • 企业中,服务器的维护工作都是ssh客户端完成,没有图形界面
  • 程序员想要管理linux服务器,必须学习常用命令

Linux命令学习方法

  • 熟能生巧,多敲打,多练习即可
  • 不可能一下子掌握所有命令用法,学会使用搜索引擎查阅命令资料

当年超哥在一家美资企业,一位台湾老程序员送我的一本书。。。

可能是看我骨骼惊奇吧!!

img

打开终端,输入命令

image-20220104175259752

终端就是一个可以让你操作的地方,你打开终端,就可以输入指令,发给操作系统。

image-20220104180116480

什么是linux命令

就是你在linux系统里,输入linux系统才能识别的一些指令,你输入的一些固定存在的单词字母,就是命令。

image-20220104180341275


img

前面咱们已经成功安装了Linux系统–centos7,那么现在跟着超哥奔向Linux命令行的世界。

Linux命令格式

img

1.一般情况下,【参数】是可选的,一些情况下【文件或路径】也是可选的

2.参数 , 同一个命令,跟上不同的参数执行不同的功能

3.执行linux命令,添加参数的目的是让命令更加贴切实际工作的需要!

4.linux命令,参数之间,普遍应该用一个或多个空格分割!

1
2
3
1.完整的命令格式
2.没有参数,没有对象
3.没有参数,有对象

Linux命令提示符

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
命令提示符
[py@pylinux ~]$ 普通用户py,登陆后

[root@pylinux ~]# 超级用户root,登录后

root代表当前登录的用户

@ 分隔符

pylinux 主机名

~ 当前的登录的位置,此时是家目录

# 超级用户身份提示符
$ 普通用户身份提示符

美化命令提示符

1
2
3
4
5
[yuchao-linux-242 root /opt]#tail -2 /etc/profile
# 美化PS1显示
export PS1='\[\033[01;35m\][\[\033[01;32m\]\h\[\033[01;31m\] \u \w\[\033[31m\]\[\033[01;35m\]]\[\033[01;36m\]\$\[\033[00m\]'

[yuchao-linux-242 root /opt]#source /etc/profile

Tab命令补全

image-20220104200252888

linux终端里,系统为了让你更省心,不用记忆那么多内容,可以让你输入Tab键,可以快速列出你想要的内容,你只需要输入一个命令的开头即可,它一般可以补全linux命令,以及文件路径。

image-20220104181435847

1
2
3
[yuchao@localhost Desktop]$ ls
ls lsblk lscpu lshw lsipc lslogins lsmd lsmod lsof lsscsi lsusb
lsattr lscgroup lsdiff lsinitrd lslocks lsmcli lsmem lsns lspci lssubsys lsusb.py

Linux命令初体验

su命令

用于切换系统不同的用户。

如windows的用户切换,从老王用户,切换到小李用户。

image-20220104181947377

linux用户的切换,并且我们直接切换到超级用户,切换到皇帝身份。

1
2
3
4
5
# 短横线 -   表示切换用户且加载该用户的环境变量,且进入该用户家目录
[yuchao@localhost Desktop]$
[yuchao@localhost Desktop]$ su - root
Password:
[root@localhost ~]#

uname命令

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.作用:
显示系统信息
2.语法:
uname -参数

#
[root@localhost opt]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# 解释
Linux 系统名称

localhost.localdomain 主机名
3.10.0-862.el7.x86_64 内核版本号
3 是主版本号,重大变化,才会变动
10 是次版本号,新加功能后版本数字变化
0 表示修改次数
862表示编译次数
el7 表示是7代版本
x86_64 表示系统是64位的

发布时间
GNU/Linux是操作系统名称,开源计划

ls命令

功能:平铺显示目录下的文件列表

语法:

1
2
3
4
5
6
7
8
1.完整的命令格式
ls -l /

2.没有参数,没有对象,其实默认有一个点
ls

3.没有参数,有对象
ls /

关于路径

linux命令操作,关于要操作不同的文件,主要就分,绝对路径、相对路径

关于参数(选项)

1
2
3
ls -l  # 使用较长格式列出信息
ls -h #-h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小,kb、mb、gb
ls -a # 显示隐藏文件 ,linux下以.开头的文件,表示是隐藏的

单位换算

1
2
3
4
# 1TB = 1024GB
# 1GB = 1024MB
# 1MB = 1024KB
# 1KB(千字节) = 1024B(字节)

pwd命令

1
2
功能、语法
pwd(Print Working Directory) 显示当前目录

cd命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
主要功能:cd全称change directory,切换目录(从一个目录跳转到另外一个目录)

基本语法:
cd 涉及文件操作了,那就存在绝对,相对路径了


# 练习
[yuchao@localhost ~]$
[yuchao@localhost ~]$ pwd
/home/yuchao
[yuchao@localhost ~]$ cd /opt
[yuchao@localhost opt]$ ls
rh
[yuchao@localhost opt]$
[yuchao@localhost opt]$ cd ../home/yuchao
[yuchao@localhost ~]$
[yuchao@localhost ~]$
[yuchao@localhost ~]$ pwd
/home/yuchao

[yuchao@localhost ~]$ cd -
/opt
[yuchao@localhost opt]$
[yuchao@localhost opt]$
[yuchao@localhost opt]$ cd ~
[yuchao@localhost ~]$
[yuchao@localhost ~]$

特殊目录

1
2
3
4
- 上一次目录
~ 当前用户家目录
. 当前位置
.. 上一层位置

clear

1
clear 指令用来清除终端屏幕,在终端中通过快捷键 Ctrl+L 清除屏幕

shutdown

1
2
3
4
5
6
7
8
9
10
11
12
13
14
shutdown 以一种安全的方式关闭系统。
-r
重启。
-h
停机。

# 练习
[root@linux ~]# shutdown –h now #关机

[root@linux ~]# shutdown –h 23:00 #晚上11点关机

[root@linux ~]# shutdown –r now #重启

[root@linux ~]# shutdown –r +30 'reboot now' #30分钟后重启,并且提示reboot now

man命令

当你忘记了某个命令怎么用,以及参数有哪些,都是什么作用,该怎么查?

查于超老师的笔记?还是咋办?

1
man 命令,查看linux命令的帮助手册,以后慢慢看,且是英文的,知道这个方式即可,可以复制出来,翻译一下也行。

history

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
history 命令可以用来显示曾执行过的命令,且显示条目有数量限制,默认是1000个,可修改,超哥以后再说

[yuchao@localhost ~]$ echo $HISTSIZE
1000


# 显示所有历史记录
[yuchao@localhost ~]$ history

# 显示最后2条
[yuchao@localhost ~]$ history 2
2 cd
3 history 2

# 清空历史
[root@redhat ~]# history -c #清除历史记录

w命令

image-20250810094858722

hostnamectl命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
记忆方式:hostname + control 主机名控制的意思
作用:它是用来修改主机名称

语法
[root@10 ~]# hostnamectl --help
hostnamectl [OPTIONS...] COMMAND ...

Query or change system hostname.

-h --help Show this help
--version Show package version
--no-ask-password Do not prompt for password
-H --host=[USER@]HOST Operate on remote host
-M --machine=CONTAINER Operate on local container
--transient Only set transient hostname
--static Only set static hostname
--pretty Only set pretty hostname

Commands:
status Show current hostname settings
set-hostname NAME Set system hostname
set-icon-name NAME Set icon name for host
set-chassis NAME Set chassis type for host
set-deployment NAME Set deployment environment for host
set-location NAME Set location for host

centos7系统里有3类主机名

1
2
3
--transient         Only set transient hostname
--static Only set static hostname
--pretty Only set pretty hostname
  • 静态主机名,static,关机后,重启后,名字依然存在,因为信息写入了/etc/hostname文件,每次开机都会再读取该文件内容。
  • 临时主机名,transient,关机,重启后,你设置的主机名失效。
  • 优雅主机名,pretty,可以让主机名显示更好看,如一些特殊符号。

如何查看主机名,更改主机名

(注意切换到root用户)

1.查看主机名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 可以看到静态主机名
# 临时主机名,是系统默认读取的网络信息
# 还有系统平台信息,主机版本信息,内核版本


[root@10 ~]#
[root@10 ~]# hostnamectl
Static hostname: localhost.localdomain
Transient hostname: 10.96.0.145
Icon name: computer-vm
Chassis: vm
Machine ID: 340cf8a8efa8496494a0e9d7388e5f1f
Boot ID: 8bd702c0ae3b42248b789515e52def50
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10

2.设置静态主机名(基本用这个),永久生效

设置了永久主机名后,发现临时名字都没了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@10 ~]# hostnamectl set-hostname linux02.yuchaoit.cn
[root@10 ~]#
[root@10 ~]# hostnamectl
Static hostname: linux02.yuchaoit.cn
Icon name: computer-vm
Chassis: vm
Machine ID: 340cf8a8efa8496494a0e9d7388e5f1f
Boot ID: 0c2d37e952104524a0f1e58fdf33c2b5
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.el7.x86_64
Architecture: x86-64
[root@10 ~]#

3.配置优雅主机名

用在什么情况下?

当你的主机名,有特殊字符的话,主机名会自动修改你的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@10 ~]# hostnamectl set-hostname linux02.yuchaoit.cn
[root@10 ~]#
[root@10 ~]# hostnamectl
Static hostname: linux02.yuchaoit.cn
Icon name: computer-vm
Chassis: vm
Machine ID: 340cf8a8efa8496494a0e9d7388e5f1f
Boot ID: 0c2d37e952104524a0f1e58fdf33c2b5
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.el7.x86_64
Architecture: x86-64
[root@10 ~]#
[root@10 ~]# hostnamectl --pretty set-hostname "yuchao's linux01 server"
[root@10 ~]#
[root@10 ~]# hostnamectl
Static hostname: linux02.yuchaoit.cn
Pretty hostname: yuchao's linux01 server
Icon name: computer-vm
Chassis: vm
Machine ID: 340cf8a8efa8496494a0e9d7388e5f1f
Boot ID: 0c2d37e952104524a0f1e58fdf33c2b5
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.el7.x86_64
Architecture: x86-64

[root@10 ~]# hostnamectl --pretty
yuchao's linux01 server
[root@10 ~]#
[root@10 ~]# hostnamectl --static
linux02.yuchaoit.cn


# 如果你设置了不规则主机名,系统会去除特殊符号
[root@10 ~]# hostnamectl set-hostname "yuchao's linux01 server"
[root@10 ~]#
[root@10 ~]#
[root@10 ~]# hostnamectl
Static hostname: yuchaoslinux01server
Pretty hostname: yuchao's linux01 server
Icon name: computer-vm
Chassis: vm
Machine ID: 340cf8a8efa8496494a0e9d7388e5f1f
Boot ID: 0c2d37e952104524a0f1e58fdf33c2b5
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.el7.x86_64
Architecture: x86-64
[root@10 ~]#

扩展:安装VMware Tools(可忽略)

VMware Tools 是一套可以提高虚拟机客户机操作系统性能并改善虚拟机管理的实用工具。

例如,下面是在安装 VMware Tools 后才能使用的一部分功能:

  • 显著提高了图形性能,并在支持 Windows Aero 的操作系统上提供 Aero
  • Unity 功能;允许在主机桌面上显示虚拟机中的应用程序,就像任何其他应用程序窗口一样
  • 在主机与客户机文件系统之间共享文件夹
  • 在虚拟机和主机或客户端桌面之间拷贝和粘贴文本、图形和文件
  • 提高了鼠标性能
  • 将虚拟机中的时钟与主机或客户端桌面上的时钟进行同步
  • 使用脚本帮助自动完成客户机操作系统操作
  • 为虚拟机启用客户机自定。

安装步骤

1.点击,选择安装vmware tools

image-20220105102838837

2.打开命令行终端

image-20220105105303421

  1. 进入vmware tools安装路径,把文件复制出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@10 ~]# cd /run/media/
[root@10 media]# ls
yuchao
[root@10 media]# cd yuchao/
[root@10 yuchao]# ls
VMware Tools
[root@10 yuchao]# cd VMware\ Tools/
[root@10 VMware Tools]# pwd
/run/media/yuchao/VMware Tools
[root@10 VMware Tools]# ls
manifest.txt run_upgrader.sh VMwareTools-10.3.10-13959562.tar.gz vmware-tools-upgrader-32 vmware-tools-upgrader-64


# 复制这里的一个安装包
[root@10 VMware Tools]# cp VMwareTools-10.3.10-13959562.tar.gz /root
[root@10 VMware Tools]#
[root@10 VMware Tools]# cd /root
[root@10 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg VMwareTools-10.3.10-13959562.tar.gz

# 解压缩安装
[root@10 ~]#
[root@10 ~]# tar -xvf VMwareTools-10.3.10-13959562.tar.gz

# 进入目录,安装程序,一路回车,全部默认即可
[root@10 ~]# cd vmware-tools-distrib/
[root@10 vmware-tools-distrib]# ./vmware-install.pl


# 重启机器(注意,公司里的机器可别随便重启)

Linux系统文件

/etc初始化系统重要文件

  • /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件
  • /etc/resolv.conf:Linux系统DNS客户端配置文件
  • /etc/hostname (CentOS7) /etc/sysconfig/network:(CentOS 6)主机名配置文件
  • /etc/hosts:系统本地的DNS解析文件
  • /etc/fstab:配置开机设备自动挂载的文件
  • /etc/rc.local:存放开机自启动程序命令的文件
  • /etc/inittab:系统启动设定运行级别等配置的文件
  • /etc/profile及/etc/bashrc:配置系统的环境变量/别名等的文件
  • /etc/profile.d:用户登录后执行的脚本所在的目录
  • /etc/issue和/etc/issue.net:配置在用户登录终端前显示信息的文件
  • /etc/init.d:软件启动程序所在的目录(centos 6)
  • /usr/lib/systemd/system/ 软件启动程序所在的目录(centos 7)
  • /etc/motd:配置用户登录系统之后显示提示内容的文件
  • /etc/redhat-release:声明RedHat版本号和名称信息的文件
  • /etc/sysctl.conf:Linux内核参数设置文件

/proc重要路径

/proc/meminfo:系统内存信息

/proc/cpuinfo:关于处理器的信息,如类型,厂家,型号,性能等

img

/proc/loadavg:系统负载信息,uptime 的结果

/proc/mounts:已加载的文件系统的列表

/var目录下文件

/var/log:记录系统及软件运行信息文件所在的目录

/var/log/messages:系统级别日志文件

/var/log/secure:用户登录信息日志文件

/var/log/dmesg:记录硬件信息加载情况的日志文件

补充

Linux系统基础概念

提示:可以放大linux图形化终端的字体

1
2
ctrl   shift   +   放大字体
ctrl - 缩小字体

image-20220107135032207

1.严格区分大小写

windows:不区分大小写,比如你创建文件夹,输入大写,小写,windows都认为是同一个。

image-20220104112314933

linux严格区分大小写,文件夹的名字,大小写不同,就是不同的文件夹,文件也一样,因此我们后续对文件,文本操作,要注意大小写的区分处理。

image-20220107135032207

可以看到,仅有一个字母的大小写不同,也是3个文件夹。

2.文件扩展名

windows

Windows是依赖扩展名,区分不同的文件类型。比如

image-20220104112923872


image-20220104113039579

1
2
3
.txt 是普通文本,一般是记事本这样的编辑器打开
.exe 是window下可以直接执行的文件,比如qq.exe 双击可以运行出qq登录器
.doc 是word文档

windows下修改文件名,是会修改文件类型的,会修改文件属性。

image-20220104113652453


image-20220104113705995

linux

而linux是大有不同,通过权限位标识来确定文件类型,我们在学习文件属性篇,重点再讲解,先记住如下概念。

  • linux不通过文件扩展名来识别文件类型,文件扩展名,仅仅就是让运维人员能够肉眼一眼,就知道它是什么类型,便于管理
    • 但其实是该文件类型在创建时已经定义好,文件名只是用于显示,不像windows下有实际意义。
    • 即使你修改linux的文件名,也不会修改文件的类型。

image-20220104113943464


image-20220104114021021

扩展名小结

为了区分出文件类型,我们还是会给linux文件,添加上阅读性更好的文件扩展名字。

常见的有

  • 压缩文件
    • Linux 下常见的压缩文件名有 .gz、.bz2、.zip、.tar.gz、.tar.bz2、.tgz 等。
    • 为什么压缩包一定要写扩展名呢?很简单,如果不写清楚扩展名,那么管理员不容易判断压缩包的格式,虽然有命令可以帮助判断,但是直观一点更加方便。
    • 就算没写扩展名,在 Linux 中一样可以解压缩,不影响使用。
  • 软件安装包
    • 如windows下的exe文件一样作用,linux也需要安装软件,也有软件包的格式。后面学习软件管理时重点讲解。
    • 如redhat系列的RPM包,所有的RPM包都是.rpm后缀格式。
  • 脚本文件
    • 如shell脚本,.sh
    • 如python脚本,.py
    • 如java的 .java
  • 网页相关的文件
    • .html
    • .jpg
    • .js
    • .css

这张图下展示了大多的linux后缀格式

image-20220104114901241

3.Linux一切皆文件

image-20220104135614494

使用linux,记住一句话,linux一切皆文件,linux上所有的内容,都以文件的形式保存。

比如我们可以通过访问某个路径下的文件内容,读取如网卡的信息,读取如U盘的信息。

以查看进程为例,进程指的是系统上运行的一个程序,如windows下的进程,这是一段程序,通过任务管理器,才能找到它的信息。

image-20220104135923206

linux读取进程信息,可以直接找到进程的文件

image-20220104161003471

linux普通文件/文件夹

普通文件,类似windows里的txt文件概念,可以直接写入内容,查看文件内容,这就是普通文件。

windows普通文件特点,一般可以这么操作的就称之为普通文件,包括了很多类型,如.txt .doc

  • 编辑器直接打开
  • 写入,修改,保存,查看内容

image-20220104161540042

linux普通文件,如何区分,我们知道没法通过后缀名直接判断

有办法

image-20220104161937197

linux可执行文件

可执行文件,指的是,该文件,可以双击运行,产生一些执行任务,比如QQ安装包,批量处理脚本文件。

windows,肉眼可以通过不同的后缀,一般可以得知,是什么文件类型,如下是常见的可执行类型。

image-20220104162300660

linux,是否可执行,就不是后缀决定的,而依然是通过文件属性查看的。(这个属性,在你创建该文件时就决定了,以不同的linux命令决定)

image-20220104170830243

linux文件夹

可以通过肉眼观察(前提是安装了图形化linux界面),蓝色的是文件夹,以及文件属性开头是d,表示目录。

文件夹用于管理一堆文件,以及子文件夹。

image-20220104171007469

windows的文件夹就不多说了。

4.Linux的目录必须挂载后使用

挂载,mount,指的是给存储设备分配盘符,让我们能找到,使用存储设备(U盘,移动硬盘)

windows下的挂载,超哥的电脑里有好几块硬盘,C盘是固态硬盘,D,E两个盘是机械硬盘。

windows操作系统给硬盘加上了标记,我们通过C盘,盘符,即可找到C盘里的数据。

image-20220104172559463

linux里没有提供这样的字母,盘符。

而是

1.创建一个空文件夹,该文件夹有个名字,叫做挂载点(理解为windows下的盘符概念)

2.把设备和这个空文件夹做一个连接(这就叫做挂载),挂载是通过linux命令实现,后面讲。

图解linux挂载

image-20220104183304532

windows

  • 买硬盘
  • 分区
  • 格式化

linux

  • 买硬盘
  • 分区
  • 格式化
  • 挂载

挂载命令

1
mount  /dev/sda1 /mnt/chaoge_file

5.一切皆文件细节

linux/unix下的哲学核心思想是‘一切皆文件’。

1
“一切皆文件”,指的是,对所有文件(目录、字符设备、块设备、套接字、打印机、进程、线程、管道等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理。屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。虽然类型各不相同,但是对其提供的却是同一套操作界面。更进一步,对文件的操作也可以跨文件系统执行。

那么如何操作一个已经打开的文件?

1
文件描述符(file descriptor),简称fd。这里就使用到了“文件描述符”,它是一个对应某个已经打开的文件的索引(非负整数)。

文件类型

类型 简称 描述
普通文件 -,Normal File 如mp4、pdf、html log; 用户可以根据访问权限对普通文件进行查看、更改和删除,包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]
目录文件 d,directory file /usr/ /home/ 目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,就可以随意访问这些目录下的文件。能用#cd命令进入的。第一个属性为[d],例如 [drwxrwxrwx]
硬链接 -,hard links 若一个inode号对应多个文件名,则称这些文件为硬链接。硬链接就是同一个文件使用了多个别名删除时,只会删除链接, 不会删除文件; 硬链接的局限性:1.不能引用自身文件系统以外的文件,即不能引用其他分区的文件;2.无法引用目录;
符号链接(软链接) l,symbolic link 若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接,克服硬链接的局限性, 类似于快捷方式,使用与硬链接相同。
字符设备文件 c,char 文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到 即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。 #/dev/tty的属性是 crw-rw-rw-,注意前面第一个字 c,这表示字符设备文件
块设备文件 b,block 存储数据以供系统存取的接口设备,简单而言就是硬盘。 # /dev/hda1 的属性是 brw-r—– ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备 系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外
FIFO管道文件 p,pipe 管道文件主要用于进程间通讯。FIFO解决多个程序同时存取一个文件所造成的错误。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从FIFO文件里读数据,启动进程B往FIFO里写数据,先进先出,随写随读。 # pipe
套接字 s,socket 以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。用于进程间的网络通信,也可以用于本机之间的非网络通信,第一个属性为 [s],这些文件一般隐藏在/var/run目录下,证明着相关进程的存在

6.图解linux与Windows目录

Linux与windows区别

  • windows特点:E:\学习视频\高清视频\
  • Linux目录特点:/etc/hosts /root/data/yuchao.txt

img

Linux 系统目录结构基本特点:

1.Linux下一切从开始,根里面的第一层目录,叫做一级目录,然后依次二级目录。

2.Linux下面的目录是一个有层次的目录结构

3.在linux中每个目录可以挂载到不同的设备(磁盘)上

4.Linux 下设备不挂载不能使用,不挂载的设备相当于没门没窗户的监狱(进不去出不来),挂载相当于给设备创造了一个入口(挂载点,一般为目录)

操作系统目录分隔符

windows平台命令行目录分隔符

img

Linux平台命令行目录分隔符

img

Linux与Windows的目录结构比较

Linux首先是建立一个根”/“文件系统,所有的目录也都是由根目录衍生出来。

登录系统后,在当前命令窗口输入命令:

1
ls /

查看结果如下图:

img

在Linux底下,所有的文件与目录都是由根目录开始,是目录与文件的源头,然后一个个的分支下来,如同树枝状,因此称为这种目录配置为:目录树

目录树的特点是什么呢?

  • 目录树的起始点是根目录(/,root);
  • 每一个目录不止能使用本地的文件系统,也可以使用网络上的文件系统,可以利用NFS服务器挂载特定目录。
  • 每一个文件在此目录树中的文件名,包含完整路径都是独一无二的。

Linux目录挂载

挂载通常是将一个存储设备挂接到一个已经存在的目录上,访问这个目录就是访问该存储设备的内容。

对于Linux系统来说,一切接文件,所有文件都放在以根目录为起点的树形目录结构中,任何硬件设备也都是文件形式

img

如图所示,是U盘存储设备和Linux系统自己的文件系统结构,此时Linux想要使用U盘的硬件设备,必须将Linux本身的目录和硬件设备的文件目录合二为一,此过程就称之为挂载

1
2
挂载操作会隐藏原本Linux目录中的文件,因此选择Linux本身的目录,最好是新建空目录用于挂载
挂载之后,这个目录被称为挂载点

img

此时U盘文件系统已经是Linux文件系统的一部分,访问/sdb-u文件夹,即是访问访问U盘系统中的文件夹。

linx的环境变量

同学们应该都会配置windows下的环境变量(PATH),都知道系统会按照PATH的设定,去每个PATH定义的目录下搜索可执行文件。

那么如何查看Linux下的PATH环境变量呢?

1
2
3
4
执行命令:
echo $PATH
echo命令是有打印的意思
$符号后面跟上PATH,表示输出PATH的变量

PATH(一定是大写的)这个变量是由一堆目录组成,分隔符是”:”号,而不同于windows的”;”号。

img

绝对路径与相对路径

Linux中非常重要的概念–路径,路径用来定位如何找到某个文件。

Linux下特别注意文件名/路径的写法,可以将所谓的路径(path)定义为绝对路径(absolute)和相对路径(relative)。这两种文件名/路径的写法依据是这样的:

  • 绝对路径:由根目录(/)为开始写起的文件名或者目录名称,如/home/yuchao/test.py
  • 相对路径:相对于目前路径的文件名写法。例如./home/yuchao/exam.py或../../home/yuchao/exam.py,简单来说只要开头不是/,就是属于相对路径,

因此你必须了解,相对路径是:以你当前所在路径的相对路径来表示的。

img

例如你现在在/home 这个目录下,如要进入/var/log这个路径,如何写呢?

  1. cd /var/log (绝对路径)
  2. cd ../var/log(相对路径)

结果如图:

因为你在/home底下,因此你要回到上一层(../)之后,才能继续前往/var,特别注意:

  • . :代表当前的目录,也可以用./ 来表示,注意结尾的斜线,目录分隔符。
  • .. :代表上一层的目录,也可以用../来表示

img

img

图解绝对/相对路径

image-20220104182559992

Linux常见目录作用

img

  • /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。

  • **/boot:**这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • **/dev :**dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

  • **/etc:**这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

  • /lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

  • /opt: 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    1
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

  • /selinux: 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv: 该目录存放一些服务启动之后需要提取的数据。

  • /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

    sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp:这个目录是用来存放一些临时文件的。

  • /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

  • **/usr/bin:**系统用户使用的应用程序。

  • **/usr/sbin:**超级用户使用的比较高级的管理程序和系统守护程序。

  • **/usr/src:**内核源代码默认的放置目录。

  • /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

在linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。

值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。

Linux软件安装到哪

image-20220118183630133

linux 入门笔记

ip addr show

pwd打印

cd

mkdir xx

rmdir

如何远程连接

引用远程连接

centos dsq123456…

image-20250809164603811

linux指令,如何ssh登录

image-20250809165356162

一切皆文件

image-20250809183802546

image-20250809183920459

image-20250810002836160

image-20250810002859087

image-20250810002958804

image-20250810003200406

linux目录挂载

image-20250810003906897

image-20250810004405773

image-20250810004755524

image-20250810010624148

常见命令:

image-20250810010754070

image-20250810011808103

image-20250810012318913

image-20250810013131005

image-20250810013309855

image-20250810100713001

image-20250810101347941

image-20250810103054920

tab补全

image-20250810103320456

image-20250810103509082

image-20250810103658771

image-20250810103720539

image-20250810104116967

image-20250810104317606

image-20250810104659622

image-20250810105127772

image-20250810110757285

image-20250810110835855

image-20250810111545228

image-20250810112509897

image-20250810151517166

image-20250810151805664

image-20250810164742033

image-20250810165305123

image-20250810165346204

image-20250810165544219

image-20250810171510022

image-20250810171549301

image-20250810171650606

image-20250810171751590

image-20250810171819267

image-20250810172234084

image-20250810172713553

image-20250810172618383

image-20250810172835009

image-20250810172859143

image-20250810173037404

image-20250810173143291

image-20250810163254554

image-20250810163551350

image-20250810224504741

day05作业讲解2

相对路径

image-20250810224730677

image-20250810224748258

8.image-20250810230220175

image-20250810230316936

image-20250810230945428

image-20250810231137721

image-20250810232211500

image-20250810232340804

image-20250810232721911

image-20250810235215467

image-20250810235246419

image-20250810235321438

创建抖音神曲

mkdir

image-20250810235732948

image-20250810235908213

关于文件创建,结合绝对,相对路径的练习

image-20250811000537568

image-20250811000809106

关于dns的解析关系

image-20250811010205606

image-20250811010539964

image-20250811010956814

image-20250811011252966

image-20250811011638110

image-20250811011723944

image-20250811011746866

补充:

image-20250811012207257

image-20250811012234203

image-20250811012354013

Day06作业详解

什么是环境变量

image-20250811151725318

image-20250811152014540

image-20250811152246556

image-20250811152516938

image-20250811152549155

image-20250811152806598

image-20250811153010006

image-20250811153054463

image-20250811153119462

image-20250811153208277

image-20250811153244796

image-20250811153330572

image-20250811153423565

image-20250811153747331

image-20250811154126913

image-20250811154204255

image-20250811154251911

image-20250811154325971

image-20250811154408752

image-20250811154433833

image-20250811154500152

image-20250811154548711

image-20250811154712218

image-20250811154849956

image-20250811154908774

image-20250811154930870

image-20250811155431637

image-20250811155532216

image-20250811155831942

image-20250811155900569

image-20250811155612812

image-20250811160143446

image-20250811160156781

image-20250811160217831

image-20250811160252818

image-20250811160613149

image-20250811160733061

image-20250811160836267

image-20250811160857300

image-20250811160927028

image-20250811161054351

day07

image-20250811165938310

image-20250811170033132

Linux文件管理基础(一)

学习目标

1、了解文件命名规则和工作中的建议命名规则 2、会创建和删除目录mkdir/rmdir 3、会创建和删除文件touch/rm 4、了解复制cp和移动mv的区别会使用tar命令进行压缩和解压缩 5、掌握VIM的保存退出wq和不保存强制退出q!掌握VIM的快捷键yy,dd,gg,G,u 6、会使用tail命令查看文件 7、会使用find命令按文件名称查找文件

一、文件命名规则

1、可以使用哪些字符?

除了字符“/”之外,所有的字符都可以使用,但是要注意,在目录名或文件名中,不建议使用某些特殊字符,例如, <、>、?、* 等,尽量避免使用。

如果一个文件名中包含了特殊字符,例如空格,那么在访问这个文件时就需要使用单引号将文件名括起来。

linux的单引号、双引号是有区别的,双引号可以识别特殊符号,单引号,是不做字符转义。

建议文件命名规则:

由于linux严格区分大小写,所以尽量都用小写字母

如果必须对文件名进行分割,建议使用”_”,例如:

1
2
3
4
5
6
yuchao_bj_2022.txt
chaoge.txt
01.txt
02.txt
yunwei.log
yunwei01_linux.txt

2、文件名的长度

目录名或文件名的长度不能超过 255 个字符

尽量不要太长,另外文件名称一定要见名知意,可以使用英文单词

3、Linux文件名大小写

Linux目录名或文件名是区分大小写的。如 yuchao、Yuchao、yuchaO ,是互不相同的目录名或文件名。

不要使用字符大小写来区分不同的文件或目录。

建议文件名一律使用小写字母,做到见名知意最好。

4、Linux文件扩展名

Linux文件的扩展名对 Linux 操作系统没有特殊的含义,Linux 系统并不以文件的扩展名开分区文件类型。

例如,yuchao.exe 只是一个文件,其扩展名 .exe 并不代表此文件就一定是可执行的。

在Linux系统中,文件扩展名的用途为了使运维人员更好的区分不同的文件类型。

二、文件管理命令

在日常工作中,我们经常需要对Linux的文件或目录进行操作,常见操作包括新建,删除,更改,查看,复制,移动等。

1、目录创建/删除

在实际应用中,与目录相关的操作主要有两个:创建目录与删除目录

mkdir创建目录

命令: mkdir (make directory,创建目录)

作用:创建目录

语法:mkdir [参数选项] 路径(包含目录名)

常见参数:

-p:递归创建所有目录,如果想创建多层不存在的路径,可以使用-p参数实现。

-p表示parents,父级的意思

1
2
3
4
5
6
用法一:mkdir 不加参数,路径(需要包含目录名称)
示例代码:
# mkdir /tmp/chaoge/666/
含义:在/tmp/chaoge/目录下,创建一个文件夹名为666

特别注意:mkdir命令默认不能隔级创建目录,必须要求要创建的目录所在的目录一定要存在

练习递归创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 报错
[root@localhost ~]#
[root@localhost ~]# mkdir /tmp/chaoge/666/
mkdir: cannot create directory ‘/tmp/chaoge/666/’: No such file or directory

# 前提是,上一个文件夹存在
[root@localhost ~]# mkdir /tmp/chaoge
[root@localhost ~]#
[root@localhost ~]# mkdir /tmp/chaoge/666/
[root@localhost ~]#
[root@localhost ~]# ls /tmp/chaoge/666

# 也可以直接使用-p命令,自动创建所有不存在的目录
[root@localhost ~]# mkdir -p /tmp/yuchao/linux/yunwei
[root@localhost ~]#
[root@localhost ~]# ls /tmp/yuchao/linux/
yunwei

创建多个文件夹

1
2
3
4
5
6
# 注意,文件不要同名
[root@localhost ~]# mkdir /tmp/yuchao /tmp/chaochao /tmp/cc
mkdir: cannot create directory ‘/tmp/yuchao’: File exists

# 创建多个
[root@localhost ~]# mkdir /tmp/yu1 /tmp/yu2 /tmp/yu3

总结mkdir

1
2
3
4
5
6
7
8
9
10
11
12
1. 绝对路径创建
mkdir /yuchao-linux

2. 相对路径创建
先确定你的位置,作为参考,如/opt
mkdir ../yuchao-linux

3.使用参数,递归创建
mkdir -p /tmp/yuchao/linux/yunwei

4.一次创建多个目录
mkdir /tmp/yuyu1 /opt/yuyu1

提问,一个刚装好的机器,于超想创建 /yuchao/linux 文件夹,应该是什么命令?

删除空目录

命令: rmdir(remove directory缩写)

作用:删除空目录,目录不为空的话,就无法删除

语法:#rmdir [参数选项] 路径(包含目录名)

1
2
3
4
5
6
7
8
用法,删除一个目录
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
rh yuyu1
[root@localhost opt]# rmdir /opt/yuyu1
[root@localhost opt]#
[root@localhost opt]# ls /opt/
rh

2、文件创建、删除

touch创建文件

命令:touch

作用:创建文件,多次创建不报错,但是会修改文件的时间属性

语法:# touch 文件路径 [文件路径2 文件路径3 …]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1.创建多个文件,不写路径,记住,其实你不写路径,等同于./
[root@localhost opt]# touch chaoge.txt linux.txt
[root@localhost opt]# ls
chaoge.txt linux.txt

# 2.创建多个文件,带上路径
# 简单写法,同一个路径
[root@localhost opt]# pwd
/opt
[root@localhost opt]# ls
chaoge.txt linux.txt yuchao-linux
[root@localhost opt]# touch yuchao-linux/yu1.txt yuchao-linux/yu2.txt

# 3. 复杂写法,在多个目录下创建,需要你看清楚绝对,相对路径
[root@localhost opt]#
[root@localhost opt]# touch /opt/yuchao-linux/yu3.txt /tmp/yu4.txt
[root@localhost opt]# ls /opt/yuchao-linux/yu3.txt
/opt/yuchao-linux/yu3.txt
[root@localhost opt]#
[root@localhost opt]# ls /tmp/yu4.txt
/tmp/yu4.txt

# 4. 利用bash的花括号展开功能 {} ,先了解即可
[root@localhost opt]# touch /opt/{1..10}.txt
[root@localhost opt]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt chaoge.txt linux.txt yuchao-linux

总结touch

1
2
3
4
1.绝对,相对路径创建文件
2.一次性创建多个文件
3.结合绝对,相对路径,一次性创建多个文件
4.了解{} 花括号展开语法,高效

rm删除命令

命令:rm(remove缩写)

作用:删除文件或文件夹

语法:rm [参数选项] 文件或文件夹

选项:

-r :递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有子目录和文件

-f :强制删除,不提示任何信息。操作前一定要慎重!!!不小心你就删库跑路(放心,跑不掉的)

(别慌,孰能生巧,学习期间,你的虚拟机你随便删,前提是你做好快照!!删腻了,你上班就不会出错了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 1.删除单个文件
[root@localhost opt]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt chaoge.txt linux.txt yuchao-linux
[root@localhost opt]#
[root@localhost opt]# rm 10.txt
rm: remove regular empty file ‘10.txt’? y

# 2.删除多个文件
[root@localhost opt]# rm 1.txt 2.txt 3.txt
rm: remove regular empty file ‘1.txt’? y
rm: remove regular empty file ‘2.txt’? y
rm: remove regular empty file ‘3.txt’? y


# 3. 使用参数,不再提示,是否删除普通空文件
[root@localhost opt]# rm -f 4.txt 5.txt 6.txt

# 4. 删除文件夹,以及文件,发现有报错?因为缺少参数
[root@localhost opt]# rm 7.txt yuchao-linux/
rm: remove regular empty file ‘7.txt’? y
rm: cannot remove ‘yuchao-linux/’: Is a directory

# 使用-r参数,删除目录
[root@localhost opt]# rm -r yuchao-linux/
rm: descend into directory ‘yuchao-linux/’? y
rm: remove regular empty file ‘yuchao-linux/yu1.txt’? y
rm: remove regular empty file ‘yuchao-linux/yu2.txt’? y
rm: remove regular empty file ‘yuchao-linux/yu3.txt’? y
rm: remove directory ‘yuchao-linux/’? y
[root@localhost opt]# ls

# 5.省事写法,不提示,且递归,删除(经典的炸弹命令!!!!!!!!!!!!!!!)
[root@localhost opt]# mkdir -p /opt/yuchao/linux/yunwei
[root@localhost opt]#
[root@localhost opt]# touch /opt/{1..5}.txt
[root@localhost opt]# ls /opt/
1.txt 2.txt 3.txt 4.txt 5.txt yuchao

# 试试删除yuchao目录
[root@localhost opt]# rm -rf yuchao/
[root@localhost opt]# ls
1.txt 2.txt 3.txt 4.txt 5.txt

rm总结

1
2
3
1. rm 参数 文件对象
2. 绝对路径,相对路径
3. -r 递归删除文件夹 -f 强制删除

问题,如下操作,结果是什么

1
2
3
4
5
6
[root@localhost opt]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost opt]#
[root@localhost opt]# rm -rf /opt/

# 结果是什么?应该怎么样删除

3、复制与剪切

cp复制操作

命令:cp (copy缩写,复制操作)

作用:复制文件/文件夹到指定的位置

语法:#cp [参数选项] 源路径(含文件名) 目标路径(如不指定文件名,则文件名不变)

常见参数:-r:recursion,递归,用于复制目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.复制单个文件,位置不变
[root@localhost opt]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost opt]# cp 1.txt 1.txt.bak
[root@localhost opt]# ls
1.txt 1.txt.bak 2.txt 3.txt 4.txt 5.txt


# 2.复制当文件,位置变化,复制到另一个地方,且改名
[root@localhost opt]# cp 1.txt /tmp/1.txt.bak
[root@localhost opt]#
[root@localhost opt]# ls /tmp/1.txt.bak
/tmp/1.txt.bak

# 3.复制文件,还用原文件的名字
[root@localhost opt]# cp /opt/1.txt /tmp/

# 4.拷贝文件夹,只要文件夹里有东西,就得用-r 递归操作
[root@localhost opt]# ls /opt/yuchao/linux01/hehe.txt
/opt/yuchao/linux01/hehe.txt
[root@localhost opt]# cp -r /opt/yuchao/ /tmp/
[root@localhost opt]# ls /tmp/yuchao/linux01/
hehe.txt

image-20220105145905810

cp总结

1
2
3
4
1. cp拷贝文件,文件夹
2. 结合绝对,相对路径拷贝
3. 使用-r参数,可以递归拷贝文件夹及其内部文件
4. cp拷贝后可以直接重命名

问题:超哥在/opt下创建了一个linux.txt,需要拷贝到 /tmp下,名字改为linux.log

考虑多种情况,写写你的命令。

mv剪切操作

命令:mv (move,移动,剪切)

作用:可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名

语法:#mv [参数] 源文件 目标路径(不指定文件名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 1.移动文件路径
[root@localhost opt]# ls
1.txt 1.txt.bak 2.txt 3.txt 4.txt 5.txt yuchao
[root@localhost opt]#
[root@localhost opt]# mv 1.txt /tmp/
[root@localhost opt]# ls /tmp/
1.txt


# 2.移动文件,且改名
[root@localhost opt]# mv /opt/2.txt /tmp/2.txt.bak
[root@localhost opt]# ls /tmp
1.txt 2.txt.bak


# 3. 移动文件夹路径,且默认就是递归移动
[root@localhost opt]# ls
1.txt.bak 3.txt 4.txt 5.txt yuchao
[root@localhost opt]# mv /opt/yuchao/ /tmp/
[root@localhost opt]#
[root@localhost opt]# ls /tmp/
1.txt 2.txt.bak yuchao
[root@localhost opt]# ls /tmp/yuchao/
linux01

# 4. 移动且重命名文件夹
[root@localhost opt]# ls
1.txt.bak 3.txt 4.txt 5.txt
[root@localhost opt]# ls /tmp/
1.txt 2.txt.bak yuchao
[root@localhost opt]#
[root@localhost opt]# mv /tmp/yuchao/ /opt/yuchao-bak
[root@localhost opt]# ls /tmp
1.txt 2.txt.bak
[root@localhost opt]# ls /opt/yuchao-bak/linux01/hehe.txt
/opt/yuchao-bak/linux01/hehe.txt

mv总结

1
2
3
4
1. 可以移动文件,文件夹路径,实现剪切效果
2. 剪切同时还可以进行重命名
3. 默认剪切文件夹,就是递归剪切
4. 到底是剪切效果,还是重命名效果,由你的写法决定

4、tar打包压缩与解压缩

打包**,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。**

归档文件没有经过压缩,占用的空间是其中所有文件和目录的总和

tar命令在linux系统里,可以实现对多个文件进行,压缩、打包、解包

img

打包

将一大堆文件或目录汇总成一个整体。

压缩

将大文件压缩成小文件,节省磁盘空间。

img

1
2
3
4
5
6
yuchao.txt 5MB
yuchao.log 200MB
yuchao.html 500MB

这仨文件,可以打包为一个文件, yuchao-all.tar
还可以进行压缩,节省空间, yuchao-all.tar.gz,也就是这整个的文件体积,小于上面3个文件的体积总和。

打包

命令:tar

作用:将多个文件打包成一个文件

语法:tar 选项 打包文件名 要打包的文件或目录

常见参数:-c,create 创建的意思

-v,显示打包文件过程

-f,指定打包的文件名,此参数是必须加的。

-u,update缩写,更新原打包文件中的文件(了解)

-t,查看打包的文件内容(了解)

提示:

  1. tar命令打包的文件,通常称为tar包,如 yuchao-all.tar文件

提问:

这个.tar是个谁看的?是给centos看的,还是给运维超哥看的?

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 1.文件打成tar包,指定文件,进行打包
[root@localhost tmp]# cd /opt/
[root@localhost opt]# ls
1.txt.bak 3.txt 4.txt 5.txt yuchao-bak
[root@localhost opt]#
[root@localhost opt]# tar -cvf all-txt-opt.tar 1.txt.bak 3.txt 4.txt 5.txt
1.txt.bak
3.txt
4.txt
5.txt
[root@localhost opt]# ls
1.txt.bak 3.txt 4.txt 5.txt all-txt-opt.tar yuchao-bak

# 2.查看压缩文件内容
[root@localhost opt]#
[root@localhost opt]# tar -tf all-txt-opt.tar
1.txt.bak
3.txt
4.txt
5.txt


# 3. 再追加一个文件,塞进这个打包文件里
# 我们把整个文件夹,都塞进这个打包文件里
[root@localhost opt]#
[root@localhost opt]# tar -uf all-txt-opt.tar yuchao-bak/
[root@localhost opt]# tar -tf all-txt-opt.tar
1.txt.bak
3.txt
4.txt
5.txt
yuchao-bak/
yuchao-bak/linux01/
yuchao-bak/linux01/hehe.txt

打包并压缩(重点)

Linux下,常用的压缩工具有很多,比如 gzip、zip、bzip2、xz 等

tar 在打包的时候,是支持压缩的,gzip 、bzip2 、xz 压缩工具都可以在 tar 打包文件中使用。

命令:tar

作用:将多个文件打包并压缩成一个文件,其实就是tar命令的三个压缩参数

语法:tar 选项 打包文件名 要压缩的文件或目录

注意:并且压缩文件的名字,要根据你压缩时,选用的压缩参数,然后命名,做到见名知意。

常见参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
-z,压缩为.gz格式

-j,压缩为.bz2格式

-J,压缩为.xz格式

-c,create 创建的意思

-x,解压缩

-v,显示打包文件过程

-f,file指定打包的文件名,此参数是必须加的。

-u,update缩写,更新原打包文件中的文件(了解)

-t,查看打包的文件内容(了解)
# 1.打包且压缩文件
[root@localhost opt]# echo chaoge{1..5000000} >> chaoge.txt
[root@localhost opt]# ll -h
total 66M
-rw-r--r--. 1 root root 66M Jan 5 17:41 chaoge.txt

[root@localhost opt]# touch {1..10}.txt
[root@localhost opt]#
[root@localhost opt]# ll -h
total 66M
-rw-r--r--. 1 root root 0 Jan 5 17:42 10.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 1.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 2.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 3.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 4.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 5.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 6.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 7.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 8.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 9.txt
-rw-r--r--. 1 root root 66M Jan 5 17:41 chaoge.txt

# 查看打包压缩后的文件大小,的确是省了很多
[root@localhost opt]# tar -zcvf all-opt.tar.gz chaoge.txt 1.txt 2.txt
chaoge.txt
1.txt
2.txt
[root@localhost opt]# ll -h
total 78M
-rw-r--r--. 1 root root 0 Jan 5 17:42 10.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 1.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 2.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 3.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 4.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 5.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 6.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 7.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 8.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 9.txt
-rw-r--r--. 1 root root 12M Jan 5 17:44 all-opt.tar.gz
-rw-r--r--. 1 root root 66M Jan 5 17:41 chaoge.txt

提示,也有的时候,会看到如all-opt.tgz 这样的文件名字,也表示是通过gzip命令压缩后的。

这是属于运维内默认的命名标准,当你看到.tgz .tar.gz 就知道,解压时候,需要通过gzip解压。

拆包、解包

解包,指的就是把前面打包好的文件,拆开为散的文件。

记忆方式:拆包,就是把参数c,改为参数x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 1.找到你需要拆包的文件,
[root@localhost opt]# ll -h
total 132M
-rw-r--r--. 1 root root 0 Jan 5 17:42 10.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 1.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 2.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 3.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 4.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 5.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 6.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 7.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 8.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 9.txt
-rw-r--r--. 1 root root 66M Jan 5 18:18 all-opt.tar # 你看,这个未压缩的文件,没有节省空间
-rw-r--r--. 1 root root 66M Jan 5 17:41 chaoge.txt

# 2.解包
[root@localhost tmp]# tar -xvf all-opt.tar
./10.txt
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./6.txt
./7.txt
./8.txt
./9.txt
./chaoge.txt
[root@localhost tmp]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt all-opt.tar chaoge.txt

解压缩

解压缩就是比拆包,多了一个解压的参数 -z

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 打包+压缩
[root@localhost opt]# tar -zcvf all-opt.tar.gz ./*
./10.txt
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./6.txt
./7.txt
./8.txt
./9.txt
./chaoge.txt

# 解包+解压缩
[root@localhost tmp]# tar -zxvf all-opt.tar.gz
./10.txt
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./6.txt
./7.txt
./8.txt
./9.txt
./chaoge.txt

tar总结

image-20220105184455838


image-20220105190013728

教你一招,tar还能让你更省心

image-20220105190314280

思考题

如果我把文件名给改了,压缩文件还可以用吗?

1
2
3
4
5
6
7
8
9
10
11
[root@localhost tmp]# ll
total 11592
-rw-r--r--. 1 root root 11867538 Jan 5 18:21 all-opt.tar.gz

# 改名字
[root@localhost tmp]# mv all-opt.tar.gz all-opt
[root@localhost tmp]# ll
total 11592
-rw-r--r--. 1 root root 11867538 Jan 5 18:21 all-opt

# 还可以解压吗?为什么?名字不是变了吗

5、zip压缩与解压缩(了解)

一般见的较多的,就是tar包,zip包

zip压缩

命令:zip

作用:兼容类unix与windows,可以压缩多个文件或目录

语法:zip [参数] 压缩后的文件 需要压缩的文件(可以是多个文件)

参数选项:-r 递归压缩(压缩文件夹)

注意:

zip压缩默认压缩后的格式就是.zip,生成的压缩文件,自带zip

建议主动添加后缀.zip,一般都加上,这是个好习惯

1
2
语法
zip 压缩文件.zip 文件1 文件2 文件3 ...

案例,压缩文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost opt]# zip all-opt.zip  chaoge.txt 1.txt 
adding: chaoge.txt (deflated 83%)
adding: 1.txt (stored 0%)

# zip同样完成打包,压缩效果
[root@localhost opt]#
[root@localhost opt]# ll -h
total 78M
-rw-r--r--. 1 root root 0 Jan 5 17:42 10.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 1.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 2.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 3.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 4.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 5.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 6.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 7.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 8.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 9.txt
-rw-r--r--. 1 root root 12M Jan 6 09:23 all-opt.zip
-rw-r--r--. 1 root root 66M Jan 5 17:41 chaoge.txt

案例,压缩文件夹

1
2
3
4
5
[root@localhost opt]# zip -r all-opt2.zip yuchao chaoge.txt 
adding: yuchao/ (stored 0%)
adding: yuchao/linux/ (stored 0%)
adding: yuchao/linux/day01/ (stored 0%)
adding: chaoge.txt (deflated 83%)

unzip解压缩

解压缩需要使用另一个命令

功能说明:解压缩zip文件,unzip为.zip压缩文件的解压缩程序。

语法:unzip 压缩文件.zip -d 需要解压到哪个目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost opt]# ll
total 90460
-rw-r--r--. 1 root root 0 Jan 5 17:42 10.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 1.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 2.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 3.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 4.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 5.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 6.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 7.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 8.txt
-rw-r--r--. 1 root root 0 Jan 5 17:42 9.txt
-rw-r--r--. 1 root root 11867850 Jan 6 09:30 all-opt2.zip
-rw-r--r--. 1 root root 11867526 Jan 6 09:26 all-opt.zip
-rw-r--r--. 1 root root 68888896 Jan 5 17:41 chaoge.txt
drwxr-xr-x. 3 root root 19 Jan 6 09:30 yuchao
[root@localhost opt]#
[root@localhost opt]# unzip all-opt.zip -d /tmp/
Archive: all-opt.zip
inflating: /tmp/chaoge.txt
extracting: /tmp/1.txt
[root@localhost opt]#
[root@localhost opt]#
[root@localhost opt]# ls /tmp/
1.txt chaoge.txt

当然也可以直接解压到当前位置

1
[root@localhost tmp]# unzip all-opt.zip

zip和unzip总结

1.zip是对文件压缩,可以压缩多个文件,生成 如chaoge.zip

2.添加-r参数,可以压缩文件夹

3.解压缩,需要用unzip,就多了俩字母,添加-d参数可以指定加压到哪里

1
2
3
4
5
zip yuchao.zip  linux01.txt

unzip yuchao.zip

unzip yuchao.zip -d /tmp/

三、VIM文件编辑器概述

1
2
3
4
5
6
7
测试数据

I have a dog. My dog name is DuDu. DuDu is 9 years. DuDu is fat. It wears a white coat. DuDu has two big eyes and two small ears. It has one short mouth. My dog is smart. I like my dog. Do you like it?



我有一只狗。我的狗的名字叫嘟嘟。嘟嘟是9年。嘟嘟胖。它穿着一件白色外套。嘟嘟有两个大眼睛和两个小耳朵。它有一个短嘴。我的狗是聪明的。我喜欢我的狗。你喜欢吗?

Vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux 众多发行版的默认文本编辑器。

超哥提醒:使用vim 输入法保持是英文输入法状态。

1、vi编辑器

vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。

windows下的文本编辑器

image-20220106134819825

linux下的文本编辑器,vi

image-20220106135033158

由于是linux环境,不像windows那样操作简单,点点就可以使用编辑器,写入数据,保存文件。

linux的文件操作,都是要通过指令才能操作。

由于vi编辑器,功能较少,如同记事本一样,比较难用,我们会选择更驻主流,强大的vim,多了一个字母。

这就好比记事本难用,我们安装如sublime、notepad++这些编辑器一样,特点:

  • 需要额外安装
  • 功能更多

2、vim编辑器

有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

但是目前我们使用比较多的是 vim 编辑器。

vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。

vim 则可以说是程序开发者的一项很好用的工具。

1.vim编辑器需要额外安装,centos通过yum命令安装(需要机器正确配置网络,联网下载)

yum install vim -y

2.如果你是跟着超哥安装的linux系统步骤,那已经装好了vim了。

image-20220106140819758

验证是否有vim,在命令行输入vim即可。

1
[root@localhost tmp]# vim

如果提示,vim命令不存在,则你需要安装

1
command not found # 命令找不到

3、vim编辑器使用教程

基本上 vi/vim 共分为三种模式,分别是:

  • 命令模式(Command mode)
    • 当你使用vim 标记某个文件时,第一步就进入了命令模式。
    • 可以移动光标位置,输入快捷键指令,对文件进行编辑,如插入字符,复制,粘贴,删除等操作
  • 输入模式(Insert mode)
    • 可以对文件内容进行编辑。
  • 末行模式(Last line mode)底线模式
    • 进行一些特殊操作,如文本信息的查找,替换,保存,退出等;

还有一种特殊的可视化模式,用于批量的列选操作。

4、图解vim使用流程

image-20220106142359321


image-20220106143755744

5、vim实践

写入一首诗

1
2
3
4
5
6
7
8
9
10
11
12
清明
清明时节雨纷纷
孤家寡人欲断魂
借问美女何处有
路人遥指三里屯


春晓
春眠不觉晓
理工美女少
夜来睡不着
俺去网上找

实践

注意,如果要输入中文的话,vmware里的linux图形化界面可能不支持,需要额外配置。

建议后期,学习远程连接后,再进行中文写入。

所以这里,写入简单的英文即可。

5.1 vim打开文件

命令:vim

作用: 编辑器,修改文件内容;文件若不存在,默认创建该文件。

语法:vim yuchao.txt

1
[root@localhost opt]# vim chaoge.txt

此时就进入了命令模式

image-20220106152059806

5.2 vim保存且退出

任何模式下,都可以按下ESC键,回到命令模式,然后可以退出vim。

1
2
3
4
5
6
输入
:wq

: 进入底线模式
w write 写入
q quit 退出

image-20220106152208963

5.3 vim不保存且退出

image-20220106152259685

当你写错了,不想保存,就直接退出即可。但是一般要加上感叹号,强制该操作。

1
2
3
4
5
:q!

: 底线模式
q quit 退出
! 强制性

6、vim重点(命令模式)

6.1 进入命令模式

请回答怎么进入命令模式?

6.2 光标移动

进入命令模式后,可以移动光标,选择字符。

可以用如下步骤,快速写入一些文本信息

1.打开文件

2.进入编辑模式,写入内容

3.保存退出

1
2
3
4
5
6
[root@localhost opt]# cat chaoge.txt 
hello,my name is yuchao.

i will teach you to learn linux.

good good study, day day up !!

上下左右键

方法1:光标移动、上下左右

image-20220106154106996

方法2:四个字母 h、j、k、l,防止有的键盘没有上下左右

image-20220106154916593

行首、行尾

1、行首、光标移动到文件第一行(行首)

1
2
gg    移动光标到文档的首行
G    移动光标到文档尾行 【按下 shitf + g】

翻屏

适用于阅读内容较多的文本文件,一页屏幕,只能看到部分内容。

整页翻页命令为: Ctrl + f 键 f 的英文全拼为:forward;

Ctrl + b 键 b 的英文全拼为:backWord;

翻半页命令为: Ctrl + d 键 d 的英文全拼为:down;

Ctrl + u 键 u 的英文全拼为:up;

准备如下测试数据,查看翻页作用

1
2
3
4
# 生成100行数字
[root@localhost opt]# seq 100 > chaoge.txt

# 打开文件,练习翻页效果

ctrl+u/d

一屏就显示10行,翻半页,每次翻5行,理解半页。

image-20220106160155882

ctrl + up 和down 相对,向上5行。

ctrl + f /b

整页翻页,保留2行信息。

image-20220106160601140

定位到指定行(重点)

工作里,经常会遇见代码部署时出现报错信息,且程序会自动告诉你大约哪一行出错了,你得快速找到那一行。

比如如下报错

image-20220106160935650

就是告诉你,第50行出错了。

操作方式:

按下,行号 + G,即可快速跳转

image-20220106161114505

6.3 复制、粘贴

指令: yy

作用:复制光标所在行

指令:p

作用:移动光标到你想要粘贴的行,按下p,将粘贴到下一行,按下大写P,粘贴到上一行。

image-20220106161603252

6.4 剪切、删除

语法

1
2
3
4
5
6
7
8
9
10
1.指令:dd

作用: 剪切、剪切后可以自己选择是否粘贴(剪切后若是不粘贴,就是删除的效果)

2.指令:数字 + dd

作用:剪切指定的行,包括当前行

3.指令: D
作用: 删除当前行、光标处、以及后续内容。

dd

image-20220106165113784image-20220106165202389


image-20220106165210225

2dd

image-20220106165251440


image-20220106165358608

D

image-20220106165434444

6.5 撤销、恢复

指令:u (undo)(撤销上一次的动作,比如你写下了 ‘于超老师真帅’)

恢复:ctrl + r 恢复(你撤销后,又后悔了?redo 重做)

image-20220106165757316


image-20220106165820389

7. vim底线模式(重点)

7.1 进入底线模式

image-20220106170038656

进入底线模式流程

1.按下ESC,按2次

2.确保底线中没有其他字符

3.输入冒号 或者斜线(表示查找功能)

7.2 写入数据write

1
2
3
指令: 
:w 保存写入
:w /tmp/yuchao.txt 另存为文件

image-20220106170715849


另存为

image-20220106170950491

7.3 退出quit

1
2
指令:
:q 退出文件,不保存操作

image-20220106171131689

想退出,必须添加感叹号。

image-20220106171157375

7.4 保存且退出(重点)

当你确认你写的内容,需要保存到文件里,就输入wq

1
输入 :wq

image-20220106171526013

7.5 强制,感叹号

当你做了打开文件,不想对文件做任何修改,就是打开看看,啥也不变,就强制退出即可。

1
2
输入
:q!

image-20220106171836886

7.6 搜索、查找

查找你想要的内容,语法

当我们以后编辑代码,编辑配置文件,找到你想要的信息,就可以这样找。

1
2
# 找到包含yuchao的文本内容
/yuchao

image-20220106172107668

取消查找的高亮,输入指令

1
2
3
单词意思 no highlight
简写的指令
:noh

image-20220106172326901image-20220106200458589

7.7 替换

单行替换

当我们修改配置文件,修改代码文件,或者各种文件,可以使用替换的功能,来批量修改你想要的数据。

超哥提醒:但是前提你要注意,别全局替换,换错了数据!!

1
2
单行替换,替换一次
:s/源内容/新内容/

替换前

image-20220106173446110


替换后

image-20220106173531016

发现的确就替换了一次

如何替换单行中,所有的字符?

1
2
指令,多了一个g
:s/源内容/新内容/g

image-20220106174005102

全篇替换

刚才我们是修改单行中的字符内容,吧yuchao替换为了wuyanzu。

如果你要修改整篇文章里的一个字符,可以用如下全篇替换。

1
2
3
4
5
语法,多了一个百分号,替换整篇文章中,第一个匹配上的字符
:%s/yuchao/wuyanzu/

替换整篇文档中,彻底所有符合的条件,说白了就是把全篇文章,所有的yuchao,替换为wuyanzu
:%s/yuchao/wuyanzu/g

全篇替换,只替换每一行找到的第一个

image-20220106174817541

全篇替换,真正的全文替换。

image-20220106175055301

比如你修改一个脚本,有一个变量名字多次被调用,名字得改,可以利用全篇替换。

7.8 显示行号

当你打开一个文件,发现内容很多,但是没有行号,多少有点难以阅读,以及不好确定具体的配置行号。

1
2
3
指令
:set nu
表示 set number

image-20220106175747564

取消行号,比如你要复制多行的数据,不想要行号了

1
2
:set nonu
表示 set nonumber 就是不要number了

image-20220106175932550

7.9 paste模式

日常工作中,我们会频繁的复制粘贴各种配置,并且大多数配置文件,都是有格式,有缩进的,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

这一段配置文件,如果你直接ctrl + c/v 复制到linux中,vim是无法保证其格式的,那么这个配置文件就无法使用了。

还好vim提供了粘贴模式,能够完全保证复制的格式。

1
2
3
指令
:set paste 粘贴模式
:set nopaste 取消粘贴模式

1.进入粘贴模式

image-20220106181818368

2.复制粘贴

image-20220106181859565

3.保存退出即可。

8.编辑模式

1.按字母a、i、o进入编辑模式

2.按ESC退出编辑模式,回到命令模式

9. 可视化模式

操作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.进入可视化模式
ctrl + v

2.
方向键选择需要的可视化块
选择好后,可以进行操作,比如复制,比如删除
按下y 复制
按下d 删除

3.按下p
进行粘贴

4.退出可视化
按下ESC

9.1 选中复制

在你想复制的地方,光标所在的地方,按下ctrl + v,从光标处进入可视化模式

image-20220106182736484


复制你想要的区域

image-20220106182923801

p粘贴

image-20220106183014536


9.2 选中删除

image-20220106183138853

9.3 批量添加注释

注释指的是,备注、解释,一般用于大多数编程语言的脚本中,不会被加载的行,例如。

1
2
3
4
5
6
# def get_page_source(url):
# resp = requests.get(url)
# resp.encoding = 'gbk'
# return resp.text

print("hello world")

1.先进入命令模式,按下ESC,再按下ctrl + v ,进入可视化块

2.选中你想添加注释的行

image-20220106184300876

3.按下大写的字母I键,进入插入模式

image-20220106184710799

4.输入井号,#

image-20220106184755632

5.按下ESC键,自动就出现了多行注释 #

image-20220106184844461

9.4 删除多行注释

反之有时候我们要批量删除注释

1.按下ESC进入命令模式

2.按下ctrl + v 进入可视化块模式

3.批量选中注释符,删除

image-20220106195141755

10.彩色vim模式

颜色是这个世界很美丽的存在。

比如

image-20220106195537917

又比如

image-20220106195641399

加上颜色,是编辑器提供的功能,对一些关键字进行颜色高亮标识,就能让我们很容易的区分出,哪些是默认的关键字,哪些是我们自己写的程序。

总之,颜色让你轻松分辨出重要信息

vim是vi编辑器的升级版,很多大牛程序员能够直接在linux下使用vim开发,其作用是针对不同的编程语言,来识别不同的语法高亮着色。

10.1 shell

没有颜色

1
:syntax off 语法颜色关闭

image-20220106200458589

打开颜色

1
:syntax on

image-20220106200706880

10.2 python

image-20220106201154621

11.vim故障处理

当咱使用vim编辑器时,会遇见这样的一个错误界面,且很常见。

image-20220106201620288

什么时候会出现这个故障

(执行以下操作,能复现出这个swp故障)

  • 当多个人同时编辑了同一个文件,yuchao.txt
  • 当超哥编辑yuchao.txt时候,不小心关闭了窗口,或者机器突然断电关机了,这个文件还没保存。

11.1 解决swp

解决办法其实vim都有告诉你

image-20220106202944711

但是或许大家还不清楚怎么解决

11.2 模拟文件异常关闭

1
2
3
4
5
6
7
8
9
1. vim chaoge.txt 正常编辑文件
2. 写入信息 chaoge 666 ,编辑过程中,直接关闭窗口,模拟断电
3. 此时你再访问文件,会发现,多了一个隐藏文件

[root@localhost opt]# ll -a
total 12
drwxr-xr-x. 2 root root 29 Jan 6 20:33 .
dr-xr-xr-x. 17 root root 224 Jan 5 14:48 ..
-rw-------. 1 root root 12288 Jan 6 20:33 .chaoge.txt.swp

问题来了,刚才你写的 chaoge 666 去哪了?这是你写的,还未保存的数据,是要恢复,还是丢弃?

11.3 恢复未保存的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. 继续打开文件
vim chaoge.txt

2. 发现swp错误提示
输入R ,recover恢复

3.继续编辑,然后正常保存退出
:wq!

4.删除swp文件即可
[root@localhost opt]# ls -a
. .. chaoge.txt .chaoge.txt.swp
[root@localhost opt]#
[root@localhost opt]# vim chaoge.txt
[root@localhost opt]# rm -f .chaoge.txt.swp

11.4 不恢复,直接删除

当你确认未保存的数据不重要时,你可以选择直接丢弃即可,两个办法

1.直接删除.swp文件,使用rm命令删除.swp即可。

2.使用vim提供的指令,忽略,删除swp文件。

image-20220106204015798

vim关于swp总结

文件异常退出的话,vim会自动生成swp文件,保护你的未保存数据,你可以选择,是否保留这些数据。

今日学习总结

  1. 学习关于linux的文件操作
  2. 文件命名规则
  3. 文件管理命令
    1. mkdir、rmdir
    2. touch、rm
    3. cp、mv
    4. tar、zip、unzip
  4. 文本编辑器vim

今日作业

整理学习笔记,使用笔记+大脑,双重保障,理解+记忆知识点,要做到:

  • 理解每一小节知识点,如linux命令的语法、作用
  • 实践操作所学linux命令,动手敲打,真切感受和linux系统交互的过程
  • 记录练习过程中的操作,整理像超哥一样的笔记文档(专属你自己,最适合你自己阅读的文档)

加油,兄弟们,未来很美好。

linux文件创建与删除笔记

什么时候用-p创建

什么时候用-p创建

image-20250811203819905

image-20250811203919719

image-20250811204016567

文件与文件夹高速创建

touch

image-20250811205019308

image-20250811210156282

image-20250811210232176

image-20250811210452700

image-20250811210526802

image-20250811213029348

image-20250811214323037

虚拟机快照与rm命令

image-20250811223102912

image-20250811223330647

别名命令

image-20250811224323734

image-20250811224445129

MV命令

image-20250811232107074

压缩和解压

image-20250812000034125

image-20250812001019386

image-20250812001121945

image-20250812002101301

image-20250812002302172

压缩

image-20250812002448557

image-20250812002620052

image-20250812002727916

image-20250812002744549

image-20250812002855115

image-20250812003115778

zip压缩解压

image-20250812004817934

image-20250812005036604

vim

image-20250812010600296

image-20250812011825751

image-20250812154012635

day08作业讲解

image-20250812163630109

image-20250812163922495

image-20250812163957974

image-20250812164416256

image-20250812164445748

image-20250812173305857

image-20250812173554805

image-20250812175835287

image-20250812181008578

image-20250812181247409

image-20250812184600942

image-20250812184758140

image-20250812185357203

image-20250812185528923

image-20250812185744951

image-20250812185902477

image-20250812185953509

image-20250812190053860

image-20250812190125559

image-20250812190235805

image-20250812190330492

image-20250812190709926

image-20250812191217485

image-20250812191303009

image-20250812191541976

image-20250812191756959

image-20250812191925528

image-20250812192030965

image-20250812192154399

image-20250812192242139

image-20250812192341026

image-20250812192412881

image-20250812192510108

image-20250812192707645

vim重点命令模式

image-20250813004517725

image-20250813004701065

image-20250813005918849

image-20250813012453430

可视化模式

swp

Linux文件管理基础(二)

文件处理命令

1、查看文件内容

cat命令

命令:cat

作用:查看文件内容

语法:

1
2
# 读取文件内容
cat yuchao666.txt

注意:

cat 命令是一次性把文件内容全部读出来,即使yuchao666.txt文件里有十万条数据,也是全部读取显示.

会有什么问题?

一下你的电脑屏幕输出了十万条数据,首先你压根看不到需要的信息,并且你的机器可能卡死。

因此cat不适合读取大文件,适合阅读内容较少的文件。(当然可以结合其他linux命令,二次加工)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost opt]# cat chaoge.txt 
qweqwe

# 读取系统中默认配置文件
# 读取网卡配置文件
[root@localhost opt]#
[root@localhost opt]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2f548dc3-8cf4-410d-9cc4-c8bf3394e8dd"
DEVICE="ens33"
ONBOOT="yes"

读取且合并

cat命令可以读取文件内容、结合重定向符号,可以合并多个文件内容。

1
2
3
4
5
6
# 依次读取每一个文件的内容,依次写入all.txt
[root@localhost opt]# cat chaoge.txt hello.txt world.txt > all.txt
[root@localhost opt]# cat all.txt
chaoge 666
hello
world

more分屏命令

作用:分屏查看文件内容,一般用于读取较多内容文件,如小说文件。

特点:more和cat一样,会一次性读取文件所有内容,放入内存中,比较消耗资源,不适合太大文件。

语法:

1
more yuchao666.txt

使用more很简单,主要是像学vim一样,进行少量的指令操作。

more 命令的执行会打开一个交互界面,下面是一些常用交互命令:

回车键 向下移动一行。
d 向下移动半页,移动屏幕显示的一半。
space空格 向下移动一页。
b 向上移动一页。
/ 字符串 搜索指定的字符串。
:f 显示当前文件的文件名和行号。
q 或 Q 退出 more。
上下移动 没有该功能

image-20220107100210644

less命令

作用:和more一样,分屏读取文件

特点:不是加载整个文件,而是读多少,加载多少,读取大容量文件是很合适的。

语法:

1
less yuchao666.txt

和more一样,也需要通过指令控制,也是一个交互界面,指令一样。

回车键 向下移动一行。
d 向下移动半页,移动屏幕显示的一半。
space空格 向下移动一页。
b 向上移动一页。
/ 字符串 搜索指定的字符串。
:f 显示当前文件的文件名和行号。
q 或 Q 退出 more。
方向键 可以上、下移动

cat、more、less对比

cat more less
特点 显示小文件(一屏以内) 显示大文件(超过一屏) 显示大文件(超过一屏)
交互命令 /
上下键翻行 / /

head命令

作用:显示文件前N行

语法:默认显示前10行,可以传入数字参数

1
head yuchao666.log

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 默认显示
[root@localhost opt]# head num.txt
1
2
3
4
5
6
7
8
9
10


# 指定行
[root@localhost opt]# head -5 num.txt
1
2
3
4
5

tail命令(重点)

作用:tail是从结尾看,也可以指定行号,因为是文件结尾,也就是最新的数据,工作里常用来tail查看日志,以及持续检测日志文件内容变化,使用很多。

语法,参数:

1
2
3
4
5
6
7
8
# 默认后10行
tail yuchao777.log

# 后4行
tail -4 yuchao777.log

# -f 当文件增长时,输出后续添加的数据
tail -f yuchao777.log

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost opt]# tail num.txt 
41
42
43
44
45
46
47
48
49
50


# 后4行
[root@localhost opt]# tail -4 num.txt
47
48
49
50

image-20220107104543047

退出tail -f

使用ctrl + c 快捷键可以退出,表示cancel(取消),大多数linux下的操作,都可以用ctrl + c强制结束。

2、统计文件信息

wc命令

命令:wc(word count)单词统计

作用:用来统计文件内的信息,一般统计如(行数、单词数、字节数)

参数,语法

1
2
3
4
5
-l:表示lines,行数(以回车/换行符为标准)

-w:表示words,单词数 依照空格来判断单词数量

-c:表示bytes, 字节数(空格,回车,换行)

用法

image-20220107105043775

增加字符,没有换行

image-20220107105925382

du命令

作用:查看文件或目录(会递归显示子目录)占用磁盘空间大小

语法:du [参数选项] 文件名或目录名

常见参数:

1
2
3
-s :summaries,只显示汇总的大小,统计文件夹的大小

-h:表示以高可读性的形式进行显示,如果不写-h,默认以KB的形式显示文件大小

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost ~]# echo chaoge{1..5000000} >> num.txt 

# 查看大小的方式 ll -h
[root@localhost ~]# ll /opt/ -h
total 66M
-rw-r--r--. 1 root root 66M Jan 7 11:04 num.txt

# du查看,显示kb单位
[root@localhost ~]# du /opt/num.txt
67276 /opt/num.txt

# 友好显示
[root@localhost ~]# du -h /opt/num.txt
66M /opt/num.txt

# 显示文件大小总和
[root@localhost opt]# ll -h
total 198M
-rw-r--r--. 1 root root 66M Jan 7 11:04 num.txt
-rw-r--r--. 1 root root 66M Jan 7 11:09 num.txt.1
-rw-r--r--. 1 root root 66M Jan 7 11:09 num.txt.2

# 方式一
[root@localhost opt]# du -sh /opt/
198M /opt/

# 方式二
[root@localhost opt]# du -sh .
198M .

# kb单位
[root@localhost opt]# du -s .
201828 .

image-20220107110733945

image-20220107111210243

1.工作里,经常可能会因为某些文件过大,导致磁盘空间不够

2.比如长时间机器运行,生成了过多的日志,也需要定期+删除,释放磁盘空间。

1
2
[root@localhost opt]# du -sh /var/log
8.2M /var/log

批量统计,文件大小

1
2
3
4
[root@localhost opt]# du -h *
66M num.txt
66M num.txt.1
66M num.txt.2

3、文件查找

find命令(重点)

作用:用于搜索整个linux系统中的文件、文件夹,便于你找出机器上的文件。

语法:

1
find 搜索路径  选项1 选项1的值       选项2 选项2的值

find命令参数特别多,我们逐步深入学习,先了解最常用的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-name  指定文件名字,指定你要搜索的文件名字叫什么
以及可以填入 * 表示通配符,模糊搜索

-type 指定文件类型,文件还是文件夹,还是其他
一般的值有 f(file)找文件类型,d(directory) 文件夹类型


-o 或者的意思

[root@yuanlai-0224 ~]# find /var -name '*.txt' -o -name '*.log'
/var/log/tuned/tuned.log
/var/log/audit/audit.log
/var/log/anaconda/anaconda.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
/var/log/anaconda/packaging.log
/var/log/anaconda/storage.log
/var/log/anaconda/ifcfg.log
/var/log/anaconda/ks-script-QsGz2Q.log
/var/log/anaconda/ks-script-e5LS4J.log
/var/log/anaconda/journal.log
/var/log/boot.log
/var/log/vmware-vmsvc.log
/var/log/yum.log
/var/cache/yum/x86_64/7/base/mirrorlist.txt
/var/cache/yum/x86_64/7/timedhosts.txt
/var/cache/yum/x86_64/7/extras/mirrorlist.txt
/var/cache/yum/x86_64/7/updates/mirrorlist.txt

简单用法

小范围搜索、找出yu.txt

image-20220107113934662


大范围搜索,从根目录搜索,找出yu3.txt

image-20220107114054789


限定搜索文件的类型,加上-type参数

image-20220107114532523

复杂用法

上面都是精确查找,找出xx文件,还可以模糊查找,比如,找出linux上所有的.txt后缀的文件。


全系统搜索,模糊搜索,找出系统里的txt文件,注意得有类型限制

image-20220107114830509


加上类型限制,找出系统上所有txt文件。

image-20220107115105133


同理,找出系统上所有log类型,日志文件

image-20220107115543079

找出某个路径下,所有的文件夹

image-20220107115724955

找出某个路径下,所有的文件

1
[root@localhost opt]# find /opt -type f

4、文件内容查找

grep命令(重要)

我们很多时候,想直接搜索文件中的一些信息,前面学了可以使用如vim的搜索功能,但是多少不太方便,你还得打开文件。

比如你要搜索某一个配置文件,里面是否写入了一个配置参数,如bind 0.0.0.0

那就可以利用grep找一找,文件中是否有bind 0.0.0.0这个信息。

grep作用:直接在文件中搜索出你想要的数据,且显示。 语法,用法

1
grep '查找的内容' yuchao666.txt

准备用于测试的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost opt]# cat yuyu.txt 
I teach linux.

I like python.

My qq is 877348180.

My name is chaoge.

Our school website is http://yuchaoit.cn。

Where is my girl friend.

Who is your boy friend.
My phone number is 15233334444.

基本用法

查找哪些文本行包含了 My,注意是linux是严格区分大小写的

大写字母

image-20220107121537435

小写字母

image-20220107133129380

搜索系统日志文件

image-20220107135319519

在多个文件中,搜索信息

image-20220107135613563

忽略大小写 -i参数

image-20220107135956110

5、输出重定向

命令:输出重定向,表示linux下的两个符号

1
2
3
4
5
6
7
8
9
10
> 标准输出重定向。覆盖输出,覆盖掉原先的文件内容

>> 追加重定向,追加输出,不会覆盖原先文件内容,会在文件末尾追加内容


怎么记忆
6>5 6大于5

> 输出覆盖重定向 ,一个大于号
>> 追加输出重定向,俩大于号

语法:

1
2
3
4
5
用法1:
命令1 > 覆盖输出结果

用法2:
命令2 >> 追加输出结果

覆盖输出重定向

命令执行多次,结果反复被覆盖。

image-20220107140753384

追加输出重定向,俩大于号

5.1 echo命令

echo命令,用于打印、显示文本

用法很简单,对文本输出

1
2
3
4
5
[root@localhost opt]# echo 'chaoge 666'
chaoge 666
[root@localhost opt]#
[root@localhost opt]# echo chaoge linux 666
chaoge linux 666

5.2 echo结合重定向

echo 一般用于把文本信息,写入到文件中(可自动创建文件)

image-20220107142334092

image-20250813160128888

看图回答

image-20220107142415301

作业讲解与补充一

image-20250813161655195

lalias 别名指令

image-20250813161945437

使用md5sum命令+文件包名

1.网站服务端,提供了原文件的MD5唯一值

2,,用户进行下载后,要确保MD5值,和官网提供的一样,表示文件下载完整正确

image-20250813162506161

怎么互传

image-20250813162725523

image-20250813162803460

部署你的dnf网站

image-20250813172254391

image-20250813172332219

image-20250813172825892

image-20250813173223361

image-20250813173542204

文件命令二

cat:

只能读取小文件,不能读取大文件

image-20250813180423953

image-20250813180515323

image-20250813181955172

image-20250813182329815

tail命令

tac命令

head tail

image-20250813183100243

image-20250813214901961

image-20250813214921253

wc命令

du命令查看文件有多大

image-20250813215901895

文件查找

find

image-20250813221452004

Linux用户管理

学习目标

1、掌握用户、用户组的概念

2、使用linux命令对用户、用户组管理

3、掌握网络信息查看

4、掌握远程连接linux方式

用户管理篇

img

Root用户登录系统后可以做很多事

  • 写文档
  • 听音乐
  • 聊QQ
  • 聊微信
  • 写代码
  • 上班五分钟,闲聊俩小时
  • 打卡下班

当然了,完全可以坐在办公室,远程连接服务器工作。

多用户多任务

img

多个用户使用同一个操作系统,每个人做自己的事。

每个人都有自己的账号密码,权限也不一样,好比老板权限最大,员工权限较低

多用户大多都是远程登录去控制服务器

什么是用户管理

用户是什么

针对个人电脑

平时我们使用机器,都是自己使用,没有其他人公用,你有自己一个账号,和你自己的密码。

很少会创建多个用户,给别人使用。

windows:

用户就是你管理系统的一个账号。

image-20220107164134131

linux服务器

image-20220107164427294

为什么要说用户管理?

linux系统是一个多任务、多用户的系统,你可以登录,我也可以登录,可以很多人一起登录,同时操作这台机器。

  • 因此你作为运维,你是这个服务器的老大,你得保护你的服务器,不被别人祸害。(此时的你是管理员,你有root的密码)
  • 你可以降低这个用户权限,你也可以直接删除这个用户,让他无法登录你的服务器。(管理员可以修改其他用户信息)
  • 你可以修改其他用户的密码,让他直接密码错误,无法登录机器!(管理员就是这么牛)

linux也是一样,是你登录系统的一个账号,代表了你在该机器上的一个身份。

但是linux服务器在公司里是很多人一起在用的,服务器需要对多个用户设置不同的权限。

  • 每个用户的权限都有不同,可访问,可操作的计算机资源也是有限的。

这样做的好处是?

  • 加强系统安全性
  • 帮助系统管理员对正在使用机器的用户进行追踪管理

Linux用户分类

  • Linux系统不同用户权限不一样,好比小张想用我的服务器,我为了保护隐私与资料安全,开通普通用户(useradd xiaozhang),普通用户权限较低,随便他折腾了。
  • 还有计算机程序默认创建的用户,如ftp,nobody等等
  • 用户信息存放在/etc/passwd文件中

img

用户角色划分

  • root
  • 普通用户
  • 虚拟用户

现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立账户,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源。

普通用户在所分配到的资源内进行各自的操作,相互之间不受影响。

但是这些普通用户的权限是有限制的,且用户太多的话,管理就不便,从而引入root用户。

此用户是唯一的,且拥有系统的所有权限。

root用户所在的组称为root组。

“组”是具有相似权限的多个用户的集合。

图解用户、用户组

系统中的file.txt属于谁?

image-20220107171650587


手机的主人是谁?

手机比喻的是系统上的file.txt文件概念。

image-20220107173337354

linux的用户、用户组

linux支持多用户、多任务

举例,在一个安全公司里

1
2
3
4
5
6
7
8
9
10
11
12
13
于超老师所在的运维团队有3个人,分别是
于超、狗蛋、三胖

于超负责代码部署、系统中的名字叫 yuchao
狗蛋负责数据库部署,系统中的名字叫 goudan
三胖负责监控,系统中的名字叫 sanpang

公司的网站在服务器上运行着,运维团队要检查网站的状况,此时他们是分工很明确的,三人同时登录了服务器
1、yuchao的权限只能操作网站代码、日志等
2、goudan的权限只能操作数据库,登录、查看日志
3、sanpang的权限只能查看监控程序的状态、日志

并且他们不能越权访问其他人的文件资料,提示权限不够。

什么是用户

无论是谁,想访问服务器,用这台机器,必须先申请个账号,运维负责创建,然后再登录。

用户创建时,会同步设置密码,如

1
2
yuchao
1234567

在使用账号登录后,会立即进入自己的用户家目录(权限控制的死死的,你比如你进入一家单位,你是不是老老实实在工位上待着,你能直接去老板屋里转悠吗?)

windows下的管理员

img

linux下管理员

Linux/unix是一个多用户、多任务的操作系统。

root:默认在Unix/linux操作系统中拥有最高的管理权限。可以理解为qq群的群主⬇️⬇️⬇️

img

普通用户

普通用户:是管理员或者具备管理权限的用户所创建的,只能读、看,不能增、删、改。

什么是用户组

为什么要有组,说白了就是便于管理,公司里那么多人,怎么管理?分部门管理,不同的部门权限不一样。

假设有一个公司中有多个部门,每个部门中又 有很多员工。

如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设 置权限。

例如,可以通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的 数据库信息等。

img

linux的用户组

  • 为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用 户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方 便为组中的用户统一规划权限或指定任务。
  • 对于linux而言,比如公司的开发部门,需要访问服务器上一个文件夹的资料,并且允许读取、允许修改写入,开发部门有30个人,你要给每一个人都添加读写权限吗?
  • 那必然是给开发部门设置的权限就是,允许读写该文件夹,然后属于该部门的人员,就自然有了组内的权限,后续开发部门招新人,只要加入组内,权限也有了。
  • Linux管理员在创建用户时,将自动创建一个与其同名的用户组,这个用户组只有该用户一个人,

用户和组的关系

image-20220107175835501

  • 一对一,一个用户可以存在一个组里,组里就一个成员
  • 一对多,一个用户呆在多个组里面
  • 多对一,多个用户在一个组里,这些用户和组有相同的权限
  • 多对多,多个用户存在多个组里

(重点)图解linux用户和文件权限

image-20220309183224490

主组/附加组

什么是附加组

image-20220309185632011

主组:linux用户创建时会自动创建一个同名的组,称之为主组,且主组只能有一个。.

image-20220107180042382

附加组:除了主组外,用户还可以加入到其他组,属于多个组,额外添加的组,就叫附加组,且可以获得附加组的权限。

image-20220107180534969

root的权利

  • Linux系统的特性就是可以满足多个用户,同时工作,因此Linux系统必须具备很好的安全性。
  • 在安装RHEL7时设置的root管理员密码,这个root管理员就是所有UNIX系统中的超级用户,它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户,启动/关闭进程,开启/禁用硬件设备等等。
  • 因此“能力越大,责任越大”,root权限必须很好的掌握,否则一个错误的命令可能会摧毁整个系统。

root为什么权利这么大?

root只是个名字而已,权利很大的原因,在于他的UID是0。

1
2
[root@yuanlai-0224 opt]# id
uid=0(root) gid=0(root) groups=0(root)
  • UID,user Identify,好比身份证号
  • GID,group Identify,好比户口本的家庭编号
  • 在Linux系统中,用户也有自己的UID身份账号且唯一
  • 在Linux中UID为0,就是超级用户,如要设置管理员用户,可以改UID为0(不推荐该操作)
    • 建议普通用户用sudo提权。
  • 系统用户UID为1~999 Linux安装的服务程序都会创建独有的用户负责运行。
  • 普通用户UID从1000开始:由管理员创建(centos7),最大值1000~60000范围
  • centos6创建普通用户是500开始

如何管理linux的用户、组

日常我们对用户、组的操作包括:

  • 用户创建、删除、修改
  • 用户组创建、修改、删除

linux用户信息配置文件

/etc/passwd

img

/etc/passwd字段信息解释

字段名 解释
用户名 对应UID,是用户登录系统的名字,系统中唯一不得重复
用户密码 存放在/etc/shadow文件中进行保护密码
用户UID 用户ID号,由一个整数表示
用户组GID 范围、最大值和UID一样,默认创建用户会创建用户组
用户说明 对此用户描述
用户家目录 用户登录后默认进去的家目录,一般是【/home/用户名】
shell解释器 当前登录用户使用的解释器。centos/redhat系统中,默认的都是bash。若是禁止此用户登录机器,改为/sbin/nologin即可

其余用户、组相关配置文件

1
2
3
4
5
6
/etc/passwd 用户信息
/etc/shadow 用户密码信息
/etc/group 用户组信息
/etc/gshadow 用户组密码信息 ,在大公司,用户和组数量很大的情况下,需要制定复杂的权限管理,那时会用到组密码
/etc/skel
skel是skeleton的缩写,意为骨骼、框架。故此目录的作用是在建立新用户时,用于初始化用户根目录。系统会将此目录下的所有文件、目录都复制到新建用户的根目录,并且将用户属主与用户组调整为与此根目录相同。

密码文件的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#用户信息文件,权限是644,所有人可读,有一定安全隐患
[root@pylinux ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1698 10月 13 2019 /etc/passwd

#用户密码文件,除了root用户,其他用户默认是没有任何权限,
[root@pylinux ~]# ll /etc/shadow
---------- 1 root root 892 10月 20 2019 /etc/shadow

#用户密码文件
[root@pylinux ~]# tail -5 /etc/shadow
mysql:!!:17980::::::
yu:$1$Kx9cz6sK$GE3jiHtjJikn9Ai4ECINn/:18031:0:99999:7:::
epmd:!!:18074::::::
rabbitmq:!!:18074::::::
py:!!:18182:0:99999:7:::

linux命令实践(实践篇)

命令列表

命令 作用
useradd 创建用户
usermod 修改用户信息
userdel 删除用户及配置文件
passwd 更改用户密码
chpasswd 批量更新用户密码
chage 修改用户密码属性
id 查看用户UID、GID、组信息
su 切换用户
sudo 用root身份执行命令
visudo 编辑sudoers配置文件

组管理

创建一个devops组

groupadd组添加

作用:添加新组

语法

1
2
group 参数  组名
-g 设置组id号,默认从1000开始,1~999是系统预留的组

实践

[root@localhost opt]# groupadd devops

超哥提醒:

  • 执行后,不会有结果,就是正常的
  • 大多数情况下,命令敲完了,没有提示,就是好结果
  • 有提示,一般情况下表示可能出错了

(这规则仅针对小白,初学时可用。。成为老司机后,务必看懂linux的英文报错,以及知道自己在干什么)

检查组信息(附属组)

groupadd执行后,是将组信息,写入了文件,一个管理所有组信息的文件。

1
2
3
4
5
6
[root@yuanlai-0224 ~]# tail -5 /etc/group
yuchao01:x:1000:
zhiwei01:x:1001:
zhiwei001:x:1002:
fjh01:x:1003:
devops:x:1004:

如果你将yuchao用户,添加到devops这个组中,即可看到如下画面。

image-20220107182537507

1
2
3
4
5
字段解释:
组名,就是groupadd指定的名字
密码,x就是一个占位符,没有密码,组可以设置密码,一般不用
组ID,默认从1000开始,依次+1
附属组:比如yuchao用户,又加入了devops组

image-20220107183027871

groupmod组修改

1
2
3
4
5
语法 modify
groupmod 参数 组名

-g gid缩写,可设置组ID
-n name缩写,可设置组名

案例:将devops组信息改了。

1.修改组名

2.修改组的ID号

1
2
3
4
5
6
7
8
9
10
[root@yuanlai-0224 ~]# groupmod -g 1005 -n opsgroup devops
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# tail -5 /etc/group
yuchao01:x:1000:
zhiwei01:x:1001:
zhiwei001:x:1002:
fjh01:x:1003:
opsgroup:x:1005:

后续再添加新的组,id依然会继续累加。

groupdel组删除

1
2
语法
groupdel 祖名

案例

1
2
3
4
5
6
7
8
[root@localhost opt]# groupdel opschao
[root@localhost opt]#
[root@localhost opt]# tail -5 /etc/group
slocate:x:21:
postdrop:x:90:
postfix:x:89:
tcpdump:x:72:
yuchao:x:1000:

用户管理

关于用户的添加,删除,修改。

且用户信息和系统上的文件对应。

1
/etc/passwd

useradd添加用户

作用:给系统添加一个用户账户。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
useradd [选项 选项值] ...  用户名

选项
-g:表示指定用户的用户主(主要)组,选项值可以是用户组ID,也可以是组名

-G:表示指定用户的用户附加(额外)组,选项值可以是用户组ID,也可以是组名

u :uid,用户的id(用户的标识符),系统默认会从500 /或1000之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义【类似于腾讯QQ 的自选靓号情况】

c:comment,添加注释(选择是否添加)

-s:指定用户登入后所使用的shell 解释器,默认/bin/bash【专门的接待员】,如果不想让其登录,则可以设置为/sbin/nologin (重要)

d:指定用户登入时的启始目录(家目录位置)

-n:取消建立以用户名称为名的群组(了解)

useradd新建用户时,系统会自动创建一个同名组。

案例

1
2
3
案例
# 不带任何参数,创建用户chaoge
[root@localhost opt]# useradd chaoge

用户创建过程

1)在 /etc/passwd 文件中创建一行关于chaoge用户的数据

2)在 /etc/shadow 文件中新增了一行关于chaoge密码的数据

3)在 /etc/group 文件中创建一行与用户名相同的组,例如chaoge

4)在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息,例如chaoge

5)自动创建用户的家目录,默认在/home下,与用户名同名,如/home/chaoge

验证chaoge的创建

image-20220108090432907

/etc/passwd文件解析

这五个步骤里,passwd文件是重点要关注的

image-20220108092106106

用户名:登录linux时使用的用户名

密码:此密码位置一般情况都是”x”,表示密码的占位,真实密码存储在/etc/shadow,做了加密处理。

用户ID:用户的识别符,每个用户都有唯一的UID【-u】

用户组ID:该用户所属的主组ID;【-g】(可以通过-g修改主组)

注释:解释该用户是做什么用的;【-c】

家目录:用户登录进入系统之后默认的位置;【-d】

解释器shell:等待用户进入系统之后,用户输入指令之后,该解释器会收集用户输入的指令,转换成机器语言,传递给内核处理;

如果解释器是==/bin/bash 表示用户可以登录到系统==,==/sbin/nologin表示该用户不能登录到系统==【-s】

真实用法(重要)

需求:某游戏公司,缺一个运维岗,合适的候选人yuchao入职后,加入运维部门opslinux,用户ID是9657,允许登录服务器。

1
2
用法,先想语法
useradd -G 附属组 -u 用户ID -s 解释器 -c "注释" 用户名

解决思路,命令怎么敲,分析需求:

  1. 用户名 yuchao
  2. 运维部门opslinux
  3. 用户id是9657
  4. 允许登录,解释器是/bin/bash

尝试敲打命令,或许不会一次就正确,这是太正常了,人生不就是在错误N次后,才得到真理么。

1
2
3
4
5
6
[root@localhost opt]# useradd -G opslinux -u 9657 -s /bin/bash -c "user yuchao" yuchao
useradd: group 'opslinux' does not exist

[root@localhost opt]#
[root@localhost opt]# useradd -G opslinux -u 9657 -s /bin/bash -c "user yuchao" yuchao
useradd: user 'yuchao' already exists

学会看报错(重要)

1.错误信息useradd: group 'opslinux' does not exist

1
该组不存在

2.错误信息,useradd: user 'yuchao' already exists

1
2
3
4
5
6
7
8
用户已存在了

1.删除即可
userdel -r yuchao

2.或者你不该删除,公司有同名的 于超,宇超,是不是也可能?名字后加个数字即可。
yuchao1
yuchao2

答案

1
[root@localhost opt]# useradd -G opslinux -u 9657 -s /sbin/nologin -c "user yuchao2" yuchao2

image-20220108102953037

解释

  • id命令可以查看用户信息
    • 可见yuchao2有一个附加组1002,名字是opslinux
  • /etc/passwd 查看yuchao2的具体信息
  • /etc/group查看yuchao2组的信息
1
2
3
4
5
6
7
8
关于组的解释

yuchao2组,有一个9657的用户

opslinux组,组id是1002,并且组内有一个yuchao2用户

用户可以属于多个组,有多个附加组,语法就是
useradd -G opslinux,devlinux,testlinux -u 9657 -s /sbin/nologin -c "user yuchao2" yuchao2

id命令查看用户信息

命令:id

作用:查看一个用户的一些基本信息(包含用户id,用户组id,附加组id…),该指令如果不指定用户则默认当前用户。

image-20220108104914329

指定查看用户信息

image-20220108105301338

如何验证id命令看到的信息是否正常?

最正确就是看配置文件,用户信息都在/etc/passwd

id命令参数

id命令用于检查用户和组以及对应的UID,GID等信息

1
2
3
4
5
6
7
8
9
10
11
[root@pylinux ~]# id yu
uid=1000(yu) gid=1000(yu) 组=1000(yu)

[root@pylinux ~]# id -u yu #显示用户id
1000
[root@pylinux ~]# id -g yu #显示组id
1000
[root@pylinux ~]# id -un yu #显示用户名
yu
[root@pylinux ~]# id -gn yu #显示组名
yu

usermod修改用户信息

修改用户资料是很正常的事,比如我们也会经常修改自己的个性签名,修改自己的头像。

linux用户信息也一样可以改,当然修改了用户信息,影响的是该用户在linux服务器上的权限。

只能修改未登录的用户信息

命令:usermod(user modify)

语法:# usermod [选项 选项的值] … 用户名

作用:修改用户的各种属性

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-g:表示指定用户的用户主组,选项的值可以是用户组的ID,也可以是组名

-G:表示指定用户的用户附加组,选项的值可以是用户组的ID,也可以是组名

-u:uid,用户的id(用户的标识符),系统默认会从500 之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义【类似于腾讯QQ 的自选靓号情况】

-L:锁定用户,锁定后用户无法登陆系统lock

-U:解锁用户unlock

-c<备注>:修改用户帐号的备注文字

-d<登入目录>:修改用户登入时的目录

-s<shell>:修改用户登入后所使用的shell

用户管理案例

1
2
3
4
5
# 创建yuchao3
useradd -G opslinux -u 5000 -s /bin/bash -c "user yuchao3" yuchao3

# 设置密码,用于登录
passwd yuchao3

超哥的游戏公司,员工yuchao3,属于opslinux组,但是yuchao3申请年假10天,要去三亚度假,因此要禁止yuchao3的登录权限

并且要让xiaoyu用户接手yuchao3的工作,需要加入opslinux组,获取对应权限。

分析需求,思考命令怎么用

1.禁止yuchao3登录

2.修改xiaoyu用户加入opslinux组,以及注释。

答案

1
2
3
4
5
# 上锁,禁止登录
usermod -L yuchao3

# 解锁 unlock
usermod -U yuchao3

禁止登录

image-20220108111211903


的确无法登录

image-20220108111427051


解锁用户yuchao3

1
2
[root@localhost ~]# usermod -L yuchao3
[root@localhost ~]# usermod -U yuchao3

image-20220108111541125

修改xiaoyu用户属性,加入opslinux组,获得运维组的权限。

image-20220108111916401

查看组

image-20220108112029799

passwd修改密码

linux创建的用户必须有密码,才可以登录系统,否则无法登录。

1
2
3
4
5
语法

passwd 用户名

若不加用户名,默认操作当前登录的用户。

密码若是太简单,系统会给你些告警,工作里的密码是有复杂度的。

image-20220108112330807

改他人密码

注意root可以改其他人密码,因为他是管理员,是老大。

xiaoyu可以改yuchao3的密码吗?你算老几。。凭什么。。

image-20220108112522678

权限不够

1
passwd:只有root可以指定一个用户名。

image-20220108112651021

标准输入密码

1
2
3
[root@yuanlai-0224 ~]# echo '123456' | passwd  --stdin yuchao2
Changing password for user yuchao2.
passwd: all authentication tokens updated successfully.

/etc/shadow文件

1
2
3
[xiaoyu@localhost ~]$ ll /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 2478 Jan 8 11:17 /etc/passwd
---------- 1 root root 1451 Jan 8 11:24 /etc/shadow

查看文件权限可知,linux默认允许/etc/passwd文件是所有人都可读的,很容易造成数据泄露,linux特意将密码单独拆成了/etc/shadow文件,且该文件所有人没有任何权限操作(root除外)。

useradd流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.用户添加,用户id,组id会递增
useradd cc1

2.检查/etc/passwd
[root@localhost ~]# grep 'cc1' /etc/passwd
cc1:x:9659:9659::/home/cc1:/bin/bash

3.检查group
[root@localhost ~]# grep 'cc1' /etc/group
cc1:x:9659:

4.检查密码文件
[root@localhost ~]# grep 'cc1' /etc/shadow
cc1:!!:19000:0:99999:7:::

默认是没有密码的

passwd流程

给用户设置密码后,自动在/etc/shadow文件中更新,且密码是加密显示的。

1
2
3
4
5
6
# 一次性查找3个文件
# 密码已经写入了文件
[root@localhost ~]# grep cc1 /etc/passwd /etc/group /etc/shadow
/etc/passwd:cc1:x:9659:9659::/home/cc1:/bin/bash
/etc/group:cc1:x:9659:
/etc/shadow:cc1:$6$vCRZejnq$tltuM.t1GNqJys0LuT.XmNP7gzR5CiY.qEYHyCfRh.mkLsHHOLWtC.bagWr/EaRd.IJQMsM7zMsd3HPYiQ2t40:19000:0:99999:7:::

如果密码显示是俩感叹号,表示空密码

1
2
3
4
5
chaoge:!!:19000:0:99999:7:::
yuchao2:!!:19000:0:99999:7:::
xiaoyu:$6$zVDwzrCs$TugaM6bsFwif1g/N7e5jnFybwyUjimaxOUErJYCZcLXbqysKNwJNnNEFZkUqNyiEw8MhJ7l96fCWzzJINt/2/0:19000:0:99999:7:::
yuchao3:$6$4r2o0pKP$ziZZ6pu7CekTVSJVKfKPOkyKUfwHMnaulPjM9SEba6ALP1WbssTt48ommeYh9PEidgkPeug/SHGjnNB1MVHJx1:19000:0:99999:7:::
cc1:$6$vCRZejnq$tltuM.t1GNqJys0LuT.XmNP7gzR5CiY.qEYHyCfRh.mkLsHHOLWtC.bagWr/EaRd.IJQMsM7zMsd3HPYiQ2t40:19000:0:99999:7:::

userdel删除用户

建议注释/etc/passwd用户信息而非直接删除用户

删除用户,以及删除用户家目录。

参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
语法
userdel(选项)(参数)
选项
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。

例如
userdel oldyu # 保留家目录

userdel -rf oldchao # 强制删除用户与其家目录
# 查看/home目录,普通用户被统一放在这里管理,用户的个人配置文件等。
[root@localhost ~]# ls /home/
cc1 cc2 chaoge xiaoyu yu1.txt yuchao2 yuchao3

# 删除普通用户yuchao2
userdel yuchao2

有可能出现如下错误,因为该用户可能正在被使用中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@localhost ~]# userdel yuchao2
userdel: user yuchao2 is currently used by process 11676

1.意思是该用户正在被进程11676使用。
2.停止该进程,该用户也就没人再用了

查看该进程是谁
[root@localhost ~]# ps -ef|grep 11676
yuchao2 11676 1 0 15:00 ? 00:00:00 /usr/bin/gnome-keyring-daemon --daemonize --login
root 13323 13048 0 15:15 pts/0 00:00:00 grep --color=auto 11676

# 杀掉这个进程
kill 11676

3.再次删除该用户,。注意该方式是不对的,得连带家目录一起干掉
[root@localhost ~]#
[root@localhost ~]# userdel yuchao2

[root@localhost ~]# ls /home/yuchao2 -d
/home/yuchao2

[root@localhost ~]# cd /home/
[root@localhost home]# ls
cc1 cc2 chaoge xiaoyu yu1.txt yuchao2 yuchao3
[root@localhost home]# rm -rf yuchao2


4.正确删除姿势
[root@localhost home]#
[root@localhost home]# userdel -r cc2
[root@localhost home]# ls -d /home/cc2
ls: cannot access /home/cc2: No such file or directory

5.用户信息文件里的数据也会被删除
[root@localhost home]# grep 'cc2' /etc/passwd /etc/group /etc/shadow

所以删除用户,删除了什么

  • 配置文件里的账户信息
  • /home下家目录

whoami、who、w、last、lastlog

whoami显示可用于查看当前登录的用户,我是谁

1
2
[root@pylinux ~]# whoami
root

w命令显示当前以登录的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@pylinux ~]# w
04:15:01 up 15 days, 18:03, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 122.71.x5.xx 04:05 5.00s 0.07s 0.00s w

1.显示当前系统时间、系统从启动到运行的时间、系统运行中的用户数量和平均负载(1、5、15分钟平均负载)
2.第二行信息
user:用户名
tty:用户使用的终端号
from:表示用户从哪来,远程主机的ip信息
login:用户登录的时间和日期
IDLE:显示终端空闲时间
JCPU:该终端所有进程以及子进程使用系统的总时间
PCPU:活动进程使用的系统时间
WHAT:用户执行的进程名称

who

1
2
3
4
[root@pylinux ~]# who
root pts/0 2018-07-12 04:05 (122.71.x5.xx)

名称 用户终端 用户登录的系统时间 从哪来的机器ip

last、lastlog命令查看用户详细的登录信息

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#last命令显示已登录的用户列表和登录时间
[root@pylinux ~]# last
root pts/0 122.71.x5.xx Thu Jul 12 04:05 still logged in
root pts/0 122.71.x5.xx Thu Jul 12 04:02 - 04:05 (00:02)
root pts/1 122.71.x5.xx Wed Jul 11 16:56 - 16:57 (00:00)

wtmp begins Sun Jul 8 06:23:25 2018
lastlog命令显示当前机器所有用户最近的登录信息


last读取的是如下文件信息,二进制加密数据。
[root@yuanlai-0224 ~]# ll /var/log/wtmp
-rw-rw-r--. 1 root utmp 170112 Mar 12 15:16 /var/log/wtmp



[root@pylinux ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/0 122.71.65.73 四 7月 12 04:05:09 +0800 2018
bin **从未登录过**

yu pts/0 四 7月 12 04:05:51 +0800 2018
epmd **从未登录过**
rabbitmq 日 9月 29 03:42:01 +0800 2019
py pts/0 四 7月 12 04:06:02 +0800 2018
testyu **从未登录过**

Linux用户身份切换命令

su命令

img

linux中用户登录后,可以切换角色,比如yuchao用户切换到chaoge用户。

工作里一般不会直接使用root登录,而是大家都用普通账号,保护服务器安全,降低误操作,因为你普通用户权限低。

当你需要执行高权限的操作,你得使用root账号了,可以进行角色切换。

语法

1
2
3
4
5
6
7
su - 用户名

su root
su - root

su yuchao666
su - yuchao666

是否有横线的区别

image-20220108144948745

关于su是否加短横线

工作里会见到有的人用su不加横线,其实是不合适的,看一下正确玩法,解释:

1
2
3
4
5
6
7
# 1. 用普通用户yuchao2登录linux

# 2. 查看yuchao2的环境变量PATH,(PATH变量的作用是让你使用linux命令更轻松,省心)

# 3.因此su - 用户 表示完全意义的用户切换,角色切换+环境变量切换,应该添加上横线。

# 4.root可以随意切换普通用户,反之不可以

image-20220108150207928

通过环境变量查看

su不加横线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
当前用户的一些环境变量
[root@yuanlai-0224 ~]# env |grep -E "USER|MAIL|PWD|LOGNAME"
USER=root
MAIL=/var/spool/mail/root
PWD=/root
LOGNAME=root


su切换
[yuchao01@yuanlai-0224 root]$
[yuchao01@yuanlai-0224 root]$ env |grep -E "USER|MAIL|PWD|LOGNAME"
USER=yuchao01
MAIL=/var/spool/mail/root
PWD=/root
LOGNAME=yuchao01
[yuchao01@yuanlai-0224 root]$

su加短横线

实现了完全的用户切换,环境变量也都切换了,属于真正的用户切换了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@yuanlai-0224 ~]# env |grep -E  "USER|MAIL|PWD|LOGNAME"
USER=root
MAIL=/var/spool/mail/root
PWD=/root
LOGNAME=root
[root@yuanlai-0224 ~]#

[yuchao01@yuanlai-0224 ~]$ env |grep -E "USER|MAIL|PWD|LOGNAME"
USER=yuchao01
MAIL=/var/spool/mail/yuchao01
PWD=/home/yuchao01
LOGNAME=yuchao01
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$ exit
logout
[root@yuanlai-0224 ~]#

sudo命令

img

  • sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。
  • 作用是让普通用户不需要root密码即可用root权限执行命令。
  • 用户提权,提升为root身份去执行命令。
1
2
3
4
5
6
7
8
9
10
11
12
13
语法
sudo(选项)(参数)
选项
-b:在后台执行指令;
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。

当切换到普通用户后,权限是比较低的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@yuanlai-0224 ~]# su - yuchao01
Last login: Wed Mar 9 20:02:39 CST 2022 on pts/0
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$ ll /opt
total 0
-rw-r--r-- 1 root root 0 Mar 9 18:26 三里屯美女微信.txt
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$ echo "大爷来玩呀" > /opt/三里屯美女微信.txt
-bash: /opt/三里屯美女微信.txt: Permission denied


尝试使用尚方宝剑,sudo
[yuchao01@yuanlai-0224 ~]$ sudo echo "大爷来玩呀" > /opt/三里屯美女微信.txt
-bash: /opt/三里屯美女微信.txt: Permission denied


普通用户,偷摸看看老板的办公室
[yuchao01@yuanlai-0224 ~]$ sudo ls /root

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for yuchao01:
yuchao01 is not in the sudoers file. This incident will be reported.
[yuchao01@yuanlai-0224 ~]$

最后一行,告诉你,你yuchao01不在这个sudoers files文件里,操作不允许。

visudo命令

  • 你可以选择自己去vim编辑sudo配置文件,但是vim不会给你提供语法检测功能,写错了也不知道。
1
2
3
4
5
6
[root@yuanlai-0224 ~]# vim /etc/sudoers

89 ## The COMMANDS section may have other options added to it.
90 ##
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
  • 使用visudo命令,提供了语法检测功能。

visudo用于编辑/etc/sudoers文件,且提供语法检测,用于配置sudo命令

给yuchao01用户配置sudo使用权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1.直接输入visudo命令,相当于打开vim /etc/sudoers
找到如下行
89 ## The COMMANDS section may have other options added to it.
90 ##
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL

2.添加你想让执行sudo命令的用户
89 ## The COMMANDS section may have other options added to it.
90 ##
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 yuchao01 ALL=(ALL) ALL


3.保存退出,使用vim/vi的模式,此时已经可以用yuchao01用户,使用sudo命令了


切换普通用户
[root@yuanlai-0224 ~]# su - yuchao01
Last login: Wed Mar 9 20:07:26 CST 2022 on pts/0
[yuchao01@yuanlai-0224 ~]$

用sudo提权,修改文件内容
[yuchao01@yuanlai-0224 ~]$ sudo vim /opt/三里屯美女微信.txt
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$ cat /opt/三里屯美女微信.txt
美女微信 54321


用sudo提权,修改其他用户的密码

[yuchao01@yuanlai-0224 ~]$ passwd caixukun
passwd: Only root can specify a user name.
[yuchao01@yuanlai-0224 ~]$
[yuchao01@yuanlai-0224 ~]$ sudo passwd caixukun
Changing password for user caixukun.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[yuchao01@yuanlai-0224 ~]$

降低sudo权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1.编辑visudo
修改权限,只允许执行mkdir,useradd
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
yuchao01 ALL=(ALL) /usr/bin/mkdir,/usr/sbin/useradd


2.再次使用sudo,尝试使用vim,权限不够了,不让用
[yuchao01@yuanlai-0224 ~]$ sudo vim /opt/三里屯美女微信.txt
[sudo] password for yuchao01:
Sorry, user yuchao01 is not allowed to execute '/bin/vim /opt/三里屯美女微信.txt' as root on yuanlai-0224.


3.使用mkdir是可以的
[yuchao01@yuanlai-0224 opt]$ mkdir yuchao到此一游
mkdir: cannot create directory ‘yuchao到此一游’: Permission denied
[yuchao01@yuanlai-0224 opt]$
[yuchao01@yuanlai-0224 opt]$ sudo mkdir yuchao到此一游
[yuchao01@yuanlai-0224 opt]$ ll
total 4
drwxr-xr-x 2 root root 6 Mar 9 20:29 yuchao到此一游
-rw-r--r-- 1 root root 19 Mar 9 20:21 三里屯美女微信.txt
[yuchao01@yuanlai-0224 opt]$


4.使用useradd是可以的
[yuchao01@yuanlai-0224 opt]$ id caixukun01
uid=1011(caixukun01) gid=1011(caixukun01) groups=1011(caixukun01)
[yuchao01@yuanlai-0224 opt]$

删除用户命令如何添加上?
[yuchao01@yuanlai-0224 opt]$ sudo userdel caixukun01
Sorry, user yuchao01 is not allowed to execute '/sbin/userdel caixukun01' as root on yuanlai-0224.

最后,一般给用户sudo权限的话,也是默许该用户可以用root身份去执行命令了,除非特殊场景,规矩特别多,会作这样的命令限制。

切换到root用户

1
2
3
4
5
6
7
8
1.命令1
su - root # 输入root密码

2.命令2
su - # 输入root密码

3.命令3
sudo su - # 以root身份执行su -,要求该用户在sudoers文件里

图解sudo过程

image-20220309204025890

关于sudo和重定向的坑

image-20220311175516910

用户管理命令补充

  • 账号过期,usermod -e
  • 密码过期,chage -M

usermod修改账号过期

usermod命令用于修改用户账号 。usermod可用来修改用户账号的各项设定,修改系统账号文件来反映通过命令行指定的变化。

**语法格式:**usermod [参数]

常用参数:

-c<备注> 修改用户账号的备注文字
-d<登入目录> 修改用户登入时的目录
-e<有效期限> 修改账号的有效期限
-f<缓冲天数> 修改在密码过期后多少天即关闭该账号
-g<群组> 修改用户所属的群组
-G<群组> 修改用户所属的附加群组
-l<账号名称> 修改用户账号名称
-L 锁定用户密码,使密码无效
-s 修改用户登入后所使用的shell
-u 修改用户ID
-U 解除密码锁定

chage设置密码过期

chage命令是用来修改帐号和密码的有效期限;这个信息由系统用于确定用户何时必须更改其密码。

**语法格式:**chage [参数]

常用参数:

-M 密码保持有效的最大天数
-W 用户密码到期前,提前收到警告信息的天数
-E 帐号到期的日期,会禁止此帐号,**也可以修改账号的过期时间。**0表示立即过期,-1从不过期
-d 设置密码什么时候过期!-1 从不过期 0 立即过期
-l 列出当前用户的密码过期设置。普通用户仅可以查看自己的密码过期时间。

参考实例

使用-l参数列出用户密码过期的设置:

1
chage -l root

使用-M参数设置redis用户的密码最大有效期为100天:

1
chage -M  100 redis

设置yuchao01用户的密码,到2022-3-14过期,3-15号登录必须改密码。

1
chage -d '2022-3-14'  ycc01  # 密码能用到3-14号,3-15号必须得改密码

设置yuchao01用户过期时间为1年,并且限制下次登录,必须立即修改密码。

1
2
3
4
5
6
7
8
9
[root@yuanlai-0224 ~]# chage -E '2023-03-12' -d 0 ycc01
[root@yuanlai-0224 ~]# chage -l ycc01
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
帐户过期时间 :3月 12, 2023
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :1
在密码过期之前警告的天数 :7

gpasswd管理用户组

gpasswd命令是Linux下工作组文件/etc/group和/etc/gshadow的管理工具

**语法格式:**gpasswd [参数]

常用参数:

-a 添加用户到组
-d 从组删除用户
-A 指定管理员
-M 指定组成员和-A的用途差不多
-r 删除密码
-R 限制用户登入组,只有组中的成员才可以用newgrp加入该组

将ycc01用户,加入到opslinux组

你可以用usermod命令,也可以用这个命令,办法都很多

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@yuanlai-0224 ~]# gpasswd -a ycc01 opslinux
正在将用户“ycc01”加入到“opslinux”组中
[root@yuanlai-0224 ~]#

查看配置文件
[root@yuanlai-0224 ~]# grep opslinux /etc/group
opslinux:x:3002:ycc01




[root@yuanlai-0224 ~]# id ycc01
uid=1700(ycc01) gid=1700(cc01) 组=1700(cc01),3002(opslinux)

将ycc01,从opslinux组里删除

1
2
3
4
5
[root@yuanlai-0224 ~]# gpasswd -d ycc01 opslinux
正在将用户“ycc01”从“opslinux”组中删除
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# id ycc01
uid=1700(ycc01) gid=1700(cc01) 组=1700(cc01)

cut命令

  • cut在文件的每一行中提取片断
  • 在每个文件的各行中, 把提取的片断显示在标准输出。

若不指定file参数,该命令将读取标准输入。 必须指定 -b、-c 或 -f 标志之一。

**语法格式:**cut [参数] [文件]

常用参数:

-b 以字节为单位进行分割 ,仅显示行中指定直接范围的内容 -b ‘范围’
-c 以字符为单位进行分割 , 仅显示行中指定范围的字符
-d 自定义分隔符,默认为制表符”TAB”
-f 显示指定字段的内容 , 与-d一起使用
-n 取消分割多字节字符
–complement 补足被选择的字节、字符或字段
–out-delimiter 指定输出内容是的字段分割符

cut案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 1.以字节为单位切割,显示第四个字节内容
[root@yuanlai-0224 ~]# cat cut.txt |cut -b 4
n

# 2.截取出 yuchao名字(英文状态,1字符等于1字节)
[root@yuanlai-0224 ~]# cat cut.txt
My name is yuchao and i love linux!

[root@yuanlai-0224 ~]# cat cut.txt |cut -b 12-17
yuchao
[root@yuanlai-0224 ~]# cat cut.txt |cut -c 12-17
yuchao



# 3.中文提取,1中文等于3字节,-b参数
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -b 1-3

[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -b 4-7
超�
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -b 4-6

[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -b 7-9

[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -b 10-12


# 4.中文提取,按字符提取,1一个中文,当做1个字符处理了 -c参数
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -c 1-3
于超牛
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -c 1-2
于超
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -c 1-4
于超牛啊
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -c 1-5
于超牛啊
[root@yuanlai-0224 ~]# echo '于超牛啊' | cut -c 4


# 5.-f 显示指定字段的内容,和-d 指定分隔符结合使用。
[root@yuanlai-0224 ~]# tail -5 /etc/passwd |cut -d ':' -f 2
x
x
x
x
x
[root@yuanlai-0224 ~]# tail -5 /etc/passwd |cut -d ':' -f 3
1503
2001
3001
1700
1500
[root@yuanlai-0224 ~]# tail -5 /etc/passwd |cut -d ':' -f 1-3
giaogiao:x:1503
huangyan01:x:2001
yongfei:x:3001
ycc01:x:1700
yuanlai01:x:1500


# 6.批量删除系统普通用户
# 批量查询系统普通用户账号
[root@yuanlai-0224 ~]# for i in $(cat /etc/passwd|grep '/bin/bash'|grep -v 'root'|cut -d ':' -f 1);do echo $i;done

# 批量删除动作
[root@yuanlai-0224 ~]# for i in $(cat /etc/passwd|grep '/bin/bash'|grep -v 'root'|cut -d ':' -f 1);do userdel -rf $i;done

Linux设置中文

1
2
3
4
5
6
7
8
9
10
11
安装中文语言包
yum install kde-l10n-Chinese
yum reinstall glibc-common

写入配置文件
[root@yuchao-tx-server ~]# tail -2 /etc/profile
# by chinese
export LC_ALL="zh_CN.UTF-8"

改为英文
LC_ALL="en_US.UTF-8"

笔记什么是用户管理

ps -ef 查看所有信息,相当于任务管理器f

不同的用户,在不同的目录下,操作不同的文件

权限都是不一样

用户登录的机器

该文件,和这个用户的关系是什么。

在单位里运维市root权限有的sudo

root对账号普通的管理

关于普通用户去运行软件,也是为了降低系统的风险性,如inginx这个假用户,运行了软件的工作进程。

image-20250814202751668

image-20250814203825939

image-20250814204000984

image-20250814220025675

image-20250814220105073

解释/etc/paaawd

用户相关配置

image-20250814220422284

用户管理命令

用户创建过程

修改用户信息

梳理用户管理脑图

image-20250814233138703

image-20250814233947765

image-20250814235502946

image-20250815000806689

image-20250815001750237

2025.8.15

linux权限管理

学习目标

1、为什么要设置权限

2、linux中和权限有关的操作

3、文件、文件夹的读、写、执行权限

4、文件、文件夹的属主、属组

5、特殊权限扩展(suid、sgid、sbit)

6、ACL的重要性

7、umask

8、特殊属性(chattr、lsattr)

一、权限

1、什么是权限

我都知道linux是多用户、多任务的,当于超、张三、李四,一起使用linux服务器时,他们对机器上的文件操作,权限都是怎么样的,所有文件都是可以读取、写入、修改、执行的吗?

要不要做权限限制,保护系统安全,保护数据安全?

在linux中,一切皆文件,我们要对文件进行读取、写入、执行(脚本程序文件)。

2、为什么要权限

1、保护服务器数据、文件、进程等

2、不要莫名其妙的背黑锅,权限限制(你作为运维,要限制其他用户的权限,不要伤害你的机器,否则你就背黑锅)

3、针对不同部门,不同员工的工作职责,分工不同,权限应该做好限制。

4、对来自外部的恶意攻击进行防御。

3、权限分类

权限针对文件,file 权限针对目录,directory
读r,read 表示可以查看文件内容;cat 表示可以(ls)查看目录中存在的文件名称
写w,write 表示可以更改文件的内容;vim 修改,保存退出 表示是否可以删除目录中的子文件或者新建子目录(rm/touch/mkdir)
执行x,executable 表示是否可以执行文件,一般指二进制文件、或者脚本文件 表示是否可以进入目录中(cd)

4、Linux的文件属于谁?

图解linux文件权限,觉得超哥牛吗?

image-20220316143831009

  • linux中的每一个文件,都有自己的主人,并且有权限限制,限制主人的读、写、执行权限。
  • 限制其他人的读、写、执行权限。
  • 限制组内的r、w、x权限。

可见关于linux的文件,有三个角色

  • user 、属主
  • group、属组
  • other、其他人

image-20220114095638662

user属主

表示文件的创建者、拥有者,也可理解为,某个用户、对这个文件拥有的权限。

一个文件只能有一个主人,一部手机只能有一个主人。

你可以对你的手机做任何的事,其他的人你可以禁止他碰你手机!

你可以对你的linux文件进行读、写、执行,也可以禁止别人对你的文件做任何操作!

group属组

文件所属的用户组,拥有组,可以理解为,某一个组的用户,对这个文件的权限。

文件

user,属主是于超 ,权限是允许读、写、执行

group,属组是运维组,权限是读,写,不可执行

other其他用户

image-20220114095933752

  • 当前登录系统用户是yuchao,你想操作yuchao01.sh文件,权限自然是读、写、执行
  • 当前登录系统用户是,小鲁班,对于yuchao01.sh这个文件,权限怎么判定呢?
    • 看是不是在yuchao01.sh的属组里,存在,享受group内权限
    • 不存在,执行other角色权限

5、所属者的表示方法

我们再懂得了,文件的所属关系,所属角色有user、group、other之后,下一步应该如何使用linux命令,去查看、设置、文件的所属角色呢。

u属主

用u表示文件的属主,u是个缩写,全称是the user who owns it(拥有它的用户)是谁

默认是文件的创建者,就是文件的属主

g 属组

g来表示文件属组,默认是创建该文件的用户(的主组)

比如是yuchao01用户创建了文件,linux.log

1
2
3
4
touch linux.log
该文件的默认
属主、属组就是
yuchao01 yuchao01

g全拼是,other users in file’s group(文件组中的其他用户)可以享有的权限。

o 其他人

用o表示,既不是文件的创建者,也不是文件属组里的用户,那么就是其他人的角色。

all 角色

在后续使用linux命令,修改文件权限时,除了会用到 u、g、o三个角色,还会使用all(缩写a),表示一次性对三个角色,设置权限。

root 用户

linux中的root用户是特殊用户,是系统的超级管理员,有最大权限,可以任意修改linux文件,因此权利越大、责任越大。

工作里尽量都不用root,以防出故障。

二、权限管理

1、查看文件属性

要设置权限,就需要知道文件的一些基本属性和权限的分配规则。

在Linux 中,ls 命令常用来查看文档的属性,用于显示文件的文件名和相关属性。

ls命令我们之前学过,用于查看文件信息,这里我们使用之前提到过的一个用法,ll

1
2
3
4
5
6
# ll命令
# 查看文件夹下所有的文件(文件夹)详细信息
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
dr--r--r-- 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux
-rw-rw-r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

2、文件属性详解

关于文件属性,如图所示

image-20220114103053804

2.1 文件权限(字母,数字表示)

权限 对应数字 意义
r 4 可读
w 2 可写
x 1 可执行

2.2 如何解读文件属性

1
2
3
4
5
6
7
8
9
10
11
12
13
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
dr--r--r-- 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux

-rw-rw-r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt


如 yuchao666.txt文件的属性

第1位,- 表示是普通文件类型
第2-4位, rw- 表示user权限,是读、写、没有执行权限
第5~7, rw- 表示group权限,是读、写、没有执行权限
第8~10, r-- 表示other权限,其他人只读

3、设置文件权限

设置、或修改文件权限,需要使用命令

1
2
3
4
5
6
7
8
语法(change mode)
chmod 选项 权限 文件

作用:设置、修改文件的权限(包括设置user,group,other对应的权限)

选项: -R 递归设置文件夹权限

注意:使用该命令,要么是root登录,要么是属主(你不可能随便修改别人的资料)

字母权限实践

用法1:使用root登录系统,获取最大权限,可以修改他人文件属性

1.给文件添加执行权限

一般可执行的命令,脚本文件,都需要添加执行权限。

给文件添加执行权限

image-20220114105540158

扣除文件执行权限

image-20220114105919740

为什么我们能使用ls,echo命令,因为他们都有x执行权限。

1
2
3
4
5
[yuchao01@yuchao-linux01 ~]$ ll /bin/ls
-rwxr-xr-x. 1 root root 117672 Apr 11 2018 /bin/ls
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ll /bin/echo
-rwxr-xr-x. 1 root root 33072 Apr 11 2018 /bin/echo

一次性添加、减少多个文件的权限。

一次性减少2个文件的user,读权限。

1
2
3
4
5
6
7
8
9
10
11
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
dr--r--r-- 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux
-rw-rw-r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ chmod u-r chaoge-linux yuyu666.txt
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
d---r--r-- 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux
--w-rw-r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

修改yuchao666.txt权限为

user,可读、可写、可执行

group、只读

other、只读

1
2
3
[yuchao01@yuchao-linux01 ~]$ chmod u=rwx,g=r,o=r yuyu666.txt 
[yuchao01@yuchao-linux01 ~]$ ll yuyu666.txt
-rwxr--r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

一次性设置yuchao666.txt所有角色,仅可以读写。

1
2
3
4
5
[yuchao01@yuchao-linux01 ~]$ chmod a=rw yuyu666.txt 
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
dr--r--r-- 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux
-rw-rw-rw- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

一次性设置当前目录下所有文件,全部最大权限。

-R 文件夹递归操作

1
2
3
4
5
6
[yuchao01@yuchao-linux01 ~]$ chmod -R a=rwx /home/yuchao01/*
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ll /home/yuchao01/
total 6240
drwxrwxrwx 2 yuchao01 yuchao01 6 Jan 13 18:25 chaoge-linux
-rwxrwxrwx 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
语法

chmod 权限设置 文件


1.给哪些用户角色设置,语法如何表示
chmod u file
chmod g file
chmod o file
chmod ugo file
chmod a file


2.添加,还是减少,还是赋值

chmod + 添加
chmod - 减少
chmod = 赋值

3. 具体哪些权限
r 读
w 写
x 执行

4. 具体语法

chmod ugo=rwx file.log # 给与所有角色,所有权限,最大权限,危险命令
chmod ug=r file.log # 修改user,group,只读,other不修改
chmod go-w file.log # 只给group,other,减去掉写入权限

chmod uo+r file.log # 只给user,other,添加一个读取权限,group不动
字母 选项 作用
u(谁) user 属主
g(谁) group 属组
o(谁) other 其他用户
a(谁) all 所有人(包含ugo)
+(作用) 增加作用
-(作用) 移除作用
=(作用) 等于 赋值作用
r(权限) read 可读权限
w(权限) write 可写权限
x(权限) execute 可执行权限
-(权限) - 没有任何权限

注,如果要设置多个角色,多个权限,需要逗号隔开

1
2
3
4
# 一般用于直接赋值权限,也别去计算,加还是减去权限了,简单粗暴
[yuchao01@yuchao-linux01 ~]$ chmod g=r,o=w,u=rwx yuyu666.txt
[yuchao01@yuchao-linux01 ~]$ ll yuyu666.txt
-rwxr---w- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

思考题

限制yuyu666.txt文件,权限改为属主最大权限,属组可读写,其他人只读,有几种写法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.考虑当前文件属性,进行修改

2.直接属性赋值



# 解题
# 当前文件属性
[yuchao01@yuchao-linux01 ~]$ ll yuyu666.txt
-rw-r--r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt


# 方法1,逐个添加
chmod u+x,g+w yuyu666.txt

# 方法2,直接赋值
chmod u=rwx,g=rw,o=r yuyu666.txt

数字权限

权限简介

  • Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
  • Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
  • Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
  • Linux上通常使用chmod命令对文件的权限进行设置和更改。

刚才讲的是字母权限,还可以使用数字权限进行快速授权

权限 对应数字 意义
r 4 可读
w 2 可写
x 1 可执行

image-20220114140556897

关于数字权限和读、写、执行的参照,以及权限的组合表

数字 权限 作用
0 - 不能读,不能写,不能执行
1 execute 不能读,不能写,可执行
2 write 不能读,可写,不能执行
3 2+1 不能读,可写,可执行
4 read 可读,不能写,不能执行
5 4+1 可读,不能写,可执行
6 4+2 可读,可写,不能执行
7 4+2+1 可读,可写,可执行

结合chmod用法

常见权限对应关系

1
2
3
4
5
6
7
8
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx
  1. 给与yuchao66.txt,属主读、写、执行权限,属组读写权限,其他人读权限。
1
2
3
4
5
[yuchao01@yuchao-linux01 ~]$ chmod 764 yuyu666.txt 
[yuchao01@yuchao-linux01 ~]$ ll
total 6240
drwxrwxrwx 3 yuchao01 yuchao01 38 Jan 14 11:32 chaoge-linux
-rwxrw-r-- 1 yuchao01 yuchao01 6388895 Jan 13 18:38 yuyu666.txt

2.给与yuchao666.txt所有角色只读

1
2
3
4
5
# 方法1
[yuchao01@yuchao-linux01 ~]$ chmod u=r,g=r,o=r yuyu666.txt

# 方法2
[yuchao01@yuchao-linux01 ~]$ chmod 444 yuyu666.txt

提示

1.记住常见权限即可,一般降低权限,给与只读即可,不要给些奇葩的权限,比如:

只允许写入权限

1
2
3
4
5
6
7
# 只允许写入
[yuchao01@yuchao-linux01 ~]$ chmod 333 yuyu666.txt
[yuchao01@yuchao-linux01 ~]$ ll yuyu666.txt
--wx-wx-wx 1 yuchao01 yuchao01 4 Jan 14 14:18 yuyu666.txt

# 只允许写入,vim就无法使用了,因为vim要先获取文件内容,得有read权限
# 你可以只重定向数据进入

一般不随便给与777权限

建议,一般是644,754。

练习题

1.给/data目录设置,属主全部权限,属组可读可执行,其他用户无权限,请用2种方式写。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 方法1
[root@yuchao-linux01 /]# chmod -R u=rwx,g=rx,o='' /data
[root@yuchao-linux01 /]#
[root@yuchao-linux01 /]#
[root@yuchao-linux01 /]#
[root@yuchao-linux01 /]# ll -d /data
drwxr-x--- 2 root root 6 Jan 14 14:36 /data

# 数字权限
[root@yuchao-linux01 /]# chmod -R 750 /data
[root@yuchao-linux01 /]#
[root@yuchao-linux01 /]# ll -d /data
drwxr-x--- 2 root root 6 Jan 14 14:36 /data

2.设置/data/user_info.txt权限,属主读、写,属组读、写,其他人只读。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看touch默认权限
# 提示,root、普通用户、创建文件默认权限是不一样的
[root@yuchao-linux01 /]# touch /data/userinfo.txt
[root@yuchao-linux01 /]# ll /data
total 0
-rw-r--r-- 1 root root 0 Jan 14 14:41 userinfo.txt


# 字母权限
chmod g+w userinfo.txt

# 数字权限
chmod 664 userinfo.txt

3.设置/data/password.txt文件,只有属主读写,其他人无权限。

1
chmod 600 /data/password.txt

4、文件、目录的的rwx

1.想要删除文件,要看是否有该文件所在目录,目录是否有w权限,才可以删除文件,且还得有x权限,才能进入文件夹。(用普通用户测试)

权限针对文件 权限针对目录
读r 表示可以查看文件内容 表示可以(ls)查看目录中存在的文件名称
写w 表示可以更改文件的内容 表示是否可以删除目录中的子文件或者新建子目录(rm/touch/mkdir)
执行x 表示是否可以开启文件当中记录的程序,一般指二进制文件(.sh) 表示是否可以进入目录中(cd)

测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 写一个简单的shell脚本
[yuchao01@yuchao-linux01 ~]$ cat hello.sh
echo 你学会linux权限管理了吗

echo 学会80%了
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ll hello.sh
-rw-rw-r-- 1 yuchao01 yuchao01 57 Jan 14 14:54 hello.sh


# 去掉文件权限,逐个添加

[yuchao01@yuchao-linux01 ~]$ chmod 0 hello.sh
# 读
[yuchao01@yuchao-linux01 ~]$ cat hello.sh
cat: hello.sh: Permission denied
[yuchao01@yuchao-linux01 ~]$
# 写
[yuchao01@yuchao-linux01 ~]$ echo "echo 还可以" >> hello.sh
-bash: hello.sh: Permission denied

# 执行
[yuchao01@yuchao-linux01 ~]$ ./hello.sh
-bash: ./hello.sh: Permission denied

#################


# 加上r权限
[yuchao01@yuchao-linux01 ~]$ chmod u+r hello.sh
[yuchao01@yuchao-linux01 ~]$ cat hello.sh
echo 你学会linux权限管理了吗

echo 学会80%了


# 加上w
[yuchao01@yuchao-linux01 ~]$ chmod 0 hello.sh
[yuchao01@yuchao-linux01 ~]$ echo "echo 这下学会90%了" >> hello.sh
-bash: hello.sh: Permission denied
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ chmod u+w hello.sh
[yuchao01@yuchao-linux01 ~]$ echo "echo 这下学会90%了" >> hello.sh
[yuchao01@yuchao-linux01 ~]$ cat hello.sh
cat: hello.sh: Permission denied
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ chmod u=rw hello.sh
[yuchao01@yuchao-linux01 ~]$ cat hello.sh
echo 你学会linux权限管理了吗

echo 学会80%了
echo 这下学会90%了


# 加上x
[yuchao01@yuchao-linux01 ~]$ chmod u+x hello.sh
[yuchao01@yuchao-linux01 ~]$ ./hello.sh
你学会linux权限管理了吗
学会80%了
这下学会90%了
[yuchao01@yuchao-linux01 ~]$ chmod u-x hello.sh
[yuchao01@yuchao-linux01 ~]$ ./hello.sh
-bash: ./hello.sh: Permission denied

测试文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 准备一个0权限文件夹
[yuchao01@yuchao-linux01 ~]$ chmod 0 hehe
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ll -d hehe
d--------- 2 yuchao01 yuchao01 6 Jan 14 14:49 hehe


# 测试rwx
# 默认无权限
[yuchao01@yuchao-linux01 ~]$ cd hehe
-bash: cd: hehe: Permission denied
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ls hehe
ls: cannot open directory hehe: Permission denied
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ touch hehe/yu.txt
touch: cannot touch ‘hehe/yu.txt’: Permission denied


# 添加r,只能ls
[yuchao01@yuchao-linux01 ~]$ chmod u+r hehe
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ ls hehe
[yuchao01@yuchao-linux01 ~]$


# 添加w,且必须结合x权限,才能进入,且创建文件夹中内容
[yuchao01@yuchao-linux01 ~]$ chmod u=rwx hehe
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$
[yuchao01@yuchao-linux01 ~]$ touch hehe/yu.txt
[yuchao01@yuchao-linux01 ~]$ cd hehe
[yuchao01@yuchao-linux01 hehe]$ ls
yu.txt

三、属主、属组、实践

1、属主、属组是什么

属主,user、文件属于某个用户

属组,group,文件可以属于一个组,且该组有对于的读、写、执行权限。在这个组中的用户,享受组内权限。

查看user,group

image-20220114151746561

2、chown命令

change owner

1
2
3
4
5
6
7
8
9
语法
chown -R 新属主名 文件路径

作用
修改文件的属主

注意
谁能在公司里,随便篡改资产属于谁?个人肯定不行,老板能行。
linux能修改文件权限的,只有root

场景:

/data/user_info.txt 存放部门用户信息,以前属于yuchao维护,可以读写执行,后来yuchao调部门了,换了个新运维sanpang来维护,主人就改变了。

image-20220114152705706

实践

1.修改文件属主

1
2
3
4
5
6
7
[yuchao01@yuchao-linux01 ~]$ ll
total 8
d--------- 3 yuchao01 yuchao01 38 Jan 14 11:32 chaoge-linux
drwx------ 2 yuchao01 yuchao01 20 Jan 14 15:10 hehe
-rw------- 1 yuchao01 yuchao01 81 Jan 14 15:00 hello.sh
-rw-rw-r-- 1 sanpang sanpang 0 Jan 14 14:41 userinfo.txt
--wx-wx-wx 1 yuchao01 yuchao01 4 Jan 14 14:18 yuyu666.txt

把hello.sh 属主,改为sanpang

image-20220114153214934

此时怎么解读hello.sh的权限?

1
2
3
4
5
6
7
-rw------- 1 sanpang  yuchao01 81 Jan 14 15:00 hello.sh

1. hello.sh属于sanpang用户,权限是rw-
2. hello.sh属于yuchao01组,该组内用户无权限
3. 其他人无权操作hello.sh

可以尝试用不同的用户,登录机器,查看操作文件的状态

3、chgrp命令

change group更改文件的属组

1
2
语法
chgrp 参数 组名 文件

案例

修改hello.sh的属组,查看修改后的权限效果。

1
[root@yuchao-linux01 yuchao01]# chgrp sanpang hello.sh

image-20220114153842904

4、chown同时修改属主,属组

语法

1
[root@yuchao-linux01 yuchao01]# chown yuchao01:yuchao01 hello.sh

image-20220114154113183

四、特殊权限

4.0 什么是特殊权限

上节课我们学习了Linux系统的9位基本权限rwx rwx rwx,但是有时候会发现系统一些关键的文件,存在一些没见过的权限字符。

1
2
3
比如/etc/passwd
[root@yuchao-tx-server ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27856 4月 1 2020 /usr/bin/passwd

可见,出现了没见过的s字符权限,这是什么鬼?超哥告诉你,它是传说中的特殊权限suid

除了超哥讲的9位基本权限之外,linux权限位,还有3个特殊权限,一共是12位权限。

1
2
3
4
5
suid(setuid)

sgid(setgid)

sbit(sticky)

特殊权限对照表

类别 suid sgid sticky
字符表示 S S T
出现位置 用户权限位x 用户组权限位x 其他用户权限位x
基本权限位有x s s t
数字表示法 4 2 1
八进制表示法 4000 2000 1000
生效对象 用户位 用户组 其他用户

4.1 、SUID 特殊权限

4.1.1 suid基础原理

1
2
3
4
1. suid通过S字符标识,存在于用户权限位的x权限对应位置。
2. 如果某文件,用户权限位本身就有x权限,给该文件设置suid权限时,则以小写s标识,否则就是大写的S字符。
3. 给文件设置s权限对应的数字表示法是4,八进制数下可以用4000
4. suid同样也用chmod设置权限,可以以字符法,数字法两种标识。

4.1.2 自定义文件设置suid

image-20220316165940150

4.1.3 /usr/bin/passwd与suid

1
2
[yuchao01@yuchao-linux01 ~]$ ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

我们会发现这个passwd命令,有一个奇怪的s权限,这干啥的?

可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

  • SUID 特殊权限仅适用于可执行文件
  • 所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件属主的身份去执行此文件
  • 一旦文件执行结束,身份的切换也随之消失。

以这个/usr/bin/passwd可执行命令举例

就是让普通用户,执行该命令时,临时获得root的权限。

解释关于linux的用户创建。

  • 用户创建完用户后,需要修改密码,执行passwd命令
  • 但是passwd命令需要读取,修改/etc/passwd、/etc/shadow文件,这些文件都是属于root,那不就没权限操作了吗,但是普通用户,如何执行passwd命令,修改自己的密码呢?
  • 可以让普通用户临时获得root的身份,不就有属主的权限了吗。
  • 这就是设置SUID的一个根本原因。
  • 且SUID特殊权限,只能用在二进制可执行文件上。

图解suid应用

image-20220316170604864

4.2、实践SUID

image-20220316180833439

既然passwd有s权限,可以让用户修改自己的密码

问题,如何进制用户自己修改密码?

1
2
3
4
5
6
# 去除passwd的s权限
[root@yuchao-linux01 yuchao01]# chmod u-s /usr/bin/passwd
[root@yuchao-linux01 yuchao01]#
[root@yuchao-linux01 yuchao01]#
[root@yuchao-linux01 yuchao01]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

image-20220114161941995

如何再给SUID特殊权限加上去。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@yuchao-linux01 ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd


# 添加方式一
[root@yuchao-linux01 ~]# chmod u+s /usr/bin/passwd
[root@yuchao-linux01 ~]#


# 添加方式二,数字权限
[root@yuchao-linux01 ~]# chmod 4755 /usr/bin/passwd
[root@yuchao-linux01 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

此时用户可以正确自己修改密码。

4.2.1 总结suid

请注意:学习SUID是为了知道有它的存在,但不要随便用。

SUID位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。

如果属主是root的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

1
2
3
4
5
6
1. suid功能是针对二进制可执行命令设置的,不能用在shell脚本上。
2. 用户权限位的x权限位置处,如果有s或S,表示该命令存在suid权限。
3. suid的作用就是,让普通用户在执行设置了suid权限的命令时,可以拥有其(属主)的权限(一般默认是root)。
4. 二进制命令,如系统提供的ls,mkdir等命令,都需要有x权限才可以操作。
5. suid是一个危险的命令,对系统有一定威胁,一般依然是用sudo命令代替suid等特殊权限操作。
6. 系统安全优化时,会尽量去除所有设置suid的命令。

4.2.2 suid危险实践

在没有配置sudo的情况下,普通用户肯定是不能删除别人的数据的,比如。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 默认用户是无法删除别人的资料的
[root@yuchao-tx-server ~]# touch /opt/我是root的文件
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# su - chaoge01
上一次登录:三 3月 16 17:03:41 CST 2022pts/0 上
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ ls /opt/
containerd rh 我是root的文件
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ rm /opt/我是root的文件
rm:是否删除有写保护的普通空文件 "/opt/我是root的文件"?y
rm: 无法删除"/opt/我是root的文件": 权限不够


# 当rm命令添加了suid权限。
[root@yuchao-tx-server ~]# chmod u+s /bin/rm
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ll /bin/rm
-rwsr-xr-x 1 root root 62872 11月 17 2020 /bin/rm

# 再用普通用户,试试rm命令,危险警告!!
[chaoge01@yuchao-tx-server ~]$ ll /opt/我是root的文件
-rw-r--r-- 1 root root 0 3月 16 17:46 /opt/我是root的文件
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ rm /opt/我是root的文件
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ ll /opt/我是root的文件
ls: 无法访问/opt/我是root的文件: 没有那个文件或目录
[chaoge01@yuchao-tx-server ~]$


# 太可怕了!!!!!!!!!!!赶紧去掉suid。
[root@yuchao-tx-server ~]# ll /bin/rm
-rwsr-xr-x 1 root root 62872 11月 17 2020 /bin/rm
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# chmod u-s /bin/rm
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ll /bin/rm
-rwxr-xr-x 1 root root 62872 11月 17 2020 /bin/rm

给rm命令设置suid之后,任何普通用户去执行这个命令,都会以root身份去运行,因此及其危险。

你学废了吗?兄弟。

4.2.3 查找系统中所有的suid权限文件

1
2
# find搜索,根据权限搜索
[root@yuchao-tx-server ~]# find / -type f -perm -4000 -ls

4.2.4 补充sgid(了解即可)

sgid原理篇

1
2
3
4
5
1.对于二进制命令来说,sgid的功能和suid基本一样,只不过一个是设置文件属主的权限,一个是设置属组的权限,和9位基本rwx那个理解概念一样。

2. suid是获得文件属主的权限,sgid是获得文件属组的权限

3. sgid主要用于文件夹,为某个目录设置sgid之后,在该目录中的创建的文件,都以(目录的属组)权限为准,而不属于创建该文件的用户权限,这就实现了多个用户,可以共享一个目录的作用。

sgid针对文件、文件夹的作用

对文件来说

1
2
3
1. sgid只对二进制命令生效,且需要二进制命令本身有x权限。

2. 执行包含sgid权限的二进制命令时,会获得该命令在执行期间所属的组的身份与权限。

对文件夹来说

1
2
3
1. linux中所有的用户,默认创建的文件,文件夹,属主和属组都是用户自身。

2. 设置了sgid的目录,会保证在这个目录下创建的文件、文件夹都保持同样的权限属性,都属于该目录的属组权限。

实践操作(红帽认证考题)

1
2
3
4
5
6
7
1.创建一个共享目录/home/admins

2.要求该目录属组是adminuser,adminuser组内成员对该目录的权限是,可读,可写,可执行。

3.其他用户均无任何权限(root特例)

4.进入/home/admins创建的文件,自动继承adminuser组的权限。

实践过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@yuchao-tx-server ~]# mkdir /home/admins
[root@yuchao-tx-server ~]# groupadd adminuser
[root@yuchao-tx-server ~]# ll -d /home/admins
drwxr-xr-x 2 root root 4096 3月 16 18:18 /home/admins

# 修改属组
[root@yuchao-tx-server ~]# chown :adminuser /home/admins
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ls -ld /home/admins/
drwxr-xr-x 2 root adminuser 4096 3月 16 18:18 /home/admins/
[root@yuchao-tx-server ~]#

还未设置sgid时,权限依然遵循linux默认的规则
[root@yuchao-tx-server ~]# touch /home/admins/我是超哥.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ll /home/admins/
总用量 0
-rw-r--r-- 1 root root 0 3月 16 18:44 我是超哥.log


加上sgid特殊权限
[root@yuchao-tx-server ~]# chmod 2770 /home/admins/
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ll -ld /home/admins/
drwxrws--- 2 root adminuser 4096 3月 16 18:44 /home/admins/

在该目录下创建的文件夹,自动属于adminuser组了
[root@yuchao-tx-server ~]# touch /home/admins/我是于超老师.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# ll /home/admins/
总用量 0
-rw-r--r-- 1 root root 0 3月 16 18:44 我是超哥.log
-rw-r--r-- 1 root adminuser 0 3月 16 18:48 我是于超老师.log

换一个普通用户试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@yuchao-tx-server ~]# su - chaoge01
上一次登录:三 3月 16 18:04:22 CST 2022pts/0 上
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ cd /home/admins/
-bash: cd: /home/admins/: 权限不够
[chaoge01@yuchao-tx-server ~]$

必须要求该用户是adminuser组里的成员,才有权限

[root@yuchao-tx-server ~]# usermod -G adminuser chaoge01
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# su - chaoge01
上一次登录:三 3月 16 18:49:39 CST 2022pts/0 上
[chaoge01@yuchao-tx-server ~]$
[chaoge01@yuchao-tx-server ~]$ cd /home/admins/
[chaoge01@yuchao-tx-server admins]$ touch 我是chaoge01.log
[chaoge01@yuchao-tx-server admins]$
[chaoge01@yuchao-tx-server admins]$ ll
总用量 0
-rw-rw-r-- 1 chaoge01 adminuser 0 3月 16 18:50 我是chaoge01.log
-rw-r--r-- 1 root root 0 3月 16 18:44 我是超哥.log
-rw-r--r-- 1 root adminuser 0 3月 16 18:48 我是于超老师.log

4.3、SBIT特殊权限(sticky bit)

图解,为什么会用到sbit

image-20220316191847373

sbit原理

粘滞位(Sticky bit),又称作粘着位,linux下另一个特殊权限。

1
2
3
4
5
6
7
8
9
10
11
sbit粘滞位,用的已经很少了,但是对于系统特殊文件夹/tmp来说,是整个系统所有用户的临时文件存放地,谁都有任意的权限,你会发现该目录的权限巨大。

[root@yuchao-tx-server ~]# ll -d /tmp/
drwxrwxrwt. 8 root root 4096 3月 16 18:54 /tmp/

但是看到了一个特殊权限t
一句话总结。
当目录有了粘滞位特殊权限,这个目录除了root用户特殊以外,任何用户都只能删除、移动自己的创建的文件,而不能影响到其他人。

演示
没有设置粘滞位,且目录是777权限时,也就是任意的user、group、other角色在这个目录下,可以进行读、写、执行任意文件。

image-20220316190436856


最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。

如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。

实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。

因此,t权限,是用于限制用户权限,禁止用户删除其他人资料的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@jumpserver ~]# ll /tmp/ -d
drwxrwxrwt. 14 root root 4096 Feb 10 18:49 /tmp/


命令:chmod

语法:# chmod [选项] 文件夹

作用:只允许文件的创建者和root用户删除文件

常用选项

o+t 添加粘滞位

o-t 去掉粘滞位

用法:chmod o+t 目录名

示例代码:
#chmod o+t
含义:给目录增加粘滞位权限。

4.3.0 实践

1
2
3
4
5
6
7
8
9
10
1.添加目录的sbit权限
[root@yuchao-tx-server ~]# chmod o+t /test_sbit/
[root@yuchao-tx-server ~]#

注意了,这个目录,是完全属于root用户的,但是other的权限也给到了最大。
[root@yuchao-tx-server ~]# ll -d /test_sbit/
drwxrwxrwt 2 root root 4096 3月 16 19:14 /test_sbit/


2.分别用两个普通用户测试,是否可以任意删除别人数据。
  • 在这个拥有了sbit权限的目录下,你可以自由存放自己的资料,别人也可以
  • 但是你只能操作你的文件,无法动别人的文件了。

image-20220316193206458

别人设置,看都不让你看。

image-20220316193554228

4.3.1 sbit应用

公司多个部门公用一个文件夹work,为了让所有人都能访问,work文件夹赋予了777权限,用户root新建了一个文件root.txt,发现被别人删除了。

我们希望root建立的文件,只有root自己可以删。

步骤1:root用户下操作

root用户新建文件夹/work,并且新建两个文件root.txt和root1.txt,赋予/work文件夹和下面的文件777权限.

image-20220210185510949

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@yuchao-linux01 ~]# mkdir /work
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# touch /work/root.txt /work/root1.txt
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# chmod -R 777 /work/
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ll /work/
total 0
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root1.txt
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root.txt
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ll /work/ -d
drwxrwxrwx 2 root root 39 Feb 10 18:54 /work/
[root@yuchao-linux01 ~]#

步骤2,使用普通用户登录,模拟恶意删除其他人文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[yuchao66@yuchao-linux01 ~]$ ls /work/
root1.txt root.txt
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$ ls /work/ -d
/work/
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$ ll /work/ -d
drwxrwxrwx 2 root root 39 Feb 10 18:54 /work/
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$
[yuchao66@yuchao-linux01 ~]$ cd /work/
[yuchao66@yuchao-linux01 work]$ ll
total 0
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root1.txt
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root.txt
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ rm -f root.txt
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ ll
total 0
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root1.txt
[yuchao66@yuchao-linux01 work]$

image-20220210185650605

你看,这么一个公共目录,一个普通用户yuchao66就能随便删除人家的资料,这么是不对的。

步骤3:给该公共目录添加粘滞位,再看看效果。

image-20220210190114077

1
2
3
4
5
6
7
8
9
[root@yuchao-linux01 ~]# chmod o+t /work/
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ll /work/
total 0
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root1.txt
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ll /work/ -d
drwxrwxrwt 2 root root 23 Feb 10 18:56 /work/
[root@yuchao-linux01 ~]#

步骤4,使用yuchao66用户,再看下有什么权限

image-20220210190250608

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[yuchao66@yuchao-linux01 work]$ 
[yuchao66@yuchao-linux01 work]$ ll -d /work/
drwxrwxrwt 2 root root 23 Feb 10 18:56 /work/
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ ll
total 0
-rwxrwxrwx 1 root root 0 Feb 10 18:54 root1.txt
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ rm -f root1.txt
rm: cannot remove ‘root1.txt’: Operation not permitted
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ mv root1.txt /opt
mv: cannot move ‘root1.txt’ to ‘/opt/root1.txt’: Operation not permitted
[yuchao66@yuchao-linux01 work]$

步骤5,去掉粘滞位,再看看权限

1
2
只有root才给权限
[root@yuchao-linux01 ~]# chmod o-t /work/

image-20220210190710987

1
2
3
4
5
6
7
8
9
10
11
12
[yuchao66@yuchao-linux01 opt]$ cd /work/
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ ll -d /work/
drwxrwxrwx 2 root root 23 Feb 10 18:56 /work/
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$
[yuchao66@yuchao-linux01 work]$ ls
root1.txt
[yuchao66@yuchao-linux01 work]$ rm root1.txt
[yuchao66@yuchao-linux01 work]$ ll
total 0
[yuchao66@yuchao-linux01 work]$

五、ACL访问控制

回忆之前讲了什么

关于文件拥有者的身份

  • user
  • group
  • other

关于文件的权限

  • read
  • write
  • execute
  • SUID

但是在工作里的复杂环境下,这样的权限,已经不够用了。

image-20220114164145158

5.1、ACL使用场景

  • /data是运维部门的资料,运维ops组里的员工可以rwx权限管理
  • root作为该目录的属主,也拥有rwx权限
  • 其他部门的员工,比如开发同学就无法访问这个目录数据

偶然的,现在有一个测试岗的同事chaoge,需要访问该/data数据,读取文件夹数据,就得有rx两个权限,并且只能是rx权限,只读文件夹,不得给w写入权限。

应该如何给与他使用权限?

  • 修改属主?不可能
    • 好比别人想看看你手机,难不成你就要送给他?
  • 修改属组?有同学会尝试思考如下方案,你来看对不对
    • 这个/data被整个ops部门组的用户在使用,肯定不可能改为chaoge组
    • 并且即使给这个chaoge用户,加入ops组,也不对,ops组是rwx权限,我们要求只给chaoge用户rx权限。
    • 还有就是修改other的权限为rx?因为chaoge属于是other角色,但是这样也不行,导致其他人都能访问了。

就是这个情况,我们能明显感到头大,自带的权限,没办法啊。

ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限。

ACL这个功能就是用来解决上述权限不够的问题的,使用ACL给用户chaoge分配权限,chaoge既不是/data的属主,也不是属组,单独给chaoge用户分配关于/data文件夹的r-x权限。

5.2 检查ACL功能

ACL访问控制列表这个功能是和文件系统挂钩的,需要文件系统的支持,并且在centos7系统下,默认就支持ACL了。

可以通过dmesg命令,查看到ACL相关信息。

dmesg可以查看到系统的启动信息,包括硬件信息,操作系统信息。

1
2
3
[root@yuchao-linux01 ~]# dmesg |grep ACL
[ 16.890605] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 17.775177] SGI XFS with ACLs, security attributes, no debug enabled

如果未安装ACL,可以手动安装(需要配置好网络)

1
[root@yuchao-linux01 ~]# yum install acl -y

5.3 命令使用

getfacl命令:查看文件的ACL策略及权限

setfacl命令: 给文件针对某个用户或者某个组来增加(设置)ACL策略

Linux设置文件ACL权限是通过setfacl工具来设置的,通过getfacl工具来获取ACL访问控制列表

5.4 getfacl命令

如何判断linux的文件,是否额外设置了ACL权限。

ls -l工具可以查看到文件所属的九列权限,同时可以看到九列权限之后一位:如果是点(.)表示仅仅有九列权限,如果是+,表示除九列之外还有ACL权限,这时候就需要通过getfacl工具查看ACL权限

image-20220114173451678

看看getfacl命令怎么用

image-20220114173654102

  • 前三行,以井号开头的,表示注释信息,不起作用
    • file,显示文件,目录名
    • owner,紧跟着属主名
    • group,紧跟着属组名
  • 非井号开头的,就是ACL的权限控制规则了
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@yuchao-linux01 ~]# getfacl /data/
getfacl: Removing leading '/' from absolute path names
# file: data/
# owner: root
# group: root
user::rwx
group::r-x
other::---

语法
user:用户名:权限,这一行完整的写法是 user:root:rwx
group:组名:权限,这一行也是省略了,其实是group:root:r-x
other::--- 表示其他人没有任何权限

先知道,getfcal命令是能够查看文件的acl配置的

5.5 setfacl命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
语法
setfacl 选项 文件


选项:
-m:设定 ACL 权限。
如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
-x:删除指定的 ACL 权限;
-b:删除所有的 ACL 权限;
-d:设定默认 ACL 权限。
只对目录生效,指目录中新建立的文件拥有此默认权限;
-k:删除默认 ACL 权限;
-R:递归设定 ACL 权限。
不加-R的话,生成新子目录后,权限不继承。
指设定的 ACL 权限会对目录下的所有子文件生效;

实践setfacl

实践,给chaoge用户设置访问/data文件夹的r-x权限。

准备好测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 准备好测试数据
[root@yuchao-linux01 ~]# ll -d /data
drwxr-x--- 2 root ops 26 Jan 14 14:41 /data


[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# cd /data
[root@yuchao-linux01 data]#
[root@yuchao-linux01 data]# touch chaoge{1..10}.txt
[root@yuchao-linux01 data]#
[root@yuchao-linux01 data]# chown -R root.ops /data
[root@yuchao-linux01 data]#
[root@yuchao-linux01 data]#
[root@yuchao-linux01 data]#
[root@yuchao-linux01 data]# ll /data
total 0
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge10.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge1.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge2.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge3.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge4.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge5.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge6.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge7.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge8.txt
-rw-r--r-- 1 root ops 0 Jan 14 17:59 chaoge9.txt

给chaoge用户添加acl权限

image-20220114180238029

测试权限(图解)

先来看看,/data目录,会发现结尾多了一个+号,表示存在acl规则

1
2
[root@yuchao-linux01 data]# ll -d /data
drwxr-x---+ 2 root ops 197 Jan 14 17:59 /data

用yuchao01用户试试访问该目录,注意该目录,其他人是无权限的。

image-20220114180708751

删除acl

image-20220114181119984

规则删除后,chaoge用户也会在第一时间,丢失权限。

六、umask

umask 命令用来限制新文件权限的掩码,也称之为遮罩码。

  • 防止文件、文件夹创建的时候,权限过大
  • 当新文件被创建时,其最初的权限由文件创建掩码决定。

用户每次注册进入系统时,umask命令都被执行,并自动设置掩码改变默认值,新的权限将会把旧的覆盖。

root用户和普通用户的,umask值不一样,创建文件的权限也不一样。

image-20220114182237003

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root用户创建的
# 文件夹权限默认是755
[root@yuchao-linux01 ~]# ll -ld yuyu
drwxr-xr-x 2 root root 6 Jan 14 18:20 yuyu
# 文件权限默认644
[root@yuchao-linux01 ~]# ll yuchao66.txt
-rw-r--r-- 1 root root 0 Jan 14 18:20 yuchao66.txt



chaoge普通用户创建的

#文件夹权限775
[chaoge@yuchao-linux01 ~]$ ll -ld yuyu
drwxrwxr-x 2 chaoge chaoge 6 Jan 14 18:20 yuyu
# 文件权限 664
[chaoge@yuchao-linux01 ~]$ ll yuchao66.txt
-rw-rw-r-- 1 chaoge chaoge 0 Jan 14 18:20 yuchao66.txt

并且直接输入umask可以看到默认的值。

1
2
3
4
5
6
[root@yuchao-linux01 ~]# umask
0022


[chaoge@yuchao-linux01 ~]$ umask
0002

umask默认配置在/etc/profile 61-64行

6.1 图解umask

  • linux默认文件夹最大权限是777(文件夹必须、可读、可写、可执行)
  • linux文件默认最大权限是666(缺少x,因为x专门给可执行命令用,而不是普通文件)

image-20220114184606159

从这个表格来看

linux用户默认创建文件,文件夹的权限是怎么决定的

1
2
3
4
5
6
默认最高权限 - umask = 初始权限

比如文件的
root 666-022=644 rw-r--r--

chaoge 666-002=664 rw-rw-r--

6.2 注意umask别设置为基数

当umask设置为011时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
比如root用户
默认文件最大权限 666
umask值 011

初始文件权限,理论是 655

但是结果是这样吗

[root@yuchao-linux01 ~]# umask 011
[root@yuchao-linux01 ~]# touch test-umask.txt
[root@yuchao-linux01 ~]# ll test-umask.txt
-rw-rw-rw- 1 root root 0 Jan 16 14:01 test-umask.txt

发现文件权限依然是666
  • 这是因为文件默认是没有x权限的,x权限一般专门用于二进制文件,比如一个可以执行的linux命令。
  • 如果遮罩码设置为奇数,创建的文件权限会自动+1变成偶数权限。

6.3 修改mask值(了解即可,不要改)

临时修改umask值

1
2
3
4
5
6
7
[root@yuchao-linux01 ~]# 
[root@yuchao-linux01 ~]# umask 011
[root@yuchao-linux01 ~]# touch test-umask.txt
[root@yuchao-linux01 ~]# ll test-umask.txt
-rw-rw-rw- 1 root root 0 Jan 16 14:01 test-umask.txt

以后你默认创建的文件,其他人角色,也都有了写入权限,这不太合适吧。

永久修改umask值(所谓永久修改,指的是数据写入文件,每次开机都会加载)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.编辑用户环境变量文件,用于设置针对你个人用户,每次开机想得到一些专属于你自己的信息
vim ~/.bashrc

# 2.写入信息,保存
umask 044

# 3. 重启登录ssh会话
exit

# 4.检查umask值
[root@yuchao-linux01 ~]# umask
0044


# 5.查看默认权限
[root@yuchao-linux01 ~]# touch t2-umask.txt
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ll t2-umask.txt
-rw--w--w- 1 root root 0 Jan 16 14:20 t2-umask.txt

七、文件特殊属性

7.1 修改文件特殊属性chattr

命令说明

  • chattr用于改变文件的扩展属性。
  • chmod用于修改文件9位基础权限、r、w、x
  • 更底层的权限由chattr改变。

语法、参数

1
2
3
4
5
6
7
8
9
10
11
12
13
参数

a:只能向文件中添加数据,不得删除
-R:递归更改目录属性
-V:显示命令执行过程

模式
+ 增加参数
- 移除参数
= 更新为指定参数
A 不让系统修改文件最后访问时间
a 只能追加文件数据,不得删除
i 文件不能被删除、改名、修改内容

7.1.1 +a参数

+a 限制文件只能继续追加数据,不得删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@yuanlai-0224 ~]# echo "于超老师带你学Linux" >> t1.log
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# lsattr t1.log
---------------- t1.log

添加一个a特殊属性,限制只能追加,且不得删除
发现除了追加写入,不得对文件做任何更改,连vim都不能

[root@yuanlai-0224 ~]# chattr +a t1.log
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# lsattr t1.log
-----a---------- t1.log
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# echo '666' >> t1.log
[root@yuanlai-0224 ~]# echo '666' >> t1.log
[root@yuanlai-0224 ~]# echo '666' > t1.log
-bash: t1.log: Operation not permitted
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# mv t1.log t2.log
mv: cannot move ‘t1.log’ to ‘t2.log’: Operation not permitted

7.1.2 +i参数

+i 文件不能被删除、改名、修改内容,文件锁定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@yuchao-tx-server ~]# touch t1.log
[root@yuchao-tx-server ~]# lsattr t1.log
---------------- t1.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# chattr +i t1.log
[root@yuchao-tx-server ~]# lsattr t1.log
----i----------- t1.log

无法操作
[root@yuchao-tx-server ~]# echo '123' > t1.log
-bash: t1.log: 权限不够
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# mv t1.log t1.log.bak
mv: 无法将"t1.log" 移动至"t1.log.bak": 不允许的操作
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# rm -rf t1.log
rm: 无法删除"t1.log": 不允许的操作
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# cat t1.log

当你需要保护某个文件,不被删除,不得清空,保证只能写入新数据,比如一些系统日志,你要保留其所有的内容,可以设置。

1
chattr +a /var/log/messages

7.2 lsattr查看文件特殊属性

1
2
3
4
5
6
7
8
9
lsattr用于查看文件扩展的属性。


-R
递归地列出目录以及其下内容的属性.
-a
列出目录中的所有文件,包括以`.'开头的文件的属性.
-d
列出目录本身的属性

实践

1
2
[root@yuchao-tx-server ~]# lsattr t1.log
----i----------- t1.log

八、文件属性inode和block

linux为什么要设计inode

1
2
3
4
5
6
7
8
9
理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

查看inode存储的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
* 文件的字节数

* 文件拥有者的User ID

* 文件的Group ID

* 文件的读、写、执行权限

* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

* 链接数,即有多少文件名指向这个inode

* 文件数据block的位置

1.文件属性与inode查看

image-20220406190552608

2.什么是inode

linux的文件,其实是分为了元数据+文件内容,两部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
元数据,也就是文件的属性信息,可以通过stat命令查看到
存储元数据信息的空间,被称之为Inode

存储文件数据的空间,被称之为block

linux读取文件内容,其实是 以 文件名 > inode编号 > block 的顺序来读取

在你创建文件前必须先要分区、格式化(创建文件系统),创建文件系统后inode和block的数量就会固定下来。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用如下命令,可以查看文件的inode号

1
2
[yuchao-linux01 root /opt]$ls -i 5G.txt
50391778 5G.txt

3.图解,文件访问原理

image-20220406200031320

4.文件、文件夹的关系

1
2
3
目录是一个特殊的文件,目录保存的是当前目录下的文件名字
简单说,文件夹就是方便人类记忆文件存在哪、然后通过这个文件名吗,找到对应的文件inode号
inode号里记录了文件数据所处的block位置,最终访问到数据

image-20220406200311447

5.关于删除文件原理

image-20220406202813062

九、软连接、硬链接

1.软连接就是windows下的快捷方式

软连接文件存储的是源文件的路径。

1
2
3
4
5
6
7
访问软连接 ln -s 

访问到源文件的路径,源文件的文件名

访问源文件的inode编号 ls -i filename

inode找到block,访问到数据

image-20220406203543404

1
2
3
4
5
软连接特点
1.软连接文件的inode号和源文件不同,作用是存储源文件的路径
2.命令ln -s创建
3.删除普通软连接,不影响源文件
4.删除源文件,软连接找不到目标,报错提示。

2.硬链接

硬链接,就是一个数据(block)被多个相同inode号的文件指向。

就好比超市有好多个大门,但是都能进入到这个超市。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
创建语法
ln 源文件 目标文件

创建硬链接
[yuchao-linux01 root /opt]$ls -l /yuchao.log
-rw-r--r-- 1 root root 0 Apr 6 20:24 /yuchao.log
[yuchao-linux01 root /opt]$
[yuchao-linux01 root /opt]$ln /yuchao.log /tmp/c1
[yuchao-linux01 root /opt]$ln /yuchao.log /tmp/c2
[yuchao-linux01 root /opt]$
[yuchao-linux01 root /opt]$ls -l /yuchao.log
-rw-r--r-- 3 root root 0 Apr 6 20:24 /yuchao.log

检查多个硬链接的inode号,都是同一个,表示是指向同一个区域的数据
[yuchao-linux01 root /opt]$ls -i /yuchao.log
71295 /yuchao.log
[yuchao-linux01 root /opt]$ls -i /tmp/c1
71295 /tmp/c1
[yuchao-linux01 root /opt]$ls -i /tmp/c2
71295 /tmp/c2

image-20220406204831924

1
2
3
4
5
6
7
8
9
硬链接特点
1.可以对已存在的文件做硬链接
2.硬链接的文件,inode相同,属性一致
3.只能在同一个磁盘分区下,同一个文件系统下创建硬链接
4.不能对文件夹创建硬链接,只有文件可以
5.删除一个硬链接,不影响其他相同inode号的文件
6.文件夹的硬链接,默认是2个,以及是2+(第一层子目录总数)=文件夹的硬链接数量
7.可以用任意一个硬链接作为入口,操作文件
8.当文件的硬链接数为0时,文件真的被删除

6.工作里咋用

1
2
3
1.一般会给文件夹添加软连接,便于管理
2.通过软连接来区分软件的多种版本
3.通过inode号彻底删除文件

7.练习题

1
2
3
4
5
6
1.创建文件夹的软连接
2.创建文件的软连接
3.删除文件、目录的软连接,查看效果
4.删除文件、目录的源文件,查看效果
5.往源文件写入数据,查看软连接文件的变化
6.往软连接里写数据,查看源文件的变化

什么是权限

image-20250815112319866

读取cat,more,tail

写入echo追加,vim编辑,cat重定向

修改,修改文件属性,mv改名字,修改文件权限,

执行,文件中写的是可执行的语句,如bash语句

权限分类

image-20250815112931169

image-20250815113042728

image-20250815113413278

image-20250815113558371

理解linux下的文件权限属性

认识文件权限

image-20250815144237502

image-20250815150650607

image-20250815151411837

image-20250815151614745

image-20250815151820378

image-20250815153056564

image-20250815154347581

image-20250815154522621

image-20250815154555123

image-20250815155658295

image-20250815160147582

image-20250815160502018

image-20250815160559026

学习link快捷

关于python和软连接的关系

image-20250815171828239

image-20250815181234004

chamod命令

image-20250815185235612

image-20250815193409438

image-20250815194219412

image-20250815194535557

image-20250815194905700

image-20250815195623619

image-20250815195650206

细讲环境变量与用户修复

3.16作业

image-20250815222533393

image-20250816150442283

image-20250816152326369

image-20250816152631171

image-20250816152657850

image-20250816152946680

image-20250816153032689

image-20250816153234326

image-20250816153433860

image-20250816153549329

image-20250816153658865

image-20250816153734455

image-20250816154107342

image-20250816154130481

image-20250816154220673

image-20250816155252296

image-20250816155449465

image-20250816155708615

image-20250816155808480

image-20250816155848085

image-20250816160121723

image-20250816160205062

image-20250816160238985

image-20250816160551549

image-20250816160845404

image-20250816161018293

image-20250816161220835

image-20250816161456519

image-20250816161521974

image-20250816161547647

image-20250816161657026

image-20250816161718645

image-20250816162610141

image-20250816163219901

image-20250816163336105

image-20250816182519254

image-20250816182849064

image-20250816182915526

image-20250816183028566

特殊权限

image-20250816211429742

image-20250816211843180

image-20250816212015106

image-20250816212109055

image-20250816213755734image-20250816214131365

image-20250816214602462image-20250816214646838

image-20250816214715568

image-20250816215437087

said的作用

image-20250816223730811

image-20250816224849193

image-20250816224916964

sbit作用

image-20250816225642068

linux基础服务管理

在学了linux基础命令后,下一步就是学习linux的各种服务配置,运维的日常,也就是使用linux命令作为基本功,去维护,操作各种服务配置,服务指的是各种应用程序。

比如以后会接触的web服务、数据库服务等。

但是我们先学习linux自带的一些应用程序,一个基础服务,是不需要你单独安装的,系统装好后,自带的服务,可以直接使用,来完成一些功能。那明显的,其他一些服务,就是需要我们额外安装的。

学习目标

1、了解systemctl命令用途

2、掌握使用systemctl开启,关闭,重启服务

3、了解常见自有服务ntpd,firewalld,crond的作用

4、掌握ntpdate时间同步原理与实现

5、掌握防火墙的相关操作(添加和删除简单规则,开启,关闭防火墙)

6、了解源码包和二进制包的区别

7、掌握rpm包的卸载、安装以及更新操作

8、了解计划任务的作用

9、掌握计划任务的编辑

一、自有服务概述

服务是一些特定的进程,自有服务就是系统开机后就自动运行的一些进程,一旦客户发出请求,这些进程就自动为他们提供服务,windows系统中,把这些自动运行的进程,称为”服务”

image-20220116144458535

windows自带的各种服务

image-20220116144635592

举例:当我们使用SSH客户端软件连接linux的时候,我们的服务器为什么会对连接做出响应?是因为SSH服务开机就自动运行了。

image-20220116144700542

所谓自有服务,简单来说,可以理解为Linux系统开机自动运行的服务(程序)。

我们如何管理这些自有服务呢?

二、systemctl管理服务命令

在Centos7之前,通过service 和 chkconfig两个命令来管理服务

service: 负责启动,停止服务,显示服务状态

1
2
3
4
5
6
7
8
9
service命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、重新加载配置(reload)、查看状态(status)等。

# service mysqld #打印指定服务mysqld的命令行使用帮助。

# service mysqld start #启动mysqld

# service mysqld stop #停止mysqld

# service mysqld restart #重启mysqld

chkconfig: 指定服务是否开机启动

1
2
3
4
5
6
7
提供了一个维护/etc/rc[0~6] d 文件夹的命令行工具,它减轻了系统直接管理这些文件夹中的符号连接的负担。chkconfig主要包括5个原始功能:为系统管理增加新的服务、为系统管理移除服务、列出单签服务的启动信息、改变服务的启动信息和检查特殊服务的启动状态。当单独运行chkconfig命令而不加任何参数时,他将显示服务的使用信息。

[root@localhost www]# chkconfig --list #查看系统程序列表

[root@localhost www]# chkconfig httpd on #将httpd加入开机启动

[root@localhost www]# chkconfig httpd off #关闭httpd开机启动

从Centos7开始,统一使用systemctl来管理服务, systemctl同时具有service和chkconfig命令的功能。

systemd命令

systemd 是目前 Linux 系统上主要的系统守护进程管理工具,由于 init 一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面 init 也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。

所以许多 Linux 发行版都由 systemd 取代了 init 作为默认的系统进程管理工具。

systemd 所管理的所有系统资源都称作 Unit,通过 systemd 命令集可以方便的对这些 Unit 进行管理。

比如 systemctl、hostnamectl、timedatectl、localctl 等命令,这些命令虽然改写了 init 时代用户的命令使用习惯(不再使用 chkconfig、service 等命令),但确实也提供了很大的便捷性。

systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。

systemd 的特性有:

  • 支持并行化任务;
  • 同时采用 socket 式与 D-Bus 总线式激活服务;
  • 按需启动守护进程(daemon);
  • 利用 Linux 的 cgroups 监视进程;
  • 支持快照和系统恢复;维护挂载点和自动挂载点;
  • 各服务间基于依赖关系进行精密控制。

systemctl命令

systemctl(英文全拼:system control)用于控制 systemd 系统和管理服务。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
systemctl [OPTIONS...] COMMAND [UNIT...]

command 选项字如下:

start:启动指定的 unit。
stop:关闭指定的 unit。
restart:重启指定 unit。
reload:重载指定 unit。
enable:系统开机时自动启动指定 unit,前提是配置文件中有相关配置。
disable:开机时不自动运行指定 unit。
status:查看指定 unit 当前运行状态。

参数:unit 是要配置的服务名称。
任务 旧指令 新指令
使某服务自动启动 chkconfig –level 3 httpd on systemctl enable httpd.service
使某服务不自动启动 chkconfig –level 3 httpd off systemctl disable httpd.service
检查服务状态 service httpd status systemctl status httpd.service (服务详细信息) systemctl is-enabled httpd.service (仅显示是否 Active)
显示所有已启动的服务 chkconfig –list systemctl list-units –type=service
启动某服务 service httpd start systemctl start httpd.service
停止某服务 service httpd stop systemctl stop httpd.service
重启某服务 service httpd restart systemctl restart httpd.service
某服务重新加载配置文件 service httpd reload systemctl reload httpd.service

所有的systemctl命令,忘记用法的话,最直接的方式,看帮助手册。

[root@yuchao-linux01 ~]# systemctl –help

1、 显示服务

命令:systemctl

作用:管理服务

语法:#systemctl [选项]

选项:

1
2
3
4
5
list-units --type service --all:列出所有服务(包含启动的和没启动的)

list-units --type service:列出所有启动的服务

区别就在于--all参数

实践

显示出系统中所有的服务,默认管理的应用程序有哪些

和windows打开服务功能一样。

包括在运行的,以及未运行的服务

空格翻页,q退出查看

1
2
3
4
5
6
7
8
[root@yuchao-linux01 ~]# systemctl list-units --type service --all
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher

查看ACTIVE字段的属性即可
active表示该服务正在运行中
inactive表示未运行

image-20220116145320495

只显示运行中的服务

1
[root@yuchao-linux01 ~]# systemctl list-units --type service

2、查看启动和停止服务

命令:systemctl

作用:管理服务

语法:#systemctl [选项] 服务名

选项:

status:检查指定服务的运行状况

start:启动指定服务

stop:停止指定服务

restart:重启指定服务

reload:重新加载指定服务的配置文件(并非所有服务都支持reload,通常使用restart)

1
2
3
4
语法
systemctl 选项 服务名

查看sshd服务的运行状态,如果这个关了,我们就无法ssh远程连接了

image-20220116152921812

Active:active(running) 表示当前crond服务是运行状态。

试试停止sshd服务

注意,停止后,xshell远程连接会断开,只能通过vmware机器连接

image-20220116153307862

必须要重启sshd服务,才可以远程连接

1
2
[root@yuchao-linux01 ~]# systemctl start  sshd
[root@yuchao-linux01 ~]# systemctl restart sshd

从这里可以看出对于一个服务的管理,产生的作用。

3、服务持久化

所谓服务持久化,就是服务在开机的时候,是否自动启动。

命令:systemctl

作用:管理服务

语法:#systemctl [选项] 服务名

选项:

enable:指定服务开机自动启动

disable:取消服务开机自动启动

is-enabled :查看是否设置了开机自启

image-20220116155401045

systemctl disable sshd

image-20220116155557562

systemctl enable sshd

image-20220116155626971

4、systemctl 小结

systemctl参数总结

参数 含义
list-units –type service –all 列出所有服务
list-units –type service 列出所有启动的服务
start 启动指定服务
stop 停止指定服务
status 检查指定服务的运行状况
restart 重启指定服务
reload 重新加载指定服务的配置文件(并非所有服务都支持reload,通常使用restart)
enable 指定服务开机自动启动
disable 取消服务开机自动启动

三、常用自有服务(ntp,firewalld,crond)

服务名 含义
ntpd 用于同步计算机的系统时间的服务
firewalld 防火墙服务
crond 计划任务服务

1、ntp时间同步服务

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

在计算机的世界里,时间非常地重要

例如:对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?

NTP就是用来解决这个问题的,NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。

它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。

工作场景:

公司开发了一个电商网站,由于访问量很大,网站后端由100台服务器组成集群。

50台负责接收订单,50台负责安排发货,接收订单的服务器需要记录用户下订单的具体时间,把数据传给负责发货的服务器,由于100台服务器时间各不相同,记录的时间经常不一致,甚至会出现下单时间是明天,发货时间是昨天的情况。

时间是很重要的一个单位概念,很多新手、老手,都可能在时间同步服务上翻车,很多服务部署,因为时间的不同步,都会导致出错,增加排错难度。

特别是在集群下,多台服务器,需要部署联调,由于时间不正确,可能导致通信异常。

需要时间的应用。

  • 定时任务的执行
  • 数据同步,时间不一致等。

因此保证服务器之间的时间一致,非常重要。

1)NTP同步服务器原理

标准时间是哪里来的?

现在的标准时间是由原子钟报时的国际标准时间UTC(Universal Time Coordinated,世界协调时),所以NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。

在NTP中,定义了时间按照服务器的等级传播,Stratum层的总数限制在15以内

工作中,通常我们会直接使用各个组织提供的,现成的NTP服务器。

2)到哪里去找NTP服务器

NTP授时网站:http://www.ntp.org.cn/pool

image-20220116162754021

找到时间服务器地址,拿来即用。

image-20220116162841432

3)timedatectl 命令

timedatectl(英文全拼:timedate control)命令用于在 Linux 中设置或查询系统时间、日期和时区等配置。

1
2
3
4
5
6
7
8
centos6时代,修改系统的时区、时间,需要用到
修改时间、日期、date命令
修改时区,cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改硬件时间、hwclock命令



在centos7提供了更强大的timedatectl命令,整合了时间、时区操作。

在 Linux 运维中,通常使用此命令来设置或更改当前的日期、时间和时区,或启用自动系统时钟与远程 NTP 服务器同步,以确保 Linux 系统始终保持正确的时间。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
timedatectl [OPTIONS...] COMMAND ...

命令command
status :显示当前的时间设置。
show :显示 systemd-timedated 的属性。
set-time TIME :设置系统时间。
set-timezone ZONE :设置系统时区。
list-timezones :显示已知时区。
set-local-rtc BOOL :控制 RTC 是否在当地时间。(BOOL 的值可以是 1 / true 或 0 / false)
set-ntp BOOL :启用或禁用网络时间同步。(BOOL 的值可以是 1 / true 或 0 / false)
timesync-status :显示 systemd-timesyncd 的状态。
show-timesync :显示 systemd-timesyncd 的属性。


选项
选项:

-h, --help :显示帮助信息。
--version :显示软件包版本。
--no-pager :不用将输出通过管道传输到寻呼机(pager)。
--no-ask-password :不提示输入密码。
-H, --host=[USER@]HOST :在远程主机上操作。
-M, --machine=CONTAINER :在本地容器上操作。
--adjust-system-clock :更改本地 RTC 模式时调整系统时钟。
--monitor :监控 systemd-timesyncd 的状态。
-p, --property=NAME :仅显示此名称的属性。
-a, --all :显示所有属性,包括空属性。
--value :显示属性时,只打印值。

timedatectl实战

显示当前系统时间、日期

世界时间查询,http://www.stl56.com/shicha/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@yuanlai-0224 ~]# timedatectl status
Local time: Thu 2022-03-17 18:11:37 CST
Universal time: Thu 2022-03-17 10:11:37 UTC
RTC time: Thu 2022-03-17 10:11:37
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a



解释:
当地时间
世界时间
RTC时间,本地硬件时钟(主板上的纽扣电池供电,提供机器的时间正确,在主板的集成电路上)默认以UTC为准了
时区,亚洲上海
是否启用NTP
NTP同步状态
本地时区的RTC
DST是否激活


CST解释
CST(北京时间)
北京时间,China Standard Time,中国标准时间。
在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。


UTC
UTC(世界标准时间)
协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time")
整个地球分为二十四时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时。

GMT
格林威治标准时间指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线(UTC与GMT时间基本相同)。



DST
夏令时指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用,中国不使用。

列出机器上支持的所有时区

1
[root@yuanlai-0224 ~]# timedatectl list-timezones

将本地时区从上海(Asia/Shanghai)设置为阿姆斯特丹(Europe/Amsterdam)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]# timedatectl set-timezone "Europe/Amsterdam"
[root@yuanlai-0224 ~]# timedatectl show
Unknown operation show
[root@yuanlai-0224 ~]# timedatectl status
Local time: Thu 2022-03-17 10:28:08 CET
Universal time: Thu 2022-03-17 09:28:08 UTC
RTC time: Thu 2022-03-17 17:28:07
Time zone: Europe/Amsterdam (CET, +0100)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: no
Last DST change: DST ended at
Sun 2021-10-31 02:59:59 CEST
Sun 2021-10-31 02:00:00 CET
Next DST change: DST begins (the clock jumps one hour forward) at
Sun 2022-03-27 01:59:59 CET
Sun 2022-03-27 03:00:00 CEST
[root@yuanlai-0224 ~]#
[root@yuanlai-0224 ~]#

本地时区,恢复为亚洲、上海。

1
2
3
4
5
6
7
8
9
10
11
[root@yuanlai-0224 ~]# timedatectl set-timezone "Asia/Shanghai"

[root@yuanlai-0224 ~]# timedatectl status
Local time: Thu 2022-03-17 17:32:34 CST
Universal time: Thu 2022-03-17 09:32:34 UTC
RTC time: Thu 2022-03-17 17:32:33
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

timedatectl更多用法

timedatectl用法还有很多,以后有需要单独查询学习即可,包括如下功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改时区为UTC(世界标准时间)
timedatectl set-timezone UTC

设置系统时间(格式:HH:MM:SS)
timedatectl set-time "07:25:46"

设置系统日期(格式:YYYY-MM-DD)
timedatectl set-time "2021-12-12"

设置ntp服务开启(得先安装ntp时间同步服务)
timedatectl set-ntp true/false

修改RTC硬件时间
[root@yuanlai-0224 ~]# timedatectl set-local-rtc 0 # 和UTC时间同步
[root@yuanlai-0224 ~]# timedatectl set-local-rtc 1 # 和local time同步

如果你跟着于超老师,操作到这里,你的时间可能已经乱了。。怎么办?

向下继续看教程啊怎么办!

4)时间同步操作

机器时间错乱后,可以进行

  • 时间同步,搭建ntpd服务
  • 时间校准,ntpdate命令

同步服务器时间方式有2 个:一次性同步手动同步、通过服务自动同步。

时间同步注意点(生产经验的坑)

ntpd在实际同步时间时是一点点的校准过来时间的,最终把时间慢慢的校正对

ntpdate不会考虑其他程序是否会阵痛,直接调整时间。一个是校准时间,一个是调整时间。

因为许多应用程序依赖连续的时钟,而使用ntpdate这样的时钟跃变,有时候会导致很严重的问题,如数据库事务操作等。

并且,还有如下缺陷

  • 安全问题
    • ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。
  • 太过于暴力
    • ntpdate是急变,是立即修改系统时间,非常依赖于时序的程序可能会出错,比如根据时间执行备份动作的脚本,或者一些监控程序。

因此,企业服务器里一般会部署ntpd服务,让服务器自动、定期的进行时间同步,且以公共时间服务器池为准,保证服务器集群的时间正确且一致。

image-20250818161425615

手动同步ntpdate

该ntpdate命令需要单独安装。

1
yum install ntpdate -y

ntpdate使用语法

1
2
3
4
5
6
7
8
ntpdate 时间服务器地址

# NTP中国服务器,cn.ntp.org.cn

# 用法
[root@yuchao-linux01 ~]# ntpdate cn.ntp.org.cn

16 Jan 16:30:08 ntpdate[5312]: step time server 182.92.12.11 offset 45505765.702122 sec

image-20220116163020217

友情提示,错误情况,你可能输入的NTP服务器地址有误

1.要么是你机器无法上网

2.要么是输入的NTP服务器有问题

3.你输入错误

image-20220116163124861

自动同步ntpd服务(推荐使用)

1.ntpd服务安装

1
2
3
4
5
6
7
8
# 查看是否安装
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# rpm -q ntp
package ntp is not installed


# 如果没有安装过的话,可以执行此命令安装
[root@yuchao-linux01 ~]# yum install ntp -y

自动同步需要开启linux的ntp服务。

1
systemctl start/stop/restart  ntpd

每次开机,自动启动ntpd服务,就能够自动同步时间,保证服务器时间精准。

image-20220116163347526

关于ntpd服务,默认用的哪些时间服务器地址,配置信息在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
修改 /etc/ntp.conf 配置文件,参考如下修改


3 # #系统时间与BIOS事件的偏差记录
4 driftfile /var/lib/ntp/drift
5
6 # by yuchao create ntpd.log
7 logfile /var/log/ntpd.log
8
9 # by yuchao create ntpd.pid
10 pidfile /var/run/ntpd.pid

注释掉默认的这几行
19 # Use public servers from the pool.ntp.org project.
20 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
21 #server 0.centos.pool.ntp.org iburst
22 #server 1.centos.pool.ntp.org iburst
23 #server 2.centos.pool.ntp.org iburst
24 #server 3.centos.pool.ntp.org iburst

添加新的互联网中ntp服务器
# prefer表示为优先,表示本机优先同步该服务器时间
# 阿里云的延迟明显很低 https://help.aliyun.com/document_detail/92704.html

server times.aliyun.com iburst prefer
server ntp.aliyun.com iburst
server cn.pool.ntp.org iburst




添加新的ntp服务器地址,参数解释 iburst,当某一个ntp挂掉时,向它发送一些数据包,检测是否挂掉。




########## 参数解释
ntpd.conf配置文件采用restrict实现权限控制

Restrict [IP] mask [netmask_IP] [parameter]

Parameter 的
ignore :拒绝所有类型的NTP联机。
nomodify: 客户端不能使用ntpc与ntpq这两个程序来修改服务器的时间参数,但客户端可透过这部主机来进行网络校时;
noquery:客户端不能够使用ntpc与ntpq等指令来查询时间服务器,不提供NTP的网络校时。
notrap:不提供trap 这个运程事件登入的功能。
notrust:拒绝没有认证的客户端。
Kod:kod技术可以阻止“Kiss of Death “包对服务器的破坏。
Nopeer:不与其他同一层的NTP服务器进行时间同步。

利用server 设定上层NTP服务器,格式如下:
server [IP or hostname] [prefer]

参数主要如下:
perfer:表示优先级最高
burst :当一个运程NTP服务器可用时,向它发送一系列的并发包进行检测。
iburst :当一个运程NTP服务器不可用时,向它发送一系列的并发包进行检测。

用法如
server times.aliyun.com iburst prefer # prefer表示为优先,表示本机优先同步该服务器时间
server ntp.aliyun.com iburst
server cn.pool.ntp.org iburst

设置系统时间和硬件时间同步

实现clock时间与system时间同步,配置/etc/sysconfig/ntpd文件

ntp服务,默认只会同步系统时间。

如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd文件,在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes这样,就可以让硬件时间与系统时间一起同步。

1
2
3
4
[root@yuchao-linux01 ~]# cat  /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"
SYNC_HWCLOCK=yes

启动ntpd服务

1
2
3
4
5
6
7
8
9
启动ntpd程序
[root@yuchao-linux01 ~]# systemctl start ntpd


检查ntpd运行后,生成的相关文件
[root@yuchao-linux01 ~]# ll /var/log/ntpd.log
-rw-r--r-- 1 root root 864 Mar 17 18:25 /var/log/ntpd.log
[root@yuchao-linux01 ~]# ll /var/run/ntpd.pid
-rw-r--r-- 1 root root 4 Mar 17 18:25 /var/run/ntpd.pid

ntpstat

确认本地NTP与上层NTP服务器是否联通

1
2
3
4
5
6
7
[root@yuchao-linux01 ~]# ntpstat
# 以和162.159.200.123服务器同步过
synchronised to NTP server (162.159.200.123) at stratum 4
# 时间校正到相差1110ms之内
time correct to within 1110 ms
# 每64秒会向上级NTP轮询更新一次时间
polling server every 64 s

ntpq

查看时间同步状态

-p 显示时间服务器列表

1
2
3
4
5
6
[root@yuchao-linux01 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*120.25.115.20 10.137.53.7 2 u 20 64 7 41.614 19.046 4.108
+203.107.6.88 10.137.38.86 2 u 24 64 7 15.996 23.737 6.711
+time.cloudflare 10.28.12.207 3 u 23 64 17 282.792 -14.257 59.448

参数详解

1
2
3
4
5
6
7
8
9
10
11
12
13
remote :本地主机所连接的上层NTP服务器,最左边的符号如下:
如果有[*] 代表目前正在使用当中的上层NTP服务器。
如果有[+] 代表也有连上上层NTP服务器,可以作为提高时间更新的候选NTP服务器
如果有[-] 代表同步的该NTP服务器被认为是不合格的NTP Server
如果有[x] 代表同步的外网NTP服务器不可用
refid :指的是给上层NTP服务器提供时间校对的服务器。
St:上层NTP服务器的级别。
When: 上一次与上层NTP服务器进行时间校对的时间(单位:s)
Poll :本地主机与上层NTP服务器进行时间校对的周期(单位:s)
reach:已经向上层 NTP 服务器要求更新的次数
delay:网络传输过程当中延迟的时间,单位为 10^(-6) 秒
offset:时间补偿的结果,单位为10^(-6) 秒
jitter:Linux 系统时间与 BIOS 硬件时间的差异时间, 单位为 10^(-6) 秒。

5)date/hwclock/clock命令

date

可用来设置系统日期与时间。只有管理员才有设置日期与时间的权限,一般用户只能用date 命令显示时间。

若不加任何参数,data 会显示目前的日期与时间。

1
2
[root@yuchao-linux01 ~]# date
Thu Mar 17 18:59:49 CST 2022

语法,参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-s, --set=STRING
根据 STRING 设置时间

格式化修改时间+日期
[root@yuchao-linux01 ~]# date -s '20180808 13:13:13'
Wed Aug 8 13:13:13 CST 2018


格式化修改时间
[root@yuchao-linux01 ~]# date -s '18:00:00'
Wed Aug 8 18:00:00 CST 2018

格式化修改日期
[root@yuchao-linux01 ~]# date -s '20120606'
Wed Jun 6 00:00:00 CST 2012
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# date '+%F'
2012-06-06

hwclock

hwclock命令是一个硬件时钟访问工具,它可以显示当前时间、设置硬件时钟的时间和设置硬件时钟为系统时间,也可设置系统时间为硬件时钟的时间。

在Linux中有硬件时钟系统时钟两种时钟。

硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。

系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。

所有Linux相关指令与函数都是读取系统时钟的设定。

1
2
3
4
5
6
7
8
9
10
11
12
语法参数
--systohc 将硬件时钟调整为与目前的系统时钟一致。

--hctosys 将系统时钟调整为与目前的硬件时钟一致。

--show 显示硬件时钟的时间与日期。

--debug 显示hwclock执行时详细的信息。

-w, --systohc set the hardware clock from the current system time
--systz set the system time based on the current timezone
--adjust adjust the RTC to account for systematic drift since

以系统时间为准,修改硬件时钟

1
2
3
4
[root@yuchao-linux01 ~]# hwclock --hctosys
[root@yuchao-linux01 ~]# hwclock --show
Thu 17 Mar 2022 07:07:42 PM CST -0.833680 seconds
[root@yuchao-linux01 ~]#

以硬件时间为准,修改系统时间

1
2
3
[root@yuchao-linux01 ~]# hwclock --systohc
[root@yuchao-linux01 ~]# hwclock --show
Thu 17 Mar 2022 07:08:18 PM CST -0.740291 seconds

6)开机自启ntpd

1
2
3
# 默认为CentOS7的配置,CentOS6中需要使用chkconfig命令
[root@yuchao-linux01 ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

2、firewalld防火墙

什么是防火墙

防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。

image-20220116163617569

防火墙好比一堵真的墙,能够隔绝些什么,保护些什么。

防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这种防护构筑物就被称之为“防火墙”。其实与防火墙一起起作用的就是“门”。

如果没有门,各房间的人如何沟通呢,这些房间的人又如何进去呢?当火灾发生时,这些人又如何逃离现场呢?

这个门就相当于我们这里所讲的防火墙的“安全策略”,所以在此我们所说的防火墙实际并不是一堵实心墙,而是带有一些小孔的墙。

这些小孔就是用来留给那些允许进行的通信,在这些小孔中安装了过滤机制,就是防火墙的过滤策略了。

防火墙的作用

防火墙具有很好的保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。

防火墙的功能

防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信。

最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

防火墙概念

防火墙一般有硬件防火墙和软件防火墙

硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

image-20200109180446835

image-20200109180614627

windows防火墙

image-20220116164507222

Linux防火墙(图解)

image-20250818161551166

可见,服务器上有各种规则,限制什么请求可以进入到服务器

3、firewalld防火墙的概念

1)区域

CentOS6x中防火墙叫做iptables

CentOS7.x 中默认使用的防火墙是firewalld,但是依然更多的是使用iptables,firewalld默认都关了。

firewalld增加了区域的概念,所谓区域是指,firewalld预先准备了几套防火墙策略的集合,类似于策略的模板,用户可以根据需求选择区域。

常见区域及相应策略规则

区域 默认策略
trusted 允许所有数据包
home 拒绝流入的流量,除非与流出的流量相关,允许ssh,mdns,ippclient,amba-client,dhcpv6-client服务通过
internal 等同于home
work 拒绝流入的流量,除非与流出的流量相关,允许ssh,ipp-client,dhcpv6-client服务通过
public 拒绝流入的流量,除非与流出的流量相关,允许ssh,dhcpv6-client服务通过
external 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过
dmz 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过
block 拒绝流入的流量,除非与流出的流量相关,非法流量采取拒绝操作
drop 拒绝流入的流量,除非与流出的流量相关,非法流量采取丢弃操作

2)运行模式和永久模式

运行模式:此模式下,配置的防火墙策略立即生效,但是不写入配置文件

永久模式:此模式下,配置的防火墙策略写入配置文件,但是需要reload重新加载才能生效。

==firewall默认采用运行模式==

4、firewalld防火墙的配置

1)查看,开启和停止firewalld服务

命令:systemctl

作用:管理服务

语法:#systemctl [选项] firewalld

选项:

status:检查指定服务的运行状况

start:启动指定服务

stop:停止指定服务

restart:重启指定服务

reload:重新加载指定服务的配置文件(并非所有服务都支持reload,通常使用restart)

使用systemctl来管理firewalld的服务,具体命令前面已经讲过,只是服务名换成了firewalld,这里不再赘述

image-20220116165751024

2) 管理firewall配置

命令:firewall-cmd

作用:管理firewall具体配置

语法:#firewall-cmd [参数选项1] ….[参数选项n]

常用选项:

查看默认使用的区域

1
2
[root@yuchao-linux01 ~]# firewall-cmd --get-default-zone
public

查看所有可用区域

1
2
[root@yuchao-linux01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

列出当前使用区域配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yuchao-linux01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client # 允许的是ssh服务,也就是22端口的流量,是允许登录的
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

列出所有区域的配置信息

1
[root@yuchao-linux01 ~]# firewall-cmd --list-all-zones

添加允许通过的服务或端口(python,ntp)

你的linux机器,当前使用的是public区域的规则

默认信任的服务是,ssh,dhcp

准备一个web服务,通过python提供的简单命令,

1
python -m SimpleHTTPServer 80

image-20220116171441405

此时的防火墙,是没有允许80端口的请求,进入到服务器的,除非你加一个规则,允许80端口的请求通过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@yuchao-linux01 ~]# firewall-cmd --zone=public --add-port=80/tcp
success
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 80/tcp # 允许80端口通过了
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

image-20220116171731366

此时客户端已经可以正确访问服务器的80端口

image-20220116171844642

去掉允许通过的端口

比如刚才你临时个服务器,添加了一个文件下载的服务,需要访问80端口

你现在不需要这个功能了,想去掉防火墙规则,继续加强服务器安全。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@yuchao-linux01 ~]# firewall-cmd --zone=public --remove-port=80/tcp
success
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: # 端口被移除了
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

此时再想访问http://10.96.0.146/,你的请求就到不了服务器了。

添加允许ntp的防火墙策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@yuchao-linux01 ~]# firewall-cmd --permanent --add-service=ntp
success
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# firewall-cmd --reload
success
[root@yuchao-linux01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client ntp
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:


检查iptables语句
[root@yuchao-linux01 ~]# iptables -L |grep ntp
ACCEPT udp -- anywhere anywhere udp dpt:ntp ctstate NEW

永久模式参数

permaent(永久性的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 永久性添加规则,并未立即生效
[root@yuchao-linux01 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp
success
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: # 端口规则还未生成
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

# 重新加载防火墙规则
[root@yuchao-linux01 ~]# firewall-cmd --reload
success

[root@yuchao-linux01 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@yuchao-linux01 ~]# iptables -L |grep tcp
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW
ACCEPT tcp -- anywhere anywhere tcp dpt:http ctstate NEW
[root@yuchao-linux01 ~]#

image-20220116173214624

5、计划任务crontab

img

你每天是怎么起床的?有的人有女朋友,,或是男朋友,,而我是被穷醒的,,,

什么是计划任务: 后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好。

  • 周期性任务执行
    • 比如夜里进行用户数据备份(夜里访问量较少,备份动作吃资源,影响用户访问)
    • 游戏公司特殊
  • 清空/tmp目录下的内容
  • mysql数据库备份
  • redis数据备份
  • 定时获取系统的状态信息
  • 定时每天进行时间同步
  • 网站用户日志定时切割、备份

这就用到了crond服务。

1)计划任务的作用

作用:

操作系统不可能24 小时都有人在操作,有些时候想在指定的时间点去执行任务(例如:每天凌晨 2 点去重新启动Apache),此时不可能真有人每天夜里 2 点去执行命令,这就可以交给计划任务程序去执行操作了。

2)查看计划任务

==语法:# crontab 选项==

常用选项:

==-l:list,列出指定用户的计划任务列表==

==-e:edit,编辑指定用户的计划任务列表,简单来说,计划任务就是一个文件==

-u:user,指定的用户名,如果不指定,则表示当前用户

-r:remove,删除指定用户的计划任务列表

示例代码:列出当前用户的计划任务列表

1
2
[root@yuchao-linux01 ~]# crontab  -l
no crontab for root

默认应该是没有设置定时任务的。

3)编辑计划任务(重点)

进入计划任务编辑文件

1
[root@yuchao-linux01 ~]# crontab -e

打开计划任务编辑文件后,可以在此文件中编写我们自定义的计划任务:

计划任务的规则语法格式,以行为单位,一行则为一个计划:

==分 时 日 月 周 需要执行的命令==

例如:0 0 * * * reboot,代表每天0时0分执行reboot指令。

3.1) crontab语法(重点)

image-20220117094718162

1
2
3
4
5
6
7
8
9
10
11
12
取值范围(常识):
分:0~59
时:0~23
日:1~31
月:1~12
周:0~6,0 和 7 表示星期天

四个符号:
*:表示取值范围中的每一个数字
-:做连续区间表达式的,要想表示1~7,则可以写成:1-7
/:表示每多少个,例如:想每 10 分钟一次,则可以在分的位置写:*/10
,:表示多个取值,比如想在 1 点,2 点 6 点执行,则可以在时的位置写:1,2,6

并且在定时任务里,命令,请写上绝对路径。

1
2
3
4
通过whereis命令搜索 绝对路径

[root@yuchao-linux01 ~]# whereis systemctl
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz

语法实践基础题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0 0 * * * 每天0点执行

15 1 * * * 每天夜里1点15分执行

* * * * * 每分钟执行

0 * * * * 每小时整点执行

0 */2 * * * 每隔2小时执行

*/30 * * * * 每隔30分钟执行

00 01 15 * * 每个月15号的夜里1点执行

00 05 1-14 * * 每个月的1到14号的凌晨5点执行

00 6-8 */5 * * 每隔5天的凌晨6-8点之间的整点执行

00 20-23/2 * * * 每天晚上8点到11点之间,每隔2小时的整点执行

00 23 * * 1-3 每周1到周三的晚上11点整执行

4)案例

学习定时任务,最简单的,就是直接通过案例,掌握其语法

综合基础问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
每天早上7:30起床学习
30 7 * * *

每隔3天,夜里2天,起来学习
0 2 */3 * *

夜里1点时候,每隔10分钟 起来吃点东西
*/10 1 * * *

夜里1点,3点,每隔10分钟 起来吃点东西
*/10 1,3 * * *

夜里1点到3点之间,每隔10分钟,起来吃点东西
*/10 1-3 * * *

每隔2个月的周六,夜里2点30 去见网友
30 2 * */2 6

结论

  • 时间从左到右,依次写
  • 具体日期和星期,不能同时出现

问题1:每月1、10、22 日的4:45 重启network 服务

1
45 4 1,10,22 * *  /usr/bin/systemctl restart network

问题2:每周六、周日的1:10 重启network 服务

1
10 1 * * 6,7  /usr/bin/systemctl restart network

问题3:每天18:00 至23:00 之间每隔30 分钟重启network 服务

1
*/30 18-23 * * *  /usr/bin/systemctl restart network

问题4:每隔两天的上午8 点到11 点的第3 和第15 分钟执行一次重启

1
3,15 8-11 */2 * * /usr/sbin/reboot

问题5 :每天凌晨整点重启nginx服务。

1
00 * * * * /usr/bin/systemctl restart nginx

问题6:每周4的凌晨2点15分执行命令

1
15 2 * * 4 command

问题7:工作日的工作时间内的每小时整点执行脚本。

1
00 9-18 * * 1-5 /usr/bin/bash my.sh

问题8:如果定时任务的时间,没法整除,定时任务就没有意义了,得通过其他手段,自主控制定时任务频率。

问题9:crontab提供最小分钟级别的任务,想完成秒级别的任务,得通过编程语言自己写。

问题10:每1分钟向文件里写入一句话”超哥666”,且实时监测文件内容变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1.写入计划任务
crontab -e

2.写入语句
[root@yuchao-linux01 ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# crontab -l
* * * * * /usr/bin/echo '超哥666' >> /tmp/chaoge.txt


# 3.等待定时任务执行
[root@yuchao-linux01 ~]# tail -F /tmp/chaoge.txt
tail: cannot open ‘/tmp/chaoge.txt’ for reading: No such file or directory
tail: ‘/tmp/chaoge.txt’ has appeared; following end of new file
超哥666
超哥666


# 4. 删除用户的定时任务
crontab -r

问题11:每天凌晨2点30,执行ntpdate命令同步times.aliyun.com,并且sys同步到硬件时钟,且不输出任何信息。

1
2
3
4
5
6
7
1.ntpdate同步成功后,会生成同步的结果日志
[root@yuchao-linux01 ~]# ntpdate -u ntp.aliyun.com
可以重定向标准输出结果到黑洞文件,
ntpdate -u ntp.aliyun.com &> /dev/null

2.编写定时任务语句
30 2 * * * /usr/sbin/ntpdate -u ntp.aliyun.com &> /dev/null;/usr/sbin/hwclock -w &> /dev/null

5)扩展

① crontab 权限问题

crontab是任何用户都可以创建的计划任务,但是超级管理员可以通过配置来设置某些用户不允许设置计划任务 。

==黑名单==配置文件位于:/etc/cron.deny 里面写用户名,一行只能写一个

1
2
3
4
5
6
7
8
9
10
11
12
13
# 禁止yuchao01用户设置定时任务

[root@yuchao-linux01 ~]# vim /etc/cron.deny
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# cat /etc/cron.deny
yuchao01



# 切换yuchao01用户登录
[yuchao01@yuchao-linux01 ~]$ crontab -e
You (yuchao01) are not allowed to use this program (crontab)
See crontab(1) for more information

==白名单==还有一个配置文件,/etc/cron.allow (本身不存在,自己创建)

注意:白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则会被默认允许创建计划任务。

1
2
3
4
5
6
# 添加白名单后,会立即更新权限
[root@yuchao-linux01 ~]# echo 'yuchao01' > /etc/cron.allow


# yuchao01就可以写入了
[yuchao01@yuchao-linux01 ~]$ crontab -e

② 查看计划任务文件保存路径

问题:计划任务文件具体保存在哪里呢?

答:/var/spool/cron/用户名文件中,如果使用root用户编辑计划任务,则用户文件名为root。

有图可见,该目录存放用户的定时任务信息。

image-20220117110150588

1
2
3
4
5
6
7
8
# 定时任务,信息都是写在文件里的

[root@yuchao-linux01 ~]# cat /var/spool/cron/root
* * * * * /usr/bin/echo '超哥666' >> /tmp/chaoge.txt
[root@yuchao-linux01 ~]#

[root@yuchao-linux01 ~]# cat /var/spool/cron/yuchao01
* * * * * echo "666"

③ 查看计划任务日志信息

问题:在实际应用中,我们如何查看定时任务运行情况?

答:通过计划任务日志,日志文件位于/var/log/cron

image-20220117110429169

6、定时任务经验总结(规范)

  • 编写定时任务要有注释说明
  • 编写定时任务路径信息尽量使用绝对路径
  • 编写定时任务命令需要采用绝对路径执行
    • /etc/crontab文件中定义了crontab可用的PATH搜索路径
  • 编写定时任务时,可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间
    • * * * * * sh test.sh &>/dev/null
    • 或者重定向到文件中,便于排查问题
  • 定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件方式告知用户
    • /var/spool/mail/root,该日志会不断增大,占用磁盘空间
    • 关闭本地邮件服务即可,systemctl stop postfix
  • 当定时任务需要执行复杂任务的时候,需要编写为shell脚本再去运行了,注意脚本得有x权限
1
2
3
4
5
6
7
8
9
10
11
vim backup.sh 写入

cp -a /data /backup
tar zcvf /backup/data.tar.gz /data

# 写入配置文件
crontab -e


# 这是于超老师写的备份脚本,用于定时任务
* * * * * /bin/sh /server/scripts/backup.sh &>/dev/null

四、Linux软件包

科普,什么是代码文件。

电脑程序Program,就是某一个编程语言编写的一个代码文件,里面包含了该语言特有的指令,以及各种字符、符号。

img

linux自带的network管理脚本,shell脚本。

image-20220117120534121

什么是软件程序。

软件程序,就是程序员通过编程语言写好一堆代码,通过一些方式运行,比如编译后,生成一个应用程序,称之为软件。

image-20220117120826170

以及手机APP,或者我们平时访问的网站,都是程序员通过写代码,开发出来的

image-20220117134024368

1、软件包概述

问题来了,我们既然知道,如各种应用程序,app,各种软件

应该如何去下载,安装这些软件呢?

正常我们安装软件是如下

windows程序

image-20191121141803539

macos程序

image-20191121141828954

因此软件包,指的就是,程序安装所需要的一个文件,在可视化的系统下,一般是双击安装即可,用于安装某个程序,某个软件。

1
2
3
4
5
6
软件包顾名思义就是将应用程序、配置文件和数据打包的产物
所有的linux发行版都采用了某种形式的软件包系统,这使得linux软件管理和在windows下一样方便,suse、red hat、fedora等发行版都是用rpm包,Debian和Ubuntu则使用.deb格式的软件包。

mysql-5-3-4.rpm
redis-3-4-3.rpm
nginx2-3-2.rpm

Linux下也有很多可以安装的软件,而这些软件的安装包可细分为两种,分别是源码包二进制包

1)源码包

  • 源码包就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。
  • 计算机只能识别机器语言,也就是二进制语言,所以源码包安装之前需要编译。
  • 编译过程耗时较长
  • 大多数用户不懂开发,编译过程中可能会有各种错误,用户无力解决。
  • 了解决使用源码包安装的问题,Linux 软件包的安装出现了使用二进制包的安装方式。

image-20191121142553391

  • 系统级开发:
    • C/C++:httpd、nginx
    • golang:docker
  • 应用及开发:
    • java:hadoop,hbase
    • python:openstack
    • perl
    • ruby
    • php

2)编译程序过程

当程序员通过如C语言写完代码后,并不能立即运行, 因为笔记本不认识这些代码(就是一堆英文字母)。

电脑只认识机器语言(二进制的0和1组成的语言)

例如:下图是某一电脑的机器语言程式,用来计算两数之和。虽然机器语言程式执行效率最快,但不易阅读,也不易撰写。

如果代码都要写机器语言的话,程序员就不会那么多了。。学习难度,五百颗星。

img

为了使设计程序更简单,于是发展出较方便使用的程序语言,C / C++ 就是其中一种。

写好的程序称为原始码(source code),它并不能直接执行,必须透过编译器(compiler)将程式转译成机器语言后,电脑才能执行。

img

1
2
3
4
比如c语言的gcc编译器
比如golang语言的golang编译器
这些东西,我们只需要知道它的存在即可,安装编译器,使用编译器。
后续我们会下载软件包源代码,通过gcc编译器,编译成可以使用的软件指令,即可使用。

当源代码,编译后成为可以使用,可以执行的软件,我们机器上,很多软件,都是编译后的产物。

1
2
3
4
5
6
7
源代码

编译器

二进制可执行命令

一次编译,到处运行(于超老师可以生成一个二进制命令,发给大家,只要是linux 64位机器上可以直接运行,免安装)

windows里面编译的软件,你不需要关心它源代码,只需要用即可,知道该软件是怎么来的。

img

linux里面编译好的软件。

你用的ls命令,为什么能显示出当前目录下的资料,也是通过c语言代码,写好后,编译,出现ls这个指令。

如果你未来学习编程开发,就会体会这个过程。

image-20220117115840271

3)二进制包

  • 二进制包,也就是源码包经过成功编译之后产生的包。
  • 二进制包是 Linux 下默认的软件安装包,目前主要有以下 2 大主流的二进制包管理系统:
  • ==RPM 包==管理系统:功能强大,安装、升级、査询和卸载非常简单方便,因此很多 Linux 发行版都默认使用此机制作为软件安装的管理方式,例如 Fedora、==CentOS==、SuSE 等。
  • DPKG 包管理系统:由 Debian Linux 所开发的包管理机制,通过 DPKG 包,Debian Linux 就可以进行软件包管理,主要应用在 Debian 和 Ubuntu 中。

RPM包

我们可以在各个软件的官网上,找到它的rpm安装包,这就和微信,qq安装包一个概念,人家给你打包好了,你下载直接安装就好。

image-20191121152422245

RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是centos系统中,默认的管理应用程序的一个工具。

1
2
3
4
5
使用流程
1.获取rpm格式的软件包,如mysql-5.7.rpm
2.通过rpm命令,也就是linux内置的一个工具,来安装这个mysql-5.7.rpm

注意,如果你的mysql不是通过rpm包安装的,也就无法通过rpm工具管理。

rpm包管理工具,参考windows的控制面板工具理解

image-20220117134828862

同理,windows下的这些软件,如果不是通过安装包,而是直接解压缩到某个文件夹下使用的,也无法通过控制面板去卸载。

2、如何获取rpm包

要想装软件,和windows 下一样,先得找到安装包:xxx.rpm

软件包的获得方式:

a. 去官网去下载(http://rpm.pbone.net);;/)

b. 不介意老版本的话,可以从光盘(或者镜像文件)中读取;(工作里,大多数离线服务器安装,也都会使用光盘镜像中提供的rpm包)

3、从光盘获取

3.1 虚拟机中加载光盘

image-20220117135455943

3.2 使用 # lsblk(list block devices)或者df 查看块状设备的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@yuchao-linux01 ~]# 
# 查看磁盘设备
[root@yuchao-linux01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-root 253:0 0 44G 0 lvm /
└─centos-swap 253:1 0 5G 0 lvm [SWAP]
sr0 11:0 1 4.2G 0 rom


这个rom类型就是光盘设备,名字叫做sr0,4.2G镜像文件大小,目前还未挂载到linux目录中

3.3 mount挂载

image-20220117140023498

3.4 查看镜像内文件

挂载后,访问/mnt目录即可访问光盘内文件,找打rpm包

image-20220117140431584

4、查询某个软件安装情况(rpm命令)

语法:# rpm -qa | grep 软件名称

选项:

-q:查询,query

-a:全部,all

-i :显示软件包的概要信息

-v :显示安装详细过程

-h:显示安装进度

–force :强制操作

–nodeps:忽略依赖关系(不好用,容易出错)

windows的管理

image-20220117141201379

linux的软件管理

1
2
3
4
5
6
7
8
9
# 查询lrzsz这个工具包,有结果就是装了,否则就是没有,或者你的软件包名字错了
# lrzsz用于帮你快速拖拽,文件到linux-windows之间
# rz sz两个命令
[root@yuchao-linux01 ~]# rpm -qa lrzsz
lrzsz-0.12.20-36.el7.x86_64

# 查询火狐浏览器装没
[root@yuchao-linux01 ~]# rpm -qa firefox
firefox-52.7.0-1.el7.centos.x86_64

image-20220117141743496

查看火狐浏览器软件(图形化)

image-20220117142759485

比如查询qq是否安装,rpm -qi qq

查询所有已安装的rpm软件,rpm -qa

过滤某个软件包

1
2
3
[root@yuchao-linux01 ~]# rpm -qa|grep bash
bash-4.2.46-30.el7.x86_64
bash-completion-2.1-6.el7.noarch

5、卸载某个软件

卸载某个软件

语法:# rpm -e 软件的名称(建议写完整的名称,通过-qa 查询)

案例:卸载火狐浏览器

rpm -qa |grep firefox 首先查询firefox软件的完整名称

1
2
[root@yuchao-linux01 ~]# rpm -qa firefox
firefox-52.7.0-1.el7.centos.x86_64

卸载

1
2
获取完整的软件包名字
[root@yuchao-linux01 ~]# rpm -e firefox-52.7.0-1.el7.centos.x86_64

image-20220117143006383

6、安装某个软件

命令:rpm

作用:管理rpm软件包

语法:# rpm -ivh 软件包完整路径名称

选项:

-i:install,安装

-v:显示进度条

-h:表示以”#”形式显示进度条

示例代码:将刚刚卸载的firefox火狐浏览器重新安装(在DVD光盘1中)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1.找到rpm包,可以从光盘镜像里找
[root@yuchao-linux01 ~]# ls /mnt/Packages/|grep firefox
firefox-52.7.0-1.el7.centos.x86_64.rpm


# 2.安装该rpm包
[root@yuchao-linux01 ~]# rpm -ivh /mnt/Packages/firefox-52.7.0-1.el7.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:firefox-52.7.0-1.el7.centos ################################# [100%]

# 3.检查
[root@yuchao-linux01 ~]# rpm -qa firefox
firefox-52.7.0-1.el7.centos.x86_64

# 4.运行firefox

image-20220117143156848

发现又可以用了

image-20220117143331865

大部分基础软件,一些常见的工具,软件,都可以在系统光盘中找到rpm包

7、更新某个软件

语法:# rpm -Uvh 完整的安装包路径

选项:

-U:upgrade,升级

-v:表示显示进度条

-h:表示以#形式显示进度条

1.超哥会提供更新的firefox包

2.更新firefox,手动通过rpm升级,建议版本选小点。

3.注意,rpm包管理,会牵扯到软件依赖的处理,读新手不太友好。

1
2
# 1.获取rpm http://rpm.pbone.net/
# 2.搜索 firefox

image-20220117143544724

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 3.查看默认版本
[root@yuchao-linux01 ~]# rpm -qa firefox
firefox-52.7.0-1.el7.centos.x86_64

# 4.获取一个新版本,是52.7.3版本,只有一点点的升级,不会牵扯太多依赖关系
下载链接
http://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.2/x86_64/updates/security/firefox-52.7.3-1.el7_5.x86_64.rpm

# 5.在linux中下载
wget http://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.2/x86_64/updates/security/firefox-52.7.3-1.el7_5.x86_64.rpm

# 6.如果linux下载太慢,可以windows下载好,上传到linux


# 7.升级firefox软件
[root@yuchao-linux01 opt]# rpm -Uvh firefox-52.7.3-1.el7_5.x86_64.rpm
warning: firefox-52.7.3-1.el7_5.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 192a7d7d: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:firefox-52.7.3-1.el7_5 ################################# [ 50%]
Cleaning up / removing...
2:firefox-52.7.0-1.el7.centos ################################# [100%]
[root@yuchao-linux01 opt]#
[root@yuchao-linux01 opt]# rpm -qa firefox
firefox-52.7.3-1.el7_5.x86_64

image-20220117144614230

至此,就从52.7.0版本,升级到了57.7.3

这里有坑,一旦你的rpm包版本选大了,比如选了个68.5.1版本,就标识火狐浏览器又重大,很多很多的更新内容,这就牵扯到很多其他的软件,都需要升级。

rpm就无法直接升级了,需要处理完依赖关系。

image-20220117145721585

8、关于依赖处理

8.1 什么是依赖

image-20220117152220295

依赖指的是,软件A的运行,必须结合软件B,软件C的存在,才能够正确运行。

可以理解,一个自行车的运行,必须依赖车轮,车把,坐垫,少一个都骑不了。。。

上图是windows的依赖报错,安装依赖的软件即可。

8.2 Linux的rpm依赖图解

1
2
3
4
1.后面会讲yum工具,自动化管理rpm包
2.关于rpm包的依赖处理
yum search firefox # 搜索rpm包
yum deplist firefox # 查看依赖关系

image-20220117151919825

由于依赖关系较为复杂,需要搜索各个版本的rpm包,一般我们不会手动处理,都会通过yum这个神器,来批量,自动化的管理软件,管理rpm包。

8.3 查看文件所属的包名(实用)

语法:# rpm -qf 需要查询的文件路径

选项:

1
-f 校验所属的软件包

示例代码:查询/etc/ntp.conf 属于哪个软件包?

1
2
[root@yuchao-linux01 opt]# rpm -qf /etc/ntp.conf 
ntp-4.2.6p5-28.el7.centos.x86_64

查看crontab的包信息

1
2
[root@yuchao-linux01 opt]# rpm -qf /etc/crontab 
crontabs-1.11-6.20121102git.el7.noarch

查看yum,sudo工具配置文件

1
2
3
4
5
[root@yuchao-linux01 opt]# rpm -qf /etc/yum.conf 
yum-3.4.3-158.el7.centos.noarch
[root@yuchao-linux01 opt]#
[root@yuchao-linux01 opt]# rpm -qf /etc/sudo.conf
sudo-1.8.19p2-13.el7.x86_64

8.4查询软件安装完成后,生成了哪些文件

用于查找软件安装后,默认的配置文件在哪

语法:# rpm -ql 需要查询的软件包名称

1
2
3
-l 显示软件包中的文件列表
rpm -ql firefox
[root@yuchao-linux01 opt]# rpm -ql firefox

搜索lrzsz软件的文件

1
2
3
4
5
6
7
8
9
10
[root@yuchao-linux01 opt]# rpm -ql lrzsz
/usr/bin/rb
/usr/bin/rx
/usr/bin/rz
/usr/bin/sb
/usr/bin/sx
/usr/bin/sz
/usr/share/locale/de/LC_MESSAGES/lrzsz.mo
/usr/share/man/man1/rz.1.gz
/usr/share/man/man1/sz.1.gz

软件安装完成后,一般会生成这几类文件

配置文件,一般默认放入/etc

程序本身的可执行命令,二进制命令,放入/usr/bin

帮助文档,/usr/share/man,/usr/share/doc

9、取消挂载

当你在使用完毕,镜像光盘后,可以取消挂载。

1
2
语法
umount 挂载点

image-20220117153331625

先在系统上取消挂载

再取消掉vmware光盘的连接,这好比你从台式机中的光驱,取出了光盘。

image-20220117153440926

系统服务管理上课笔记

image-20250817150733277

image-20250817150931292

image-20250817151338540

image-20250817151501746

image-20250817151849897

image-20250817151811773

image-20250817152141086

image-20250817152304008

3

image-20250817152406024

image-20250817152558836

image-20250817153349570

image-20250817153257675

image-20250817153626082

image-20250817153836929

image-20250817154024333

image-20250817154511491

image-20250817155018512

image-20250817164151969

image-20250817172539581

image-20250817174951231

image-20250817175537386

image-20250817180533342

image-20250817181035779

image-20250817181242423

aimage-20250817182551333

image-20250817183239399

image-20250817183456765

NTP时间服务器部署

先理解时间对服务器的重要性

image-20250817211740079

image-20250817212746041

image-20250817213455266

image-20250817221040499

image-20250817221711413

image-20250817222359190

防火墙是什么

image-20250818161721853

image-20250818162308613

image-20250818164419114

image-20250818165426135

image-20250818165507277

image-20250818165533306

image-20250818165758106

image-20250818165833186

image-20250818165900513

image-20250818170010147

image-20250818170159262

image-20250818172559090

image-20250818172648128

image-20250818172708194

image-20250818173605258

image-20250818175211580

image-20250818175358171

计划任务定时详解

image-20250818180716484

image-20250818180744858

image-20250818180956053

image-20250818181157604

做题

image-20250818200840772

image-20250818200933838

image-20250818201351626

image-20250818201612611

image-20250818201806637

防火墙作业

image-20250819221741725

image-20250819222450060

image-20250819222542833

image-20250819222822164

image-20250819223030308

image-20250819223146555

image-20250819224345110

image-20250819224444699

image-20250819224513031

image-20250819224527960

image-20250819225308922

image-20250819225323355

image-20250819225413737

image-20250819225434290

image-20250819230149592

image-20250819230428143

image-20250819230631161

image-20250819230720913

image-20250819230846370

image-20250819231018409

image-20250819231043469

image-20250819231211169

image-20250819231241771

image-20250819231323319

image-20250819232406926

image-20250819233015399

image-20250819234553328

image-20250819235243992

image-20250820000134327

进程与资源管理

Linux进程检测与控制

学习目标

1、了解进程和程序的关系

2、了解进程的特点

3、能够使用top动态查看进程信息

4、能够使用ps静态查看进程信息

5、能够使用kill命令给进程发送信号

6、能够调整进程的优先级(扩展)

windows资源管理器

在运维的日常工作中,监视系统的运行状况是每天例行的工作,一个服务器的健康,从主要的几个资源使用率上,就可以得出结论,比如CPU使用率、内存使用率,磁盘使用率。

在 Windows 中我们可以很直观的使用”任务管理器”来进行进程管理,了解系统的运行状态

通常,使用”任务管理器”主要有 3 个目的:

  1. 利用”应用程序”和”进程”标签来査看系统中到底运行了哪些程序和进程;
  2. 利用”性能”和”用户”标签来判断服务器的健康状态;
  3. 在”应用程序”和”进程”标签中强制中止任务和进程;

查看windows的进程信息

image-20220117163227885

查看内存使用率,内存是系统及其重要的一个资源,内存大小,基本上决定了你电脑能打开多少个应用程序,所以你想同时听课、写代码、学于超老师的linux课,做笔记,聊微信,这么多事,需要你的内存足够大,打得开这么多软件。

否则就会出现,卡死,内存不足,无法运行软件。

image-20220117163331928

我们也可以通过资源管理器,找到很占资源的应用,关闭它

image-20220117163524787

当然这是windows的用法,linux可不会提供这个画面给你点点点,基本上使用命令来进行进程管理

上述一样的操作,linux就得用命令行了。

但是进程管理的目的,都是一样

  • 查看系统中运行的程序,及其程序信息
  • 查看该程序的资源使用率,判断机器健康,肯定是资源用的越多,机器负担越大,前面超哥讲过,计算机硬件好比人类的身体,你的大脑负担越重,眼睛负担越重,人的压力也就越大,甚至累倒。
  • 终止不需要的程序

对于新手可能觉得windows的进程管理,更直白,更好看,但是如果让你管理多个进程,自动化管理进程的启动、结束,重启,那么图形化就显得费劲了,因此linux果然是适合专业性IT人才使用的,更为高效。

linux资源管理器

linux中对需要运维去管理、去查看的资源信息,如下

  • 内存资源、使用率
    • free命令
  • 磁盘资源、使用率
    • df
  • CPU资源、使用率
    • top
    • htop
    • glances
  • 进程资源、使用率
    • ps
    • pstree
    • pidof
  • 网络资源、使用率
    • Iftop
  • 所有资源的整体查看命令
    • top
    • glances
    • htop

一、什么是进程

计算机核心是CPU,承担机器的计算任务,好比是一座工厂,时刻在运行着。

image-20191211112036558

一个工厂(计算机),可以有多个车间,同时在工作。(计算机有多个进程,同时在运行)

image-20220117164850952

进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,并占用一定的系统资源。

程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。

  • 简单来说,程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。
  • 进程是正在计算机执行中的程序。

举例:谷歌浏览器是一个程序,当我们打开谷歌浏览器,就会在系统中看到一个浏览器的进程,当程序被执行时,程序的代码都会被加载入内存,操作系统给这个进程分配一个 ID,称为 PID(进程 ID)。

我们打开多个谷歌浏览器,就有多个浏览器子进程,但是这些进程使用的程序,都是chrome。

image-20220117165754456

1.1 进程、程序的关系

1
2
3
1. 开发把代码写好了,打个压缩包给你,还未运行的时候,这就是个静态、程序源代码,程序是数据和指令的集合。
2. 当运维将开发的代码运行起来之后,就称之为进程(机器上一个在运行的程序)
3. 程序运行时,系统为了清晰的标记每一个进程,为其分配了PID、运行的用户、内存、CPU等使用情况。

1.1.1 进程、线程、协程

image-20220320154354480

1.2 进程fork概念

1.我们的操作系统都是一堆进程而已,系统运行时,就产生了0号进程,然后其他进程都是0号进程创建的子进程。

2.linux启动之后,第一个进程就是PID为0,然后通过0号进程fork()出其他的进程。

3.操作系统的运行,就是不断的创建进程、以及销毁进程。

image-20220320140225968

1
2
3
4
5
6
[root@yuchao-linux01 ~]# ps -ef |head -5
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:33 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 12:33 ? 00:00:00 [kthreadd]
root 3 2 0 12:33 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 12:33 ? 00:00:00 [kworker/0:0H]

1.3 孤儿进程

1.当父亲进程挂了,导致儿子进程成了孤儿,甚至是一个、或者多个孤儿进程。

2.孤儿进程会被系统的1号进程收养,并且有1号进程来回收,处理这些孤儿进程。

3.孤儿进程就是失去了原本父亲的进程,1号进程好比是孤儿院,专门处理孤儿进程的善后工作,因此孤儿进程不会对系统产生什么危害。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 于超老师教你用python实现,孤儿进程。

[root@yuchao-linux01 ~]# cat guer.py
#coding:utf-8
import os
import sys
import time

pid = os.getpid()
ppid = os.getppid()
print 'im father: ', 'pid: ', pid, 'ppid: ', ppid
son_pid = os.fork()
print('now song_pid is: ',son_pid)
#执行pid=os.fork()则会生成一个子进程
#返回值pid有两种值:
# 如果返回的pid值为0,表示在子进程当中
# 如果返回的pid值>0,表示在父进程当中
if son_pid > 0:
print 'father going die...'
# 让老父亲,主动退出,挂掉
sys.exit(0)

# 保证主线程退出完毕
# 程序延迟了1秒,还在运行中,儿子进程还未挂,成了孤儿
time.sleep(2)5

print 'im child: ', os.getpid(),'now my father is: ', os.getppid()

查看孤儿进程

1
2
3
4
5
6
7
8
[root@yuchao-linux01 ~]# python guer.py
im father: pid: 1953 ppid: 1930
('now song_pid is: ', 1954)
father going die...
('now song_pid is: ', 0)
[root@yuchao-linux01 ~]# im child: 1954 now my father is: 1

[root@yuchao-linux01 ~]#

image-20220320143435480

1.程序运行时,生成了父亲进程、儿子进程

2.父亲进程突然挂了、儿子成了孤儿,被1号进程收养

3.儿子进程的诞生是为了执行程序,程序结束后,被1号进程释放,消失在了这个美丽的世界。

1.4 僵尸进程

1.僵尸听着明显比孤儿进程可怕些,是有害的

2.父亲进程创建出子进程后,如果子进程先挂了,父进程却不知道儿子进程挂了这件事,就无法正确送走儿子进程,清楚它在系统中的信息,那么这个儿子进程就成了可怕的僵尸进程,会对系统产生危害。

3.当系统中有了僵尸进程,你可以通过ps命令找到它,并且它的状态是(Z,zombie僵尸进程)

4.如果系统中产生大量僵尸进程,占据了系统中大量可分配的资源,如进程id号,系统就无法再正确创建新进程,完成任务,导致系统无法使用的危害。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 于超老师教你用python实现,僵尸进程
#coding:utf-8
from multiprocessing import Process
import time,os

def run():
print('son_pid: ',os.getpid())

if __name__ == '__main__':
p=Process(target=run)
p.start()

print('father_pid: ',os.getpid())
time.sleep(1000)

image-20220320150302863

1
2
3
4
5
6
7
8
9
验证僵尸进程的确存在
[root@yuchao-linux01 ~]# ps -ef|grep 2086 |grep -v grep
root 2086 2051 0 14:47 pts/1 00:00:00 python zombie.py
root 2087 2086 0 14:47 pts/1 00:00:00 [python] <defunct>


[root@yuchao-linux01 ~]# ps aux|grep Z |grep -v grep
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2087 0.0 0.0 0 0 pts/1 Z+ 14:47 0:00 [python] <defunct>

1.4.1 解决僵尸进程

  1. 杀死父进程
  2. 优化代码,不要再写这种垃圾代码了,把unix高级编程,好好学学。
  3. 开除、换一个更懂操作系统的程序员。
1
2
1. 可以主动kill 父亲进程pid
2. 如果程序会自动结束的话,比如time.sleep()时间到期,也会退出所有进程。

1.4.2 轻松理解僵尸进程

1.全中国的中国移动网络好比是一个操作系统,控制着全中国的移动用户通信,每一个中国百姓就是一个进程,每一个百姓都有一个手机号,该号码就好比进程的pid,对应这个进程。

2.如果这个人再也不用手机了,不要手机号了,应该去移动注销手机号(告诉操作系统,回收pid)

3.如果不去注销(不回收pid),这个手机号依然被你保留着,毫无意义不说,且占用了一个号码,浪费手机号,(浪费系统中pid的资源),应该去释放手机号。

image-20220320151501427

进程的生命周期

1
2
3
1. 当程序运行的时候,通过父进程fork创建子进程去处理任务。
2. 子进程被创建后开始处理任务,任务处理完毕后就退出了,子进程应该去通知父进程,将儿子进程销毁,别浪费资源。
3. 如果子进程没有正确告知父进程,回收自己的系统资源,且父进程还未结束,导致该子进程成为僵尸进程。

二、进程管理命令

如果你发现电脑奇卡无比,你可能就得打开任务管理器,找找是哪个程序,占用CPU,内存,磁盘资源特别高,如果它没有用,干掉即可。

同样的,运维维护linux服务器,要保证机器健康运行,第一步就是盯紧了服务器的CPU,内存,磁盘,网络,这几大资源使用率。

1、top查看 CPU使用情况

命令:top

作用:查看服务器的进程占用的资源(100%使用)

语法:# top (动态显示)

top操作快捷键

z::打开,关闭颜色

M(大写):表示将结果按照内存(MEM)从高到低进行降序排列;

m(小写):切换内存memmory的显示格式。

P(大写):,表示将结果按照CPU 使用率从高到低进行降序排列;

1 :当服务器拥有多个cpu 的时候可以使用“1”快捷键来切换是否展示显示各个cpu 的详细信息;

q:退出

image-20220117170907157

快捷键

image-20220117171042103

1)系统整体信息:

①第一行

image-20220117171244228

内 容 说 明
17:13:00 系统当前时间
up 7:53 系统的运行时间.本机己经运行 13 小时 05 分钟
2 users 当前登录了三个用户
load average: 0.00, 0.01,0.05 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载

按下键盘字母上方的数字1,可以显示多核CPU状态

image-20220117171445106

也可以通过该命令,获取CPU信息,linux信息都可以通过文件读取到

1
2
3
4
5
6
7
8
9
10
[root@yuchao-linux01 opt]# grep 'core id' /proc/cpuinfo 
core id : 0
core id : 1
core id : 0
core id : 1
[root@yuchao-linux01 opt]# grep 'core id' /proc/cpuinfo | sort -u
core id : 0
core id : 1
[root@yuchao-linux01 opt]# grep 'core id' /proc/cpuinfo | sort -u | wc -l
2

image-20220117171607954

虚拟机的硬件信息,通过vmware设置

image-20220117171752478

可见,我们这台机器有2颗CPU,每个处理器的内核是2个,因此总共四个内核,可以用于计算工作。

②第二行

image-20220117171959184

Tasks: 236 total 系统中的进程总数
1 running 正在运行的进程数
235 sleeping 睡眠的进程数
0 stopped 正在停止的进程数
0 zombie 僵尸进程数。如果不是 0,则需要手工检查僵尸进程

③第三行

image-20220117172155962

这些资源,做好笔记,了解即可,需要考虑到用户态、内核态,往后架构部署复杂后,可能会来查看此类CPU的使用情况。

内 容 说 明
Cpu(s): 0.1 %us 用户模式占用的 CPU 百分比
0.1%sy 系统模式占用的 CPU 百分比
0.0%ni 改变过优先级的用户进程占用的 CPU 百分比
99.9%id idle缩写,空闲 CPU 占用的 CPU 百分比
0.1%wa 等待输入/输出的进程占用的 CPU 百分比
0.0%hi 硬中断请求服务占用的 CPU 百分比
0.1%si 软中断请求服务占用的 CPU 百分比
0.0%st st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

问题,服务器有8核,想查看每一颗核心的负载情况怎么办?

top按1

④第四行

image-20220117173841634

内存使用率,若是觉得数字不够直观,按下小写m键,切换显示

image-20220117173928922

内 容 说 明
Mem: 8157208 total 物理内存的总量,单位为KB,目前是8157208/1024=7966MB≈8G
1143000 used 己经使用的物理内存数量。
4598168 free 空闲的物理内存数量。
2412392 buff/cache 作为缓冲的内存数量

image-20220117174138521

⑤第五行

image-20220117174805728

内 容 说 明
Swap: 5242876 total 交换分区(虚拟内存)的总大小
0 used 已经使用的交换分区的大小
5242876 free 空闲交换分区的大小
6649640 avail Mem 可用内存

==swap分区是一块特殊的硬盘空间==,当实际内存不够用的时候,操作系统会从磁盘中取出一部分暂时不用的数据,放在交换内存中,从而使当前的程序腾出更多的内存量。

Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

使用swap交换分区作用是,通过操作系统的调取,程序可以用到的内存远超过实际物理内存。

磁盘价格要比内存便宜的多,因此使用swap交换空间是很实惠的,但是由于频繁的读写硬盘,==这种方式会降低系统运行效率。==

提示,线上环境,这个swap缓存功能是直接关闭的。

问题来了,通过top你可以看到这些信息,如果发现负载情况较高比如

  • 平均负载率高了,1分钟、5分钟、15分钟的负载值,超过了CPU核数
  • 内存使用的很多
  • CPU使用的百分比很高

怎么办?

肯定是找到对应的进程,看看这是个什么鬼,要不要干掉它。

2)具体进程信息

image-20220117180721231

我们可以看到,这个CPU使用率已经达到了68.3的进程,是这个叫做bash的任务。

ps进程区域信息,字段解释

因此你就得分析这个进程,它的信息,这一行的字段,解释如下。

PID 进程的 ID。
USER 该进程所属的用户。
PR 优先级,数值越小优先级越高。
NI 优先级,数值越小优先级越高。
VIRT 该进程使用的虚拟内存的大小,单位为 KB。
RES 该进程使用的物理内存的大小,单位为 KB。
SHR 共享内存大小,单位为 KB。计算一个进程实际使用的内存 = 常驻内存(RES)- 共享内存(SHR)
S 进程状态。其中S 表示睡眠,R 表示运行
%CPU 该进程占用 CPU 的百分比。
%MEM 该进程占用内存的百分比。
TIME+ 该进程共占用的 CPU 时间。
COMMAND 进程名

问:如果发现服务器的CPU何负载过大,怎么办?

执行top命令,按下P,查看CPU使用最多的进程是哪一个,它是干什么的这个任务,然后决定下一步的处理。

问题:如果发现内存空闲率很低,内存不够用了,怎么办

top命令,看下大写M,查看内存使用率排行,从高到低排列。

image-20220117181648410

top命令看完系统状况后,按下q键,即可退出这个交互式命令。

1.1 htop命令

顾名思义,top就是比htop更好用的工具,支持鼠标点击,选择进程。

1
2
#安装命令
[root@chaogelinux ~]# yum install htop -y

1.直接输入htop命令,进入画面,各项指标和top相似

image-20191212174932796

2.调整htop风格

在htop监控页面中,添加主机名,以及时间

1
2
3
4
5
6
1. 进入htop
2. 按下F2(setup),进入设置,针对Meters,记录可以修改记录显示风格
3. 上下左右,移动,状态栏会发生变化(空格键,更改风格)
4. 按下回车键,可以选择添加表(meters)
5. F10保存
6. htop能够记忆用户的设置

image-20220320181713685

3.搜索进程

1
按下f3,输入进程名字,即可找到进程

4.杀死进程

1
2
3
定位到想要杀死进程的哪一行,按下F9
选择发送给进程的信号,一般是15,正常中断进程
回车,进程就挂了

image-20191212181605356

5.显示进程树,F5。

6.其他快捷键

1
2
3
4
5
6
7
M:按照内存使用百分比排序,对应MEM%列;
P:按照CPU使用百分比排序,对应CPU%列;
T:按照进程运行的时间排序,对应TIME+列;
K:隐藏内核线程;
H:隐藏用户线程;
#:快速定位光标到PID所指定的进程上。
/:搜索进程名

2、ps查看进程

命令:ps(process status 进程状态)

语法:ps [参数选项]

作用:主要是查看服务器的进程信息,并且是打印当前的运行状态快照,而不是实时的监控,只是某一时刻的系统进程信息。

2.1 ps参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
参数风格,请注意,参数的位置,存在先后关系,位置错误可能导致无法使用。



# UNIX风格,没有短横线
a # 显示所有终端、所有用户执行的进程
u # 以用户显示出进程详细信息
x # 显示操作系统所有进程信息
f # 显示进程树形结构
o # 格式化显示进程信息,指定如pid
k # 对进程属性排序,如k %mem ,正序排序 ,k -%mem 逆序
--sort,再进行排序,如 --sort %mem 根据内存使用率显示


linux标准参数用法
-e # 显示所有进程
-f # 显示进程详细
-p # 指定pid,显示其信息,如 ps -fp 2609
-C # 指定进程的名字查看,如ps -fC sshd
-U # 指定用户名,查看用户进程信息 ps -Uf yuchao01

ps命令用于报告当前系统的进程状态。

可以搭配kill指令随时中断、删除不必要的程序。

ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

不接受任何参数

ps不加参数,输出的是当前用户所在终端的进程

1
2
3
4
5
6
7
8
9
[root@yuchao-linux01 ~]# ps
PID TTY TIME CMD
19658 pts/0 00:00:00 bash
19713 pts/0 00:00:00 ps

PID:进程的标识号
TTY:进程所属的控制台号码
TIME:进程使用CPU总的时间
CMD:正在执行的命令行

ps -ef

1
ps -ef

image-20220117202203143

UID 该进程执行的用户ID
PID 进程ID
PPID 该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程(Parent Process ID)
C Cpu的占用率,其形式是百分数
STIME 进程的启动时间
TTY 终端设备,发起该进程的设备识别符号,如果显示“?”则表示该进程并不是由终端设备发起
TIME 进程实际使用CPU的时间
CMD 该进程的名称或者对应的路径
1
2
3
4
5
6
7
8
9
10
[root@yuchao-linux01 ~]# ps -ef |head -1
UID PID PPID C STIME TTY TIME CMD


[root@yuchao-linux01 ~]# ps -ef |tail -5
root 3001 2 0 16:34 ? 00:00:00 [kworker/1:2]
root 3235 2 0 16:37 ? 00:00:00 [kworker/0:0]
jack01 3253 2629 0 16:37 pts/0 00:00:00 sleep 1
root 3254 2051 0 16:37 pts/1 00:00:00 ps -ef
root 3255 2051 0 16:37 pts/1 00:00:00 tail -5

场景:当运维小于在公司里,发现监控报警了,给自己的微信发了个通知,应用服务器CPU使用率超过85%,自己得抓紧看看是什么问题。

这就得进一步确定高占用CPU程序的信息

1
2
3
4
1.查看top,进行CPU使用率排行最高的进程信息
top

2.查看ps -ef命令,再grep过滤出,你想要的信息。

image-20220117203111115

ps找出这个进程信息。

image-20220117203429853

至此,我们已经学会,通过ps命令,找出关于进程的信息了

主要用法就是,查看进程的PID号码。

ps aux

组合命令,使用BSD语法显示进程信息

1
2
3
4
5
[root@chaogelinux ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 125452 3460 ? Ss 10月20 14:31 /usr/lib/systemd/systemd --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 10月20 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10月20 0:44 [ksoftirqd/0]

解释

  • USER:该进程属于的用户
  • PID:该进程号码
  • %CPU:进程占用CPU的资源比率
  • %MEM:该进程占用物理内存百分比
  • VSZ:进程使用的虚拟内存,单位Kbytes
  • RSS:该进程占用固定的内存量,单位Kbytes
  • TTY:该进程运行的终端位置
  • STAT:进程目前状态,可以man ps查看细节
    • R:正在运行中
    • S:终端睡眠中,可以被唤醒
    • D:不可中断睡眠
    • T:进程被暂停
    • Z:已停止,无法由父进程正常终止,变成了zombie僵尸进程
      • 进程额外字符
        • +:前台进程,比如R+,程序运行在前台,一旦终止,程序结束,数据丢失。
        • I:多线程进程,如Sl表示程序是多线程
        • N:低优先级进程,如Sn表示优先级很低的进程
        • <:高优先级进程
        • s:进程领导者(含有子进程),如Ss表示父进程
        • L:锁定到内存中
  • START:进程启动时间
  • TIME:CPU运行时间
  • COMMAND:进程命令,名字带有[]表示内核态进程,没有[]表示是用户执行的进程。
1
2
3
4
5
6
7

[root@yuchao-linux01 ~]# ps -ef |tail -5
root 3235 2 0 16:37 ? 00:00:00 [kworker/0:0]
root 3562 2 0 16:42 ? 00:00:00 [kworker/0:2]
jack01 3620 2629 0 16:43 pts/0 00:00:00 sleep 1
root 3621 2051 0 16:43 pts/1 00:00:00 ps -ef
root 3622 2051 0 16:43 pts/1 00:00:00 tail -5

ps结合grep

image-20220117203919791

grep取反

同学们会发现总有一个grep进程

image-20220117204058530

可以grep过滤掉。

语法

grep -v 选项,取反

1
2
[root@yuchao-linux01 ~]# ps -ef|grep vim |grep -v grep
root 20313 19658 0 20:38 pts/0 00:00:00 vim chaoge666.txt

2.1 ps常用命令组合(重点)

参数记忆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
参数风格,请注意,参数的位置,存在先后关系,位置错误可能导致无法使用。



# UNIX风格,没有短横线
a # 显示所有终端、所有用户执行的进程
u # 以用户显示出进程详细信息
x # 显示操作系统所有进程信息
f # 显示进程树形结构
o # 格式化显示进程信息,指定如pid
k # 对进程属性排序,如k %mem ,正序排序 ,k -%mem 逆序
--sort,再进行排序,如 --sort %mem 根据内存使用率显示


linux标准参数用法
-e # 显示所有进程
-f # 显示进程详细
-p # 指定pid,显示其信息,如 ps -fp 2609
-C # 指定进程的名字查看,如ps -fC sshd
-U # 指定用户名,查看用户进程信息 ps -Uf yuchao01

练习

最常用的就是直接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ps auxf 结合管道符做过滤即可
显示机器所有进程信息
[root@yuchao-linux01 ~]# ps aux

查看进程父子关系
[root@yuchao-linux01 ~]# ps auxf

查看ssh相关所有进程,以及他们的父子关系
[root@yuchao-linux01 ~]# ps auxf |grep ssh
root 952 0.0 0.2 113008 4368 ? Ss 12:34 0:00 /usr/sbin/sshd -D
root 2049 0.0 0.3 159012 5700 ? Ss 14:45 0:00 \_ sshd: root@pts/1
root 4978 0.0 0.0 112812 980 pts/1 S+ 17:09 0:00 | \_ grep --color=auto ssh
root 2609 0.2 0.3 159012 5696 ? Ss 16:28 0:06 \_ sshd: root@pts/0


查看指定用户的进程信息
[root@yuchao-linux01 ~]# ps u -U jack01
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jack01 4986 93.0 0.0 115544 1800 pts/0 R+ 17:11 2:00 -bash


查看指定pid的进程信息
[root@yuchao-linux01 ~]# ps u -p 4986
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jack01 4986 93.3 0.0 115544 1800 pts/0 R+ 17:11 2:35 -bash




指定字段格式化显示结果
[root@yuchao-linux01 ~]# ps axfo pid,cmd,%cpu,%mem

指定显示结果,做格式化打印,并且以cpu从大到小排序
[root@yuchao-linux01 ~]# ps axo pid,cmd,%cpu,%mem k -%cpu

按内存使用率排序,从大到小
[root@yuchao-linux01 ~]# ps axo pid,cmd,%cpu,%mem --sort -%mem

2.2 pstree命令

作用、以树状图,显示父进程和子进程的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pstree 选项 [pid|user]

-p 显示pid
-u 显示用户切换
-H pid 高亮显示进程(没什么用)
-a 显示程序的完整命令,以及进程层级关系



用法
需安装
[root@yuchao-linux01 ~]# yum install psmisc -y


查看指定pid,一号进程的所有父子进程(用户角度运行的进程)
[root@yuchao-linux01 ~]# pstree 1


查看指定用户,关于这个用户生成的父子进程关系
[root@yuchao-linux01 ~]# pstree jerry01

查看jerry01用户生成的所有进程,且显示进程pid
[root@yuchao-linux01 ~]# pstree -ap jerry01

显示进程树,以及对应进程的执行用户名
[root@yuchao-linux01 ~]# pstree -ua

2.3 pidof命令

1
2
3
4
5
6
7
pidof命令
指定进程名,显示出其pid


如显示出nginx进程号
[root@yuchao-linux01 ~]# pidof nginx
5491 5490 5489

2.4 lsof查看进程打开了什么文件

比如,当我们需要检查网站服务器的nginx进程,以及nginx都打开了哪些文件,比如nginx记录的日志,写入到了什么文件里,lsof可以轻松帮你找到这些文件。

linux一切皆文件,任何事务都以文件的形式存在,通过文件,不仅可以直接访问到文本数据,常规数据,甚至网络连接(socket套接字文件)、以及硬件(/dev/sda),都以文件形式可以在linux管理。

1
2
3
4
5
6
7
8
9
10
常用参数
-c # 指定进程名,打开了哪些系统文件,如lsof -c nginx
-i # 显示符合条件的进程,如ipv[46][protocol][@host|addr][:service|port]
-p # 显示指定pid打开的文件
-u # 显示指定用户uid打开的文件,以及具体进程信息
+d # 显示文件夹下被打开的文件有哪些,如 lsof +d /var/log/nginx/
+D # 递归列出目录下哪些文件被进程打开
-n # 不显示主机名,直接显示ip
-P # 不显示端口名,直接显示端口号
-s # 列出文件大小

状态解释

1
2
3
4
5
6
7
8
9
10
11
[root@yuchao-linux01 log]# lsof +D /var/log/nginx/ | head -2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 5489 root 2w REG 253,0 0 17579733 /var/log/nginx/error.log

名称
进程标识符id号
进程执行的用户主
文件描述符
文件类型 reg普通文本 DIR目录
NODE 索引节点(文件在磁盘上的标识)
NAME 进程打开文件的名字

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 直接输入lsof,显示当前用户打开的所有文件,过滤出你需要查找的文件,对应的进程
[root@yuchao-linux01 ~]# lsof |grep access.log


# 查看占用文件的进程
[root@yuchao-linux01 log]# lsof /var/log/nginx/access.log

# 查看指定pid号(父进程)打开了什么文件
[root@yuchao-linux01 log]# lsof -p $(cat /var/run/nginx.pid)

# 查看指定程序名,打开的文件
[root@yuchao-linux01 log]# lsof -c nginx

# 查看指定用户打开的文件
[root@yuchao-linux01 log]# lsof -u jerry01

# 查看指定目录打开的文件,以及递归查看
[root@yuchao-linux01 log]# lsof +d /var/log
[root@yuchao-linux01 log]# lsof +D /var/log

# 查看指定ip的网络连接情况(如有人访问了你的nginx)
[root@yuchao-linux01 log]# lsof -i @192.168.0.240:80

# 查看指定TCP状态的连接情况
[root@yuchao-linux01 log]# lsof -n -P -i TCP -s TCP:LISTEN

2.4.1 生产经验案例(lsof文件误删恢复)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 1.确保nginx在运行中,以及有日志数据
[root@yuchao-linux01 log]# tail -f /var/log/nginx/access.log

# 2. lsof查看关于该日志文件的进程

[root@yuchao-linux01 ~]# lsof |grep /var/log/nginx/access.log
nginx 5489 root 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
nginx 5490 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
nginx 5491 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
tail 6112 root 3r REG 253,0 1353 17579732 /var/log/nginx/access.log


# 3.模拟误删除该文件(但是进程没有退出,该文件描述符还未被释放,还是可以恢复的)
[root@yuchao-linux01 ~]# rm -f /var/log/nginx/access.log
[root@yuchao-linux01 ~]# ll /var/log/nginx/access.log
ls: cannot access /var/log/nginx/access.log: No such file or directory


# 4.再次查看文件描述符(文件名多了一个deleted被删除的标记)
[root@yuchao-linux01 ~]# lsof |grep /var/log/nginx/access.log
nginx 5489 root 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
nginx 5490 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
nginx 5491 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
tail 6112 root 3r REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)

# 5.此时进入linux中一个管理所有进程的目录,/proc,找到对应的进程id目录(父亲进程id),进入其管理文件描述符的地方。

[root@yuchao-linux01 fd]# pwd
/proc/5489/fd
[root@yuchao-linux01 fd]# ll
total 0
lrwx------ 1 root root 64 Mar 20 19:14 0 -> /dev/null
lrwx------ 1 root root 64 Mar 20 19:14 1 -> /dev/null
lrwx------ 1 root root 64 Mar 20 19:14 10 -> socket:[75619]
l-wx------ 1 root root 64 Mar 20 19:14 2 -> /var/log/nginx/error.log
lrwx------ 1 root root 64 Mar 20 19:14 3 -> socket:[75616]
l-wx------ 1 root root 64 Mar 20 19:14 4 -> /var/log/nginx/error.log
l-wx------ 1 root root 64 Mar 20 19:14 5 -> /var/log/nginx/access.log (deleted)
lrwx------ 1 root root 64 Mar 20 19:14 6 -> socket:[76223]
lrwx------ 1 root root 64 Mar 20 19:14 7 -> socket:[76224]
lrwx------ 1 root root 64 Mar 20 19:14 8 -> socket:[75617]
lrwx------ 1 root root 64 Mar 20 19:14 9 -> socket:[75618]

# 6.我们看到的这个5软连接文件,就对应了刚才的access.log日志文件
[root@yuchao-linux01 fd]# cat 5

# 7.恢复此文件描述符的数据,到日志文件即可完成文件恢复
[root@yuchao-linux01 fd]# cat 5 > /var/log/nginx/access.log

3、kill关闭进程

命令:kill

语法:kill [信号] PID

作用:kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作

3.0 什么是信号(signal)

简单说就是向进程发送的一个控制信号,一般用于杀死、停止进程。

每个信号都用一个数字表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yuchao-tx-server ~]# 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

常用信号解释

信号 解释 信号名
1 无须关闭进程,重新加载其配置文件,如reload操作 SIGHUP
2 中断,通常是ctrl+c发出此信号 SIGINT
3 退出,通常是ctrl + \ 发出信号 SIGQUIT
9 立即结束的信号,强制结束进程 SIGKILL
15 终止,通常是系统关机时候发送,正常结束进程,是kill默认信号 SIGTERM
20 暂停进程,通常是ctrl + z 发出信号 SIGTSTP

3.0.1 杀死进程的命令

  • Kill (结束指定pid的进程)
  • killall (根据进程名杀死)
  • pkill (根据进程名杀死)

3.1 kill用法

  • 先确定进程id
  • 再发送信号给进程
1
2
3
kill -1 pid         # 进程重读配置文件
kill -15 pid # 进程优雅退出
kill -9 pid # 暴力干掉进程

终止crond定时任务服务

image-20220118093820655

查看kill支持的所有信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yuchao-linux01 ~]# 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

实际运用中,由于一个进程会牵扯到诸多文件,有时候kill会杀不死进程,可以使用9信号,强制终止,但是一般不要直接强制终止,会导致不可预期的错误。

3.2 kill和nginx

以nginx为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
1.安装、准备nginx页面
[root@yuchao-linux01 ~]# yum install nginx -y
[root@yuchao-linux01 ~]# echo 'yuchao linux v1' > /usr/share/nginx/html/index.html
[root@yuchao-linux01 ~]# echo 'yuchao linux v2' > /usr/share/nginx/html/index2.html

2.启动nginx且查看页面
[root@yuchao-linux01 ~]# systemctl start nginx
[root@yuchao-linux01 ~]# curl 127.0.0.1
yuchao linux v1

3.修改nginx配置文件,更改首页文件为index2.html

38 server {
39 listen 80;
40 listen [::]:80;
41 server_name _;
42 root /usr/share/nginx/html;
43 location / {
44 root /usr/share/nginx/html;
45 index index2.html;
46 }





4.再次访问页面,发现毫无变化,为什么?没重新读取新的配置文件
[root@yuchao-linux01 ~]# curl 127.0.0.1
yuchao linux v1

5.可以选择重启、或者重读新的配置(超哥讲过,可以systemctl reload nginx)
那么systemctl背后是怎么做的,来看!
[root@yuchao-linux01 ~]# rpm -ql nginx |grep nginx.service
/usr/lib/systemd/system/nginx.service

[root@yuchao-linux01 ~]# grep -i 'reload' /usr/lib/systemd/system/nginx.service
ExecReload=/usr/sbin/nginx -s reload

发现人家就是去执行了这个命令而已,nginx -s reload ,那其实你也可以直接去执行这个命令


6.先看看nginx的进程id号
[root@yuchao-linux01 ~]# pstree -p |grep nginx
|-nginx(1486)-+-nginx(1529)
| `-nginx(1530)

我们需要给包工头发一个信号,告诉他,nginx配置文件变化了,你要重新加载下
[root@yuchao-linux01 ~]# kill -1 1486

此时工人进程变化了,工头进程没变化
[root@yuchao-linux01 ~]# pstree -p |grep nginx
|-nginx(1486)-+-nginx(1585)
| `-nginx(1586)

# reload进程后,网站页面得到更新
[root@yuchao-linux01 ~]# curl 127.0.0.1
yuchao linux v2


7.最后可以干掉进程,需要干掉父进程
# 包工头都被干掉了,工人不得跑路么
[root@yuchao-linux01 ~]# kill 1486
[root@yuchao-linux01 ~]# pstree -p |grep nginx

4、killall、pkill关闭进程

1
2
3
1. kill需要找到pid,然后再干掉进程
2. pkill更省事了,直接根据进程名字干掉进程
3. 注意pkill,kill可能会误杀,因为是根据进程名字匹配,如果进程包含了某名字,也会被杀掉,因此少用。

命令:killall

作用:通过程序的==进程名==来杀死==一类==进程

语法:# killall [信号] 进程名称

信号种类:和kill相同,这里不再重复

kill是终止单独一个进程

killall是根据进程名字,终止一类进程

image-20220118094720717

为了避免出错,误操作,干掉了其他进程。

可以尽量使用kill即可

补充:进程后台运行

程序运行可以有2种

  • 前台运行
    • 程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用
    • 如果终端异常关闭,导致程序会自动退出
  • 后台运行
    • 不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行。

后台运行命令

1
2
3
4
5
6
7
命令集合

command & # 未启动的command放入后台去运行
jobs # 查看后台进程列表
ctrl + z # 暂停进程
bg # 程序放入后台运行,和 & 一样
fg # 将后台任务放入前台执行

后台命令实战(实战经验)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1.命令直接放入后台运行,注意日志写入到黑洞文件
[root@yuchao-linux01 ~]# ping yuchaoit.cn > /dev/null &
[1] 1718
[root@yuchao-linux01 ~]#

2.查看后台任务列表
[root@yuchao-linux01 ~]# jobs
[1]+ Running ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#

3.可以将后台任务,放入前台执行,然后ctrl + z 再次暂停程序,放入后台
[root@yuchao-linux01 ~]# fg 1
ping yuchaoit.cn > /dev/null

^Z
[1]+ Stopped ping yuchaoit.cn > /dev/null
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
的确发现了一个停止的程序
[root@yuchao-linux01 ~]# jobs
[1]+ Stopped ping yuchaoit.cn > /dev/null
[root@yuchao-linux01 ~]#


4.可以再次让程序运行起来,并且依然是运行在后台
[root@yuchao-linux01 ~]# bg 1
[1]+ ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# jobs
[1]+ Running ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#

补充:screen命令

作为linux服务器管理员,经常要使用ssh登陆到远程linux机器上做一些耗时的操作。

也许你遇到过使用telnet或SSH远程登录linux,运行一些程序。如果这些程序需要运行很长时间(几个小时),而程序运行过程中出现网络故障,或者客户机故障,这时候客户机与远程服务器的链接将终端,并且远程服务器没有正常结束的命令将被迫终止。

又比如你SSH到主机上后,开始批量的scp命令,如果这个ssh线程断线了,scp进程就中断了。

在远程服务器上正在运行某些耗时的作业,但是工作还没做完快要下班了,退出的话就会中断操作了,如何才好呢?

screen命令作用

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。

它提供了统一的管理多个会话的界面和相应的功能。

  • 会话恢复

只要Screen本身没有终止,在其内部运行的会话都可以恢复。

这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。

只要再次登录到主机上执行screen -r就可以恢复会话的运行。

同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。

这一点和图形界面下的VNC很相似。

  • 多窗口

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。

Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

  • 会话共享

Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

screen命令参数

1
2
3
4
5
6
7
8
9
10
screen -S 终端名称     # 新建一个指定名称的终端
ctrl + a + d 切换 # detach,暂时离开当前会话,将screen任务丢到后台执行,回到还未进入screen的状态
screen -ls # 显示存在的screen进程,常用命令
screen -r 终端名或iD # 进入指定名称的screen会话
screen -m # 如果在一个Screen进程里,用快捷键crtl+a c或者直接打screen可以创建一个新窗口,screen -m 也可以可以新建一个screen进程。



常规用法
screen -D -r 踢掉screen的用户,让其logout,然后再连接该会话(当screen会话是Attached状态,表示有人在用)

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1.安装命令
[root@yuchao-linux01 ~]# yum install screen -y

2.创建screen终端
screen -S about_echo

3.可以再开一个窗口,查看该进程
[root@yuchao-linux01 ~]# ps -ef|grep screen
root 2677 2340 0 17:24 pts/0 00:00:00 screen -S about_echo
root 2691 2532 0 17:24 pts/2 00:00:00 grep --color=auto screen

注意看该会话的状态
[root@yuchao-linux01 ~]# screen -ls
There is a screen on:
2678.about_echo (Attached)
1 Socket in /var/run/screen/S-root.




4.使用about_echo这个终端,执行命令,如
不断的向文件中写入信息
[root@yuchao-linux01 ~]# for i in `seq 5000`;do sleep 1; echo '超哥带你学linux' >> /tmp/cc.log;done





5.用快捷键切出后台 ctrl + a + d组合键,将任务放入后台,任务不会中断
[root@yuchao-linux01 ~]# screen -S about_echo
[detached from 2678.about_echo]


6.用命令,恢复到指定的离线screen进程中,然后你可以选择中断该进程
screen -r about_echo

7.最后你可以exit,退出,结束这个终端,没有后台进程了。
[root@yuchao-linux01 ~]# screen -ls
No Sockets found in /var/run/screen/S-root.

[root@yuchao-linux01 ~]# ps -ef|grep screen
root 2817 2532 0 17:27 pts/2 00:00:00 grep --color=auto screen

5、nohup命令

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup的特点是:

1
2
3
4
5
6
7
8
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下

如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out 文件中。

一般和 & 后台符,结合使用。

记住一个标准用法
no

语法nohup command 选项 &

Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

nohup不加&符号(不好用)

有些命令会前台运行,占用一个会话窗口,无法做其他事

且关闭窗口后,该任务会结束,导致工作中断

image-20220118095715634

关闭窗口,前台任务挂掉

image-20220118095822343

nohup让进程后台运行

nohup 命令,后面若是不跟其他选项,默认写入当前路径下的nohup.out文件日志

image-20220118095946614

不加&符号的话,该命令会卡主一个会话窗口,也是不好用

image-20220118100125477

nohup添加&符号(好用)

image-20220118102640158

nohup 生产环境下的用法(重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@yuchao-tx-server ~]# nohup ping baidu.com > /tmp/nohup_ping.log 2>&1 &
[1] 31021
[root@yuchao-tx-server ~]# jobs
[1]+ 运行中 nohup ping baidu.com > /tmp/nohup_ping.log 2>&1 &
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# tail -f /tmp/nohup_ping.log
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=50 time=5.50 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=50 time=5.52 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=50 time=5.45 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=50 time=5.50 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=5 ttl=50 time=5.50 ms



关闭窗口,程序也不会中断,只有通过ps命令可以看到该进程,还在运行了。

6、理解linux的数据流

执行linux命令时,linux默认为用户进程提供了3种数据流

  • stdin
    • 标准输入、0
    • 一般是键盘输入数据
    • 比如cat命令等待用户输入
  • stdout
    • 标准输出、1
    • 程序执行结果,输出到终端
  • stderr
    • 标准错误输出
    • 程序执行结果,输出到终端

6.1 标准输入

1
2
3
4
5
6
cat 接收键盘的输入数据,然后打印到终端,直到ctrl +d 结束输入
[root@yuchao-tx-server ~]# cat
hello
hello
我爱你
我爱你

6.2 标准输出

1
2
[root@yuchao-linux01 ~]# ls /opt/
HelloWorld.class HelloWorld.java jdk jdk1.8.0_221 jdk-8u221-linux-x64.tar.gz passwd

6.3 标准错误输出

1
2
[root@yuchao-linux01 ~]# ls /opppp > stderr.txt
ls: cannot access /opppp: No such file or directory

6.4 数据重定向

我们发现,数据流的输入、输出,都是直接显示在屏幕上,然后你貌似做不了更多处理,不够强大。

因此linux系统提供了数据重定向符号,让你能够对数据再次做处理。

6.4.1 输入重定向

输入重定向是指把命令(或可执行程序)的标准输入,重定向到指定的文件中。

也就是说,输入可以不来自键盘,而来自一个指定的文件。

1
2
3
4
5
6
7
比如依然是是cat命令,原本应该是,等待键盘输入数据
现在是通过输入重定向符号,将标准输入stdin,改为了文件数据作为输入。

[root@yuchao-linux01 ~]# cat < t1.log
于超老师带你学Linux
666
666

6.4.2 输出重定向(重要)

输出重定向是指把命令(或可执行程序)的标准输出标准错误输出重新定向到指定文件中。

这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。

  • 使用 “ > ”符号,将标准输出重定向到文件中。形式为:命令>文件名
  • 使用“ >> ”符号,将标准输出结果追加到指定文件后面。形式为:命令>>文件名
  • 使用“ 2> ”符号,将标准错误输出重定向到文件中。形式为:命令 2> 文件名
  • 使用“ 2>> ”符号,将标准错误输出追加到指定文件后面。形式为:命令 2>>文件名
  • 使用“ 2>&1 ”符号或“ &> ”符号,将把标准错误输出stderr重定向到标准输出stdout
  • 使用“ >/dev/null ”符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
重定向基本用法
[root@yuchao-tx-server ~]# echo '超哥带你学linux' > test.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# echo '超哥带你学linux' >> test.log


错误重定向追加
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' 2>> test.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# cat test.log
超哥带你学linux
超哥带你学linux
-bash: echhhho: 未找到命令

将stderr重定向到stdout,就可以防止程序运行出错,导致程序异常
写法1
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' &>> test.log
写法2
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' >> test.log 2>&1


黑洞文件,空设备文件,也同样遵循,stdout、stderr的语法
[root@yuchao-tx-server ~]# echo '超哥带你学linux' &>> /dev/null
[root@yuchao-tx-server ~]# echhhhho '超哥带你学linux' &>> /dev/null

2>&1 解释

上面我们是把ping命令的输出,写入到nohup.out文件里,我们也可以指定一个文件,将命令的执行结果,写入进文件。

image-20220118104039416

图解stdout/stderr

标准输出stdout就是一个命令会有正确的执行结果,在屏幕上显示出,让用户看见。

image-20220118104418005

标准错误输出,上面已经看到了,那如何获取标准错误输出呢?

比如这个程序出错的信息,我也想收集下来,写入到日志。

通过这个语法,即可

==把标准错误输出,重定向,写入到标准输入==

image-20220118110735345

image-20220118110704818

stdouer+stderr

image-20220118110857410

三、机器负载查看

3.1 系统平均负载查看uptime

系统负载指的是在单位时间内,系统分配给CPU处理的进程数量,必然是数量越多,负载值越高,机器的压力越大。

1
2
3
uptime命令
[root@yuchao-linux01 ~]# uptime
17:45:12 up 2:13, 2 users, load average: 0.00, 0.01, 0.05

这个load average表示平均负载,多少数值比较合适?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.最理想化的状态是每个CPU都在运行着进程,充分让cpu工作起来,效率最大化,你得先看看你机器上有几个CPU(几个核,就是有几个cpu可以工作)。
# 发现是4核的
[root@yuchao-linux01 ~]# lscpu |grep -i '^cpu(s)'
CPU(s): 4

# 以及用top命令,按下数字1,查看几核。
top


2. 如何理解uptime看到的负载
分别是1、5、15分钟内的平均负载情况,表示是1~15分钟内CPU的负载变化情况。

1. 三个值如果差不多,表示系统很稳定的运行中,15分钟以内,CPU都没有很忙
2. 如果1分钟内的值,远大于15分钟的值,表示机器在1分钟内压力在直线上升
3. 如果1分钟内的值,小于15分钟的值,表示系统的负载正在下降中

如何监控系统负载的趋势?

1
2
3
实际工作中,uptime是运维临时看一看机器的压力的,具体的还得
1. 编写shell脚本,结合定时任务,周期性的查看uptime命令的结果,写入到文件中,综合判断机器压力情况。
2. 使用成熟的监控软件,如zabbix、Prometheus,他们有丰富的图形化报表展示,可以从可视化下,轻松掌握机器压力。

image-20220322175336060

3.2 CPU压力测试(超哥硬核讲解)

cpu的压力,来自于高频的计算任务,比如数值计算等,我们可以用bash程序,python程序,以及各种编程语言,来实现复杂的高频率计算。

这里我们用几个工具

1
2
3
stress         stress是一个linux的压力测试工具,专门用于对设备的CPU、IO、内存、负载、磁盘等进行压测。
mpstat 多核CPU性能分析
pidstat 实时查看cpu、内存、io等指标

实践

1
2
1.安装stress工具
yum install stress -y

3.2.1 sysstat工具包

sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如:CPU 使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
包含的工具
iostat

输出CPU的统计信息和所有I/O设备的输入输出(I/O)统计信息

mpstat

mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。


pidstat

关于运行中的进程/任务、CPU、内存等的统计信息

sar

保存并输出不同系统资源(CPU、内存、IO、网络、内核等)的详细信息

sadc

系统活动数据收集器,用于收集sar工具的后端数据

sa1

系统收集并存储sadc数据文件的二进制数据,与sadc工具配合使用

sa2

配合sar工具使用,产生每日的摘要报告

sadf

用于以不同的数据格式(CVS或者XML)来格式化sar工具的输出

sysstat

sysstat 工具包的 man 帮助页面。

nfsiostat

NFS(Network File System)的I/O统计信息

cifsiostat

CIFS(Common Internet File System)的统计信息

官方网站: http://sebastien.godard.pagesperso-orange.fr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
1.安装该工具包
[root@yuchao-linux01 ~]# yum install sysstat stress -y


2.对cpu压测,stress命令
# -c, --cpu N 产生 N 个进程,每个进程都反复不停的计算随机数的平方根
# -t, --timeout N 在 N 秒后结束程序

# 跑满2个cpu核,
[root@yuchao-linux01 ~]# stress --cpu 2 --timeout 600
stress: info: [3782] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd

3. 再开一个终端,查看机器的负载情况
一分钟内的CPU压力飙升
[root@yuchao-linux01 ~]# uptime
19:01:26 up 3:29, 2 users, load average: 1.35, 0.45, 0.19

4. 用watch命令,高亮检测哪些数值在变化
[root@yuchao-linux01 ~]# watch -d uptime


5.可以用mpstat命令查看cpu状态细节
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值

#查看多核CPU核心的当前运行状况信息, 每5秒更新一次
[root@yuchao-linux01 ~]# mpstat -P ALL 5

可以清晰的看到,哪一个cpu核,压力最大,通过%usr看到用户进程,消耗了100%的cpu。


6.也可以用top命令检测cpu压力,发现是有2个stress进程,占据了100%的cpu
top - 19:07:46 up 3:36, 2 users, load average: 1.33, 1.38, 0.74
Tasks: 131 total, 4 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7992344 total, 7450560 free, 139564 used, 402220 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 7573368 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3955 root 20 0 7312 100 0 R 100.0 0.0 0:10.55 stress
3954 root 20 0 7312 100 0 R 99.6 0.0 0:10.54 stress
1 root 20 0 125460 3896 2584 S 0.0 0.0 0:02.25 systemd

如上于超老师讲解的命令,你可以在生产环境下,检测服务器资源使用率情况,判断出是什么进程,占用了较多的cpu资源。

free查看内存使用情况

命令:free

作用:查看内存使用情况

语法:#free -m

选项:

-m 表示以mb为单位查看(1g = 1024mb,1mb = 1024kb)

-h 以可读形式显示容量,需要free -V显示版本大于3.3

1
2
3
默认free命令是 KB单位
[root@yuchao-linux01 ~]# free
total used free shared buff/cache availableMem: 7992344 139320 7450696 12012 402328 7573516Swap: 2097148 0 2097148

top可以理解为资源管理器,整体掌握系统资源使用情况。

针对内存,可以专门用free命令

image-20220117181914193

明显的,以G为单位,看起来更直观点,阅读的数字较小。

free 命令主要是用来查看内存和 swap 分区的使用情况的,其中:

  • total:是指物理内存总大小,信息来自于/proc/meminfo
  • used:是指已经使用的内存,userd=total-free-buffers-cache
  • free:是指空闲的;free = total - used - buff - cache
  • shared:是指共享的内存;用于tmpfs系统
  • buff/cache
    • buffers:缓冲区,写入缓冲,用于内存和磁盘之间的数据写入缓冲,存放内存需要写入到磁盘的数据。
    • cached:缓存区,读取缓存,加快CPU和内存数据交换,存放内存已经读取完毕的数据。

关于第二行的swap,现状是完全关掉这个功能的。

第2行数据是Swap交换分区,也就是我们通常所说的虚拟内存(硬件交换分区)。

防止内存用完导致系统崩溃,临时拿硬盘的一些空间当做内存使。

buff和cache

  • buffer,==缓冲区==,buffers是给==写入数据==加速的
  • Cache,==缓存==,Cached是给==读取数据==时加速的

image-20220117182856806


image-20220322192145922

图解cache

==cache是指,把读取磁盘而来,的数据保存在内存中,再次读取,下一次不用读取硬盘,而直接从内存中读取,加速数据读取过程。==

1
2
3
4
硬件读写速度排名
磁盘 > 内存 > CPU

为了提高CPU、内存之间的数据交换效率,linux设计了cache这种技术。CPU本身也就支持缓存,但是CPU内部的缓存太贵,容量都太小,因此引入内存空间来存放CPU读取过的数据,下次CPU再读取数据,直接去cache中读,不用再去内存里寻找了。

简单理解,cache缓存,好比你的快递,临时放在了驿站,就在你家附近,省的你去总站去拿数据,多累。

  • 驿站大幅度减轻了总站的取快递压力(减少了磁盘的压力)
  • 同时也加快了用户拿到快递的时间,用户更开心了(拿到磁盘数据更快了,省时间了)

image-20191204135114866

图解buffer

1
2
3
内存的读取、写入速度是远超硬盘的,为了提高数据写入硬盘的效率,linux设计了buffer技术。
buffer缓冲区的作用是将内存写完的数据缓存起来,通过系统调度策略在合适的时候,定期刷新到磁盘中。
以此减少磁盘的寻址次数,提高写入数据的能力。

==buffer是指写入数据时,把分散的写入操作保存到内存,达到一定程度集中写入硬盘,减少磁盘碎片,以及反复的寻道时间,加速数据写入。==

image-20191204140118008

1
2
3
4
5
6
可以理解为果园运输草莓
1.超哥去草莓园摘草莓,使用编织篮采摘

2.摘完一筐一筐草莓后,一起倒进运输车

而非,摘一个扔进车里一个,那效率是不是老慢了?

好比BT下载资料,电脑需要长时间24h的挂机运转,但是BT下载是碎片化的。

如果直接写入磁盘也是零散的数据,由于机械磁盘的特性,写入大量零散的数据,会造成磁盘高负荷的机械运动,增加寻址时间,造成硬盘过早老化而损坏。

因此引入buffer,当数据攒到一定程度,例如512MB的时候,再一次性写入磁盘,这种化零为整的写入方式,大大降低了磁盘的负荷。

image-20191204140641621

总结cache、buffer

  • 这俩都是计算机的重要属性,不仅在内存,磁盘里有使用,后面的网站架构篇,也多处使用到缓存的概念。
  • cache解决的时间问题,提高数据读取速度
    • cache利用的是内存极快的速度特性,读写速度是磁盘的很多倍。
  • buffer解决的是空间问题,给数据写入提供一个暂存空间
    • 磁盘对碎片化的数据处理,是很低效的,我们后面学习磁盘管理,即可更深入理解
    • buffer利用的是内存的存储特性。

四、磁盘管理

df 查看磁盘信息

命令:df

作用:查看磁盘的空间(disk free)

语法:# df [-h]

选项:-h表示可读性较高的形式展示大小

image-20220117201129742

Filesystem 磁盘名称(文件系统名称)
Size 总大小,总容量
Used 已经使用的容量
Avail 剩余可用容量
Use% 使用百分比
Mounted on 挂载路径(相当于Windows 的磁盘符)(访问挂载点即可访问到该设备的数据)

上述结果可以看出,根目录,也就是系统总容量是44G,还剩下38G可用,用了15%。

4.1 磁盘io监控(iotop)

iotop命令 是一个用来监视磁盘I/O使用状况的top类工具。

iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.安装iotop
[root@yuchao-linux01 ~]# yum install iotop -y

2.常用命令参数
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
-k 以kB单位显示读写数据信息

3.常用快捷键
左右箭头:改变排序方式,默认是按IO排序。
r:改变排序顺序。
o:只显示有IO输出的进程。

p:进程/线程的显示方式的切换,切换pid、tid

a:显示累积使用量
q:退出。

实践

1
2
3
4
5
1.显示默认信息
[root@yuchao-linux01 ~]# iotop

2.以kb单位显示io进程
[root@yuchao-linux01 ~]# iotop -k

iotop字段解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
第一行、磁盘读写的速率总计
第二行,磁盘读写的实际速率
第三行,具体的进程/线程,速率详细信息。
Total DISK READ : 143780.40 K/s | Total DISK WRITE : 0.00 K/s
Actual DISK READ: 143780.40 K/s | Actual DISK WRITE: 181263.57 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
820 be/4 root 379.82 K/s 0.00 K/s 0.00 % 0.02 % irqbalance --foreground
818 be/4 root 79.13 K/s 0.00 K/s 0.01 % 0.01 % vmtoolsd
4611 be/4 jerry01 143321.46 K/s 0.00 K/s 22.81 % 0.00 % -bash



TID # 线程id,按下p,切换进程PID
PRIO # 优先级
USER # 运行的用户
DISK READ # 读取速率
DISK WRITE # 写入速率
SWAPIN # swap交换分区的百分比
IO # IO等待百分比
COMMAND # 进程名

五、网络管理

5.1 网络简单了解

网络知识,涉及较多的原理性概念,放在后面再讲,先学实践性的linux操作。

计算机网络,就是一堆协议组成起来的。

image-20220322202920671

  • 于超老师给大家发送linux学习资料,是直接通过电脑,把文件等资料发到你们的机器上,至于怎么发的,我们就知道是得确保我们互相的机器都能上网,资料就发过去了。
  • 如果没有网络,我们两人的计算机,需要插上网线,将两个机器连接起来,才能进行数据传输,但是现在有了更方便的网络,蓝牙等无线信号,能够隔空传输数据了。
  • 不限于机器时间的文件传输,还有其他各种需求,域名解析、www网络服务,ping命令的icmp协议,VPN的特殊协议,时间同步的ntp协议、等等,这些协议是专业网络工程师要去学习的。
  • 而我们作为系统工程师,更多的是关注linux操作系统本身,对于网络有一定的认识,能够进行运维工作实践即可,当然后期,晋升高级运维,学习的内容越来越复杂,必然要对网络有更多的认识。
  • 全世界找不出任何一个人能搞懂网络传输的过程,因为其中涉及了太复杂的数据交换,你只需要记住。
    • 好比你发快递,记住发送人是谁,收件人是谁,具体这个快递是经过了山路十八弯,还是去南极跑了一圈,你不用管,你关心最后快递能送到即可。
    • 你只需要关心,你和对方的服务器,是否能通信即可。

image-20220322203730141

5.2 网络协议之TCP、UDP

image-20220322201802850

我们学习netstat命令的话,会看到tcp、udp的字样,解释如下。

Tcp

image-20220322204502449

udp

image-20220322204545964

至于计算机的网络,简单了解下这个过程。

机器得有网卡、得插网线(物理层)

机器上的网络适配器能拿到ip地址

计算机之间可以基于ip地址,进行数据交互

(基于tcp协议的数据交互,李文杰想给于超老师发一个小电影,两个人一拍即合,满心欢喜,握手言和,达成一致目的)

(基于udp协议的数据交互,李文杰不管超哥爱不爱看小电影,反正一顿发数据,直到把超哥的机器占满网络带宽,卡死)

丰富的应用层协议(如网站服务的HTTP协议)

5.3 netstat查看进程网络访问

命令:netstat

作用:查看网络连接状态

语法:netstat -tnlp

选项:

-t:表示只列出tcp 协议的连接;

-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示;

-l :表示过滤出”state(状态)”列中其值为LISTEN(监听)的连接;

-p:表示显示发起连接的进程pid 和进程名称;

image-20220118092335783

1
2
3
4
5
6
7
Protocol:协议(tcp、upd、http、https、icmp、ssh…)
Receive:接收
Send:发送
Local Address:本地地址
Foreign:远程地址
State:状态,LISTEN表示侦听来自远方的TCP端口的连接请求
PID/Program name:进程ID和程序名

用法

1.linux允许一个服务,基本会打开一个端口,如sshd打开22端口,其他服务也一样用法,结合grep即可

如果找不到对应信息,则得考虑是名字敲错了,还是服务未运行。

1
2
3
4
[root@yuchao-linux01 ~]# netstat -tnlp |grep 22
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1810/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1156/sshd
tcp6 0 0 :::22 :::* LISTEN 1156/sshd

5.4 ss命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ss  是类似netstat的工具。能显示查看网络状态信息,包括TCP、UDP连接,端口

并且性能远比netstat强悍,适合用于高并发服务器查看

-a 显示所有网络连接
-l 显示LISTEN状态的连接(连接打开)
-m 显示内存信息(用于tcp_diag)
-n, --numeric 不显示域名,直接显示ip地址
-o 显示Tcp 定时器x
-p 显示进程信息
-s 连接统计

-d 只显示 DCCP信息 (等同于 -A dccp)
-u 只显示udp信息 (等同于 -A udp)
-w 只显示 RAW信息 (等同于 -A raw)
-t 只显示tcp信息 (等同于 -A tcp)
-x 只显示Unix通讯信息 (等同于 -A unix)

-4 只显示 IPV4信息
-6 只显示 IPV6信息
--help 显示帮助信息
--version 显示版本信息

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看所有的tcp连接
[root@yuchao-linux01 ~]# ss -t

State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 148 192.168.0.240:ssh 192.168.0.115:59610
ESTAB 0 0 192.168.0.240:ssh 192.168.0.115:53054

# 查看所有的udp连接

[root@yuchao-linux01 ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port


# 常用组合
# 显示tcp、udp、ip地址、监听中的连接、进程信息
[root@yuchao-linux01 ~]# ss -tunlp

image-20220322205512695

5.5 网络流量监控命令iftop

作用和top和iotop一样,动态显示机器上,网卡的流量动态

1
[root@yuchao-linux01 ~]# yum install iftop -y

image-20220322205749730

1
2
查看系统流量变化
yum install java -y

linux资源笔记

image-20250820162727844

image-20250820163229041

流程如下:

1号进程-sshd服务-ssh连接这个服务–/bin/bash-后续就打的所以命令,ls. cd

image-20250820173533660

孤儿进程与僵尸进程

image-20250820175711462

image-20250820175740764

image-20250820175825718

image-20250820225557632

image-20250820225642714

image-20250820225744390

image-20250820230640751

image-20250820231228196

image-20250820232207019

image-20250820232353620

image-20250820232715508

image-20250821102419776

losf,kill

image-20250821131145846

image-20250821131803904

image-20250821154443695

image-20250821154829809

image-20250821155458473

image-20250821160053065

输入重定向

image-20250821165545162

image-20250821170805064

image-20250821175228402

image-20250821175602875

image-20250822014329815

image-20250822014401002

image-20250822014430642

image-20250822014754239

image-20250822112245974

image-20250822125720380

image-20250822150004943

image-20250822160242394

image-20250822160440347

image-20250822162518976

image-20250822164421287

image-20250822173931500

image-20250822175253374

YUM与开源项目(Web运维)

学习目标

1、了解Linux软件的安装方式

2、掌握更新yum源

3、掌握YUM软件安装方式

4、了解LAMP环境以及AMP的关系

5、了解阿里云ECS的创建过程

6、能够yum方式搭建lamp环境

7、能够实现Discuz!论坛部署

8、能够购买域名与解析域名

前言

1、项目背景

运维小于,目前刚入职了一家电子商务公司。

主要负责大型商城系统维护,公司主营母婴用品,如奶瓶、奶嘴、童装等等,最近,很多客服发现一个问题:很多宝妈会在评论区互相咨询产品相关信息。

于是公司决定针对这一需求,要求运维为公司迅速上线一款论坛系统,方便宝妈交流产品、育儿心得等等。

2、项目需求

满足功能,并且省钱(开源项目),暂时没时间招程序员了,招人,写代码,上线,三个月就过去了!!

市面上会有很多开源组织,开源技术团队,产品开发完毕后,秉着开源精神,公开源代码让网民免费下载、使用,这样也会获得更大的曝光量,更多的技术人加入组织。

也给大量用户,带来方便,开箱即用。

Discuz! = Apache + PHP + MySQL

image-20220118112047256

一、YUM概述

1、Linux软件的安装方式

在CentOS系统中,软件管理方式通常有三种方式:rpm安装yum安装以及编译安装

编译安装,从过程上来讲比较麻烦,包需要用户自行下载,下载的是源码包,需要进行编译操作,编译好了才能进行安装,这个过程对于刚接触Linux的人来说比较麻烦,而且还容易出错。

好处在于是源码包,对于有需要自定义模块的用户来说非常方便。

专业linux运维肯定是要掌握编译软件的方法。

2、什么是yum

Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。

基于rpm包管理,能够从指定的服务器(yum源)自动下载RPM包并且安装,可以==自动处理依赖性关系==,并且==一次安装所有依赖的软件包==,无须繁琐地一次次下载、安装。

先回忆下,rpm包管理

在 RPM(红帽软件包管理器)公布之前,要想在 Linux 系统中安装软件只能采取源码包 的方式安装。

早期在 Linux 系统中安装程序是一件非常困难、耗费耐心的事情,而且大多数 的服务程序仅仅提供源代码,需要运维人员自行编译代码并解决许多的软件依赖关系,==因此 要安装好一个服务程序,运维人员需要具备丰富知识、高超的技能,甚至良好的耐心。==

==而且在 安装、升级、卸载服务程序时还要考虑到其他程序、库的依赖关系,所以在进行校验、安装、 卸载、查询、升级等管理软件操作时难度都非常大。==

软件包依赖关系

在早期系统运维中,安装软件是一件非常费事费力的事情。系统管理员不得不下载软件源代码编译软件,并且为了系统做各种调整。

==尽管源代码编译形式的软件增强了用户定制的自由度,但是在小软件上耗费精力是缺乏效率的,于是软件包应运而生。==

软件包管理可以将管理员从无休止的兼容问题中释放。yum工具就可以自动搜索依赖关系,并执行安装。

rpm软件包在安装的时候,由作者定义依赖关系

必须解决依赖关系,软件才能正常工作

如何检查软件依赖

通过rpm命令,可以检查某软件的依赖关系。

注意,这种方法只适用于已安装的包。如果你需要检查一个未安装包的依赖关系,你首先需要把这个包先下载到本地来(不需要安装)。

只能查询已安装的应用程序,依赖哪些其他软件。

image-20220118113420619

其他检查rpm包依赖关系的方法,待会学完yum工具,再用

yum配置文件

1
/etc/yum.conf

image-20220118134001356

系统默认的yum仓库文件

1
2
3
4
5
6
7
8
9
[root@yuchao-linux01 opt]# ls /etc/yum.repos.d/ -l
total 32
-rw-r--r--. 1 root root 1664 Apr 29 2018 CentOS-Base.repo 网络yum源配置文件
-rw-r--r--. 1 root root 1309 Apr 29 2018 CentOS-CR.repo
-rw-r--r--. 1 root root 649 Apr 29 2018 CentOS-Debuginfo.repo 内核更新相关软件包
-rw-r--r--. 1 root root 314 Apr 29 2018 CentOS-fasttrack.repo 快速下载通道
-rw-r--r--. 1 root root 630 Apr 29 2018 CentOS-Media.repo 本地光盘yum配置文件
-rw-r--r--. 1 root root 1331 Apr 29 2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 Apr 29 2018 CentOS-Vault.repo

软件包管理神器

为了能让用户更方便、省心的管理软件,进行安装、卸载、升级,系统都会有一些方便的工具。

比如windows的360软件管家

image-20220118135716473

而Linux的软件管家是什么?就是yum image-20220118140849677

3、配置阿里yum源

使用阿里yum源代替系统默认的yum源

备份默认的yum源

image-20220118141234559

下载新的阿里云yum网络源,当我们yum install 就能够自动去阿里云的yum仓库寻找rpm包,而不是centos官网了。

教程https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11nCvpuy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1. 做好备份
[root@yuchao-linux01 yum.repos.d]# pwd
/etc/yum.repos.d
[root@yuchao-linux01 yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
[root@yuchao-linux01 yum.repos.d]#
[root@yuchao-linux01 yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak


# 2.获取阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 3.查看新的yum源
[root@yuchao-linux01 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
--2022-01-18 14:13:57-- https://mirrors.aliyun.com/repo/Centos-7.repo
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 124.165.127.206, 125.39.76.202, 125.39.76.204, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|124.165.127.206|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2523 (2.5K) [application/octet-stream]
Saving to: ‘/etc/yum.repos.d/CentOS-Base.repo’

100%[======================================================================>] 2,523 --.-K/s in 0s

2022-01-18 14:13:57 (490 MB/s) - ‘/etc/yum.repos.d/CentOS-Base.repo’ saved [2523/2523]

[root@yuchao-linux01 yum.repos.d]# ll
total 36
-rw--w--w- 1 root root 2523 Dec 26 2020 CentOS-Base.repo 这是新下载的
-rw-r--r--. 1 root root 1664 Apr 29 2018 CentOS-Base.repo.bak
-rw-r--r--. 1 root root 1309 Apr 29 2018 CentOS-CR.repo
-rw-r--r--. 1 root root 649 Apr 29 2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 Apr 29 2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 Apr 29 2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Apr 29 2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 Apr 29 2018 CentOS-Vault.repo

# 4.清空yum缓存
yum clean all


# 5.生成新缓存,便于yum install 加速下载,生成cache
yum makecache

此时的网络yum源配置文件,已经是来自于阿里云的了。

image-20220118141459634

生成缓存 image-20220118141820358

4、yum命令

① 查询操作

语法:# yum search 关键词

linux下的软件搜索,你想装东西,就用yum

1
2
3
4
5
6
7
8
9
10
11
12
[root@yuchao-linux01 yum.repos.d]# yum search firefox
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
========================================================= N/S matched: firefox =========================================================
firefox.x86_64 : Mozilla Firefox Web browser
firefox.i686 : Mozilla Firefox Web browser

Name and summary matches only, use "search all" for everything.
[root@yuchao-linux01 yum.repos.d]#

② 安装操作

语法:# yum [-y] install 关键词

1
[root@yuchao-linux01 yum.repos.d]# yum install -y firefox

image-20220118142544780

确保安装完毕

image-20220118142647681

确保浏览器可用了

image-20220118142719465

③ 卸载操作

语法:# yum [-y] remove 关键词

如何删除火狐浏览器?

1
[root@yuchao-linux01 yum.repos.d]# yum remove -y firefox

image-20220118142544780

image-20220118143037948

④ 更新操作

语法:#yum [-y] update [包的关键词]

==特别注意:包的关键词如果不写,则表示更新整个系统(全局更新,也包含内核)==

==千万别直接执行yum update -y,升级是一个重大的事==

升级,代表着所有内容都会更新,牵一发而动全身,你很多软件可能会全面崩溃。

1
2
# 升级vim
[root@yuchao-linux01 yum.repos.d]# yum update -y vim

image-20220118143534621

若是升级一个不存在的软件,则提示找不到

1
2
3
4
5
6
7
8
[root@yuchao-linux01 yum.repos.d]# yum update -y firefox
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package(s) firefox available, but not installed.
No packages marked for update

⑤yum获取软件依赖

yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了–downloadonly(只下载)的选项来达到这个目的。

==该功能主要用于,离线安装,提前获取好rpm,这是一个非常省事的办法==

1
2
3
4
5
6
7
8
9
10
11
[root@yuchao-linux01 opt]# yum install --downloadonly --downloaddir=. python3
[root@yuchao-linux01 opt]# ll
total 9488
-rw--w--w- 1 root root 71844 Nov 18 2020 python3-3.6.8-18.el7.x86_64.rpm
-rw--w--w- 1 root root 7286976 Nov 18 2020 python3-libs-3.6.8-18.el7.x86_64.rpm
-rw--w--w- 1 root root 1702324 Oct 15 2020 python3-pip-9.0.3-8.el7.noarch.rpm
-rw--w--w- 1 root root 644052 Aug 23 2019 python3-setuptools-39.2.0-10.el7.noarch.rpm
[root@yuchao-linux01 opt]#
[root@yuchao-linux01 opt]#

此时你就可以拷贝走这些rpm包,再进行安装即可

⑥扩展rpmdep工具

这个只做了解,用于练习linux命令操作,以及yum操作。

还有一个办法是使用rpmdep工具,rpmdep是一个命令行工具,可以显示已安装包的完整包依赖关系图。

该工具会分析RPM包的依赖性,从完整的排完序的拓扑图中摘取部分包的信息,形成列表展示给用户。

该工具的输出结果可以直接使用到Dotty(可视化展示工具)中去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.获取工具
[root@yuchao-linux01 yum.repos.d]# wget http://downloads.sourceforge.net/project/rpmorphan/rpmorphan/1.14/rpmorphan-1.14-1.noarch.rpm

2.安装工具
[root@yuchao-linux01 yum.repos.d]# rpm -ivh rpmorphan-1.14-1.noarch.rpm

3.安装绘图工具graphviz
[root@yuchao-linux01 yum.repos.d]# yum install graphviz -y

4.生成软件依赖关系图片
[root@yuchao-linux01 opt]# rpmdep.pl -dot gzip.dot gzip
gzip depends upon basesystem,bash,ca-certificates,centos-release,chkconfig,coreutils,filesystem,gawk,glibc,glibc-common,gmp,grep,info,keyutils-libs,krb5-libs,libacl,libattr,libcap,libcom_err,libffi,libgcc,libselinux,libsepol,libstdc++,libtasn1,libverto,ncurses,ncurses-base,ncurses-libs,nspr,nss-softokn-freebl,nss-util,openssl-libs,p11-kit,p11-kit-trust,pcre,popt,sed,setup,tzdata,zlib
[root@yuchao-linux01 opt]#
[root@yuchao-linux01 opt]#
[root@yuchao-linux01 opt]# dot
dot dot2gxl dotty
[root@yuchao-linux01 opt]# dot -Tpng -o output.png gzip.dot
[root@yuchao-linux01 opt]# ls
gzip.dot output.png tcpdump-4.9.2-4.el7_7.1.x86_64.rpm

5.在图形化下查看png图片

image-20220118145652366

同理,也可以查看firefox浏览器的安装,底层牵扯了哪些依赖,如果没有yum都得你自己去处理

1
2
3
4
5
6
# firefox
[root@yuchao-linux01 opt]# rpmdep.pl -dot firefox.dot firefox
[root@yuchao-linux01 opt]# dot -Tpng -ofirefox.png firefox.dot

# python
[root@yuchao-linux01 opt]# rpmdep.pl -dot python.dot python

二、LAMP概述

1、什么是LAMP

LAMP是公认的最常见、最古老的黄金Web技术栈、

1
2
3
4
5
6
其实就是

Linux 操作系统
Apache/Nginx web服务器
Mysql/Mariadb
Perl/Php/Python
  • LAMP:==L==inux + ==A==pache + ==M==ySQL + ==P==HP LAMP 架构(组合)
  • LNMP:Linux + Nginx + MySQL + php-fpm LNMP 架构(组合)

lamp

image-20200117165542095

lnmp

image-20200212203206493

Linux

Linux到底好在哪?用Linus本人的话说就是,普通老百姓用户,压根别说你是在使用操作系统,你需要的只是应用程序,而不是操作系统。

操作系统主要是提供给程序员API,用于构建和运行应用的一个平台。

如果来说,你常用的应用在Linux下运行的更好,更方便,那没问题。

但是如果你平时用的软件,都和Linux没什么关系,那你没必要选择Linux。

那当然作为运维人员,你可以一手使用windows、一手使用Linux,毕竟你的服务器运维工作,几乎都是Linux环境了。

Linux系统主要是以开发者为中心,Windows主要以消费者为中心这是本质的区别。

Linux的特点是几乎所有的开发任务相关工具,都有很完善的支持,从底层的编译器,make编译工具,到bash脚本,git代码管理,vim编辑器,依赖管理工具等等都很齐全。

然而Windows/Mac的操作系统很少能完善这些开发工具的,Linux则是默认预装的开发环境。

WIndows几乎都是图形化接口,而Linux几乎都是现有命令行,再由图形化操作接口,更容易实现自动化。

image-20200118163840299

apache

image-20200118161748267

Apache Web Server虽然称之为web服务器,但是不是意味着他是一个物理服务器,它只是电脑软件中的一个软件而已,Web服务器的作用是将HTTP请求从前端转发到后端应用上。

php

PHP是一门服务端脚本编程语言,主要用于web开发,常用PHP脚本嵌入HTML源码中执行。

PHP是全球知名的编程语言之一,程序员可以免费试用,PHP支持多种操作系统,开发效率高,支持多种数据库操作。

国内众多网站,百度、雅虎、新浪都在大量使用PHP语言进行开发,知名的论坛软件Discuz也是由PHP开发且占据了80%的论坛软件市场。

==世界上最好的语言(梗)==

image-20220118152656853

MySQL

Mysql是一款数据库管理系统,也就是一个存储数据的工具,用户可以自行对数据库进行增加、删除、修改、查询等操作。

MySQL是数据库管理系统中的一款软件,被业界广泛使用,例如新浪、QQ、淘宝、都在大量使用MySQL数据库。

腾讯QQ使用Linux与MySQL数据库,存储注册用户2.8亿的信息,活跃人数9000万,凭借万台服务器搭建的数据库集群,腾讯QQ同时在线人数也达到了千万,这证明了MySQL数据库的大容量、快速响应特点。

MySQL是一款关系型数据库,尤其适合Web应用,特别是电商领域,MySQL遍布各种行业、移动、爱立信、惠普、银行、思科、摩托萝拉、等等。

image-20200118162000347

LAMP图解

LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl、PHP或者Python编程语言

所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构

LAMP具有通用、跨平台、高性能、低价格的优势,因此LAMP无论是性能、质量还是价格都是企业搭建网站的首选平台。

image-20200203165504534

我们是怎么访问网站的。

image-20220118153236113

三、LAMP环境准备(阿里云)

这一节,我们就要进行搭建一个论坛,并且放入到互联网中,体验下,一个网站,从零到可以在浏览器访问到,是什么过程。

需要你掌握超哥前面讲的知识

1.linux基础命令,文件操作,ssh登录,解压缩等

2.linux软件安装,管理

3.理解一整套,运维部署的流程,做好清晰的部署笔记。

4.理解阿里云服务器的购买、使用流程。

要想部署一个互联网上可以访问到的环境,必须先具备以下内容 :

服务器(IP、帐号密码、终端)、相应的软件、域名(备案、解析)、代码等。

1、注册阿里云账号

阿里云官网:https://www.aliyun.com/

立即注册

image-20220118154229854

账户密码注册

image-20220118155309260

填入验证码注册

image-20220118155334409

注册成功

image-20220118155436191

2、实名认证

购买服务器要进行实名认证,用于后面的域名购买,域名备案。

image-20220118160112256

进行个人实名认证

image-20220118160215380

快捷使用支付宝实名认证

image-20220118160328676

后续填写信息后,完整实名认证。

image-20220118160549935

3、进入管理控制台

image-20220118160906292

找到阿里云服务器ECS功能

image-20220118160953559

体验阿里云服务器

image-20220118161012052

了解一下阿里云是什么ECS

image-20220118161106280

进入ECS

阿里云会提供一些教程,帮助小白,来部署不同的应用。

比如你是想

  • 搭建网站
  • 搭建小程序
  • 部署个人博客
  • 公司网站上线

image-20220118161341579

4、购买ECS

image-20220118161614444

目前有活动、实名认证后,可以免费试用一个月。

机器配置选择

现在就等同于你在逛淘宝,选择机器的配置,内存,磁盘,CPU,以及既然是云服务器,要选择网络带宽(家里电脑要上网,要去装个电信网。)

image-20220118162021231

准备创建

image-20220118162040648

选择centos7.9版本

配置是1核、2G内存、40G云盘、带宽是1M

创建成功

image-20220118165958397

查看机器信息

找到你的公网IP地址

image-20220118170136010

设置服务器连接密码

账户root

密码设置的难一点,保护你的公网服务器。

image-20220118170624058

重启中,修改密码后,需要重启服务器生效。

image-20220118170829341

四、部署LAMP环境

1、登录阿里云服务器

image-20220118171645124

创建连接

image-20220118171808783

连接后,查看服务器基本信息 image-20220118172026009

修改主机名

1
[root@iZ2zegj6wtqlyu37r4ngr6Z ~]# hostnamectl set-hostname yuchao-aliyun

2、关闭内置防火墙

阿里云有提供公网防火墙(安全组)

image-20220118172228144

在实验阶段,我们先临时关闭防火墙,我们会在后面网络安全篇,着重讲解防火墙规则

添加规则,是对服务器流量,以及各种应用程序进行把控,只有在你学习了各种linux程序部署、搭建、使用后。

才有了知识铺垫,然后进行安全流量控制。

image-20220118172835890

3、查看是否安装apache

1
2
3
[root@yuchao-aliyun ~]# 
[root@yuchao-aliyun ~]# rpm -qa httpd
[root@yuchao-aliyun ~]#

没有结果,表示未安装httpd服务,也就是没装apache这个web服务器。

4、是否安装MySQL

1
[root@yuchao-aliyun ~]# rpm -qa mysql

5、是否安装php

1
[root@yuchao-aliyun ~]# rpm -qa php

为什么检查,因为如果机器安装过这些软件,或者安装后,卸载了,但是没有卸载干净,导致一些依赖软件的残留。

我们再进行安装的时候,就会碰到依赖冲突的错误。

建议新手用新机器操作。

6、LAMP环境之Apache安装

① 使用yum命令安装httpd软件包

apache这个软件,在linux中软件包的名字,是叫做httpd,因此得通过yum安装这个httpd

由于是阿里云服务器,默认用的也是阿里云yum源了。

1
[root@yuchao-aliyun ~]# yum install httpd -y

② 配置/etc/httpd/conf/httpd.conf文件

linux中安装、使用软件,流程就是

1.下载安装

2.修改配置文件

3.启动、使用

1
2
3
4
[root@yuchao-aliyun ~]# vim /etc/httpd/conf/httpd.conf

修改本行配置
一般填入网站的域名,如果没有可以写入IP地址

image-20220118175955692

③ 使用systemctl命令重启httpd服务,使用netstat -ntlp命令,查看是否有80端口监听

1
2
3
4
5
[root@yuchao-aliyun ~]# systemctl restart httpd
[root@yuchao-aliyun ~]#
[root@yuchao-aliyun ~]#
[root@yuchao-aliyun ~]# netstat -tnlp|grep 80
tcp6 0 0 :::80 :::* LISTEN 1334/httpd

有80端口存在,并且该httpd服务,网络连接状态已经是LISTEN,监听中了。

好比银行的一个窗口,开始营业,对外服务了,你可以去窗口办理业务,获取数据了!

image-20220118180333764

④ 设置httpd服务开机启动

image-20220118180415913

⑤ 查看本机的IP地址,阿里云服务器从控制台可以看到

image-20220118180516885

阿里云可以看到公网IP地址

image-20220118180538382

⑥在浏览器中,输入本机IP地址,如下图所示:

1
123.57.24.213

7、打开阿里云安全组(图解)

image-20220118181219778

阿里云安全组

image-20220118181310620

添加规则

image-20220118181419766

8、成功访问apache

1
http://123.57.24.213/

并且只要你有网络,其他人就可以访问这个网站。

image-20220118181447597

9、LAMP之MYSQL

阿里云yum源默认是没有mysql的软件的,因此你直接用装不了。

比如

1
yum -y install mysql-community-server

image-20220118181802313

配置mysql的软件rpm源

image-20220118183535112

这个教程去mysql官网即可

==超哥的笔记认第二、谁认第一?==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
https://dev.mysql.com/

http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

# 1.下载mysql的yum源
[root@yuchao-aliyun local]# cd /usr/local/
[root@yuchao-aliyun local]# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

# 2.安装,查看mysql的yum源

[root@yuchao-aliyun local]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-release-el7-5 ################################# [100%]

[root@yuchao-aliyun local]#
[root@yuchao-aliyun local]# ls -l /etc/yum.repos.d/
total 16
-rw-r--r-- 1 root root 675 Jan 18 17:00 CentOS-Base.repo
-rw-r--r-- 1 root root 230 Jan 18 17:00 epel.repo
-rw-r--r-- 1 root root 1209 Jan 29 2014 mysql-community.repo
-rw-r--r-- 1 root root 1060 Jan 29 2014 mysql-community-source.repo

# 3.此时可以安装mysql
yum -y install mysql-community-server

# 4.安装完毕后,启动mysql
完成后,系统自动生成mysql服务管理脚本,systemctl可以去调用
也是我们通过systemctl 去管理的服务的名字

[root@yuchao-aliyun local]# systemctl start mysqld

# 5.查看mysql运行端口,进程
[root@yuchao-aliyun local]# netstat -tnlp|grep mysql
tcp6 0 0 :::3306 :::* LISTEN 1754/mysqld

[root@yuchao-aliyun local]# ps -ef|grep mysql
mysql 1587 1 0 18:43 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 1754 1587 0 18:43 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 12022 1202 0 18:54 pts/0 00:00:00 grep --color=auto mysql

# 6.确保mysql启动后,初始化数据,进行使用
默认的mysql没有密码,没数据,得初始化使用
[root@yuchao-aliyun local]# mysql_secure_installation

# 7.连接mysql服务端
[root@yuchao-aliyun local]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.6.51 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql>
mysql> exit
Bye

这个repo文件,就是指定了一个rpm包的下载地址

image-20220118184049205

安装完成

image-20220118184329677

查看mysql服务的名字,已经启动mysql

image-20220118185011913

查看进程

image-20220118185532624

初始化数据库

image-20220118200937804

连接mysql客户端

image-20220118201119721

c/s模式

image-20220118201350679

查看数据库

image-20220118201700369

10、LAMP安装PHP

1、使用yum安装php即可

1
[root@yuchao-aliyun local]# yum install php -y

image-20220118201847866

2、重启httpd服务

image-20220118202058584

apache是需要和php结合起来工作的,我们这里主要练习yum工具,安装,部署网站,其中原理,超哥会在网站架构篇,详细,通透的讲解其中原理。

1
2
3
4
[root@yuchao-aliyun local]# systemctl restart httpd

1.在安装php之后,重启httpd
2.php能够自动和apache结合工作了。

测试LAMP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.进入httpd,apache的网站根目录,也就是这个网页存放的地方。
[root@yuchao-aliyun local]# cd /var/www/html/
[root@yuchao-aliyun html]#
[root@yuchao-aliyun html]#
[root@yuchao-aliyun html]# vim index.php
[root@yuchao-aliyun html]#
[root@yuchao-aliyun html]# pwd
/var/www/html
[root@yuchao-aliyun html]#
[root@yuchao-aliyun html]# cat index.php
<?php
echo '超哥带你学LAMP、学习Linux云计算';
?>
[root@yuchao-aliyun html]#


2.这里的意思是,我们访问apache,然后看到php脚本,脚本内的代码是打印一句话。

image-20220118202531456

image-20220118202923506

此时我们已经能够正确访问到

一个支持linux+apache+mysql+php体系的系统平台

也已经看到了网站显示的内容

此时你已经准备好了一个LAMP环境,部署论坛网站,换一套代码就好了。

五、部署Discuz论坛

image-20220118203421260

点击下载

image-20220118203654404

码云下载Discuz下载

image-20220118203723417

上传到linux

1.linux里安装lrzsz软件,用于上传下载、或者用FTP。

1
[root@yuchao-aliyun html]# yum install lrzsz -y

2.用命令上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 输入rz命令,xshell自动弹出文件接收功能
# 后面传输大量文件,还是使用FTP工具,一般如XFTP
[root@yuchao-aliyun html]# rz

# 上传到apache的网页根目录,这个目录下,只要存放了HTML文件,php文件,就能访问到
[root@yuchao-aliyun html]# pwd
/var/www/html
[root@yuchao-aliyun html]# ls
DiscuzX-master.zip index.php

# 安装unzip
[root@yuchao-aliyun html]# yum install -y unzip

# 解压缩Discuz代码
[root@yuchao-aliyun html]# unzip DiscuzX-master.zip

# 这个论坛的源代码,就在这里了。
[root@yuchao-aliyun DiscuzX-master]# pwd
/var/www/html/DiscuzX-master
[root@yuchao-aliyun DiscuzX-master]# ls
LICENSE readme README.md upload utility


# 最后异步,需要把/var/www/html/DiscuzX-master/upload下代码,全部移动到 /var/www/html 这个位置,且必须在这个位置

image-20220119092337444

注意看,最终,Discuz论坛的代码,要放在哪里

image-20220119093239048

六、访问Discuz论坛

image-20220119093745895

此时再访问这个apache,也就是阿里云服务器的地址,就可以自动访问到discuz论坛安装界面了。

安装环境监察

image-20220119094158104


image-20220119094219755

发现少了一个关于mysql的连接驱动

image-20220119094716283

安装mysql连接驱动

linux运维的日常就是,根据手册,部署,遇见问题,1、看懂 2、琢磨怎么解决 3、yum可以安装大部分软件,解决大部分问题。

你可以借助搜索引擎,搜索报错信息,找到网络上大部分经验相同的人,如何解决

你可以问超哥 哈哈,有时候,向老师傅请教,能更快的先解决问题,然后自己再吸收这个解决的经验。

上述问题,可以直接yum安装

1
[root@yuchao-aliyun html]# yum install php-mysqli -y

image-20220119095042052

一般有安装更新,软件都会重启,让其生效,我这里访问的是apache,因此重启httpd服务,让这个新驱动生效。

1
[root@yuchao-aliyun html]# systemctl restart httpd

再次访问Discuz安装界面,刷新即可。

image-20220119095326093

解决目录权限问题

image-20220119095508222

1.确认我们的httpd目录,Discuz代码存放的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 页面提示的错误信息,就是这里的目录权限不够
[root@yuchao-aliyun html]# ll
total 12452
-rw-r--r-- 1 root root 2848 Jan 17 10:56 admin.php
drwxr-xr-x 9 root root 4096 Jan 17 10:56 api
-rw-r--r-- 1 root root 727 Jan 17 10:56 api.php
drwxr-xr-x 2 root root 4096 Jan 17 10:56 archiver
drwxr-xr-x 2 root root 4096 Jan 17 10:56 config
-rw-r--r-- 1 root root 1040 Jan 17 10:56 connect.php
-rw-r--r-- 1 root root 106 Jan 17 10:56 crossdomain.xml
drwxr-xr-x 12 root root 4096 Jan 17 10:56 data
drwxr-xr-x 6 root root 4096 Jan 17 10:56 DiscuzX-master
-rw-r--r-- 1 root root 12630971 Jan 18 20:37 DiscuzX-master.zip
-rw-r--r-- 1 root root 5558 Jan 17 10:56 favicon.ico
-rw-r--r-- 1 root root 2245 Jan 17 10:56 forum.php
-rw-r--r-- 1 root root 821 Jan 17 10:56 group.php
-rw-r--r-- 1 root root 1280 Jan 17 10:56 home.php
-rw-r--r-- 1 root root 7044 Jan 17 10:56 index.php
drwxr-xr-x 5 root root 4096 Jan 17 10:56 install
drwxr-xr-x 2 root root 4096 Jan 17 10:56 m
-rw-r--r-- 1 root root 998 Jan 17 10:56 member.php
-rw-r--r-- 1 root root 2371 Jan 17 10:56 misc.php
-rw-r--r-- 1 root root 1788 Jan 17 10:56 plugin.php
-rw-r--r-- 1 root root 977 Jan 17 10:56 portal.php
-rw-r--r-- 1 root root 615 Jan 17 10:56 robots.txt
-rw-r--r-- 1 root root 1274 Jan 17 10:56 search.php
drwxr-xr-x 10 root root 4096 Jan 17 10:56 source
drwxr-xr-x 7 root root 4096 Jan 17 10:56 static
drwxr-xr-x 3 root root 4096 Jan 17 10:56 template
drwxr-xr-x 7 root root 4096 Jan 17 10:56 uc_client
drwxr-xr-x 14 root root 4096 Jan 17 10:56 uc_server

2.添加权限

1
2
[root@yuchao-aliyun html]# 
[root@yuchao-aliyun html]# chmod -R 777 /var/www/html/*

3.再次查看安装

image-20220119100013992

开始安装

image-20220119100103528


image-20220119100322669

如果信息填入正常,php正确读取到mysql数据库,即刻自动安装,数据也会写入到数据库里。

image-20220119100417514

登录admin管理员账户

image-20220119100503908

使用discuz发帖子

image-20220119101530287


image-20220119101636264

至此,基于LAMP环境部署的DIscuz论坛,已经部署完毕了,你学废了吗?

最终,我们还差一个网站的域名解析,就更完美了,但是域名涉及备案流程,较为复杂,我们在学习阿里云计算篇,继续学习。

笔记

image-20250822185905498

image-20250822190141983

image-20250822222005574

02网络基础篇

学习Linux运维,除了要懂系统的知识,还要懂一点网络的基本知识。

因为我们服务器要配置网络,上网环境,以及部署网站,要懂得基本的网络协议,了解其中的网络通信原理、通信流程。并且学会抓取网络数据包,当网络访问出现问题时,或者访问很慢时,能够逐步的排查,找出问题。

前言

image-20220120154626441image-20220120154822897

计算机操作系统、计算机网络、这俩绝对是计算机专业学生的噩梦,因为他们都是相当的复杂,想要学习起来,必然、一定是非常艰苦的,这本书的厚度,谁看到都怕。

因此我们只能尽可能的提取重点,大致理解其中工作逻辑,能够应用在运维工作中即可。

怎么学网络篇(趣谈OSI模型)重要!!

观众朋友们,注意听超哥说,计算机网络说它难,是因为知识点实在是太多了,因为这是好多好多年,积攒而来的一大坨历史。

但是,你可以带着这个想法学习,==你就不想知道,你平时翻墙看的小电影,是怎么传输到你机器上的?==

以下重要!!!!!!!!!!!!

超哥这个解释,隔壁70岁的李老头都能学会。

1.计网的存在本质上是进行通信,是为了端到端之间的通信,所以首先你要考虑,网怎么设计。

2.很久很久以前,超哥家里有一个上网用的猫、并且电脑上还有一个拨号连接,那个年代,如果电脑上网,座机就没法用,那个时候网络是通过电路交换的,这个问题必然会被优化,解决。

3.后来的网络通信,也就是如今的因特网,都是使用数据报进行通信的,数据报就是你访问淘宝网,小电影网,人家网站是如何吧数据发给你的,这个数据遵循一定的传输格式。

4.问题来了,数据是如何传输的,本质上肯定是有物理电路,你得有机器,得有网卡,得插电,因此你需要==将数据转化为物理信号(物理层)==,因此网卡等硬件设备出现。

5.当你有了物理信号,下一步是不是考虑这个信号发给谁?,这个数据应该发给另外哪一台机器?

因此每一台机器都有网卡,都存再MAC地址,并且是全球唯一的MAC地址,因此可以使用MAC地址来寻址,==因此数据链路层诞生了==。

1
2
3
4
5
windows
执行iconfig/all 查看物理地址(mac)
linux
ipconfig 看ether
00:50:56:2e:6c:d

6.但是问题来了 ,上面这个MAC地址是无规律的,如果你有100、10000台机器,或者你要找到网络中的某一台机器,通过MAC来找到机器,这个寻找算法,恐怖到爆炸,根本无法直接使用mac来寻址。==因此IP地址出现了,网络层诞生了==

7.有了IP后,寻找机器就很容易了,但是超哥看小电影,从来都不会只找一个网站,那起码得打开五六个,同时访问,兄弟们是不是不懂于超老师在说什么?

因此这个通信过程就是并行通信,并且网站的数据发给你,可能要考虑数据完整性、比如一个电子邮件;也可能不在意完整性,就要求快,比如你看的小电影;==因此传输层的TCP、UDP协议诞生了。==

8.别急兄弟们,你以为到这就结束了吗?我们上网,需要发邮件,也可能要进行BT下载,也可能要用聊天软件,也可能要进行视频聊天,打游戏,各种需求对吗?

因此,在有了TCP、UDP传输层协议之后,又针对比如网站账户密码的验证、短点续传、比如网站数据的加密处理,以及我们使用的各种应用程序,这么多需求,后来依次出现了 ==会话层 > 表示层 > 应用层。==

网络故事继续

网络层次化

1.你现在有四台电脑,并且互相之间要互相通信,怎么做?

  • 每一台都和其他三台连接起来吗?如果你现在有10台电脑,你的电脑上还有那么多接口吗?
  • 又或者你现在搞一个小盒子,让这个小盒子帮你转发机器之间的数据?帮你通信?这个感觉不错,问题又来了,如果我有一万台电脑,一个小盒子能够吗?不够 ,因此我们可以准备多个小盒子,比如一个盒子连接100个电脑,然后小盒子之间再连接起来,是不就解决了。

这个连接电脑,小盒子之间的介质,比如电话线、网线、光纤。

image-20220120173417621

你把电脑和小盒子连接这个称之为接入网,你会发现当网络中的机器数量太多,小盒子数量太多,就必然要进行分层了,这就是==网络的层次化==概念。

IP、路由器、DHCP、NAT

刚才讲了,在整个网络环境中,电脑之间相互找到,得采用有规律的IP地址,谁帮你去干活,解析IP,找到目标机器的呢?就是==路由器==,你想,你在家上网,电脑是不是插在了路由器上?

  • ==IP地址目前是IPv4==,并且被分成了五类(ABCDE),但是全世界有N台电脑,IP地址不够用啊,因此出现了==子网划分。==
  • 回来说我们自己的电脑,问题是你电脑的IP是谁给你的,是你自己设置的吗?其实是有==DHCP(动态主机配置协议)==这个程序自动给你电脑分配了IP地址。
  • 问题又来了,还是IP不够用的问题,因此后来诞生了局域网、公网的区别,因此==NAT(网络地址)==诞生了,专用网络不再占用公网IP数量。

专用网

专用网,说的是

  • 局域网
    • 比如超哥家里有一个华为路由器,提供了一个局域网环境,在同一个WIFI下的设备,都能够互相通信。
    • 比如于超老师的所在的学校、教室,也是一个局域网。
    • 局域网用于较小规模的一个网络区域,通过某种介质互相连接的机器,比如打印机,台式机,笔记本,移动设备等。
  • 广域网
    • 比如军队,铁路,交通,电力等单位,有自己超大的网络范围,跨城市,甚至国家,有自己专用的网络环境,是对外封闭的,也就是我们说的VPN。

局域网、交换机、MAC、NAT

于超老师所在的教室,是一个局域网环境,比如我们教室内的50个学生都要上网,学习,问题来了,路由器哪有50个接口让你插?这家伙,==交换机==这不就诞生了吗?

因为交换机有更多的插口,并且如果你不需要上外网,只要这50台机器内部局域网通信,就不需要路由器了,用交换机就好了。

交换机是基于MAC寻址的,因为局域网范围并不大,你比如超哥的教室就50个同学,找起来完全不费劲啊。

交换机是工作在一个叫做==ARP协议==上的,这个协议的作用是对IP和MAC的一个映射,并且ARP处在==链路层(MAC)和网络层(IP)之间的。==

那么问题又来了,你咋这么多问题?欠揍么不是?

你打我我也得问啊,为什么要用==ARP对IP和MAC的映射?==

因为在==应用层、传输层之==间,通信的目标地址都是IP地址,简单理解就是,你访问某个小电影的网站,那个网站的链接本质上是被解析为了IP地址,最终要解析为MAC地址,数据才发给了这个网站的服务器网卡。

最后一个问题超哥,我们教室内的同学,为什么能够访问www.yuchaoit.cn,因为==路由器提供了NAT。==

好,满足你,我继续讲。

image-20220120183342841

NAT是Net Address Translation的缩写,即网络地址转换

NAT部署在网络出口的位置,位于内网跟公网之间,是连接内网主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网IP。

你的家庭和办公网络环境大多是经过NAT路由中转的方式联网。这也意味着你在家PC通过WIFI联网,你在PC上通过命令行(ifconfig)查看到的IP地址(内网),跟通过baidu查看到的IP地址(公网),不一样,这也能证明你的PC处于NAT后面。

NAT解决什么问题?

NAT主要用来解决IPv4地址不够用的问题。

域名

最后,你还是不死心,冒着被打的风险,也要再问一句,于超老师,为什么你的网站叫做www.yuchaoit.cn,这个名字就能找到你的机器?

因为我如果告诉你我的机器IP地址是123.206.16.61,请问你能记得住吗兄弟。

因此DNS域名解析服务诞生了,它自动的帮助你,只要你访问www.yuchaoit.cn,就给它转换为了123.206.16.61,至于DNS是什么,超哥后面会详细,具体的给你讲,因为这是运维必须会的。

吸收理解下,兄弟们。

1、什么是通信

通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递

从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法,任意媒质,将信息从某方准确安全地传送到另方

通信在不同的环境下有不同的解释,在出现电波传递通信后,通信一般被理解为是信息的传递,由一个地方向另一个地方进行信息的传输与交换,目的在于传输消息。

通信在人类实践过程中,随着生产力的发展对传递消息的要求不断提升,人类通信文明不断进步

利用传输消息的通信方式称为电信,这种通信具有迅速、准确、可靠等特点,并且不受时间、地点、空间、距离的限制

在古代,人类通过驿站、飞鸽传书、烽火报警、符号、身体语言、眼神、触碰等方式进行信息传递。

在现代科学水平的飞速发展,相继出现了无线电、固定电话、移动电话、互联网甚至视频电话等各种通信方式。通信技术拉近了人与人之间的距离,提高了经济的效率,深刻地改变了人类的生活方式和社会面貌 。

邮政通信

以实物传递为基础,虽然如今写信的人越来越少,但越简单越真实,越纯朴越真情,信件是信息传递最简单最纯朴的方式,更不因传递速度过快造成信息的溢漏;快递是人类社会发展的的需要,主要原因是因为随着人类物质生活水平的提高服务需求面也越来越高,但其发展受交通运输制约无便利的交通运输怎么也快不起来。

image-20191209103445673

烽火台

烟墩,古代用于点燃烟火传递重要信息的高台,是古代重要的军事防御设施,是古代最老但是最有效的土电报,用于防止敌人入侵,有敌情则白天施烟,夜间则点火,台台相连,传递信号。

image-20191209103501997

电话

电话分固定电话、移动电话与网络电话,其传递方式与网络方式优缺点基本相同,与网络方式不同之处在于电话不能直接传递文字图片,与邮递方式不同在于不能传递实物。

img

传真

传真是近二十多年发展最快的非话电信业务。将文字、图表、相片等记录在纸面上的静止图像,通过扫描和光电变换,变成电信号,经各类信道传送到目的地,在接收端通过一系列逆变换过程,获得与发送原稿相似记录副本的通信方式,称为传真。

传真的主要技术有:扫描技术,记录技术,同步同相技术,传输技术。传真的通信过程包含扫描,光电变换,图像信号的传输,记录变换,收信扫描和同步同相。

传真是基于PSTN的电信信号通过设备中转传真信号。直接由于科技大迅速发展,电子网络传真逐渐成为取代传真机的新一代通信工具。

img

电报

电报,就是用电信号传递的文字信息。通讯越来越迅捷,电报的作用已经不是很大了,也许有一天电报就会从我们的生活中消失了。

电报是通信业务的一种,是最早使用电进行通信的方法。它利用电流(有线)或电磁波(无线)作载体,通过编码和相应的电处理技术实现人类远距离传输与交换信息的通信方式。

电报大大加快了消息的流通,是工业社会的其中一项重要发明。早期的电报只能在陆地上通讯,后来使用了海底电缆,开展了越洋服务。到了二十世纪初,开始使用无线电拍发电报,电报业务基本上已能抵达地球上大部份地区。电报主要是用作传递文字讯息,使用电报技术用作传送图片称为传真。

img

计算机

计算机通信是面向计算机和数据终端的一种现代通信方式.可以实现计算机与计算机、人与计算机之间数据信息的生成、存储、处理、传递和交换从计算机应用的广泛与深入的角度出发。

要求处于不同地理位置的计算机系统之间能够交换消息。共享资源.以至协同工作,更好地完成给定的任务。

2、计算机网络导学

  • ==计算机网络学习的核心内容就是网络协议的学习。==
  • 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。
  • 因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。

一个很形象地比喻就是我们的语言,我们大天朝地广人多,地方性语言也非常丰富,而且方言之间差距巨大。

A地区的方言可能B地区的人根本无法接受,所以我们要为全国人名进行沟通建立一个语言标准,这就是我们的普通话的作用。

同样,放眼全球,我们与外国友人沟通的标准语言是英语,所以我们才学习英语。

image-20220119142500161

计算机网络协议同我们的语言一样,多种多样。

目前TCP/IP协议已经成为Internet中的”通用语言”,下图为不同计算机群之间利用TCP/IP进行通信的示意图。

image-20220120150140134

网络构成要素

构建网络所需的硬件一般包括交换机、路由器等网络硬件,以及个人计算机、服务器等计算 机硬件,这些硬件统称为节点,节点之间可以通过链路进行连接。

image-20220121095947968

节点(node) 计算机、交换机、路由器等构成网络的硬件均可称为通信 节点
链路(link) 泛指将各个节点进行连接的逻辑线路,物理上可以使用有 线线缆或者无线电波
主机(host) 通过网络为其他机器提供服务的计算机,也称为服务器
客户端(client) 指从主机处获得服务的计算机(如个人计算机等),也称为 终端或者Terminal

LAN和WAN

image-20220121100152601

在家庭、学校内构建的局域网环境,叫做(Local Area Network、本地网、局域网),也就是你家里的路由器,你的笔记本,台式机应该通过网线,插在这个LAN口,这下是不是明白为什么了。

而这个WAN口,一般都是和网络运营商提供给你的猫连接在一起,也就是外部的互联网,是从这里连接的。

WAN是英文Wide Area Network的首字母所写,即代表广域网;

image-20220121100624453

网络层次划分(重要OSI七层模型)

==为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络==,国际标准化组织(ISO)在1978年提出了”开放系统互联参考模型”

即著名的OSI/RM模型(Open System Interconnection/Reference Model)。

它将计算机网络体系结构的通信协议划分为七层。

image-20220120151241369

==其中第四层完成数据传送服务,上面三层面向用户。==

image-20191209134336149

网络体系结构分层

image-20191209134411108

计算机网络组成

不同的人对计算机网络有不同的定义。

目前得到普遍认可的定义是:所谓计算机网络,是指一些互相连接、自治的计算机的几何

也许这样说有些抽象。那我们可以简单理解下。“互连”就是指连接的两台或者两台以上的计算机能够互相交换信息,达到资源共享的目的。

而“自治”则意味着每台计算机的工作是独立的。任何两台计算机之间不存在主从关系。

今天,我们简单了解下计算机网络的组成。

计算机网络有网络硬件网络软件两部分组成。

==硬件是网络运行的实体,软件则是支持网络运行、开发网络资源使用效率,挖掘网络潜力的工具。==

计算机网络的作用(重要)

1、数据通信

信息化时代的到来,改变了人们的生活方式。社交软件、远程传输文件软件等都利用了计算机网络。

人们用U盘很少了,发文件,微信发送,QQ发送。

Excel、word都进行云协作,这些功能的根本,在于云计算+网络。

计算机网络的数据通信功能,可以对分散的对象进行实时的、集中的跟踪管理与监控。

除此之外,计算机网络还可以给科学家和工程师们提供一个网络环境,在此基础上可以建立一种新型的合作方式——计算机支持协同工作。

2、资源共享

资源共享是计算机网络最基本的功能之一,也是早期建网的初衷。

在计算机网络中,资源包括软件资源及要传输和处理的数据信息资源

网络中某些计算机及外围设备价格昂贵,如巨型计算机、激光打印机等,采用计算机网络进行资源共享可以减少硬件设备的重复购置,从而提高设备的利用率。

软件共享避免了软件的重复购置或重复开发,通过实现分布式的计算和存储方式,使某一软件可以全网共享,从而降低成本。

用户数据是非常有价值的资源,也可以通过计算机网络进行共享。

3、提高可靠性(服务器集群)

在一个单机系统中,如果某个部件或者计算机发生故障,则必须通过替换资源来维持系统的继续运行。否则系统无法正常工作。

在计算机网络中,设备是彼此相连的。如果一个设备出现故障,可以通过网络寻找其他机器来代替本机工作。

每种资源可以存放在多个地点,用户可以通过多种途径来访问网内的某个资源,从而避免了单点失效对设备产生的影响。

4、提高系统处理能力(集群、高性能计算)

单机的处理能力是有限的。

从理论上来讲,同一网内的多台计算机可以通过协同操作和并行处理来提高整个系统的处理能力,并使网内各计算机负载均衡。

当网络中某一台计算机的处理负担过重时,可以将其作业转移到其他空闲的机器上去执行,从而提高系统的利用率,增加整个系统的利用率。

5、分布式处理(分布式计算)

在计算机网络中,可以将某些大型处理任务分解为多个小型任务,从而分配给网络中的多台计算机处理,如分布式数据库系统。

计算机网络技术还可以把许多小型机或微机连接成具有大型机处理能力的高性能计算机系统。

其实,从应用角度来阐述,计算机网络还有许多其他功能。

我相信,随着网络技术的不断发展,各种网络应用将会层出不穷。那时,计算机网络的更多功能也会被人们发现和认可。

网络硬件

计算机网络的组建过程中,涉及到的网络硬件可以分为四类。分别是:计算机设备、网络接口设备、传输媒体和网络互连接设备

1、计算机设备

计算接设备按照在网络服务中扮演的角色,可以分为网络服务器网络工作站两部分。

  • 在计算机网络中,分散在不同地点承担有一定的数据处理人物并且负责提供资源的计算机设备称为服务器
  • 服务器是网络运行、管理和提供服务的中枢,是网络系统中的重要组成部分,她直接影响着网络的整体性能。
  • 一般采用具有较强的计算能力和较大的存储能力的高档计算机做服务器。

image-20220119143255028

在计算机网络中,只向服务器提出请求而不为其他计算机提供服务的计算机设备称为工作站

工作站通过网络接口设备连接到网络上,它保持原有计算机的功能,作为独立的个人计算机为用户服务,同事有可以按照被授予的权限访问服务器。

工作站之间可以进行通信,也可以共享网络资源。

终端是另一种形式的工作站。

简单总结,我们平时使用的个人笔记本+xshell软件,连接上阿里云服务器,这就是一个终端。

终端有这几类,你未来会接触到(终端就是用于连接服务端的)

  • 个人机器远程连接
  • 你去机房,直接打开命令行操作服务器

2、网络接口设备

网络接口设备是连接计算机设备与传输媒体的设备,常用的网络接口设备有网络接口卡、调制解调器等。

网络接口卡简称网卡或者网板,也称为网络接口适配器。

网卡的主要功能是进行信息收发和编码转换。

在接收传输媒体上发送信息时,网卡把传来的信息按照网络上信号编码要求交给主机处理;在主机向网络发送信息时,网卡把发送的信息按照网络传送的要求配成帧的格式,然后采用网络编码信号向网络发出。

不同的类型有不同的网卡,常见的网卡有以太网卡、无线网卡、USB网卡。

image-20220119144705654

调制解调器是调制器和解调器的简称,俗称“猫”。

调制解调器是实现计算机通信的外部设备,主要功能是实现数字信号与模拟信号之间的转换。

调制解调器按照外观可分为内置式、外置式、和PC卡式。

image-20220119144730586

3、传输媒体

传输媒体也成为传输机制或传输媒介,它负责将计算机网络中的多种设备连接起来,提供数据传输的物理通道。

传输媒体可以分为两大类:导向传输非导向传输

==导向传输媒体包括双绞线、同轴电缆光缆等;而非导向传输媒体包括无线电、微波和卫星通信等。==

双绞线也称为双纽线,是一种最古老也最常用的传输媒体。

==也就是我们最常见的网线,内部的线对是按逆时针方向紧密的缠绕在一起的,两两相互缠绕的做法有利于减低内部的串扰和减少外部的干扰==

双绞线分为非屏蔽双绞线和屏蔽双绞线两种。

image-20220119144930666

同轴电缆是一种由地不对称的同轴管构成的通信回路,它由内导体铜质芯线、绝缘体、网状编织的外导体屏蔽层以及塑料保护外层所组成。

光缆由一组光纤加包带层和外护套组成。

光纤分为多模光纤和单模光纤两类。

无线传输媒体利用无线电波在自由空间的传播来实现信息的传输,长用在有线铺设不便的特殊地理环境,或作为地面通信系统的备份和补充。

4、网络互连设备

网络互连设备是计算机网络的重要组成部分,它们用于将主机连接成网络,也用于将不同的网络互连起来。

中继器、网桥、路由器网关是四种最基本的网络互连设备。在实际组网中,还会用到集线器、无线接入点交换机等组网设备,它们属于某种基本网络互连设备的变形。

image-20220119145109009

网络软件

网络软件是实现网络功能不可缺少的软环境,网络软件通常包括网络操作系统、网络协议软件、网络应用软件和网络管理软件等。

1、网络操作系统

网络操作系统是为使网络用户能方便而有效地共享网络资源而提供的各种服务的软件及相关规程的集合,它直接运行在网络硬件基础之上。

==网络操作系统是网络的核心,其他网络软件需要网络操作系统的支持才能运行。==

常见的操作系统有UNIX,Windows,Linux等。

image-20220119145427593

2、网络协议软件

连接到计算机网络上的计算机依靠网络协议才能进行相互通信,而网络协议要依靠具体的网络协议软件的运行支持才能工作。

网络管理软件和网络应用软件都要通过网络协议软件才能发生作用。

网络协议软件有很多,TCP/IP、IEEE 802系列协议等均有各自对应的协议软件。

3、网络应用软件

网络应用软件是在网络环境下直接面向用户的软件。

计算机网络通过网络应用软件为用户提供信息资源的传输和共享服务。

网络应用软件可分为两类:一类是由网络软件厂商开发的通用应用工具;一类是基于不同的用户业务的软件。

有哪些软件?

  • 如浏览器,就是一个网络应用软件
  • QQ
  • 微信
  • 文件传输工具

image-20220119150643898

网卡是硬件、结合网络连接软件,共同为用户提供网络传输功能。

1.读入其他网络设备传过来的数据包,然后拆包,将其变为本机可以看得懂的数据.

2.把本机的数据,打包后,发送给网络中的其他设备。

3、计算机网络分类

计算机网络根据不同的标准可以分为不同的类别。常见的分类有如下四种。

一、按照网络的覆盖范围进行分类

从网络的覆盖范围进行分类,计算机网络可以分为局域网、广域网和城域网。

1、局域网

局域网是在局部区域范围内将计算机、外设和通信设备通过高速通信线路互连起来的网络系统。

常见于一栋大楼、一个校园或一个企业内。

局域网所覆盖的区域范围较小,一般为几米甚至十几公里,但其连接速率较高。

局域网在计算机数量配置上没有太多的限制,少的可以只有两台,多的可达上千台。

局域网是最常见、应用最为广泛的一种网络,其主要特点是覆盖范围较小,用户数量少,配置灵活,速度快,误码率低。

无线局域网

无限局域网,是目前很主流的形式了。

无线局域网与传统的局域网主要不同之处就是传输介质不同,传统局域网都是通过有形的传输介质进行连接的,如同轴电缆、双绞线和光纤等,而无线局域网则是采用空气作为传输介质的。

正因为它摆脱了有形传输介质的束缚,所以这种局域网的最大特点就是自由,只要在网络的覆盖范围内,可以在任何一个地方与服务器及其它工作站连接,而不需要重新铺设电缆。

image-20220119152223988

2、广域网

广域网也称为远程网,所覆盖的地理范围可从几十平方公里到几千平方公里,它一般是将不同城市或不同国家之间的局域网互联起来。

广域网是由终端设备、结点交换设备和传送设备组成的,设备间的连接通常是租用电话线或用专线建造的。

3、城域网

城域网的覆盖范围在局域网和广域网之间,一般来说,是将一个城市范围内的计算机互联,这种网络的连接距离约为10~100公里。

城域网在地里范围上可以说是局域网的延伸,连接的计算机数量更多。

img

局域网 > 城域网 > 广域网

img

比如超哥的公司总部在北京,分公司遍布全国各地,如果将全国所有的分公司都通过网络连接起来,一个分公司就是一个局域网,整个企业的网络就是一个广域网。

2、从网络的连接范围进行分类

从网络的连接范围进行分类,计算机网络可以分类互联网、内联网和外联网。

1、互联网

互联网是指将各种网络连接起来形成的一个大系统,在该系统中,任何一个用户都可以使用网络的线路或资源。

2、内联网

内联网是基于互联网的TCP/IP协议,使用WWW工具,采用防止入侵的安全措施,为企业内部服务,并有链接互联网功能的企业内容网络。

内联网是根据企业内部的需求设置的,它的规模和功能是根据企业经营和发展的需求而确定的。

可以说,内联网是互联网更小的版本。

3、外联网(VPN)

外联网是指基于互联网的安全专用网络,其目的在于利用互联网把企业和其贸易伙伴的内联网安全地互连起来,在企业和其贸易伙伴之间共享信息资源。

4、计算机网络拓扑

前面我们介绍了计算机网络常见的几种分类。我们了解下常见的网络拓扑结构。

网络拓扑是由网络结点设备(包括计算机设备和网络互连设备)和传输媒体构成的网络结构图。

采用拓扑学的方法,将网络单元抽象为“点”,传输媒介抽象为“线”,这样计算机网络系统就变成了由“点”和“线”组成的几何图形。

这种采用拓扑学方法抽象出的网络结构就成为计算机网络的拓扑结构。

==常见的计算机网络的拓扑结构有总线结构、环状结构、星状结构、树状结构、网状结构及复合型结构。==

总线结构

总线结构是通过一条通信线路将所有的入网计算机连接起来,从而形成一条共享的信道,这条共享信道就称为总线。

  • 多台机器公用一条传输信道,信道利用率较高,成本低;
  • 连接数有线,传输速度上,因为用户增加而下降。
  • 同一时刻只有两台机器通信,其他机器得等待;
  • 某个机器损坏不影响整体,但是如果总线断了,整个网络环境就瘫痪。

简单理解,一根绳上的蚂蚱,总线结构。

image-20220119161008101

总线型结构就像一张树叶,有一条主干线,主干线上面由很多分支.

缺陷:一切的数据都需经过总线传送,总线成为整个网络的瓶颈;呈现毛病诊断较为困难。

别的,由于信道同享,衔接的节点不宜过多,总线自身的毛病能够导致体系的溃散。

最著名的总线型结构结构是以太网(Ethernet)。

环状结构

环状网络是将入网计算机通过通信线路连接起来形成一个闭合的环。

在该拓扑中,线路是公用的,数据一般按固定方向单向流动,每个收到数据包的结点都向它的下游结点转发该数据包。数据包在环上旅行一圈,最后由发送结点回收。

环形结构各结点经过通信线路组成闭合回路,环中数据只能单向传输,信息在每台设备上的延时时刻是固定的。特别合适实时操控的局域网体系。

环形结构就如一串珍珠项圈,环形结构上的每台计算机便是项圈上的一个个珠子.

image-20220119161120923

特点

  • 单个环网的节点数量有限;
  • 某个单点故障,导致整个网络环境瘫痪。

长处:结构简略,合适运用光纤,传输间隔远,传输推迟确认。

缺陷:环网中的每个结点均成为网络牢靠性的瓶颈,恣意结点呈现毛病都会形成网络瘫痪,别的毛病诊断也较困难。最著名的环形结构网络是令牌环网(Token Ring)

星状结构

星状结构中,每一个计算机都通过单一的通信线路与中心交换结点直接相连。

在该拓扑结构中,中心交换结点是唯一的转换结点。

其他结点中间的通信必须通过中心交换结点转发。

星型结构是一种以中央节点为中心,把若干外围节点衔接起来的辐射式互联结构。

这种结构适用于局域网,特别是近年来衔接的局域网大都选用这种衔接方法。这种衔接方法以双绞线或同轴电缆作衔接线路。

image-20220119161201707

特点

  • 集中式管理机器;
  • 每一个节点通信必须通过中心点连接,线路利用率低;
  • 中心点压力很大,因为任意两台节点数据交换,必须经过中心点;
  • 某个机器挂掉不影响整体,中心点挂掉,网络直接瘫痪。

image-20220119154446560

长处:结构简略、简略完成、便于办理,通常以集线器(Hub)作为中央节点,便于网络保护。

缺陷:中心结点是全网络的牢靠瓶颈,中心结点呈现毛病会导致网络的瘫痪。

树状结构

树状结构是星状结构的一种变形。

树状结构采用了分层结构,即将原来用单独通信线路直接连接的结点通过多层交换结点进行分层连接。

树状拓扑结构也具有一定的集中控制功能,该拓扑中除了最下层叶子节点之外的所有根节点和子树节点都是转接节点,可以为其他节点转发数据。

树形拓扑结构是一种层次结构,结点按层次连结,信息交流首要在上下结点之间进行,相邻结点或同层结点之间一般不进行数据交流。

树形拓扑结构是便是数据结构中的树。

image-20220119155754130

特点:

  • 比星状结构更容易扩展,容易故障隔离
  • 其余和星状一样

长处:连结简略,保护方便,适用于聚集信息的运用要求。

缺陷:资源同享能力较低,牢靠性不高,任何一个工作站或链路的毛病都会影响整个网络的运行。

网状结构

网状结构,又称为分布式结构,是由分布在不同地点并且具有多个终端的结点机相互连接而成的。

网状而机构又分为全连接网状结构和不完全连接网状结构两种形式。

在全连接网状结构中,每一个结点与网中的其他结点均通过通信线路连接。

在不完全连接网状机构中,两个结点之间不一定有直接通信线路连接,它们之间的通信需要通过其他结点转接。

image-20220119161418767

长处:体系牢靠性高,比较简略扩展,可是结构复杂,每一结点都与多点进行连结,因而有必要选用路由算法和流量操控方法。

现在广域网基本上选用网状结构。

星型网络拓扑结构在以上几种网络拓扑结构中运用最多,结构简略,便于办理的特色,深受网络办理者的认可。

对比

image-20220119161740652

5、网络硬件设备(重点)

image-20220119175241025

大家在跟着于超老师学习linux时,通过vmware搭建环境,有没有考虑过,你的这个(假的机器)vmware,以及安装好的linux系统,是怎么上网的?

网卡、网线

==第一步,机器上插入网卡==

机器上要插网线上网,都得安装网卡,都是以太网网络接口

每一个以太网适配器(网卡)都有一个插孔,用于接收传输数据的电缆,电缆将计算机连接到集线器、交换机、或者路由器上。

电缆可能由铜线或光缆制成。

通常的光纤以太网卡用于特殊情况,比如需要严格的网络环境,抗电器干扰,以及超远距离时,采用光纤。

大多数计算机都会内置==以太网网络适配器==,没有的话,可以额外添加即可。

image-20220119172510926

一般的网络计算机课程,都主要围绕着网络协议展开讲解,但是物理层面也是非常重要的,你要知道,一切的软件技术,在断电、断网等物理攻击下,都是渣渣。。

关于网线

==老鼠攻击==

大家不要觉得于超老师在开玩笑,老鼠攻击是很常见的事情。

你要说交换机等网络设备自然瘫痪,机会较小,而光纤和网线被老虎咬坏是挺常见的。

一些环境比较简陋的机房,很有可能就有老鼠,机房经常能看到老鼠屎,甚至要请灭鼠专家去打。

image-20220119175622854

因此标准的机房线缆是要走桥架或者管线的,都是为了降低物理故障。

image-20220119180103916

多年前的支付宝崩溃事故

支付宝的技术,全世界也能排得上名号,但是。

image-20220119180227624

其他人为物理层攻击,更是多不胜数,所以等级保护中,物理安全放在第一位。

防火墙、入侵检测买得再多,机房没没锁,黑客把你服务器抱走了,也只能两眼泪汪汪。

常见网络传输介质有:同轴电缆、双绞线、光纤,下面我们将一一为大家分享这三种传输介质特点与应用场景。

同轴电缆

同轴电缆曾经是网络传输的主要介质,随着时代发展,现在已经渐渐淘汰。

在模拟监控中还有部分应用,当然现在模拟监控也越来越少了。

如图,早年使用同轴电缆组网的以太网:

image-20220119180709110

如图所示,同轴电缆由内部铜芯、绝缘层保护、外导体(屏蔽层)、外层绝缘体/保护层组成,可用于模拟监控、模拟广播。

双绞线

双绞线是由多组绝缘铜导线相互缠绕而成的线缆,双绞线内部介质也是铜线,内部传输为电信号,根据电磁原理,变化的电流会产生磁场,缠绕目的是:两两抵消磁场,降低信号干扰。

image-20220119180811668

最早双绞线只有2芯,用于电话数据传输,现在已经淘汰,目前主流的双绞线都是4对8芯,但需要注意:

双绞线传输速率100M—用到4根,2对(1、2、3、6)

双绞线传输速率1000M—使用8根(全部使用)

屏蔽双绞线和非屏蔽双绞线

双绞线可以分为屏蔽双绞线和非屏蔽双绞线,前者由锡箔保护层,能有效防止数据泄密,同时降低外部环境对数据传输的干扰,我们日常项目中使用最多的是非屏蔽双绞线,价格较低。

image-20220119181020809

给大家分享两个小故事

  1. 某航天科工企业,发送火箭,如果内部传送数据由于干扰,有0.01度的偏差,导弹从中国打到美国,可能就偏离了目标几百公里。故此类高可靠场景,肯定要用屏蔽双绞线,防止外部环境对内部数据产生干扰。
  2. 分享一个安全厂商朋友介绍的案例:我国新一代歼击机G20,所有图纸、性能材料都被美国窃取了,窃取的方式也很简单,开车绕成都飞机工业集团(后面简称成飞)绕了两圈。核心原理是:G20数据在内网通过网线传输,传输的是电信号,由于电磁感应,会产生磁场,美国人正是分析磁场,逆向得出网络里传输的数据,听起来不可思议吧!如果有兴趣,去百度一下“震网事件”,看美国人怎么一步步干掉伊朗核设备,那更不可思议。

说了这么多,如果成飞采用了屏蔽双绞线,那么美国佬想窃取数据,就没那么容易了。

所以很多涉密场景,会使用屏蔽双绞线、屏蔽机柜、屏蔽机房、红黑电源。

没出问题,看来这些操作很麻烦,多此一举,但很多行业出了问题,那就是大问题,掉帽子,掉脑袋的问题!

光纤

光纤是一种传输工具,就如同一根细细的塑料丝,很细的光纤会被封装在塑料套中,用作长距离的信息传递。所以光缆是包含光纤的。

image-20220119194146006

光纤是利用光在玻璃或塑料纤维中的全反射原理而达成的光传导工具。

光在光导纤维的传导损耗比电在电线传导的损耗低得多,光纤被用作长距离的信息传递。

光纤特点:重量轻,体积小、传输远(衰减小)、容量大、抗电磁干扰。

光缆一般由多根光纤和塑料保护套管及塑料外皮构成。

光缆是由一定数量的光纤组成缆芯,外面包裹有护套和保护层,用于通讯,远距离大容量信息传输。

image-20220119194241290

光纤长什么样

image-20220119181720804

1.光纤盒,光纤宽带接入设备,你可能在村里见过这个设备。

image-20220119182042366

光纤箱

image-20220119182104358

家庭光猫

image-20220119182144352

虚拟网卡

==第二步,安装vmware,会自动安装好,虚拟以太网适配器==

机器上安装的网卡是硬件,操作系统上与之对应工作的是以太网适配器,作用是将机器和局域网(LAN)连接,进行网络数据传输。

(以太网适配器,以下统称网卡)

有两个是vmware安装的虚拟网卡

image-20220119170617475

不论是局域网、城域网还是广域网,在物理上通常都是由“网卡、集线器、交换机、路由器、网线、RJ45接头(水晶头)”等网络连接设备和传输介质组成的。

网络设备及部件是连接到网络中的物理实体,种类繁多,基本的网络设备有“计算机(无论是个人电脑或服务器)、中继器、集线器、路由器、交换机、防火墙、网桥、网关、网卡(NIC)、打印机、调制解调器、光纤收发器、光缆”等。

常见的网络设备有哪些?你都认识几个?

服务器 Server

服务器是计算机网络上最重要的设备。

服务器,指的是在网络环境下运行相应的应用软件,为网络中的用户提供共享信息资源和服务的设备。服务器的构成,与PC机(个人电脑)基本相似,有“处理器、内存、硬盘、网卡、系统总线”等。

但服务器是针对具体的网络应用特别制定的,因此服务器与PC机(个人电脑)在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面存在着很大的差异。

通常情况下,服务器比PC机(个人电脑)拥有更强的处理能力、更多的内存和硬盘空间。服务器上的网络操作系统,不仅可以管理网络上的数据,还可以管理用户、用户组、安全组和应用程序等。

服务器是网络的中枢和信息化的核心,具有“高性能、高可靠性、高可用性、I/O吞吐能力强、存储容量大、联网和网络管理能力强”等特点。

image-20220119164239813

服务器的选择:

1、性能要稳定。为了保证网络能正常运转,所选择的服务器首先要确保稳定性。另一个方面,性能稳定的服务器意味着能为公司节省维护费用。

2、要考虑扩展性,为了减少更新服务器带来的额外开销和对工作的影响,服务器应当具有较高的可扩展性,可以及时升级或调整配置来适应发展。

3、便于操作和管理。

4、能满足特殊要求。

5、硬件搭配要合理。为了能使服务器更加高效地运行,要确保所购买的服务器的内部配件的性能必须合理搭配。

集线器 Hub

集线器(即HUB,物理层设备)是一种==将多条双绞线或光纤==集合连接在同一段物理介质下的设备,通常工作在物理层(即OSI参考模型第一层),用于连接局域网段。

集线器拥有多个端口,当其中一个端口接收到信号后,会将衰减的信号整形放大,然后再将放大的信号广播转发给其他所有端口,以便局域网的所有段都可以看到数据包。(集线器不知道这数据包该发给谁)

特点:

1.扩大网络的传输范围,是一个标准的共享式设备,增加网络内的节点;

2.==所有端口共享一条带宽,同一时刻只能有2个端口能传送数据,其他端口只能等待,传输效率很低,比如有一个集线器有8个口,每个口只有1/8的带宽。==

3.无法保证数据传输的完整性和正确性

因此已被淘汰,是一个笨蛋网络设备,只起到了信号放大和传输的作用。

集线器.gif

==**工作过程:**集线器的工作过程是非常简单的,它可以这样的简单描述:首先是节点发信号到线路,集线器接收该信号,因信号在电缆传输中有衰减,集线器接收信号后将衰减的信号整形放大,最后集线器将放大的信号广播转发给其他所有端口。==

image-20220120151758743

为什么集线器被淘汰

一个比较严重的问题是,如果一个大型的局域网,比如有500台机器,全部用HUB连接的,后果会怎么样呢??相当慢,网络的效率极差!

为什么?如果500台机器都发一个包,那就是说每台机器,都需要接收差不多499个无用包…并且如果是需要回应的话……无用的数据包会充斥着整个的局域网,这就是传说中的广播风暴!

为了减少广播风暴,网桥产生了。

中继器

在介绍网桥之前,还想简单介绍另一个物理层的设备:“中继器”,这种设备的作用是把物理层传输的信号放大,由于长距离的传输,信号会有一定的损耗的,这种设备主要解决的就是这个问题。

比如在地铁,商场底下等信号环境很差的地方,就需要用中继器,放大信号。

所以中继器就是一个信号增强设备,并且属于OSI模型的第一层、物理层,它的功能就是将被噪声影响的信号,重新输出,没有任何数据上的控制。

image-20220119204528725

中继器

image-20220119204702723

信号在传输过程中会不断衰减,为了不让信号衰减对通信产生影响,产生了中继器:仅做放大信号用,把信号传导偏远的地方。

它和HUB的区别是:HUB主要是为了在物理层上转发数据的,所以它不关心电压值的大小,也不会放大物理信号;

而中继器它的作用就是为了放大信号用的。

网桥

理解“网桥”的含义

也有人把“网桥”比喻成一个聪明的中继器(Repeater)。因为中继器只是对所接收的信号进行放大,然后直接发送到另一个端口连接的电缆上,主要用于扩展网络的物理连接范围;

而网桥除了可以扩展网络的物理连接范围外,还可以对MAC 地址进行分区,隔离不同物理网段之间的碰撞。

集线器和中继器都是物理层设备,而网桥属于二层设备

==网桥又称桥接器,英文名Network Bridge,数据链路层设备。它也是转发数据包的设备,但和HUB不一样的是,它工作在数据链路层,HUB只能看懂物理层上的东西(比如一段物理信号),网桥却能看懂一些帧的信息(在链路层上,把上面传下来的数据封装后,封装好了的数据就是帧,但这里我用“数据包”这样的泛指去代替“帧”这个专业术语)。==

image-20220120152200385

交换机

交换机是种用于光/电信号转发的网络设备,通常工作在数据链路层或网络层(即OSI参考模型的第二层和第三层),支持各种数据包协议。

特点:

交换机的每一个端口所连接的网络都是独立的,独享带宽;

交换机能够进行地址学习,记录源端口、目标端口的MAC地址,维护一个MAC地址表;

隔离冲突域,每个端口工作时,不影响其他端口的工作。

image-20220121140150237

主要用于根据MAC地址进行数据的转发和交换。

交换机.gif

交换机在数据链路层运行,是一个多端口网桥。

交换机中维护一张 Port-MAC 映射表,记录每个端口上的主机的 MAC 地址。

跟集线器相比,交换机记录每个端口上主机的 MAC 地址,每次转发数据时都只会发送到指定的端口,而不是广播到所有主机,效率高。

image-20220121102202722

交换机就是按照两端传输信息的需要,用人工或设备自动的把要传输的信息,转发到符合要求的机器上。

交换机有很多接口,每个接口都有桥接的功能,可以连接在一个局域网。

交换也也被称为、==多端口网桥==

image-20220121102438775

路由器

image-20220120153344826

家用路由器、华为AR1200企业级路由器。

路由器工作在OSI模型的第三次、网络层。

从你想上网的步骤,理解路由器。

1.找中国电信、交钱,师傅去你家安装光猫

2、你买个路由器和光猫连接起来

3、在路由器设置中,可以动态、手动的设置你家里的一个LAN环境,局域网就有了,比如192.168.28.1。

路由:

指的是把数据从一个地方传到另一个地方的行为和动作; 路由器就是执行这些行为和动作的机器。

  • 连通不同的网络,实现不同网络之间的互联,同时还可以隔离广播域
    • 可以把两个路由器桥接起来,跨网段通信。
    • 运营商给你安装的光猫,是开通的WAN口
  • 路由器可以连接不同介质的线路,比如双绞线、无线、光纤等。
  • 路由器可以自动选择数据传输的路线,并且维护成一个路由表。
    • 简单理解就是,你买了一个游戏机,从广东发货,最后到北京,中间路线是什么?
    • 你访问小电影网站,最终看到了葫芦娃舅爷爷的电影,数据是怎么传输过来,通过网线,通过路由器,最终到你笔记本的,这个路线就是路由的概念,其中经过了很多台机器,经过了很多的IP
    • 我们不需要像网络工程师一样,彻底搞清楚其中的所有细节,掌握这个网络通信的概念即可。

选择路由器的指标

1、cpu越强大,路由器的计算能力,路由查找能力越高(好比快递的路线选择)

2、内存越大越好,数据中转,存储能力更强

3、吞吐量,你在看小电影的时候,数据不断发给你的路由器,数据是一个个数据包组成的,吞吐量越高,在单位时间内可以转发的数据量就越大。

4、网络协议支持,常见的路由器都支持TCP/IP协议,也就是基本的上网功能,还有的路由器支持比如VPN,可以让你全局上网。

5、机器负载能力,路由器可支持连接的机器数量有限,连接的机器数量越多,数据转发的压力也就越大,不同路由器可支持连接的机器数量不一。

router-lan

路由器功能图解

1、路由器运行在网络层,进行路由选择,根据IP地址收发数据包,使用方式一般都是路由器连接局域网+广域网。

2、常见路由器的功能如下

  • 比如有四个接口的集线器
  • NAT网络地址转换功能
  • DHCP动态主机配置协议
  • DNS域名解析服务
  • 设置代理服务器
  • 防火墙功能

3、路由器有一个WAN口,用于连接到广域网,然后通过路由器内部的集线器(几个LAN口)连接其他设备。

4、借助DHCP、NAT功能,因此你家中所有的设备都可以通过一个唯一的公网IP访问到互联网。

网关

gateway是一个概念,是虚拟的,而路由器是实现这个概念的一个真实的机器。

一般路由器就提供网关的功能了。

网关是一个IP地址,是连接网络A到网络B之间的一个==关口==,作用是控制网络的入口、出口,是网络环境的边界。

image-20220121113201856

一、什么是网关

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。

二、如何来理解网关

大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。

按照不同的分类标准,网关也有很多种。TCP/IP协议里的网关是最常用的,在这里我们所讲的“网关”均指TCP/IP协议下的网关。

三、网关的ip地址

那么网关到底是什么呢?

网关实质上是一个网络通向其他网络的IP地址,网关在网段内的可用ip中选一个,不过,一般用的是第1个和最后一个

例如

比如有网络A和网络B,

网络A: 的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩255.255.255.0;

如果需要与其它网段通信,那么它的网关可以设置为192.168.1.1,当然也可以设置为网段内其它的一个ip地址。

网络B: 的IP地址范为“192.168.2.1~192.168.2.254”,子网掩码255.255.255.0。

如果需要与其它网段通信,那么它的网关可以设置为192.168.2.1,当然也可以设置为网段内其它的一个ip地址。

四、网关是如何实现通信?

在没有路由器的情况下,不同的两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。

而要实现这两个网络之间的通信,则必须通过网关

image-20220121114402144

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络B向网络A转发数据包的过程。

所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。

五、什么是默认网关?

如果搞清了什么是网关,默认网关也就好理解了。

就好像一个房间可以有多扇门一样,一台主机可以有多个网关。

默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关。

image-20220121114632830

总结

1、单纯组件局域网,购买交换机即可,速度最快,最省事,其次是路由器,最后考虑HUB(集线器);

2、价格一般是路由器最贵、然后交换机、其次集线器;

3、集线器、交换机的作用就是将一些机器组成了一个局域网;但是二者性能上有区别

  • 集线器是共享带宽,性能低下;
  • 交换机独享宽带

机器数量较多的话,会有明显使用区别感。

4、路由器作用是连接不同的网络,并且自动寻找网络中传输数据最合适的路径。

5、交换机和路由器的区别

  • 交换机是OSI第二层、数据链路层的设备,通过MAC地址寻找机器;
  • 路由器是OSI第三层、网络层设备,根据IP地址寻找机器;

6、 关于双绞线,就是网线,每条网线都有两端的水晶头,将多个网络设备进行连接,一般都是主机和交换机的连接;

7、光纤和网线对比,光纤的电磁绝缘性能更好,信号衰弱小,传输速度更快,举例更大,主要用在超远距离、布线特殊环境,要求抗电磁干扰的环境。并且传输速度更快、尺寸小,重量轻,数据可以发送到几百千米,因此价格昂贵。

2-0-如果让你来设计网络

通信

你是一台电脑,你的名字叫 A

很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。

image-20220121143738195

直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根==网线==连接了起来。

image-20220121143743508

至于为什么插网线就可以通信了,这个无须关心了,大概理解就是电脑A的数据包被网卡转为电信号,发送给了电脑B。

gun-net

此时,你们俩可以通信了。

集线器

一个新伙伴 C 加入了,但聪明的你们很快发现,可以每个人开两个网口,用一共三根网线,彼此相连。

image-20220121143913590

随着越来越多的人加入,你发现身上开的网口实在太多了,而且网线密密麻麻,混乱不堪。

(而实际上一台电脑根本开不了这么多网口,所以这种连线只在理论上可行,所以连不上的我就用红色虚线表示了,就是这么严谨哈哈~)

image-20220121143944277

于是你们发明了一个==中间设备==,你们将网线都插到这个设备上,由这个设备做转发,就可以彼此之间通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱。

image-20220121144030958

你给它取名叫==集线器==,它仅仅是无脑将电信号转发到所有出口(广播),不做任何处理,你觉得它是没有智商的,因此把人家定性在了==物理层。==

640

MAC地址

由于转发到了所有出口,那 BCDE 四台机器怎么知道数据包是不是发给自己的呢?

首先,你要给所有的连接到集线器的设备,都起个名字。

原来你们叫 ABCD,但现在需要一个更专业的,全局唯一的名字作为标识,你把这个更高端的名字称为==MAC 地址==

数据包

你的 MAC 地址是 aa-aa-aa-aa-aa-aa,你的伙伴 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。(其实是通过算法得出的全球唯一地址)

这样,A 在发送数据包给 B 时,只要在头部拼接一个这样结构的数据,就可以了。

image-20220121145100251

B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下

其他的 CDE 收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是便丢弃

mac

虽然集线器使整个布局干净不少,但原来我只要发给电脑 B 的消息,现在却要发给连接到集线器中的所有电脑,这样==既不安全,又不节省网络资源。==

交换机

如果把这个集线器弄得更智能一些,只发给目标 MAC 地址指向的那台电脑,就好了。

jiaohuanji

虽然只比集线器多了这一点点区别,但看起来似乎有智能了,你把这东西叫做==交换机。==

也正因为这一点点智能,你把它放在了另一个层级,==数据链路层。==

交换机内部工作原理。

image-20220121145504580

如上图所示,你是这样设计的。

MAC地址表

交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。

MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5

假如你仍然要发给 B 一个数据包,构造了如下的数据结构从网口出去。

image-20220121145704426

到达交换机时,交换机内部通过自己维护的 MAC 地址表,发现目标机器 B 的 MAC 地址 bb-bb-bb-bb-bb-bb 映射到了端口 1 上,于是把数据从 1 号端口发给了 B,完事~

以太网(局域网)

你给这个通过这样传输方式而组成的小范围的网络,叫做==以太网。==

图解MAC地址表生成

当然最开始的时候,MAC 地址表是空的,是怎么逐步建立起来的呢?

假如在 MAC 地址表为空是,你给 B 发送了如下数据

image-20220121150209148

由于这个包从端口 4 进入的交换机,所以此时交换机就可以在 MAC地址表记录第一条数据:

1
2
MAC:aa-aa-aa-aa-aa-aa-aa
端口:4

交换机看目标 MAC 地址(bb-bb-bb-bb-bb-bb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。

之后,只有机器 B 收到了确实是发给自己的包,于是做出了响应,响应数据从端口 1 进入交换机,于是交换机此时在地址表中更新了第二条数据:

1
2
MAC:bb-bb-bb-bb-bb-bb
端口:1

mac_address

==经过该网络中的机器不断地通信,交换机最终将 MAC 地址表建立完毕~==

路由器

随着机器数量越多,交换机的端口也不够了,但聪明的你发现,只要将==多个交换机==连接起来,这个问题就轻而易举搞定。

image-20220121150614052

你完全不需要设计额外的东西,只需要按照之前的设计和规矩来,按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。

但是你要注意,上面那根红色的线,最终在 MAC 地址表中可不是一条记录呀,而是要把 EFGH 这四台机器与该端口(端口6)的映射全部记录在表中。

==最终,两个交换机将分别记录 A ~ H 所有机器的映射记录。==

交换机直连

image-20220121151136029

这在只有 8 台电脑的时候还好,甚至在只有几百台电脑的时候,都还好,所以这种交换机的设计方式,已经足足支撑一阵子了。

但很遗憾,人是贪婪的动物,很快,电脑的数量就发展到几千、几万、几十万。

路由器接入

交换机已经无法记录如此庞大的映射关系了。

此时你动了歪脑筋,你发现了问题的根本在于,连出去的那根红色的网线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。

那我可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC 地址,而且同时还能帮我把数据包做一次转发呢?

==这个设备就是路由器,它的功能就是,作为一台独立的拥有 MAC 地址的设备,并且可以帮我把数据包做一次转发你把它定在了网络层。==

image-20220121151613109

==注意,路由器的每一个端口,都有独立的 MAC 地址==

好了,现在交换机的 MAC 地址表中,只需要多出一条==MAC 地址 ABAB 与其端口的映射关系==,就可以成功把数据包转交给路由器了,这条搞定。

MAC地址的问题

现实中 MAC 地址的结构入手,MAC地址也叫物理地址、硬件地址,长度为 48 位,一般这样来表示

1
00-16-EA-AE-3C-40

它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。

其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。

只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。

形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。

但是由于MAC地址无规律,且可以自己篡改,仅仅用在局域网中标识一个唯一的机器,你甚至可以每5分钟生成一个新的MAC地址,因此你没有办法确保目标的MAC地址是真实,准确的。MAC地址的用途一般是在局域网中区分不同的硬件设备。

==你可以这么简单理解,这就好比送快递,你只填了你的身份证号,东西能送到你手里吗?(你说你的身份证号是唯一的,你的快递信息,你写一个假的身份证号又如何?只不过你都是无法拿到快递而已)==

因此,在互联网中,MAC地址不能确定机器的位置。

那么该怎么办?

你得填写具体的收货位置,北京市昌平区沙河镇富雷科技219猿来科技,于超老师,电话15210005004收。

你要是这么写,是不是就没毛病了?

在比如,一句话总结

你是个警察,追踪一个犯人,但是你只有他的身份证号码是没用的,你得定位出他在哪个位置,在哪个旅店,在哪个网吧,然后出击。

IP诞生

此时你发明了一个新的地址,给每一个机器一个32位的编号,比如是

1
11000000101010000000000000000001

但是32位数字太多了,你看不清楚,因此你给它分成了四份,每份是8位,用小数点隔开了。

1
11000000.10101000.00000000.00000001

但是你还是觉得看不明白,你把这个二进制换成了十进制

1
192.168.0.1

十进制转二进制

简单的说就是十进制数反复除以2,取其余数。直至结果的小数部分为0,直接看图比较容易理解

image-20220121160143950

二进制转十进制(凑数法)

  • 从二进制的右边起,第一位数乘以 2的0次幂+第二位数乘以2的1次幂+….+第n位乘以2的(n-1)次幂

image-20220121162413406

最后你给了这个地址一个响亮的名字,==IP 地址。==

现在每一台电脑,同时有自己的 MAC 地址,又有自己的 IP 地址,只不过 IP 地址是软件层面上的,可以随时修改,MAC 地址一般是无法修改的。

这样一个可以随时修改的 IP 地址,就可以根据你规划的网络拓扑结构,来调整了。

image-20220121162728338

如上图所示,假如我想要发送数据包给 ABCD 其中一台设备,不论哪一台,我都可以这样描述,“将 IP 地址为 192.168.0 开头的全部发送给到路由器,之后再怎么转发,交给它!”,巧妙吧。

那交给路由器之后,路由器又是怎么把数据包准确转发给指定设备的呢?

别急我们慢慢来。

我们先给上面的组网方式中的每一台设备,加上自己的 IP 地址

image-20220121162829897

现在两个设备之间传输,除了加上==数据链路层的头部==之外,还要再增加一个==网络层的头部。==

假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,其实网络层没有体现出作用。

image-20220121162853472

程序员计算器

在你了解了二进制转换十进制计算后,日常工作不需要你慢慢的去计算,快速解决问题,可以用计算器。

十进制转二进制

image-20220121182506616

1
2
3
4
5
6
7
192     11000000
168 10101000
0 0
1 00000001


11000000.10101000.00000000.00000001

二进制转十进制

image-20220121185315411

路由转发

但假如 A 给 C 发送数据,A 就需要先转交给路由器,然后再由路由器转交给 C。

由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。(数据通过网卡的转化,从MAC地址发出)

A 到 路由器这段的包如下:

1
2
3
4
5
6
7
链路层
源MAC是 机器A AAAA
目标MAC是 路由器端口ABAB

网络层
源IP,机器A的 192.168.0.1
目标IP,机器C的 192.168.1.1

image-20220121163048296

路由器到C的数据包

1
2
3
4
5
6
7
链路层
源MAC,路由器端口CDCD
目标MAC,机器C CCCC

网络层
源IP,机器A的 192.168.0.1
目标IP,机器C的192.168.1.1

image-20220121163324834

子网

此时你会有一个问题,为什么机器A发给机器C的数据,怎么知道要经过路由器转发?

是因为有==子网==的存在。

简单理解,就好比一个学校的两个班级,于超在A班,女神在C班,于超在A班内写情书给女生很方便,偷摸的放到抽屉里。但是要给C班的女神,就得出走出教室,想办法再递给她。

  • 如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去。
  • 如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理。

好,那现在只需要解决,==什么叫处于一个子网==就好了。

  • 192.168.0.1 和 192.168.0.2 处于==同一个子网==
  • 192.168.0.1 和 192.168.1.1 处于==不同子网==

这两个是我们人为规定的,即我们想表示,对于 192.168.0.1 来说:

==192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。==

那对于计算机来说,怎么表达这个意思呢?于是人们发明了==子网掩码==的概念。

子网掩码

子网掩码是什么?配置IP地址,子网掩码是必不可少的。

小于是大一新生,学号是0517000035

小于看到一个漂亮姑娘芳芳,特别激动,想知道是不是和自己一个班的,就偷偷看了看芳芳的学号,0517000045,妈呀,一个班的,心里美滋滋。

小于又看到一个帅哥,也抓紧看看他的学号,这要是一个班的,多少会影响到自己的颜值,0517003206,给力,不是一个班的,巴适。

因此通过观察学号前面的数字,有一定的规律,范围,即可判断是不是一个班的同学。

1
2
05170000 班级编号 45 ,35是学号
05170032 班级编号,06 学号

这下我们可以理解关于分组,分段的概念。

回到ip、子网掩码

image-20220121172442239

什么是子网掩码

IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;

远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据。

概念与作用

①、子网掩码(Subnet Mask)又叫网络掩码、地址掩码,必须结合IP地址一起对应使用。 ②、只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。 ③、==子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。== ④、子网掩码还用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。 image-20220122100352389

网络地址、主机地址

==确定ip地址所在的网络地址==

小于有自己的学号,35号,也知道自己的班级编号,05170000。

  • 小于必须知道自己是哪个班级,才能更容易追到芳芳姑娘
  • 超哥电脑主机号是96,也得知道自己是哪个网段的(192.168.31.xxx)

为什么这个192.168.31表示是一个网段?

ip地址分为两部分,前部分是==网络位==、类似班级编号,==只要网络位相同,就属于同一个网段。==

ip地址后面属于==主机位==、代表单个机器的个体编号,类似小于的学号35。

子网掩码组成

①、同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址。 ②、子网掩码32位与IP地址32位相对应,==IP地址如果某位是网络地址,则子网掩码为1,否则为0。== ③、举个栗子:如:11111111.11111111.11111111.00000000,这是子网掩码的二进制表示,照第二条的解释,与之对应的IP地址,语法如下

1
2
3
4
5
子网掩码
11111111.11111111.11111111.00000000

对应的IP地址,网络地址和主机地址的设计就是比如
192.186.1.1

==注:左边连续的1的个数代表网络号的长度,使用时必须是连续的,右边连续的0的个数代表主机号的长度。==

子网掩码表示方法

①、点分十进制表示法

二进制转换十进制,每8位用点号隔开 例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0

②、斜线标记法

IP地址/n 例1:192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000

例2:172.16.198.12/20,其子网掩码表示为255.255.240.0,二进制表示为11111111.11111111.11110000.00000000

不难发现,例1中共有24个1,例2中共有20个1,所以n是这么来的。

运营商ISP常用这样的方法给客户分配IP地址。

通过子网掩码计算IP数量

注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2

(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。

比如就是这俩特殊IP,无法直接使用,因此可用的IP数量要减去2个。

192.168.1.0

192.168.1.255

1
2
3
4
5
6
7
8
9
10
11
12
13
比如经典的
192.168.1.100/24 ,这个24位掩码,意思是二进制位有24个1,也就是这样表示11111111.11111111.11111111.00000000


因此转变为十进制,就是255.255.255.0

因此确定了 子网是192.168.1
主机数量是 2^(32-24)-2 = 254个IP地址

最终可知,一般家庭局域网,可以用的IP范围是
192.168.1.1 ~ 192.168.1.254

有两个保留地址 192.168.1.0 和 192.168.1.255

子网掩码计算

1
2
3
4
5
6
7
8
9
10
11
IP
192.168.1.199
子网掩码
255.255.255.0
这个掩码,表示192.168.1是网络位,只要另一个地址是192.168.1开头的,就是同一个网段


192.168.1.199
255.255.0.0

这个写法,就表示192.168.xxx.xxx是网络位,另一个地址是192.168开头,就是同一个网段。

子网掩码和IP一样,是以32位的二进制存在

1
2
3
4
5
二进制指的就是0和1,32位最大的子网掩码是32个1

11111111.11111111.11111111.11111111

255.255.255.255

image-20220121175255160

IP和子网掩码关系

1、两者结合,确定唯一地址的关系。

2、把两者进行2进制换算进行and算法,就是你对外的唯一地址,比如一个局域网内,每个主机的IP与掩码进行and算法后,地址都是一样的。这就是你对外的唯一地址。

3、子网掩码是用来区分网络地址和主机地址的。

举个例子来说,子网192.168.1.0,子网掩码是255.255.255.0。

==255用二进制表示是8个1,11111111==

==3个255用二进制表示是24个1==

1
2
3
4
5
6
7
8
9
10
11
255.255.255.0 换成二进制就是11111111.11111111.11111111.00000000 一共24个1
8+8+8+0=24
这就是斜线标记法 \24

因此我们设置子网掩码可以用24 表示255.255.255.0

再比如
255.255.255.192 换成二进制就是11111111.11111111.11111111.11000000 一共26个1(二进制)
8+8+8+2=26

26数字就可以表示255.255.255.192子网掩码(十进制)

计算网络位(重要)

==当知道子网掩码后(二进制)只要数一数有多少个1,就表示ip地址的前多少位是网络位。==

比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
255.255.255.0 这样的子网掩码 是二进制的,转换为二进制就是
11111111.11111111.11111111.0
一共是24个1


因此这个ip的网络位就是前24位,比如
1.我们限制的子网是192.168.0.0(十进制)
转变二进制就是
11000000.10101000.00000000.00000000


前24位就是网络位,也就是
11000000.10101000.00000000.

当算出来网络位之后
主机位,也就是这个子网掩码内,可以用的IP地址,就被限制好了


**主机位从全0到全1就是IP范围**


二进制的IP范围也就是
11000000.10101000.00000000.0000 0000
11000000.10101000.00000000.1111 1111

但是这玩意咱看着实在太累,十进制的就是 255
192.168.0.0
192.168.0.255

与运算(计算IP范围)

==子网掩码是用来判断任意两台主机的IP地址是否属于同一网络的依据,就是拿双方主机的IP地址和自己主机的子网掩码做与运算,如结果为同一网络,就可以直接通信。==

位运算(图解)

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态

计算机对二进制数据进行的运算==(+、-、*、/)==都是叫位运算,即将符号位共同参与运算的运算。

口说无凭,举一个简单的例子来看下 CPU 是如何进行计算的,比如这行代码:

1
2
3
int a = 35;
int b = 47;
int c = a + b;

计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的 int 变量会在机器内部先转换为二进制在进行相加:

你要说计算机聪明吧,这玩意只认识0和1,多少有点笨。

image-20220122105507415

也可以发现,如果能在程序开发里使用二进制运算,能明显提高机器的执行、计算效率。

& 与运算

与运算,也叫做==位与运算==、是计算机中常见的逻辑运算,就和加减乘除一样的概念,但是计算方式不一样。

==与运算==规则

1
2
3
4
0 & 0 = 0 
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

规则总结:

两位同时为“1”,结果才为“1”,否则为0。

如何根据IP地址和子网掩码,计算网络地址:

①、将IP地址与子网掩码转换成二进制数。 ②、将二进制形式的 IP 地址与子网掩码做“与”运算。 ③、将得出的结果转化为十进制,便得到网络地址。 如下图:

image-20220122111306606

总结

因此当你的子网设置是192.168.0.0,掩码是255.255.255.0的时候,可用IP数量就以及确定好了。

image-20220121190423731


image-20220121190715242


image-20220121190831929

我们废了老大劲计算子网掩码、可以用的IP数量,为什么?

因为不同的公司,有不同的网络环境,服务器有不同的网络环境,你得搞清楚,服务器的IP、子网掩码,以及可用的IP范围,在一个网段内的机器才可以互相通信,才可以进行下一步的动作。

如果是同网段,那么可以直接互相通信,数据直接发送就好。

如果目标不是同一个网段,是不能直接通信的,必须要把数据交给一个中间人,也就是==网关==,由网关进行转发。

子网掩码在线计算器

https://tool.chinaz.com/tools/subnetmask

玩一玩,子网掩码

1.修改linux虚拟机为桥接模式,和宿主机一个网段。

image-20220122112154069

重启虚拟机网络服务

image-20220122112217952

2.查看宿主机和虚拟机通信

image-20220122112250569

3.目前通信没问题,因为他们都处于==192.168.31网段==,因为被子网掩码决定了255.255.255.0。

4.修改宿主机的子网掩码,算一算IP范围。

image-20220122112512898

1
2
3
4
5
6
7
8
9
10
计算二进制
192.168.31.77

11000000.10101000.00011111.01001101

子网掩码
255.255.255.192
11111111.11111111.11111111.11000000

与运算,得出IP范围,如图

image-20220122114558840

5.宿主机修改了网络环境,试试能和linux通信吗?

image-20220122114934049

故障排错

1.报错传输失败,常见故障;

1
2
3
4
5
6
7
8
9
10
11
答案
1. 分析网段
linux的ip地址是192.168.31.222/24

宿主机是192.168.31.77/26

由于子网掩码的不同,宿主机只能和192.168.31.65 ~ 192.168.31.126 之间的IP通信。


2.由于不再一个网段,系统就去找【网关】,这就好比你在班级里找一个姑娘,找不到,你就会想着出教室【大门】,去隔壁找姑娘。
但是,我们这里没设置网关,因此报错故障,找不到大门,你不搁教室里面徘徊了么。

解决办法

1.加上网关设置

2.修改子网掩码,让这俩机器,处于同一个网段

image-20220122120124115

默认网关

假如某台机器的子网掩码定为 255.255.255.0

==这表示,将源 IP 与目的 IP 分别同这个子网掩码进行与运算(& 符号),相等则是在一个子网,不相等就是在不同子网,就这么简单。==

比如

  • A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0
  • B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0
  • C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0
  • D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0

那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推。

image-20220122133618271

所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,发现不相等

则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心

==A 如何知道,哪个设备是路由器?==

答案:在 A 上要设置默认网关

上一步 A 通过是否与 C 在同一个子网内,判断出自己应该把包发给路由器,那路由器的 IP 是多少呢?

其实说发给路由器不准确,应该说 A 会把包发给默认网关

对 A 来说,A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关心,只要这个设备有个 IP 地址就行。

==所以默认网关,就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址。==

比如超哥这个192.168.31.1,是网关,也是路由器的后台管理地址。

image-20220122134201046

路由表

路由器如何知道C在哪里?

答案:路由表

现在 A 要给 C 发数据包,已经可以成功发到路由器这里了,最后一个问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢。

路由器收到的数据包有目的 IP 也就是 C 的 IP 地址,需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样。

这个表就叫路由表

不同于 MAC 地址表的是,路由表并不是一对一这种明确关系,我们下面看一个路由表的结构。

目的地址 子网掩码 下一跳 端口
192.168.0.0 255.255.255.0 0
192.168.0.254 255.255.255.255 0
192.168.1.0 255.255.255.0 1
192.168.1.254 255.255.255.255 1

我们学习一种新的表示方法,由于子网掩码其实就表示前多少位表示子网的网段,所以如 192.168.0.0(255.255.255.0) 也可以简写为 192.168.0.0/24

目的地址 下一跳 端口
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1

这就很好理解了,路由表就表示,192.168.0.xxx 这个子网下的,都转发到 0 号端口,192.168.1.xxx 这个子网下的,都转发到 1 号端口。下一跳列还没有值,我们先不管。

1

image-20220122135057506

2

image-20220122135114488

3

image-20220122135129916

4

image-20220122135144173

5

image-20220122135212846

6

image-20220122135236895

7

image-20220122135423443

刚才说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是我只知道 IP 地址该怎么办呢?

ARP

假如你(A)此时不知道你同伴 B 的 MAC 地址,你只知道它的 IP 地址,你该怎么把数据包准确传给 B 呢?

其实在网络层里,IP地址会和机器的MAC地址对应,通过某个方式,找到192.168.0.2对应的BBBB地址。

这种方式就是==arp 协议==,同时电脑 A 和 B 里面也会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系。

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

IP 地址 MAC 地址
192.168.0.2 BBBB

一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。

这样通过大家不断广播 arp 请求,最终所有电脑里面都将 arp 缓存表更新完整。

最后总结

关于网络知识基础,我们总结如下规则,记忆好久够了

==电脑视角:==

  • 首先我要知道我的 IP 以及对方的 IP
  • 通过子网掩码判断我们是否在同一个子网
  • 在同一个子网就通过 arp 获取对方 mac 地址直接扔出去
  • 不在同一个子网就通过 arp 获取默认网关的 mac 地址直接扔出去

==交换机视角:==

  • 我收到的数据包必须有目标 MAC 地址
  • 通过 MAC 地址表查映射关系
  • 查到了就按照映射关系从我的指定端口发出去
  • 查不到就所有端口都发出去

==路由器视角:==

  • 我收到的数据包必须有目标 IP 地址
  • 通过路由表查映射关系
  • 查到了就按照映射关系从我的指定端口发出去(不在任何一个子网范围,走其路由器的默认网关也是查到了)
  • 查不到则返回一个路由不可达的数据包

网络层(IP协议)本身没有传输包的功能,包的实际传输是委托给数据链路层(以太网中的交换机)来实现的。

==涉及到的三张表分别是==

  • 交换机中有 MAC 地址表用于映射 MAC 地址和它的端口
  • 路由器中有路由表用于映射 IP 地址(段)和它的端口
  • 电脑和路由器中都有 arp 缓存表用于缓存 IP 和 MAC 地址的映射关系

==这三张表是怎么来的==

  • MAC 地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。
  • 路由表是各种路由算法 + 人工配置逐步完善起来的。
  • arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。

知道了以上这些,目前网络上两个节点是如何发送数据包的这个过程,就完全可以解释通了!

最后的网络战斗

image-20220122140610364

这时路由器 1 连接了路由器 2,所以其路由表有了==下一跳地址==这一个概念,所以它的路由表就变成了这个样子。

如果匹配到了有下一跳地址的一项,则需要再次匹配,找到其端口,并找到下一跳 IP 的 MAC 地址。

也就是说找来找去,最终必须能映射到一个端口号,然后从这个端口号把数据包发出去。

image-20220122140720735

==这时如果 A 给 F 发送一个数据包,能不能通呢?如果通的话整个过程是怎样的呢?==

image-20220122140931877

请求流程,动画

network-router

==详细过程文字描述:==

1. 首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)

2. A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。

3. A 将源 MAC 地址(AAAA)与网关 MAC 地址(ABAB)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)(注意这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化)封装在网络层头部,然后发包

image-20220122141432674

4. 交换机 1 收到数据包后,发现目标 MAC 地址是 ABAB,转发给路由器1

5. 数据包来到了路由器 1,发现其目标 IP 地址是 192.168.2.2,查看其路由表,发现了下一跳的地址是 192.168.100.5

6. 所以此时路由器 1 需要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最后把包从 2 号口发出去。

7. 此时路由器 2 收到了数据包,看到其目的地址是 192.168.2.2,查询其路由表,匹配到端口号为 1,准备从 1 号口把数据包送出去。

8. 但此时路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 FFFF,将其封装在数据链路层头部,并从 1 号端口把包发出去。

9. 交换机 3 收到了数据包,发现目的 MAC 地址为 FFFF,查询其 MAC 地址表,发现应该从其 6 号端口出去,于是从 6 号端口把数据包发出去。

10. **F 最终收到了数据包!**并且发现目的 MAC 地址就是自己,于是收下了这个包

==至此,针对物理层,数据链路层,网络层,前三层协议,以及根据对应协议设计的硬件设备(网线,集线器,交换机,路由器)==

一张这么简单的图,背后涉及的知识却是深似海。

image-20220122142051436

2-1-OSI模型与TCP协议

学习目标

  • 掌握OSI七层模型
  • 掌握TCP/IP协议
  • 掌握linux配置动态、静态IP
  • 掌握Linux查看、管理网络信息。

OSI七层模型是什么

开放系统互联(Open System Interconnection,缩写:OSI)是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

为什么要发布这个标准呢?

其实就是推荐所有公司使用这个标准,生产硬件、软件都按照这个来,这样大家的通信方式是一样的,能够互相发送、接收信息等操作,有利于各不同制造厂家的设备互联。

比如大家通常都使用两头或三头的插座,而你偏偏制作了四头的插头,结果谁也用不了,那你还怎么跟大家玩 。

OSI到底是什么呢?

OSI模型是一个具有七层结构的模型,它将计算机网络体系结构划分为 7应用层、6表示层、5会话层、4传输层、3网络层、2数据链路层、1物理层。

每一层都去实现不同的功能,每一层的功能都以协议形式正规描述,协议定义了某层同远方一个对等层通信所使用的一套规格和约定。

OSI参考模型中,最基本的一个知识点:每一层都是向其上一层提供服务的。

image-20220120151241369

超哥用一个简单的例子,大家理解这个抽象的概念就好。

应用层

应用层是面向用户的,也就是说超哥使用的微信、QQ、以及撩国外妹子的Facebook,其实都属于应用层的软件,超哥看到的女神照片、视频也是应用层的数据。

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。

应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。

对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。

我们把应用层交互的数据单元称为报文

域名系统(Domain Name System缩写 DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

DNS解析系统这好比我们手机上的电话簿,名字只是便于记忆,电话才是可以找到对方地址

1
2
小张  15210134321
小红 15293843845

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。

我们能够上网,也就是因为有TCP/IP协议,且定义了互联网传输的HTTP协议,我们才能看到琳琅满目的商品网站。

image-20220122153019373

表示层

决定数据的展现(编码)形式,如同一部电影可以采样、量化、编码为RMVB、AVI,一张图片能够是JPEG、BMP、PNG等。

但是不管多么火辣的照片,对毫无感情的计算机来说,都是一串代码而已。

表示层的作用,就是计算机使用计算机的编码,把应用层的图片、声音、文字等表示出来。

表示层的常见协议有jpeg(图片的编码方式),mp3(声音的编码方式),ascii(文字的编码方式)等。

会话层

为两端通信实体建立连接(会话),中间有认证鉴权以及检查点记录(供会话意外中断的时候可以继续,类似断点续传)。

我们平时会发现一个问题,用QQ是无法分享抖音内容的,淘宝买的东西也是不能用微信支付的,在这里就是淘宝app和微信app之间因为竞争关系,人为的禁止互通的原因。

其实淘宝和微信,都在Internet上,从网络角度来看是可以互通的,只是从软件的设计上,禁止了互通。

从另个角度,用qq号可以登录腾讯系的所有游戏,用支付宝账号也可以登录阿里系的所有产品。

所以会话层的作用也就是一句话,两个应用是否能对接。

传输层

将一个数据/文件斩件分成很多小段,标记顺序以被对端接收后可以按顺序重组数据,另外标记该应用程序使用的端口号。

不同的应用程序使用不同计算机的端口号,同样的应用程序需要使用一样的端口号才能正常通信。

上三层的重点在app开发,从传输层开始,重点就在网络通信了。

传输层有两个作用,首选会根据情况,选择跑的傻快但可能丢包的udp协议,或者跑的有点慢但是特别稳不丢包的tcp。

如果超哥在网页上查看女神的照片,那么照片是个文件,文件在传输的时候如果有部分数据丢失或出错,会导致整个文件看不到。

image-20220122153834162

所以为了保证文件传输的完整性,一般会选用tcp协议,tcp会对所发的每个数据包进行确认,只有对方真的收到了,才算发送成功。

另一种情况,如果超哥和女神视频聊天,视频聊天发送的数据不是一个本来存在的固定的文件,而是边采集视频边发送,所以没有文件完整性一说,采集多少发送多少。

但是视频聊天时候对延迟要求很高,可以接受数据少量丢失,但不能接受延迟,所以这时会采用udp作为传输层协议。

传输层除了负责选择tcp还是udp,还会给数据包打上端口号。

端口号用于区分不同的应用程序

image-20220122155416244

80:http协议,也就是浏览网页的数据包;

443:https协议,就是浏览安全加密的网页的数据包;

22: ssh协议,用于远程登录linux服务器的数据包;

总结:传输层的作用是选择tcp或udp连接,并且给数据打上端口号。

网络层

路由选路,选择本次通信使用的协议(http、ftp等),指定路由策略及访问控制策略。(IP地址在这一层)

经过前面的工作,超哥聊天的内容其实还没有发出去,只是经过了编码,并打上了端口号,但并没有说这个包要发往哪里。

接下来就是网络层的工作,网络层会给数据包打上ip地址,ip地址是互联网地址,类似于发快递时的收件人/发件人地址,有了这个地址,就可以远跨重洋将数据包发往全世界任何一个目的地。

经过上一节超哥的详细讲解,想必大家应该基本掌握了,一台机器是如何把数据发给另一台机器的。

有一个叫路由器的网络设备,是工作在网络层的,路由器相当于快递公司的各个节点,用来根据ip地址来转发各种各样的数据包。

image-20220122161226238

总结:网络层的作用是给数据包打上ip地址,并且进行路由转发。

数据链路层

网络层的路由器用来连接各个网段,可以理解为,快递公司的大卡车负责把快递运到各个派送点,但是快递公司的大卡车并没有直接送到收件人的手里。

那么谁最终把快递包送到收件人手里呢,当然是快递小哥。

在网络通信中,有个叫交换机的设备,也是负责最终把数据包交给接收人。

交换机通过mac地址来识别各个终端(电脑、手机等),会记录下每个mac连在自己的哪个接口上,然后把数据包迅速发出。

Mac地址在电脑或手机出厂时就有了,当连接到网络中时,交换机会自动识别到。

总结:数据链路层的工作就是给数据包打上mac地址,然后交换机进行高速的交换转发。

switch

物理层

顾名思义,物理层的作用就是定义怎么用物理信号来表示数据。

比如为什么网线是8根小线组成的而不是6根,wifi的电磁波频率为什么是2.4G和5G而不是别的,这些都是ieee(电气和电子工程师协会)规定的标准,大家都按照这个来就可以了。

最后,七层模型的图,看起来就不是那么难懂了吧

image-20220122161905642

TCP/IP协议

学习网络会比较吃力,因为网络的协议本来就是抽象的,我们学习这样的知识,最好就是能具象化到生活中,用最贴近生活的认知,去转化理解。

你把网络协议想象成人与人之间的礼仪行为,不同的场合有不同的礼仪行为,人是实施不同礼仪行为的主体。

同样,网络设备是实施网络协议的主体,网络设备通过运行网络协议与其他的网络设备进行交流。

同样的道理,你的电脑想要与网络设备交流,也要与网络设备一样运行网络协议,网络协议也是一个软件,是以系统组件的方式安装在你的电脑的操作系统里的。

例如,数据包的结构,浏览一下各字段的作用就可以了,能记住就记住,记不住也没关系,你只需要先重点理解ip头部里的目的地址、源地址和tcp头部里的目的端口号、源端口号。

image-20220122165907449

轻松理解TCP/IP协议

同样的,我们生活里要传递信息,以前还会进行邮寄,我们会填写寄信人的信息。

想象一下你写信寄信的过程,写信产生数据,寄信传递数据

标准的信件格式是要在信封上写“收信人地址”和“寄信人地址”(由此引入IP地址),“收信人地址”对应数据包里IP头部中的“目的ip地址”,“寄信人地址”对应数据包里IP头部中的“源ip地址”

写上寄信、收信两个地址就可以保证信件可以邮寄到目的地了。

image-20220122170129904

但信件邮寄到目的地址后由谁来收?

从上面这封信的收件人地址检索到这个地址是沈阳大学的,沈阳大学里可能住着几万人,那你这封信是邮寄给居住沈阳大学里的那个人的?

收件人不明确,邮局就算帮你把信件送到这个地址,也没办法帮你投递到具体的收信人。

因此,我们邮件信件需要填写“收件人姓名”、“收件人地址”和“寄件人姓名”、“寄件人地址”的组合,这样才能保证信件能准确投递到具体的收件人手中。

image-20220122170254351

所以我们要在信件上添加收信人姓名寄信人姓名(由此引入端口号),这个时候收件人姓名就对应数据包里TCP协议头部中的目的端口号,寄信人姓名对应数据包里TCP协议头部中的源端口号。

我们再来对比传递信件与传递数据包的过程:

1.首先是位于南宁的李小明给沈阳的王小花过QQ发送了一条消息,李小明的电脑将此消息打包成TCP数据包发送到计算机网络中

计算机网络通过数据包中的目的IP地址把该数据包准确传递到王小花的电脑。

image-20220122170524052

2.王小花的电脑收到了李小明的电脑发送过来的数据包,但是王小花的电脑上同时运行有多个程序(例如图中的QQ和微信),虽然王小花的电脑知道这个数据包是传输给它的,但是它不知道该把这个数据包中的数据交给那个程序

(就像上面讲的,信件虽然邮寄到了沈阳大学,但沈阳大学里住着那么多人,这封信上没有标示说是邮寄给谁的)。

image-20220122170626998

3.针对以上的问题。如果我们使用数据包结构中的源端口号和目的端口号,根据不同的程序使用不同的端口号来发送和接受数据,这样数据包就能像邮寄信件一样准确投递到具体的电脑上指定的程序了。

例如我们指定QQ和微信使用的端口号分别是8000和8080,那么只要你的电脑接收的数据包里目的端口号是8000,那这个数据包就是传输给QQ的。

image-20220122170707453

由上面的例子我们还可以引申出数据包结构中的其他字段的作用

例如我们收到信后可以简单地通过信封是否完整来检查该信件是否被别人在传输途中拆开并篡改过信件内容,那么我们怎么保证我们收到的数据包里的数据有没有在中途被别人拆开修改过呢?

数据包结构中有一个字段叫TCP校验和就是专门做这个工作的。

由数据包的字段可以看出,很多字段都有其用处,只是我们一开始学的时候没必要学的那么仔细而已。

一定要形象地理解数据包,简单的想一下,计算机网络不就是帮助我们传递信息的吗?对于邮寄信件来说,信息的载体是信纸和信封,那计算机网络中信息的载体是什么?就是各种类型的数据包啊!

数据包里有我们关心的信息,也有我们不关心的花销,我们要学的就是如何使网络按照我们的要求传递信息。

image-20220122170916329

TCP/IP网络模型

由于 OSI 模型实在太复杂,提出的也只是概念理论上的分层,并没有提供具体的实现⽅案。事实上,我们

⽐较常⻅,也⽐较实⽤的是四层模型,即 TCP/IP ⽹络模型,Linux 系统正是按照这套⽹络模型来实现⽹络

协议栈的。

TCP/IP ⽹络模型共有 4 层,分别是应⽤层、传输层、⽹络层和⽹络接⼝层,每⼀层负责的职能如下:

应⽤层,负责向⽤户提供⼀组应⽤程序,⽐如 HTTP、DNS、FTP 等;

传输层,负责端到端的通信,⽐如 TCP、UDP 等;

⽹络层,负责⽹络包的封装、分⽚、路由、转发,⽐如 IP、ICMP 等;

⽹络接⼝层,负责⽹络包在物理⽹络中的传输,⽐如⽹络包的封帧、 MAC 寻址、差错检测,以及通

过⽹卡传输⽹络帧等;

TCP/IP ⽹络模型相⽐ OSI ⽹络模型简化了不少,也更加易记,它们之间的关系如下图

image-20220122174213277

TCP/IP ⽹络参考模型共有 4 层,其中需要我们熟练掌握的是应⽤层、传输层和⽹络层,⾄于数据链路层和物理层我们只需要做简单的了解就可以了。

详解TCP/IP协议

TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。

TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

由于我们大部分时间都工作在应用层,下层的事情不用我们操心;

其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上

接下来,我们就来探索一下这个过程。

0、物理介质

物理介质就是把电脑连接起来的物理手段,常见的有光纤、双绞线,以及无线电波,它决定了电信号(0和1)的传输方式,物理介质的不同决定了电信号的传输带宽、速率、传输距离以及抗干扰性等等。

TCP/IP协议栈分为四层,每一层都由特定的协议与对方进行通信,而协议之间的通信最终都要转化为 0 和 1 的电信号,通过物理介质进行传输才能到达对方的电脑,因此物理介质是网络通信的基石。

下面我们通过一张图先来大概了解一下TCP/IP协议的基本框架:

image-20220123154524129

当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

网络通信就好比送快递,商品外面的一层层包裹就是各种协议,协议包含了商品信息、收货地址、收件人、联系方式等,然后还需要配送车、配送站、快递员,商品才能最终到达用户手中。

一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。

配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。

快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否需要继续转发到其他配送站,当包裹到达了目标配送站以后,配送站再根据联系方式找到收件人进行派件。

有了整体概念以后,下面我们详细了解一下各层的分工。

1、链路层

网络通信就是把有特定意义的数据通过物理介质传送给对方,单纯的发送 0 和 1 是没有意义的,要传输有意义的数据,就需要以字节为单位对 0 和 1 进行分组,并且要标识好每一组电信号的信息特征,然后按照分组的顺序依次发送。

以太网规定一组电信号就是一个数据包,一个数据包被称为一帧, 制定这个规则的协议就是以太网协议。一个完整的以太网数据包如下图所示:

image-20220123154735693

整个数据帧由首部数据尾部三部分组成,首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;

数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;

尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。

因此,以太网协议通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接收方。

那么以太网如何来识接收方的身份呢?

以太网规协议定,接入网络的设备都必须安装网络适配器,即网卡, 数据包必须是从一块网卡传送到另一块网卡。

网卡地址就是数据包的发送地址和接收地址,也就是帧首部所包含的**MAC地址,**MAC地址是每块网卡的身份标识,就如同我们身份证上的身份证号码,具有全球唯一性。

MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后三个字节是网卡流水号,例如 4C-0F-6E-12-D2-19

有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。

所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

2、网络层

对于上面的过程,有几个细节问题值得我们思考:

发送者如何知道接收者的MAC地址?

发送者如何知道接收者和自己同属一个子网?

如果接收者和自己不在同一个子网,数据包如何发给对方?

为了解决这些问题,网络层引入了三个协议,分别是IP协议ARP协议路由协议。

【1】IP协议

通过前面的介绍我们知道,MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网。

因此,网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。

IP地址目前有两个版本,分别是IPv4IPv6,IPv4是一个32位的地址,常采用4个十进制数字表示。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。

由于各类地址的分法不尽相同,以C类地址192.168.24.1为例**,**其中前24位就是网络地址,后8位就是主机地址。

因此, 如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。

由于发送者和接收者的IP地址是已知的(应用层的协议会传入), 因此我们只要通过子网掩码对两个IP地址进行AND运算后就能够判断双方是否在同一个子网了。

【2】ARP协议

即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:

ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成**以太网数据包,**最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。

ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

cmd输入 arp -a 就可以查询本机缓存的ARP数据。

【3】路由协议

通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入了路由协议,首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;

如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。

网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。

而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。

【4】IP数据包

在网络层被包装的数据包就叫**IP数据包,**IPv4数据包的结构如下图所示:

image-20220123155134800

P数据包由首部和数据两部分组成,首部长度为20个字节,主要包含了目标IP地址和源IP地址,目标IP地址是网关路由的线索和依据;数据部分的最大长度为65515字节,理论上一个IP数据包的总长度可以达到65535个字节,而以太网数据包的最大长度是1500个字符,如果超过这个大小,就需要对IP数据包进行分割,分成多帧发送。

所以,网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。

3、传输层

链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。

但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。

因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。

这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP定义的数据包就叫做UDP数据包,结构如下所示:

image-20220123155212530

UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。

UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了,TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。

简单来说**TCP就是有确认机制的UDP协议,**每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。

为了保证传输的可靠性,TCP 协议在 UDP 基础之上建立了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方建立可靠的连接。由于建立过程较为复杂,我们在这里做一个形象的描述:

主机A:我想发数据给你,可以么?

主机B:可以,你什么时候发?

主机A:我马上发,你接着!

经过三次对话之后,主机A才会向主机B发送正式数据,而UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发过去了。所以 TCP 能够保证数据包在传输过程中不被丢失,但美好的事物必然是要付出代价的,相比 UDP,TCP 实现过程复杂,消耗连接资源多,传输速度慢。

TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包不必再分割。

总结一下,传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性

4、应用层

理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。

因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等,HTTP 是一种比较常用的应用层协议,主要用于B/S架构之间的数据通信,其报文格式如下:

image-20220123155338484

在 Resquest Headers 中,Accept 表示客户端期望接收的数据格式,而 ContentType 则表示客户端发送的数据格式;在 Response Headers 中,ContentType 表示服务端响应的数据格式,这里定义的格式,一般是和 Resquest Headers 中 Accept 定义的格式是一致的。

有了这个规范以后,服务端收到请求以后,就能正确的解析客户端发来的数据,当请求处理完以后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。

所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。

5、全流程

首先我们梳理一下每层模型的职责:

  • 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
  • 网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;
  • 传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;
  • 应用层:定义数据格式,并按照对应的格式解读数据。

然后再把每层模型的职责串联起来,用一句通俗易懂的话讲就是:

当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。

6、总结

以上内容是对TCP/IP四层模型做了简单的介绍,而实际上每一层模型都有很多协议,每个协议要做的事情也很多,但我们首先得有一个清晰的脉络结构,掌握每一层模型最基本的作用,然后再去丰富细枝末节的东西,也许会更容易理解。

TCP三次握手、四次挥手

image-20220123171403936

通过前面对OSI网络模型的学习,我们知道了在网络层中可以通过IP地址实现两个机器之间的通信。

但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。

IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。

而端到端的通信才应该是应用进程之间的通信。

UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。

虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。

TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开销,比如确认,流量控制等。对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP 等。

常用的熟知端口号

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

TCP的概述

TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80

TCP报文首部

image-20220123171521805

源端口和目的端口,各占2个字节,分别写入源端口和目的端口;

序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;

确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;

数据偏移,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;

保留,占6位,保留今后使用,但目前应都位0;

紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;

确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;

推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;

复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;

同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;

终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;

窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;

检验和,占2字节,校验首部和数据这两部分;

紧急指针,占2字节,指出本报文段中的紧急数据的字节数;

选项,长度可变,定义一些其他的可选的参数。

TCP连接的建立

image-20220123171543415

最开始的时候客户端和服务器都是处于CLOSED状态。

主动打开连接的为客户端,被动打开连接的是服务器。

你在打开小电影网站之前,你和网站是没有联系的,在你打开网页之后,你们之间就建立了TCP连接。

image-20220123172311783

TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

为什么TCP客户端最后还要发送一次确认呢?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

TCP连接的释放(四次挥手)

image-20220123172656514

数据传输完毕后,双方都可释放连接。

最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

image-20220123172747595

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2 *MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

2-2-Vmware网络配置

虚拟网卡

在我们安装好vmware之后,需要给vmware配置正确的网络环境。

vmware是虚拟机,也就是虚拟出的硬件的设备以及操作系统,如何正确配置这些虚拟网络设备?

vmware默认安装了如下虚拟设备。

VMware Network Adepter VMnet1:Host用于与Host-Only虚拟网络进行通信的虚拟网卡

VMware Network Adepter VMnet8:Host用于与NAT虚拟网络进行通信的虚拟网卡

image-20220123174556675

同时,在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡,它们分别作用于仅主机模式与NAT模式下。

在“网络连接”中我们可以看到这两块虚拟网卡,如果将这两块卸载了,可以在vmware的“编辑”下的“虚拟网络编辑器”中点击“还原默认设置”,可重新将虚拟网卡还原。

虚拟交换机

image-20220124103040008

打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式),那么这些都是有什么作用呢?

其实,我们现在看到的VMnet0表示的是用于桥接模式下的虚拟交换机;VMnet1表示的是用于仅主机模式下的虚拟交换机;VMnet8表示的是用于NAT模式下的虚拟交换机。

三种网络模式

桥接网络

什么是桥接模式?

桥接模式就是将主机网卡虚拟机虚拟的网卡利用虚拟网桥进行通信。

在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。

在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。其网络结构如下图所示:

1.确定虚拟机是桥接模式

image-20220123181351680

2.确认网络连接状态

image-20220124095655607

3.确认linux连接状态

网卡配置文件

image-20220124095908558

网络服务

image-20220124095934099

4.查看IP地址

image-20220124095952672

图解

image-20220124111105920

桥接模式,是通过虚拟网桥,将主机上的网卡和虚拟机交换机Vmnet0连接在一起,虚拟机上的虚拟网卡也连接在这个虚拟交换机上,所以这个桥接模式下的虚拟机IP和宿主机是在同一个网络环境下。

NAT网络

安装完毕vmware workstation之后,系统自动生成一个Vmnet8虚拟网卡。

新建虚拟机可以使用该NAT网络。

如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择。

==NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。==

使用NAT网络时,虚拟机不会占用外部网络的IP地址,主机内部生成了单独的专用网络,在默认配置下,虚拟机在这个内部专用网络通过DHCP服务器获取地址。

当虚拟机使用NAT模式,虚拟机会连接到vmnet8虚拟交换机,并且

  • 虚拟机会将NAT设备、DHCP服务器连接到vmnet8
  • 虚拟机将vmware network Adapter Vmnet8也和vmnet8连接,作为通信网关,确保宿主机和虚拟机可以通信。

==在NAT模式下,宿主机网卡和虚拟NAT设备直连,虚拟NAT和虚拟DHCP连接在,vmnet8交换机上,实现虚拟机可以直接访问互联网。==

图解

image-20220124115014694

1.确保你安装的vmware,生成了虚拟网卡vmnet8

image-20220124100458946

2.确保你的vmnet8配置正确,虚拟网络编辑器(虚拟交换机)

image-20220124100802351

3.确保linux虚拟机,网络连接方式修改,以及配置文件,网络服务状态

image-20220124100907870

查看IP地址,已经是单独的一个虚拟子网了。

image-20220124100952712

查看虚拟机和宿主机的通信。

image-20220124114601665

查看vmnet8虚拟网卡作用

禁用宿主机的虚拟网卡

image-20220124114727891

查看虚拟机网络状态,一切正常

image-20220124115430096

但是宿主机,和虚拟机无法通信。

image-20220124115506141

重新打开虚拟网卡vmnet8

image-20220124115528259

可以与虚拟机通信了。

image-20220124115539371

仅主机模式

Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的。

Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。

如果要使得虚拟机能联网,我们可以将主机网卡共享给VMware Network Adapter VMnet1网卡,从而达到虚拟机联网的目的。

它的网络结构如下图: image-20220124182838513

这个没啥意义,想要和外网通信,还得额外处理,一般我们使用NAT模式最合适。

-3-centos网络配置

在确认好vmware上网模式后,centos已经有了正确的IP地址可以使用,下一步就是学习查看、管理网络信息。

常见的网络接口

接口 描述 备注
eth0 以太网接口 eth0,eth1,ethN
wlan0 无线接口
enp3s0/ens33 以太网接口 Centos7+
lo 本地回环接口 127.0.0.1(默认), 127.x.x.x
virbr0 桥接接口(虚拟交换机)
br0 桥接接口(虚拟交换机)
vnet0 KVM虚拟机网卡接口

查看网络信息

ifconfig

用于配置网卡ip地址信息等网络参数或显示网络接口状态,类似于windows的ipconfig命令。

可以用这个工具来临时性的配置网卡的IP地址、掩码、广播地址、网关等。

注意只能用root使用此命令,且系统如果没有此命令,需要单独安装

1
yum install net-tools -y

查看ip、子网掩码、mac地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifconfig命令
[root@yuchao-linux01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.96.0.146 netmask 255.255.255.0 broadcast 10.96.0.255
inet6 fe80::f72c:cdad:eeb3:f1dd prefixlen 64 scopeid 0x20<link>
ether 00:50:56:2e:6c:d5 txqueuelen 1000 (Ethernet)
RX packets 2803896 bytes 1969339690 (1.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2555632 bytes 3207250583 (2.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 63763 bytes 6423296 (6.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 63763 bytes 6423296 (6.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:c0:cb:9e txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

# 查看mac地址
[root@yuchao-linux01 ~]# cat /sys/class/net/ens33/address
00:50:56:2e:6c:d5

image-20220124183824936

启动、关闭网卡

注意不要在服务器上随便执行,网络断了,远程连接也就挂了。你只能在虚拟机里试一试,学习。

禁用ens33

image-20220125093901114

启用ens33

image-20220125093937506

临时设置网络接口(IP)

image-20220125101302102

1
2
3
4
[root@yuchao-linux01 ~]# ping 10.96.0.177
PING 10.96.0.177 (10.96.0.177) 56(84) bytes of data.
64 bytes from 10.96.0.177: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 10.96.0.177: icmp_seq=2 ttl=64 time=0.036 ms

永久设置新IP

记住了,如果命令操作,只是临时修改数据,重启系统后该数据会丢失,数据是写入在内存里的。

数据如果写入到磁盘后,也就是永久生效了。

1
[root@yuchao-linux01 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:1

image-20220125101854319


image-20220125101947373

可以reboot,重启机器后,再看看,IP信息

此时可以用新IP连接了。

image-20220125102142782

ip命令

ip是iproute软件包里面的一个强大的网络配置工具,用于显示或管理Linux系统的路由、网络设备等。

显示网卡信息

1
2
3
4
5
6
7
同一个命令的,多个写法

ip a
ip addr
ip address
ip address show
都是查看网络信息的意思,且默认查看所有网卡

单独查看ens33信息

1
2
3
4
5
6
7
[root@yuchao-linux01 ~]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:50:56:2e:6c:d5 brd ff:ff:ff:ff:ff:ff
inet 10.96.0.146/24 brd 10.96.0.255 scope global noprefixroute dynamic ens33
valid_lft 1430sec preferred_lft 1430sec
inet6 fe80::f72c:cdad:eeb3:f1dd/64 scope link noprefixroute
valid_lft forever preferred_lft forever

查看机器路由信息

1
2
3
4
5
6
[root@yuchao-linux01 ~]# ip route
default via 10.96.0.2 dev ens33 proto dhcp metric 100
10.96.0.0/24 dev ens33 proto kernel scope link src 10.96.0.146 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

这个10.96.0.0.就是vmnet8虚拟交换机了

域名解析

域名解析就是将名字和IP做了一个对应关系,让人类可以更轻松的记忆主机名。

比如www.yuchaoit.cn、www.baidu.com

那么,系统是如何认识这个域名的,是因为存在关于DNS的配置

/etc/resolv.conf

Linux 中可以通过 /etc/resolv.conf 文件配置 DNS 服务器的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1.修改 /etc/resolv.conf
[root@yuchao-linux01 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 119.29.29.29


2.查看域名解析
[root@yuchao-linux01 ~]# ping yuchaoit.cn
PING yuchaoit.cn (123.206.16.61) 56(84) bytes of data.
64 bytes from 123.206.16.61 (123.206.16.61): icmp_seq=1 ttl=128 time=13.9 ms
64 bytes from 123.206.16.61 (123.206.16.61): icmp_seq=2 ttl=128 time=11.9 ms
^C
--- yuchaoit.cn ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 11.961/12.933/13.905/0.972 ms
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=11.0 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=12.3 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 11.004/11.691/12.379/0.695 ms


3.关闭该dns解析文件,注释掉
[root@yuchao-linux01 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
#nameserver 119.29.29.29



4.发现无法进行域名解析

image-20220125095955689

重新打开DNS服务器地址后,即可域名解析。

nslookup命令

nslookup 命令:用于查找域名服务器的程序,nslookup有两种模式:交互和非交互

此命令需要安装

1
[root@local-pyyu tmp]# yum install bind-utils -y

查看域名解析和dns服务器的关系,通过nslookup命令。

image-20220125100607398

修改dns服务器,常见的公网中DNS服务器

1
2
3
4
119.29.29.29
114.114.114.114
223.5.5.5
223.6.6.6

一般我们会指定,主备、两个DNS服务器地址。

image-20220125100924430

设置静态IP

默认linux我们是通过dhcp动态分配IP地址的,IP地址可能会被抢占,或者变化,后期我们部署服务,一些IP地址信息需要写入文件中,如果还会井变化的话,那就很麻烦了。

1.先确认好网段信息,IP网段、子网掩码、网关,DNS

image-20220125103204725

2.修改网卡配置文件

image-20220125103458484

3.重启网络服务

1
[root@yuchao-linux01 ~]# systemctl restart network

修改主机名

1
[root@yuchao-linux01 ~]# hostnamectl set-hostname xxxx

关于主机名的配置文件

1
2
[root@yuchao-linux01 ~]# cat /etc/hostname 
yuchao-linux01

路由学习

  • 理解路由表作用
  • 阅读路由表信息
  • 简单抓包分析,wireshark使用。

什么是路由

什么是交换,什么是路由,什么是路由表?

  1. 交换是指*同网络访问*(两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅)
    1. 使用mac地址,根据mac地址表,转发数据帧。
  2. 路由就是*跨网络访问*,计算机之间的数据传输必须经过网络,网络可以直接连接两台计算机,或者通过一个一个的节点构成。
    1. 使用IP地址,根据路由表,转发数据包。
    2. 路由器理解为互联网的中转站,网络中的数据包就是通过一个一个路由器转发到达目的地。
    3. 路由表是*记录路由信息的表*,在Linux中⾸先是⼀张可见的,可更改的表,它的作⽤就是当数据包发到Linux的时候,系统(或者说内核)就根据这张表中定义好的信息来决定这个数据包接下来该怎么⾛。

image-20220125104818746

路由如何工作

image-20220125110436613

数据从计算机A到B的数据包,这个路由应该走1、3、5还是走2、4路线?

  • 数据可能走2、4路径会更短
  • 但是走1、3、5可能转发数据包的能力更快

这都是路由器要自动做出的选择。

  • 路由器通过路由表来决定沿着哪条网络路径行动,路由表记录了数据包应该到达哪个路径。
  • 类似于列车的时刻表,乘客需要查阅路线表来决定搭乘哪趟列车。
  • 路由表也是一样的概念。
  • 路由器以每秒数百万次的速度来处理数百万个数据包,当数据包到达目的地时,可能被N个路由器路由了N次。
  • 路由表可以是静态的、也可以是动态更新的,动态路由就需要使用各种路由协议,来确定最短、最快的路径。
    • 参考理解就是我们用高德地图,你可以选一个固定路线,也可以通过高德提供的强大算法,实时更新最新路况,计算出一个最合适的路线。

关于路由协议

在网络中,协议是格式化数据的标准化方法,因此任何连接的计算机都可以理解数据。

路由协议是用于标识或通知网络路径的协议,你可以理解为(好比你开车,要遵循不同路况的规矩)

以下协议可以帮助数据包在Internet上找到自己合适的路线。

  • IP协议:Internet协议明确每个数据包的起点、终点。路由器检查每个数据包的IP头部信息,确认数据要发到哪。.
    • 快递有寄出地址、收件地址
  • BGP协议:边界网关协议路由协议,属于一种动态路由协议,用来自动的控制哪些IP和哪些网络互相连接。
  • OSPF协议:路由器通常使用开放式最短路径优先协议(OSPF)来动态识别最快、最短的可用路由,将数据包发到目的地。

了解即可。

什么是路由器

路由器是一个硬件设备,负责将数据包转发到目的地。

路由器一般连接到两个或者更多的网络,并且在他们之间转发数据包。

路由linux命令

查看路由表route

1
2
3
4
5
6
7
8
9
[root@yuchao-linux01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.96.0.2 0.0.0.0 UG 100 0 0 ens33
10.96.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
10.96.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

目标网络 网关 子网掩码 路由标志(u是up、UG表示该网关是路由器) 网卡

读懂路由信息

image-20220125114654653

如果ping了一个公网IP,如ping 123.206.16.61

1.目标IP如果是局域网ip,如果是,直接在本地访问;如果不是,去路由表里寻找是否有该网段

2.如果路由表有这个网段,继续从路由条目后面指定的网卡出去(ens33)

3.如果路由表没有这个网段,寻找默认路由(网关)

4.如果网关也没有 ,提示网络不可达。

image-20220125115223803

如果ping的是局域网10.96.0.146,直接从本地网卡ens33出去,因为存在路由。

image-20220125115156722

临时删除网关

image-20220125115411534

没有路由了,没有路线了,快递都不知道往哪送了、报错了呗。

image-20220125115509639

加上路线,加上网关,加上大门,请求就会恢复了。

1
[root@yuchao-linux01 ~]# route add default gw 10.96.0.2

抓包工具wireshark

Wireshark是世界上最流行的网络分析工具。

这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。

1
[root@yuchao-linux01 ~]# yum install wireshark libpcap -y

启动telnet服务端

我们一切操作,都会产生各种数据包,且都是隐藏在计算机背后的网络数据交互,看不见,摸不着,但是可以通过抓包工具,专门的提取出这些数据包,进行分析。

这一功能,可以让运维同学理解服务启停、部署、运行过程中的网络通信原理,以及故障分析。可以让开发同学,进行接口调试,网页数据提取,比如黑客,是熟练玩转抓包工具的。

简单说,你打开QQ、邮箱,输入账号密码、点击登录,其实计算机背后产生了N多个数据交互,请求与响应,通过抓包工具,甚至可以抓取出账号密码等重要信息。(这只是一个应用场景,还是要遵纪守法)

我们以telnet命令,登录服务器为例,查看数据包

telnet是早期用来登录服务器、交换机的一个指令,但是登录账密是明文的不够安全,后来采用ssh登录linux了。

1
2
3
4
5
6
7
8
9
10
11
12
# 1.安装telnet服务
[root@yuchao-linux01 ~]# yum install telnet-server telnet y


# 2.启动xinetd服务,以及telnet服务
[root@yuchao-linux01 ~]# systemctl start telnet.socket
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# netstat -tnlp|grep 23
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 723/rpcbind
tcp6 0 0 :::111 :::* LISTEN 723/rpcbind
tcp6 0 0 :::23 :::* LISTEN 1/systemd
[root@yuchao-linux01 ~]#

image-20220125142759319

关闭防火墙

1
[root@yuchao-linux01 ~]# systemctl stop firewalld

windows打开telnet功能

image-20220125143009439

打开telnet客户端

image-20220125143039494

修改linux认证权限

linux默认为了安全性,已经禁用了telnet登录,临时修改这个,可以测验telnet登录。

image-20220126095621057

此时可以通过cmd里,使用telnet登录linux了。

image-20220126095749123

tcpdump工具

我们已经可以通过telnet直接登录了,但是如果我们看不到背后的通信过程,一般只能从 1、命令执行结果 2、日志,这两个方面可以分析。

image-20220126100332063

但是当你学习了抓包工具,在发起telnet登录时,是有网络请求发出去的,你抓到这个请求,分析其中的数据包,即可有更多的理解。

tcpdump,顾名思义,明显是对tcp/ip的数据包进行存储。

1.查看arp缓存,查看linux和mac的对应关系

这个10.96.0.1是vmnet8虚拟交换机的IP地址。

image-20220126100932775

2.删除arp缓存,也就是删除ip和mac的这种解析记录

image-20220126101257950

3.抓取网卡流量(注意别用xshell连接,直接用虚拟机)

你在xshell里,一切操作,都是基于ssh的远程发送请求,会产生大量的数据包。

参数解释

-i 指定网络接口

-n 不做域名解析,只显示IP

-nn 不显示协议、端口名字,只显示数字形式的IP、端口

-w 数据保存到文件

如下命令是抓取ens33网卡所有数据包。比如telnet的、ssh的。

image-20220126102401566

4.发送telnet请求,tcpdump能立即抓到网卡接收到的数据包。

image-20220126102638711

5.指定协议抓取数据包,只抓取tcp的关于telnet的数据包。

1
[root@yuchao-linux01 ~]# tcpdump  -i ens33 tcp port 23 and host 10.96.0.1

tcpdump截取账户密码

tcpdump是linux下的一个抓包工具,因为telnet的报文是使用明文传输的,并没有对报文进行加密,所以可以使用tcpdump获取其登录的账号和密码。

1.截取telnet数据包,保存到文件里再分析。

image-20220126104608560

2.客户端登录linux、telnet登录,输入你的账户密码

image-20220126104652502

3.关闭linux的tcpdump抓包。

image-20220126104833085

4.把该数据包,发送到windows里,用wireshark工具解析二进制数据。

安装wireshark

image-20220126110614096

传输通过tcpdump抓取的二进制数据,交给wireshark。

image-20220126110651924

wireshark打开数据包文件。

image-20220126111325372

继续向下找,找到关于登录的选项

image-20220126111503940

可以看到服务器向发出了login的字符串,此时将会输入root用户名,telnet会将用户名字符串的每个字符使用一个包发送

查看账号的二进制数据包

账号root

一定是寻找,关于telnet的数据包

r

image-20220126111950307

o

image-20220126112044458

o

image-20220126112105328

t

image-20220126112143004

密码123456

开始传输密码了

image-20220126112308362

密码的数据包如下

image-20220126112451481

发现的确登录了服务器,也把登录期间的数据,账号,密码,全都拿到了,因此telnet是一个非常不安全的数据明文传输方式。

image-20220126112602284