第一章 计算机基础和Linux安装
1.冯·诺依曼体系结构组成部分
计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
2.Linux哲学思想(或Liunx基本原则、思想、规则)
- 一切都是一个文件(包括硬件)。
- 小型,单一用途的程序。
- 连接程序,共同完成复杂的任务(脚本)。
- 避免令人困惑的用户界面。
- 配置数据存储在文本中。
第三章 Linux文件管理和IO重定向
1.Linux有几种文件类型
-
- 普通文件
-
d 目录文件
-
b 块设备
-
c 字符设备
-
l 符号链接文件
-
p 管道文件pipe
-
s 套接字文件socket
2.批量修改文件名
[root@centos8 /data]#touch f{1..10}.conf
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
[root@centos8 /data]#mv *.conf *.conf.bak
mv: target '*.conf.bak' is not a directory
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
范例:为所有的conf文件加上.bak后缀
[root@centos8 /data]#rename conf conf.bak *
[root@centos8 /data]#ls
f10.conf.bak f2.conf.bak f4.conf.bak f6.conf.bak f8.conf.bak
f1.conf.bak f3.conf.bak f5.conf.bak f7.conf.bak f9.conf.bak
范例:去掉所有的bak后缀
[root@centos8 /data]#rename .bak "" *
[root@centos8 /data]#ls
f10.conf f1.conf f2.conf f3.conf f4.conf f5.conf f6.conf f7.conf f8.conf f9.conf
3.什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
链接分硬链接和符号链接。符号链接可以建立对于文件和目录的链接。符号链接可以跨文件系统,即可以跨磁盘分区。符号链接的文件类型位是l,链接文件具有新的i节点。硬链接不可以跨文件系统。它只能建立对文件的链接,硬链接的文件类型位是-,且硬链接文件的i节点同被链接文件的i节点相同
4.硬链接和软链接区别
1.本质
硬链接:本质是同一个文件
软链接:本质不是同一个文件2.跨设备
硬链接:不支持
软链接:支持3.inode
硬链接:相同
软链接:不同4.链接数
硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
软链接:创建或删除,链接数不会变化5.文件夹
硬链接:不支持
软链接:支持6.相对路径
硬链接:原始文件相对路径是相对于当前工作目录
软链接:原始文件相对路径是相对于链接文件的相对路径7.删除源文件
硬链接:只是链接数减一,但链接文件的访问不受影响
软链接:链接文件将无法访问8.文件类型
硬链接:和源文件相同
软链接:链接文件,和源文件无关
5.提示空间满,No space left on device,但是df 可以看到很多空间,为什么?
[root@centos8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 309 523979 1% /boot[root@centos8 ~]# mkdir /boot/testdir
[root@centos8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 310 523978 1% /boot
#创建一个目录,节点编号也相应增加 [root@centos8 ~]# touch /boot/testdir/file{1..523978}
bash: /usr/bin/touch: Argument list too long[root@centos8 ~]# echo /boot/testdir/file{1..523978} |xargs touch
[root@centos8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524288 524288 0 100% /boot
#节点编号使用完了[root@centos8 ~]# touch /boot/testdir/new{1..100}.txt
touch: cannot touch '/boot/testdir/new32.txt': No space left on device
touch: cannot touch '/boot/testdir/new33.txt': No space left on device
touch: cannot touch '/boot/testdir/new34.txt': No space left on device
touch: cannot touch '/boot/testdir/new35.txt': No space left on device
touch: cannot touch '/boot/testdir/new36.txt': No space left on device
touch: cannot touch '/boot/testdir/new37.txt': No space left on device
touch: cannot touch '/boot/testdir/new38.txt': No space left on device
touch: cannot touch '/boot/testdir/new39.txt': No space left on device
touch: cannot touch '/boot/testdir/new40.txt': No space left on device
touch: cannot touch '/boot/testdir/new41.txt': No space left on device
#inode用完了为啥还能创建文件,因为系统可能默认保留了多少inode,用完了,彻底不能创建文件,提示设备没有空间[root@centos8 ~]# df /boot
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 1038336 454572 583764 44% /boot #但是/boot分区只使用了44%利用率[root@centos8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524320 524320 0 100% /boot
#空间不足不是磁盘使用率没有了,而是节点编号使用率100%了[root@centos8 ~]# rm -rf /boot/testdir/
[root@centos8 ~]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 524320 309 524011 1% /boot
#删除了数据才能释放节点编号
6.提示空间快满,使用rm删除了很大的无用文件后,df仍然看到空间不足,为什么,如何解决?
[root@centos8 ~]# dd if=/dev/zero of=/boot/dir/bigfile bs=1M count=700 #在/boot分区创建一个700M文件
700+0 records in
700+0 records out
734003200 bytes (734 MB, 700 MiB) copied, 2.81391 s, 261 MB/s
[root@centos8 ~]# ll -h /boot/dir/bigfile
-rw-r--r--. 1 root root 700M Nov 18 17:27 /boot/dir/bigfile
[root@centos8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#/boot分区空间使用了98%,快使用完了
[root@centos8 ~]# tail -f /boot/dir/bigfile #文件正在被使用[root@centos8 ~]# rm -f /boot/dir/bigfile #把这个文件删除了
[root@centos8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#但是/boot分区空间还是没有被释放[root@centos8 ~]# tail -f /boot/dir/bigfile
^C
#把这个程序访问停了
[root@centos8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 191M 719M 21% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#现在/boot分区空间被释放了[root@centos8 ~]# dd if=/dev/zero of=/boot/dir/bigfile bs=1M count=700 #模拟环境创建一个700M的大文件
700+0 records in
700+0 records out
734003200 bytes (734 MB, 700 MiB) copied, 0.525512 s, 1.4 GB/s
[root@centos8 ~]# ll -h /boot/dir/bigfile
-rw-r--r--. 1 root root 700M Nov 18 17:34 /boot/dir/bigfile
[root@rocky8 data]# f -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 891M 19M 98% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#现在/boot 空间已经使用98%
[root@centos8 ~]# tail -f /boot/dir/bigfile #模拟文件正在被使用[root@centos8 ~]# lsof /boot/dir/bigfile #lsof查看这个文件是否被访问
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 5288 root 3r REG 8,1 734003200 309 /boot/dir/bigfile
#现在显示文件正在被使用
[root@centos8 ~]# cat /dev/null > /boot/dir/bigfile #把文件清空
[root@centos8 ~]# ll /boot/dir/bigfile
-rw-r--r--. 1 root root 0 Nov 18 17:38 /boot/dir/bigfile
#现在文件大小为0
[root@centos8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 873M 0 873M 0% /dev
tmpfs 900M 0 900M 0% /dev/shm
tmpfs 900M 9.4M 891M 2% /run
tmpfs 900M 0 900M 0% /sys/fs/cgroup
/dev/sda2 100G 4.8G 96G 5% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 976M 191M 719M 21% /boot
tmpfs 180M 1.2M 179M 1% /run/user/42
tmpfs 180M 4.0K 180M 1% /run/user/0
#/boot空间也被释放了[root@centos8 ~]# rm -f /boot/dir/bigfile
#现在删除文件,不管它文件是否被使用,它文件已被清空,也就不占空间了
7.linux系统文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。
8.下面4中写法哪种写法和别的效果不同
ls a.txt xxx > all.log 2>&1
ls a.txt xxx 2>&1 > all.log #这个效果不同
ls a.txt xxx 2> all.log 1>&2
ls a.txt xxx &> all.log
9.计算1+2+3+…+99+100的总和
[root@centos8 ~]#echo {1..100} | tr ' ' + | bc
5050
[root@centos8 ~]# seq -s + 100 | bc
5050
#计算1-100之间的奇数和
[root@centos8 ~]# echo {1..100..2} |tr ' ' '+' |bc
2500##计算1-100之间的偶数和
[root@centos8 ~]# echo {2..100..2} |tr ' ' '+' |bc
2550
第四章 Linux用户组和权限管理
1.Linux中的目录和文件的权限区别?(分别说明读,写和执行权限的区别)
对文件的权限:
r 可使用文件查看类工具,比如:cat,可以获取其内容
w 可修改其内容
x 可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)
对目录的权限:
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
X 只给目录x权限,不给无执行权限的文件x权限
2.执行cp /etc/issue /data/dir 所需要的最小权限?
[root@centos8 ~]# cd /data
[root@centos8 data]# ls
[root@centos8 data]# mkdir dir
[root@centos8 data]# cp /etc/issue dir/
[root@centos8 data]# ll dir/issue
-rw-r--r--. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# chmod a= dir
[root@centos8 data]# ll
total 0
d---------. 2 root root 19 Nov 20 22:39 dir
#文件夹没有权限。[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue ~
cp: cannot stat 'dir/issue': Permission denied #没有权限。[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# ll
total 0
d---------. 2 root root 19 Nov 20 22:39 dir
[root@centos8 data]# chmod o+x dir
[root@centos8 data]# ll dir/issue
-rw-r--r--. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue ~
[neteagle@centos8 data]$ ll ~/issue
-rw-r--r--. 1 neteagle neteagle 23 Nov 20 22:43 /home/neteagle/issue
[neteagle@centos8 data]$ ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
#说明这个文件夹只要有执行权限,就能进去,进去就能复制[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# ll dir/issue
-rw-r--r--. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# chmod a= dir/issue
[root@centos8 data]# ll dir/issue
----------. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue ~/issue2
cp: cannot open 'dir/issue' for reading: Permission denied
#如果文件没有任何权限,不能复制。[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# chmod o+x dir/issue
[root@centos8 data]# ll dir/issue
---------x. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue ~/issue3
cp: cannot open 'dir/issue' for reading: Permission denied #文件有执行权限是不能复制[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# ll dir
total 4
---------x. 1 root root 23 Nov 20 22:39 issue
[root@centos8 data]# chmod o=r dir/issue
[root@centos8 data]# ll dir/issue
-------r--. 1 root root 23 Nov 20 22:39 dir/issue
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue ~/issue4
[neteagle@centos8 data]$ ll ~/issue4
-------r--. 1 neteagle neteagle 23 Nov 20 22:48 /home/neteagle/issue4
#文件有读权限,就可以复制[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# mkdir dir2
[root@centos8 data]# chmod a= dir2
[root@centos8 data]# ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d---------. 2 root root 6 Nov 20 22:49 dir2
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ ll dir/issue
-------r--. 1 root root 23 Nov 20 22:39 dir/issue
[neteagle@centos8 data]$ cp dir/issue dir2/
cp: cannot stat 'dir2/issue': Permission denied
#文件夹没有权限,复制不了。[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d---------. 2 root root 6 Nov 20 22:49 dir2
[root@centos8 data]# chmod o+w dir2
[root@centos8 data]# ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d-------w-. 2 root root 6 Nov 20 22:49 dir2
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue dir2/
cp: cannot stat 'dir2/issue': Permission denied
#文件夹只有写权限不能复制。[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d-------w-. 2 root root 6 Nov 20 22:49 dir2
[root@centos8 data]# chmod o=x dir2
[root@centos8 data]# ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d--------x. 2 root root 6 Nov 20 22:49 dir2
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ cp dir/issue dir2/
cp: cannot create regular file 'dir2/issue': Permission denied
#光加执行不能复制。[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# chmod o=wx dir2/
[root@centos8 data]# su neteagle
[neteagle@centos8 data]$ ll
total 0
d--------x. 2 root root 19 Nov 20 22:39 dir
d-------wx. 2 root root 6 Nov 20 22:49 dir2
[neteagle@centos8 data]$ cp dir/issue dir2/
#加执行和写,可以复制[neteagle@centos8 data]$ exit
exit
[root@centos8 data]# cd
[root@centos8 ~]# ll -d /data
drwxr-xr-x. 4 root root 29 Nov 20 22:49 /data
[root@centos8 ~]# chmod a= /data
[root@centos8 ~]# su neteagle
[neteagle@centos8 root]$ cp /data/dir/issue /data/dir2/issue2
cp: failed to access '/data/dir2/issue2': Permission denied
#/date目录没有权限,也不能复制[neteagle@centos8 root]$ exit
exit
[root@centos8 ~]# ll -d /data
d---------. 4 root root 29 Nov 20 22:49 /data
[root@centos8 ~]# chmod o+x /data
[root@centos8 ~]# ll -d /data
d--------x. 4 root root 29 Nov 20 22:49 /data
[root@centos8 ~]# su neteagle
[neteagle@centos8 root]$ cp /data/dir/issue /data/dir2/issue2
#/data目录有执行权限,就可以复制。[neteagle@centos8 root]$ exit
exit
[root@centos8 ~]# which cp
alias cp='cp -i'/usr/bin/cp
[root@centos8 ~]# ll /bin/cp
-rwxr-xr-x. 1 root root 333128 Apr 10 2020 /bin/cp
[root@centos8 ~]# chmod a= /bin/cp
[root@centos8 ~]# su neteagle
[neteagle@centos8 root]$ cp /data/dir/issue /data/dir2/issue3
bash: /usr/bin/cp: Permission denied
#cp没有权限,不能复制。[neteagle@centos8 root]$ exit
exit
[root@centos8 ~]# ll /bin/cp
----------. 1 root root 333128 Apr 10 2020 /bin/cp
[root@centos8 ~]# chmod o+x /bin/cp
[root@centos8 ~]# ll /bin/cp
---------x. 1 root root 333128 Apr 10 2020 /bin/cp
[root@centos8 ~]# su neteagle
[neteagle@centos8 root]$ cp /data/dir/issue /data/dir2/issue4
#cp 有执行权限就可以复制[neteagle@centos8 root]$ exit
exit总结:
/bin/cp 需要x权限。
/etc 需要x权限。
/etc/issue 需要r权限。
/data 需要x权限。
/data/dir 需要w ,x权限。
3.linux权限管理体系
linux文件权限管理
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。
r:文件:读取文件内容;目录:浏览目录
w:文件:修改文件内容;目录:删除、移动目录内文件,但必须同时又x权限
x:文件:执行文件;目录:进入目录
用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。
语法:chmod [ugoa…][[±=][perms…]…] file
特殊权限对应的数字
- suid 4000权限字符s(S),属主位上的x位上设置。
- sgid 2000权限字符s(S),属组位上的x位上设置。
- 粘滞位1000权限字符t(T),其他用户位的x位上设置。如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。
如果对应位有x则,字符权限表现为小写,否则表现为大写
linux用户权限管理
在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限。我们可以通过/etc/passwd 来查得UID为0的用户是root, root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除。对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也 可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要。
与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户;但为了完成特定的任务,普通用户和伪装用户也是必须的;Linux 是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用户所分配的权限也不同;在一般情况下,为了系统安全,对于一般常规级别的应用,不需要root用户来操作完成
当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过su和sudo来解决。
通过su可以在用户之间切换,超级权限用户root向普通或虚拟用户切换不需要密码,而普通用户切换到其它任何用户都需要密码验证;su命令参数如下:
-, -l, --login 登录并改变到所切换的用户环境
-c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境
su不加任何参数默认切换到root用户下,但用户环境变量没有改变;仅仅加-参数,表示默认切换到root用户,并且改变到root用户的环境;
但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事, 这在一定程度上就对系统的安全造成了威协;所以su工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统。
对于服务器的管理有多人参与管理时,这时我们就有必要用到sudo,通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo相对于权限无限制性的su来说,还是比较安全的。sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;我们可以用他的专用编辑工具visudo,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的。之后可以在授权的命令前加sudo以root用户身份执行。
第五章 文本处理工具和正则表达式
1.给账户生成一个多少位的随机口令
[root@centos8 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c10 #取出随机的前12个字符
qAYu20uu6f[root@centos8 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c10 | tee pass.txt | passwd --stdin neteagle #给账户生成一个多位口令的随机密码
Changing password for user neteagle.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]# cat pass.txt
7H8Nn7RK0S[root@centos8 ~]#
[root@centos8 ~]$su - neteagle
Password:
[neteagle@centos8 ~]$
2.计算1+2+3+…+99+100的总和
[root@centos8 ~]# seq 100|paste -d + -s|bc
5050
3.统计日志访问量最多的请求
[root@centos8 ~]# cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -34870 172.20.116.2283429 172.20.116.2082834 172.20.0.222[root@10-9-24-182 ~]# lastb |tr -s ' ' |cut -d ' ' -f3 |sort |uniq -c |sort -nr |head -334096 113.141.66.16324460 222.186.10.18816449 119.118.20.161
4.并发连接最多的远程主机IP
[root@centos8 ~]# ss -nt |tail -n +2 |tr -s ' ' : |cut -d: -f6 |sort |uniq -c |sort -nr |head -27 10.0.0.12 10.0.0.7
5.取两个文件的相同和不同的行
[root@centos8 ~]# cat > test1.txt <<EOF
a
b
1
c
EOF
[root@centos8 ~]# cat test1.txt
a
b
1
c[root@centos8 ~]# cat > test2.txt <<EOF
b
e
f
c
1
2
EOF
[root@centos8 ~]# cat test2.txt
b
e
f
c
1
2#取文件的共同行
[root@centos8 ~]# cat test1.txt test2.txt | sort |uniq -d
1
b
c
[root@centos8 ~]# grep -f test1.txt test2.txt
b
c
1#取文件的不同行
[root@centos8 ~]# cat test1.txt test2.txt | sort |uniq -u
2
a
e
f
6.算出所有人的年龄总和
[root@centos8 ~]# cat > nianling.txt
xiaoming=20
xiaohong=18
xiaoqiang=22
^C[root@centos8 ~]# cut -d"=" -f2 nianling.txt|tr '\n' + | grep -Eo ".*[0-9]"|bc
60[root@centos8 ~]# grep -Eo "[0-9]+" nianling.txt | tr '\n' + | grep -Eo ".*[0-9]"|bc
60
7.找到10/Mar/2016:15:11:50到10/Mar/2016:16:25:38的日志
[root@centos8 /data]#sed -n '/10\/Mar\/2016:15:11:50/,/10\/Mar\/2016:16:25:38/p' access.log
192.168.1.113 - - [10/Mar/2016:15:11:50 +0000] "GET / HTTP/1.1" 200 6209 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:15:11:50 +0000] "GET /favicon.ico HTTP/1.1" 404 168 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
192.168.1.113 - - [10/Mar/2016:16:24:46 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET / HTTP/1.1" 200 3319 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /css/style.css HTTP/1.1" 200 1236 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /00.jpg HTTP/1.1" 200 59360 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /1.jpg HTTP/1.1" 200 146862 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /2.jpg HTTP/1.1" 200 657124 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "HEAD /xy.mp3 HTTP/1.1" 200 0 "-" "contype" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /003.jpg HTTP/1.1" 200 362860 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /3.jpg HTTP/1.1" 200 1102358 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:57 +0000] "GET /22.jpg HTTP/1.1" 200 420895 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:58 +0000] "GET /js/jquery-1.7.2.min.js HTTP/1.1" 200 94840 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:58 +0000] "GET /js/jquery.let_it_snow.js HTTP/1.1" 200 6659 "http://192.168.1.168:8080/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:24:59 +0000] "GET /favicon.ico HTTP/1.1" 404 168 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
192.168.1.113 - - [10/Mar/2016:16:25:00 +0000] "GET /xy.mp3 HTTP/1.1" 200 2606054 "http://192.168.1.168:8080/" "NSPlayer/12.00.10011.16384 WMFSDK/12.00.10011.16384" "-"
192.168.1.113 - - [10/Mar/2016:16:25:28 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-"
192.168.1.113 - - [10/Mar/2016:16:25:30 +0000] "GET / HTTP/1.1" 200 6209 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
192.168.1.113 - - [10/Mar/2016:16:25:30 +0000] "GET /favicon.ico HTTP/1.1" 404 168 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
192.168.1.113 - - [10/Mar/2016:16:25:38 +0000] "GET / HTTP/1.1" 200 3319 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)" "-"
8.取出网站访问量最大的前3个IP
root@ubuntu2004:~# awk '{print $1}' access_log |sort|uniq -c|sort -nr|head -34870 172.20.116.2283429 172.20.116.2082834 172.20.0.222
9.取出分区利用率
root@ubuntu2004:~# df |awk -F"[[:space:]]+|%" '/^\/dev\/sd/{print $1,$5}'
/dev/sda2 5
/dev/sda3 12
/dev/sda4 1
10.取ifconfig输出结果中的IP地址
root@ubuntu2004:~# ifconfig eth0 | awk '/netmask/{print $2}'
10.0.0.200
11.文件host_list.log如下格式,请取出“.magedu.com”前面的主机名部分并写入到回到该文件中
root@ubuntu2004:~# cat >host_list.log <<EOF
> 1 www.raymonds.cc
> 2 blog.raymonds.cc
> 3 study.raymonds.cc
> 4 linux.raymonds.cc
> 5 python.raymonds.cc
> EOF
root@ubuntu2004:~# awk -F'[ .]' '{print $2}' host_list.log >> host_list.log
root@ubuntu2004:~# cat host_list.log
1 www.raymonds.cc
2 blog.raymonds.cc
3 study.raymonds.cc
4 linux.raymonds.cc
5 python.raymonds.cc
www
blog
study
linux
python
12.取连接数最多的前3个IP
root@ubuntu2004:~# awk -F" +|:" '{print $(NF-2)}' ss2.log |sort|uniq -c|sort -nr|head -312 223.88.255.14811 119.250.197.11810 183.202.63.36
13.将连接数超过3个以上的IP放入黑名单拒绝访问
[root@centos8 /data/script]#vim deny_dos.sh
#!/bin/bash
#
#*************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-08-26
#FileName: deny_dos.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#***********************************************************
while true;do
ss -nt | grep "^ESTAB" | awk -F"[[:space:]]+|:" '{print $(NF-2)}' | sort |uniq -c | while read count ip ; doif [ $count -gt 3 ];theniptables -A INPUT -s $IP -j REJECTfi
done
sleep 10
done
:wq
14.找到日志中访问前10的IP
[root@centos8 ~]#awk '{print $1}' access.log |sort|uniq -c|sort -nr|head1220 192.168.1.1171134 192.168.1.31583 192.168.1.113204 172.16.100.76112 172.16.233.133110 192.168.1.11883 192.168.1.11068 192.168.1.10768 172.16.250.22734 192.168.1.44
15.显示主机连接状态出现次数
root@ubuntu2004:~# awk 'NR>=2{state[$1]++}END{for(i in state){print i,state[i]}}' ss2.log
ESTAB 118
FIN-WAIT-1 1
LAST-ACK 11root@ubuntu2004:~# awk 'NR>=2{print $1}' ss2.log |sort|uniq -c118 ESTAB1 FIN-WAIT-111 LAST-ACK
16.找出访问前3的IP
root@ubuntu2004:~# awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log |sort -nr |head -3
4870 172.20.116.228
3429 172.20.116.208
2834 172.20.0.22root@ubuntu2004:~# awk -F'[ :]+' '/ESTAB/{ip[$6]++}END{for(i in ip){print ip[i],i}}' ss2.log |sort -nr |head -3
12 223.88.255.148
10 183.202.63.36
9 117.152.155.119root@ubuntu2004:~# awk '/ESTAB/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print count[i],i}}' ss2.log |sort -nr|head -3
12 223.88.255.148
10 183.202.63.36
9 117.152.155.119
17.将以下文件以inode为标记,对inode相同的counts进行累加,并且统计出同意inode中,beginnumber的最小值和endnumber的最大值
inode|beginnumber|endnumber|counts|
106|3363120000|3363129999|10000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|
311|3362120962|3362120963|2|
输出的结果格式为:
310|3337000000|3362120961|10103|
311|3313460102|3362120963|39900|
106|3363120000|3368579999|30000|
[root@centos8 ~]# awk -F'|' -v OFS='|' '/^[0-9]/{inode[$1]++; if(!bn[$1]){bn[$1]=$2}else if(bn[$1]>$2){bn[$1]=$2}; if(en[$1]<$3)en[$1]=$3;cnt[$1]+=$(NF-1)} END{for(i in inode)print i,bn[i],en[i],cnt[i]}' inode.log
106|3363120000|3368579999|30000
310|3337000000|3362120961|10103
311|3313460102|3362120963|39900
第六章 SHELL脚本编程
1. 0 、 0、 0、@、 ∗ 、 *、 ∗、#、$ 、 、 、!、$?代表什么含义
$0 获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径$* 获取当前shell脚本所有传参的参数,将所有的参数视为单个字符串,相当于“$1$2$"...,注意与$#号的区别$# 获取当前执行的shell脚本后面接的参数的总个数$@ 这个程序的所有参数”$1""$2""$3"“…”,这是将参数传递给其他程序的最佳方式,因为他会保留所有嵌在每个参数里的任何空白。"$@"和"$*",都要加双引号。$$ 获取当前Shell的进程号(PID)$!执行上一个指令的PID$_ 在此之前执行的命令或脚本的最后一个参数$?获取执行的上一个指令的返回值
2. ()和{}区别
#会开启子shell,只在子shell中有效
[root@centos8 ~]# name=raymond;(echo $name;name=tom;echo $name;);echo $name
结果:
raymond
tom
raymond#不会开启子shell,在当前shell中运行
[root@centos8 ~]# name=raymond;{ echo $name;name=tom;echo $name; };echo $name
结果:
raymond
tom
tom
3.| 管道
[root@centos8 /data/script]#exit
Logout
[root@centos8 ~]#echo raymond | read NAME
[root@centos8 ~]#echo $NAME
#这里看不到,因为| 管道会开启子shell进程,这里子shell进程已经结束,在父shell进程里是看不到子shell进程的[root@centos8 ~]#echo raymond | { read NAME; echo $NAME; }
raymond
#要在子shell进程里才可以看到
4.read和输入重定向
[root@centos8 bin]# echo 1 2 >test.txt[root@centos8 bin]# read i j <test.txt ;echo i=$i j=$j
i=1 j=2[root@centos8 bin]# echo 1 2 | read x y ;echo x=$x y=$y
x= y=
[root@centos8 bin]# echo 1 2 | (read x y ;echo x=$x y=$y)
x=1 y=2
[root@centos8 bin]# echo 1 2 | { read x y ;echo x=$x y=$y; }
x=1 y=2
5.exec、source以及bash有什么区别
bash:父进程会fork一个子进程,shell script在子进程中执行,修改的上下文不会影响当前shell
source:在原进程中执行,不会fork子进程,修改的上下文会影响当前shell
exec:在原进程中执行,但是同时会终止原进程
6.计算1+2+3+…+100的结果
[root@centos8 ~]# sum=0;for i in {1..100};do let sum+=i;done ;echo sum=$sum
sum=5050[root@centos8 ~]# vim for_sum.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-28
#FileName: for_sum.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
sum=0
N=100
for i in `seq $N`;dolet sum+=i
done
echo sum=$sum
:wq
[root@centos8 ~]# bash for_sum.sh
sum=5050[root@centos8 ~]# vim for_sum2.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-29
#FileName: for_sum2.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
N=100
for ((i=1;i<=$N;i++));dolet sum+=i
done
echo sum=$sum
:wq
[root@centos8 ~]# bash for_sum2.sh
sum=5050[root@centos8 ~]# vim while_sum.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-28
#FileName: while_sum.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
sum=0
i=1
N=100
while [ $i -le $N ];do sum=$[${sum}+${i}]i=$[$i+1]
done
echo "sum=$sum"
:wq
[root@centos8 ~]# bash while_sum.sh
sum=5050
7.将指定目录下的所有文件的后缀改名为 bak 后缀
[root@centos8 ~]# mkdir /data/test
[root@centos8 ~]# cd /data/test
[root@centos8 test]# vim ~/for_rename.bak
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-29
#FileName: for_rename.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
DIR=/data/test
cd $DIR
for FILE in * ;doPRE=`echo $FILE | sed -nr 's/(.*)\.([^.]+)$/\1/p'` mv $FILE $PRE.bak
done
[root@centos8 test]# bash ~/for_rename.bak
[root@centos8 test]# ls
a.bak b.bak c.bak
8.要求将目录YYYY-MM-DD/中所有文件,移动到YYYY-MM/DD/下
#1 创建YYYY-MM-DD,当前日期一年前365天到目前共365个目录,里面有10个文件,$RANDIM.log
[root@centos8 ~] #vim for_dir.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-29
#FileName: for_dir.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
PDIR=/data/test
for i in {1..365};doSUBDIR=`date -d "-$i day" +%F`mkdir $PDIR/$SUBDIRcd $PDIR/$SUBDIR for j in {1..10};dotouch $RANDOM.logdone
done
:wq
[root@centos8 ~]# bash for_dir.sh
[root@centos8 ~]# ls /data/test
2019-11-30 2020-01-10 2020-02-20 2020-04-01 2020-05-12 2020-06-22 2020-08-02 2020-09-12 2020-10-23
2019-12-01 2020-01-11 2020-02-21 2020-04-02 2020-05-13 2020-06-23 2020-08-03 2020-09-13 2020-10-24
2019-12-02 2020-01-12 2020-02-22 2020-04-03 2020-05-14 2020-06-24 2020-08-04 2020-09-14 2020-10-25
2019-12-03 2020-01-13 2020-02-23 2020-04-04 2020-05-15 2020-06-25 2020-08-05 2020-09-15 2020-10-26
2019-12-04 2020-01-14 2020-02-24 2020-04-05 2020-05-16 2020-06-26 2020-08-06 2020-09-16 2020-10-27
2019-12-05 2020-01-15 2020-02-25 2020-04-06 2020-05-17 2020-06-27 2020-08-07 2020-09-17 2020-10-28
2019-12-06 2020-01-16 2020-02-26 2020-04-07 2020-05-18 2020-06-28 2020-08-08 2020-09-18 2020-10-29
2019-12-07 2020-01-17 2020-02-27 2020-04-08 2020-05-19 2020-06-29 2020-08-09 2020-09-19 2020-10-30
2019-12-08 2020-01-18 2020-02-28 2020-04-09 2020-05-20 2020-06-30 2020-08-10 2020-09-20 2020-10-31
2019-12-09 2020-01-19 2020-02-29 2020-04-10 2020-05-21 2020-07-01 2020-08-11 2020-09-21 2020-11-01
2019-12-10 2020-01-20 2020-03-01 2020-04-11 2020-05-22 2020-07-02 2020-08-12 2020-09-22 2020-11-02
2019-12-11 2020-01-21 2020-03-02 2020-04-12 2020-05-23 2020-07-03 2020-08-13 2020-09-23 2020-11-03
2019-12-12 2020-01-22 2020-03-03 2020-04-13 2020-05-24 2020-07-04 2020-08-14 2020-09-24 2020-11-04
2019-12-13 2020-01-23 2020-03-04 2020-04-14 2020-05-25 2020-07-05 2020-08-15 2020-09-25 2020-11-05
2019-12-14 2020-01-24 2020-03-05 2020-04-15 2020-05-26 2020-07-06 2020-08-16 2020-09-26 2020-11-06
2019-12-15 2020-01-25 2020-03-06 2020-04-16 2020-05-27 2020-07-07 2020-08-17 2020-09-27 2020-11-07
2019-12-16 2020-01-26 2020-03-07 2020-04-17 2020-05-28 2020-07-08 2020-08-18 2020-09-28 2020-11-08
2019-12-17 2020-01-27 2020-03-08 2020-04-18 2020-05-29 2020-07-09 2020-08-19 2020-09-29 2020-11-09
2019-12-18 2020-01-28 2020-03-09 2020-04-19 2020-05-30 2020-07-10 2020-08-20 2020-09-30 2020-11-10
2019-12-19 2020-01-29 2020-03-10 2020-04-20 2020-05-31 2020-07-11 2020-08-21 2020-10-01 2020-11-11
2019-12-20 2020-01-30 2020-03-11 2020-04-21 2020-06-01 2020-07-12 2020-08-22 2020-10-02 2020-11-12
2019-12-21 2020-01-31 2020-03-12 2020-04-22 2020-06-02 2020-07-13 2020-08-23 2020-10-03 2020-11-13
2019-12-22 2020-02-01 2020-03-13 2020-04-23 2020-06-03 2020-07-14 2020-08-24 2020-10-04 2020-11-14
2019-12-23 2020-02-02 2020-03-14 2020-04-24 2020-06-04 2020-07-15 2020-08-25 2020-10-05 2020-11-15
2019-12-24 2020-02-03 2020-03-15 2020-04-25 2020-06-05 2020-07-16 2020-08-26 2020-10-06 2020-11-16
2019-12-25 2020-02-04 2020-03-16 2020-04-26 2020-06-06 2020-07-17 2020-08-27 2020-10-07 2020-11-17
2019-12-26 2020-02-05 2020-03-17 2020-04-27 2020-06-07 2020-07-18 2020-08-28 2020-10-08 2020-11-18
2019-12-27 2020-02-06 2020-03-18 2020-04-28 2020-06-08 2020-07-19 2020-08-29 2020-10-09 2020-11-19
2019-12-28 2020-02-07 2020-03-19 2020-04-29 2020-06-09 2020-07-20 2020-08-30 2020-10-10 2020-11-20
2019-12-29 2020-02-08 2020-03-20 2020-04-30 2020-06-10 2020-07-21 2020-08-31 2020-10-11 2020-11-21
2019-12-30 2020-02-09 2020-03-21 2020-05-01 2020-06-11 2020-07-22 2020-09-01 2020-10-12 2020-11-22
2019-12-31 2020-02-10 2020-03-22 2020-05-02 2020-06-12 2020-07-23 2020-09-02 2020-10-13 2020-11-23
2020-01-01 2020-02-11 2020-03-23 2020-05-03 2020-06-13 2020-07-24 2020-09-03 2020-10-14 2020-11-24
2020-01-02 2020-02-12 2020-03-24 2020-05-04 2020-06-14 2020-07-25 2020-09-04 2020-10-15 2020-11-25
2020-01-03 2020-02-13 2020-03-25 2020-05-05 2020-06-15 2020-07-26 2020-09-05 2020-10-16 2020-11-26
2020-01-04 2020-02-14 2020-03-26 2020-05-06 2020-06-16 2020-07-27 2020-09-06 2020-10-17 2020-11-27
2020-01-05 2020-02-15 2020-03-27 2020-05-07 2020-06-17 2020-07-28 2020-09-07 2020-10-18 2020-11-28
2020-01-06 2020-02-16 2020-03-28 2020-05-08 2020-06-18 2020-07-29 2020-09-08 2020-10-19
2020-01-07 2020-02-17 2020-03-29 2020-05-09 2020-06-19 2020-07-30 2020-09-09 2020-10-20
2020-01-08 2020-02-18 2020-03-30 2020-05-10 2020-06-20 2020-07-31 2020-09-10 2020-10-21
2020-01-09 2020-02-19 2020-03-31 2020-05-11 2020-06-21 2020-08-01 2020-09-11 2020-10-22#2 移动到YYYY-MM/DD下
[root@centos8 /data/script]#vim for_mv.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-11-29
#FileName: for_mv.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
DIR=/data/test
cd $DIR
for SRC in *;doYYYY_MM=`echo $SRC | cut -d"-" -f1,2`DD=`echo $SRC | cut -d"-" -f3`[ -d ${YYYY_MM}/$DD ] || mkdir -p ${YYYY_MM}/$DD &> /dev/nullmv $SRC/* ${YYYY_MM}/$DD
done
rm -rf $DIR/*-*-*
:wq
[root@centos8 ~]# bash for_mv.sh
[root@centos8 ~]# ls /data/test/
2019-11 2020-01 2020-03 2020-05 2020-07 2020-09 2020-11
2019-12 2020-02 2020-04 2020-06 2020-08 2020-10
9.扫描一个网段10.0.0/24(10.0.0.1-10.0.0.254),判断此网段中主机在线状态, 将在线的主机IP打印出来
root@ubuntu2004:~# vim check_host.sh
#!/bin/bash
#
#********************************************************************
#Author: zhanghui
#QQ: 19661891
#Date: 2020-12-20
#FileName: check_host.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
net=10.0.0
for i in {1..254};do{ ping -c1 -w1 $net.$i &>/dev/null && echo $net.$i is up | tee -a hostlist.log || echo $net.$i is down;}&
done
wait
:wq[root@centos8 ~]# bash for_scan_host.sh
10.0.0.7 is up
10.0.0.2 is up
10.0.0.6 is up
10.0.0.8 is up
10.0.0.150 is up
10.0.0.1 is down
10.0.0.3 is down
10.0.0.5 is down
10.0.0.11 is down
10.0.0.4 is down
10.0.0.17 is down
10.0.0.20 is down
10.0.0.13 is down
10.0.0.15 is down
10.0.0.23 is down
10.0.0.25 is down
10.0.0.27 is down
10.0.0.19 is down
10.0.0.10 is down
10.0.0.9 is down
10.0.0.12 is down
10.0.0.14 is down
10.0.0.16 is down
10.0.0.21 is down
10.0.0.18 is down
10.0.0.30 is down
10.0.0.34 is down
10.0.0.105 is down
10.0.0.44 is down
10.0.0.80 is down
10.0.0.45 is down
10.0.0.92 is down
10.0.0.48 is down
10.0.0.94 is down
10.0.0.60 is down
10.0.0.95 is down
10.0.0.64 is down
10.0.0.65 is down
10.0.0.84 is down
10.0.0.101 is down
10.0.0.73 is down
10.0.0.71 is down
10.0.0.97 is down
10.0.0.103 is down
10.0.0.40 is down
10.0.0.78 is down
10.0.0.75 is down
10.0.0.82 is down
10.0.0.69 is down
10.0.0.88 is down
10.0.0.99 is down
10.0.0.54 is down
10.0.0.67 is down
10.0.0.108 is down
10.0.0.49 is down
10.0.0.118 is down
10.0.0.38 is down
10.0.0.86 is down
10.0.0.42 is down
10.0.0.120 is down
10.0.0.90 is down
10.0.0.29 is down
10.0.0.112 is down
10.0.0.107 is down
10.0.0.36 is down
10.0.0.114 is down
10.0.0.122 is down
10.0.0.123 is down
10.0.0.130 is down
10.0.0.50 is down
10.0.0.128 is down
10.0.0.58 is down
10.0.0.52 is down
10.0.0.124 is down
10.0.0.56 is down
10.0.0.126 is down
10.0.0.62 is down
10.0.0.116 is down
10.0.0.32 is down
10.0.0.26 is down
10.0.0.22 is down
10.0.0.24 is down
10.0.0.28 is down
10.0.0.79 is down
10.0.0.31 is down
10.0.0.115 is down
10.0.0.102 is down
10.0.0.113 is down
10.0.0.72 is down
10.0.0.125 is down
10.0.0.109 is down
10.0.0.106 is down
10.0.0.139 is down
10.0.0.77 is down
10.0.0.131 is down
10.0.0.129 is down
10.0.0.111 is down
10.0.0.127 is down
10.0.0.76 is down
10.0.0.33 is down
10.0.0.85 is down
10.0.0.110 is down
10.0.0.104 is down
10.0.0.74 is down
10.0.0.81 is down
10.0.0.83 is down
10.0.0.117 is down
10.0.0.100 is down
10.0.0.35 is down
10.0.0.143 is down
10.0.0.70 is down
10.0.0.121 is down
10.0.0.119 is down
10.0.0.39 is down
10.0.0.37 is down
10.0.0.133 is down
10.0.0.41 is down
10.0.0.47 is down
10.0.0.46 is down
10.0.0.135 is down
10.0.0.66 is down
10.0.0.137 is down
10.0.0.141 is down
10.0.0.55 is down
10.0.0.57 is down
10.0.0.43 is down
10.0.0.144 is down
10.0.0.146 is down
10.0.0.148 is down
10.0.0.59 is down
10.0.0.157 is down
10.0.0.218 is down
10.0.0.180 is down
10.0.0.158 is down
10.0.0.96 is down
10.0.0.206 is down
10.0.0.191 is down
10.0.0.211 is down
10.0.0.194 is down
10.0.0.225 is down
10.0.0.169 is down
10.0.0.170 is down
10.0.0.224 is down
10.0.0.192 is down
10.0.0.87 is down
10.0.0.93 is down
10.0.0.91 is down
10.0.0.190 is down
10.0.0.159 is down
10.0.0.98 is down
10.0.0.178 is down
10.0.0.179 is down
10.0.0.160 is down
10.0.0.195 is down
10.0.0.182 is down
10.0.0.219 is down
10.0.0.171 is down
10.0.0.205 is down
10.0.0.193 is down
10.0.0.132 is down
10.0.0.209 is down
10.0.0.213 is down
10.0.0.221 is down
10.0.0.53 is down
10.0.0.215 is down
10.0.0.181 is down
10.0.0.216 is down
10.0.0.210 is down
10.0.0.68 is down
10.0.0.51 is down
10.0.0.175 is down
10.0.0.173 is down
10.0.0.172 is down
10.0.0.89 is down
10.0.0.212 is down
10.0.0.163 is down
10.0.0.164 is down
10.0.0.217 is down
10.0.0.165 is down
10.0.0.183 is down
10.0.0.223 is down
10.0.0.134 is down
10.0.0.140 is down
10.0.0.174 is down
10.0.0.203 is down
10.0.0.214 is down
10.0.0.200 is down
10.0.0.156 is down
10.0.0.202 is down
10.0.0.204 is down
10.0.0.155 is down
10.0.0.176 is down
10.0.0.166 is down
10.0.0.63 is down
10.0.0.207 is down
10.0.0.198 is down
10.0.0.226 is down
10.0.0.185 is down
10.0.0.153 is down
10.0.0.142 is down
10.0.0.186 is down
10.0.0.184 is down
10.0.0.196 is down
10.0.0.222 is down
10.0.0.208 is down
10.0.0.151 is down
10.0.0.138 is down
10.0.0.187 is down
10.0.0.197 is down
10.0.0.145 is down
10.0.0.147 is down
10.0.0.227 is down
10.0.0.149 is down
10.0.0.168 is down
10.0.0.199 is down
10.0.0.188 is down
10.0.0.136 is down
10.0.0.189 is down
10.0.0.152 is down
10.0.0.161 is down
10.0.0.61 is down
10.0.0.167 is down
10.0.0.177 is down
10.0.0.231 is down
10.0.0.220 is down
10.0.0.229 is down
10.0.0.154 is down
10.0.0.228 is down
10.0.0.232 is down
10.0.0.230 is down
10.0.0.162 is down
10.0.0.233 is down
10.0.0.201 is down
10.0.0.239 is down
10.0.0.235 is down
10.0.0.240 is down
10.0.0.238 is down
10.0.0.234 is down
10.0.0.236 is down
10.0.0.237 is down
10.0.0.243 is down
10.0.0.253 is down
10.0.0.251 is down
10.0.0.242 is down
10.0.0.246 is down
10.0.0.245 is down
10.0.0.244 is down
10.0.0.250 is down
10.0.0.249 is down
10.0.0.254 is down
10.0.0.252 is down
10.0.0.247 is down
10.0.0.248 is down
10.0.0.241 is downroot@ubuntu2004:~# cat hostlist.log
10.0.0.2 is up
10.0.0.20 is up
10.0.0.6 is up
10.0.0.18 is up
10.0.0.8 is up
10.0.0.7 is up
第七章 文件查找和打包压缩
1.find命令的 -maxdepth和-mindepth
[root@centos8 ~]# find /etc -maxdepth 2 -mindepth 2
#只查看2级深度目录
2.找出系统中大于100M的文件
[root@centos8 /data]#ls -lh `find / -size +100M`
find: ‘/proc/2927/task/2927/fd/5’: No such file or directory
find: ‘/proc/2927/task/2927/fdinfo/5’: No such file or directory
find: ‘/proc/2927/fd/6’: No such file or directory
find: ‘/proc/2927/fdinfo/6’: No such file or directory
-r-------- 1 root root 128T Jul 24 16:36 /proc/kcore
-rw------- 1 root root 128M Jul 24 16:36 /sys/devices/pci0000:00/0000:00:0f.0/resource1
-rw------- 1 root root 128M Jul 24 16:36 /sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
-rwxr-xr-x. 1 root root 217M Oct 29 2019 /usr/lib64/firefox/libxul.so
第八章 软件包管理
1.编译安装过程
configure:检查当前编译环境,生成MakeFile
make:根据MakeFile生成相关模块
make install:将模块copy到指定目录
第九章 磁盘存储和文件系统管理
1.RAID
RAID级别 | 读写性能 | 可用空间 | 容错能力 | 最少磁盘数 |
---|---|---|---|---|
RAID-0 | 读、写性能提升 | N*min(S1,S2,…) | 无容错能力 | 2 |
RAID-1 | 读性能提升、写性能略有下降 | 1*min(s1,s2…) | 有冗余能力,允许最多一块硬盘损坏 | 2 |
RAID-5 | 读、写性能提升 | (N-1)*min(S1,S2…) | 有容错能力:允许最多一块硬盘损坏 | 3 |
RAID-6 | 读、写性能提升 | (N-2)*min(S1,S2,…) | 有容错能力:允许最多2块硬盘损坏 | 4 |
RAID-10 | 读、写性能提升 | N*min(S1,S2,…)/2 | 有容错能力:每组镜像最多只能坏一块 | 4 |
第十章 网络协议和管理配置
1.TCP/IP 网络模型有几层?分别有什么用?
TCP/IP网络模型总共有五层
- 1.应用层:我们能接触到的就是应用层了,手机,电脑这些这些设备都属于应用层。
- 2.传输层:就是为应用层提供网络支持的,当设备作为接收⽅时,传输层则要负责把数据包传给应⽤,但是⼀台设备上可能会有很多应⽤在接收或者传输数据,因此需要⽤⼀个编号将应⽤区分开来,这个编号就是端⼝。所以 TCP 和 UDP 协议就是在这一层的
- 3.网络层:是负责传输数据的,最常使用的 ip 协议就在该层,⽹络层负责将数据从⼀个设备传输到另⼀个设备,世界上有很多设备,⽹络层需要有区分设备的编号。我们⼀般⽤ IP 地址给设备进⾏编号
- 4.数据链路层:每⼀台设备的⽹卡都会有⼀个 MAC 地址,它就是⽤来唯⼀标识设备的。路由器计算出了下⼀个⽬的地 IP 地址,再通过 ARP 协议找到该⽬的地的 MAC 地址,这样就知道这个 IP 地址是哪个设备的了。路由器就是通过数据链路层来知道这个 ip 地址是属于哪个设备的,它主要为⽹络层提供链路级别传输的服务。
- 5.物理层:当数据准备要从设备发送到⽹络的时候,需要把数据包转换成电信号,让其可以在物理介质中传输,它主要是为数据链路层提供⼆进制传输的服务。
2.TCP 滑动窗⼝是什么?
TCP 是每发送⼀个数据,都要进⾏⼀次确认应答。只有上一个收到了回应才发送下一个,这样效率会非常低,因此引进了滑动窗口的概念.
其实就是在发送方设立一个缓存区间,将已发送但未收到确认的消息缓存起来,假如一个窗口可以发送 5 个 TCP 段,那么发送方就可以连续发送 5 个 TCP 段,然后就会将这 5 个 TCP 段的数据缓存起来,这 5 个 TCP 段是有序的,只要后面的消息收到了 ACK ,那么不管前面的是否有收到 ACK,都代表成功,窗⼝⼤⼩是由接收方决定的。
窗⼝⼤⼩就是指不需要等待应答,还可以发送数据的大小。
3.TCP 建立连接的过程是怎样的?
- 第一次握手:A 的 TCP 进程创建一个 传输控制块 TCB ,然后向 B 发出连接请求报文段。之后将同步位 SYN 设置为 1,同时选择一个初始序列号 seq=x,这时客户端 A 进入到 SYN-SENT(同步已发送)状态。
- 第二次握手:B 收到连接请求报文段,如果同意建立连接,则向 A 发送确认。在确认报文段中 同步位 SYN=1、确认位 ACK=1、确认号 ack=x+1,同时也为自己选择一个初始序列号 seq=y,这时服务器 B 进入 SYN-RCVID 状态。
- 第三次握手:A 收到 B 的确认以后,再向 B 发出确认。确认报文 ACK=1、确认号ack=y+1。这时A进入到 ESTAB-LISHED 状态。当B接收到A的确认后,也进入 ESTAB-LISHED 状态。连接建立完成
4.为什么是三次握手???
-
1.为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误
-
- 如果客户端连续发送多次 SYN 建⽴连接的报⽂,如果出现了网络拥堵,可能会有旧连接先于新连接到达的情况,就可能会出现连接覆盖,要避免这种情况,最少需要三次握手
-
2.三次握⼿正好避免资源浪费
-
- 三次握⼿就已经是理论上建立可靠连接的最小次数了,所以不需要更多的连接
-
3.同步双⽅初始序列号
-
- 同步序列号(可以鉴别重复数序,按序接受等)其实并不要三次握手,只要一来一回两次就可以了
5.TCP 断开连接的过程是怎样的?
-
第一次挥手:A 先发送连接释放报文段,段首部的终止控制位 FIN=1,序号seq=u(等于A前面发送数据的最后一个序号加1);然后 A 进入 FIN-WAIT-1(终止等待1)状态,等待 B 的确认。
-
第二次挥手:B 收到 A 的连接释放报文段后,立刻发出确认报文段,确认号 ack=u+1,序号 seq=v(等于 B 前面发送数据的最后一个序号加1);然后 B 进入 CLOSE-WAIT(关闭等待)状态。
-
第三次挥手:A 收到 B 的确认报文段后进入到 FIN-WAIT-2(终止等待2)状态,继续等待 B 发出连接释放报文段;
-
- 若 B 已经没有数据要发送,B 就会向 A 发送连接释放报文段,段首部的终止控制位 FIN=1,序号 seq=w(半关闭状态可能又发送了一些数据),确认号 ack=u+1,这时B进入 LAST-ACK(最后确认)状态,等待A的确认。
-
第四次挥手:A收到B的连接释放报文段并发出确认,确认段中 确认位 ACK=1,确认号 ack=w+1,序号 seq=u+1;然后 A 进入到TIME-WAIT(时间等待)状态。当 B 再接收到该确认段后,B 就进入 CLOSED 状态。
6.第四次挥手为什么要等待2MSL(60s)
首先 2MSL 的时间是从客户端(A)接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端(A)的 ACK 没有传输到服务端(B),客户端(A)又接收到了服务端(B)重发的 FIN 报文,那么 2MSL 时间会被重置。等待 2MSL 原因如下
-
1.得原来连接的数据包消失
-
- 1)如果B没有收到自己的ACK,会超时重传FiN那么A再次接到重传的FIN,会再次发送ACK
- 2)如果B收到自己的ACK,也不会再发任何消息,
- 在最后一次挥手后 A 并不知道 B 是否接到自己的 信息
包括 ACK 是以上哪两种情况,A 都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。这刚好是2MSL,这个时间,足以使得原来连接的数据包在网络中消失。
-
2.保证 ACK 能被服务端接收到从而正确关闭链接
-
- 因为这个 ACK 是有可能丢失的,会导致服务器收不到对 FIN-ACK 确认报文。假设客户端不等待 2MSL ,而是在发送完 ACK 之后直接释放关闭,一但这个 ACK 丢失的话,服务器就无法正常的进入关闭连接状态。
7.为什么是四次挥手?
因为 tcp 可以在发送数据的同时也能接受数据,要实现可靠的连接关闭,A 发出结束报文 FIN,收到 B 确认后 A 知道自己没有数据需要发送了,B 知道 A 不再发送数据了,自己也不会接收数据了,但是此时 A 还是可以接收数据,B 也可以发送数据;当 B 发出 FIN 报文的时候此时两边才会真正的断开连接,读写分开。
8.TCP 半连接队列和全连接队列是什么?
服务端收到客户端发出的 SYN 请求后,会把这个连接信息存储到半链接队列(SYN 队列)。
服务端收到第三次握⼿的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到全连接队列(accept 队列),等待进程调⽤ accept 函数时把连接取出来。
这两个队列都是有大小限制的,当超过容量后就会将链接丢弃,或者返回 RST 包。
9.粘包/拆包是怎么发生的?怎么解决这个问题?
TCP 发送数据时会根据 TCP 缓冲区的实际情况进行包的划分,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是 TCP 粘包和拆包问题。
发生 TCP 粘包的原因:
- 1.发送的数据小于 TCP 缓冲区大小,TCP将缓冲区中的数据(数据属于多条业务内容)一次发送出去可能就会发生粘包。
- 2.接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
发生 TCP 拆包的原因:
- 1.待发送数据大于最大报文长度,TCP 在传输前将进行拆包。
- 2.发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。
解决方案:
- 1.发送端给每个数据包添加包首部,首部中包含数据包的长度,这样接收端在接收到数据后,通过该字段就可以知道每个数据包的实际长度了。
- 2.发送端将每个数据包设置固定长度,这样接收端每次从读取固定长度的数据把每个数据包拆分开。
- 3.可以在数据包之间设置边界,如添加特殊符号,接收端可以通过这个特殊符号来拆分包。
10.发送方一直发送数据,但是接收方处理不过来怎么办?(流量控制)
如果接收方处理不过来,发送方就会触发重试机制再次发送数据,然而这个是有性能损耗的,为了解决这个问题,TCP 就提出了流量控制,为的就是让发送方知道接受方的处理能力。
也就是说,每次接收方接受到数据后会将剩余可处理数据的大小告诉发送方。
比如接受方滑动窗口可用大小为400字节,发送方发送过来100字节的数据,那么接收方剩余可用滑动窗口大小就为300字节,这是发送方就知道下次返送数据的大小范围了。
但是这里有一个问题,数据会存放在缓冲区,但是这个缓冲区是操作系统控制的,当系统繁忙的时候,会缩减缓冲区减小,可能就会造成丢包的问题。
如: 发送方接收方窗口大小各为200字节,发送方发送100字节的给接收方,此时双方各剩100字节,但是此时操作系统非常忙,将接收方的缓存区减少了50字节,这时接收方就会告诉发送方,我还有50字节可用,但是在接收方发送到达之前,发送方是不知道的,只会看到自己还有100字节可用,那么就继续发送数据,如果发送了80字节数据,那么接收方缓存区大小为50字节,就会丢失30字节的数据,也就是会发生丢包现象。
我们会发现,这个问题发生的原因就是减少了缓存,又收缩了窗口大小,所以 TCP 是不允许同时减少缓存⼜收缩窗⼝的。
11.PING 的作用?
PING 主要的作用就是测试在两台主机之间能否建立连接,如果 PING 不通就无法建立连接。
它其实就是向目的主机发送多个 ICMP 回送请求报文
- 如果没有响应则无法建立连接
- 如果有响应就可以根据目的主机返回的回送报文的时间和成功响应的次数估算出数据包往返时间及丢包率
12.如何判断网线断了
[root@centos8-2 ~]# mii-tool eth0
eth0: no link #这就是网线没连接状态[root@centos8-2 ~]# ethtool eth0
Settings for eth0:Supported ports: [ TP ]Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: NoSupports auto-negotiation: YesSupported FEC modes: Not reportedAdvertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: NoAdvertised auto-negotiation: YesAdvertised FEC modes: Not reportedSpeed: Unknown!Duplex: Unknown! (255)Port: Twisted PairPHYAD: 0Transceiver: internalAuto-negotiation: onMDI-X: Unknown (auto)Supports Wake-on: dWake-on: dCurrent message level: 0x00000007 (7)drv probe linkLink detected: no #这就是网线没连接状态
13.如何查看哪个端口被哪个应用程序占用
[root@centos8 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 804 root 4u IPv4 27530 0t0 TCP *:ssh (LISTEN)
sshd 804 root 6u IPv6 27541 0t0 TCP *:ssh (LISTEN)
sshd 1248 root 5u IPv4 29099 0t0 TCP centos8.neteagles.cn:ssh->10.0.0.1:60324 (ESTABLISHED)
sshd 1260 root 5u IPv4 29099 0t0 TCP centos8.neteagles.cn:ssh->10.0.0.1:60324 (ESTABLISHED)
sshd 1769 root 5u IPv4 42916 0t0 TCP centos8.neteagles.cn:ssh->10.0.0.1:49853 (ESTABLISHED)
sshd 1771 root 5u IPv4 42916 0t0 TCP centos8.neteagles.cn:ssh->10.0.0.1:49853 (ESTABLISHED)[root@centos8 ~]# ss -ntlp |grep 22
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=804,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=804,fd=6))
14.抓包
[root@centos8 ~]# tcpdump -i eth0 -nn icmp and src host 10.0.0.6 and dst host 10.0.0.7
15.请你说出存放主机名的文件
/etc/hostname centos7、8和ubuntu1804
/etc/sysconfig/network centos6或之前版本
第十一章 进程和计划任务
1.如何查看进程是多线程还是单线程
[root@rocky8 ~]# cat /proc/723/status |grep -i threads
Threads: 6 # Threads 线程
2.僵尸态
[root@rocky8 ~]# bash
[root@rocky8 ~]# echo $BASHPID
9454
[root@rocky8 ~]# echo $PPID
1312
[root@rocky8 ~]# pstree -p |grep bash|-sshd(765)---sshd(1299)---sshd(1311)---bash(1312)---bash(9454)-+-grep(9472)#新开一个终端
[root@rocky8 ~]# pstree -p |grep bash|-sshd(765)-+-sshd(1299)---sshd(1311)---bash(1312)---bash(9454)| `-sshd(9473)---sshd(9475)---bash(9476)-+-grep(9498)
[root@rocky8 ~]# ps aux |grep bash
root 1312 0.0 0.4 26244 4000 pts/0 Ss 13:04 0:00 -bash
root 9454 0.0 0.4 26216 3924 pts/0 S+ 13:45 0:00 bash
root 9476 0.0 0.4 26244 3812 pts/1 Ss 13:47 0:00 -bash
root 9500 0.0 0.1 12136 1156 pts/1 R+ 13:47 0:00 grep --color=auto bash#将父进程设为停止态
[root@rocky8 ~]# kill -19 1312
[root@rocky8 ~]# ps aux |grep bash
root 1312 0.0 0.4 26244 4000 pts/0 Ts 13:04 0:00 -bash
root 9454 0.0 0.4 26216 3924 pts/0 S+ 13:45 0:00 bash
root 9476 0.0 0.4 26244 3812 pts/1 Ss 13:47 0:00 -bash
root 9502 0.0 0.1 12136 1152 pts/1 R+ 13:48 0:00 grep --color=auto bash#杀死子进程,使其进入僵尸态
[root@rocky8 ~]# kill 9454
[root@rocky8 ~]# ps aux |grep bash
root 1312 0.0 0.4 26244 4000 pts/0 Ts 13:04 0:00 -bash
root 9454 0.0 0.0 0 0 pts/0 Z+ 13:45 0:00 [bash] <defunct> #可以看到上STAT为Z,表示为僵尸态
root 9476 0.0 0.4 26244 3812 pts/1 Ss 13:47 0:00 -bash
root 9505 0.0 0.1 12136 1156 pts/1 R+ 13:49 0:00 grep --color=auto bash[root@rocky8 ~]# kill 1312
[root@rocky8 ~]# ps aux |grep bash
root 1312 0.0 0.4 26244 4000 pts/0 Ts 13:04 0:00 -bash
root 9454 0.0 0.0 0 0 pts/0 Z+ 13:45 0:00 [bash] <defunct>
root 9476 0.0 0.4 26244 3812 pts/1 Ss 13:47 0:00 -bash
root 9507 0.0 0.1 12136 1036 pts/1 R+ 13:50 0:00 grep --color=auto bash#方法1:恢复父进程
[root@rocky8 ~]# kill -18 1312
#方法2:杀死父进程
[root@rocky8 ~]# kill -9 1312#再次观察,可以僵尸态的进程不存在了
[root@rocky8 ~]# ps aux |grep bash
root 9476 0.0 0.4 26244 3812 pts/1 Ss 13:47 0:00 -bash
root 9512 0.0 0.4 26244 4000 pts/0 Ss+ 13:50 0:00 -bash
root 9534 0.0 0.1 12136 1140 pts/1 R+ 13:50 0:00 grep --color=auto bash
3.面试题:找到未知进程的执行程序文件路径
[root@rocky8 ~]# echo $BASHPID
10452
[root@rocky8 ~]# ls -l /proc/10452/exe
lrwxrwxrwx 1 root root 0 Oct 31 14:59 /proc/10452/exe -> /usr/bin/bash
4.搜索某个用户运行的进程
root@ubuntu2004:~# pgrep -au neteagle
5376 -bash
5.查看某个端口正在被哪个进程使用
root@ubuntu2004:~# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 900 root 3u IPv4 34154 0t0 TCP *:ssh (LISTEN)
sshd 900 root 4u IPv6 34156 0t0 TCP *:ssh (LISTEN)
sshd 1108 root 4u IPv4 36999 0t0 TCP ubuntu2004:ssh->10.0.0.1:57525 (ESTABLISHED)
sshd 3667 root 4u IPv4 52331 0t0 TCP ubuntu2004:ssh->10.0.0.1:58047 (ESTABLISHED)
6.面试题:11月每天的6-12点之间每隔2小时执行/app/bin/test.sh
root@ubuntu2004:/# crontab -l
0 6-12/2 * 11 * /app/bin/test.sh
第十二章 Linux启动和内核管理
1.centos6启动流程
1.加载BIOS的硬件信息,获取第一个启动设备
2.读取第一个驱动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有硬件设备
4.核心执行init程序,并获取默认的运行信息
5.init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(scripts)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登录之后开始以shell控制主机
2.centos7、8启动流程
1.UEFi或BIOS初始化,运行POST开机自检
2.选择启动设备
3.引导装载程序, centos7是grub2,加载装载程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
4.加载initramfs驱动模块
5.加载内核选项
6.内核初始化,centos7使用systemd代替init
7.执行initrd.target所有单元,包括挂载/etc/fstab
8.从initramfs根文件系统切换到磁盘根目录
9.systemd执行默认target配置,配置文件/etc/systemd/system/default.target
10.systemd执行sysinit.target初始化系统及basic.target准备操作系统
11.systemd启动multi-user.target下的本机与服务器服务
12.systemd执行multi-user.target下的/etc/rc.d/rc.local
13.Systemd执行multi-user.target下的getty.target及登录服务
14.systemd执行graphical需要的服务
第十三章 Linux防火墙
1.连接过多不能访问
当服务器连接多于最大连接数时dmesg 可以观察到 :kernel: ip_conntrack: table full, dropping packet错误,并且导致建立TCP连接很慢。
[root@rocky8 ~]# echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
[root@rocky8 ~]# tail /var/log/messages
Jul 9 21:06:32 centos8 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
连接过多的解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
2.端口转发
[root@lanserver ~]# iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport 80 -j REDIRECT --to-ports 8080
第十六章 域名系统DNS服务
1.DNS工作原理
DNS服务器的解析过程:
第一步:浏览器会检查缓存中有没有这个域名对应的解析过的IP,如果缓存中有,这个解析过程就将结束。所以很多时候因为浏览器的DNS缓存的问题,导致访问某个资源出现问题,是因为DNS的解析出问题了。
第二步:如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。
第三步:如何、怎么知道域名服务器呢?我们的网络配置中都会有“DNS服务器地址”这个选项,如果前面的两个过程无法解析,则会把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器。如下图所示:
一般这种专门的域名解析器性能都会非常好,它们一般都会缓存域名解析结果,大约80%的域名解析工作都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。
第四步:如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析。
第五步:根据域名服务器返回给本地域名服务器一个所查询的主域名服务器(gLTD Server)地址。gLTD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
第六步:本地域名服务器(Local DNS Server)再向上一步返回的gLTD服务器发送请求。
第七步:接受请求的gLTD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
第八步:Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下根据域名得到目标的IP记录,连同一个TTL值返回给DNS Server域名服务器。
第九步:返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。
第十步:把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
2.递归和迭代查询的区别
递归查询:客户端向本地DNS服务器的查询,返回的是最终结果,负责到底。
迭代查询:本地的DNS服务器向其它DNS服务器的查询,返回的不是最终结果,而是最好结果,不负责到底。
3.CDN工作原理
CDN工作原理
1.当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
2.CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。
3.用户向CDN的全局负载均衡设备发起内容URL访问请求。
4.CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
5.区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
6.全局负载均衡设备把服务器的IP地址返回给用户。
7.用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
DNS服务器根据用户IP地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用CDN服务的网站,只需将其域名解析权交给CDN的GSLB设备,将需要分发的内容注入CDN,就可以实现网站内容加速。
4.DNS 什么时候使用端口号 53/tcp ,53/udp,953/tcp
tcp 53端口在DNS的主从同步使用
udp 53端口在DNS查询使用,但也影响主从同步
tcp 953端口是管理端口
第十七章 企业级容器技术docker
1.将一台主机的所有镜像传到另一台主机
#方法1:使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示为<none>
root@ubuntu1804:~# docker save `docker images -qa` -o all.tar
root@ubuntu1804:~# scp all.tar 10.0.0.7:
The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:zb/8mo/ptS0h8eHVY1FDRuvh6aQj1opzpsD7khnYjSo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.7' (ECDSA) to the list of known hosts.
root@10.0.0.7's password:
all.tar 100% 285MB 93.6MB/s 00:03 [root@centos7 ~]# ls
all.tar anaconda-ks.cfg install_docker_3.sh
[root@centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@centos7 ~]# docker load -i all.tar
1dad141bdb55: Loading layer [==================================================>] 1.455MB/1.455MB
777b2c648970: Loading layer [==================================================>] 5.848MB/5.848MB
2653d992f4ef: Loading layer [==================================================>] 216.5MB/216.5MB
bacd3af13903: Loading layer [==================================================>] 75.27MB/75.27MB
9069f84dbbe9: Loading layer [==================================================>] 15.36kB/15.36kB
f6253634dc78: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image ID: sha256:a77dce18d0ecb0c1f368e336528ab8054567a9055269c07c0169cba15aec0291
Loaded image ID: sha256:389fef7118515c70fd6c0e0d50bb75669942ea722ccb976507d7b087e54d5a23
Loaded image ID: sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
Loaded image ID: sha256:f643c72bc25212974c16f3348b3a898b1ec1eb13ec1539e10a103e6e217eb2f1
[root@centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a77dce18d0ec 12 days ago 1.24MB
<none> <none> 389fef711851 3 weeks ago 5.58MB
<none> <none> 300e315adb2f 4 weeks ago 209MB
<none> <none> f643c72bc252 6 weeks ago 72.9MB#方法2
root@ubuntu1804:~# docker save `docker images|awk 'NR!=1{print $1":"$2}'` -o backup.tar
root@ubuntu1804:~# scp backup.tar 10.0.0.200:
The authenticity of host '10.0.0.200 (10.0.0.200)' can't be established.
ECDSA key fingerprint is SHA256:yCTWFgC+3ZecDrHJg+WwPKts+JT+MgJ+up0bzcTX6dE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.200' (ECDSA) to the list of known hosts.
root@10.0.0.200's password:
backup.tar 100% 285MB 148.9MB/s 00:01 root@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root@ubuntu2004:~# ls
backup.tar snap
root@ubuntu2004:~# docker load -i backup.tar
777b2c648970: Loading layer [==================================================>] 5.848MB/5.848MB
Loaded image: alpine:latest
2653d992f4ef: Loading layer [==================================================>] 216.5MB/216.5MB
Loaded image: centos:latest
bacd3af13903: Loading layer [==================================================>] 75.27MB/75.27MB
9069f84dbbe9: Loading layer [==================================================>] 15.36kB/15.36kB
f6253634dc78: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: ubuntu:latest
1dad141bdb55: Loading layer [==================================================>] 1.455MB/1.455MB
Loaded image: busybox:uclibcroot@ubuntu2004:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox uclibc a77dce18d0ec 12 days ago 1.24MB
alpine latest 389fef711851 3 weeks ago 5.58MB
centos latest 300e315adb2f 4 weeks ago 209MB
ubuntu latest f643c72bc252 6 weeks ago 72.9MB
2.docker数据卷持久保存方案有几种模式
数据卷(指定宿主机目录、匿名卷、命令卷),数据卷容器
3.docker的网络模式有几种
bridge、host、none、container、自定义网络
第十八章 运维自运化之ANSIBLE
1.你都使用过哪些ansible模块
command模块、shell模块、script模块、copy模块、get-url模块、fetch模块、file模块、unarchive模块、archive模块、hostnane模块、cron模块、yum和apt模块、yum_repository模块、service模块、user模块、group模块、 lineinfile模块、replace模块。setup模块、debug模块
第十九章 MYSQL数据库
1.时间字段进行过滤查询,并且timestamp可以随其它字段的更新自动更新
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.000 sec)MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| db2 |
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| testdb |
+--------------------+
7 rows in set (0.000 sec)MariaDB [(none)]> use testdb
Database changedMariaDB [testdb]> create table testdate (id int,date timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.011 sec)MariaDB [testdb]> insert testdate (id) values(1);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> insert testdate (id) values(2);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> insert testdate (id) values(3);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> insert testdate (id) values(4);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> insert testdate (id) values(5);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> insert testdate (id) values(6);
Query OK, 1 row affected (0.001 sec)MariaDB [testdb]> select * from testdate;
+------+---------------------+
| id | date |
+------+---------------------+
| 1 | 2022-12-11 13:31:50 |
| 2 | 2022-12-11 13:31:59 |
| 3 | 2022-12-11 13:32:34 |
| 4 | 2022-12-11 13:32:38 |
| 5 | 2022-12-11 13:32:40 |
| 6 | 2022-12-11 13:32:43 |
+------+---------------------+
6 rows in set (0.000 sec)MariaDB [testdb]> select * from testdate where date between '2022-12-11 13:31:59' and '2022-12-11 13:32:40';
+------+---------------------+
| id | date |
+------+---------------------+
| 2 | 2022-12-11 13:31:59 |
| 3 | 2022-12-11 13:32:34 |
| 4 | 2022-12-11 13:32:38 |
| 5 | 2022-12-11 13:32:40 |
+------+---------------------+
4 rows in set (0.001 sec)MariaDB [testdb]> select * from testdate where date >= '2022-12-11 13:31:59' and date <= '2022-12-11 13:32:40';
+------+---------------------+
| id | date |
+------+---------------------+
| 2 | 2022-12-11 13:31:59 |
| 3 | 2022-12-11 13:32:34 |
| 4 | 2022-12-11 13:32:38 |
| 5 | 2022-12-11 13:32:40 |
+------+---------------------+
4 rows in set (0.007 sec)#修改其它字段,会自动更新timestamp字段
MariaDB [testdb]> update testdate set id=10 where id=1;
Query OK, 1 row affected (0.007 sec)
Rows matched: 1 Changed: 1 Warnings: 0MariaDB [testdb]> select * from testdate;
+------+---------------------+
| id | date |
+------+---------------------+
| 10 | 2022-12-11 13:37:12 |
| 2 | 2022-12-11 13:31:59 |
| 3 | 2022-12-11 13:32:34 |
| 4 | 2022-12-11 13:32:38 |
| 5 | 2022-12-11 13:32:40 |
| 6 | 2022-12-11 13:32:43 |
+------+---------------------+
6 rows in set (0.000 sec)
2.MyISAM存储引擎和InnoDB存储引擎的区别
MyISAM存储引擎
不支持聚集索引 Clustered indexes
不支持数据缓存 Data caches
不支持外键 Foreign key support
支持锁定粒度:table (加表级锁) Locking granularity
不支持MVCC (多版本并发控制机制)
不支持事务 TransactionsInnoDB存储引擎
支持聚集索引 Clustered indexes
支持数据缓存 Data caches
支持外键 Foreign key support
支持锁定粒度:Row (加行级锁) Locking granularity
支持MVCC (多版本并发控制机制)
支持事务 Transactions
3.面试题: InnoDB中三层索引结构一颗的B+树可以存放多少行数据?
假设定义一颗B+树高度为2,即一个根节点和若干叶子节点。那么这棵B+树的存放总行记录数=根节点指针数*单个叶子记录的行数。这里先计算叶子节点,B+树中的单个叶子节点的大小为16K,假设每一条目为1K,那么记录数即为16(16k/1K=16),然后计算非叶子节点能够存放多少个指针,假设主键ID为bigint类型,那么长度为8字节,而指针大小在InnoDB中是设置为6个字节,这样加起来一共是14个字节。那么通过页大小/(主键ID大小+指针大小),即16384/14=1170个指针,所以一颗高度为2的B+树能存放16*1170=18720条这样的记录。根据这个原理就可以算出一颗高度为3的B+树可以存放16*1170*1170=21902400条记录。所以在InnoDB中B+树高度一般为2-3层,它就能满足千万级的数据存储
4.事务特性
ACID特性:
A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔
离级别,实现并发
D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
5.事务隔离级别
READ UNCOMMITTED
可读取到未提交数据,产生脏读
READ COMMITTED
可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次
读取数据不一致
REPEATABLE READ
可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍
只能读取到未修改前的旧数据。此为MySQL默认设置
SERIALIZABLE
可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻
塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差
6.慢查询日志设置多少秒
mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)mysql> set global slow_query_log=1; #开启慢查询日志
Query OK, 0 rows affected (0.00 sec)mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
| 10.000000 |
+-------------------+
1 row in set (0.00 sec)#默认设置10秒mysql> select @@slow_query_log_file;
+---------------------------------+
| @@slow_query_log_file |
+---------------------------------+
| /var/lib/mysql/centos8-slow.log |
+---------------------------------+
1 row in set (0.00 sec)
#慢查询日志存放路径[root@centos8 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
slow_query_log #开启慢查询日志
long_query_time=3 #设置慢查询日志时间为3秒
:wq[root@centos8 ~]# systemctl restart mysqldmysql> select sleep(1) from teachers;
+----------+
| sleep(1) |
+----------+
| 0 |
| 0 |
| 0 |
| 0 |
+----------+
4 rows in set (4.03 sec)[root@centos8 ~]# tail -f /var/lib/mysql/centos8-slow.log
SET timestamp=1612688316;
select sleep(1) from teachers;
#超过3秒的慢查询日志,都会记录
7.Mysql主从复制原理
1.主节点数据更新
2.生成Bin Log(二进制日志)
3.在主节点开启dump Thread线程,负责把二进制日志从主节点发送给从节点
4.从节点开启I/O Thread线程,负责接收网络发过来的二进制日志
5.把接收到的二进制日志放到中继日志 Relay Log中
6.开启SQL Thread线程,把中继日志中的内容,读取到内存中执行
7.进行执行就更改了数据库,数据库中的内容保持和主节点的内容保持一致,从而最终就实现了主从复制
8.MySQL主从数据不一致
1.造成主从不一致的原因
- 主库binlog格式为Statement(语句型),同步到从库执行后可能造成主从不一致。(把binlog 改成行型)
- 主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
- 从节点未设置只读,误操作写入数据
- 主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面可能不支持该功能
- MySQL自身bug导致
2.主从不一致修复方法
- 将从库重新实现
虽然这也是一种解决方法,但是这个方案恢复时间比较慢,而且有时候从库也是承担一部分的查询操作的,不能贸然重建。 - 使用percona-toolkit工具辅助
PT工具包中包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,需要时间去学习,去测试,特别是在生产环境,还是要小心使用
关于使用方法,可以参考下面链接:https://www.cnblogs.com/feiren/p/7777218.html - 手动重建不一致的表
在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致这种方案缺点是在执行导入期间需要暂时停止从库复制,不过也是可以接受的
3.如何避免主从不一致
- 主库binlog采用ROW格式
- 主从实例数据库版本保持一致
- 主库做好账号权限把控,不可以执行set sql_log_bin=0
- 从库开启只读,不允许人为写入
- 定期进行主从一致性检验
9.MHA是怎么健康性检查的?
mysql> select 1 as value;
+-------+
| value |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)