Bash Shell
定义:BashShell是一个命令解释器,主要负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给内核,由内核驱动硬件,最终将处理后的结果输出至BashShell屏幕[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCo3xYPe-1690465877801)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDY2ODM3NA==,size_16,color_FFFFFF,t_70.png)]
定义:BashShell是一个命令解释器,主要负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给内核,由内核驱动硬件,最终将处理后的结果输出至BashShell屏幕[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YubvMjnI-1690465877802)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDY2ODM3NA==,size_16,color_FFFFFF,t_70.png)]
快捷键
-
ctrl+a:光标移动到行首
-
ctrl+e:光标移动到行尾
-
ctlr+l:清屏(对应的命令clear)
-
ctrl+c:结束当前的任务;非常常用
-
ctrl+k:删除光标以后的所有内容
-
ctrl+u:删除光标以前的所有内容
-
ctrl+w:按照单词进行删除,删除光标以前的内容
-
ctrl+d:退出当前的bash会话,并不影响服务器运行的后台程序
-
ctrl+左右:按照单词进行跳跃
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AF8e0CxA-1690465877803)(shell.assets/1.gif)]
历史记录history
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# history
65 firewall-cmd --zone=public --list-ports
66 firewall-cmd --zone=public --add-port=8097/tcp --permanent
67 firewall-cmd --reload
68 ssh -L 8097:127.0.0.1:8097 yuanshuai20@59.72.109.240
69 ls
70 history
71 ls
72*
73 history
74 pwd
75 history
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# !74 #调用history中历史记录的第77条指令
pwd
/root
- -N: 显示历史记录中最近的N个记录;
- -c:清空当前历史命令;
- -a:将历史命令缓冲区中命令写入历史命令文件中;
- -r:将历史命令文件中的命令读入当前历史命令缓冲区;
- -w:将当前历史命令缓冲区命令写入历史命令文件中;
- -d :删除历史记录中第offset个命令
- -n :读取指定文件
对历史记录操作不会影响历史文件,历史记录存在历史文件里。如果历史文件改变,那么记录也会改变。
注: 如想查询某个用户在系统上执行了什么命令,可以使用root用户身份登录系统,检查该用户~
目录下的.bash_history
文件,该文件记录了用户所使用的命令和历史信息。
自定义别名alias
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# alias 自定义别名='指令名称'
**注:**alias的效力仅于该次登入的操作。若要每次登入是即自动设好别名,可在.bashrc中设定指令的别名。
- unalias :删除别名
目录管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0bd9smb-1690465877803)(shell.assets/d0c50-linux2bfile2bsystem2bhierarchy.jpg)]
目录
系统启动必须:
-
**/boot:**存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
-
/etc:存放所有的系统需要的配置文件和**子目录列表,**更改目录下的文件可能会导致系统不能启动。
-
/lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
-
/sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中
指令集合:
-
**/bin:**存放着最常用的程序和指令
-
**/sbin:**只有系统管理员能使用的程序和指令。
外部文件管理:
-
**/dev :**Device(设备)的缩写, 存放的是Linux的外部设备。**注意:**在Linux中访问设备和访问文件的方式是相同的。
-
/media:类windows的**其他设备,**例如U盘、光驱等等,识别后linux会把设备放到这个目录下。
-
/mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
临时文件:
-
/run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
-
/lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件。
-
/tmp:这个目录是用来存放一些临时文件的。
账户:
-
/root:系统管理员的用户主目录。
-
/home:用户的主目录,以用户的账号命名的。
-
/usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
-
**/usr/bin:**系统用户使用的应用程序与指令。
-
**/usr/sbin:**超级用户使用的比较高级的管理程序和系统守护程序。
-
**/usr/src:**内核源代码默认的放置目录。
运行过程中要用:
-
/var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。
-
/proc:管理**内存空间!**虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。
扩展用的:
-
/opt:默认是空的,我们安装额外软件可以放在这个里面。
-
/srv:存放服务启动后需要提取的数据**(不用服务器就是空)**
路径
FQ:/abc/test 和 abc/test 是一样的吗?
- 如果现在在根目录下两者一样,因为/代表根目录
- 如果现在在别的目录前者就是根目录下的abc,而后者是现在目录下的abc
目录命令
**创建文件:**touch
- 创建多个有规律的文件 touch {A…Z}
**创建目录:**mkdir
- -p:递归创建
- 创建多个有规律的目录 mkdir {A…Z}
**删除文件或者目录:**rm
- -r:递归删除子目录
**复制文件或者目录:**cp
-
-r:递归
-
如果有重复文件,\cp是原生指令不会提示覆盖,而cp别名为cp -i会提示是否覆盖
-
一次拷贝多个文件目录,最后一个如果是目录必须存在
-
-p:保持复制的文件与源文件一样的属性,所属组一样
**移动文件或者目录:**mv
文件管理
查看文件
- cat:-n 带行号查看
- less,more:分页查看
- ctrl+f:下一页
- ctrl+b:上一页
- more:有百分比显示
- head,tail:
- tail -f(tailf): 实时追踪尾部变化
查找文件
- which:查找命令绝对类路径
- whereis:
- -b:查看二进制文件
下载文件
-
wget,curl:从网络下载资源
-
wget -O:下载文件并重命名
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# wget -O ./1.REP http://mirrors.aliyun.com/repo/Centos-7.repo
-
curl -o:下载文件并重命名
-
-
sz:Linux下载到Windows。不能超过4g,不支持断点续传,不能下载文件夹。
-
rz:Windows上传到Linux。
字符处理命令
-
sort:
- -t:以哪个字符分割,默认为空格
- -k:分割后第几列
- m.n:第几列.第几个字符
- -n:按照number方式排列
- -r:反转
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# sort -t "." -k 3.1,3.1 -k 4.1,4.3 -n ip.txt 192.168.0.151 00:0F:AF:85:6C:F6 192.168.0.152 00:0F:AF:83:1F:65 192.168.1.1 00:0F:AF:81:19:1F 192.168.1.10 00:30:15:A2:3B:B6 192.168.1.21 00:0F:AF:85:6C:09 192.168.1.152 00:0F:AF:83:1F:65 192.168.2.2 00:0F:AF:85:6C:25 192.168.2.20 00:0F:AF:85:55:DE 192.168.2.22 00:0F:AF:85:5C:41
-
uniq:去重复
- -c:统计出现次数
-
wc:统计行数
- -l:统计行数
三剑客
-
基本正则表达式BRE集合
- \:转义字符,匹配特殊含义的字符,还原本意
- :用于模式的最左侧。如yu,匹配以yu单词开头的行
- :用于模式的最右侧。如 y u :用于模式的最右侧。如yu :用于模式的最右侧。如yu,匹配以yu单词结尾的行
- ^ :匹配空行。因 为 后 面什么也没写,表示空; :匹配空行。因为^后面什么也没写,表示空; :匹配空行。因为后面什么也没写,表示空;前面什么也没写,也表示空
- .:匹配任意一个且只有一个字符,不能匹配空行。如.ab,匹配xab字符
- *:匹配一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容,如a* 表示匹配a,0次或多次
- .*:匹配任意长度的任意字符
- ^.*:匹配任意多个字符开头的内容
- .*$:匹配任意多个字符结尾的内容
- [abc]:匹配[]集合内的任意一个字符,a或b或c,可以写成[a-c]
- [a-z]匹配所有小写单个字母
- [A-Z]匹配所有单个大写字母
- [a-zA-Z]匹配所有的单个大小写字母
- [0-9]匹配所有单个数字
- [a-zA-Zo-9]匹配所有数字和字母
- [abc]:匹配除了后面的任意字符,a或b或c,^表示对[abc]的取反
-
扩展正则表达式ERE集合:必须用grep -E才能生效
- +:匹配前一个字符1次或多次
- [😕]+:匹配括号内的":“或者”/"字符1次或多次 [ab]+
- ?:匹配前一个字符0次或1次
- |:表示或者,同时过滤多个字符串
- ():分组过滤,被括起来的内容表示一个整体
- a{n,m}:匹配前一个字符最少n次,最多m次
- a{n,} :匹配前一个字符最少n次
- a{n}:匹配前一个字符正好n次
- a{,m}:匹配前一个字符最多m次
-
grep:过滤行
grep [参数] [匹配模式] 文件数据 -v 排除匹配结果 -n 显示匹配行与行号 -i 不区分大小写 -c 只统计匹配的行数 -E 使用egrep命令 --color=auto 为grep过滤结果添加颜色 -W 只匹配过滤的单词 -o 只输出匹配的内容
-
例子
-
grep -v “ftp” pass:匹配除了包含ftp的内容,其他全部打印
-
grep -n “.” /var/log/secure:显示行号
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# grep -n "." /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin
-
grep -n -A 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串打印本行以及它的下2行
-
grep -n -B 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串,并打印本行以及它的上2行
-
grep -n -C 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串,并打印本行以及它的上下2行
-
-
-
sed:替换字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fHO1o1a-1690465877804)(shell.assets/webp.webp)]
sed [选项] [sed内置命令字符] [输入文件] -n 取消默认sed的输出,常与sed内置命令p一起用(取消默认输出,只显示符合规则的) -i 直接将修改结果写入文件,不用-i,sed修改的是内存数据 -e 多次编辑,不需要管道符了 -r 支持正则扩展
-
sed匹配范围
-
空地址:全文处理
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed 'a -------' sort.txt #每一行下面追加 b:3 ------- c:2 ------- a:4 ------- e:5 ------- d:1 ------- f:11 -------
-
单地址:指定文件某一行
-
/pattern/:被模式匹配到的那一行
-
范围区间:例如:10,20表示十到二十行;10,+5第10行向下5行
-
步长:例如,12,表示1、3、5、7、9行;22,表示2、4、6、8、10
-
-
内置命令字符:sed的内置命令字符用来对文件进行不同的操作功能,如对文件增删改查
-
a:append,对文本追加,在指定行后面添加一行/多行文本
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed '2a 111111' sort.txt #第二行后面追加 b:3 c:2 111111
-
d:delete,删除匹配行
-
i:insert,表示插入文本,在指定行前添加一行/多行文本
-
p:print,打印匹配行的内容,通常p与-n一起用
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2,4p' #显示2-4行 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 ether 00:16:3e:08:d2:49 txqueuelen 1000 (Ethernet) RX packets 191798995 bytes 91882211117 (85.5 GiB) [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2,+4p' #显示2向下4行 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 ether 00:16:3e:08:d2:49 txqueuelen 1000 (Ethernet) RX packets 191799024 bytes 91882213741 (85.5 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 168468141 bytes 92112483215 (85.7 GiB) [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2~4p' #显示2和6行 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 TX packets 168468978 bytes 92112833071 (85.7 GiB) [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '/inet/p' #匹配inet行 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255
-
s/正则/替换内容/g:匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配
- s///g,s###g,s@@@g一样
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed -e 's#b#z#g' -e 's/c/y/g' sort.txt #b换成z,c换成y z:3 y:2 a:4 e:5 d:1 f:11
-
-
-
awk:查找行列
awk [可选参数] '模式[动作]' 文件 -F 指定分隔字段符号 -v 定义或修改一个awk内部的变量 -f 从脚本文件中读取awk命令
-
awk内置变量
-
$n:指定分隔符后,当前记录的第n个字段,也就是第n列
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk '{print "第一行:"$1,"第二行:"$2}' ip.txt #"xxx"双引号可以更美观,使用逗号默认以空格分割 第一行:192.168.3.1 第二行:00:0F:AF:81:19:1F 第一行:192.168.3.2 第二行:00:0F:AF:85:6C:25 第一行:192.168.3.3 第二行:00:0F:AF:85:70:42
-
$0:打印所有内容
-
FS:输入字段分隔符,默认为空白字符
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v FS=":" -v OFS="====" '{print $2,$4}' ip.txt 0F====81 0F====85 0F====85 -v FS=":" 把原始文件以":"分割 -v OFS="====" 把默认输出内容用"===="分割
-
OFS:输出字段分隔符,默认为空白字符
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -F ":" -v OFS="====" '{print $2,$4}' ip.txt 0F====81 0F====85 0F====85 192.168.3.1 00:0F:AF:81:19:1F 192.168.3.2 00:0F:AF:85:6C:25 192.168.3.3 00:0F:AF:85:70:42 -F ":" 把原始文件以":"分割 -v OFS="====" 把默认输出内容用"===="分割
-
NF:分割后,统计字段数
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print $0,NF}' #最后一个数字为每一行的字段数 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 4 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 6 ether 00:16:3e:08:d2:49 txqueuelen 1000 (Ethernet) 5 RX packets 191847056 bytes 91887526508 (85.5 GiB) 7 RX errors 0 dropped 0 overruns 0 frame 0 9 TX packets 168518209 bytes 92135199556 (85.8 GiB) 7 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 11
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print $NF}' # NF为字段数,$NF就相当于每一行最后一个字段,$(NF-1)倒数第二个字段,等等 1500 172.25.63.255 (Ethernet) GiB) 0 GiB) 0
-
NR:行数,可以大于,小于,不等于等等条件
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk 'NR==2,NR==4' | awk '{print $2,$4}' #第2-4行的2-4列 172.25.50.171 255.255.192.0 00:16:3e:08:d2:49 1000 packets bytes
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print NR,$0}' #NR增加行号 1 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 2 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 3 ether 00:16:3e:08:d2:49 txqueuelen 1000 (Ethernet) 4 RX packets 191846486 bytes 91887472014 (85.5 GiB) 5 RX errors 0 dropped 0 overruns 0 frame 0 6 TX packets 168517655 bytes 92134951302 (85.8 GiB) 7 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
-
RS:输入记录分隔符(输入换行符),指定输入时的换行符
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v RS=" " '{print NR,$0}' ip.txt # 以空格换行 1 192.168.3.1 2 00:0F:AF:81:19:1F 192.168.3.2
-
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
-
FNR:多个文件分别计数的行号
-
FILENAME:当前文件名
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk '{print FILENAME,$0}' ip.txt #
-
ARGC:命令行参数的个数
-
ARGV:数组,保存的是命令行所给定的各参数
-
-
awk自定义变量
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v myname="ys" 'BEGIN{print"我的名字是:",myname}' 我的名字是: ys #现在shell中设置变量,再使用 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# myname="ys" [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v myname=$myname 'BEGIN{print"我的名字是:",myname}' 我的名字是: ys
-
printf格式化输出
- %c:显示字符的ASCII码
- %d,%i:十进制整数
- %e,%E:科学计数法显示数值
- %f:显示浮点数
- %g,%G:以科学计数法的格式或浮点数的格式显示数值
- %s:显示字符串
- %u:无符号整数
- %%:显示%自身
- -:左对齐,例如:%-25s表示-左对齐25个字符长度
- +:显示数值符号,例如:printf “%+d”
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk 'BEGIN{printf "%d==\n%d==\n%d==\n",1,2,3,4}' #类似python一个%d对应一个参数,4没有%d对应,所以不显示 1== 2== 3==
-
awk模式
- BEGIN模式是处理文本之前需要执行的操作
- END模式是处理完所有行之后执行的操作
-
文件属性
在Linux中,一个文件数据可分为两大类:数据和元数据
- 数据:泛指普通文件中的实际数据
- 元数据:用来描述一个文件的特征的系统数据
在Linux中,一个文件的存储也会被分为两部分:inode和block
- inode:用来存储文件的元数据
- block:用来存储文件的真实数据,一个block空间是4k
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls -li
total 16
917519 -rw-r--r-- 1 root root 2523 Aug 4 2022 1.REP
917517 -rw-r--r-- 1 root root 2523 Aug 4 2022 Centos-7.repo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1iLbR5m-1690465877805)(shell.assets/image-20230420133604372.png)]
文件类型:
-
当为 d 则是目录(directory)
-
当为 - 则是普通文件;
-
若是 l 则表示为链接文档(Link File);
-
若是 b 则是设备文件(block块设备文件)和存储相关的设备,举例:硬盘,U盘,磁盘分区
-
若是 c 则表示为设备文件(char字符设备文件)和字符相关的设备,举例:打印机,终端
-
若是 s 则表示为socket安全套接字文件,网络编程(同一个服务器两个进程通信)
-
若是 p 则表示为pipe管道文件,父进程与子进程之间的通信文件
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# file 1.REP #使用file指令查看普通文件‘-’是什么类型文件 1.REP: ASCII text
软连接和硬链接
硬链接:硬链接和原文件对应一个inode,就是对应一个文件,可以理解成一个文件有几个别名。
- ln 源文件 链接名
软链接:软链接可以理解成快捷方式,和原文件的inode号不一样,它和Windows下的快捷方式的作用是一样的,软链接数据块中记录的亦是相对路径指向。
- ln -s 源文件 链接名
注意:链接的源文件路径要写绝对路径,否则会报错
硬链接与软链接区别
- 目录不能创建硬链接,并且硬链接不可以跨越分区系统。
- 目录软链接特别常用,并且软链接支持跨越分区系统。
- 硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
- 删除软链接文件,对源文件及硬链接文件无任何影响。
- 删除文件的硬链接文件,对源文件及链接文件无任何影响。
- 删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
- 删除源文件及其硬链接文件,整个文件会被真正的删除。
文件编辑vim
普通模式
G #光标跳转至末端
gg #光标跳转至顶端
$ #光标跳转至当前光标所在行的尾部
^ #光标跳转至当前光标所在行的首部
------------------------------------------------------------------
ctrl+f #下一页
ctrl+b #上一页
------------------------------------------------------------------
yy #复制当前光标所在的行
nyy #复制当前光标以及光标向下n行
------------------------------------------------------------------
P #粘贴至当前光标下一行
P #粘贴至当前光标上一行
------------------------------------------------------------------
dd #删除当前光标所在的行
ndd #删除当前光标所在的行以及往下的n行
dG #删除当前光标以后的所有行
x #删除当前光标标记往后的字符
X #删除当前光标标记往前的字符
------------------------------------------------------------------
dd & p #剪贴、先删除dd(number dd),后粘贴p
------------------------------------------------------------------
u #撤销上一次的操作
------------------------------------------------------------------
r #替换当前光标标记的单个字符R
编辑模式
i #进入编辑模式,光标不做任何操作
a #进入编辑模式,将当前光标往后一位
o #进入编辑模式,并在当前光标下添加一行空白内容
------------------------------------------------------------------
I #进入编辑模式,并且光标会跳转至本行的头部
A #进入编辑模式,将光标移动至本行的尾部
O #进入编辑模式,并在当前光标上添加一行空白内容
末行模式
w #保存
w ./xx #另存为到./xx路径下
------------------------------------------------------------------
q #退出
------------------------------------------------------------------
/ #搜索
n #查找下一个
N #查找上一个
------------------------------------------------------------------
:n,ms#a#b#g #把n到m行中a替换成b
:%s#a#b#g #a替换成b
视图模式
批量操作连续的行: shift+v
d: 删除
y: 复制
批量操作连续的列: ctrl+v
shift+i相当于I:顶部插入'#'内容进行注释
x/d:删除'#'注释
其他
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# vimdiff ip.txt ip1.txt #vim比较两个文档
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qtA6ZZz-1690465877805)(shell.assets/image-20230421140455358.png)]
set nu #显示行号
set ic #搜索忽略大小写
------------------------------------------------------------------
针对当前用户vim环境: vim ~/.vimrc
针对系统所有用户vim环境: vim /etc/.vimrc
------------------------------------------------------------------
针对vim异常退出:
首先使用vim -r filename恢复文件,但是重新进入还会提示,所以使用rm -f .filename.swp删除对应文件的.swp文件就不会提示了
用户管理
/etc/passwd
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TI3dTKCA-1690465877806)(shell.assets/下载.png)]
/etc/shadow
root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/shadow
root:$6$A/MGS6qN08/a$1Lj0ukzeLeCoKuJjaAjGK2tRa9HkyzaC4OYLo0GRtWyayLxix9qX7y9Cyul966AUpw5RI5XVjvkfqK/3s3..M0:19319:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
字段名称解释
1.用户登陆名 #用户的账号名称
2.加密后的密码 #用户密码,这是加密过的口令(未设密码时为!!)
---------了解----------------
3.最近一次密码更改时间 #从1970年到最近一次更改密码时间之间过了多少天
4.密码最少使用几天 #密码最少使用几天才可以更改密码(0表示无限制)
5.密码最长使用几天 #密码使用多少天需要修改密码(默认99999永不过期)
6.密码到期前警告期限 #密码过期前多少天提醒用户更改密码(默认过期提前7天警告)
7.密码到期后保持活动的天数 #在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定
8.账户到期时间 #从1970年起,账户在这个日期前可使用,到期后失效。
9.标志 #保留
用户增删改
添加用户useradd username
需求:创建qq
用户,UID为5001
,基本组students
,附加组sa
,注释信息2021 new student
,登陆shell为/bin/bash
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd students
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd sa
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# useradd qq -u 5001 -g students -G sa -c "2021 new students" -s /bin/bash
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# id qq
uid=5001(qq) gid=1001(students) groups=1001(students),1002(sa)
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/passwd
qq:x:5001:1001:2021 new students:/home/qq:/bin/bash
useradd参数:
-u: 指定UID
-g: 指定组名称
-G: 指定附加组名称
-c: 附加描述信息 (忽略)
-s: 指定登录Shell窗口的类型
-M: 不创建用户家目录
-r: 创建系统用户(UID随机为201-999)
修改用户usermod username
usermod参数:
-u 指定要修改用户的UID
-g 指定要修改用户基本组
-G 指定要修改用户附加组,使用逗号隔开多个附加组, 覆盖原有的附加组
-d 指定要修改用户家目录
-s 指定要修改用户的bash shell
-c 指定要修改用户注释信息
-l 指定要修改用户的登陆名 (了解)
删除用户userdel username
userdel参数:
-r 删除用户同时,删除它的家目录
注意:有进程正在使用该用户,无法删除;只有进程退出后,用户没有被占用,才可以处理
密码设置passwd username
- 超级管理员
- 随意修改任何人的密码,密码强度可以随意
- 普通用户执行
- 仅修改自己的密码,不可以修改其他人,密码强度必须满足8个字符及以上
1.使用--stdin参数可以直接设置密码,不用确认
2.tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# echo "123" | tee a.txt | passwd --stdin qq
Changing password for user qq.
passwd: all authentication tokens updated successfully.
创建用户默认环境
系统创建用户参考的两个配置文件
-
/etc/login.defs
-
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# grep -vE "^#|^$" /etc/login.defs MAIL_DIR /var/spool/mail PASS_MAX_DAYS 99999 #密码最常使用的天数 PASS_MIN_DAYS 0 #密码最小使用的天数 PASS_MIN_LEN 5 #密码默认的长度 PASS_WARN_AGE 7 #密码过期前7天警告 #定义的普通用户的UID范围 UID_MIN 1000 UID_MAX 60000 #定义系统用户的UID范围 SYS_UID_MIN 201 SYS_UID_MAX 999 #定义组的GID范围 GID_MIN 1000 GID_MAX 60000 #定义系统组GID范围 SYS_GID_MIN 201 SYS_GID_MAX 999 #创建家目录 CREATE_HOME yes UMASK 077 #创建用户并且创建同名的组 USERGROUPS_ENAB yes #加密的算法 ENCRYPT_METHOD SHA512
-
-
/etc/default/useradd
-
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home #家目录创建在/home INACTIVE=-1 #是否启用账号过期停权,-1表示不启用 EXPIRE= #账号终止日期,不设置表示不启用 SHELL=/bin/bash #默认给一个登录shell类型 SKEL=/etc/skel #默认拷贝一个环境变量到家目录,如果用户故障,可以从这里重新拷贝一份 CREATE_MAIL_SPOOL=yes #创建mail文件
-
用户组增删改
创建组groupadd
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd g1 -g 1456
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/group
g1: x: 1456:
组名称 组密码 组GID 附加组成员
修改组groupmod
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupmod g1 -g 5656
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/group
g1:x:5656:
删除组groupdel
-
组中存在成员怎么办?
-
如果组是附加组:
- 如果附加组中只有附加组成员,直接删除,而用户附加组信息会自动被移除
- 如果附加组中有附加组成员和基本组成员,需要先从基本组中删除该成员,然后再直接删除该附加组
-
如果组是基本组:
- 只有移除基本组中最后一个用户,该组才可以删除
-
用户权限
预备知识
- Linux Shell主要分为如下几类
- 交互式shell,等待用户输入执行的命令(终端操作,需要不断提示)
- 非交互式shell,执行shell脚本,脚本执行结束后shell自动退出
- 登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
- 非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
- bash shell配置文件介绍(文件主要保存用户的工作环境)
- 个人配置文件:
~/.bash_profile
,~/bashrc
- 全局配置文件:
/etc/profile
,/etc/profile.d/*.sh
,/etc/bashrc
- profile类文件,设定环境变量,登陆前运行的脚本和命令
- bashrc类文件,设定本地变量,定义命令别名
- 注意:如果全局配置和个人配置产生冲突,以个人配置为准
- 个人配置文件:
- 登陆系统后,环境变量配置文件的应用顺序
- 登录式shell配置文件执行顺序:
/etc/profile
→/etc/profile.d/*.sh
→~/.bash_profile
→~/.bashrc
→/etc/bashrc
- 非登陆式shell配置文件执行顺序:
~/.bashrc
→/etc/bashrc
→/etc/profile.d/*.sh
- 登录式shell配置文件执行顺序:
su 切换身份
-
su UserName相当于非登陆式shell,配置文件少,不推荐 ❌
-
su - Username相当于登录式shell ✔
-
在root用户下直接借助Username用户身份去运行命令
-
有些程序不支持root直接启动,必须是普通用户。所以普通用户不需要登录系统,只是用来完成服务的启动,通过 su - username -c “command” 来完成服务的启动。
#不用登录qq用户,可以直接使用qq用户身份调用命令 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# su - qq -c "ifconfig" eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.25.50.171 netmask 255.255.192.0 broadcast 172.25.63.255 ether 00:16:3e:08:d2:49 txqueuelen 1000 (Ethernet) RX packets 221384000 bytes 111939096427 (104.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 188618377 bytes 112405781218 (104.6 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 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
-
sudo 提取权限
# /etc/sudoers自定义用户权限类型
# 1.使用sudo定义分组,给用户分组
User_Alias OPS = oldxu,oldqiang
User_Alias DEV = oldli,oldguo
# 2.定义可执行的命令组
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
Cmnd_Alias Grant = /bin/rm, /bin/ls
# 3.使用sudo开始分配权限
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV ALL=(ALL) SOFTWARE,PROCESSES
权限与用户关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDpuoB6X-1690465877806)(shell.assets/image-20230423152750425.png)]
rwx对文件和目录影响
权限 | 文件 | 目录 |
---|---|---|
读取权限(r) | 具有读取,阅读文件内容权限 | 具有浏览目录及子目录 |
写入权限(w) | 具有新增,修改文件内容的权限 | 具有增加和删除目录内的文件 |
执行权限(x) | 具有执行文件的权限 | 具有访问目录的内容(取决于目录中文件权限) |
- 总结:
- 文件rwx权限只能读,写,执行。如果想要删除,移动,复制文件需要该目录有rwx权限才行
- 文件r权限, 只给用户查看,无其他操作
- 文件rw权限, 可以查看和编辑文件内容
- 文件rx权限, 允许查看和执行文件、但不能修改文件----->(脚本文件、命令文件)
- 文件rwx权限, 能读,能写,能执行,但不能删除,因为删除需要看上级目录的权限有没有w----->(谨慎赋予)
- 目录rx权限, 允许浏览目录内文件以及子目录, 不允许在该目录下创建文件、删除文件
- 目录rw权限, 能查看目录,能往目录写入文件,但无法进入目录----->(使用的情况太少)
- 文件的x权限小心给予,通常设定的权限是644
- 目录的w权限小心给予,通常设定的权限是755
变更属主和属组
chown -R www PATH/ # 仅变更属主
chown -R .www PATH/ # 仅变更属组
chown -R www.root PATH/ # 同时变更属主和属组
-R:对目录递归操作
- 变更属主和属组的场景
- www最开始没有访问index的资格,需要修改属主,属组和权限才能访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0CVfZLG-1690465877807)(shell.assets/image-20230423183618706.png)]
特殊权限
注意:如果原来x位置上有权限则为小写,如果没有为大写
setuid(4):
-
增加权限:
chmod 4xxx
或者chmod u+s
-
取消权限:
chmod 0xxx
或者chmod u-s
-
setuid(suid):不可以对目录执行,他只针对二进制文件(命令)
-
例子1:当普通用户oldxu执行passwd命令会发生什么变化
-
由于passwd命令拥有suid特殊权限(在命令属主权限位有一个s)
-
所以passwd命令在执行的过程中,会以命令的属主身份(也是root身份)去运行该命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKmjXKhm-1690465877807)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDc5NDMy,size_16,color_FFFFFF,t_70.png)]
-
-
例子2:jack通过cat如何查看/etc/shadow文件:
-
jack执行cat命令查看/etc/shadow。cat是由jack运行的,能不能查看,取决于jack用户对/etc/shadow有没有权限,/etc/shadow默认任何人都无权限,所以查看失败,提示 Permission denied
-
解决:
方式1: sudo 提权 jack ALL=(ALL) /usr/bin/cat 方式2: 将cat命令添加特殊权限位 suid; [root@oldboyedu ~]# ll /bin/cat -rwxr-xr-x. 1 root root 54080 Aug 20 2019 /bin/cat [root@oldboyedu ~]# chmod 4755 /bin/cat [root@oldboyedu ~]# ll /bin/cat -rwsr-xr-x. 1 root root 54080 Aug 20 2019 /bin/cat
-
setgid(2):
-
增加权限:
chmod 2xxx
或者chmod g+s
-
取消权限:
chmod 0xxx
或者chmod g-s
-
命令赋予setgid后,任何用户在执行命令时,以这个命令的属组身份去运行
-
目录赋予setgid后,所有该目录下创建的文件,都按照属组的身份来
-
场景:假设系统中有两个账号,分别是
user1
与user2
,这两个人除了自己群组之外还共同支持一个名为project
的组。假设这两个用户需要共同拥有/data/code
目录的开发权,互相之间能修改彼此的文件,且该目录不允许其他人进入查阅,请问该目录的权限设定应为何?-
创建组,以及用户
[root@oldboyedu ~]# groupadd project [root@oldboyedu ~]# useradd user1 -G project [root@oldboyedu ~]# useradd user2 -G project
-
创建项目目录,分配权限。禁止其他人访问该目录,同时还要保证user1,user2能正常读写执行
[root@oldboyedu ~]# chown .project /data/code/ [root@oldboyedu ~]# chmod 770 /data/code/ [root@oldboyedu ~]# ll -d /data/code/ drwxrwx--- 2 root project 6 Mar 17 10:47 /data/code/
-
给目录增加sgid
[root@oldboyedu ~]# chmod 2770 /data/code/ [root@oldboyedu ~]# ll -d /data/code/ drwxrws--- 2 root project 24 Mar 17 10:52 /data/code/
-
user1创建文件,测试user2能否正常修改,并且属组没有变化
[user1@oldboyedu code]$ touch user1_file [user1@oldboyedu code]$ ll total 0 -rw-rw-r-- 1 user1 project 0 Mar 17 10:54 user1_file [user2@oldboyedu code]$ echo "aaa" > user1_file [user2@oldboyedu code]$ cat user1_file aaa [user2@oldboyedu code]$ ll -d user1_file -rw-rw-r-- 1 user1 project 4 Mar 17 10:56 user1_file
-
setbit(1):
- Sticky粘滞位目前只对目录有效,作用如下:目录一旦被赋予了粘滞位,除了root 可以删除所有文件,普通用户对该目录就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。
- 增加权限:
chmod 1xxx
或者chmod o+s
- 取消权限:
chmod 0xxx
或者chmod o-s
特殊属性:加特殊属性chattr,查看特殊属性lsattr
- 作用:
- 加特殊属性后,它不允许被修改、移动、删除、包括root都不行。适合/etc/passwd文件
- 加特殊属性后,只希望往文件里面追加数据,不允许修改、移动、删除。适合sudo审计日志
- 命令格式:chattr [±=] [选项] 文件或目录名
- =是设置为指定的属性,而忽略原有的属性设置,±为在原有参数的基础上,操作
- a:可对文件进行追加内容
- i:锁定文件,不允许其他操作
umask:
-
定义:umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”。
- 一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。
-
例子:
如果用户的UID大于199 并且 用户名称与组的名称一致,则执行then后面的代码; 设定umask为002 如果不满足条件,则执行else后面的代码; 设定umask为022 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else umask 022 fi 为什么有些目录初始为755 就是777-022=755
重定向与管道
**重定向:**将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中
名称 | 文件描述符 |
---|---|
标准输入(STDIN) | 0 |
标准输出(STDOUT) | 1(可省略不写) |
错误输出(STDERR) | 2 |
文件名称(filename) | 3+ |
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -f /var/log/messages
Apr 25 12:30:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Started Session 25885 of user root.
Apr 25 12:30:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Removed slice User Slice of root.
Apr 25 12:40:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Created slice User Slice of root.
如图:
文件描述符0重定向到/dev/pts/1,也就是指令信息输入到屏幕
文件描述符1重定向到/dev/pts/1,也就是正确信息输出到屏幕
文件描述符2重定向到/dev/pts/1,也就是错误信息输出到屏幕
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuEL66OO-1690465877809)(shell.assets/image-20230425124910396.png)]
类型 | 操作符 | 用途 |
---|---|---|
标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容标准追加输出重定向 |
标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件 |
错误覆盖输出重定向 | 2> | 将程序输出的错误结果输出到执行的文件中,会覆盖文件原有的内容错误追加输出重定向 |
错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件 |
标准输入重定向 | << | 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令 |
案例1:正确输出到文件,错误输出到屏幕
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >ok.txt #因为1可以省略,所以正确内容重定向到ok.txt中,错误的输出屏幕所以不用管
find: ‘/etc/ntp/crypto’: Permission denied
find: ‘/etc/audisp’: Permission denied
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ cat ok.txt
/etc
/etc/magic
案例2:正确错误都输出到一个文件中
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc &>ok1.txt
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >>ok2.txt 2>&1 #另一种输出到一个文件中的写法
# /etc >> ok2.txt 先把正确的输入到ok2中
# 2>&1 在让标准错误(文件描述符2)的输出流与标准输出(文件描述符1)的输出流合并,这样,它们的输出内容都会被发送到同一个地方,例如文件或终端
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >ok3.txt 2>&1 #用>符号也行,因为2>&1都是合并输出流
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ vimdiff ok1.txt ok2.txt #可以看到两个一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2x6oif9-1690465877810)(shell.assets/image-20230425132106500.png)]
案例3:输出到/dev/null。/dev/null
是一个特殊的设备文件,它相当于一个黑洞,任何写入它的数据都会被丢弃。因此,&>/dev/null
不会占用额外的空间。
管道:输出变成下一个输入,但是只能把标准输出,输入到下一个进程中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDtD3WvE-1690465877810)(shell.assets/image-20230425134022181.png)]
-
管道中tee:在输出屏幕的同时可以把内容存入到文件中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNTyj1VI-1690465877811)(shell.assets/image-20230425135240261.png)]
-
xargs:把前面内容变成我这条命令的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQPqfSe1-1690465877811)(shell.assets/image-20230425135937883.png)]
- xargs -nx:分组,每行x个
find与压缩
find 搜索路径 [选项] 搜索内容
-
按照文件类型搜索
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -type f /etc/magic /etc/chrony.keys /etc/rwtab -type d:查找目录 -type f:查找普通文件 -type l:查找软链接文件
-
按照文件名搜索
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -name "if*" /etc/sysconfig/network-scripts/ifdown-Team /etc/sysconfig/network-scripts/ifdown-ippp -name: 按照文件名搜索; -iname: 按照文件名搜索,不区分文件名大小 -inum: 按照 inode 号搜索
-
按照文件大小搜索
- -size[±]大小:按照指定大小搜索文件
- "+"的意思是搜索比指定大小还要大的文件
- “-” 的意思是搜索比指定大小还要小的文件
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -size +5M #有单位k、M、G /etc/udev/hwdb.bin
- -size[±]大小:按照指定大小搜索文件
-
按照修改时间搜索
- -5:代表5天内修改的文件
- 5:代表前5~6天那一天修改的文件
- +5:代表6天前修改的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIdh94uk-1690465877811)(shell.assets/2-1P930143J9411.jpg)]
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -atime -3 /etc /etc/magic /etc/ppp -atime [+-]时间: 按照文件访问时间搜索 -mtime [+-]时间: 按照文件内容修改时间搜索 -ctime [+-]时间: 按照文件修改时间搜索 mtime:当文件内容更改时,mtime才会更新 ctime:更改文件任何属性,其都会更新 time 也可以按照 amin、mmin 和 cmin 来査找文件的时间
-
按照所有者和所属组搜索
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /home/qq/ -user qq /home/qq/ /home/qq/.viminfo /home/qq/ok2.txt -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件 -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件 -user 用户名:按照用户名査找所有者是指定用户的文件 -group 组名:按照组名査找所属组是指定用户组的文件 -nouser:査找没有所有者的文件
-
按照权限搜索
-perm 权限模式:査找文件权限刚好等于"权限模式"的文件 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find / -perm 444 #直接找相同的权限 /usr/share/man/man1/cancel-cups.1.gz /usr/share/man/man1/lprm-cups.1.gz /usr/share/man/man1/lpoptions.1.gz -perm -权限模式:査找文件权限全部包含"权限模式"的文件 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find . -perm -200 #搜索文件的权限包含200(-w-------) ./test4 #此文件权限为200(-w-------) ./test3 #此文件权限为600(-rw-------) ./testl #此文件权限为755(-rwxr-xr-x) 这几个文件都包含 200(--w-------) 权限,所以可以找到,而 test2 的权限是 444 (-r--r--r--),不包含 200 (--w-------)权限,所以找不到 -perm +权限模式:査找文件权限包含"权限模式"的任意一个权限的文件 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find . -perm +444 #搜索文件的权限部分满足444(-r--r--r--) ./test2 #此文件权限为444(-r--r--r--) ./test3 #此文件权限为600(-rw-------) ./test1 #此文件权限为755(-rwxr-xr-x) 200(--w-------)没有(-r--r--r--)所以不满足
-
逻辑运算符
- -a:and逻辑与
- -o:or逻辑或
- -not:not逻辑非
-
执行动作
动作 含义 -print 打印查找到的内容(默认) -Is 以长格式显示的方式打印查找到的内容 -delete 删除查找到的文件(仅能删除空目录) -ok 后面跟自定义shell命令(会提示是否操作,写法同-еxес) -еxес 后面跟自定义 shell命令(标准写法 -exec 命令x {}\;) - “-exec"选项的作用是把 find 命令的结果放入”{}"中,再由命令x 直接处理。
压缩
- gzip
打包:
[root@oldboyedu ~]# gzip /etc/yum.repos.d/* #给所有文件进行后缀压缩,变相注释了所有文件
查看:
[root@oldboyedu ~]# zcat /etc/yum.repos.d/CentOS-Base.repo.gz
解压:
[root@oldboyedu ~]# gzip -d /etc/yum.repos.d/*
-
bzip2
[root@oldboyedu ~]# bzip2 /etc/yum.repos.d/* [root@oldboyedu ~]# bzcat /etc/yum.repos.d/CentOS-Base.repo.bz2 [root@oldboyedu ~]# bzip2 -d /etc/yum.repos.d/*
-
zip/unzip
zip 格式: 选项: -r: 递归打包; -T: 测试压缩包是否正常; -sf: 查看包内容 [root@oldboyedu ~]# zip -r /opt/test.zip /etc /root /tmp /etc/hostname unzip: -d: 解压到指定的目录下; -l: 查看压缩包内容; -t: 测试文件的内容; [root@oldboyedu ~]# unzip /opt/root.zip -d /tmp/
-
tar
tar -c:建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 -z:有gzip属性的 -j:有bz2属性的 -Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出 -f: 使用档案名字
-
打包
[root@oldboyedu ~]# tar -czf /opt/qq.tar.gz /root/ /tmp/ #打一个tar.gz格式的压缩包 [root@oldboyedu ~]# tar -cjf /opt/qq.tar.bz2 /root/ /tmp/ #打一个tar.bz2格式的压缩包 [root@oldboyedu ~]# tar -cJf /opt/qq.tar.xz /root/ /tmp/ #打一个tar.xz格式的压缩包
-
解压
tar –xvf file.tar #解压 tar包 tar -xzvf file.tar.gz #解压tar.gz tar -xjvf file.tar.bz2 #解压 tar.bz2 tar –xZvf file.tar.Z #解压tar.Z
-
排除文件:–exclude=
[root@oldboyedu ~]# tar -czf etc.tar.gz /etc/ --exclude=etc/passwd --exclude=etc/shadow
-
排除多个文件:X指定从哪个文件中读取要排除的文件名称
打包/etc目录为etc.tar.gz,但是在打包之前: 1.读取pc.list文件; 2.获取排除的文件名称; 3.筛选掉需要排除的文件; 4.执行打包操作; [root@oldboyedu ~]# tar -czfX etc_new.tar.gz pc.list /etc/
-
-
RPM软件包管理
Linux常见软件包
系统平台 | 包类型 | 工具 | 自动解决依赖 |
---|---|---|---|
RedHat/Centos | RPM | rpm | yum |
Ubuntu/Debian | deb | dpkg | apt |
安装软件常见方法
分类 | 安装 | 版本 |
---|---|---|
rpm包 | 预先编译打包,安装简单 | 软件版本偏低 |
源码包 | 手动编译打包,安装繁琐 | 软件版本随意 |
二进制包 | 解压即可使用,安装简单 | 不能修改源码 |
yum | 安装软件最常用方法 |
RPM软件包命名规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSO0NT8Z-1690465877812)(shell.assets/image-20230506203305582.png)]
查看系统版本
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -a
Linux iZ2zeco2fmiqbbuzq773qyZ 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -m
x86_64
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# hostnamectl
Static hostname: iZ2zeco2fmiqbbuzq773qyZ
Icon name: computer-vm
Chassis: vm
Machine ID: 20190711105006363114529432776998
Boot ID: 7d3cfb8c45384bfb9585bcc5bbde8743
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-957.21.3.el7.x86_64
Architecture: x86-64
-
RPM安装
-i: 安装 -v: 详细信息 -h: 安装进度 --test: 测试是否能够安装成功 --force: 强制重新安装 --nodeps: 忽略依赖关系
-
RPM查询
rpm -q #查看指定软件包是否安装 rpm -qa #√查看系统中已安装的所有RPM软件包列表 rpm -qi #查看指定软件的详细信息 rpm -ql #√查询指定软件包所安装的目录、文件列表 查询已安装软件信息 rpm -qc #查询指定软件包的配置文件 rpm -qd #查询指定软件包的帮助文档 man手册 rpm -qf #查询文件或目录属于哪个RPM软件 rpm -q --scripts #查询rpm包安装前和安装后执行的脚本 rpm -qip #查询未安装的rpm包详细信息 rpm -qlp #查询未安装的软件包会产生哪些文件 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# rpm -qa | grep tree #通过grep查询需要包关键字 tree-1.6.0-10.el7.x86_64
-
RPM升级
rpm -Uvh #如果老版本不存在,就全新安装,如果存在有新版即升级
-
RPM卸载
-e 删除指定的软件包 注意:卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。 #先查询,在删除
-
RPM检验
rpm -V #验证与软件刚刚安装的时候(命令,配置)对比 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# >/usr/bin/tree [root@iZ2zeco2fmiqbbuzq773qyZ ~]# rpm -V tree S.5....T. /usr/bin/tree S //文件的容量大小是否被改变 M //文件的类型或者文件的属性是否被修改 5 //MD5这一种指纹加密的内容已经不同 文件内容变化 D //装置的主/次代码已经改变 L //路径已经被改变 U //文件的所属主已被修改 G //文件的所属组已被修改 T //文件的修改时间已被改变
YUM
yum源配置基础
#base源:基础源
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7
#epel源:额外的软件
修改/etc/yum.repos.d/epel.repo
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/epel/7/$basearch
gpgcheck=0
gpgkey=http://mirrors.cloud.aliyuncs.com/epel/RPM-GPG-KEY-EPEL-7[root@iZ2zeco2fmiqbbuzq773qyZ
#[BaseOS]
yum的ID,必须唯一,本地有多个yum源的时候,这里必须是唯一的
#name=CentOS-$releasever
具体的yum源名字,其实相当于对它的描述描述信息 $releasever你可以使用这个变量参考红帽企业Linux发行版,也就是说表示当前发行版的大版本号。
#baseurl:镜像服务器地址
只能写具体的确定地址。下面的例子中,只能有一个baseurl,但里面可以包含多个url
#mirrorlist:镜像服务器的地址列表
里面有很多的服务器地址。这里有一个变量$arch,cpu体系,还有一个变量:$basearch,cpu的基本体系组
#baseurl和mirrorlist - 指向yum源的地址
不同点是包含地址的多少。你若自己写的话,我们一般只写一个地址,直接用baseurl就行
#gpgcheck=0
要不要验证呢,取消验证。1,使用公钥检验rpm的正确性。
gpgcheck若是1将对下载的rpm将进行gpg的校验,校验密钥就是gpgkey,一般自己的yum源是不需要检测的。gpgcheck=0,那么gpgkey就可以不填写
#enabled=0
当某个软件仓库被配置成 enabled=0 时,yum 在安装或升级软件包时不会将该仓库做为软件包提供源。
配置其他服务源:
- 书写配置文件
- 下载安装对应的源的软件包,例如:xxx-release.rpm(包含repo文件),安装后就有对应repo文件了
- yum下载软件时会自动从所有可用的源中选择最快的一个下载。如果您想要指定从某个特定的源下载软件,可以使用yum命令的–enablerepo选项。例如,如果您想要从nginx源下载软件,可以使用以下命令:yum --enablerepo=nginx install nginx。
yum源命令使用
##########查找##############3
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# yum provides ifconfig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base/7/x86_64/filelists_db | 7.2 MB 00:00:00
epel/x86_64/filelists_db | 12 MB 00:00:00
extras/7/x86_64/filelists_db | 276 kB 00:00:00
updates/7/x86_64/filelists_db | 11 MB 00:00:00
net-tools-2.0-0.24.20131004git.el7.x86_64 : Basic networking tools
Repo : @base
Matched from:
Filename : /usr/sbin/ifconfig
#yum search all ifconfig
查找更详细
#yum list | grep 包名称
############安装##############
#yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm
localinstall 安装本地的rpm包并通过yum源解决rpm依赖问题
#yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbixrelease-3.4-2.el7.noarch.rpm
直接安装清华源的rpm包
#yum reinstall xxx
重新安装
############更新##################
#yum check-update
检查更新
#yum update acl -y
更新软件
##############删除##################
#yum [erase or remove] xxx -y
删除软件及依赖,尽量使用rpm -e删除软件不删除依赖
##########仓库命令################
# yum repolist [all]
yum源列表 [列出yum源可用的软件仓库]
###########缓存################
# yum makecache
生成yum缓存,在yum.conf对应yum源中生成xml文件
#yum clean all
清空本地yum缓存,更换了yum源一般需要清空缓存,让系统重新生yum缓存
# yum clean packages
只清除缓存的软件包
#修改/etc/yum.conf配置文件保留缓存,默认删除
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# head -3 /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1 #1为保留
#######组########
#yum groups list
#yum groups install
###########历史##########
#查看历史执行yum命令
[root@oldboyedu ~]# yum history
#查询历史执行yum命令ID详细信息
[root@oldboyedu ~]# yum history info N(N为history的id号)
#撤销历史执行过的yum命令
[root@oldboyedu ~]# yum history undo N
###########yum.conf###########
cachedir=/var/cache/yum/$basearch/$releasever #缓存目录 *****
keepcache=0 #缓存软件包, 1启动 0 关闭 *****
debuglevel=2 #调试级别 debug调试 一般用于排错
logfile=/var/log/yum.log #日志记录位置 *****
exactarch=1 #检查平台是否兼容
obsoletes=1 #检查包是否废弃
gpgcheck=1 #检查来源是否合法,需要有制作者的公钥信息 ***
plugins=1 #是否开启yum额外的插件
installonly_limit=5
bugtracker_url
# metadata_expire=90m //每小时手动检查元数据
# in /etc/yum.repos.d //包含repos.d目录
yum密钥认证机制
yum源中gpgkey是公钥位置
#yum install httpd --nogpgcheck
不检查公钥
配置自己的yum仓库
服务端:自己的yum仓库,每一个客户端只能上内网,所以只能局域网yum安装
客户端:配置服务端的yum
###############服务端##################
#########第一步 关闭防火墙#############
#1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#2.关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#########第二部 基础准备#############
#1.安装ftp服务,启动并加入开机启动
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
#2.配置 base和epel源
#3.开启yum缓存功能
keepcache=1
#4.yum clean all
########第三步 准备rpm包##############
#1.光盘挂载
mkdir /var/ftp/{centos610,centos79} #客户段下载rpm包在这
mount /dev/cdrom /mnt
cp -rp /mnt/Packages/*.rpm /var/ftp/centos79
#2.第三方rpm包
先安装到服务器上,再把`/var/cache/yum/x86_64/7/`的rpm包复制到`/var/ftp/第三方/`中
#3.构建元文件,注意: 如果此仓库每次新增软件则需要重新生成一次
安装yum -y install createrepo,使用这个软件创建元文件
[root@iZ2zeco2fmiqbbuzq773qyZ ~]createrepo /var/ftp/ops
[root@iZ2zeco2fmiqbbuzq773qyZ ~]createrepo /var/ftp/centos79
`缓存作用,加快客户端安装过程`:客户端连接时会查看repodata目录的xml文件,加速过程。
###############客户端##################
[root@yum_client ~]# vim /etc/yum.repos.d/centos7.repo
[centos79]
name=centos79_base
baseurl=ftp://10.0.0.100/centos79
gpgcheck=0
[root@yum_client ~]# vim /etc/yum.repos.d/第三方.repo
[opt]
name=local ftpserver
baseurl=ftp://10.0.0.100/第三方 #FTP服务器上的默认目录,通常是/var/ftp或者/srv/ftp。
gpgcheck=0
客户端流程:
1.将连接到FTP服务器上的repodata目录以获取软件包和其依赖项的信息,
2.使用createrepo生成的元数据确定软件包的依赖关系和版本信息,
3.下载并安装这些软件包及其依赖项。
源码编译安装
编译环境:gcc、make
依赖环境:pcre、openssl
yum install -y pcre-devel openssl-devel
三部曲:
- 第一步:./configure(定制组件 配置)
- 指定安装路径,编译安装默认路径 /usr/local/ ,例如 --prefix=/app/web/nginx-1.18.0
- 启用或禁用某项功能, 例如 --enable-ssl
- 和其它软件关联,例如–with-pcre
- 检查安装环境,例如是否有编译器 gcc,是否满足软件的依赖需求
- 检测通过后生成Makefile文件
- 第二步:make(源代码编译—>二进制命令)
- 执行make命令进行编辑, 可以使用-j指定CPU编译
- -J 并发执行编译安装
- -j 以cpu核心总数一致
- 按Makefile文件进行编译, 编译成可执行二进制文件
- 生成各类模块和主程序
- 第三步:make install(安装)
- 按Makefile定义好的路径拷贝至安装目录中
磁盘管理
raid
RAID0:
- 将多块磁盘组合在一起形成一个大容量的存储。当我们要写数据的时候,会将数据分为N份,以独立的方式实现N块磁盘的读写,那么这N份数据会同时并发的写到磁盘中,因此执行性能非常的高。
- RAID0 的读写性能理论上是单块磁盘的N倍(仅限理论,因为实际中磁盘的寻址时间也是性能占用的大头)
- 但RAID0的问题是,它并不提供数据校验或冗余备份,因此一旦某块磁盘损坏了,数据就直接丢失,无法恢复了。因此RAID0就不可能用于高要求的业务中,但可以用在对可靠性要求不高,对读写性能要求高的场景中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wK60weeS-1690465877813)(shell.assets/image-20230522192605197.png)]
RAID1:
- RAID1 是磁盘阵列中单位成本最高的一种方式。因为它的原理是在往磁盘写数据的时候,将同一份数据无差别的写两份到磁盘,分别写到工作磁盘和镜像磁盘,那么它的实际空间使用率只有50%了,两块磁盘当做一块用,这是一种比较昂贵的方案。
- RAID1其实与RAID0效果刚好相反。RAID1 这种写双份的做法,就给数据做了一个冗余备份。这样的话,任何一块磁盘损坏了,都可以再基于另外一块磁盘去恢复数据,数据的可靠性非常强,但性能就没那么好了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1zSxbKE-1690465877813)(shell.assets/image-20230522192818102.png)]
RAID5:
- 把校验码信息PARITY分布到各个磁盘上。例如,总共有N块磁盘,那么会将要写入的数据分成N份,并发的写入到N块磁盘中,同时还将数据的校验码信息也写入到这N块磁盘中(数据与对应的校验码信息必须得分开存储在不同的磁盘上)。一旦某一块磁盘损坏了,就可以用剩下的数据和对应的奇偶校验码信息去恢复损坏的数据。
- 最少需要三块磁盘来组建磁盘阵列,允许最多同时坏一块磁盘。如果有两块磁盘同时损坏了,那数据就无法恢复了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPxsxtKT-1690465877814)(shell.assets/image-20230522192840604.png)]
RAID10:
- RAID10兼备了RAID1和RAID0的有优点。首先基于RAID1模式将磁盘分为2份,当要写入数据的时候,将所有的数据在两份磁盘上同时写入,相当于写了双份数据,起到了数据保障的作用。且在每一份磁盘上又会基于RAID0技术讲数据分为N份并发的读写,这样也保障了数据的效率。
- 但也可以看出RAID10模式是有一半的磁盘空间用于存储冗余数据的,浪费的很严重,因此用的也不是很多。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kwevAebu-1690465877814)(shell.assets/image-20230522192853661.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHb62N4l-1690465877814)(shell.assets/image-20230522193548924.png)]
磁盘分区表mbr与gpt
**mbr分区表:**主引导记录,还可以叫做主引导扇区。它的运行机制存在于硬件的基础之上,它存储在硬盘的第一个扇区上。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJoTiJMX-1690465877815)(shell.assets/image-20230525220136831.png)]
- 主分区:数量至少1个,最多4个(如果存在扩展分区,则最多3个)。主分区可以直接使用,主分区本身不能继续分区,一个主分区就是一个逻辑磁盘。
- 扩展分区: 为了突破这最多四个主分区的限制,Linux系统引入了扩展分区。0个或1个,会占用一个主分区号,不能直接使用,必须在其上建立逻辑分区后才能用。 其实就是把1个主分区拿过来进行分区扩展了。
- 逻辑分区:扩展分区的容量是所有逻辑分区容量之和。
gpt | mbr |
---|---|
主分区数量不限 | 主分区最多4个,扩展分区1个 |
可以额外支持大容量硬盘2tb以上 | 只能支持2tb以内硬盘 |
查询磁盘信息
使用率:
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -h #以G或者T或者M人性化方式显示
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 2.8G 45G 6% /
devtmpfs 858M 0 858M 0% /dev
tmpfs 868M 0 868M 0% /dev/shm
tmpfs 868M 444K 867M 1% /run
tmpfs 868M 0 868M 0% /sys/fs/cgroup
tmpfs 174M 0 174M 0% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -T #查看磁盘分区类型 (文件系统类型)
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda1 ext4 51473368 2832124 46318144 6% /
devtmpfs devtmpfs 877748 0 877748 0% /dev
tmpfs tmpfs 888200 0 888200 0% /dev/shm
tmpfs tmpfs 888200 444 887756 1% /run
tmpfs tmpfs 888200 0 888200 0% /sys/fs/cgroup
tmpfs tmpfs 177644 0 177644 0% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -i #查看inode使用情况
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 3276800 60154 3216646 2% /
devtmpfs 219437 334 219103 1% /dev
tmpfs 222050 2 222048 1% /dev/shm
tmpfs 222050 386 221664 1% /run
tmpfs 222050 16 222034 1% /sys/fs/cgroup
tmpfs 222050 1 222049 1% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# du -sh ./* #默认显示目录,*就显示文件
4.0K ./1.REP
4.0K ./Centos-7.repo
4.0K ./ip1.txt
4.0K ./ip.txt
108K ./ok.txt
4.0K ./sort.txt
4.0K ./test
-s: summary 总结 ,汇总 列出总和
-h:人性化显示容量信息
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /
-NAME : 这是块设备名。
-MAJ:MIN : 本栏显示主要和次要设备号。
-RM : 本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
-SIZE : 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
-RO : 该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
-TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
-MOUNTPOINT : 本栏指出设备挂载的挂载点。
当前读写速度:
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switche~ --deserialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iotop -o #只显示读写进程
dd if=/dev/zero of=/tmp/big bs=1k count=10000000 #测试命令
磁盘分区,格式化,挂载
磁盘分区:
磁盘分区命令 | |
---|---|
fdisk | 支持mbr分区格式,2tb以内磁盘 |
parted | 支持mbr,gpt |
gdisk | fdisk升级版,gpt disk (仅支持gpt格式) |
- fdisk磁盘分区:
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# fdisk -l #查看磁盘分区信息
Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b2d99
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 104856254 52427103+ 83 Linux
#fdisk 分区实战
[root@oldboyedu ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
###你当前的修改都保存在内存中,直到你决定保存他们.
Changes will remain in memory only, until you decide to
write them.
Be careful before using the write command.
###在保存之前,小心点!!!
###磁盘当前没有磁盘分区表.
###给你创建了一个mbr(DOS)分区表
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier
0xc1a99fe8.
Command (m for help):
p print 显示分区信息
n new 创建磁盘分区 partition(分区)
d delete 删除磁盘分区
q 退出不保存
w 保存并退出
##查看当前磁盘信息
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc2483040
Device Boot Start End Blocks Id System
##创建一个磁盘分区 100MB
Command (m for help): n
Partition type:
p primary 主分区 (0 primary, 0 extended, 4 free)
e extended 扩展分区
Select (default p): #使用默认或者输入p
Using default response p
Partition number (1-4, default 1): #使用默认
First sector (2048-2097151, default 2048): #使用默认
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151,default 2097151): +100M
Partition 1 of type Linux and of size 100 MiB is set
#显示创建结果
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc2483040
Device Boot Start End Blocks Id System
/dev/sdb1 2048 206847 102400 83 Linux
#保存退出
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@oldboyedu ~]# lsblk #检查结果
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 37G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 100M 0 part #创建了/dev/sdb1
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 3T 0 disk
sr0 11:0 1 4.5G 0 rom
#primary 主分区 p
#extended 扩展分区 e
#logical 逻辑分区 l
sda 和 sdb 都是硬盘设备,而他们下面的是分区sda1,sdb1等等
- parted磁盘分区:
-p #print 显示磁盘分区信息
-mktable #创建 磁盘分区表 gpt/msdos
-mkpart #创建磁盘分区 mkpart pri 0 100
-rm #删除磁盘分区
-q #quit 退出
[root@oldboyedu ~]# parted /dev/sdc
GNU Parted 3.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of
commands.
#查看磁盘分区信息
(parted) p
Error: /dev/sdc: unrecognised disk label #磁盘目前没有分区
表 没有分区信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
#创建磁盘分区表gpt
mktable gpt
#创建磁盘分区
mkpart primary 100 200
**格式化:**创建文件系统make file system mkfs
#格式化
mkf.xfs /dev/sdb1
挂载:
mount 设备 入口
mount /dev/sdb1 /mnt
#永久挂载
#方法1 /etc/rc.local专门用来开机启动各种服务,命令,挂载....
/etc/rc.d/rc.local 用于添加开机启动命令
/etc/rc.local是/etc/rc.d/rc.local的软连接
[root@oldboyedu ~]# chmod +x /etc/rc.d/rc.local
[root@oldboyedu ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 Apr 1 2020 /etc/rc.d/rc.local
[root@oldboyedu ~]# vim /etc/rc.local #写入mount /dev/sdb1 /mnt
mount /dev/sdb1 /mnt
#方法2 /etc/fstab 挂载专用文件 (开机自动挂载)
##fstab格式说明
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 11 02:52:01 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1114fe9e-2309-4580-b183-d778e6d97397 / ext4 defaults 1 1
第1列 第2列 第3列 第4列 第5列 第6列
设备名称:/dev/sdb1 或UUID 挂载点 文件系统类型 挂载选项(默认选项) 是否备份 是否开机检查
UUID一词通常是指通用唯一标识符
PARTUUID”是指存储在分区表中或从分区表派生的分区的唯一标识符
PARTUUIDs是GUID分区表(GPT)的组成部分,它替代了与主引导记录(MBR)相关的磁盘分区
UUID就类似MBR中分区1,分区2,独有的
PARTUUID是GPT中每个分区的名字,因为GPT可以有多个分区
blkid #查询设备 uuid
磁盘故障案例
磁盘空间不足
-
block满了一
-
原因: 磁盘有大量的文件占用空间,导致空间不足
#模拟: dd if=/dev/zero of=/var/log/anaconda/big bs=1M count=2000 #排查: df -h du -sh /* |sort -hr du -sh /var/* |sort -hr du -sh /var/log/* |sort -hr 最终确定到文件或目录 确认后在rm删除
-
-
block满了二
-
原因: 删除大文件时,大文件有其他使用者访问(进程未清除,或者硬链接还有)
彻底删除一个文件需要: 1.硬链接数为0 通过rm删除 2.进程调用数为0 找出使用文件的进程/服务,关闭/重启 [root@oldboyedu small]# lsof |grep error.log tail 3160 root 3r REG 253,0 24444444490 45142267 /var/log/error.log(deleted) #error.log被tail占用,关闭tail命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foDNvpSQ-1690465877815)(E:\运维学习\shell.assets\image-20230529221131450.png)]
-
-
inode满了
-
原因: 磁盘上面有大量小文件,占用了大量的inode,最终磁盘空间不足
#模拟: echo {1..500000}|xargs touch touch a{1..100000} touch b{1..100000} touch c{1..100000} touch d{1..100000} #排查: #找出系统中占地面积比较大的目录 find / -type d -size +1M |xargs ls -lhd #删除时,由于文件过多会报错误 -bash: /usr/bin/rm: Argument list too long #解决: 1.记录好目录权限,所有者,再删除目录 2.ls/find + |xargs rm 删除 3.ls/find 1* |xargs rm 删除 #分批次删除
-
内存不足占用
-
swap交换分区:内存不足的时候临时充当内存
-
增加swap方法:
-
通过创建文件增加swap
#1 检查与创建文件 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h total used free shared buff/cache available Mem: 1.7G 147M 141M 444K 1.4G 1.4G Swap: 0B 0B 0B #2 创建文件转换为swap [root@iZ2zeco2fmiqbbuzq773qyZ ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=10 #创建文件 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.0173309 s, 605 MB/s [root@iZ2zeco2fmiqbbuzq773qyZ ~]# file /tmp/swap #查看类型 /tmp/swap: data [root@iZ2zeco2fmiqbbuzq773qyZ ~]# mkswap /tmp/swap #转换为swap Setting up swapspace version 1, size = 10236 KiB no label, UUID=bc1a17a4-3e84-488e-84d4-2511bf135cd8 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# file /tmp/swap #再次查看类型 /tmp/swap: Linux/i386 swap file (new style), version 1 (4K pages), size 2559 pages, no label, UUID=bc1a17a4-3e84-488e-84d4-2511bf135cd8 #3 激活on空间/关闭off空间 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapon /tmp/swap swapon: /tmp/swap: insecure permissions 0644, 0600 suggested. [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h total used free shared buff/cache available Mem: 1.7G 149M 128M 444K 1.4G 1.4G Swap: 9M 0B 9M [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapoff /tmp/swap [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h total used free shared buff/cache available Mem: 1.7G 149M 128M 444K 1.4G 1.4G Swap: 0B 0B 0B #4 查看swap组成 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapon -s Filename Type Size Used Priority /tmp/swap file 10236 0 -2 #file就是文件
-
磁盘分区作为swap
#通过磁盘增加swap 1)创建磁盘分区 2)转换为swap mkswap /tmp/swap 3)激活 swapon /tmp/swap
-
-
永久增加swap方法:
-
swapon /tmp/swap 放入/etc/rc.local。同永久挂载
-
写入到 /etc/fstab
[root@oldboyedu ~]# tail -1 /etc/fstab /dev/sdd1 swap swap defaults 0 0
-
-
buffer和cache
buffer:写缓冲区,目的是加速写入的速度
cache:读缓存区,目的是加速读取的速度
系统调试
救援模式
root密码忘记:
-
开机的时候,选择第1个,按e编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHUYpwYs-1690465877816)(E:\运维学习\shell.assets\image-20230531121009720.png)]
-
然后找到linux16的行,在这一行的最后添加rw init=/bin/sh,按ctrl+x
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2H6LKDZ-1690465877816)(E:\运维学习\shell.assets\image-20230531121106893.png)]
-
重新设置root密码,重启系统
-
故障:救援模式修改密码之后,无法进入系统,读条的时候卡住:selinux没关闭
修改/etc/selinux/config文件中SELINUX=disabled
系统的启动流程
Linux7系统的开机启动过程如下:
-
开机自检(检查硬件)
-
MBR/GPT引导系统启动
-
GRUB菜单,多个内核选择哪个启动
-
加载内核选项
-
内核初始化使用systemd进程(启动的Linux系统的第1个进程 systemd)
-
读取运行级别(桌面模式,命令行模式)/etc/systemd/system/default.target
-
初始化系统(挂载,启动网络,主机名,…)/usr/lib/systemd/system/sysinit.target
-
根据运行级 别、并行启动服务(网络服务,ssh服务,定时任务服务…)
-
显示login界面(输入用户密码)/usr/lib/systemd/system/getty.target
开机关机命令:
关机 | 重启 | 其他 | |
---|---|---|---|
shutdown -h 10 | shutdown -r 10 | ||
shutdown -h now/0 | shutdown -r now/0 | ||
halt (关闭系统,手动断电) | reboot | ||
poweroff | |||
init 0 #centos 6常用 | init 6 #centos 6常用 | ||
systemctl halt/poweroff | systemctl reboot |
poweroff:关机同时关闭电源,会发送一个ACPI信号通知系统关机
half:关机但是不关闭电源,需要手动关闭电源
shutdown:关机同时关闭电源,只有拥有root权限的用户才可以执行
可用
shutdown -c
撤回shutdown -h/-r
的开关机
系统运行级别
运行级别 centos6叫做runlevel | systemd目标名称 | 作用 |
---|---|---|
0 | poweroff.target | 关机 |
1 | rescue.target | 单用户模式级别。root 权限,用于系统维护(或修复系统,或重置系统密码信息),禁止远程登录 |
2 | multi-user.target | 多用户模式级别。该级别下没有NFS和网络的支持 |
3 | multi-user.target | 完整的多用户文本模式级别。登录后进入到控制台命令行模式 |
4 | multi-user.target | 预留级别。该级别系统未使用 |
5 | graphical.target | 图形化模式级别。登录后进入图形GUI模式 |
6 | reboot.target | 重启 |
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ll /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx 1 root root 15 Jul 11 2019 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root 13 Jul 11 2019 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root 17 Jul 11 2019 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 11 2019 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 11 2019 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root 16 Jul 11 2019 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root 13 Jul 11 2019 /usr/lib/systemd/system/runlevel6.target -> reboot.target
修改系统运行级别:
#centos6系统
[root@student ~]# runlevel #查看运行级别
N 3 #如果N是其他数字,代表上一次运行级别
[root@student ~]# init 3 #切换运行级别
[root@student ~]# /etc/inittab #永久修改运行级别存放的配置文件
#centos7系统
[root@student ~]# systemctl get-default #查看系统默认启动运行级别
[root@student ~]# systemctl set-default TARGET.target #修改默认启动运行级别(永久生效)
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
系统的systemd
systemd相关配置文件:
/usr/lib/systemd/system/ #记录这一个就ok. 类似Centos6系统的启动脚本,/etc/init.d/
/etc/systemd/system/ #系统配置存放,了解#类似Centos6系统的/etc/rc.d/rcN.d/
/etc/systemd/system/multi-user.target.wants/* #系统配置存放,了解
systemd管理服务相关命令:
systemctl start crond.service #启动服务,当前正在运行
systemctl stop crond.service #停止服务
systemctl restart crond.service #重启服务
systemctl reload crond.service #重新加载配置(不终止服务,不影响正在处理的请求/用户)
systemctl status crond.servre #查看服务运行状态
systemctl is-active sshd.service #查看服务是否在运行中
systemctl mask crond.servre #禁止服务运行
systemctl unmask crond.servre #取消禁止服务运行
systemctl enable crond.service #开机自动启动
systemctl disable crond.service #开机不要自动启动
systemctl list-unit-files #查看各个级别下服务的启动与禁用
systemctl is-enabled crond.service #查看特定服务是否为开机自启动
systemctl daemon- reload #创建新服务文件或者变更设置
systemctl服务状态:
服务状态 | 状态说明 |
---|---|
loaded | 服务单元的配置文件已经被处理,配置放在了/usr/lib/systemd/system/ |
active(running) | 服务的一个或多个进程在运行中最常见的状态 start |
active(exited) | 一次性运行的服务成功被执行并退出(服务运行后完成任务,相关进程会自动退出) |
active(waiting) | 服务已经运行但在等待某个事件 |
inactive | 服务没有在运行 stop |
enabled | 服务设定为开机运行 |
disabled | 服务设定为开机不运行 |
static | 服务会随着系统的启动而启动,并且会一直运行,直到系统关闭或服务被手动停止 |
systemctl的journalctl
日志:
journalctl -xe #-e按页显示 -x进行一些翻译,指出一些故障提示,找error 或 err 或warn 或fail
journalctl -n 20 #查看最后20行
journalctl -f #动态查看日志 ※※※
journalctl -p err #查看日志的级别
journalctl -u crond #查看某个服务的单元的日志
进程管理
进程正常处理流程:
- 子进程在处理任务代码时,父进程会进入等待状态中…
- 子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
- 如果子进程在处理任务过程中异常退出,而父进程没有回收子进程的资源,会导致子进程虽然运行实体已经消失,但仍然在内核中的进程表中占据一条记录,长期下去对系统中资源是一个浪费。(僵尸进程)
- 如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么子进程就没有父进程来管理了,由系统的system进程管理。(孤儿进程)
#每个进程都父进程的PPID,子进程则叫PID
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2022 ? 00:13:47 /usr/lib/systemd/systemd --switched-root --system --deserialize
root 2 0 0 2022 ? 00:00:01 [kthreadd]
root 3 2 0 2022 ? 00:03:09 [ksoftirqd/0]
root 5 2 0 2022 ? 00:00:00 [kworker/0:0H]
root 7 2 0 2022 ? 00:00:02 [migration/0]
root 8 2 0 2022 ? 00:00:00 [rcu_bh]
root 9 2 0 2022 ? 01:37:56 [rcu_sched]
root 10 2 0 2022 ? 00:00:00 [lru-add-drain]
ps指令
ps -ef #简洁格式
ps aux #完全格式,排错
ps auxf #显示进程的子进程
##自定义显示字段ps o
ps axo pid,%mem,stat,command #显示所有进程pid,内存使用率,进程状态,命令
##进程排序
ps aux --no-header |sort -rnk2 #第二列排序,并且不显示标题
ps aux --sort -vsz #ps自带排序指令--sort 加上对应格式,可以进行排序,-为逆序
##查看指定进程PID
#第一种过滤
ps -ef |grep sshd
ps aux |grep sshd
#第二种使用pgrep -a完全名称,-l简单名称
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pgrep -a sshd
1054 /usr/sbin/sshd -D
22043 sshd: root@pts/0
##进程树pstree
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pstree
systemd─┬─AliSecGuard───6*[{AliSecGuard}]
├─AliYunDun───9*[{AliYunDun}]
├─AliYunDunMonito───25*[{AliYunDunMonito}]
├─AliYunDunUpdate───6*[{AliYunDunUpdate}]
├─2*[agetty]
├─aliyun-service───7*[{aliyun-service}]
├─assist_daemon───7*[{assist_daemon}]
├─atd
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─dhclient
├─firewalld───{firewalld}
├─frps───5*[{frps}]
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd─┬─bash───pstree
│ └─sftp-server
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
ps -aux解释:
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125464 3936 ? Ss 2022 13:47 /usr/lib/systemd/systemd --switched-root --sys
root 2 0.0 0.0 0 0 ? S 2022 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2022 3:09 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2022 0:00 [kworker/0:0H]
01 USER #进程属于用户
02 PID #子进程id号 process id
03 %CPU #进程占用cpu使用率
04 %MEM #进程占用mem使用率 内存
05 VSZ #Virtual Size 进程占用虚拟内存大小 (kb) VSZ=swap+物理内存
06 RSS #进程占用物理内存大小(kb) RSS=物理内存
07 TTY #进程属于哪个终端,例如:pts/0 pts/1。?是内核进程,不需要终端
08 STAT #status 进程状态
09 START #进程启动时间
10 TIME #进程占用cpu的时间
11 COMMAND #进程名/命令
STAT解释:
STAT基本状态 | 描述 | STAT状态符号 | 描述 |
---|---|---|---|
R(running) | 进程运行 | s | 进程是控制进程,Ss进程为父进程 |
S | 可中断进程处于等待状态(可以随时停止) | < | 进程运行在高优先级上,S<优先级较高的进程 |
T(terminate) | 进程被暂停(挂起) | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断进程(IO) | + | 当前进程运行在前台,R+该表示进程在前台运行 |
Z | 僵尸进程 | l(小写L) | 进程是多线程的,Sl表示进程是以线程方式运行 |
top指令
top - 16:22:02 up 192 days, 2:23, 1 user, load average: 0.06, 0.07, 0.05
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 1.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1776404 total, 163012 free, 154968 used, 1458424 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1417648 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30674 root 10 -10 132720 16472 10648 S 3.3 0.9 4455:17 AliYunDunMonito
22043 root 20 0 157256 6124 4696 S 0.3 0.3 0:02.32 sshd
30327 root 20 0 814652 11272 7720 S 0.3 0.6 86:45.38 aliyun-service 30664 root 10 -10 101196 8768 6600 S 0.3 0.5 652:57.49 AliYunDun
1 root 20 0 125464 3936 2612 S 0.0 0.2 13:48.69 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.40 kthreadd
-PR #了解 优先级,比NI大20
-NI #常用,高优先级与否 负数高优先级 , 0 正常优先级 , 整数 低优先级
-VIRT #virtual size VSZ/VIRT 占用的虚拟内存空间
-RES #resdential RES/RSS 占用物理内存
-SHR #share 共享内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzIJTPhn-1690465877816)(E:\运维学习\shell.assets\image-20230605184233085.png)]
参数:
top
-d 修改top命令刷新间隔 -d 1
-p 只显示某个进程的信息 -p pid
-H 显示进程的线程
-u 显示指定用户进程
-b 批量处理模式,top命令结果批量写入文件 一般配合-n
-n 批处理模式,显示几次
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# top -d 1 -p 30674,1 #显示pid为30674和1的进程
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30674 root 10 -10 132720 16472 10648 S 4.0 0.9 4456:13 AliYunDunMonito
1 root 20 0 125464 3936 2612 S 0.0 0.2 13:48.99 systemd
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# top -d 1 -b -n 2 > top.txt #批处理2次写入top.txt
#top熟悉了解的快捷键
1 查看系统核心总数
h 查看帮出
z 以彩色信息展示
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc
kill指令
#进程挂起是暂停进程的执行,但仍然保留在主存中
#进程中断是打断正在执行的进程,处理中断事件后返回原进程
#进程退出是正常结束进程的执行,释放资源并从系统中移除
#进程终止是非正常结束进程的执行,可能仍然保留在主存中但不再处于活跃状态
kill
-SIGTERM (15):默认的终止信号。它会请求进程正常退出,允许进程执行清理操作并释放资源。
-SIGKILL (9):强制终止信号。它会立即终止进程,不允许进程进行清理操作或释放资源。
-SIGINT (2):中断信号。通常由终端上的 Ctrl+C 键触发,用于向进程发送中断请求。
-SIGHUP (1):挂起信号。当终端断开连接时或控制终端被关闭时发送给进程,用于通知进程重新加载配置或执行其他操作。
-SIGSTOP (17):停止信号。它会暂停进程的执行,但不会终止进程。可以使用 SIGCONT 信号恢复进程的执行。
-SIGCONT (18):继续信号。用于恢复被停止的进程的执行。
pkill 进程名 #删除带有进程名的进程,不推荐
后台进程管理
########第一种#######
ctrl+z #挂起进程
jobs #查看后台挂起的进程
fg n #让后台挂起的进程重新到前台执行,不指定n则从最后一个开始
bg n #执行后台挂起的进程,不指定n则从最后一个开始
kill %n #杀死后台挂起的进程,不指定n则从最后一个开始
#挂起三个进程
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs
[1] Stopped sleep 99999999
[2]- Stopped sleep 99999999
[3]+ Stopped sleep 99999999
#从最后一个进程恢复执行Stopped变成Running
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg
[3]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg
[2]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg 1
[1]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# fg 2
sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs
[1] Running sleep 99999999 &
[2]+ Stopped sleep 99999999
[3]- Running sleep 99999999 &
#kill删除进程
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# kill %1
[1] Terminated sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# kill %2
[2]+ Stopped sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs
[3]+ Running sleep 99999999 &
########第二种#######
screen #需要安装
#1.创建screen 创建,创建的窗口可以随便执行命令
screen 或 screnn -S 窗口名称
#主窗口创建ys窗口
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -S ys
[detached from 16917.ys]
#ys窗口执行命令
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls
1.REP Centos-7.repo ip1.txt ip.txt ok.txt sort.txt test top.txt
#2.退出窗口
ctrl +a +d
#3.显示当前所有screen窗口
screen -ls
#主窗口
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -ls
There is a screen on:
17423.ys (Detached)
1 Socket in /var/run/screen/S-root.
#4.恢复,重新进入创建
screen -r id
#主窗口进入ys窗口
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -r 17423
#ys窗口:命令还在,说明它在后台是一直运行的
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls
1.REP Centos-7.repo ip1.txt ip.txt ok.txt sort.txt test top.txt
#5.彻底关闭
screen -r id 进入后输入exit彻底退出screen
#主窗口发现没有ys窗口
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -ls
No Sockets found in /var/run/screen/S-root.
########第三种#######
命令&后台执行
平均负载
**平均负载:**单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数
- 可运行状态进程:指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们ps 命令看到处于 R 或 S 状态的进程
- 不可中断进程:系统中最常见的是等待硬件设备的 I/O 响应,也就是我们 ps 命令中看到的 D 状态(也称为Disk Sleep)的进程。
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2 #核心数
On-line CPU(s) list: 0,1
Thread(s) per core: 2
Core(s) per socket: 1 #cpu数
Socket(s): 1
平均负载案例分析
**stress:**是 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景
**mpstat:**是多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标
**pidstat:**是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标
场景一:CPU 密集型进程
#模拟cpu负载高 stress --cpu 1 --timeout 100
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# stress --cpu 1 --timeout 100
stress: info: [16684] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
#通过uptime或w 查看 watch -d uptime
[root@iZ2zeco2fmiqbbuzq773qyZ ~]#watch -d uptime #默认没2s更新一次
Every 2.0s: uptime Sun Jun 4 15:07:18 2023
15:07:18 up 193 days, 1:08, 2 users, load average: 0.42, 0.13, 0.08 #1分钟负载,逐渐接近1,因为只有一个cpu负载
#查看整体状态mpstat -P ALL 1 查看每个cpu核心使用率
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# mpstat -P ALL 1 #-P查看哪个cpu,ALL是查看所有cpu或者0,1,2等等
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ) 06/04/2023 _x86_64_ (2 CPU)
03:08:48 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:08:49 PM all 51.76 0.00 1.51 0.00 0.00 0.00 0.00 0.00 0.00 46.73 #因为测试只有一个负载,2个cpu就50%
03:08:49 PM 0 3.03 0.00 3.03 0.00 0.00 0.00 0.00 0.00 0.00 93.94 #因为测试只有一个负载,另一个就不工作
03:08:49 PM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 #cpu某个沾满因为测试只有一个负载
03:08:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:08:50 PM all 51.27 0.00 1.02 0.00 0.00 0.00 0.00 0.00 0.00 47.72
03:08:50 PM 0 2.02 0.00 2.02 0.00 0.00 0.00 0.00 0.00 0.00 95.96
03:08:50 PM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:08:50 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:08:51 PM all 51.01 0.00 0.51 0.00 0.00 0.00 0.00 0.00 0.00 48.48
03:08:51 PM 0 1.03 0.00 1.03 0.00 0.00 0.00 0.00 0.00 0.00 97.94
03:08:51 PM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#精确到进程: pidstat 1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pidstat 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ) 06/04/2023 _x86_64_ (2 CPU)
03:12:35 PM UID PID %usr %system %guest %CPU CPU Command
03:12:36 PM 0 17640 100.00 0.00 0.00 100.00 1 stress #可以看到这个进程占用100%
03:12:36 PM 0 30674 0.00 3.00 0.00 3.00 0 AliYunDunMonito
03:12:36 PM UID PID %usr %system %guest %CPU CPU Command
03:12:37 PM 0 17640 99.00 0.00 0.00 99.00 1 stress
03:12:37 PM 0 17837 0.00 1.00 0.00 1.00 0 pidstat
03:12:37 PM 0 30674 0.00 5.00 0.00 5.00 0 AliYunDunMonito
场景二:I/O 密集型进程
#通过stress 模拟大量进程读写 stress --hdd 1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# stress --hdd 1
stress: info: [20328] dispatching hogs: 0 cpu, 0 io, 0 vm, 1 hdd
#通过w/uptime查看系统负载信息 watch -d uptime
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# watch -d uptime
Every 2.0s: uptime Sun Jun 4 15:23:10 2023
15:23:10 up 193 days, 1:24, 2 users, load average: 0.68, 0.30, 0.23
#通过top/mpstat 排查 mpstat -P ALL 1 或 top 按1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# mpstat -P ALL 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ) 06/04/2023 _x86_64_ (2 CPU)
03:23:50 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:23:51 PM all 1.55 0.00 12.44 83.42 0.00 0.52 0.00 0.00 0.00 2.07
03:23:51 PM 0 1.04 0.00 12.50 86.46 0.00 0.00 0.00 0.00 0.00 0.00
03:23:51 PM 1 2.11 0.00 12.63 81.05 0.00 0.00 0.00 0.00 0.00 4.21
03:23:51 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
03:23:52 PM all 1.55 0.00 6.70 87.11 0.00 0.00 0.00 0.00 0.00 4.64
03:23:52 PM 0 1.03 0.00 7.22 90.72 0.00 0.00 0.00 0.00 0.00 1.03
03:23:52 PM 1 1.04 0.00 6.25 84.38 0.00 0.00 0.00 0.00 0.00 8.33
#确定是iowait,iostat 1查看整体磁盘读写情况
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iostat 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ) 06/04/2023 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.82 0.00 0.77 0.00 0.00 98.41
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.40 0.02 2.79 390322 46598672 #查看哪个磁盘使用情况
#iotop -o 查看具体哪个进程读写
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iotop -o
Total DISK READ : 0.00 B/s | Total DISK WRITE : 112.50 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 152.81 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
14179 be/4 root 0.00 B/s 0.00 B/s 0.00 % 96.51 % [kworker/u4:1]
20615 be/4 root 0.00 B/s 112.49 M/s 0.00 % 85.99 % stress --hdd 1
459 be/3 root 0.00 B/s 11.88 K/s 0.00 % 0.00 % auditd
#根据对应的进程,进行相关处
#注意:
stress --io 1:这个命令使用stress工具来模拟I/O(输入/输出)负载。它会创建一些并行的I/O任务,以测试系统的I/O性能
stress --hdd 1:这个命令使用stress工具来模拟硬盘负载。它会创建一个或多个用于写入和读取的文件,并测试系统的硬盘性能
使用stress --io 1时,%sys增加而%iowait不变
这是因为stress --io命令主要测试系统的I/O性能,会创建并行的I/O任务。这些任务需要使用CPU的内核空间来处理I/O操作,因此会增加%sys的值。然而,这些任务并不会导致CPU等待I/O操作完成,所以%iowait的值不会变化。
使用stress --hdd 1时,%sys微微增加而%iowait增加。
当你运行stress --hdd命令时,它会创建一个或多个文件并进行写入和读取操作,从而模拟硬盘负载。这些操作会导致CPU使用一些额外的内核空间来处理这些I/O操作,因此%sys会微微增加。同时,这些I/O操作需要一些时间来完成,CPU需要等待I/O操作完成,所以%iowait的值会增加。
**总结:**平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。
- 平均负载高有可能是 CPU 密集型进程导致
- 平均负载高还有可能是 I/O 更繁忙
- 当发现负载高的时候,使用 mpstat、pidstat 等工具,辅助分析负载的来源
日常故障排查
- w/uptime, 查看负载
- ps aux/top 看看 cpu百分比, iowait或者是内存占用的高? (三高cpu,io,内存)
- top检查具体是哪个进程,找出可疑进程
- 追踪这个进程使用情况,做什么的?
- 看看对应日志是否有异常
- 系统日志: /var/log/messages(系统通用日志) /var/log/secure(用户登录情况)
- 服务软件的日志
定时任务Crond
Crontab使用规则
配置文件位置:/etc/crontab
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbDh5R1P-1690465877817)(E:\运维学习\shell.assets\image-20230606190229685.png)]
符号 | 含义 |
---|---|
* | 每(每小时 每天 每周 每月) |
/ | 每隔(表示每隔多久执行一次) |
, | 独立的时间(例如:7点,6点,9点) |
- | 范围(10-30,20-55之类) |
* * * * * ls #每分钟执行一次 ls
00 02 * * * ls #每天的凌晨2点执行ls
00 02 1 * * ls #每个月的1号凌晨2点执行ls
00 02 14 2 * ls #每年的2月14日的凌晨2点执行ls
00 02 * * 7 ls #每周日的凌晨2点执行ls
00 02 * 6 5 ls #每年的6月的周五的凌晨2点执行ls
00 02 14 * 7 ls #每个月的14号或每周周日的凌晨02点执行ls 不推荐同时书写日期和周几
00 02 14 2 7 ls #每年的2月14日或周日,凌晨2点执行ls
*/10 02 * * * ls #每天凌晨2点每隔10分钟执行 ls 2:00 2:10 2:20 2:30 2:40 2:50
*/5 * * * * ls #每五分钟 执行ls
00 02 * 1,5,8 * ls #每年1,5,8月的每天凌晨2点执行ls
00 02 1-8 * * ls #每月的1-8号的凌晨2点执行ls
参数 | 含义 |
---|---|
crontab -e edit | 编辑定时任务 |
crontab -l list | 查看当前用户的定时任务 |
crontab -r remove | 清空/删除当前用户的所有定时任务 |
crontab -u user | 编辑user的定时任务,配置文件对应/var/spool/cron/user下 |
笔记:
-
在root用户下 执行crontab -e -u aaa 和在aaa用户下执行crontab -e -u aaa 有什么区别吗?
-
当以root用户身份执行"crontab -e -u aaa"时,可以编辑aaa用户的crontab文件,因为root用户具有最高权限。
-
而当以aaa用户身份执行"crontab -e -u aaa"时,只能编辑自己的crontab文件
-
-
crontab -e 会自动更新配置文件,所以每次写入新任务不用重新加载服务的配置文件
Crond编写实战
-
每2分钟输出oldboy追加到/tmp/oldboy.txt
#书写对应的命令到定时任务 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -e #oldboy1 */2 * * * * echo oldboy >>/tmp/oldboy.txt #查看定时任务 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -l #oldboy1 */2 * * * * echo oldboy >>/tmp/oldboy.txt #测试与检查 ##看结果 看文件内容 [root@oldboy-c7 ~]# tail -f /tmp/oldboy.txt oldboy ##看日志 检查定时任务的日志 tail -f /var/log/cron
-
使用root用户每分钟执行一次时间同步
#书写对应的命令到定时任务 [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -e -u root #oldboy */2 * * * * echo oldboy >>/tmp/oldboy.txt #ntpdate * * * * * /sbn/ntpdate ntp1.aliyun.com &>/dev/null #命令加绝对路径和定向到null后面故障解释
Crond注意的事项
-
给定时任务注释,
说明任务功能
-
将需要定期执行的任务
写入Shell
脚本中,避免直接使用命令无法执行的情况%在定时任务中有特殊含义
需要使用转义,但是写入脚本就不用转义,直接定时这个sh脚本就行
-
定时任务的结尾一定要有
&>/dev/null
或者 将结果追加到&>>/tmp/date.log
文件
#故障案例:没有定向到空或追加到文件
###邮件服务开启,你会收到大量的提示 You have new mail in /var/spool/mail/root。最后导致邮件文件越来越大
###邮件服务关闭,邮件没有发送导致生成大量临时文件在/var/spool/postfix/maildrop中,最终导致目录中有大量小文件占用inode
-
注意有些命令是无法成功执行的 echo “123” >>/tmp/test.log &>/dev/null
-
如果一定要是用命令,命令必须使用绝对路径
#故障案例:命令没有使用绝对路径 #故障原因: 定时任务执行命令的时候,只能识别/usr/bin和/bin 下面的命令。例如ifconfig、ntpdate等等,无法再定时任务中识别并运行 #解决方法: ##方法1 使用绝对路径 (推荐) ##方法2 在脚本开头重新配置下,与命令路径相关的环境变量 source /etc/profile [root@oldboy-c7 ~]# cat /server/scripts/error.sh #!/bin/bash #配置sh的/etc/profile source /etc/profile #或者直接配置PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
-
crond备份
- 备份日志,通过查找
/var/log/cron
中执行的记录,去推算任务执行的时间 - 定时的备份配置{username}的文件,
/var/spool/cron/{username}
- 备份日志,通过查找
-
crond拒绝某个用户使用
#1.使用root将需要拒绝的用户加入/etc/cron.deny [root@oldboyedu ~]# eco "oldboy" >> /etc/cron.deny #2.登陆该普通用户,测试是否能编写定时任务 [oldboy@oldboyedu ~]$ crontab -e You (oldboye) are not allowed to use this program (crontab) See crontab(1) for more information
Crond调试
- 增加频率
- 调整任务每分钟执行的频率, 以便做后续的调试。
- 调整系统时间
- 执行脚本输出到文件(排查错误)
- 如果使用cron运行脚本,请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常。
- 命令使用绝对路径, 防止无法找到命令导致定时任务执行产生故障。
- 通过查看/var/log/cron日志,以便检查我们执行的结果,方便进行调试。
Crond编写思路
-
手动执行命令,然后保留执行成功的结果
-
编写脚本
- 统一路径:脚本需要统一路径/scripts
- 复制:脚本内容复制第一步执行成功的命令(减少每个环节出错几率)
- 简单粗暴:脚本内容尽可能的优化,使用一些变量或使用简单的判断语句
- 定向到空:脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
-
执行脚本
- 使用bash命令执行,防止脚本没有增加执行权限(/usr/bin/bash)
- 执行脚本成功后,复制该执行的命令,以便写入cron
-
编写计划任务
- 加注释:加上必要的注释信息
- 改时间:设定计划任务执行的周期
- 去粘贴:粘贴执行脚本的命令(不要手敲)
-
调试计划任务增加任务频率测试
- 检查环境变量问题:使用命令绝对路径
- 看日志:检查crond服务日志
- 看结果
网络基础
基础知识
交换机:实现同一个局域网通信工具,用于连接多个计算机或网络设备,并在它们之间传输数据。
- 交换机能够根据目的地址在不同端口之间转发数据包
- 基于MAC地址、IP地址或虚拟局域网(VLAN)来进行转发
- MAC地址:唯一
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlwpKJmJ-1690465877817)(E:\运维学习\shell.assets\image-20230616193124878.png)]
路由器:实现多个网段数据传输
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VTPiPcmI-1690465877817)(E:\运维学习\shell.assets\image-20230616193217776.png)]
网关:实现不同网段之间通讯需要经过一条必经之路。gateway
(交换机,路由器)默认的出口/入口
网络追踪命令:
Linux:
traceroute -n -I IP地址
网络层次结构
- 核心层:主要部署路由器设备,用于连接外网线路,还要具备冗余能力
- 汇聚层:主要部署三层交换设备,用于相应安全访问控制 进行链路汇聚
- 链路聚合是把两台设备之间的多条物理链路聚合在一起,当做一条逻辑链路来使用,可以增加带宽,负载分担
- 接入层:主要部署二层交换设备,用于终端设备接入
网络七层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDpSNytq-1690465877818)(E:\运维学习\shell.assets\image-20230616230622638.png)]
含义 | 涉及协议或内容 | |
---|---|---|
应用层 | 应用软件,接口,各种协议 | http https dns smtp … |
表示层 | ||
会话层 | ||
传输层 | 数据如何传输到对端 | tcp udp 端口 |
网络层 | 网络路由和寻址 | IP 3层路由器 |
数据链路层 | 通过mac地址识别设备,进行传输 | mac 2层交换机 |
物理层 | 数据转换为010101010,通过网络介 |
数据封包解包过程
-
封包
- 应用层:原始数据被转换成二进制数据
- 传输层:二进制数据被分割成小的数据段,并封装TCP头部 (数据段)(TCP头部的关键信息–端口号)
- 网络层:传输层传来的数据被封装上IP头部 (数据包)(IP头部的关键信息–IP地址)
- 数据链路层:网络层传来的数据被封装上MAC头部 (数据帧)(MAC头部的关键信息–MAC地址)
- 物理层:二进制数据组成的比特流转化为电信号在网络中传输 (比特流)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ai9dxa2Y-1690465877818)(E:\运维学习\shell.assets\image-20230617195706240.png)]
-
解包
- 物理层:将电信号转化为二进制数据,并将其送至数据链路层
- 数据链路层:查看MAC地址,地址是自己,就拆掉MAC头部,继续传输地址不是自己,就丢弃数据
- 网络层:查看IP地址,地址是自己,就拆掉IP头部,继续传输地址不是自己,就丢弃数据
- 传输层:查看TCP头部,判断应该传到哪里,然后重组数据,传输到应用层
- 应用层:二进制转化为原始数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1SoueX3-1690465877819)(E:\运维学习\shell.assets\image-20230617195842029.png)]
TCP握手/挥手
本地IP | 阿里云服务器IP |
---|---|
222.27.64.17 | 47.93.18.99 |
握手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qouDpOph-1690465877819)(E:\运维学习\shell.assets\image-20230617215221702.png)]
-
第一次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCSNn6Ca-1690465877819)(E:\运维学习\shell.assets\image-20230617215847584.png)]
-
第二次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRQjrWhT-1690465877819)(E:\运维学习\shell.assets\image-20230617220302439.png)]
-
第三次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kiTXrNU4-1690465877820)(E:\运维学习\shell.assets\image-20230617220818468.png)]
挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkHgT7Ed-1690465877820)(E:\运维学习\shell.assets\image-20230617215305072.png)]
总结:
- ack为上一次握手/挥手的seq+1:确认接收端的请求或回应
- seq为上一次握手/挥手的ack:保证数据的有序传输和确认的准确性
ARP协议
- 定义:将IP地址解析为MAC地址,维护映射的缓存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fdcjq8NP-1690465877820)(E:\运维学习\shell.assets\image-20230622224420747.png)]
- 流程:
- 主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
- 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
- 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
- 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
- 当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。
IP分类
- 一般IP
- A:1.0.0.0 到 126.0.0.0
- B:128.0.0.0 到 191.254.0.0
- C:192.0.1.0 到 223.255.254.0
- D:224.0.0.0 到 239.255.255.255
- E :40.0.0.0 到 255.255.255.254
- 特殊IP:
- 0.0.0.0:表示所有可能的IP地址或指示任意地址。在网络设置中,它可以用作默认路由或绑定所有可用网络接口。
- 127.0.0.1:这是本地回环地址,也称为"localhost"。它用于在本地计算机上测试网络配置和应用程序,指向本机。
- 255.255.255.255:这是广播地址,用于向特定网络中的所有设备发送广播消息。当某个设备发送消息到该地址时,该消息将被发送到网络上的所有设备。
- 192.168.x.x:这是私有IP地址范围之一,用于内部局域网。它们不直接与互联网相连,而是在局域网内使用。
- 10.x.x.x:这是另一个私有IP地址范围,也用于内部局域网。与192.168.x.x类似,它们用于在私有网络内部进行通信。
- 169.254.x.x:这是自动私有IP地址(APIPA),当设备无法通过DHCP获得有效IP地址时,会自动分配此类地址。它通常用于本地网络中的临时通信。
子网掩码
为什么引入子网?
- 划分网络:子网的引入可以将一个大型网络划分为更小的子网,有助于管理和组织网络。每个子网可以独立地进行管理,简化网络结构。
- 控制广播范围:在没有子网的情况下,广播消息将在整个局域网中传播,导致广播风暴和带宽浪费。通过子网,可以限制广播消息的范围在子网内部,减少广播对整个网络的影响。
- 提高网络性能:当网络中有大量设备时,所有设备发送请求到同一个网关可能导致网关负载过高。通过子网,可以将设备分散到不同的子网中,减轻了每个子网的负载,提高了整体网络性能。
- 安全性增强:子网可以通过实施子网间的访问控制列表(ACL)和防火墙规则来增强网络的安全性。不同子网之间的通信可以受到限制,有助于保护敏感数据和资源的安全。
通过子网掩码划分子网:通过改变子网掩码,可以调整网络位的大小,从而改变子网的划分和主机位的大小。
局域网用户上网原理
- 物理连接:局域网用户通过物理连接(如以太网线或Wi-Fi)将其终端设备(如计算机、手机、平板等)连接到局域网中的交换机或路由器。
- IP地址获取:终端设备通过动态主机配置协议(DHCP)或手动配置获取一个局域网内的私有IP地址。私有IP地址是在局域网内部使用的地址,用于在局域网内唯一标识设备。
- 网关设置:终端设备需要配置网关地址,该地址通常是局域网中的路由器的内部接口地址。网关在局域网中充当连接局域网和外部互联网的中转设备。
- 路由转发:当终端设备想要访问外部互联网时,它会将数据包发送到网关。网关根据路由表和网络配置将数据包转发到外部互联网。
- NAT转换:在通过网关访问互联网之前,终端设备的私有IP地址需要通过网络地址转换(NAT)将其转换为公共IP地址。这样可以实现多个终端设备共享同一个公共IP地址的功能。
- 互联网访问:一旦数据包通过网关并获得公共IP地址,它就可以在互联网上与其他服务器进行通信。终端设备可以发送请求、接收响应并访问各种互联网资源。
DNS
功能:
- A记录是"Address"记录的缩写,用于将域名解析为IPv4地址。当用户输入一个域名时,DNS服务器会查询该域名的A记录,返回与之对应的IPv4地址。这样,用户的计算机就能够通过该IPv4地址与目标服务器建立连接。
- CNAME记录是"Canonical Name"记录的缩写,用于创建域名的别名。CNAME记录将一个域名指向另一个域名,实现域名之间的关联。当用户查询一个使用CNAME记录的域名时,DNS服务器会返回与之关联的目标域名的A记录。这样,用户的计算机就可以通过目标域名的A记录找到目标服务器的IPv4地址。
解析流程
- 例子:
- 根服务器:全球有13台根服务器
- 顶级域名服务器:org,com,net,me,cc等等
- 一级域名服务器:baidu,google等等
- A记录主机信息:www,blog,bbs
命令
dig www.baidu.com +trace
+trace 详细信息
网卡
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
#重启某一块网卡
ifdown ens33 && ifup ens33
DEVICE
:指定网络接口设备的名称,这里是ens33
,表示以太网卡设备的第一个接口。BOOTPROTO
:指定接口的启动协议,常见取值有none
、static
、dhcp
等。none
表示不使用任何协议,static
表示使用静态 IP 地址,dhcp
表示使用 DHCP 协议从 DHCP 服务器获取 IP 地址。IPADDR
:指定静态 IP 地址,当BOOTPROTO
设置为static
时生效。NETMASK
:指定子网掩码,用于确定网络中 IP 地址的网络部分和主机部分。GATEWAY
:指定默认网关的 IP 地址,用于将网络流量转发到其他网络。DNS1
和DNS2
:指定首选和备用 DNS 服务器的 IP 地址,用于解析域名到 IP 地址。ONBOOT
:指定网络接口是否在系统启动时自动激活,常见取值有yes
和no
。HWADDR
:指定网卡设备的硬件 MAC 地址。PREFIX
:指定网络接口的网络前缀长度,用于确定网络部分的位数。例如,如果网络前缀是 24,则表示前 24 位用于网络部分,后 8 位用于主机部分。TYPE
:指定网络接口的类型,常见取值有Ethernet以太网
、Wireless无线
等,表示不同类型的网络接口设备。PEERDNS
:指定是否使用从 DHCP 服务器获取的 DNS 服务器配置。如果设置为yes
,则使用从 DHCP 服务器获取的 DNS 服务器;如果设置为no
,则不使用 DHCP 提供的 DNS 服务器配置。IPV6INIT
:指定是否启用 IPv6 支持。如果设置为yes
,表示启用 IPv6;如果设置为no
,表示禁用 IPv6。
别名IP和辅助IP
查看网络配置信息命令:
# ifconfig 查看配置 别名ip 信息等。
# ifconfig eth0 指定查看一个网卡设备的网络配置信息
# ip add
配置虚拟IP地址方法:
#配置 别名IP 即表示配置 虚拟 IP VIP
ifconfig eth0:X 10.0.0.100/24 up #配置 X别名IP
ifconfig eth0:X down #停掉 X别名IP
#配置 辅助 IP 即表示配置多个 IP 在同一个网卡上
ip addr add 10.0.0.13/23 dev eth0 label eth0:1 #配置eth0标签为eth0:1的辅助IP
ip addr add 10.0.0.13/24 dev eth0 #配置eth0的辅助IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:08:d2:49 brd ff:ff:ff:ff:ff:ff
inet 172.25.50.171/18 brd 172.25.63.255 scope global dynamic eth0
valid_lft 296833138sec preferred_lft 296833138sec
inet 10.0.0.13/24 scope global #eth0
valid_lft forever preferred_lft forever
inet 10.0.0.13/23 scope global #eth0:1
valid_lft forever preferred_lft forever
ip addr del 10.0.0.13/24 dev eth0 #删除eth0的辅助IP
#配置永久ip
[root@oldboy-c7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:0
NAME=ens33:0
DEVICE=ens33:0
IPADDR=10.0.0.200
PREFIX=24
网络故障排查
![](E:\运维学习\shell.assets\out (1)-16877082738067.jpg)
-
网络命令
#ifconfig命令 用于显示网路配置信息 #ip命令 用于显示网路配置信息 #route命令 查看路由配置信息 route -n #hostname(uname -n) 显示主机名称信息,也可以利用hostname显示ip地址配置信息hostname -I #netstat(ss) 显示主机的端口与服务的端口与服务网络网络连接状态连接状态。ESTABLISHED 建立连接的状态,数量即表示网络连接数 ss -n #显示连接状态 把端口号/ip --->对应名字 ss -an #显示所有类型的连接 tcp udp 其他类型 ss -ant #-t 只显示tcp 连接状态 ss -l #只显示处于listen状态的信息 ss -u #显示udp连接信息 ss -p #process pid 显示进程信息 #lsof:lsof -n -i :22 显示主机的端口与服务网络连接状态。的端口与服务网络连接状态 #ping #traceroute (linux) tracert(windows) 追踪IP #iftop 检查/查看网卡流量 -n ip不要转换为域名 -N 端口不要转换为服务名 -i 指定网卡 -P 显示端口号 #nethogs 精确到进程,每个进程占用网速
-
排查
- 检查 路径是否通畅
- ping
- traceroute/tracert
- 检查服务是否开启
- 检查端口
- telnet ip 端口
- nmap -p端口 ip
- nmap -p端口x-端口y ip
- nmap -p端口 ip/网段
- 检查进行
- ps -ef
DEVICE:指定网络接口设备的名称,这里是
ens33`,表示以太网卡设备的第一个接口。
- ps -ef
- 检查端口
- 检查 路径是否通畅
BOOTPROTO
:指定接口的启动协议,常见取值有none
、static
、dhcp
等。none
表示不使用任何协议,static
表示使用静态 IP 地址,dhcp
表示使用 DHCP 协议从 DHCP 服务器获取 IP 地址。IPADDR
:指定静态 IP 地址,当BOOTPROTO
设置为static
时生效。NETMASK
:指定子网掩码,用于确定网络中 IP 地址的网络部分和主机部分。GATEWAY
:指定默认网关的 IP 地址,用于将网络流量转发到其他网络。DNS1
和DNS2
:指定首选和备用 DNS 服务器的 IP 地址,用于解析域名到 IP 地址。ONBOOT
:指定网络接口是否在系统启动时自动激活,常见取值有yes
和no
。HWADDR
:指定网卡设备的硬件 MAC 地址。PREFIX
:指定网络接口的网络前缀长度,用于确定网络部分的位数。例如,如果网络前缀是 24,则表示前 24 位用于网络部分,后 8 位用于主机部分。TYPE
:指定网络接口的类型,常见取值有Ethernet以太网
、Wireless无线
等,表示不同类型的网络接口设备。PEERDNS
:指定是否使用从 DHCP 服务器获取的 DNS 服务器配置。如果设置为yes
,则使用从 DHCP 服务器获取的 DNS 服务器;如果设置为no
,则不使用 DHCP 提供的 DNS 服务器配置。IPV6INIT
:指定是否启用 IPv6 支持。如果设置为yes
,表示启用 IPv6;如果设置为no
,表示禁用 IPv6。
别名IP和辅助IP
查看网络配置信息命令:
# ifconfig 查看配置 别名ip 信息等。
# ifconfig eth0 指定查看一个网卡设备的网络配置信息
# ip add
配置虚拟IP地址方法:
#配置 别名IP 即表示配置 虚拟 IP VIP
ifconfig eth0:X 10.0.0.100/24 up #配置 X别名IP
ifconfig eth0:X down #停掉 X别名IP
#配置 辅助 IP 即表示配置多个 IP 在同一个网卡上
ip addr add 10.0.0.13/23 dev eth0 label eth0:1 #配置eth0标签为eth0:1的辅助IP
ip addr add 10.0.0.13/24 dev eth0 #配置eth0的辅助IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:08:d2:49 brd ff:ff:ff:ff:ff:ff
inet 172.25.50.171/18 brd 172.25.63.255 scope global dynamic eth0
valid_lft 296833138sec preferred_lft 296833138sec
inet 10.0.0.13/24 scope global #eth0
valid_lft forever preferred_lft forever
inet 10.0.0.13/23 scope global #eth0:1
valid_lft forever preferred_lft forever
ip addr del 10.0.0.13/24 dev eth0 #删除eth0的辅助IP
#配置永久ip
[root@oldboy-c7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:0
NAME=ens33:0
DEVICE=ens33:0
IPADDR=10.0.0.200
PREFIX=24
网络故障排查
![](E:\运维学习\shell.assets\out (1)-16877082738067.jpg)
-
网络命令
#ifconfig命令 用于显示网路配置信息 #ip命令 用于显示网路配置信息 #route命令 查看路由配置信息 route -n #hostname(uname -n) 显示主机名称信息,也可以利用hostname显示ip地址配置信息hostname -I #netstat(ss) 显示主机的端口与服务的端口与服务网络网络连接状态连接状态。ESTABLISHED 建立连接的状态,数量即表示网络连接数 ss -n #显示连接状态 把端口号/ip --->对应名字 ss -an #显示所有类型的连接 tcp udp 其他类型 ss -ant #-t 只显示tcp 连接状态 ss -l #只显示处于listen状态的信息 ss -u #显示udp连接信息 ss -p #process pid 显示进程信息 #lsof:lsof -n -i :22 显示主机的端口与服务网络连接状态。的端口与服务网络连接状态 #ping #traceroute (linux) tracert(windows) 追踪IP #iftop 检查/查看网卡流量 -n ip不要转换为域名 -N 端口不要转换为服务名 -i 指定网卡 -P 显示端口号 #nethogs 精确到进程,每个进程占用网速
-
排查
- 检查 路径是否通畅
- ping
- traceroute/tracert
- 检查服务是否开启
- 检查端口
- telnet ip 端口
- nmap -p端口 ip
- nmap -p端口x-端口y ip
- nmap -p端口 ip/网段
- 检查进行
- ps -ef
- 检查端口
- 检查 路径是否通畅