linux学习笔记

老男孩培训第一天
1.什么是Linux?

什么是windows?
是一个操作系统(os),Operating System,个人电脑使用.
手机系统:安卓(Linux)\IOS(Unix)


什么是Linux?
是一个操作系统(os),Operating System,用于服务器端(linux),存放网站的内容(给用户看).
www.jd.com,www.baidu.com 存储用户数据的服务器可能有上万-10万台.Linux系统.

2.Linux系统作用
是一个基础系统软件,向下管理硬件,向上管理应用软件,为应用软件运行提供基础支撑.

3.linux起源介绍
起源于unix,1991年由Linus Torvalds开发.

4.GPL知识
GPL全称为General Public License,中文名为通用公共许可,
是一个最著名的开源许可协议,开源社区最著名的Linux内核就是在GPL许可下发布的。
1984年,Richard Stallman发起开发自由软件的运动后不久,又创立了通用公共许可证(GPL),这对推动自由软件发展起了至关重要的作用。

简单理解,GPL许可的核心,是保证任何人有共享和修改自由软件的自由,任何人有权取得、修改和重新发布自由软件的源代码权利,但都必须同时给出具体更改的源代码。
虽然整个Linux内核是基于GNU通用公共许可的,但是Linux内核并不是GNU计划的一部分,这一点请读者不要混淆。

5.Linux特点
1.开源:源代码开放,可以修改功能.
2.linux属于全人类的财产.
3.自由传播,可以卖钱.
4.安全\稳定\可扩展,10年不用重启.
5.适合Intel等x86 CPU系列架构的计算机

Linux操作系统之所以如此流行,是因为它具有如下一些优秀特点:
	是开放源代码的系统软件,可自由修改,自由传播。
	Unix系统兼容,具备几乎所有Unix的优秀特性。
	无任何商业化版权制约,即用户使用无需支付任何费用,还可以随意卖钱。
	适合Intel等x86 CPU系列架构的计算机。
	Linux系统是全世界的共同财产,社区开发和使用者活跃,遍及世界。


国家支持,大国重器操作系统和芯片
麒麟Linux操作系统,
手机鸿蒙操作系统

缺点:
1.入门难度大一点.可视化程度差.

6.Linux发行版本介绍

Linux发行商包括Redhat、Debian、Fedora、SUSE、CentOS、Ubuntu、麒麟……


下面来看看其中几个重要的服务端发行版本。
1) Red Hat:Red Hat Linux9.0的内核为2.4.20。在版本9.0后,Red Hat不再遵循GPL协议,成为收费产品(但仍开源),发展的新版本依次为3.x、4.x、5.x、6.x、7.x、8.x。
传统企业会用:没有技术人员,遇到问题希望有人解决,有人背锅.

2) Fedora:Red Hat的一个分支,仍遵循GPL协议,可以认为是Red Hat预发布版(小白鼠)。

3) CentOS:Red Hat的另一个分支,以Red Hat发布的源代码重建符合GPL许可协议的Linux系统,
即将其源代码的商标LOGO以及非自由软件部分去除后再编译而成的版本,目前CentOS已被Red Hat公司收购,但仍开源免费。

7.操作系统趋势和版本选择
CentOS/Ubuntu/麒麟

CentOS:
	1.互联网公司正在使用的
	主流7.X(2024年底停止维护),互联网主流使用这个版本
	未来8.X(2021年底停止),使用的很少,企业不会选他了.
	发行centos stream,未来??? red hat收购centos.
	
	centos创始人团队跳出来,开发了linux,Rocky Linux

	近日,CentOS 官方宣布 CentOS 系列稳定版 Linux 系统将停止维护,取而代之的是测试版的 CentOS Stream,引发了 CentOS 用户的强烈不满。为此,CentOS 创始人 Gregory Kurtzer 发起了一个新的项目,旨在将 CentOS 延续下去。
	在这里插入图片描述Kurtzer 新建的项目名为 Rocky Linux

2.Ubuntu(debian) 个人版 桌面,服务器也可以用了,和centos很接近,未来之星

3.麒麟(传统企业会用)

学习选择:CentOS7.9,未来Ubuntu

8.搭建学习Linux运维环境

物理机(宿主机)系统版本	VMware Workstation版本
Windows 7(本书环境)	        VMware Workstation12/14(本书环境)
Windows 10(读者可用环境)	VMware Workstation15/16(读者可用环境)


虚拟机软件对PC硬件的要求
要学习Linux,对读者的个人电脑的基本要求如下:
CPU: 最低I5,使用I7最佳 。
内存:最低在8GB(CentOS7最好16G+,32G)。
硬盘:最低在20G,使用500G及以上的[SSD固态盘]最佳。
系统:建议Windows10。

学习的投资是最值得的投资。——老男孩

用好的:
CPU: I7 
内存:32G
硬盘:SSD固态盘1T(移动盘)
系统:Windows10

9.安装vmware workstation软件

10.创建虚拟机(买电脑硬件)
下载:
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

修改网卡名从ens33为eth0的形式,Centos6及以前都是eth0.大家习惯eth0格式了.
内核参数 加入net.ifnames=0 biosdevname=0

win: administrator 比尔盖茨,希望你你把管理员改的短一点,admin,否则 学习不舒服.
lin: root

远程连接不上
1.配置正确(服务端 ip10.0.0.7,gw10.0.0.2,dns223.5.5.5),客户端(ip:10.0.0.7)
2.重启vnet8网卡
3.还原虚拟网络编辑器默认配置.

明天:
1.bash基础
2.基础命令,文件\目录
关机重启
man help
cd pwd ls tree mkdir mv rm alias unalias
vi vim touch tail head
3.目录结构

老男孩培训第二天

window10可以上网,远程连接不上Linux或者linux上不了网
1.配置正确(服务端 ip10.0.0.7,gw10.0.0.2,dns223.5.5.5),客户端(ip:10.0.0.7)
[root@oldboy ~]# ip add #查看IP
2: eth0:
inet 10.0.0.7/24
#IP地址,用于连接服务器的地址
[root@oldboy ~]# ip route #查看路由
default via 10.0.0.2 dev eth0 proto static metric 100
#有10.0.0.2 网关,上网的出口.
xshell:10.0.0.7
检测上网:
[root@oldboy ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=5 ttl=128 time=11.2 ms
#虚拟网络编辑器里面的网段(10.0.0.0,255.255.255.0)和网关要配置正确(10.0.0.2)

2.重启vnet8网卡

3.重启vnet8网卡还不行,还原虚拟网络编辑器默认配置.

window10无法上网
1.接口重新插下.
2.重启电脑.
3.分析下旁边人如果可以.那就是你的网线接口.换个接口还不行,你win本身问题.

#1.配置官方源更新地址(打补丁下载软件的地址):
#官方====>国内(阿里云、网易163、清华源)
#CentOS7默认是从官方下载软件的,改为从阿里云网站下载
curl -s -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

#2.配置第三方epel源更新地址:
#EPEL (Extra Packages for Enterprise Linux), 是由 Fedora Special Interest Group 维护的 #Enterprise Linux(RHEL、CentOS)中经常用到的包。
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

#3.更新所有软件到最新(学习不用更新)
#yum update -y #总下载量279M。
#工作中服务器用于正式环境之前安装。

#4.CentOS6和CentOS7都要安装的企业运维常用基础工具包
yum install tree nmap dos2unix lrzsz nc lsof wget -y
yum install tcpdump htop iftop iotop sysstat nethogs -y

#CentOS7要安装的企业运维常用基础工具包
yum install psmisc net-tools bash-completion vim-enhanced -y

#好玩的工具
yum install sl cowsay -y

问题:多个yum命令不能同时使用,必须顺序安装。
[root@oldboy ~]# yum install tcpdump htop iftop iotop sysstat nethogs -y
已加载插件:fastestmirror
/var/run/yum.pid 已被锁定,PID 为 3701 的另一个程序正在运行。
Another app is currently holding the yum lock; waiting for it to exit…
另一个应用程序是:yum
解决:
ctrl+c 终止
[root@oldboy ~]# ps -ef|grep yum
root 1880 1701 0 09:09 pts/0 00:00:00 /var/run/yum.pid 已被锁定
杀掉所有yum进程号
kill -9 1707


vmware快照和克隆

1.什么是快照?
保存系统某一个时刻的运行状态。和拍照一样。

2.快照的目的?
当系统出故障后,可以快速还原到故障前的状态,
可以对系统做多个快照。树形结构。
什么时候做快照合适?
操作影响系统的关键操作之前,包括删除文件,重装软件,更改核心配置。
学习的好帮手,不需要关机.

3.什么是[克隆]?
克隆羊
1)链接克隆,只做很少的更改,生成一个新的系统。性能差一些,但是占用空间小,克隆速度快,依赖原始镜像,学习使用。
2)完全克隆,一模一样复制。占用空间大,克隆速度慢,不依赖原始镜像。
注意IP地址和MAC地址的更换。必须关机

计算机网络:
教室所有机器接起来,局域网(PC,网线,交换机,路由器)

计算机网络:快递网络,邮局网络

2 IP地址分类

2.1 什么是IP地址

快递公司:把货物从卖家送到买家.
卖家:发货地址
买家:收货地址
两台服务器(卖家和买家的关系)通信,有交换机,路由器(快递公司).

IP地址就类似生活中家庭住址,家庭住址是找我们个人(收货地址),通过IP地址找计算机。
在一个网络范围内,IP唯一标识一台主机。
互联网主机之间通信需要协议的(tcp/ip).

ip地址样子:10.0.0.5

  • 32位二进制数字序列组成的数字序列
    11111111.11111111.11111111.11111111 #32个1,32位,进制是2进制
    采用点将32位数字进行分割为4段,每段8位的二进制数,但二进制数不便于记忆,因此转换为10进制数显示,即点分十进制
    10.0.0.5
    ip地址范围:0.0.0.0—255.255.255.255

2.2 十进制与二进制的转换
十进制:逢10进1
1024是怎么计算出来的?

二进制:逢2进1
11 转成2进制是3
1011 转成2进制是11
11111111转成10进制? 255

2.3 IP地址的分类(IPV4地址一共多少个?)
范围:0.0.0.0—255.255.255.255 40多个亿个地址

简单的说,IP地址分5类,常见的地址是A、B、C类,是公网IP地址。
A 1.0.0.0 到 126.0.0.0 (0.0.0.0 和127.0.0.0保留)

B 128.1.0.0 到 191.254.0.0 (128.0.0.0和191.255.0.0保留)

C 192.0.1.0 到 223.255.254.0 (192.0.0.0和223.255.255.0保留)

D 224.0.0.0 到 239.255.255.255 #用于多点广播

E 240.0.0.0 到 255.255.255.254 保留(255.255.255.255用于广播)

注意:
1)ABC三类分配给互联网公网用户所使用(滴滴 jd)
2)D类型做为组播使用(keepalived,heartbeat多播)
mcast eth1 225.0.0.1 694 1 0 #heartbeat组播配置
ucast eth1 172.16.49.133 #heartbeat单播
3)E类型作为科学研究使用,进行保留
其他地址:用于IDC机房,办公室场景中ISP给我们分配的外网地址。

特殊地址:
127.0.0.1 —表示回环地址,进行本机测试使用,验证本地的TCP协议簇安装的是否正确
0.0.0.0 —主机位全为0的称为是网络地址
255.255.255.255 —主机位全为1的称为是广播地址,即向所有人发出信息

2.4 私网地址和局域网地址【*****】

在一个企业内部可以复用的IP地址,称为私网地址和局域网地址。
局域网地址只能在企业内部使用,不能进入[公网互联网使用],路由器不转发私网地址。

私网地址:下面的网络地址段就是分配给专用网络地址使用的。
10.0.0.0/8 (10.0.0.0到10.255.255.255) ##10.0.0.7
172.16.0.0/12 (172.16.0.0到172.31.255.255)
192.168.0.0/16 (192.168.0.0到192.168.255.255) ###192.168.0.0/16,都用192.

169.254.0.0/16 (169.254.0.0到169.254.255.255)* ###获取不到IP地址的时候,配这个地址
我们运维人员搭建局域网的时候自己根据他的标准,自己随意配。

子网掩码:划分网络位和主机位
10.0.0.0/24 #分为网络位和主机位。
MASK:255.255.255.0 子网掩码,控制可以有多少个网络,每个网络内有多少个电脑。
11111111.11111111.11111111.00000000 #全1的是网络位,全0是主机位.

10.0.0.0/24 #10.0.0.1-10.0.0.254台电脑(0.0.0.0,10.0.0.255)

私网地址不能进入公网的,那么我们的电脑怎么上网的呢?
路由器作用:
1.帮我们修改了数据包源地址
数据包出网的时候路由器会用SNAT改变局域网的地址为路由器的公网地址,进入公网。
数据包回来的时候路由器会用DNAT把路由器的公网地址改变局域网的地址,找到PC了。
NAT:网络地址转换
SNAT:源地址转换
DNAT:目的地址转换

DHCP(服务): 动态主机配置协议
给局域网的计算机自动配置地址(含IP,子网掩码、网关、dns)
老男孩教室没有配置IP,gw,DHCP给你分配地址.

什么是端口 ?
0)数字范围0-65535
1)数字形式表示
2)标识一台计算机上对应的服务,一台计算机上不同服务数字代号。
足疗:
22 修脚服务 SSH 远程连接服务 加密的 *****
23 足疗 telnet远程连接服务 明文的
80 搓背 http服务
443 采耳 https加密的http服务 *****
默认端口代表的服务
远程连接 22 SSH服务 加密的 安全
远程连接 23 telnet 不加密的
80 http 上网
443 https 加密上网

安全:22 3389 135 139 21 80 443
百度,京东
[root@oldboy ~]# nmap www.baidu.com -p 1-65535
Http:80 上网服务
http:443 加密访问上网
http://ddddd/php?where=1=1…

baidu 80,443过滤,安全隐患
22远程连接端口,为什么看不见,限制办公室内网访问,拨号到内网访问.

排查问题
xshell连接Linux杀手锏
前提条件:IP、网关、DNS等配置正确,并且xshell配置也是正确的前提下
1.VMnet8 重启
2.虚拟网络编辑器-还原设置-重新配置
3.确认PC能够联网,否则重启PC

排查方法:
1)ping www.baidu.com 不通,意味着DNS可能有问题或无法上网。
2)检查是否能上网 ping 203.81.19.1通,可以上网,一定DNS问题。
3)如果不能上网,ping 10.0.0.254通的,无法上网(路由器配置问题,ISP运营商(检查上述3点))

xshell配置见视频或书籍

上传下载
ping www.baidu.com
[root@oldboy ~]# yum install lrzsz -y
已安装:
lrzsz.x86_64 0:0.12.20-36.el7

传输文件:
安装lrzsz:yum install lrzsz -y
从windows上传文件到linux里:
1.直接拖动文件(lrzsz软件) #rz -E #yum install lrzsz -y
2.rz -y 回车,浏览文件上传

下载文件到windows里
sz -y 文件路径(真实存在)

rz或者拖动 #命令没有找到 yum install lrzsz -y

-E 上传有同名自动改名
-y(覆盖)

明天:
1.bash基础
2.基础命令,文件\目录
关机重启
man help
cd pwd ls tree mkdir mv rm alias unalias
vi vim touch tail head
3.目录结构

7.Linux bash命令行基础

1)Linux bash命令行

2)命令行提示符
[root@oldboy ~]#
[root @oldboy ~]#
[root :命令行提示符@前面的字符代表当前登录的用户(可用whoami查询),
[root@oldboy ~]# whoami
root

@分隔符

oldboy,@后面的为主机名(可用hostname查询),
[root@oldboy ~]# hostname
oldboy

~所在的位置是窗口当前用户所在的路径(可用pwd查询)。
[root@oldboy ~]# pwd
/root

]# 提示符,管理员的提示符,root用户提示符,root皇帝。

[root@oldboy ~]# su - oldboy
上一次登录:三 7月 14 12:47:58 CST 2021tty1 上
[oldboy@oldboy ~]$ whoami #$是普通用户。一般大臣,布衣。
oldboy

查看当前用户;
[root@oldboy ~]# whoami
root

查看当前路径:
[root@oldboy ~]# pwd
/root

~ 用户的家目录,/root,/home/oldboy

[root@oldboy ~]# hostname
oldboy

PS1环境变量控制提示符长什么样子?
PS1变量控制命令行组成:
PS1=’[\u@\h \W]$ ',

使用中记忆。。。。
比较好的提示符:
临时修改:
PS1=’[\e[32;1m][\u@\h \W]\$ [\e[0m]’

永久修改:
echo “PS1=’[\e[32;1m][\u@\h \W]\$ [\e[0m]’” >>/etc/profile
source /etc/profile

更多调整
echo “PS1=’[\e[32;1m][\u@[\e[0m][\e[33;1m]\h \W]\$ [\e[0m]’” >>/etc/profile
source /etc/profile

老男孩培训第三天
1.Linux运维\网络安全 [运营维护]

知识体系杂\逻辑性不强
1.记忆(使用中记忆),熟能生巧.
2.操作为主.
3.企业招聘,高中\专科\本科.本科10-20%.

2.开发
1.知识体系严谨,非常多,让人的所有想象成为可能.
2.逻辑思维要求很高,数学\拼算法.
3.逻辑判断…要求比较高.
4.企业招聘本科为主,专科学的要不错.高中… 本科67%.
5.天花板高.张小龙微信创始人,1个亿以上.

Linux:

1)Linux bash命令行
bash命令行解释器或者翻译官,命令行输入命令都是由bash解释执行的.

)命令行提示符
[root@oldboy ~]#

[root @oldboy ~]#
[root :命令行提示符@前面的字符代表当前登录的用户(可用whoami查询),
[root@oldboy ~]# whoami
root

@分隔符

oldboy,@后面的为主机名(可用hostname查询),

[root@oldboy ~]# hostname
oldboy

~ 所在的位置是窗口当前用户所在的路径(可用pwd查询)。
[root@oldboy ~]# pwd
/root

~ 用户的家目录 此处就是/root 皇宫

]# 提示符,等着输入命令,管理员的提示符是#,root用户提示符,root皇帝。

[root@oldboy ~]# su - oldboy #切换到oldboy用户
[oldboy@oldboy ~]$ whoami #$是普通用户的提示符。一般大臣,布衣。
oldboy

PS1环境变量控制提示符长什么样子?
PS1变量控制命令行组成:
PS1=’[\u@\h \W]$ ',

使用中记忆。。。。
比较好的提示符:
echo “PS1=’[\e[32;1m][\u@\h \W]\$ [\e[0m]’” >>/etc/profile
source /etc/profile

echo “PS1=’[\e[32;1m][\u@[\e[0m][\e[33;1m]\h \W]\$ [\e[0m]’” >>/etc/profile
source /etc/profile

学习命令:

1.查看当前用户;
[root@oldboy ~]# whoami
root

2.查看当前路径:
[root@oldboy ~]# pwd
/root

3.查看主机名
[root@oldboy ~]# hostname
oldboy

4.~ 用户的家目录,root的家目录/root,oldboy家目录是/home/oldboy

5.切换用户 su
su - 用户名
[root@oldboy ~]# su - oldboy #切换到oldboy用户
[oldboy@oldboy ~]$ whoami #$是普通用户的提示符。一般大臣,布衣。
oldboy

网络配置命令:

1.图形化配置网卡
nmtui

2.配置网卡完成:
systemctl restart network #重启所有网卡

#默认是ens33(内核参数 net.ifnames=0 biosdevname=0),百度 如何ens33改成eth0
ifup eth1 #只启动网卡1(eth1) ,网卡0,eth0
ifdown eth1 #只关闭网卡1

查看IP
ip a
ifconfig ##==>(yum install net-tools -y)
ifconfig eth0

查看网关路由 上网的出口地址.
[root@oldboy ~]# ip route
default via 10.0.0.2 dev eth0 proto static metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.7 metric 100
[root@oldboy ~]# route -n ##==>(yum install net-tools -y)
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

查看DNS
[root@oldboy ~]# cat /etc/resolv.conf

Generated by NetworkManager

nameserver 223.5.5.5 ##配置网卡的时候配置的

nmtui配置,执行下面命令检查配置
[root@oldboy ~]# systemctl restart network
[root@oldboy ~]# cat /etc/resolv.conf

Generated by NetworkManager

nameserver 223.5.5.5
nameserver 223.6.6.6

修改网卡配置文件:nmtui背后就是改这个ifcfg-eth0.
[root@oldboy ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

快捷键(提高效率):

使用中记忆。——老男孩

tab 自动补全功能*****
不管多长的命令,先输入2个字母,然后连续2下tab键,不断循环。
补全路径
作用:
1.提前确认输入对错(tab没反应就有问题).
2.提高输入效率,不用记完整命令.

ctrl+a 开头
ctrl+e 结尾

ctrl+u 删除光标前内容
ctrl+k 删除光标后内容

ctrl+l 清屏(clear)

ctrl+c 终止当前操作
ctrl+d 退出当前会话(logout),连续操作关闭xshell。

ctrl+方向键 #按单词移动

esc+. #调出上一个命令最后一个【空格】后面的部分

Ctrl+Insert 复制命令行内容*

Shift+Insert 粘贴命令行内容*

xshell调整选中即复制,右键即粘贴

xshell远程连接linux慢:
sed -i.bak ‘21i UseDNS no\nGSSAPIAuthentication no’ /etc/ssh/sshd_config
systemctl restart sshd

4.Linux bash 命令行语法

1.中括号可选。
命令 [选项] [路径/文件/目录]
ls -ld /etc/hosts

打疫苗 轻/重 胳膊/屁股
1针 2针
小护士打
老护士打

ls list 列表 #查看当前目录下的内容

查看指定目录下的内容:
[root@oldboy ~]# ls /opt
[root@oldboy ~]# ls /root/

查看文件属性:-l
ls -l /root
人和人的属性(身高、体重、性别、年龄)
文件和文件属性(大小、权限、日期、用户和组)

查看隐藏文件:-a
[root@oldboy ~]# ls -a
. anaconda-ks.cfg .bash_logout .bashrc .pki Snap1.jpg
… .bash_history .bash_profile .cshrc shell练习题.rar .tcshrc
什么是隐藏文件?以.开头的文件

cd change directory 切换路径
[root@oldboy /etc]# cd /tmp/
[root@oldboy /tmp]# pwd
/tmp

~ 用户的家目录

  • 上一次所在目录
    . 表示当前目录
    … 表示上一级目录
    …/…表示上一级的上一级目录

[root@oldboy network-scripts]# cd …/
[root@oldboy sysconfig]# pwd
/etc/sysconfig
[root@oldboy sysconfig]# cd …/…/
[root@oldboy /]# pwd
/

pwd print work directory 显示当前用户所在的路径
[root@oldboy ~]# pwd
/root
[root@oldboy ~]#
[root@oldboy ~]#
[root@oldboy ~]# cd /etc/sysconfig/network-scripts/
[root@oldboy network-scripts]# pwd
/etc/sysconfig/network-scripts

mkdir make directory 创建目录 文件夹

mkdir oldboy
ls
mkdir dir{1…100} #创dir1–dir100
rm -fr dir* #容易丢数据
mkdir oldboy oldgir #创建多个文件

递归创建目录:-p #
[root@oldboy ~]# mkdir -p /oldboy/abc/ls/dddd
[root@oldboy ~]# tree /oldboy/
/oldboy/
└── abc
└── ls
└── dddd

3 directories, 0 files

tree以树形结构显示文件和目录
如果找不到需要安装(yum install tree -y)
显示层数: -L 数字 #-L 1 显示一层目录

[root@oldboy ~]# tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── oldboy
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

touch 创建文件

[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt b.txt c.txt
touch oldboy{1…10}

重复创建不会覆盖,更改文件时间戳.(修改时间\访问时间\改变时间)
[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt

cp #copy 复制文件或目录

cp 源 目的

[root@oldboy ~]# cp a.txt /tmp/
[root@oldboy ~]# cp a.txt oldboy.log

复制目录:-r或-a(还可以保持属性)
[root@oldboy ~]# mkdir oldboy
[root@oldboy ~]# cp oldboy /tmp/
cp: 略过目录"oldboy"
[root@oldboy ~]# cp -r oldboy /tmp/
[root@oldboy ~]# ls /tmp/
a.txt oldboy

mv #move 移动文件或目录,剪切

mv 源 目的
[root@oldboy ~]# mv a.txt oldgirl.log
[root@oldboy ~]# ls
anaconda-ks.cfg b.txt c.txt oldboy oldboy.log oldgirl.log

[root@oldboy ~]# mv oldboy /opt/
[root@oldboy ~]# ls
anaconda-ks.cfg b.txt c.txt oldboy.log oldgirl.log shell练习题.rar Snap1.jpg
[root@oldboy ~]# ls /opt
oldboy

rm #rmdir 删除文件或目录,默认只能删除文件
-f 强制删除
-r 删除目录

[root@oldboy ~]# rm b.txt
rm:是否删除普通空文件 “b.txt”?y

强制删除文件
[root@oldboy ~]# rm -f c.txt
[root@oldboy ~]# rm -f oldboy.log oldgirl.log anaconda-ks.cfg Snap1.jpg
强制删除目录
[root@oldboy ~]# rm -fr oldboy

别名 alias
[root@oldboy ~]# alias net=‘cat /etc/sysconfig/network-scripts/ifcfg-eth0’ #临时
[root@oldboy ~]# net
[root@oldboy ~]# unalias net

永久操作把下面命令放入/etc/profile,source /etc/profile
alias net='cat /etc/sysconfig/network-scripts/ifcfg-eth0

文件相关命令:
touch 创建文件

[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt b.txt c.txt
touch oldboy{1…10}

重复创建不会覆盖,更改文件时间戳.(修改时间\访问时间\改变时间)
[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch a.txt

cat 查看文件内容
-n 显示行号
[root@oldboy ~]# cat /etc/hostname
oldboy
[root@oldboy ~]# cat -n /etc/passwd
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
4 adm❌3:4:adm:/var/adm:/sbin/nologin
5 lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync❌5:0:sync:/sbin:/bin/sync

head 查看文件的前10行
[root@oldboy ~]# head /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin

查看前N行,N是数字
-n 5 #数字

head -5 /etc/passwd

[root@oldboy ~]# head -5 /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin

tail 查看文件的最后10行
查看后N行,N是数字

[root@oldboy ~]# tail /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

查看最后5行
-n 5 #数字
[root@oldboy ~]# tail -5 /etc/passwd
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

-f #跟踪日志文件尾部变化

echo 打印字符输出
[root@oldboy ~]# echo oldboy
oldboy
[root@oldboy ~]# echo oldgirl
oldgirl
[root@oldboy ~]# echo {1…10}
1 2 3 4 5 6 7 8 9 10
[root@oldboy ~]# echo {a…z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

[root@oldboy ~]# echo {a…z} >a.txt #把输出写入到文件,清理源文件内容,放入写入的内容
[root@oldboy ~]# cat a.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z

知识点:
{a…z} a到z,中间是空格
{1…10} 1到10,中间是空格

seq 打印数字序列
[root@oldboy ~]# seq 5
1
2
3
4
5
[root@oldboy ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@oldboy ~]# seq 3
1
2
3
[root@oldboy ~]# seq 3 6
3
4
5
6
[root@oldboy ~]# seq 1 2 10 #打印奇数
1
3
5
7
9
[root@oldboy ~]# seq 2 2 10 #打印偶数
2
4
6
8
10
[root@oldboy ~]# echo {1…10}
1 2 3 4 5 6 7 8 9 10
[root@oldboy ~]# seq -s " " 10
1 2 3 4 5 6 7 8 9 10

老男孩培训第四天
more less 浏览文件内容,分页浏览
回车 一点点向下浏览
空格 一屏一屏向下浏览
/mysql 向下搜索含有mysql字符串的内容,按n连续向下搜索.按N向上搜索
?mysql 向上搜索,按n连续向上搜索.按N向下搜索

grep 过滤文件内容(三剑客命令之一) 前五的命令 #

例1:过滤包含mysql字符串的所有行
[root@oldboy ~]# grep mysql /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL

#规范操作是把过滤的内容加双引号
[root@oldboy ~]# grep “mysql” /etc/services

把过滤出的内容装到袋子里(oldboy.txt)
[root@oldboy ~]# grep mysql /etc/services >oldboy.txt
[root@oldboy ~]# cat oldboy.txt

例2:排除含有tcp字符串的行
[root@oldboy ~]# grep -v tcp oldboy.txt
mysql 3306/udp # MySQL
mysql-cluster 1186/udp # MySQL Cluster Manager
mysql-cm-agent 1862/udp # MySQL Cluster Manager Agent
mysql-im 2273/udp # MySQL Instance Manager
mysql-proxy 6446/udp # MySQL Proxy

例3:追加内容到oldboy.txt结尾
[root@oldboy ~]# echo oldboy >>oldboy.txt
[root@oldboy ~]# echo OLDBOY >>oldboy.txt
[root@oldboy ~]#
[root@oldboy ~]# cat oldboy.txt
mysql-proxy 6446/udp # MySQL Proxy
oldboy
OLDBOY

例4:不区分大小写过滤含有oldboy字符串的行
[root@oldboy ~]# grep -i oldboy oldboy.txt
oldboy
OLDBOY

[root@oldboy ~]# grep oldboy oldboy.txt
oldboy

Linux命令行严格区分大小写
[root@oldboy ~]# LS
-bash: LS: 未找到命令

例4:对过滤的内容显示在源文件中的行号
[root@oldboy ~]# grep -n “http” /etc/services
14:# http://www.iana.org/assignments/port-numbers

文件内容相关命令:

1)介绍vi和vim
vi 相当于win下记事本,默认是有的。
vim 相当于win下notepad++,typora(MD),默认没有需要安装。

推荐: linux vim
win下notepad++,typora(MD)

2)安装vim工具
[root@oldboy ~]# rpm -qa vim-enhanced
vim-enhanced-7.4.629-8.el7_9.x86_64

如果没有:
yum install vim-enhanced -y

3)VIM三种模式模式*****
见图:视频里

切入命令模式使用冒号的时候:
:
w 保存 write
u 撤销 undo 保存之前
q 退出 quit
! 强制

例1:
vim oldgirl,增加内容.
I am 28.

vim 快捷键:
光标移动:
普通模式:
行尾 $或end
行首 0或Home
文件尾行 G
文件开头行 gg
当前光标向下移动5行 5gg 数字[回车]
复制 yy
复制多行 nyy n是数字
粘贴 p
删除 dd
删除多行 ndd n是数字
回滚 u
:set nu 显示行号
:set nonu 取消行号

搜索和替换
/内容 初始向下搜索,此时按n继续搜索,N反向继续搜索。
?内容 初始向上搜索,此时按n继续搜索,N反向继续搜索。

:%s/A/B/g,把A替换成B,如果A或B中有斜线,把分割的斜线换#或@
   s为替换,g全局替换
:n1,n2s/A/B/g	n1、n2为数字,在第n1行和n2行间寻找A,用B替换

例子:全局替换,整个文件替换将nologin替换为oldboy
:%s/nologin/oldboy/g

例2:替换1-5行,将oldboy替换为nologin
 1,5s/oldby/nologin/g

练习:
[root@oldboy ~]# cat /etc/passwd >oldboy.txt
[root@oldboy ~]# vim oldboy.txt
例1:将nologin替换为oldboy
:%s/nologin/oldboy/g

例2:将1-5行的nologin替换为oldgirl
1,5s/nologin/oldgirl/g

#///为分隔符,可以用### @@@替代

进入编辑模式的光标位置不同的命令
i 在当前光标所在处插入文字
I 在当前所在行的行首第一个非空格符处开始插入文字,和A相反
A 在当前所在行的行尾最后一个字符处开始插入文字,和I相反
O 在当前所在行的上一行处插入新的一行
o 在当前所在行的下一行处插入新的一行

==================================
目录结构知识
win:目录顶点或者入口盘符:C/D/E
Linux:目录顶点或者入口:/,称为根。所有的目录都在根下面。

Linux系统目录结构具有以下基本特点:
1.一切从"根"开始,"/"是所有目录的起点(顶点)。
2.Linux根下面的目录是一个有层次的树状结构。
3.酷似一棵倒挂着的树。
[root@oldboy ~]# tree -L 1 /
/
├── bin -> usr/bin
├── boot
ddd
ddd
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── oldboy
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

路径分隔符区别:
Windows的目录形式为c:\windows\,路径分隔符是“\”(撬棍,反斜线),d、e等盘的目录结构与之类似。
Linux的目录形式为/etc/hosts,路径分割符为"/" (斜线)

目录层次标准:
http://www.pathname.com/fhs/

root@oldboy oldboy]# tree -L 1 /
/
├── bin -> usr/bin #/bin等同/usr/bin #普通用户二进制命令目录,ls,cp,cat,rm。
├── sbin -> usr/sbin #/sbin/等同/usr/sbin #root管理员使用的二进制命令目录(破坏程度更大,fdisk,mkfs分区格式化)
├── boot #内核程序及引导程序所在的目录,100M
├── dev #设备目录(光驱 磁盘)
├── etc***** #系统基础服务核心配置文件所在的目录(yum rpm安装的软件)****
├── home #普通用户的家目录(三间茅草房) /home/oldboy,~
├── root #管理员的家目录(皇宫)
├── lib -> usr/lib #库文件所在目录,系统调用(内核提供接口给应用程序使用)
├── lib64 -> usr/lib64 #库文件所在目录
├── media #媒体 光驱等挂载点。
├── mnt #临时的挂载点(u)
├── opt #第三方程序目录
├── proc***** #虚拟的文件系统,内核、进程等配置和运行信息的目录。汽车仪表盘。
汽车仪表盘:车况\油耗\跑了公里数\速度
├── sys #虚拟的文件系统
├── tmp #临时目录,所有用户都可以进入这里做各种操作(黑客跳板目录),监控目录。
1)堵上漏洞。2)防止放木马文件。3)防止修改关键文件(suid vim)。 4)提权到root(/etc/sudoers),为所欲为。
├── usr #c:/program file 应用程序所在目录,编译方式安装软件默认是这个目录/usr/local
└── var #变化的目录,日志文件、缓存等文件存放的目录。

/var/log/messages   系统日志文件
/var/log/secure     登录日志  ssh 远程连接安全 很重要
/var/log/lastlog    有哪些用户登录lastlog

和磁盘相关的知识:
挂载 :给硬盘安个门
挂载点:门(目录 /mnt)

mount /dev/cdrom /mnt 临时挂载:

[root@oldboy ~]# ls /dev/cdrom
/dev/cdrom

[root@oldboy ~]# cd /dev/cdrom
-bash: cd: /dev/cdrom: 不是目录

[root@oldboy ~]# mount /dev/cdrom /mnt #给磁盘/dev/cdrom开一个门,门是/mnt目录,/mnt就是挂载点
mount: /dev/sr0 写保护,将以只读方式挂载

[root@oldboy ~]# ls /mnt/
CentOS_BuildTag LiveOS/
.discinfo Packages/
EFI/ repodata/
EULA RPM-GPG-KEY-CentOS-7
GPL RPM-GPG-KEY-CentOS-Testing-7
images/ TRANS.TBL
isolinux/ .treeinfo
[root@oldboy ~]# ls /mnt/Packages/

相对路径和绝对路径区别:

绝对路径:
银河系-太阳系-地球—亚洲—中国—北京—昌平沙河百沙路-老男孩教育网络安全8期 教室7,第三排第一个位置

从根开始的,必须 /目录
ls /etc/hosts

相对路径:
老男孩教育网络安全8期 教室7,第三排第一个位置

root@oldboy 老男孩教育#
cd Linux77期
[root@oldboy ~]# mkdir oldboy -p
[root@oldboy ~]# cd oldboy #相对路径 相对当前用户所在的路径为前提。
[root@oldboy oldboy]# cd …/ #相对路径

[root@oldboy ~]# cd /root/oldboy #绝对路径,和当前路径 没有关系。

###oldboy在哪??? 没人知道在哪
mkdir oldboy
规范:
[root@oldboy ~]# mkdir oldboy #在~,/root下。

#绝对路径可以不带提示符。
mkdir /oldboy

[root@oldboy mnt]# cd ~
[root@oldboy ~]# mkdir oldgirl -p
[root@oldboy ~]# pwd
/root
[root@oldboy ~]# ls -ld /root/oldgirl/
drwxr-xr-x. 2 root root 6 7月 26 10:50 /root/oldgirl/
[root@oldboy ~]# ls
a.txt oldboy1.txt oldboy.log oldboy.txt oldgirl shell练习题.rar

区别:
[root@oldboy ~]#cd /oldboy
[root@oldboy ~]# oldboy #相对路径

核心重要文件:
老男孩linux目录结构
1.bin -> usr/bin #/bin等同/usr/bin #普通用户二进制命令目录。
2.sbin -> usr/sbin #/sbin/等同/usr/sbin #root管理员使用的二进制命令目录
3.boot #内核程序及引导程序所在的目录,100M
4.dev #设备目录(光驱 磁盘)
/dev/hd[a-t]IDE设备
/dev/sd[a-z] SCSI设备
/dev/cdrom 光驱
/dev/null #无限数据接收设备,相当于黑洞
/dev/zero #无限零资源,要多少有多少
5.etc #系统基础服务配置文件所在的目录(yum rpm安装的软件)
1./etc/sysconfig/network-scripts/ifcfg-eth1:网卡配置文件,第二块ifcfg-eth0
2./etc/resolv.conf:Linux系统过时的DNS客户端配置文件
3./etc/hostname:主机名配置文件
4./etc/hosts:系统本地的域名解析文件(局域网;域名和IP解析文件)
5./etc/fstab:配置开机设备自动挂载的文件
6./etc/rc.local:存放开机自启动程序命令的文件
7./etc/issue 软件bug,和特定版本有关。
8./etc/motd:配置用户登录系统之后显示提示内容的文件
9./etc/redhat-release:声明Red Hat版本号和名称信息的文件
10./etc/sysctl.conf:Linux内核参数设置文件(系统优化)*****
11./etc/profile、/etc/bashrc ,.bashrc,.bash_profile配置系统的环境变量/别名等的文件※※※
6.home #普通用户的家目录(三间茅草房)
7.root #管理员的家目录(皇宫)
8.lib -> usr/lib #库文件所在目录
9.lib64 -> usr/lib64 #库文件所在目录
10.media #媒体 光驱等挂载点
11.mnt #临时的挂载点(u)
12.opt #第三方程序目录
13.proc #虚拟的文件系统,内核和进程信息的目录。汽车仪表盘。汽车仪表盘:车况 油耗 跑了公里数 速度
/proc/cpuinfo 当前cpu信息文件
/proc/meminfo 当前内存信息文件
/proc/loadavg 当前系统的平均负载文件
/proc/mounts 当前设备挂载列表信息文件
/proc/interrupts 当前系统中断信息文件
15.tmp #临时目录,所有用户都可以进入这里做各种操作(黑客跳板目录),监控目录。
16.usr #c:/program file 应用程序所在目录
1./usr/local/:编译安装软件默认的位置路径,c:\Program files。
2./usr/src:源代码目录
17.var #数据变化的目录,日志文件存放目录。
/var/log/messages #linux系统日志文件,系统故障可以去看看。
/var/log/secure #安全日志(ssh日志记录到这里),监控日志。
/var/log/dmesg #记录硬件信息加载情况的日志文件(dmesg)
/var/log/lastlog 有哪些用户登录lastlog

Linux核心字符:

  • 表示所有
    [root@oldboy ~]# ls
    a.txt oldboy1.txt oldboy.log oldboy.txt oldgirl shell练习题.rar
    [root@oldboy ~]# rm -fr *
    [root@oldboy ~]# ls
    ~ 家目录
    . 当前目录
    … 上一级目录
    | 管道()
    ####
    cat /etc/passwd|grep nologin|grep message
    dbus❌81:81:System message bus:/:/sbin/nologin

    [root@oldboy ~]# grep 3306 /etc/services
    mysql 3306/tcp # MySQL
    mysql 3306/udp # MySQL
    [root@oldboy ~]# grep 3306 /etc/services |grep tcp
    mysql 3306/tcp # MySQL

    [root@oldboy ~]# ifconfig
    eth0: flags=4163 mtu 1500
    inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255
    inet6 fe80::761:9b8a:dcd8:e720 prefixlen 64 scopeid 0x20
    ether 00:0c:29:3d:b9:8d txqueuelen 1000 (Ethernet)
    RX packets 64772 bytes 8020753 (7.6 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 54168 bytes 34619331 (33.0 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    [root@oldboy ~]# ifconfig|grep 10.0.0.7
    inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255

    例1:输出ip a 结果中含有inet的行,并且从中过滤10.0.0的行.
    例2:找出/etc/passwd中含有bash的行,并且从中过滤出root所在行.

重定向:

或1>标准输出重定向 清空已有文件内容,加入新的内容
[root@oldboy ~]# echo 123 >a.txt
[root@oldboy ~]# cat a.txt
123
[root@oldboy ~]# echo 456 >a.txt
[root@oldboy ~]# cat a.txt
456

[root@oldboy ~]# grep mysql /etc/services >oldboy.txt
	/etc/services苹果树
	mysql 苹果
	>  筐里的东西清空
	oldboy.txt装到筐里

1>>标准输出追加重定向 只加入新的内容到文件结尾
[root@oldboy ~]# echo 123 >>a.txt
[root@oldboy ~]# echo 123 >>a.txt
[root@oldboy ~]# echo 123 >>a.txt
[root@oldboy ~]# cat a.txt
456
123
123
123

2>错误输出重定向

执行正确命令输出进入a.txt
[root@oldboy ~]# echo oldboy >a.txt 2>b.txt
[root@oldboy ~]# cat a.txt
oldboy
[root@oldboy ~]# cat b.txt

执行错误命令输出进入b.txt
[root@oldboy ~]# cho oldboy >a.txt 2>b.txt
[root@oldboy ~]#
[root@oldboy ~]# cat a.txt
[root@oldboy ~]# cat b.txt
-bash: cho: 未找到命令

&>>c.txt 或>>c.txt 2>&1 #正确的和错误的都放到c.txt

[root@oldboy ~]# cho oldboy &>>c.txt
[root@oldboy ~]# cat c.txt
-bash: cho: 未找到命令

[root@oldboy ~]# echo oldboy &>>c.txt
[root@oldboy ~]# cat c.txt
-bash: cho: 未找到命令
oldboy

/dev/null 黑洞设备
[root@oldboy ~]# cat c.txt &>/dev/null
/dev/zero 零设备,源源不断的产生东西

<或0<输入重定向
<<或0<<追加输入重定向

批量插入多行文本
cat >/oldboy.txt< 10.0.0.7
10.0.0.8
10.0.0.9
EOF

[root@oldboy ~]# cat >/oldboy.txt<

10.0.0.7
10.0.0.8
10.0.0.9
EOF
[root@oldboy ~]#
[root@oldboy ~]# cat /oldboy.txt
10.0.0.7
10.0.0.8
10.0.0.9

xargs 分组
[root@oldboy ~]# echo {a…z} >a.txt
[root@oldboy ~]# cat a.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboy ~]# xargs -n 3 a.txt #无法使用
^C
[root@oldboy ~]# xargs -n 3 a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z

时间:
date

[root@oldboy ~]# date -s “2100/07/26 23:00:01”
2100年 07月 26日 星期一 23:00:01 CST

[root@oldboy ~]# date +%F
2100-07-26
[root@oldboy ~]# date +%Y
2100
[root@oldboy ~]# date +%m
07
[root@oldboy ~]# date +%d
26
[root@oldboy ~]# date +%w
1
[root@oldboy ~]# date +%H
23
[root@oldboy ~]# date +%M
01
[root@oldboy ~]# date +%S
30
[root@oldboy ~]# date +%Y-%m-%d\ %H:%m:%S
2100-07-26 23:07:49

过去和未来
[root@oldboy ~]# date +%F -d ‘-3day’
2100-07-23

[root@oldboy ~]# date +%F -d ‘+3day’
2100-07-29

[root@oldboy ~]# date +%F -d ‘-100year’
2000-07-26

[root@oldboy ~]# date +%F -d ‘+100year’
2200-07-26

服务器时间和互联网时间同步:
ntpdata ntp2.aliyun.com

打包压缩

tar:打包压缩
1)打包组合:
zcvf
z压缩
c创建
v显示输出
f文件打包
tar 组合选项 存放压缩包的路径/压缩包的名字.tar.gz 要打包的文件

tar zcvf   /tmp/etc.tar.gz   /etc

2)解压组合
zxvf
x解压
[root@oldboy ~]# cd /tmp/
[root@oldboy tmp]# ls
a.txt oldboy vmware-root_968-2965448017
etc.tar.gz vmware-root_1066-2991203017 yum.log
ks-script-SYMiYO vmware-root_939-4022308693
[root@oldboy tmp]# tar zxvf etc.tar.gz #解压到当前路径

3)指定路径解压
[root@oldboy tmp]# tar zxvf etc.tar.gz -C /opt/
[root@oldboy tmp]# ls /opt/
etc oldboy

打包压缩:gzip,unzip,zip

组合打包:tar+date 用作备份
[root@oldboy tmp]# tar zcvf /tmp/etc_$(date +%F).tar.gz /etc
[root@oldboy tmp]# ls
etc_2100-07-26.tar.gz

$(date +%F) ##路径加,会解析为日期作为包名

下节内容:
day5-6
三剑客+正则
文件类型
用户和组
文件权限
磁盘知识
day7-8
网络知识
进程知识
定时任务
day9-10
搭建web服务
LNMP 搭建博客和知乎产品
了解网站访问的流程
数据库
day11-12
Shell编程

老男孩培训第五天
查找命令:
1)which 查看[二进制命令]所在路径(从PATH环境变量路径里查找)
[root@oldboy ~]# which cp
/usr/bin/cp

特殊注意:
[root@oldboy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
1)分隔符为冒号:
2)路径都是命令。
[root@oldboy ~]# which oldboy
/usr/bin/which: no oldboy in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin)

2)whereis 查看文件及文件的帮助等的路径
-b 查看二进制命令所在路径 which
[root@oldboy ~]# whereis -b cp
cp: /usr/bin/cp
[root@oldboy ~]# whereis cp
cp: /usr/bin/cp /usr/share/man/man1/cp.1.gz

3)locate 查找文件及相关内容(内置数据库,通过updatedb)(不需要了解)
yum install mlocate -y
updatedb ##更新数据库
locate cp

4)find 查找 *****
遍历查找,从根开始从磁盘上查找文件,效率很低.功能强大

语法:
find 查找路径 选项1 【参数1】 选项2 【参数2】…

按名字查找:点名
-name 按名字查找

(1)按名字查找:
[root@oldboy ~]# find / -name “hosts”
/etc/hosts
/tmp/etc/hosts
/opt/etc/hosts

按名字模糊查找 表示所有
[root@oldboy ~]# find /etc/ -name "h
ts"
/etc/hosts
[root@oldboy ~]# find /etc/ -name “*.conf”
/etc/resolv.conf
/etc/pki/ca-trust/ca-legacy.conf
/etc/yum/pluginconf.d/fastestmirror.conf
/etc/yum/pluginconf.d/langpacks.conf
/etc/yum/protected.d/systemd.conf

(2)按类型查找
-type
f d l c b s
去哪看? man find 搜/-type
-type c
File is of type c:
b block (buffered) special 块设备 硬盘光驱
c character (unbuffered) special 字符设备
d directory 查找目录
f regular file 查找文件
l symbolic link; 软连接 快捷方式
s socket 和应用程序之间通信有关

.avi
.mp4
.jpg
.png
.txt

[root@oldboy ~]# find / -name “hosts”
/etc/hosts
/tmp/etc/hosts
/opt/etc/hosts

查找文件,并且名字为hosts
[root@oldboy ~]# find / -type f -name “hosts”
/etc/hosts
/tmp/etc/hosts
/opt/etc/hosts

查找目录,并且名字为hosts
[root@oldboy ~]# find / -type d -name “hosts”
[root@oldboy ~]# mkdir hosts
[root@oldboy ~]# find / -type d -name “hosts”
/root/hosts

http://192.168.15.253/day04.txt

============
组合查找:find 默认就是取交集(-a)and,并集(-o)or
找女朋友:【高点】 [身材好点] [有钱] 该有的要有,同时满足:交集 默认就是取交集

找男朋友:高的,帅的,有钱的
热爱运动,特长多,热爱生活,渴望爱情,追求精神层次,经济基础,
有菜花(写诗、乐器),这样的男生,有没有女生喜欢?

例:查文件类型为文件,并且名字为hosts
find / -name “hosts” -a -type f

[root@oldboy ~]# find / -type f -a -name “hosts”
/etc/hosts
/tmp/etc/hosts
/opt/etc/hosts
[root@oldboy ~]# find / -type f -name “hosts”
/etc/hosts
/tmp/etc/hosts
/opt/etc/hosts

并集:查找名为hosts,或者类型为d,并且为oldboy
find / -name “hosts” -o -type d -name “oldboy”
/etc/hosts
/root/hosts
/tmp/oldboy
/tmp/etc/hosts
/home/oldboy
/opt/oldboy
/opt/etc/hosts
/oldboy

取反:!查找名字不是file1
[root@oldboy ~]# mkdir /data -p
[root@oldboy ~]# touch /data/file{1…3}
[root@oldboy ~]# find /data -name “file1”
/data/file1
[root@oldboy ~]# find /data ! -name “file1”
/data
/data/file2
/data/file3

(3)按大小查找

-size +1M #大于1M
-size 1M #1M
-size -1M #小于1M
其他单位k G

测试1
[root@oldboy ~]# find /etc -size -1M
/etc/crypttab
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
/etc/issue

[root@oldboy ~]# find /etc -size +1M
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/udev/hwdb.bin

(4)-mtime modify按修改时间查找*****
-atime 按【访问 access】时间查找 很少用
-ctime 按【改变change】时间查找 很少用

-mtime +7 #7天以前的
-mtime 7 #第7天
-mtime -7 #最近7天

测试:复制即可。模拟每天创建一个文件,连续30天
mkdir /data -p
for n in {01…30};do date -s "2021/08/ n " ; t o u c h / d a t a / f i l e n";touch /data/file n";touch/data/filen;done

[root@oldboy ~]# find /data -type f -name “file*” -mtime +7
/data/file19
/data/file20
/data/file21
/data/file22

[root@oldboy ~]# date
2021年 08月 30日 星期一 00:01:13 CST

[root@oldboy ~]# find /data -type f -name “file*” -mtime 7
/data/file23
[root@oldboy ~]# find /data -type f -name “file*” -mtime -7
/data/file1
/data/file2

不重要的
-perm 按权限
[root@oldboy data]# mkdir oldboydir
[root@oldboy data]# find /data -perm 755
/data
/data/oldboydir
-user 按用户
[root@oldboy data]# chown oldboy oldboydir
[root@oldboy data]# find /data -user oldboy
/data/oldboydir
要想成功,永远比别人多做一点点,早做一点点,做好一点点。————老男孩

【对找到的东西进行处理】
方法1:
-exec 执行动作

find /data -name “file*” -mtime +7 -exec rm -f {} ;

原理:效率低
rm -f /data/file01
rm -f /data/file02
rm -f /data/file03

方法2:xargs
-n 分组
[root@oldboy data]# seq 10 >oldboy.txt
[root@oldboy data]# xargs -n 3 1 2 3
4 5 6
7 8 9
10

提高门槛删东西:
-i 可以让后面的{}接收搜索到的内容。
find /data -name “file*” -mtime +7|xargs rm -f #简写

find /data -name “file*” -mtime -7|xargs -i rm -f {} #完整写法
原理:
rm -f file01 file02 …file30 ##一条命令
效率更高
[root@oldboy ~]# find /data -name “file*” -mtime -7|xargs rm -f
[root@oldboy ~]# ls /data
file23

先查找,看看是否是想删的,在执行删除
[root@oldboy ~]# find /data -name “file*” -mtime -7
/data/file1
/data/file2
/data/file3
/data/file24
/data/file25
/data/file26
/data/file27
/data/file28
/data/file29
/data/file30
[root@oldboy ~]# find /data -name “file*” -mtime -7|xargs rm -f
[root@oldboy ~]# ls /data
file23

误区:
find /data -name “file*” -mtime -7|rm -f ##错误的

find /data -name “file*” -mtime -7
|
rm -f

[root@oldboy data]# find /data -name “file*” -mtime +7|xargs -i rm -f {}

查找/data大于20K,修改时间为7天以内的文件,复制到/opt。

复制:
cp 源 目标
cp -t 目标 源

解答:
[root@oldboy ~]# find /data -size +20k -mtime -7
[root@oldboy ~]# cp /bin/ls /bin/cat /data
[root@oldboy ~]# find /data -size +20k -mtime -7
/data/ls
/data/cat
[root@oldboy ~]# find /data -size +20k -mtime -7|xargs cp -t /opt
[root@oldboy ~]# find /data -size +20k -mtime -7|xargs -i cp {} /tmp

mv 源 目标
mv -t 目标 源

题:查找/data大于20K,修改时间为7天以内的文件,移动到/opt。

(2)按类型查找
-type
f d l c b s
去哪看? man find 搜/-type
-type c
File is of type c:
b block (buffered) special 块设备 硬盘光驱
c character (unbuffered) special 字符设备
d directory 查找目录
f regular file 查找文件
l symbolic link; 软连接 快捷方式
s socket 和应用程序之间通信有关

.avi
.mp4
.jpg
.png
.txt

[root@oldboy ~]# ls -l
总用量 16
-rw-r–r--. 1 root root 52 7月 27 2100 a.txt
-rw-r–r--. 1 root root 28 7月 26 11:46 b.txt
-rw-r–r--. 1 root root 35 7月 26 11:49 c.txt
drwxr-xr-x. 2 root root 6 7月 27 2100 hosts

  • rw-r–r--. 1 root root 21 8月 30 00:14 oldboy.txt
    类型 权限 硬链接 用户 组 大小 月 日 时间 文件名

第一列:
-rw-r–r--.
第一个字符 就是文件类型

  • 普通文件
    b block (buffered) special 块设备 硬盘光驱
    c character (unbuffered) special 字符设备
    d directory 查找目录
    l symbolic link; 软连接 快捷方式
    s socket 和应用程序之间通信有关

.avi
.mp4
.jpg
.png
.txt
统一是普通文件,一切皆文件

rw-r–r-- 文件权限

. 和selinux相关的东西

第二列:硬链接数

Linux用户管理
人 名字 身份证
linux root 0(UID)

人是有组织,家庭,学校,班级

身份标识 每个用户都有一个UID,唯一标识
组标识 GID 唯一标识

=用户介绍(user)=
Linux里都有哪些用户?作用?

1)超级用户root
系统管理员,掌握系统最高权限,皇帝一样。家目录/root

用户名是root,UID为0.

UID为0的用户就是root。

登录安全:企业级应用。
a.配置ssh,禁用root通过SSH远程登录,权限非常大,所有人都知道。
使用普通用户登录,然后切换到root

b.平时使用普通用户登录,有必要的话在登录root。

2)普通用户
UID为C6 500-60000,C7 1000-60000
普通的权限:写的权限范围 家目录/home/用户名,/tmp。
老百姓,过着平常的日子。
由管理员用户创建的。
日常登录应该首先登录普通用户。
登录shell,/bin/bash

普通用户如何管理系统?
a.oldboy切换root,su - root #角色改变,由普通用户变成了root。
农民起义,当皇帝。

b.oldboy不切换到root,可以使用root的权限去做事,按命令给权限,sudo useradd oldboy
赋予普通用户一部分权限。*****

3)虚拟用户(傀儡用户)
多数情况装系统就存在的,且不能登录的。
UID 1-499
登录shell,/sbin/nologin
存在还不能登录?
linux文件、进程这样的东西如果要存在,必须要有对应的用户和组。
类似人出生,一定有父母的。家庭(组1),老男孩教育(组2)

文件创建时就要有对应的用户和组。
进程启动时就要有对应的用户和组。

虚拟用户存在的目的就是满足进程启动时对用户和组的要求。
用普通用户行不行?行,权限大了.

最小化原则:
1.安装软件最小化
2.登录安全最小化(普通用户)
3.进程启动权限最小化。
4.文件目录权限最小化

=用户组介绍(group)=
唯一标识:GID Group Identify
组名:oldboy

用户的用户组 类似于【人】的家庭,学校等组织
1个用户可以在多个组里。
1个组可以有多个用户。

用户组怎么产生的?
1)创建用户的时候默认产生的,创建一个oldboy,默认情况就会生成oldboy组,
用户和组同名,且UID和GID相同

[root@oldboy ~]# useradd oldgirl #添加用户
[root@oldboy ~]# tail -1 /etc/passwd #存放用户的文件
oldgirl❌1001:1001::/home/oldgirl:/bin/bash

[root@oldboy ~]# tail -1 /etc/group #存放用户组的文件
oldgirl❌1001: #创建oldgirl用户的时候,同时创建oldgirl用户组

2)由root用户直接创建用户组。
[root@oldboy ~]# groupadd tech
[root@oldboy ~]# tail -1 /etc/group
tech❌1002:

[root@oldboy ~]# useradd littleboy -g tech #添加一个littleboy 属于tech组.
[root@oldboy ~]# id littleboy
uid=1002(littleboy) gid=1002(tech) 组=1002(tech)

=用户和组相关的配置文件=
直接相关的有4个
/etc/passwd ##用户主配置文件,用户的各种属性(UID,GID,家目录,登录SHELL)
/etc/shadow ##用户密码文件,存放密码及密码的属性(失效时间,修改密码时间等)。
/etc/group ##组文件,存放用户组及属性。
/etc/gshadow ##用户组的密码文件(废弃)

详细说明:
用户文件:
/etc/passwd 见视频*****
[root@oldboy ~]# tail -1 /etc/passwd
littleboy: x: 1002:1002: :/home/littleboy :/bin/bash
用户 密码 UID GID 说明 家目录 登录解释

=和用户相关的命令=
useradd 添加用户
usermod 修改用户
userdel 删除用户

useradd 添加用户
-u 指定uid添加用户
[root@oldboy ~]# useradd -u 1111 test
[root@oldboy ~]# id test #用户信息
uid=1111(test) gid=1111(test) 组=1111(test)
[root@oldboy ~]# tail -1 /etc/passwd #查看用户文件
test❌1111:1111::/home/test:/bin/bash
-g 指定用户属于哪个组
[root@oldboy ~]# groupadd tech
[root@oldboy ~]# tail -1 /etc/group
tech❌1002:

[root@oldboy ~]# useradd littleboy -g tech #添加一个littleboy 属于tech组.
[root@oldboy ~]# id littleboy
uid=1002(littleboy) gid=1002(tech) 组=1002(tech)

[root@oldboy ~]# ls -l /home
总用量 0
drwx------. 2 littleboy tech 62 8月 30 01:14 littleboy
drwx------. 2 oldboy oldboy 99 8月 30 00:59 oldboy
drwx------. 2 oldgirl oldgirl 62 8月 30 01:11 oldgirl
drwx------. 2 test test 62 8月 30 01:19 test

-M 不生成家目录
[root@oldboy ~]# useradd test1 -M
[root@oldboy ~]# ls /home/
littleboy oldboy oldgirl test

-s 指定解释器
[root@oldboy ~]# useradd test2 -s /sbin/nologin -M #用于给应用软件运行提供用户
[root@oldboy ~]# tail -1 /etc/passwd
test2❌1113:1113::/home/test2:/sbin/nologin
[root@oldboy ~]# su - test2
su: 警告:无法更改到 /home/test2 目录: 没有那个文件或目录
This account is currently not available.

解释器:
[root@oldboy ~]# cat /etc/shells
/usr/bin/sh
/usr/bin/bash

usermod 修改用户
例1:test2解释器改成bash
[root@oldboy ~]# grep -w test2 /etc/passwd
test2❌1113:1113::/home/test2:/sbin/nologin

[root@oldboy ~]# usermod -s /bin/bash test2
[root@oldboy ~]# grep -w test2 /etc/passwd
test2:x:1113:1113::/home/test2:/bin/bash

例2:更改littleboy用户,属于oldboy组
[root@oldboy ~]# grep little /etc/passwd
littleboy❌1002:1002::/home/littleboy:/bin/bash

[root@oldboy ~]# id littleboy
uid=1002(littleboy) gid=1002(tech) 组=1002(tech)

[root@oldboy ~]# usermod -g oldboy littleboy

例3:修改uid为6666
[root@oldboy ~]# id littleboy
uid=1002(littleboy) gid=1000(oldboy) 组=1000(oldboy)
userdel 删除用户
[root@oldboy ~]# usermod -u 6666 littleboy
[root@oldboy ~]# id littleboy
uid=6666(littleboy) gid=1000(oldboy) 组=1000(oldboy)

userdel 删除用户
-r 连带家目录一起删除

[root@oldboy ~]# userdel -r test #不用
[root@oldboy ~]# ls /home
littleboy oldboy oldgirl
[root@oldboy ~]# userdel oldgirl #删除
[root@oldboy ~]# ls /home
littleboy oldboy oldgirl

生产采取注释方法:
[root@oldboy ~]# tail -10 /etc/passwd
#littleboy❌6666:1000::/home/littleboy:/bin/bash
#test1❌1112:1112::/home/test1:/bin/bash
#test2❌1113:1113::/home/test2:/bin/bash

[root@oldboy ~]# su - test1
su: user test1 does not exist

美团外卖\快递 #基本不动脑的职业

创建用户组。
[root@oldboy ~]# groupadd tech
[root@oldboy ~]# tail -1 /etc/group
tech❌1002:

[root@oldboy ~]# useradd littleboy -g tech #添加一个littleboy 属于tech组.
[root@oldboy ~]# id littleboy
uid=1002(littleboy) gid=1002(tech) 组=1002(tech)

useradd 修改用户========
-u 指定UID
-g 指定属于的组
-M 不创建家目录
-s 指定登录的解释器
usermod 修改用户========
-u 指定UID
-g 指定属于的组
-M 不创建家目录
-s 指定登录的解释器

删除用户组:groupdel
[root@oldboy ~]# groupadd abc
[root@oldboy ~]# tail -1 /etc/group
abc❌1114:
[root@oldboy ~]# groupdel abc

密码相关:passwd
修改指定用户密码:root功能
[root@oldboy ~]# passwd oldboy

普通用户
passwd 只能改自己的密码
[oldboy@oldboy ~]$ passwd
更改用户 oldboy 的密码 。
为 oldboy 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
无效的密码: 这个密码和原来的相同
新的 密码:
无效的密码: 密码少于 8 个字符
新的 密码:
无效的密码: 密码少于 8 个字符
passwd: 已经超出服务重试的最多次数

非交互式修改密码 --stdin
echo 123456|passwd --stdin root

[root@oldboy ~]# echo 123456|passwd --stdin root
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。

[root@oldboy ~]# history
231 echo 123456|passwd --stdin root #留痕迹
232 history
[root@oldboy ~]# history -d 231 #按编号把带密码的命令删除
[root@oldboy ~]# history

批量设置密码而且不留痕迹
[root@oldboy ~]# cat /tmp/a.txt
oldboy:123456
test1:890
以下命令相同
[root@oldboy ~]# chpasswd [root@oldboy ~]# cat /tmp/a.txt|chpasswd

[root@oldboy ~]# su - oldboy
上一次登录:一 8月 30 02:12:52 CST 2021pts/0 上
[oldboy@oldboy ~]$ su - test1
密码:输入890
su: 警告:无法更改到 /home/test1 目录: 没有那个文件或目录
[test1@oldboy oldboy]$ whoami
test1

切换用户以及提权管理命令:
su
sudo

su 切换用户角色
从root变为oldboy就是切换用户角色

su - oldboy

  • 加载新的环境变量

不适用-的问题
[root@oldboy ~]# su oldboy
[oldboy@oldboy root]$ pwd
/root #还是root家目录

10个管理员,管理服务器,su - root ##必须要root密码,
其中一个管理员,把密码改了.其他人登录不了.
找回丢失的root密码
1.重启系统
2.进入单用户模式,不能上网.

只把root密码留给少数核心管理人员,其他管理员就使用普通用户管理.
需要root权限的时候:

进入/etc/ 创建个文件
[oldboy@oldboy ~]$ cd /etc
[oldboy@oldboy etc]$ touch oldboy.txt
touch: 无法创建"oldboy.txt": 权限不够
按命令,最小化授权,执行命令期间拥有root权限.

sudo管理方案
让普通用户执行某个命令的过程中拥有root权限.本身角色还是oldboy自己.

配置方法:把普通用户提升为管理员

使用命令visudo (vim /etc/sudoers)
1)语法1
root ALL=(ALL) ALL

root ALL = (ALL) ALL
用户 所有主机 所有角色 所有命令

2)语法2 %wheel为组

Allows people in group wheel to run all commands

%wheel ALL=(ALL) ALL

%wheel ALL = (ALL) ALL
用户组 所有主机 所有角色 所有命令

[root@oldboy ~]# id oldboy 是管理员身份,因为属于wheel组
uid=1000(oldboy) gid=1000(oldboy) 组=1000(oldboy),10(wheel)

让普通用户变成管理员:

方法1:直接授权:
oldgirl ALL = (ALL) ALL

方法2:添加一个用户属于wheel组
[root@oldboy ~]# useradd test7 -g wheel
[root@oldboy ~]# id test7
uid=6669(test7) gid=10(wheel) 组=10(wheel)
test7即为管理员

实践方法1:
[root@oldboy ~]# useradd oldgirl
root@oldboy ~]# echo 123|passwd --stdin oldgirl

[root@oldboy ~]# su - oldgirl
[oldgirl@oldboy root]$ su - root #必须有root密码 暴力破解.
密码:

[oldgirl@oldboy root]$ sudo su - root #通过sudo提权
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。

[sudo] oldgirl 的密码: ###只需要输入oldgirl自身密码即可.
oldgirl 不在 sudoers 文件中。此事将被报告。 ###没有提前配置,所以提示.

实践配置

visudo
#103gg,o
oldgirl ALL=(ALL) ALL

然后以oldgirl身份执行切换
[oldgirl@oldboy root]$ sudo su - root
[sudo] oldgirl 的密码:###只需要输入oldgirl自身密码即可.
上一次登录:一 8月 30 02:44:11 CST 2021从 10.0.0.1pts/1 上
成功切换

需求:进入/etc创建个test文件
实现:不授权all,只授权指定命令

1)先查命令全路径
[root@oldboy ~]# which touch
/usr/bin/touch

[root@oldboy ~]# which useradd
/usr/sbin/useradd

2)visudo配置命令(全路径,用逗号分割),注意在oldgirl开始的授权上改
oldgirl ALL=(ALL) /usr/bin/touch, /usr/sbin/useradd

3)然后以oldgirl身份执行
[oldgirl@oldboy root]$ sudo touch /etc/oldboy.txt
[sudo] oldgirl 的密码:

[oldgirl@oldboy root]$ ls /etc/oldboy.txt ##成功创建
/etc/oldboy.txt

[oldgirl@oldboy root]$ useradd kk ##必须带sudo 命令语法
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。

[oldgirl@oldboy root]$ sudo useradd kk ##成功

普通用户变成root用户所有方案:
1.su - root 需要root密码
2.vim /etc/sudoers
[root@oldboy ~]# ll /etc/sudoers
-r–r-----. 1 root root 4328 9月 30 2020 /etc/sudoers
1)让文件可编辑.调整文件权限.
3.suid,给一个命令设置suid权限,任何用户执行设置过的suid功能的命令都拥有root权限.

用户相关:
useradd
usermod
userdel

用户组相关:
groupadd
groupdel
密码相关:
passwd

切换用户以及提权管理命令:
su
sudo

day6:
下节内容:
查看用户信息命令
id
whoami
who
w

查看用户日志
last
lastlog

更改文件属性:
chown
chgrp
chattr
lsattr

linux权限
20Linux权限知识和应用实践讲解
https://ke.qq.com/course/2806831?taid=9996020988171311
磁盘知识

下节内容:
day5-6
查找文件
##三剑客+正则
文件类型
用户和组
文件权限
磁盘知识
day7-8
网络知识
进程知识
定时任务
day9-10
搭建web服务
LNMP 搭建博客和知乎产品
了解网站访问的流程
数据库
day11-12
Shell编程

老男孩培训第六天

1.查看用户信息命令
id

[root@oldboy ~]# id oldboy
uid=1000(oldboy) gid=1000(oldboy) 组=1000(oldboy),10(wheel)

方法2:添加一个用户属于wheel组,用户即为管理员
[root@oldboy ~]# useradd test7 -g wheel
[root@oldboy ~]# id test7
uid=6669(test7) gid=10(wheel) 组=10(wheel)
test7即为管理员

[root@oldboy ~]# echo 123456|passwd --stdin test7
更改用户 test7 的密码 。
[root@oldboy ~]# su - test7
[test7@oldboy ~]$ sudo su -
[sudo] test7 的密码:
[root@oldboy ~]#

whoami查看当前用户
[root@oldboy ~]# whoami
root

who 忽略

w 查看用户登录情况
[root@oldboy ~]# w
23:32:42 up 5 days, 21:09, 2 users, load average: 2.36, 2.49, 2.39
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 267月21 ? 1.08s 0.56s -bash
root pts/1 10.0.0.1 02:44 2.00s 0.22s 0.05s w

查看用户日志
last====>show listing of last logged in users
[root@oldboy ~]# last
root pts/1 10.0.0.1 Mon Aug 30 02:44 still logged in
root pts/0 10.0.0.1 Mon Jul 26 11:23 still logged in
root pts/0 10.0.0.1 Mon Jul 26 11:20 - 11:23 (00:02)
root pts/0 10.0.0.1 Mon Jul 26 10:34 - 11:20 (00:45)

lastlog - 报告所有用户的最近登录情况,或者指定用户的最近登录情况
[root@oldboy ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/1 一 8月 30 23:29:42 +0800 2021
bin 从未登录过
daemon 从未登录过
adm 从未登录过
lp 从未登录过
oldboy pts/0 一 8月 30 02:21:55 +0800 2021

[root@oldboy ~]# lastlog -C -u oldboy ##清理登录用户信息
oldboy 从未登录过

#及时监控,每分钟监控.zabbix工具
cat /var/log/secure
cat /var/log/messages

ids入侵检测:
所有情况监控
进程查看命令:ps top
黑客进来以后运行木马,隐藏运行(放上来ps,top,本地的命令替换了).
如何监控?

md5sum 给文件加密生成字符串以及检查文件是否被修改
[root@oldboy ~]# md5sum /etc/hosts
54fb6627dbaa37721048e4549db3224d /etc/hosts #公安采集指纹

md5sum /etc/hosts采集指纹…发生变化,确认hosts文件被改.

采集文件指纹/usr/bin/
[root@oldboy ~]# find /usr/bin/ -type f|xargs md5sum >/opt/zhiwen.log

检查是否有文件被修改
[root@oldboy ~]# LANG=en
[root@oldboy ~]# md5sum -c /opt/zhiwen.log|egrep -i fail
模拟修改
[root@oldboy ~]# echo 111 >>/usr/bin/cowsay
检测是否被修改
[root@oldboy ~]# md5sum -c /opt/zhiwen.log|egrep -i fail
/usr/bin/cowsay: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

wc 查看行数\字符数\单词数
-l 查看行数
[root@oldboy ~]# find /usr/bin/|wc -l
1030
[root@oldboy ~]# touch /usr/bin/abc
[root@oldboy ~]# find /usr/bin/|wc -l
1031

更改文件[属性]:
[root@oldboy ~]# ls -l
total 16
-rw-r–r--. 1 root root 52 Jul 27 2100 oldboy.txt
更改用户和组 chown
-R 递归修改

chown -R 用户 oldboy.txt #更改文件对应的用户

chown 用户.用户组 oldboy.txt #更改文件对应的用户和组

chown .用户组 oldboy.txt #更改文件对应的用户组,点号可以用冒号替代

chgrp 只能更改组
chgrp 用户组 oldboy.txt #更改文件对应的用户组

[root@oldboy ~]# touch oldboy.txt
[root@oldboy ~]# ls -l oldboy.txt
-rw-r–r--. 1 root root 21 Aug 31 00:07 oldboy.txt

[root@oldboy ~]# chown oldboy oldboy.txt #更改文件对应的用户
[root@oldboy ~]# ls -l oldboy.txt
-rw-r–r--. 1 oldboy root 21 Aug 31 00:07 oldboy.txt

[root@oldboy ~]# chown :oldboy oldboy.txt #更改文件对应的用户组
[root@oldboy ~]# ls -l oldboy.txt
-rw-r–r--. 1 oldboy oldboy 21 Aug 31 00:07 oldboy.txt

[root@oldboy ~]# chown root.root oldboy.txt #更改文件对应的用户和组
[root@oldboy ~]# ls -l oldboy.txt
-rw-r–r--. 1 root root 21 Aug 31 00:07 oldboy.txt

修改组实践:
[root@oldboy ~]# chgrp oldboy oldboy.txt
[root@oldboy ~]# ls -l oldboy.txt
-rw-r–r--. 1 root oldboy 21 Aug 31 00:07 oldboy.txt

chattr 给文件加锁,不让别人改
i 加锁,不能删不能改.
a 可以追加内容,但不能删除

动作:
- 减少
+ 增加
= 赋予

[root@oldboy ~]# chattr +i oldboy.txt #给oldboy.txt加锁
[root@oldboy ~]# ls -l
total 0
-rw-r–r--. 1 root root 0 Aug 31 00:13 oldboy.txt #查看增加的属性

[root@oldboy ~]# lsattr oldboy.txt
----i----------- oldboy.txt

[root@oldboy ~]# rm -f oldboy.txt
rm: cannot remove ‘oldboy.txt’: Operation not permitted

[root@oldboy ~]# echo dddd >oldboy.txt
-bash: oldboy.txt: 权限不够

[root@oldboy ~]# chattr -i oldboy.txt #解锁
[root@oldboy ~]# lsattr oldboy.txt
---------------- oldboy.txt
[root@oldboy ~]# rm -f oldboy.txt

场景:给关键文件加锁
[root@oldboy ~]# chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/sudoers
[root@oldboy ~]# chattr +i /etc/sudoers
[root@oldboy ~]# visudo
visudo: /etc/sudoers: Permission denied

[root@oldboy ~]# ls -l /etc/sudoers
-r–r-----. 1 root root 4387 Aug 30 02:49 /etc/sudoers
[root@oldboy ~]# chmod 777 /etc/sudoers
chmod: changing permissions of ‘/etc/sudoers’: Operation not permitted

[root@oldboy ~]# mv /bin/chattr /bin/oldboy #或者删除.

测试完毕解锁
chattr -i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/sudoers

lsattr 查看chattr对属性的更改

Linux权限:
[root@oldboy ~]# touch oldboy.txt
[root@oldboy ~]# ls -l
total 0
-rw-r–r--. 1 root root 0 Aug 31 00:50 oldboy.txt

rw-r–r-- 权限

4个字符的含义:
r 对于文件是可读 对于目录是浏览目录下的文件.
w 对于文件是可写 对于目录是创建\删除文件(和x配合).
如果文件的的权限有w,就认为文件可以被删除是错误的思维
文件是否可被删除取决于上级目录是否有w.
x 对于文件是可执行 对于目录是能否进入目录.

  • 没有权限

需要谁配合,自己可以测试:

rw- r-- r–
用户权限 用户组权限 其他权限

字符对应的数字
r 4
w 2
x 1

  • 0

核心:权限如何看:见视频
[root@oldboy ~]# ls -l
total 0
-rw-r–r--. 1 root root 0 Aug 31 00:50 oldboy.txt

字符权限 数字权限
rw-r–r-- ====6+4+4

说出下面字符权限对应的数字权限
drwxrwxr-- 774
-rw-r–r-x 645
drwx–xr-x 715
dr-xrwx–x 571
d–xr-xrwx 157
----r–r-- 044

如何更改权限? chmod
用数字权限:推荐
-R 递归修改

chmod 774 oldboy.txt

[root@oldboy ~]# chmod 774 oldboy.txt
[root@oldboy ~]# ls -l
total 0
-rwxrwxr–. 1 root root 0 Aug 31 00:50 oldboy.txt

把一个文件改成如下权限:
–x--w-r–
chmod 124 oldboy.txt

[root@oldboy ~]# chmod 124 oldboy.txt
[root@oldboy ~]# ls -l
total 0
—x-w-r–. 1 root root 0 Aug 31 00:50 oldboy.txt

用字符权限:
r
w
x

动作:
-减少
+增加
=赋予新的权限

前三位 u(user) 用户位
中三位 g(group)用户组位
后三位 o(other)其他用户位
a(all)
–x-w-r–

中三位:增加rx
[root@oldboy ~]# chmod g+rx oldboy.txt
[root@oldboy ~]# ls -l
total 0
—xrwxr–. 1 root root 0 Aug 31 00:50 oldboy.txt

前三位:增加rwx
中三位:减少w
后三位:改为x

[root@oldboy ~]# chmod u+rwx,g-w,o=x oldboy.txt
[root@oldboy ~]# ls -l
total 0
-rwxr-x–x. 1 root root 0 Aug 31 00:50 oldboy.txt

4个字符的含义:
r 对于文件是可读 对于目录是浏览目录下的文件.
w 对于文件是可写 对于目录是创建\删除里面的文件.
如果文件的权限有w,就认为文件可以文件被删除是错误的思维
文件是否可被删除取决于上级目录是否有w.
x 对于文件是可执行 对于目录是能否进入目录.

  • 没有权限

几个用户角色:
root
用户 oldboy inca
用户 oldgirl inca
用户组 inca
用户 test

groupadd inca
useradd oldgirl -g inca
useradd oldboy -g inca
useradd test

#如果存在oldboy,oldgirl则使用usermod
usermod oldgirl -g inca
usermod oldboy -g inca

[root@oldboy ~]# id oldboy
uid=1000(oldboy) gid=6669(inca) 组=6669(inca),10(wheel),1000(oldboy)
[root@oldboy ~]# id oldgirl
uid=6667(oldgirl) gid=6669(inca) 组=6669(inca)

[root@oldboy ~]# mkdir /data -p
[root@oldboy ~]# mv oldboy.txt /data/

特殊权限:关键应用
suid

/etc/shadow 存放用户密码的文件
[root@oldboy /]# ls /etc/shadow -l
----------. 1 root root 1240 8月 31 01:36 /etc/shadow #没有权限
[root@oldboy ~]# md5sum /etc/shadow
31d2d9e77650c8bd5a62b3ba88d48b1f /etc/shadow

[oldboy@oldboy ~]$ whoami
oldboy
[oldboy@oldboy ~]$ passwd ##修改了/etc/shadow
更改用户 oldboy 的密码 。
为 oldboy 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

[root@oldboy ~]# md5sum /etc/shadow
9b20feb1326830523f02d505edab451d /etc/shadow

疑惑:oldboy用户使用passwd命令修改密码====改的文件/etc/shadow
因为/etc/shadow没有任何权限,所以oldboy使用passwd命令理论上没有办法修改/etc/shadow
二实际上确修改了,为什么呢?

问题出在passwd命令身上,这个命令被设置了特殊权限位(suid)

suid作用:
1.针对二进制命令.
2.给passwd命令设置了suid,则任何用户执行passwd命令都会拥有和passwd命令对应的用户的权限.
[root@oldboy ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

普通权限:9位 前三位 中三位 后三位
特殊权限:3位

suid:用户
前三位用户位的x位:S s(x)
s 4
sgid:用户组
中三位用户组位的x位:S s(x)
s 2
粘滞位: /tmp
后三位其他用户位:x位:T t(x)
t 1

[root@oldboy ~]# chmod 4755 which rm
[root@oldboy ~]# ls -l which rm
-rwsr-xr-x. 1 root root 62872 8月 20 2019 /usr/bin/rm
[root@oldboy ~]# chmod u+s which rm
[root@oldboy ~]# ls -l which rm
-rwsr-xr-x. 1 root root 62872 8月 20 2019 /usr/bin/rm

[root@oldboy /]# ls -l /bin/rm
-rwsr-xr-x. 1 root root 62872 8月 20 2019 /bin/rm

工作中绝对不能用suid提权,特别是本身有危害的命令.
passwd命令属于绿色无害命令

rm,vim,cat都是有害命令,防不胜防

test用户通过设置了suid的vim命令提权到root实践:
1.chmod u+s /bin/vim #必须root
2.vim /etc/sudoers #test
test ALL=(ALL) ALL
3.sudo su - 切到root.

利用cat命令被设置suid漏洞提权到root
chmod u+s /bin/cat #企业人员设置
注意提前备份/etc/sudoers,否则可能操作不当破坏sudoers文件.

[root@oldboy ~]# cat >>/etc/sudoers #先回车在输入内容
test ALL=(ALL) ALL
[root@oldboy ~]# tail -1 /etc/sudoers
test ALL=(ALL) ALL

sudo su -

防护普通用户以及web提权:老男孩思想
1.禁止给命令设置suid
1)应用软件PHP(/etc/php.ini)禁止开启读取系统文件等的函数cat
2)磁盘挂载禁止suid.
2.给关键文件加锁/etc/sudoers

3.chmod 000 /etc/sudoers

4.看好/etc目录权限,防止文件被替换

5.所有系统和站点文件和目录用户和组都用root.

6.文件统一644,目录统一755,文件和目录的默认权限.

7.web应用禁止上传特殊文件到服务器,
上传后禁止浏览(get请求方法,目录uri,动静分离),
开启wap防火墙各种限制80进入,使用加密的https.

8.ssh监听内网,禁止root远程连接,拨号.

查找设置了suid的命令
[root@oldboy ~]# find / -perm 4755
/usr/bin/fusermount
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/su
/usr/bin/umount
/usr/bin/passwd
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/usernetctl

day7:
磁盘知识
进程知识
定时任务

老男孩培训第七天

磁盘知识
定时任务
进程知识                    (见老韩的课程)

磁盘:
1.硬件
接口:ide scsi sata sas ssd
m2,pci-e
企业线上:使用sas 15000转/m,sata7200转/M
数据库\存储 会使用固态盘
机械和电子:

scsi sata sas ssd

/dev/sda /dev/sdb /dev/sdc

ide
/dev/hda /dev/hdb

分区用数字表示
sda1 sda2 sda3 sdb1 sdb2

2.磁盘分区
主分区:
1.必须存在分区.
2.装系统
3.分区编号1-4(数量最多4个)

扩展分区:
1.类似一个小磁盘,只能有一个.
2.扩展分区站一个主分区的编号.
3.扩展分区不能存放数据.
4.扩展分区之上可以分逻辑分区.
5.主分区+扩展分区,总数不能超过4个.
分区表64字节,每个分区表16字节,所以 只能有四个主分区+扩展分区

逻辑分区
1.逻辑分区在扩展分区之上.
2.编号只能5开始
3.逻辑分区可以有多个.
4.逻辑分区用于存放数据

Linux分区:

1)通用分区方法: 数据不重要或者有集群节点
/boot 内核程序 1G
swap分区 当物理内存不够用的时候,借用一个磁盘当做内存用.速度慢
内存大于8G 就8G 内存小于8g,内存的1.5倍.
/ 相当c盘 存放所有数据

2)重要数据分区
数据库\存储服务
/boot 内核程序 1G
swap分区 当物理内存不够用的时候,借用一个磁盘当做内存用.速度慢
内存大于8G 就8G 内存小于8g,内存的1.5倍.
/ 相当c盘 100-200G
/data 数据

3)大厂分区方法
/boot 内核程序 1G
swap分区 当物理内存不够用的时候,借用一个磁盘当做内存用.速度慢
内存大于8G 就8G 内存小于8g,内存的1.5倍.
/ 相当c盘 100-200G
剩余800G 保留不分,谁用谁分

实践分区:
fdisk 最常用分区工具,不能给大于2T的磁盘分区
gdisk 给大于2T的磁盘分区
parted 给大于2T的磁盘分区

查看磁盘
fdisk -l

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM

磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区

[root@oldboy ~]# fdisk /dev/sdb

命令操作
d 删除分区
m 打印帮助
n 添加新分区
p 打印分区信息
q 推出
w 保存退出

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free) #主分区
e extended #扩展分区
Select (default p):

Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):+100M
分区 1 已设置为 Linux 类型,大小设为 100 MiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x48c21649

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 206847 102400 83 Linux

超过4个主分区的提示:
命令(输入 m 获取帮助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.

分5个分区:
/dev/sda1 /dev/sda5 /dev/sda6 /dev/sda7 /dev/sda8
/dev/sda1 /dev/sda2 /dev/sda5 /dev/sda6 /dev/sda7
/dev/sda1 /dev/sda2 /dev/sda3 /dev/sda5 /dev/sda6 ****

[root@oldboy ~]# ls -l /dev/sdb*
brw-rw----. 1 root disk 8, 16 7月 29 10:20 /dev/sdb
brw-rw----. 1 root disk 8, 17 7月 29 10:20 /dev/sdb1
brw-rw----. 1 root disk 8, 18 7月 29 10:20 /dev/sdb2
brw-rw----. 1 root disk 8, 19 7月 29 10:20 /dev/sdb3
brw-rw----. 1 root disk 8, 20 7月 29 10:20 /dev/sdb4
brw-rw----. 1 root disk 8, 21 7月 29 10:20 /dev/sdb5
brw-rw----. 1 root disk 8, 22 7月 29 10:20 /dev/sdb6

分区本质:修改分区表

通知内核分区表修改了.
[root@oldboy ~]# partprobe /dev/sdb

格式化:
本质创建文件系统
什么是文件系统?
组织和存取数据一种机制,落到Linux里就是一个文件系统软件.

文件系统类型:
win:ntfs,fat32
Linux:ext2 ext3 ext4 xfs(centos7)

格式化分区就是生成文件系统:
至少两样东西
inode 256字节空间 存放东西
文件的属性(权限 大小 用户 组)
指针:指向文件实体.
每个文件有且只能一个.

block:存放文件内容的空间.一个block 1,2,4K
每个block最多只能放一个文件.
文件大小0.1K 占一个block.   3.9K 浪费掉
按block读取.

格式化 mkfs
[root@oldboy ~]# mkfs
指定文件系统格式化.
mkfs -t xfs
mkfs.ext4
mkfs.xfs

[root@oldboy ~]# mkfs.xfs /dev/sdb1 #直接接分区
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

临时挂载测试
[root@oldboy ~]# mount /dev/sdb1 /mnt ##临时挂载
[root@oldboy ~]# cd /mnt/
[root@oldboy mnt]# touch oldboy.txt
[root@oldboy mnt]# ls
oldboy.txt
[root@oldboy mnt]# df -h ##查看挂载
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 97M 5.3M 92M 6% /mnt 挂载.

永久挂载 /etc/fstab
[root@oldboy mnt]# cat /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=748c03eb-35df-4f8f-9a07-573ce79aecb2 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

#6列:mount -t xfs /dev/sdb1 /mnt
设备 挂载点 文件系统类型 挂载选项 是否备份 是否开机磁盘检查
/dev/sdb1 /data xfs defaults 0 0

[root@oldboy /]# mount -a #先加载/etc/fstab,否则开机有可能系统起不来.
[root@oldboy /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 97M 5.3M 92M 6% /data

卸载:
umount /mnt #
umount /dev/sdb1
umount -lf /mnt #强制卸载

defaults包含啥?
Use default options: rw, suid, dev, exec, auto, nouser, and async.
rw, 可写
suid, 可以设置suid, nosuid
dev, 可以设置设备
exec, 可以执行二进制程序
async. 写到缓冲区就是写完数据了

磁盘资源就是inode和block.
[root@oldboy data]# df -h #block使用
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.3G 15G 14% /
/dev/sdb1 97M 5.3M 92M 6% /data
/dev/sda1 1014M 138M 877M 14% /boot
tmpfs 394M 0 394M 0% /run/user/0

[root@oldboy data]# df -i #inode
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 500262 412 499850 1% /dev
tmpfs 503266 1 503265 1% /dev/shm
tmpfs 503266 1293 501973 1% /run
tmpfs 503266 16 503250 1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 67774 8843074 1% /
/dev/sdb1 51200 4 51196 1% /data
/dev/sda1 524288 326 523962 1% /boot
tmpfs 503266 1 503265 1% /run/user/0

大文件多 block满
小文件 inode满

创建文件:no space left on device,但是df -h发现没满 啥原因
inode满,大小文件占满了inode.

查看目录大小
[root@oldboy data]# du -sh /etc/
33M /etc/

[root@oldboy data]# du -sh /etc/*
0 /etc/a
32K /etc/abrt
4.0K /etc/adjtime
4.0K /etc/aliases
12K /etc/aliases.db
0 /etc/alternatives
4.0K /etc/anacrontab
4.0K /etc/asound.conf
12K /etc/audisp
16K /etc/audit
80K /etc/bash_completion.d
4.0K /etc/bashrc
0 /etc/binfmt.d
4.0K /etc/centos-release
4.0K /etc/cento
查看文件大小
ls -lh /etc/ ##查看文件大小

定时任务:

定时:指定时间
任务:做事

定时任务:指定时间做一件事

手机闹钟 就是定时任务

cron定时任务:
服务端:crond 后台运行
客户端:crontab 配置工具

场景:
每天0点备份,统计报表.

实践:
cron定时任务服务端:crond 后台运行
[root@oldboy data]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) ##代表运行
systemctl start crond #启动
systemctl enable crond #开机自启动

客户端:crontab 配置工具

crontab -l 查看定时任务
crontab -e 编辑定时任务

定时任务语法:

          • 任务
            分 时 日 月 周

范围:

Example of job definition:

.---------------- minute (0 - 59)

| .------------- hour (0 - 23)

| | .---------- day of month (1 - 31)

| | | .------- month (1 - 12) OR jan,feb,mar,apr …

| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

| | | | |

* * * * * command

特殊符号:

  • 每的意思 分位上的*就是每分的意思.

          • 任务
            每分钟执行任务

1,2,3 * * * * 任务
意思:每小时的第1 2 3分钟 执行任务

1-3 * * * * 任务
意思:每小时的第1 2 3分钟 执行任务

*/10 * * * * 任务
意思:每隔10分钟 执行任务

每天早晨8:30上课
30 08 * * * 上课

每周日上午9:30 上课
30 09 * * 7 上课

每天0点备份mysql数据库
00 00 * * * 备份mysql数据库

生产场景
1.同步互联网时间

*/5 * * * *

yum provides ntpdate #查某个命令属于哪个软件包
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
yum install ntpdate -y

[root@oldboy data]# /usr/sbin/ntpdate ntp1.aliyun.com
[root@oldboy data]# /usr/sbin/ntpdate ntp2.aliyun.com
[root@oldboy data]# /usr/sbin/ntpdate time.windows.com

[root@oldboy data]# crontab -l
####时间同步
*/5 * * * * /usr/sbin/ntpdate ntp2.aliyun.com &>/dev/null

2.每分钟打印oldboy字符到一个文件

[root@oldboy data]# crontab -l
####时间同步
*/5 * * * * /usr/sbin/ntpdate ntp2.aliyun.com &>/dev/null

###打印oldboy,by oldboy for all at 20210729

          • echo oldboy >>/tmp/oldboy.log

作业1:每天0点备份 /etc目录,按照时间
2021-07-21_back.tar.gz
2021-07-22_back.tar.gz
2021-07-23_back.tar.gz

定时任务配置不能带%,如果带了\%.

规范:命令写到文件里oldboy.sh
/bin/sh /server/scripts/oldboy.sh

(见老韩的课程)
作业2:新增一个1G磁盘
分3个区:
/tmp/boot 100M
swap 100M #mkfs.swap swapon生效,free -m
/data1 所有

day8:
进程知识
包管理yum rpm
day9-10
网络基础2天
day11
web架构
mysql

day12:
shell
正则

老男孩培训第八天

1.安装软件方式
1)yum/rpm方式安装,简单,不能改变太多功能.*****
2)从源码编译安装,定制想要的,安装复杂.
3)二进制安装(mysql).

2.rpm软件包命令使用

1.命令格式
rpm [选项] [软件包名称]

2.安装rpm包
(1)安装常用选项

选项 描述
-i 安装rpm
-v 显示安装详细信息
-h 显示安装rpm进度

rpm -ivh 包名

可以是:
1网址 http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm
2全路径带包名 /tmp/nginx-1.18.0-2.el7.ngx.x86_64.rpm
3.包名 nginx-1.18.0-2.el7.ngx.x86_64.rpm

rpm安装nginx web服务
yum install nginx -y
#rpm
http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm
systemctl start nginx
lsof -i :80
systemctl stop firewalld
浏览器打开:
10.0.0.7
Welcome to nginx!
cd /usr/share/nginx/html
unzip Day48-老男孩Linux77期html小游戏项目.zip #提前上传
浏览器打开:
10.0.0.7
开玩

rpm问题:
无法自动解决依赖,实际工作中使用yum替代:

3.升级
选项 描述
-U 如果老版本不存在则安装新版本,存在则升级新版本

rpm -Uvh 包名

4.查询rpm包
(1)查询常用选项
选项 描述
rpm -q 查看指定软件包是否安装
rpm -qa 查看系统中已安装的所有RPM软件包列表*****

[root@oldboy html]# rpm -qa tree
tree-1.6.0-10.el7.x86_64
[root@oldboy html]# rpm -qa|grep tree
tree-1.6.0-10.el7.x86_64

rpm -ql 查询指定软件包所安装的目录、文件列表***
[root@oldboy html]# rpm -ql net-tools
/bin/netstat
/sbin/arp
/sbin/ether-wake
/sbin/ifconfig
/sbin/ipmaddr
/sbin/iptunnel
/sbin/mii-diag
/sbin/mii-tool
/sbin/nameif
/sbin/plipconfig
/sbin/route
/sbin/slattach

rpm -qf 查询文件或目录属于哪个RPM软件*****
[root@oldboy html]# yum provides cat #查询cat属于哪个RPM软件*
查文件属于哪个包

命令损坏:
[root@oldboy html]# rpm -qf /bin/cat
coreutils-8.22-24.el7.x86_64
[root@oldboy html]# rpm -qf /bin/touch
coreutils-8.22-24.el7.x86_64

[root@oldboy html]# rpm -e coreutils --nodeps #卸载软件包不带依赖.

[root@oldboy html]# yum install coreutils -y #安装
[root@oldboy html]# cat /etc/hosts

[root@oldboy html]# rpm -qf /etc/hosts
setup-2.8.71-11.el7.noarch

5.卸载常用选项
(1)卸载常用选项
选项 描述
-e 卸载软件
–force 强制
–nodeps 忽略依赖关系

[root@oldboy src]# rpm -qa nginx
nginx-1.20.0-1.el7.ngx.x86_64
[root@oldboy src]# rpm -e nginx

强制卸载,忽略依赖关系:
rpm -e --force --nodeps 包名

删除有关,都要谨慎
rm,mv #find+xargs
rpm -e --nodeps #永远不用。安装了不用理他,不启动就可以了。
yum remove nginx -y #连带依赖一起卸载,永远不用。安装了不用理他,不启动就可以了。

6.rpm包练习
1)查询arp命令是由哪个RPM软件包安装的?

[root@oldboy src]# rpm -qf $(which arp)
net-tools-2.0-0.25.20131004git.el7.x86_64
#系统里没有的方法
yum provides arp 

2)查询/etc/ssh/sshd_config属于哪个软件包。
[root@oldboy src]# rpm -qf /etc/ssh/sshd_config
openssh-server-7.4p1-21.el7.x86_64

#全路径
yum provides /etc/ssh/sshd_config

3)查询tree软件包都有哪些文件。
[root@oldboy src]# rpm -ql tree

rpm包哪来的?

5.Linux系统本地yum源配置

1)互联网阿里云yum源配置

#默认系统是国外源,需要替换为国内的源
curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2)互联网epel源配置
#扩展源,有很多软件在基本源中没有
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum install epel-release

3)互联网特定软件官方源配置
Nginx web软件官方源,有最新的nginx版本,查找方法:
1)进入nginx.org,进入download页面。
2)页面结尾进入“Linux packages for stable and mainline versions.”即可。
3)配置如下
[root@oldboy ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
priority=1 ##设置优先级
PS. http://nginx.org/en/linux_packages.html

配置优先级软件
yum install yum-plugin-priorities -y

7.1.6 yum命令使用实践
1.使用yum查询软件包的方式
[root@oldboy ~]# yum list
[root@oldboy ~]# yum list tree #不需要yum list|grep tree. 模糊匹配

2.使用yum安装软件包的方式
[root@oldboy ~]# yum install tree #需要确认
[root@oldboy ~]# yum install tree -y #非交互

#直接安装网络上的rpm包
[root@oldboy ~]# yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

#如下的执行很危险,这代表更新整个系统所有的软件,包括内核
[root@oldboy ~]# yum update -y ###打补丁.

#注意事项:
1)生产线慎用,最好不用。
2)安装系统之后,上线前。
3)测试环境,模拟正式环境。然后上正式。

4.使用yum删除软件包
[root@oldboy ~]# yum install vsftpd -y
[root@oldboy ~]# yum remove samba -y
#注意:慎用,尽量不用。

#查找某个命令或文件属于那个软件包(生产常用)
[root@oldboy ~]# yum provides /etc/my.cnf
[root@oldboy ~]# yum provides cd

进程:

程序:放在磁盘里的代码文件,或软件
进程:把程序运行,就是进程. 放在内存.
[守护]进程:持续运行的进程. crond持续运行.

查看进程:

ps命令:
ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片。
动态查看top
常用:
-e 显示所有进程※
-f 额外显示UID、PPID、C与STIME栏位※

常用命令:
ps -ef #简易查看进程,过滤进程的命令。

[root@oldboy ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun02 ? 00:00:06 /usr/lib/systemd/systemd --system --des
root 2 0 0 Jun02 ? 00:00:00 [kthreadd]
root 4 2 0 Jun02 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Jun02 ? 00:00:09 [ksoftirqd/0]
root 7 2 0 Jun02 ? 00:00:00 [migration/0]
root 8 2 0 Jun02 ? 00:00:00 [rcu_bh]

PID为1的初始进程,C7:systemd,C6:init

输出信息中各列的说明如下。
UID:进程被该UID所拥有,程序运行必须要有用户,一般是虚拟用户。
PID:进程的标识号;Process ID
PPID:进程的父进程的标识号;
C:CPU使用的资源百分比;
STIME:进程开始的时间;
TTY :该进程是在哪个终端机上面运作,若与终端机无关,则显示?,另外, tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程;
TIME:进程所使用的总的CPU时间;
CMD:正在执行的命令行。

ps -ef 用户查看什么进程的时候.

[root@oldboy ~]# ps aux #***
#<== BSD格式参数,使用a选项和x选项显示所有进程,使用u选项显示进程的用户信息。

[root@oldboy ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 46368 6700 ? Ss Jun02 0:06 systemd --system --deserialize 18
root 2 0.0 0.0 0 0 ? S Jun02 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Jun02 0:00 [kworker/0:0H]

输出信息中各列的说明如下。
USER:该进程属于的用户;
PID :该进程的进程号;

%CPU:该进程使用掉的CPU资源百分比;*****
%MEM:该进程所占用的物理内存百分比;*****
VSZ :(Virtual Size)进程占用的虚拟内存量 (单位Kb);*****
RSS :该进程占用的物理内存大小 (单位Kb);*****

TTY :该进程是在哪个终端机上面运作的,若与终端机无关,则显示?,另外, tty1-tty6是本机上面登入者进程,若为pts/0等,表示为由网络连接进主机进程;
STAT:该进程目前的状态
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运作的时间;
COMMAND:该进程的实际命令,[ 方括号 ] 属于内核态的进程。 没有 [ ] 的是用户态进程。。

STAT:该进程目前的状态,主要的状态包括
R :正在运行,或者是可被运行。
S :正在中断睡眠中,可被某些信号(signal) 唤醒。
D :不可中断睡眠。
T :正在侦测或者是停止了。
Z :已经终止,但是其父进程无法正常终止他,造成 zombie (疆尸) 进程的状态。
+ :前台进程。
l :多线程进程。
N :低优先级进程。
< :高优先级进程。
s :进程领导者。
L : 已将页面锁定到内存中。

总结:
ps aux
a 显示与终端相关的所有进程,包含每个进程的完整路径※
u 显示进程的用户信息※
x 显示与终端无关的所有进程※

ps -ef
-e 显示所有进程※
-f 额外显示UID、PPID、C与STIME栏位※

企业如何用?
查找占用 cpu mem 虚拟内存 更多的进程,
分析进程的问题,解决问题,把资源降下来。
如果发现没有异常,还无法降下来,就增加资源

维护服务器性能:CPU、内存、IO

倒序排序
[root@oldboy ~]# ps -eo “%p %C %z %c” --sort -vsz|head
PID %CPU VSZ COMMAND
1053 0.0 612376 polkitd
20524 0.0 574284 tuned
1080 0.0 474920 NetworkManager
21554 0.0 228456 abrtd
21581 0.0 225940 abrt-watch-log
21299 0.0 218528 rsyslogd
20759 0.0 199460 vmtoolsd
20758 0.0 168304 VGAuthService
1641 0.0 154848 sshd

ps -eo “%p %C %z %c” --sort vsz #升序

ps aux --sort vsz #–sort 加上对应格式,可以进行排序
ps aux --sort -vsz |head #–sort后面加上 -(减号)表示逆序排序

pstree:显示进程状态树
【功能说明】
pstree命令以树形结构显示进程和进程之间的关系。

[root@oldboy html]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─abrt-watch-log
├─abrtd
├─agetty
├─anacron
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─nginx───nginx
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───2*[{vmtoolsd}]

-a 显示启动每个进程对应的完整指令,包含启动进程的路径、参数等
-c 显示的进程中包含子进程和父进程
-h 对现在执行的程序进行特别标注
-n 根据进程PID号来排序输出,默认是以程序名称排序输出的
-p 显示进程的PID
-u 显示进程对应的用户名称

top:实时显示系统中各个进程的资源占用状况*****
【语法格式】top [选项]

参数选项 解释说明(带※的为重点)
-a 将进程按照使用内存排序
-b 以批处理模式显示进程信息,输出结果可以传递给其他程序或写入到文件中。
-c 显示进程的整个命令路径,而不是只显示命令名称
-d 指定每两次屏幕信息刷新之间的时间间隔(top -d 1)
-H 指定这个可以显示每个线程的情况,否则就是进程的总的状态
-i 不显示闲置或者僵死的进程信息
-n top输出信息更新的次数,完成后将退出top命令
-p 显示指定的进程信息(top -p 进程号)

重点:top输出
top - 01:12:32 up 2 days, 2:47, 2 users, load average: 0.00, 0.01, 0.05
第一行:任务队列信息,同uptime命令的执行结果。
01:12:32 当前系统时间。
up 2 days, 2:47 系统已经运行了1天16小时36分。
2 users 当前有2个用户登录系统。
load average: 0.00, 0.01, 0.05 — load average 平均负载情况*****
*****后面的三个数分别是1分钟、5分钟、15分钟的平均负载情况。
【体现系统繁忙的重要简单的查看指标】
CPU是5核,负载超过5就繁忙的临界点.

Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie
第二行,Tasks为任务(进程)。
从上面的信息可以看出,
系统现在共有105个进程,其中处于运行状态的有1个,
104个在休眠(sleep),stoped状态0个,zombie状态(僵死)的有0个。
STAT:该进程目前的状态,主要的状态包括
R :正在运行或者是可被运行。
S :正在中断睡眠中,可被某些信号(signal) 唤醒。
D :不可中断睡眠。
T :正在侦测或者是停止了。
Z :已经终止,但是其父进程无法正常终止他,造成 zombie (疆尸) 进程的状态。

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第三行,CPU状态信息。
0.0% us (user)用户空间占用CPU的百分比(如:应用程序、执行命令)。*****
0.0% sy (system)内核空间占用CPU的百分比(如:内核进程、硬件磁盘操作)。*****
0.0% ni (nice)改变过优先级的进程占用CPU的百分比。
100.0% id (idle)空闲CPU百分比,数值越大,CPU越空闲。*****
0.0% wa (wait)IO等待占用CPU的百分比。*****

0.0% hi   (hard Interrupts)硬中断(Hardware IRQ)占用CPU的百分比。
0.0% si   软中断(Software Interrupts)占用CPU的百分比。
  0.0% st   虚拟机占用CPU的百分比。

KiB Mem : 4026136 total, 203768 free, 228476 used, 3593892 buff/cache
第四行,内存状态。
KiB Mem : 995684 total, 87984 free, 234516 used, 673184 buff/cache
内存:
4026136 total #内存一共多大
203768 free #可用内存,剩余内存
228476 used #已经使用的内存
3593892 buff/cache #系统缓存和缓冲占用内存空间

KiB Swap: 2097148 total, 2097148 free, 0 used. 3531892 avail Mem
第五行,swap交换分区信息。
12097148 total 交换区总量。
0k used 使用的交换区总量。
2097148 free 空闲交换区总量。
3531892 avail Mem 可用内存大小
以上两行: cat /proc/meminfo或free -m获取。

增加swap分区
[root@oldboy html]# mkswap /dev/sdb3
正在设置交换空间版本 1,大小 = 102396 KiB
无标签,UUID=7994e3a7-2222-4d1a-8682-7f484d866709
[root@oldboy html]# swapon /dev/sdb3
[root@oldboy html]# free -m
total used free shared buff/cache available
Mem: 3931 284 3004 11 642 3404
Swap: 2147 0 2147

快捷键:
l,t,m #显示/隐藏前5行的数据输出

从第七行开始,给出的是各进程(任务)的状态监控。
PID 进程id。
USER 进程所有者。
PR 进程优先级。
NI nice值,负值表示高优先级,正值表示低优先级。

VIRT 进程使用的虚拟内存总量,单位kb。*****
RES 进程使用的、未被换出的物理内存大小,单位kb。*****
SHR 共享内存大小,单位kb。*****
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程。
%CPU 上次更新到现在的CPU时间占用百分比。*****
%MEM 进程使用的物理内存百分比。*****

TIME+ 进程使用的CPU时间总计,单位1/100秒。
COMMAND 进程名称(命令名/命令行)。

老男孩Linux77期:
Linux运维交流QQ群:784850820(暗号:oldboy)

top必会快捷键指令(老男孩抓重点思想)
1 #查看系统核心总数, 类似于 lscpu(CPUs)
q #退出top
M #按内存使用百分比排序输出
P #按CPU使用百分比排序输出
R #对已排序的列反转排序
###抓重点显示,有助于查看的指令。
x #高亮显示排序的列
z #以彩色信息展示
b #高亮显示处于R状态的进程

或< #改变排序的列,依然高亮显示。
#top熟悉了解的快捷键
h #查看帮助
l,t,m #显示/隐藏前5行的数据输出

查进程:
ps
top

杀进程
kill 进程号
pkill 进程名
killall 进程名

kill 进程号
pkill 进程名
killall 进程名

[root@oldboy html]# ps -ef|grep crond|grep -v grep
root 1102 1 0 08:31 ? 00:00:00 /usr/sbin/crond -n
[root@oldboy html]#
[root@oldboy html]#
[root@oldboy html]# kill 1102 #kill 进程号
[root@oldboy html]# ps -ef|grep crond|grep -v grep

[root@oldboy html]# systemctl start crond
[root@oldboy html]# ps -ef|grep crond|grep -v grep
root 2837 1 82 10:30 ? 00:00:00 /usr/sbin/crond -n

杀不掉:
kill -9 2837

[root@oldboy html]# kill -9 2837
[root@oldboy html]# ps -ef|grep crond|grep -v grep

问题:导致进程起不来.
web,crond没有数据的软件 kill -9 进程号
重的服务不能kill -9
数据库:
mysql oracle mongodb

pkill,killall
[root@oldboy html]# systemctl start crond
[root@oldboy html]# pkill crond
[root@oldboy html]# ps -ef|grep crond|grep -v grep

[root@oldboy html]# systemctl start crond
[root@oldboy html]# ps -ef|grep crond|grep -v grep
root 2895 1 9 10:33 ? 00:00:00 /usr/sbin/crond -n
[root@oldboy html]# killall crond
[root@oldboy html]# ps -ef|grep crond|grep -v grep

[root@oldboy html]# systemctl start crond
[root@oldboy html]#
[root@oldboy html]# ps -ef|grep crond|grep -v grep
root 2916 1 28 10:34 ? 00:00:00 /usr/sbin/crond -n
[root@oldboy html]#
[root@oldboy html]#
[root@oldboy html]# killall -9 crond
[root@oldboy html]# ps -ef|grep crond|grep -v grep

守护进程:默认都放在后台运行

昨日作业:定时任务 备份
[root@oldboy html]# mkdir /server/scripts -p

[root@oldboy scripts]# cat tar.sh
tar zcf /tmp/etc_$(date +%F).tar.gz /etc

[root@oldboy scripts]# crontab -l|tail -2
###备份 by oldboy for dingjunwei
00 00 * * * /bin/sh /server/scripts/tar.sh &>/dev/null

进程前后台切换:
[root@oldboy scripts]# sh tar.sh
tar: 从成员名中删除开头的“/”
^Z ##ctrl+z 暂停
[1]+ 已停止 sh tar.sh

[root@oldboy scripts]# bg #后台
[1]+ sh tar.sh &

[root@oldboy scripts]# ps -ef|grep tar
root 3054 1822 0 10:46 pts/0 00:00:00 sh tar.sh
root 3066 1822 0 10:47 pts/0 00:00:00 grep --color=auto tar

[root@oldboy scripts]# fg #前台
sh tar.sh
^C #ctrl+c停止
[root@oldboy scripts]# ps -ef|grep tar
root 3068 1822 0 10:47 pts/0 00:00:00 grep --color=auto tar

##直接放到后台.用于开发人员写脚本.
[root@oldboy scripts]# sh tar.sh & ##直接放到后台.用于开发人员写脚本.

正则表达式
开发正则(PERL) 复杂
使用范围:
Linux正则表达式(grep,egrep,sed,awk)

作用:使用正则表达式可以更快的找到想要找的内容.

#测试准备:
cat >>/etc/profile< export LC_ALL=C
EOF #<==注意EOF前后都没有空格或其他符号。
source /etc/profile #<==使修改的内容生效。

mkdir ~/test -p
cat >~/test/oldboy.txt< I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF
cd ~/test
cat oldboy.txt

[基础正则表达式]字符说明及实践:
使用特殊的符号,表示特殊的作用…

给要过滤的内容添加标识,然后把符合标识的内容过滤。

^ 尖角号,用法为^oldboy,表示匹配以oldboy单词开头的行

[root@oldboy test]# grep ^I oldboy.txt #输出以I开头的行
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!

[root@oldboy test]# ls -l ~|grep ^d #输出以d开头的行
drwxr-xr-x. 2 1000 root       33 Jul  1  2030 abc
drwxr-xr-x. 2 root root       45 Jun  6  2019 girlLove
drwxr-xr-x. 3 root root       17 May  8  2021 oldboy_dir
drwxr-xr-x. 2 root root       24 May 25 11:24 test

$ 美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行

[root@oldboy test]# grep m$ oldboy.txt #输出以m结尾的行
our site is http://www.oldboyedu.com

[root@oldboy test]# ls -lF ~|grep /$
drwxr-xr-x. 2 1000 root 33 Jul 1 2030 abc/
drwxr-xr-x. 2 root root 45 Jun 6 2019 girlLove/
drwxr-xr-x. 3 root root 17 May 8 2021 oldboy_dir/
drwxr-xr-x. 2 root root 24 May 25 11:24 test/

^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或者以KaTeX parse error: Expected 'EOF', got '#' at position 24: …ot@oldboy test]#̲ cat oldboy.txt… oldboy.txt

[root@oldboy test]# grep -n ^$ oldboy.txt #输出空行并打印行号
3:
7:

. 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)

[root@oldboy test]# grep . oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# grep -n . oldboy.txt
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:our site is http://www.oldboyedu.com
6:my qq num is 49000448.
8:not 4900000448.
9:my god ,i am not oldbey,but OLDBOY!

\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如.只表示小数点
[root@oldboy test]# grep “.” oldboy.txt #匹配带点的行
I teach linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
[root@oldboy test]# grep “.KaTeX parse error: Expected 'EOF', got '#' at position 14: " oldboy.txt #̲匹配以点结尾的行 I teac…” oldboy.txt #匹配以任意一个字符结尾的行
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

  • 重复前一个字符(连续出现)0次或N次
    0*
    包含:

    0
    00
    00000

[root@oldboy test]# grep “0*” oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# grep “00*” oldboy.txt
my qq num is 49000448.
not 4900000448.

注意,当重复0次的时候,表示啥也没有(空),即匹配所有内容

.* 组合符,匹配所有内容
[root@oldboy test]# grep “.*” oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

^.* 组合符,匹配以任意多个字符开头的内容

.*$ 组合符,以任意多个字符结尾的内容

测试题:
1.过滤/etc/passwd中以nologin结尾的行。
grep “nologin$” /etc/passwd

2.过滤/etc/passwd中以o开头的行。
grep “^o” /etc/passwd

3.过滤/etc/passwd中至少含有1个0字符串的行。
grep “00*” /etc/passwd

4.过滤/etc/passwd中的空行。
grep “^$” /etc/passwd

5.过滤/etc/目录中(不含子目录)下的所有文件。
ls -l /etc|grep “^-”

6.过滤/etc/services中含有点号的行。
grep “.” /etc/services

同时过滤多个字符串
egrep ==grep -E

[root@oldboy test]# grep -E “oldboy|linux” oldboy.txt
I am oldboy teacher!
I teach linux.
our site is http://www.oldboyedu.com
[root@oldboy test]#
[root@oldboy test]#
[root@oldboy test]#
[root@oldboy test]# grep -E “^m|mKaTeX parse error: Expected 'EOF', got '#' at position 129: …ot@oldboy test]#̲ [root@oldboy …” oldboy.txt
our site is http://www.oldboyedu.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!

[abc] 匹配任意一个字符
[root@oldboy test]# egrep “[abc]” oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!

[^abc] 取反
[root@oldboy test]# egrep “[^abc]” oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

扩展正则:
grep -E ====egrep

  • 匹配前一个字符1次或多次

和前面*区别,*可以匹配0次。

grep “0*” oldboy.txt #匹配0个0,或1个0或多个0
egrep “0+” oldboy.txt #1个0或多个0

[root@oldboy test]# grep “0*” oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy test]# egrep “0+” oldboy.txt
my qq num is 49000448.
not 4900000448.

? 匹配前一个字符0次或1次
[root@oldboy test]# egrep “0?” oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
:::
///
:d::f
/etc/oldboy//

| 表示或者,即同时过滤多个字符串
[root@oldboy test]# egrep “000|oldboy” oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
/etc/oldboy//

同时过滤多个字符串
egrep ==grep -E

[root@oldboy test]# grep -E “oldboy|linux” oldboy.txt
I am oldboy teacher!
I teach linux.
our site is http://www.oldboyedu.com
[root@oldboy test]#
[root@oldboy test]#
[root@oldboy test]#
[root@oldboy test]# grep -E “^m|mKaTeX parse error: Expected 'EOF', got '#' at position 129: …ot@oldboy test]#̲ [root@oldboy …” oldboy.txt
our site is http://www.oldboyedu.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!

老男孩Linux77期视频 老男孩老师亲授(202107最新录制)
https://www.bilibili.com/video/BV1n64y1t7yR

day9-10
网络知识
iptables
day11-12
搭建web服务
LNMP 搭建博客和知乎产品
了解网站访问的流程
数据库
day11-12
Shell编程

老男孩培训第十一天

HTTP的重要应用之一是WWW服务

HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,
是互联网中最常用的一种网络协议。HTTP的重要应用之一是WWW服务。设计HTTP协议最初的目的就是提供一种发布和接收HTML(一种页面标记语言)页面的方法。

WWW服务提供一种发布和接收HTML(一种页面标记语言)页面的应用。

HTTP协议的WWW服务应用的默认端口为80

加密的www服务,https的默认端口为443(openssl)

WWW,全称World Wide Web,常称为Web,中文译为“万维网”。 它是目前互联网上最受用户欢迎的信息服务形式。
HTTP协议的WWW服务应用的默认端口为80,另外的一个加密的WWW服务应用https的默认端口为443,主要用于网银、支付等和钱相关的业务。当今,HTTP服务、WWW服务、Web服务三者的概念已经混淆了,在本书中也视为相同,都是指当下最常见的网站服务应用。

静态:
静态语言html,css,js
静态资源.jpg,.avi,mp4,zip,rar
静态服务:Nginx(流行的静态服务软件),Apache,IIS(windowsweb服务软件)

动态:
动态语言:java(低于本科),python(万能\工具),go语言(高并发应用,用来替代C,C++).PHP(专注于网页开发)
动态资源:.jsp,.py,.php,.do
动态服务:PHP-fpm,java(tomcat,jboss,weblogic,resin),python,go

1.什么是LNMP?

2010前 LAMP Linux、Apache、MySQL、PHP(1999-2017,兄弟连 2-3个亿)
2010年后 LNMP,Linux Nginx MySQL(MariaDB) PHP/Python
LEMP,Linux Nginx(engine x) MySQL(MariaDB) PHP/Python
JAVA LNTM,Linux,Nginx,tomcat,MySQL

LNMP,Linux Nginx MariaDB PHP

数据库:存储数据的仓库(文本数据)
MySQL和MariaDB

MySQL被oracle公司收购10亿美金.创始人出来创建了一个MariaDB
linux 官方把MariaDB加入yum源.

**2.LNMP架构流程

**3搭建LNMP准备

1)关闭selinux:
setenforce 0
getenforce
sed -i ‘s#SELINUX=enforcing#SELINUX=disabled#g’ /etc/selinux/config

2)关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

**4.搭建LNMP架构

L N M P

  1. 使用官方仓库安装Nginx

yum revmove nginx -y ##卸载旧版本nginx
rpm -e nginx

##调整yum源优先级
[root@web01 ~]# rpm -qa yum-plugin-priorities
[root@web02 ~]# yum install yum-plugin-priorities -y

##配置yum源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/ r e l e a s e v e r / releasever/ releasever/basearch/
gpgcheck=0
priority=1

##安装Nginx 能够上网
[root@web01 ~]# yum install nginx -y

[root@oldboy ~]# nginx -v
nginx version: nginx/1.20.1

##配置Nginx进程运行的用户
[root@oldboy ~]# useradd -u1111 www -s /sbin/nologin -M
[root@oldboy ~]#
[root@oldboy ~]# egrep “^user” /etc/nginx/nginx.conf
user nginx;
[root@oldboy ~]# id www
uid=1111(www) gid=1111(www) 组=1111(www)
[root@oldboy ~]# sed -i ‘/^user/c user www;’ /etc/nginx/nginx.conf
[root@oldboy ~]# egrep “^user” /etc/nginx/nginx.conf
user www;

检查语法:大家应该不会出现
[root@oldboy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] mkdir() “/var/lib/nginx/tmp/client_body” failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed

[root@oldboy ~]# mkdir -p /var/lib/nginx/tmp/
[root@oldboy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@oldboy ~]# systemctl start nginx
[root@oldboy ~]# systemctl enable nginx ##开机自启动
[root@oldboy ~]# netstat -lntup|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1917/nginx: master
tcp6 0 0 :::80 :: LISTEN 1917/nginx: master

测试:
[root@oldboy ~]# curl 127.0.0.1

Thank you for using nginx.

windows上浏览器 10.0.0.7 (linux ip) Welcome to nginx!
  1. 使用第三方扩展源安装php7.1
    #(1)配置PHP安装源
    [root@oldboy ~]yum install epel-release -y
    [root@oldboy ~]wget https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --no-check-certificate
    [root@oldboy ~]rpm -Uvh webtatic-release.rpm
    #[root@oldboy ~]#安装PHP第三方源/etc/yum.repos.d/epel.repo

[root@web01 tools]# rpm -ql epel-release
/etc/yum.repos.d/epel.repo

root@web01 tools]# rpm -ql webtatic-release-7-3
/etc/yum.repos.d/webtatic.repo

#PHP下载地址:
https://us-east.repo.webtatic.com/yum/el7/x86_64/
https://uk.repo.webtatic.com/yum/el7/x86_64/

#(2)安装PHP及相关插件
#2.1)卸载旧版本的php
rpm -e $(rpm -qa|grep php)
rpm -qa|grep php

#2.2)安装PHP及相关插件
yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd -y
yum install php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd -y
yum install php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb -y
pwd

#2.4) 安装php7版本的软件【本地】
[root@web01 ~]# tar xf php.zip[root@oldboy ~]#提前去官方下载好,然后执行下面的安装
[root@web01 ~]# yum localinstall php/*.rpm -y

  1. 配置php-fpm用户与Nginx的运行用户保持一致
    [root@web01 ~]# sed -i ‘/^user/c user = www’ /etc/php-fpm.d/www.conf
    [root@web01 ~]# sed -i ‘/^group/c group = www’ /etc/php-fpm.d/www.conf
    [root@web01 blog]# egrep “user|group” /etc/php-fpm.d/www.conf
    user = www
    group = www

  2. 启动php-fpm,并将其加入开机自启
    [root@web01 ~]# systemctl start php-fpm
    [root@web01 ~]# systemctl enable php-fpm

[root@oldboy ~]# netstat -lntup|grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2246/php-fpm: maste

  1. 安装Mariadb数据库
    yum install mariadb-server mariadb -y
    [root@oldboy ~]# systemctl start mariadb
    [root@oldboy ~]# systemctl enable mariadb
    [root@oldboy ~]# netstat -lntup|grep mysql
    tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2577/mysqld

[root@oldboy ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
MariaDB [(none)]> quit

  1. 给Mariadb配置登陆密码,并是新密码进行登录数据库
    [root@web01 ~]# mysqladmin password ‘oldboy123’
    [root@web01 ~]# mysql -uroot -poldboy123
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    MariaDB [(none)]> quit
    LNMP搭建完了

4.LNMP架构配置及整体测试实战
配置主配置文件nginx.conf
更改yum源,重新安装下面就不用了
如果前面确保出现 wecome to nginx以下配置不需要执行
[root@oldboy blog]# vim /etc/nginx/nginx.conf

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;

}

配置虚拟主机配置文件 01_blog.etiantian.org.conf
[root@oldboy conf.d]# cd /etc/nginx/conf.d
[root@oldboy conf.d]# gzip default.conf
[root@oldboy conf.d]# vim 01_blog.etiantian.org.conf
#一个虚拟主机,或者一个网站
server {
server_name blog.etiantian.org;
listen 80;
root /data/blog;
index index.php index.html;

    location ~ \.php$ {
        root /data/blog;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}

[root@oldboy conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy conf.d]# systemctl reload nginx
[root@oldboy conf.d]# systemctl reload nginx

创建站点目录
mkdir -p /data/blog
chown -R www.www /data/blog

测试PHP服务:
[root@oldboy conf.d]# cd /data/blog/
cat >test.php<

EOF

[root@oldboy blog]# cat test.php

大家应该不会出现
http://10.0.0.7/test.php
File not found.
问题:去找了默认的server虚拟主机,没有找我们配置的blog虚拟主机
PHP Version 7.1.33

测试php连接mysql:
vim /data/blog/test_mysql.php

   

浏览器http://10.0.0.7/test_mysql.php
php连接MySQL数据库成功,oldboy安全8期

/data/blog:
index.html 验证nginx 虚拟主机静态是否成功.
test.php 访问.php的程序,看看nginx是否后抛给php,是否解析成功.
test_mysql.php #访问.php的程序,看看nginx是否后抛给php,是否解析成功.是否连接数据库成功.

测试方法:
[root@oldboy blog]# echo oldboy >index.html
[root@oldboy blog]# curl 10.0.0.7
oldboy
[root@oldboy blog]# curl 10.0.0.7/test.php
[root@oldboy blog]# curl 10.0.0.7/test_mysql.php
php连接MySQL数据库成功,oldboy安全8期

不带域名访问NGINX,默认会找第一个虚拟主机
[root@oldboy conf.d]# curl 10.0.0.7/

如何带域名测试:
windows:C:\Windows\System32\drivers\etc\hosts
10.0.0.7 blog.etiantian.org

linux:/etc/hosts
10.0.0.7 blog.etiantian.org

[root@oldboy conf.d]# curl -H “host:blog.eiantian.org” 10.0.0.7/test_mysql.php
php连接MySQL数据库成功,oldboy安全8期

安装wordpress软件
[root@oldboy blog]#cd /data/blog
[root@oldboy blog]# unzip latest-zh_CN.zip
[root@oldboy blog]# mv wordpress/* .
[root@oldboy blog]# chown -R www.www /data/blog

数据库:blog
用户:blog
密码:oldboy123
主机:localhost

创建数据库和用户:
[root@oldboy blog]# mysql -uroot -poldboy123
MariaDB [(none)]> create database blog;
MariaDB [(none)]> grant all on blog.* to blog@‘localhost’ identified by ‘oldboy123’;
MariaDB [(none)]> flush privileges;

操作:

老男孩培训第十二天
老男孩网络安全8期数据库
[MySQL数据库知识]

1)数据库种类:
关系型数据库:采用SQL语言操作
MySQL 互联网最广
Mariadb 比较少
oracle 传统企业 越来越落寞

NoSQL数据库
  redis(内存),mongodb,ES核心技术(ELK,ELFK)日志的数据.
NewSQL数据库
	TiDB  很火.
	Tdengine
  1. 安装Mariadb数据库
    yum install mariadb-server mariadb -y

3)启动并开机自启动
systemctl start mariadb
systemctl enable mariadb #设置开机自启动

/var/log/mariadb/mariadb.log
报错去这里看

检查端口是否存在.
netstat -lntup|grep 3306

4)Mariadb配置登陆密码
刚登录是没密码
5.6默认空密码 5.5.68-MariaDB
5.7一串随机数

给Mariadb配置登陆密码,并是新密码进行登录数据库
设置密码:
[root@web01 ~]# mysqladmin password ‘oldboy123’
[root@web01 ~]# mysql -uroot -poldboy123
Welcome to the MariaDB monitor. Commands end with ; or \g.
MariaDB [(none)]> quit

修改mysql root密码
[root@web01 ~]# mysqladmin -uroot -poldboy123 password ‘oldboy’ #此时密码是oldboy
[root@web01 ~]# mysql -uroot -poldboy

5)root密码忘了,怎么找回?
systemctl stop mariadb
/bin/sh /usr/bin/mysqld_safe --basedir=/usr --skip-grant-table &
–skip-grant-table #忽略授权表启动

操作:
[root@web01 ~]# mysql -uroot -poldboy123
MariaDB> UPDATE mysql.user SET password=PASSWORD(“oldboy123”) WHERE user=‘root’ and host=‘localhost’;
MariaDB> flush privileges;
MariaDB> quit

退出:
pkill mysqld
netstat -lntup|grep 330
systemctl start mariadb
mysql -uroot -poldboy123

mysql用户管理:root

1)查询有哪些用户
MariaDB> select user,host from mysql.user;
±-----±----------+
| user | host |
±-----±----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | oldboy |
| root | oldboy |
±-----±----------+
6 rows in set (0.00 sec)

root@主机名 ###才算是一个用户

2)删除用户
drop user ‘user’@‘主机域’;

练习:
drop user ‘root’@’::1’;
drop user ‘’@‘localhost’;
drop user ‘’@‘oldboy’;
drop user ‘root’@‘oldboy’;

MariaDB> select user,host from mysql.user;
±-----±----------+
| user | host |
±-----±----------+
| root | 127.0.0.1 |
| blog | localhost |
| root | localhost |
±-----±----------+
3 rows in set (0.00 sec)

3)创建用户
数据库是一个大的仓库:
库1
库2
库3

管理要点:一个仓库对一个管理员

root@localhost #只能本机本地使用root访问数据库

企业里创建用户一般是授权一个内网网段服务器登录。
方法1:10.0.0.%(%为通配符,匹配所有内容)。
10.0.0.0/24 一个网段

创建用户语法:
create user blog@‘10.0.0.%’ identified by ‘oldboy123’;
命令 用户 用户名 主机域 密码

创建实践:
MariaDB> create user blog@‘10.0.0.%’ identified by ‘oldboy123’; ##局域网连接
Query OK, 0 rows affected (0.00 sec)

MariaDB> select user,host from mysql.user;
±-----±----------+
| user | host |
±-----±----------+
| blog | 10.0.0.% | ================
| root | 127.0.0.1 |
| blog | localhost |
| root | localhost |
±-----±----------+
4 rows in set (0.00 sec)

使用create创建用户,默认是没有权限的;

查看已有的库:
MariaDB> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| blog |
| mysql |
| performance_schema |
| test |
±-------------------+
5 rows in set (0.01 sec)

查看用户权限:
MariaDB> show grants for blog@‘10.0.0.%’;
授权ALL权限,给wordpress库(必须存在)

MariaDB> grant all on blog.* to blog@‘10.0.0.%’;

授权命令解析.
grant all on blog .* to blog@‘10.0.0.%’;
命令 所有 库 库里所有表 用户 主机

上节内容使用:test root oldboy123 连接的数据库,但不标准
标准方法:使用blog用户和oldboy123密码连接.

一条命令实现创建和授权用户语法为:
grant all privileges on dbname.* to username@localhost identified by ‘passwd’;

grant all privileges on dbname.* to username@localhost identified by ‘passwd’
授权命令 对应权限 目标:库和表 用户名和客户端主机 用户密码

grant all privileges on wordpress.* to oldboy@localhost identified by ‘passwd’;

MariaDB> grant all privileges on blog.* to oldboy@localhost identified by ‘123’;
MariaDB> flush privileges;

企业生产创建用户给网站服务器授权一般更小.

SELECT 查询(数据) 浏览文章
INSERT 插入(数据) 发表文章
UPDATE 修改(数据) 修改文章
DELETE 删除(数据) 删除文章

grant SELECT,INSERT,UPDATE,DELETE on wordpress.* to oldboy@localhost identified by ‘passwd’;

=================================================================
grant all privileges on wordpress.* to oldboy@localhost identified by ‘passwd’ with grant option;
all privileges包含:

权限 说明
SELECT 查询(数据)
INSERT 插入(数据)
UPDATE 修改(数据)
DELETE 删除(数据)

CREATE 创建(数据库、表等对象)
DROP 删除(数据库、表等对象)
RELOAD 重载
SHUTDOWN 关闭

PROCESS 进程
FILE 文件
REFERENCES 参考资料
INDEX 索引
ALTER 修改(数据库、表等对象)
SHOW DATABASES 查看数据库
SUPER 超级权限
CREATE TEMPORARY TABLES 创建临时表
LOCK TABLES 锁表
EXECUTE 执行
REPLICATION SLAVE 从复制权限
REPLICATION CLIENT 从客户端复制
CREATE VIEW 创建视图
SHOW VIEW 查看视图
CREATE ROUTINE 创建存储过程
ALTER ROUTINE 修改存储过程
CREATE USER 创建用户
EVENT 事件
TRIGGER 触发器
CREATE TABLESPACE 创建表空间

数据库支持中文(字符集)
数据库的配置文件 /etc/my.cnf
配置数据库支持中文
1)备份
cp /etc/my.cnf{,.ori}

2)编辑/etc/my.cnf
[mysqld]
character-set-server=utf8mb4 ##服务器端字符集

[root@oldboy my.cnf.d]# vim /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8mb4

[client-mariadb]
default-character-set=utf8mb4

systemctl restart mariadb

库:
库里含有表,一个表就是一个excel的sheet.

查看有哪些库
MariaDB> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| blog | #blog项目库 一个excel文件.
±-------------------+
4 rows in set (0.05 sec)

进入指定的数据库
MariaDB> use blog; #cd /etc
MariaDB [blog]> select database(); #whoami
MariaDB> show tables; #查看一个库下面的所有表
MariaDB [blog]> select * from oldboy_users;

创建数据库:
create database oldboy;

MariaDB> create database oldboy;
MariaDB> show databases;

查看建库的语句:
MariaDB> show create database oldboy;
±---------±------------------------------------------------------------------+
| Database | Create Database |
±---------±------------------------------------------------------------------+
| oldboy | CREATE DATABASE oldboy /*!40100 DEFAULT CHARACTER SET latin1 */ |
±---------±------------------------------------------------------------------+
1 row in set (0.00 sec)

默认字符集是拉丁. 工作字符集:utf8,gbk,utf8mb4
create database oldboy; #<==默认数据库的字符集设置配置。

MariaDB [blog]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+
以上三个是系统的库.管理用的.

=数据库之表:==
1)查看表
方法1:进入到指定库查表
MariaDB> use blog;
MariaDB> show tables;

查看当前所在库:
MariaDB> select database();

查看当前用户:
MariaDB> select user();

2)创建表格
建表的基本命令语法为:
create table <表名> (
<字段名1> <类型1> ,

<字段名n> <类型n>);

其中,create table是关键字,不能更改,但是大小写可以变化。
下面是人工设计的建表语句示例,表名为student。

#建表语句
create table student1(
id int(10) not null,
name char(20) not null,
age tinyint(2) NOT NULL default ‘0’,
dept varchar(16) default NULL
);

CREATE TABLE student ( #<== CREATE TABLE是创建表的固定关键字,student为表名。
id int(4) NOT NULL, #<==学号列,数字类型,长度为4,不为空值。
name char(20) NOT NULL, #<==名字列,定长字符类型,长度20,不为空值。
age tinyint(2) NOT NULL DEFAULT ‘0’, #<==年龄列,很小的数字类型,长度为2,不为空,默认为0值。
dept varchar(16) DEFAULT NULL #<==系别列,变长字符类型,长度16,默认为空。
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #<==引擎和字符集,引擎默认为InnoDB,字符集,继承库的utf8。

表要在库下面

切换到blog库
MariaDB> use blog
Database changed

查看当前库
MariaDB> select database();

建表 表名student1
MariaDB> create table student(
-> id int(4) not null,
-> name char(20) not null,
-> age tinyint(2) NOT NULL default ‘0’,
-> dept varchar(16) default NULL
-> );

MariaDB> show tables;

查看表结构:
MariaDB> desc student1;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(4) | NO | | NULL | |
| name | char(20) | NO | | NULL | |
| age | tinyint(2) | NO | | 0 | |
| dept | varchar(16) | YES | | NULL | |
±------±------------±-----±----±--------±------+

查看建表的语句:
MariaDB> show create table student1;

CREATE TABLE student (
id int(4) NOT NULL,
name char(20) NOT NULL,
age tinyint(2) NOT NULL DEFAULT ‘0’,
dept varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

删除表:
drop table <表名>;
MariaDB [blog]> drop table student;

修改表名:
rename table 原表名 to 新表名;
MariaDB [blog]> show tables;
MariaDB [blog]> rename table student1 to student;

用户—权限-----库----表----数据

往表里插入数据
insert into <表名> [( <字段名1>[,…<字段名n > ])] values ( 值1 )[, ( 值n )];

MariaDB [blog]> desc student;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(10) | NO | | NULL | |
| name | char(20) | NO | | NULL | |
| age | tinyint(2) | NO | | 0 | |
| dept | varchar(16) | YES | | NULL | |
±------±------------±-----±----±--------±------+
4 rows in set (0.00 sec)

插入数据:
MariaDB> insert into student(id,name,age,dept) values(1,‘oldboy’,35,‘net sec’);

MariaDB [blog]> select * from blog.student;
±—±-------±----±--------+
| id | name | age | dept |
±—±-------±----±--------+
| 1 | oldboy | 35 | net sec |
±—±-------±----±--------+
1 row in set (0.00 sec)

MariaDB> insert into student values(2,‘oldgirl’,25,‘linux’);

MariaDB> insert into student values(3,‘littlegirl’,5,‘python’);

检查:
MariaDB> select * from student;
±—±-----------±----±--------+
| id | name | age | dept |
±—±-----------±----±--------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
±—±-----------±----±--------+
3 rows in set (0.00 sec)

搭建了博客,点发表文章,文章内容都是使用insert into 这样的SQL语句插入到数据库的

insert into student values(4,‘a’,25,‘linux’),(5,‘b’,21,‘net’);
MariaDB [blog]> select * from blog.student;
±—±-----------±----±--------+
| id | name | age | dept |
±—±-----------±----±--------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
±—±-----------±----±-------

插入中文乱码了

MariaDB [blog]> insert into student values(6,‘老男孩’,32,‘python linux net sec’);
Query OK, 1 row affected, 2 warnings (0.00 sec)

MariaDB [blog]> select * from blog.student;
±—±-----------±----±-----------------+
| id | name | age | dept |
±—±-----------±----±-----------------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 6 | ??? | 32 | python linux net | @@@@@@@@
±—±-----------±----±-----------------+
6 rows in set (0.00 sec)

数据库支持中文(字符集)
数据库的配置文件 /etc/my.cnf
配置数据库支持中文
1)备份
cp /etc/my.cnf{,.ori}

2)编辑/etc/my.cnf
[mysqld]
character-set-server=utf8mb4 ##服务器端字符集

[root@oldboy my.cnf.d]# vim /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8mb4

[client-mariadb]
default-character-set=utf8mb4

=============================================
systemctl restart mariadb 后登录.

备份blog数据库
mysqldump -uroot -poldboy123 -B blog >/tmp/a.sql

修改的内容:vim /tmp/a.sql ##内容多
create database blog DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE student (
id int(10) NOT NULL,
name char(20) NOT NULL,
age tinyint(2) NOT NULL DEFAULT ‘0’,
dept varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
##修改DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

查找字符集及校对规则:
MariaDB> show character set;
±---------±----------------------------±--------------------±-------+
| Charset | Description | Default collation | Maxlen |
±---------±----------------------------±--------------------±-------+
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |

还原修改过的数据库数据
mysql -uroot -poldboy123

插入中文:
MariaDB [blog]> insert into student values(6,‘老男孩’,32,‘python linux net sec’);
Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [blog]> select * from blog.student;
±—±-----------±----±-----------------+
| id | name | age | dept |
±—±-----------±----±-----------------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 6 | ??? | 32 | python linux net |
| 6 | ??? | 32 | python linux net |
| 6 | 老男孩 | 32 | python linux net | ###好了
±—±-----------±----±-----------------+
8 rows in set (0.00 sec)

6.1 SQL结构化查询语言介绍
6.1.1 什么是SQL?
SQL,英文全称为Structured Query Language,中文意思是结构化查询语言,它是一种对关系数据库中的数据进行定义和操作的语言,是大多数关系数据库管理系统所支持的工业标准语言。

DDL DDL全拼Data Definition Language,中文数据定义语言,主要关键字为CREATE(创建)、ALTER(修改)、DROP(删除)等,负责管理数据库的基础数据(不会对表的内容修改),例如:增删库、表、索引、用户等,这部分知识运维人员和开发人员都要熟悉。
执行MariaDB> ? Data Definition,可查相关帮助

DCL DCL全拼Data Control Language,中文数据控制语言,主要关键字为GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚),上文的TPL被这里的DCL包含了,这部分知识需要运维人员熟练。执行MariaDB> ? Account Management,可查相关帮助

DML DML全拼Data Manipulation Language,中文数据操作语言,主要关键字为SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改),主要针对数据库里的表里的数据进行操作,上文的DQL被这里的DML包含了,这部分知识开发人员要熟练,运维人员熟悉即可。
执行MariaDB> ? Data Manipulation,可查相关帮助

重要:
mysql帮助:打渔:
? Data Definition
? Data Manipulation
? Account Management

修改表中的数据
命令语法为:
update 表名 set 字段=新值,… where 条件;
MariaDB [blog]> update student set name=“老男孩” where id=6;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 0

MariaDB [blog]> select * from blog.student;
±—±-----------±----±-----------------+
| id | name | age | dept |
±—±-----------±----±-----------------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 6 | 老男孩 | 32 | python linux net |
| 6 | 老男孩 | 32 | python linux net |
| 6 | 老男孩 | 32 | python linux net |
±—±-----------±----±-----------------+
8 rows in set (0.00 sec)

MariaDB [blog]> update student set age=25 where name=‘oldboy’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [blog]> select * from blog.student;
±—±-----------±----±-----------------+
| id | name | age | dept |
±—±-----------±----±-----------------+
| 1 | oldboy | 25 | net sec |

删除表中的数据
命令语法为:
delete from 表名 where 表达式;
MariaDB [blog]> delete from student where id=4 or id=5;
Query OK, 2 rows affected (0.00 sec)

MariaDB [blog]> select * from blog.student;
±—±-----------±----±-----------------+
| id | name | age | dept |
±—±-----------±----±-----------------+
| 1 | oldboy | 25 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
| 6 | 老男孩 | 32 | python linux net |
| 6 | 老男孩 | 32 | python linux net |
| 6 | 老男孩 | 32 | python linux net |
±—±-----------±----±-----------------+
6 rows in set (0.00 sec)

MariaDB [blog]> delete from student where age>25;
Query OK, 3 rows affected (0.01 sec)

MariaDB [blog]> select * from blog.student;
±—±-----------±----±--------+
| id | name | age | dept |
±—±-----------±----±--------+
| 1 | oldboy | 25 | net sec |
| 2 | oldgirl | 25 | linux |
| 3 | littlegirl | 5 | python |
±—±-----------±----±--------+
3 rows in set (0.00 sec)

MariaDB [blog]> delete from student;
Query OK, 3 rows affected (0.00 sec)

MariaDB [blog]> select * from blog.student;
Empty set (0.00 sec)

明天:
select语句,很多条件 最复杂的
索引\备份\恢复
Shell编程

微信:网安8期名字
oldboy0102

老男孩培训第十三天

数据库 数据安全
1.不能丢\不能泄漏.
3.7*24
备份:
1.物理方式,TB,EB
拷贝物理文件备份:
1)cp拷贝物理文件(停机)
2)xtrabackup热备.
2.逻辑方式
1)以SQL语句新式把数据库的数据导出来(bak.sql).
2)mysqldump

3.小数据量备份mysqldump
-A 所有库
-B 备份多个库,并且加上use 库名
-B oldgirl oldboy test 备份3个库.

CREATE TABLE student (
id int(10) NOT NULL,
name char(20) NOT NULL,
age tinyint(2) NOT NULL DEFAULT ‘0’,
dept varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

MariaDB [oldboy]> insert into student values(6,‘老男孩’,32,‘python linux net sec’);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [oldboy]>
MariaDB [oldboy]> select * from student;
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
±—±----------±----±-----------------+
1 row in set (0.00 sec)

MariaDB [oldboy]> insert into student values(4,‘a’,25,‘linux’),(5,‘b’,21,‘net’);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

MariaDB [oldboy]> select * from student;
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
±—±----------±----±-----------------+
3 rows in set (0.00 sec)

MariaDB [oldboy]>

[root@oldboy ~]# mysqldump -uroot -poldboy123 -B oldboy|gzip >/opt/bak.sql.gz

[root@oldboy ~]# cd /opt/
[root@oldboy opt]# ll
-rw-r–r-- 1 root root 851 8月 6 08:53 bak.sql.gz
[root@oldboy opt]# gzip -d bak.sql.gz

[root@oldboy opt]# egrep -v “--|/|^$” bak.sql
USE oldboy;
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id int(10) NOT NULL,
name char(20) COLLATE utf8mb4_unicode_ci NOT NULL,
age tinyint(2) NOT NULL DEFAULT ‘0’,
dept varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
LOCK TABLES student WRITE;
INSERT INTO student VALUES (6,‘老男孩’,32,‘python linux net’),(4,‘a’,25,‘linux’),(5,‘b’,21,‘net’);
UNLOCK TABLES;

老大认为库没用了删了.
MariaDB [oldboy]> drop database oldboy;
Query OK, 1 row affected (0.02 sec)

恢复:

MariaDB [(none)]> create database oldboy;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show create database oldboy;
±---------±-------------------------------------------------------------------+
| Database | Create Database |
±---------±-------------------------------------------------------------------+
| oldboy | CREATE DATABASE oldboy /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
±---------±-------------------------------------------------------------------+
1 row in set (0.00 sec)

[root@oldboy opt]# mysql -uroot -poldboy123 [root@oldboy opt]# mysql -uroot -poldboy123 -e “select * from oldboy.student;”
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
±—±----------±----±-----------------+

[root@oldboy opt]# mysqldump -uroot -poldboy123 -A -B|gzip >/opt/bak.sql.gz
[root@oldboy opt]# mysql -uroot -poldboy123 -e “show databases;”
±-------------------+
| Database |
±-------------------+
| information_schema |
| blog |
| mysql |
| oldboy |
| oldboy_utf8 |
| performance_schema |
±-------------------+
[root@oldboy opt]# mysql -uroot -poldboy123 -e “drop database oldboy;”
[root@oldboy opt]# mysql -uroot -poldboy123 -e “drop database blog;”
[root@oldboy opt]# mysql -uroot -poldboy123 -e “drop database oldboy_utf8;”
[root@oldboy opt]# mysql -uroot -poldboy123 -e “show databases;”
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+

[root@oldboy opt]# cd /opt/
[root@oldboy opt]# gzip -d bak.sql.gz
gzip: bak.sql already exists; do you wish to overwrite (y or n)? y
[root@oldboy opt]# mysql -uroot -poldboy123 [root@oldboy opt]# mysql -uroot -poldboy123 -e “show databases;”
±-------------------+
| Database |
±-------------------+
| information_schema |
| blog |
| mysql |
| oldboy |
| oldboy_utf8 |
| performance_schema |
±-------------------+

企业中备份数据库:
mysqldump -uroot -poldboy123 -A -B|gzip >/opt/bak_$(date +%F).sql.gz

[root@oldboy opt]# crontab -l|tail -2

00 00 * * * /bin/sh /opt/bak.sh &>/dev/null
[root@oldboy opt]# cat /opt/bak.sh
mysqldump -uroot -poldboy123 -A -B|gzip >/opt/bak_$(date +%F).sql.gz

上述备份考虑不周全:
00:00 0点以前的所有数据 bak.sql.gz

10:00 drop database oldboy; 删除的数据包括0点以前,同时还包括00-10点的数据.

恢复成功:0点以前的所有数据
??? 00:00-10:00的数据 丢了

bin-log日志:日常更新数据的时候,把更新的语句插入到bin-log日志里.
数据库执行insert 语句… insert 语句同时放到bin-log日志里

增量恢复:

00:00 0点以前的所有数据 bak.sql.gz

10:00 drop database oldboy; 删除的数据包括0点以前,同时还包括00-10点的数据.

恢复成功:0点以前的所有数据
??? 00:00-10:00的数据 丢了

如果开始了日志,00:00-10:00的数据就会写到bin-log日志
重新恢复:
00:00 bak.sql.gz
00-10点的数据,记录00:00-10:00的数据bin-log日志,日志里drop语句删掉,然后把其他语句恢复到数据库.

vim /etc/my.cnf.d/server.cnf
在[mysqld]一节中增加下列配置:
[mysqld]
log-bin = /var/log/mariadb/oldboy-bin #开启binlog日志,记录对数据库修改的语句(insert,delete,update,create,drop)

日志文件:
/opt/oldboy-bin.index ##binlog日志文件列表
/opt/oldboy-bin.000001
/opt/oldboy-bin.000002

[root@oldboy opt]# systemctl restart mariadb
[root@oldboy opt]# ll /var/log/mariadb
总用量 28
-rw-r-----. 1 mysql mysql 18669 8月 6 09:37 mariadb.log
-rw-rw---- 1 mysql mysql 245 8月 6 09:37 oldboy-bin.000001
-rw-rw---- 1 mysql mysql 35 8月 6 09:37 oldboy-bin.index

现有数据:
MariaDB [oldboy]> select * from student;
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
±—±----------±----±-----------------+
3 rows in set (0.00 sec)

00:备份:bak.sql.gz
[root@oldboy opt]# mysqldump -uroot -poldboy123 -B oldboy|gzip >/opt/bak_oldboy.sql.gz

00-10 继续写数据
MariaDB [oldboy]> insert into student values(8,‘c’,22,‘l’),(9,‘j’,22,‘asdfas’);
MariaDB [oldboy]> select * from student;
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 8 | c | 22 | l |
| 9 | j | 22 | asdfas |
±—±----------±----±-----------------+
5 rows in set (0.00 sec)

10:00 部门老大,删除是没用的,drop database oldboy;

MariaDB [oldboy]> drop database oldboy;
Query OK, 1 row affected (0.00 sec)

5分钟后,运营部门 网站打不开了…技术开发连接不上数据库,数据库没了.
运维DBA赶紧看一下…
show databases;没有oldboy

[root@oldboy opt]# ll /var/log/mariadb
总用量 28
-rw-r-----. 1 mysql mysql 18669 8月 6 09:37 mariadb.log
-rw-rw---- 1 mysql mysql 245 8月 6 09:37 oldboy-bin.000001
-rw-rw---- 1 mysql mysql 35 8月 6 09:37 oldboy-bin.index

查binlog日志
mysqlbinlog oldboy-bin.000001 发现有人执行了drop database oldboy;

整个全备加增量备份的恢复过程.

1.恢复0点前数据
备份binlog(或者不记录binlog恢复)
[root@oldboy opt]# cd /var/log/mariadb
[root@oldboy mariadb]# cp * /opt/

[root@oldboy mariadb]# cd /opt/
[root@oldboy opt]# ll
-rw-r–r-- 1 root root 845 8月 6 09:56 bak_oldboy.sql.gz
[root@oldboy opt]# gzip -d bak_oldboy.sql.gz

[root@oldboy opt]# mysql -uroot -poldboy123 [root@oldboy opt]# mysql -uroot -poldboy123 -e “select * from oldboy.student;”
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
±—±----------±----±-----------------+

2.恢复0点-10点数据
这些数据再哪 binlog里,备份的binlog里
cd /opt
mysqlbinlog oldboy-bin.000001 >bin.sql
编辑vim bin.sql删除里面的drop database oldboy语句

[root@oldboy opt]# mysql -uroot -poldboy123 [root@oldboy opt]# mysql -uroot -poldboy123 -e “select * from oldboy.student;”
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 8 | c | 22 | l |
| 9 | j | 22 | asdfas |
±—±----------±----±-----------------+

MariaDB [oldboy]> select * from student;
±—±----------±----±-----------------+
| id | name | age | dept |
±—±----------±----±-----------------+
| 6 | 老男孩 | 32 | python linux net |
| 4 | a | 25 | linux |
| 5 | b | 21 | net |
| 8 | c | 22 | l |
| 9 | j | 22 | asdfas |
±—±----------±----±-----------------+
5 rows in set (0.00 sec)

MariaDB [oldboy]> select name from student;
±----------+
| name |
±----------+
| 老男孩 |
| a |
| b |
| c |
| j |
±----------+
5 rows in set (0.00 sec)

MariaDB [oldboy]> select name,age from student;
±----------±----+
| name | age |
±----------±----+
| 老男孩 | 32 |
| a | 25 |
| b | 21 |
| c | 22 |
| j | 22 |
±----------±----+
5 rows in set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age=21;
±-----±----+
| name | age |
±-----±----+
| b | 21 |
±-----±----+
1 row in set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age=21 and name=‘b’;
±-----±----+
| name | age |
±-----±----+
| b | 21 |
±-----±----+
1 row in set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age=21 and name=‘c’;
Empty set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age=21 or name=‘c’;
±-----±----+
| name | age |
±-----±----+
| b | 21 |
| c | 22 |
±-----±----+
2 rows in set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age>20;
±----------±----+
| name | age |
±----------±----+
| 老男孩 | 32 |
| a | 25 |
| b | 21 |
| c | 22 |
| j | 22 |
±----------±----+
5 rows in set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age<21;
Empty set (0.00 sec)

MariaDB [oldboy]> select name,age from student where age>25 and age<35;
±----------±----+
| name | age |
±----------±----+
| 老男孩 | 32 |
±----------±----+
1 row in set (0.00 sec)

=表的主键和索引==

数据库的索引就像书的目录一样,如果在[字段]上建立了索引,那么以[索引列为查询条件时可以加快查询数据的速度],这是MySQL优化的重要内容之一

主键索引:没有重复的,唯一值的列,定义为主键索引.查询数据按主键查找最快.
id 学号

普通索引:值不唯一 #对它的优化是开发 运维 DBA都要重视的.

主键索引:建表的时候建立
drop table test1;
CREATE TABLE test1 (
id int(4) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
sex char(4) DEFAULT NULL,
age tinyint(2) DEFAULT NULL,
qq varchar(15) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

说明:
AUTO_INCREMENT id列为自增
PRIMARY KEY (id) id列为主键

mysql> desc test1;
±------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±---------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| sex | char(4) | YES | | NULL | |
| age | tinyint(2) | YES | | NULL | |
| qq | varchar(15) | YES | | NULL | |
±------±------------±-----±----±--------±---------------+
5 rows in set (0.00 sec)

建表后插入数据:
insert into test1 values(1,‘oldboy’,‘male’,‘35’,‘4900048’);
insert into test1 values(2,‘oldgirl’,‘f’,‘25’,‘4900049’);

mysql> select * from test1;
±—±--------±-----±-----±--------+
| id | name | sex | age | qq |
±—±--------±-----±-----±--------+
| 1 | oldboy | male | 35 | 4900048 |
| 2 | oldgirl | f | 25 | 4900049 |
±—±--------±-----±-----±--------+
2 rows in set (0.00 sec)

MariaDB [oldboy]> insert into test1 values(2,‘oldgirl1’,‘f’,‘25’,‘4900049’);
ERROR 1062 (23000): Duplicate entry ‘2’ for key ‘PRIMARY’

普通查询:
mysql> select * from test1 where name=‘oldgirl’;
±—±--------±-----±-----±--------+
| id | name | sex | age | qq |
±—±--------±-----±-----±--------+
| 2 | oldgirl | f | 25 | 4900049 |
±—±--------±-----±-----±--------+
1 row in set (0.01 sec)

MariaDB [oldboy]> insert into test1 values(3,‘oldgirl1’,‘f’,‘25’,‘4900049’);
Query OK, 1 row affected (0.01 sec)

MariaDB [oldboy]> insert into test1 values(4,‘oldgi1’,‘fff’,‘33’,‘4900dd049’);
Query OK, 1 row affected (0.01 sec)

MariaDB [oldboy]> explain select * from test1 where name=‘oldgirl’\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)

检验查询是否走索引
mysql> explain select * from test1 where name=‘oldgirl’\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
type: ALL
possible_keys: NULL
key: NULL ##<==空的,没有走索引
key_len: NULL
ref: NULL
rows: 2 ##全表扫描
Extra: Using where
1 row in set (0.00 sec)

创建索引:
使用create为test表的name列创建普通索引。
create index index_name on test1(name);
创建 索引 名字 表 字段

mysql> create index index_name on test1(name);

mysql> desc test1;
±------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±---------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | MUL | NULL | |
| sex | char(4) | YES | | NULL | |
| age | tinyint(2) | YES | | NULL | |
| qq | varchar(15) | YES | | NULL | |
±------±------------±-----±----±--------±---------------+
5 rows in set (0.00 sec)
#MUL是创建索引标志
.
检验查询是否走索引
mysql> explain select * from test1 where name=‘oldgirl’\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
type: ref
possible_keys: index_name
key: index_name ##用到了索引
key_len: 60
ref: const
rows: 1 ##扫描了1行
Extra: Using index condition
1 row in set (0.01 sec)

检查按主键查询:
mysql> explain select * from test1 where id=2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
Extra: NULL
1 row in set (0.00 sec)

删除索引:
mysql> alter table test1 drop index index_name;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

在什么地方创建索引.
1.要查询的列上创建索引.
2.唯一值多的列创建索引.
3.多列上创建复合索引(唯一值多)

多列上创建复合索引
MariaDB [oldboy]> create index index_name_age_qq on test1(name,age,qq);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [oldboy]> desc test1;
±------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±---------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | MUL | NULL | |
| sex | char(4) | YES | | NULL | |
| age | tinyint(2) | YES | | NULL | |
| qq | varchar(15) | YES | | NULL | |
±------±------------±-----±----±--------±---------------+
5 rows in set (0.00 sec)

MariaDB [oldboy]> explain select * from test1 where name=“oldgirl” and age=25 and qq=4900049\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
type: ref
possible_keys: index_name_age_qq
key: index_name_age_qq
key_len: 62
ref: const,const
rows: 1
Extra: Using index condition
1 row in set (0.00 sec)

练习题:
1.登陆MySQL数据库。
2.查看当前登录的用户。
3.创建数据库oldboy,并查看已建库完整语句。
4.创建用户oldboy,使之可以管理数据库oldboy。
5.查看创建的用户oldboy拥有哪些权限。
5.查看当前数据库里有哪些用户。
6.进入oldboy数据库。
7.查看当前所在的数据库。
8.创建一张表test,字段id和name varchar(16)。
9.查看建表结构及表结构的SQL语句。
10.插入一条数据“1,oldboy”。
11.再批量插入2行数据 “2,老男孩”,“3,oldboyedu”。
12.查询插入的所有记录

跟老男孩学Linux运维:Shell编程实战
https://item.jd.com/12117874.html

1、为什么要学习Shell编程?
Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务,
例如:自动备份、监控、自动安装服务。

Shell编程是Linux运维人员必须要会的编程语言。最简单的编程语言。
编程也是运维人员必须具备的本领:

Shell、Python是运维人员必须具备的本领

运维时代:
手工----自动化(Shell)----平台化(Python,php)----智能化(机器人 2025人工智能时代 大数据 机器学习 深度学习)
—模块化(云计算\容器 kvm,openstack,docker,k8s 微服务)

运维58-周末安全 晚上备战高考 张杰 2万 C++ 反编译… 19岁

2、什么是Shell?
Shell就是一个命令解释器(翻译官),命令行的命令以及脚本都会通过shell解释,
传给操作系统,处理后在输出给用户。

[root@oldboyedu ~]# tail -1 /etc/passwd
oldgirl1❌8889:8889::/home/oldgirl1:/bin/bash #<==创建用户时,系统指定的翻译官。

3、Shell的分类

  1. Bourne shell
    Bourne shell又包括Bourne shell (sh)、Korn shell (ksh)、Bourne Again Shell(bash)三种类型。

  2. C shell
    C shell又包括csh、tcsh两种类型。

C7支持的shell:
[root@oldboyedu ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/sh是bash的软连接

4、C7:默认Shell
[root@oldboyedu ~]# echo $SHELL
/bin/bash

5、什么是Shell脚本?
程序、命令放入文件里执行,这个文件称之为Shell脚本文件。
工作中最多的编程写脚本,存放在文件里。

python函数 库文件
shell的函数 linux所有命令
不能做web管理,连接数据能力比较弱

6、Shell变量:

a.全局变量(环境变量)
在整个系统中生效、一般是大写、系统中默认就
存在一些这样的变量,满足系统和程序运行的需求。
系统自带的环境变量;
[root@oldboyedu ~]# echo $PS1
[[\e[34;1m]\u@[\e[0m][\e[32;1m]\H[\e[0m][\e[31;1m] \w[\e[0m]]$

[root@oldboyedu ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@oldboyedu ~]# echo $HOME
/root
[root@oldboyedu ~]# echo $SHELL
/bin/bash
[root@oldboyedu ~]# echo $UID
0

自定义环境变量:
方法1
export OLDBOY=“I am oldboy.”

方法2:
OLDBOY=“I am oldboy.”
export OLDBOY

[root@oldboyedu ~]# export OLDBOY=“I am oldboy.”
[root@oldboyedu ~]# echo $OLDBOY
I am oldboy.

export OLDBOY=“I am oldboy.” 写到文件里永久生效
/etc/profile==>/.bash_profile===>/.bashrc===>/etc/bashrc

老男孩推荐以后把环境变量放入/etc/bashrc
[root@oldboyedu ~]# tail -1 /etc/bashrc
export OLDBOY=“I am oldboy.”

[root@oldboyedu ~]# . /etc/bashrc ##重新生效

[root@oldboyedu ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 8: OLDBOY #̲<==输出一个变量内容就加变量名
I am oldboy.

安装java服务的时候就会配置环境变量。

让命令行变得有颜色:
[root@oldboy my.cnf.d]# vim /etc/profile
[root@oldboy my.cnf.d]# tail -1 /etc/profile
export PS1=’[\e[32;1m][\u@[\e[0m][\e[33;1m]\h \W]$ [\e[0m]’
[root@oldboy my.cnf.d]# source /etc/profile
[root@oldboy my.cnf.d]# echo $PS1
[\e[32;1m][\u@[\e[0m][\e[33;1m]\h \W]$ [\e[0m]

b.局部变量(普通变量)
是编写Shell脚本最常用的变量。

变量名=值
a=1

a是个杯子,1是水,a=1把水放入杯子

变量名:数字、字母、下划线,不能是数字开头。
oldboy、 123a、_abc
= 等号:赋值符,把什么东西给谁。赋值符号两边不能有空格。
值:东西,变量内容。
引用内容的符号:单引号、双引号、反引号、不加引号

[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# echo $a
1

[root@oldboyedu ~]# y=$x+1
[root@oldboyedu ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 25: …ot@oldboyedu ~]#̲ y="x+1"
[root@oldboyedu ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 25: …ot@oldboyedu ~]#̲ y='x+1’
[root@oldboyedu ~]# echo $y
KaTeX parse error: Expected 'EOF', got '#' at position 23: …ot@oldboyedu ~]#̲ let y="x+1" #<==让括号的内容进行计算。
[root@oldboyedu ~]# echo $y
2

[root@oldboy opt]# a="/etc/sysconfig/network-scripts"
[root@oldboy opt]# echo $a
/etc/sysconfig/network-scripts

7、表达式
[ 表达式 ] 中括号表达式,中括号里面两端必须要有空格。

字符串要加双引号
[root@oldboyedu ~]# [ “a” = “b” ] && echo 1||echo 0
0
[ “a” = “b” ] && echo 1||echo 0
如果表达式成立,打印1,否则打印0.

[ “a” = “b” ] && echo 1 #跟屁虫。
如果表达式成立,打印1
[ “a” = “b” ] || echo 0 #杠精。
如果表达式成立是假的,打印0
取反:
[ ! “a” = “b” ] && echo 1

[整数]表达式:

 -gt  (great than)

= -ge (great equal)
< -lt less than
<= -le
= -eq
不等于 -ne not equal

[] 必须要用或者写法

[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# [ $a -eq 2 ] && echo 1||echo 0
0
[root@oldboyedu ~]# [ $a -eq 1 ] && echo 1 || echo 0
1
注意:
1)整数表达式 两端必须要有空格
2)中括号里面两端必须要有空格。
3)变量和比较的内容,不需要加引号。

字符表达式:
[root@oldboy opt]# [ “a” = “b” ] &&echo 1||echo 0
0
[root@oldboy opt]# [ “a” = “a” ] &&echo 1||echo 0
1

-z 变量内容长度为0时,为真(表达式正确)。zero
-n 变量内容长度【不】为0时,为真(表达式正确)。not zero
a == a 字符串是否相同
说明:
1)字符串要加双引号

-z如果表达式长度为0,则真,否则则假.
-n如果表达式长度不为0,则真,否则则假.

例子:
[root@oldboyedu ~]# oldboy=“I am oldboy”
[root@oldboyedu ~]# [ -z “KaTeX parse error: Expected 'EOF', got '&' at position 11: oldboy" ] &̲& echo 1 || ech…oldboy” ] && echo 1 || echo 0
1
[root@oldboyedu ~]# [ -n “$oldboy” ] && echo 1 || echo 0
0
[root@oldboyedu ~]# [ “test” == “host” ] && echo 1 || echo 0
0
[root@oldboyedu ~]# [ “test” == “test” ] && echo 1 || echo 0
1

8.shell判断句 if:最广
如果…那么。

如果[ 你是潜力股 ]
那么
就和你谈朋友
否则
拜拜
果如

if判断句语法:

if [ 表达式 ]
then
命令
fi

如果[ 你是潜力股 ]
那么
就和你谈朋友
果如

[root@oldboy opt]# cat test.sh
#!/bin/bash
a=2
if [ $a -eq 1 ]
then
echo “我们谈恋爱吧”
else
echo “拜拜”
fi

监控free剩余小于100M报警
[root@oldboy opt]# a=$(free -m|awk ‘NR==2{print $4}’)
[root@oldboy opt]# echo $a
3302

[root@oldboy opt]# cat test.sh
#!/bin/bash
a=$(free -m|awk ‘NR==2{print $4}’)
if [ a − l t 4000 ] t h e n e c h o " 内 存 不 足 , 当 前 剩 余 a -lt 4000 ] then echo "内存不足,当前剩余 alt4000]thenecho",a"
else
echo “内存还够,当前有$a”
fi

[root@oldboyedu ~]# cat test.sh
#!/bin/bash
a=10
if [ $a -gt 1 ]
then
echo 1
fi

如果[ 你是潜力股 ]
那么
就和你谈朋友
否则
拜拜
果如

[root@oldboyedu ~]# cat test.sh
#!/bin/bash
a=1
if [ $a -gt 1 ]
then
echo 1
else
echo 0
fi

[root@oldboyedu ~]# cat test.sh
#!/bin/bash
boy=“潜力股”
if [ “$boy” == “潜力股” ]
then
echo “先和你谈谈朋友”
else
echo “白白”
fi
[root@oldboyedu ~]# sh test.sh
先和你谈谈朋友

[root@oldboyedu ~]# cat judge_date.sh
if [ $(date +%w) -eq 6 ]
then
echo “一起去旅游吧”
else
echo “还是好好上课吧”
fi
[root@oldboyedu ~]# sh judge_date.sh
还是好好上课吧
[root@oldboyedu ~]# date
Tue Apr 9 11:33:13 CST 2019
[root@oldboyedu ~]# date -s ‘2019/4/13’
Sat Apr 13 00:00:00 CST 2019
[root@oldboyedu ~]# sh judge_date.sh
一起去旅游吧

实现多条件
[root@oldboyedu ~]# cat judge_date.sh
if [ $(date +%w) -eq 6 ] || [ $(date +%w) -eq 0 ]
then
echo “一起去旅游吧”
else
echo “还是好好上课吧”
fi

read命令 交互式读取用户输入
-p “提醒信息:”
-t “多长时间内等待输入”

[root@oldboyedu ~]# read -p “请输入一句话:” boy
请输入一句话:潜力股
[root@oldboyedu ~]# echo $boy
潜力股

相当于boy=“潜力股”

[root@oldboyedu ~]# cat test.sh
#!/bin/bash
read -p “请输入你喜欢的男孩的一句话:” boy
if [ “$boy” == “潜力股” ]
then
echo “先和你谈谈朋友”
else
echo “白白”
fi

[root@oldboyedu ~]# sh test.sh
请输入你喜欢的男孩的一句话:我没钱
白白
[root@oldboyedu ~]# sh test.sh
请输入你喜欢的男孩的一句话:潜力股
先和你谈谈朋友

[root@oldboyedu ~]# cat test.sh
#!/bin/bash
read -p “请输入你喜欢的男孩的一句话:” boy
if [ “$boy” == “潜力股” ]
then
echo “先和你谈谈朋友”

elif [ “$boy” == “老爸是李刚” ]
then
echo “直接嫁给你”

elif [ “$boy” == “二环内有套房” ]
then
echo “立马领证”

else
echo “白白”
fi

练习题:Shell编程实现 两个整数比较大小

[root@oldboyedu ~]# cat com_num.sh
#!/bin/sh
read -p “请输入两个整数:” a b
if [ $a -gt b ] t h e n e c h o " b ] then echo " b]thenecho"a>$b"
elif [ $a -eq b ] t h e n e c h o " b ] then echo " b]thenecho"a= b " e l s e e c h o " b" else echo " b"elseecho"a<$b"
fi

[root@oldboyedu ~]# sh com_num.sh
请输入两个整数:2 3
2<3
[root@oldboyedu ~]# sh com_num.sh
请输入两个整数:3 3
3=3
[root@oldboyedu ~]# sh com_num.sh
请输入两个整数:3 4
3<4
[root@oldboyedu ~]# sh com_num.sh
请输入两个整数:3 2
3>2

特殊位置变量:
$1 脚本文件后接的第一个参数赋值给$1
$2 脚本文件后接的第二个参数赋值给$2

[root@oldboyedu ~]# cat t.sh
echo $1 $2
[root@oldboyedu ~]# sh t.sh oldboy oldgirl
oldboy oldgirl #<==oldboy就是$1输出的结果,oldgirl就是$2输出的结果。

[root@oldboyedu ~]# cat com_num.sh
#!/bin/sh
#read -p “请输入两个整数:” a b
a=$1
b=$2
if [ $a -gt b ] t h e n e c h o " b ] then echo " b]thenecho"a>$b"
elif [ $a -eq b ] t h e n e c h o " b ] then echo " b]thenecho"a= b " e l s e e c h o " b" else echo " b"elseecho"a<$b"
fi

[root@oldboyedu ~]# sh com_num.sh 2 3
2<3
[root@oldboyedu ~]# sh com_num.sh 2 2
2=2
[root@oldboyedu ~]# sh com_num.sh 3 2
3>2

$# 命令行参数的个数
$? 命令执行是否正确

9.for循环
for n in 取值列表
do
执行命令
done
结束条件:n轮询取值列表完毕

[root@oldboyedu ~]# cat for1.sh
for n in 1 2 3 4 5
do
echo $n
done
[root@oldboyedu ~]# sh for1.sh
1
2
3
4
5
[root@oldboyedu ~]# sh -x for1.sh

  • for n in 1 2 3 4 5
  • echo 1
    1
  • for n in 1 2 3 4 5
  • echo 2
    2
  • for n in 1 2 3 4 5
  • echo 3
    3
  • for n in 1 2 3 4 5
  • echo 4
    4
  • for n in 1 2 3 4 5
  • echo 5
    5

[root@oldboyedu ~]# cat for1.sh
for n in {1…5}
do
echo $n
done
[root@oldboyedu ~]# sh for1.sh
1
2
3
4
5

打印254个IP
10.0.0.1—10.0.0.254
[root@oldboyedu ~]# cat for1.sh
for n in {1…254}
do
echo “10.0.0.$n”
done

书写脚本习惯:
1.以.sh结尾。
2.脚本开头第一行 #!/bin/bash 脚本内容由谁解释。
由于Linux下默认是bash,所以也可以不写这一行。

课后练习:
1、判断日期,每周六日去旅游,其它时间上课。
2、取出当前系统Ip地址,判断是否为10.0.0.31,如果是提示正确,如果不是给出提示。
3、打印10.0.0.1–10.0.0.254个Ip地址,当IP地址为系统IP地址时,给出某IP是系统IP的提示。

解答1:
echo $(date +%w)

[root@oldboy opt]# cat a1.sh
#!/bin/sh
date=$(date +%w)
if [ $date -eq 6 -o $date -eq 7 ]
then
echo “一起旅游吧”
else
echo “还是上课吧”
fi

[root@oldboy opt]# date -s “2021/08/07”
2021年 08月 07日 星期六 00:00:00 CST
[root@oldboy opt]# sh a1.sh
一起旅游吧
[root@oldboy opt]# date -s “2021/08/08”
2021年 08月 08日 星期日 00:00:00 CST
[root@oldboy opt]# sh a1.sh
一起旅游吧
[root@oldboy opt]# date -s “2021/08/09”
2021年 08月 09日 星期一 00:00:00 CST
[root@oldboy opt]# sh a1.sh
还是上课吧

解答2:

[root@oldboy opt]# ifconfig|awk ‘NR==2{print $2}’
10.0.0.7

[root@oldboy opt]# cat a2.sh
#!/bin/sh
ip=$(ifconfig|awk 'NR==2{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') if [ "ip" == “10.0.0.31” ]
then
echo “这是系统IP $ip”
else
echo “不是系统ip $ip”
fi

[root@oldboy opt]# sh a2.sh
不是系统ip 10.0.0.7

3、打印10.0.0.1–10.0.0.254个Ip地址,当IP地址为系统IP地址时,给出某IP是系统IP的提示。
解答:
[root@oldboy opt]# cat a3.sh
#!/bin/sh
for n in {1…254}
do
if [ “ n " = = " 7 " ] t h e n e c h o " 当 前 I P 是 系 统 I P 10.0.0. n" == "7" ] then echo "当前IP 是系统IP 10.0.0. n"=="7"]thenecho"IPIP10.0.0.n”
break;
fi
done

你可能感兴趣的:(Linux,linux)