- 1 Linux学习的几个阶段
- 2 Linux学习方法
- 3 课程内容
- 4 linux和unix的关系
- 5 安装虚拟机VM(Virtual Machine)和CentOS
- 6 虚拟机的克隆
- 7 虚拟机快照
- 8 虚拟机的迁移和删除
- 9 安装vmtools
- 10 linux目录结构
- 11 远程登陆到Linux服务器
- 12 vi和vim编辑器
- 13 开机、重启和用户登陆注销
- 14 用户管理
- 15 实用指令
- 16 组管理和权限管理
- 17 定时任务调度
- 18 Linux磁盘分区、挂载
- 19 网络配置
- 系统启动的时候网络接口是否有效(yes/no)
- IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
- IP地址
- 网关
- 域名解析器
- 20 进程管理(重点)
- 21 RPM与YUM
- 22 Linux之JavaEE定制篇-搭建JavaEE环境
- 23 大数据定制篇-shell编程
- 非空返回true,可使用$?验证(0为true,>1为false)
1 Linux学习的几个阶段
- 第一阶段:熟悉Linux环境下基本的操作命令
- 熟悉Linux的各种配置(例如环境变量的配置、网络的配置、服务的配置)
- 学会Linux环境下如何搭建各种开发环境
- 能够写一下基本的shell脚本,对Linux服务器进行维护
- 能够进行安全设置防止攻击,保障服务器的正常运行,能对系统进行调优。
- 深入理解Linux的内核,熟练掌握大型网站应用框架的组成并熟悉各个环节的部署和维护
2 Linux学习方法
- 首先建立整体的框架,然后再细节
- 不需要掌握所有的指令,但是要会查询手册或者百度
- 先know how再know why
- 做中学
- 适当的囫囵吞枣
- linux不是编程,重点是实际操作,各种常用指令一定要玩得溜
3 课程内容


4 linux和unix的关系

5 安装虚拟机VM(Virtual Machine)和CentOS
学习Linux需要一个环境,我们需要创建一个VM(虚拟机),然后在虚拟机上安装一个CentOs系统来学习
Linux主要发行版本有Ubuntu、RedHat、CentOs、Fedora、SuSE、openSUSE。Centos只是Linux的其中一个发行版本
- 先安装virtual machine 15.5
- 再安装Linux (CentOS 7.6/CentOS 8.1)
- 原理示意图
5.1 下载vmware15.5
官方地址:https://www.vmware.com/cn.html

其他地址:https://www.nocmd.com/windows/740.html
5.2 下载CentOS
CentOS 7.6下载地址:CentOS-7-x86_64-DVD-1810.iso CentOS 7.6 DVD版 4G(目前主流的生产环境)
http://mirrors.163.com/centos/7.6.1810/
下载速度比较慢可以在迅雷下载
CentOS-8.1.1911-x86_64-dvd1.iso CentOS 8.1 DVD版 8G(未来的主流)
http://mirrors.163.com/centos/8.1.1911/
5.3 VM安装步骤
- 去BIOS里面修改设置开启虚拟化设备支持,具体步骤见https://jingyan.baidu.com/article/ab0b56305f2882c15afa7dda.html
- 右键点击vmware 15.5的exe安装文件以管理员身份运行开始安装CentOS 7.6,
具体安装步骤见:韩顺平教育 安装VMWare15.5.docx
5.4 CentOS安装步骤
具体安装步骤见CentOS7.6安装步骤.md
5.5 网络连接的三种模式
桥接模式:如果虚拟机想要跟外界进行通信,那么它的IP地址必须和外界的网络是同一个网段。但是这种模式容易造成IP冲突。
NAT模式:网络地址转换模式,虚拟系统可以和外部系统通讯,不造成IP冲突。但是内网的虚拟的linux可以到外部去,但是外部不可以到虚拟的linux去。
主机模式:独立的系统

6 虚拟机的克隆
如果你已经安装了一台linux操作系统,你还想要更多的,例如你想做一个集群,这时候没有必要再重新安装,你只需要克隆就行了
方式一:直接拷贝一份安装好的虚拟机文件
方式二:使用vmware的克隆操作
**注意:克隆时需要先关闭linux系统**
6.1 方式一:直接拷贝虚拟机文件
第一步:找到已经安装好的虚拟机安装的位置,拷贝这个目录到另一个地方

第二步:在虚拟机软件中打开这个拷贝的虚拟机

6.2 方式二:使用vmware的克隆操作
**注意:克隆时需要先关闭linux系统**
- 第一步
- 第二步:
- 第三步:
- 第四步:
- 第五步:
- 第六步:
7 虚拟机快照
如果你在使用虚拟机系统的时候(比如Linux),你想回到原先的某一个状态,也就是说你担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态,vmware也提供了这样的功能,就叫快照管理。
应用示例:
1、安装好系统以后,先做一个快照A
2、进入系统,创建一个文件夹,在保存一个快照B
3、回到系统刚刚安装好的状态,即快照A
4、试试看,是否还能再次回到快照B
5、示意图

- 第一步:拍摄快照
- 第二步:给拍摄的快照命名为快照A
- 第三步:在桌面上创建一个文件夹
- 再次拍摄一个快照,命名为快照B
- 再创建一个文件夹
- 此时的桌面就有两个刚创建的文件夹hello和hello2了
- 再次拍摄一个快照,命名为快照C
- 打开快照管理器
- 利用快照管理器回到A状态
- 然后等待虚拟机重启后就回到了A状态,发现此时桌面没有之前创建的文件夹A和B了
- 再从快照A回到快照B
- 回到快照B后发现桌面出现了之前创建的文件夹A
- 再这个基础之上再创建一个文件夹hello3
- 再拍一个快照D
- 此时的虚拟机快照管理器的结构图
8 虚拟机的迁移和删除
我们在前面讲过,虚拟机系统安装好了,它的本质就是一个文件(放在文件夹里的)。因此虚拟系统的迁移很方便,你可以把安装好的虚拟系统这个文件夹整体拷贝或者剪切到另一个位置使用。删除也很简单,用vmware进行移除,再点击菜单,从磁盘删除即可。或者直接手动删除虚拟系统对应的文件夹即可。
8.1 vmware移除虚拟机
- 第一步:这里的移除只是把这个指向移除了,但是文件并没有真正删除

- 如果要彻底移除还需要手动去删除这个系统对应的文件夹
8.2 虚拟机的迁移
只需要把虚拟的文件夹剪切或者拷贝到另一个地方使用即可
9 安装vmtools
vmtools安装后,可以让我们在windows下更好的管理vm虚拟机
可以设置windows和centos的共享文件夹
示意图:

注意:安装vmtools,需要有gcc
可以使用指令
gcc -v来判断是否安装了gcc,如果没有安装就会提示找不到
9.1 安装步骤
- 进入centos,先弹出光驱
- 点击vm菜单的->install vmware tools

安装成功后桌面会出现一个VMware Tools,如下图
- 打开上图的这个光盘图标,会出现一个vm的安装包,xx.tar.gz
- 把上图的tar.gz文件拷贝到/opt目录下
- 使用解压命令tar,得到一个安装文件
第一步:进入终端使用指令cd /opt进入到opt目录下
第二步:使用指令tar -zxvf指向这个tar.gz文件
解压完成后多出了一个蓝色的目录
使用指令cd xxx进入到解压的目录下
- 进入该vm解压的目录
- 安装./vmware-install.pl,然后就是一系列的回车就行了
- 全部使用默认设置即可,如果看到以下就表示安装成功
9.2 在windows操作系统上建立一个共享文件夹
此处省略
9.3 在虚拟机软件启用共享文件夹
第1步:

第2步

第3步:选择共享文件夹的位置

第4步

9.4 在linux中使用这个共享文件夹
第1步

第2步:进入到mnt/hgfs/目录下,会发现有一个myshare文件夹,这个就是共享文件夹

第3步:可以进入这个myshare目录里面做任何操作,都可以同步到windows系统上的那个myshare目录
9.5 注意事项和细节说明
windows和centos就可以共享文件了,在实际开发中,文件上传下载是需要使用远程方式完成的(后面会讲)
10 linux目录结构
10.1 基本介绍
linux的文件系统是采用层级式的树状目录结构,在此结构中的最上层是根目录/,然后在此目录下再创建其他的目录。
在Linux的世界里,一切皆文件
示意图:

10.2 Linux具体的目录结构
具体的目录结构(不用背,知道即可)
- /bin 【常用】(/usr/bin、/usr/local/bin)
是Binary的缩写,这个目录存放着最经常使用的命令 - /sbin (/usr/sbin、/usr/local/sbin)
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 - /home【常用】
存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名 - /root【常用】
该目录为系统管理员,也称作超级权限者的用户主目录 - /lib
系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库 - /lost+found
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 可以通过终端进入根目录下输入指令ls的方式查看 - /etc【常用】
所有的系统管理所需要的配置文件和子目录比如安装了mysql数据库 my.conf - /usr【常用】
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。 - /boot【常用】
存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 - /proc【不能动】
这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。 - /srv【不能动】
service缩写,该目录存放一些服务启动之后需要提取的数据 - /sys【不能动】
这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 - /tmp
这个目录是用来存放一些临时文件的 - /dev
类似于windows的设备管理器,把所有的硬件用文件的形式存储 - /media【常用】
linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下 - /mnt【常用】
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容了 - /opt
这是给主机额外安装软件所存放的目录。如安装ORACLE数据库就可以放在该目录下。默认为空,一把来讲把安装文件拷贝到opt目录下面去(约定俗成) - /usr/local【常用】
这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序。和/opt的区别就是:/opt时用来存放安装文件的,而/usr/local是用来存放安装好了以后软件存放的目录 - /var【常用】
这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件 - /selinux 【security-enhanced linux】
SELinux是一种安全子系统,它能控制程序只能访问特定文件,有三种工作模式,可以自行设置
11 远程登陆到Linux服务器
说明: 公司开发时候, 具体的应用场景是这样的
1、linux服务器是开发小组共享的
2、正式上线的项目是运行在公网的.
3、 因此程序员需要远程登录到Linux进行项目管理或者开发.
4、画出简单的网络拓扑示意图(帮助理解)

5、远程登录客户端有 Xshell5, Xftp5 , 我们学习使用 Xshell5 和 Xftp , 其它的 远程工具大同小异
11.1 远程登陆Linux-Xshell6
可以使用指令ping ip的方式测试两台机器是否网络畅通
11.1.1 下载
下载地址:https://www.netsarang.com/en/free-for-home-school/
下载free-for-home-school版本
11.1.2 安装
以管理员身份运行,一直next即可,尽量别把安装目录选择到C盘
11.1.3 使用
第1步

第2步

第3步

第4步

第5步

第6步

第7步:成功登陆

11.2 远程文件传输-Xftp6
11.2.1 下载
下载地址:https://www.netsarang.com/en/free-for-home-school/
下载free-for-home-school版本
11.2.2 安装
以管理员身份运行,一直next即可,尽量别把安装目录选择到C盘
11.2.3 使用
第1步

第2步

第3步

第4步

第5步

第6步

第7步:登陆成功

第8步:选中文件右键点击传输就可以给linus传输文件了

11.2.4 如何处理xftp的中文乱码问题

12 vi和vim编辑器
12.1 介绍
Linux系统内置vi文本编辑器
Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别 语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别 丰富,在程序员中被广泛使用
12.2 vi和vim常用的三种模式
正常模式
- 以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用 『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件数据。
插入模式
- 按下i, I, o, O, a, A, r, R等任何一个字母之后才会进入编辑模式, 一般来说按i即可.
命令行模式
- 在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的 动作则是在此模式中达成的!
12.3 vi和vim基本使用
【入门案例】:使用 vim 开发一个 Hello.java 程序, 保存
基本步骤:
第1步:使用vim指令开发一个Hello.java程序

第2步:回车后进入的模式就是正常模式
第3步:输入字母i,就进入了插入模式。进入插入模式后命令行窗口左下角就会显示插入

第4步:然后开始编辑程序
public class Hello {public static void main(String[] args) {System.out.println("hello world");}}
第5步:编写完成后,先输入Esc然后输入:就从插入模式切换到命令行模式了,最后输入wq表示写入退出,这时候就保存了这个程序
12.4 各种模式的相互切换

12.5 vi和vim快捷键
快捷键使用练习
- 拷贝当前行 yy , 拷贝当前行向下的5行 5yy,并粘贴(输入p)。 注意:拷贝是要在一般模式下使用
- 删除当前行 dd , 删除当前行向下的5行 5dd
- 在文件中查找某个单词 [命令行下 /关键字 , 回车 查找 , 输入 n 就是查找下一个 ]
- 设置文件的行号,取消文件的行号.[命令行下 : set nu 和 :set nonu]
- 编辑 /etc/profile 文件,在一般模式下,使用快捷键到底文档的最末行[G]和最首行[gg]
- 在一个文件中输入 “hello” ,在一般模式下,然后又撤销这个动作 u
- 编辑 /etc/profile 文件,在一般模式下, 输入20,再输入shift+g就能将光标定位到20行
- 更多的看整理的文档
13 开机、重启和用户登陆注销
13.1 关机&重启命令
基本介绍
shutdown –h now 立该进行关机
shudown -h 1 "hello, 1 分钟后会关机了" 会给每一个登陆到该linux操作系统的用户发一条消息(双引号里面的内容),然后过1分钟后关机,如果只输入shutdown,什么都不填则默认代表shutdown -h 1
shutdown -r now 立即重启,等价于reboot
halt 关机,和上面一样
reboot 立刻重启
sync 把内存的数据同步到磁盘
注意细节:
- 不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中
- 目前的shutdown/reboot/halt等命令均已经在关机前进行了sync。
13.2 用户登录和注销
基本介绍
- 登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可 以利用普通用户登录, 登录后再用
su - 用户名命令来切换成系统管理员身份 - 在提示符下输入 logout 即可注销用户
使用细节
- logout 注销指令在图形运行级别无效,在 运行级别 3下有效,如在图形运行级别下执行logout指令会提示
logout:不是登陆 shell:使用exit - 运行级别这个概念,后面给大家介绍
14 用户管理
14.1 基本介绍
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
14.2 添加用户
基本语法
useradd 用户名
应用案例
案例1:添加一个用户milan,默认该用户的家目录在/home/milan
细节说明
- 当创建用户成功后,会自动的创建和用户同名的家目录
- 也可以通过
useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
14.3 指定/修改密码
基本语法
passwd 用户名
应用案例
案例1:给milan指定密码
passwd milan
补充
- 显示当前用户所在的目录可以用指令
pwd - 如果passwd后面没有指定用户名就是当前登陆的这个用户
14.4 删除用户
基本语法
userdel 用户名
应用案例
删除用户milan,但是要保留家目录
userdel milan
删除用户同时用户的家目录,比如tom
userdel -r tom
细节说明
是否保留家用户?
一般情况下建议保留
14.5 查询用户信息指令
基本语法
id 用户名
应用案例
案例1:请查询root信息
细节说明
当用户不存在时,返回无此用户
14.6 切换用户
介绍
在操作Linux中,如果当前用户的权限不够,可以通过 su - 指令,切换到高权限用户,比如root
基本语法
su - 用户名
应用案例
案例1:创建一个用户jack,指定密码,然后切换到jack。
细节说明
- 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
- 当需要返回到原来用户时,使用logout/exit指令
14.7 查看当前用户/登录用户
基本语法
whoami或者who am i
细节说明
whoami显示的是第一次登陆到这个系统的用户信息
14.8 用户组
介绍
类似于角色,系统可以对有共性的多个用户进行统一的管理。

新增组
指令:groupadd 组名
案例演示
groupadd wudang
删除组
指令:groupdel 组名
案例演示
groupdel wudang
增加用户时直接加上组
指令:useradd -g 用户组 用户名
案例演示:增加一个用户zwj,直接将他指定到wudang
groupadd wudanguseradd -g wudang zwj
细节说明
如果在添加用户的时候没有指定组,会默认生成一个跟这个用户名相同的组,并把这个用户放到这个组里面。
修改用户的组
指令:usermod -g 用户组 用户名
案例演示:创建一个组mojiao,把zwj放入到mojiao
groupadd mojiaousermod -g mojiao zwj
14.9 用户和组的相关文件
/etc/passwd 文件
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

/etc/shadow 文件
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
/etc/group 文件
组(group)的配置文件,记录Linux包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
15 实用指令
15.1 指令运行级别
15.1.1 基本介绍
运行级别说明
0 :关机
1 :单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用运行级别是3和5,也可以指定默认运行级别,后面演示
15.1.2 应用实例
命令:init [0123456]
案例1: 通过init 来切换不同的运行级别,比如动 5-3 , 然后关机
15.1.3 CentOS7 后运行级别说明
在centos7以前,可以在/etc/inittab文件中进行修改,
在centos7后进行了简化,如下,
multi-user-target: analogous to runlevel 3graphical.target: analogous to runlevel 5
可以通过以下指令来查看当前默认指令运行级别是什么
systemctl get-default
可以通过以下指令来设置默认运行级别,例如设置默认运行级别为3
systemctl set-default multi-user.target
15.2 如何找回root密码
面试题:如何找回root密码?
课堂练习
- 假设我们的root密码忘记了,请问如何找回密码?
具体步骤见韩顺平教育—linux找回root密码.docx - 请设置我们的 运行级别,linux 运行后,直接进入到 命令行终端(3)
15.3 帮助指令
man 获得帮助信息
man [命令或配置文件](功能描述:获得帮助信息)
应用案例:查看ls命令的帮助信息
man ls
补充:在linux下,隐藏文件是以.开头的,选项可以组合使用,比如**ls -al** 比如 **ls -al /home**
退出是按q
help指令
基本语法:help 命令
功能描述:获得shell内置命令的帮助信息
应用案例:查看cd命令的帮助信息
help cd
百度帮助更直接
虽然上面两个都可以来获取指令帮助,但是需要英语功底,如果英语不太好的,我还是 推荐大家直接百度靠谱。
15.4 文件目录类
15.4.1 pwd指令
基本语法:pwd
功能描述:显示当前工作目录的绝对路径
应用案例:显示当前工作目录的绝对路径
pwd
绝对路径和相对路径的区别

15.4.2 ls指令
基本语法:ls [选项] [目录或是文件]
常用选项:
- -a:显示当前目录所有的文件和目录,包括隐藏的
- -l:以列表的方式显示信息
应用案例:查看当前目录的所有内容信息
15.4.3 cd指令
基本语法:cd [参数]
功能描述:切换到指定目录
理解:绝对路径和相对路径
cd ~或者cd回到自己的家目录,比如:你是root,输入cd ~ 就回到/root目录cd ..回到当前目录的上一级目录
应用案例:
案例1:使用绝对路径切换到root目录
cd /root
案例2: 使用相对路径到/root 目录,比如现在在/home/tom
cd ../../root/
案例3:表示回到当前目录的上一级目录
cd ..
案例4:回到家目录
cd ~
15.4.3 mkdir指令
功能描述:mkdir指令用于创建目录
基本语法:mkdir [选项] 要创建的目录
常用选项:
- -p:创建多级目录
应用案例:
案例1:创建一个目录 /home/dog
mkdir /home/dog
案例2:创建多级目录 /home/animal/tiger
mkdir -p /home/animal/tiger
15.4.4 rmdir指令
功能描述:rmdir指令删除空目录
基本语法:rmdir [选项] 要删除的空目录
应用案例:
案例1:删除一个目录 /home/dog
rmdir /home/dog
使用细节
- rmdir 删除的是空目录,如果目录下有内容时无法删除的
- 提示:如果需要删除非空目录,需要使用
rm -rf要删除的目录
15.4.5 touch指令
功能描述:touch指令创建空文件
基本语法:touch 文件名称
应用案例:
案例1: 创建一个空文件 hello.txt
touch hello.txt
15.4.6 cp指令
功能描述:cp 指令拷贝文件到指定目录
基本语法:cp [选项] source dest
常用选项:
- -r:递归复制整个文件夹
应用案例:
案例1: 将 /home/aaa.txt 拷贝到 /home/bbb 目录下
cp /home/aaa.txt /home/bbb
案例2: 递归复制整个文件夹,举例:比如将home/bbb整个目录,拷贝到/opt
cp -r /home/bbb /opt
使用细节
强制覆盖不提示的方法:\cp
例如:再一次将home/bbb整个目录,拷贝到/opt,如果按照之前的方式则会提示是否覆盖同名的文件,如果不想提示则可以使用
\cp -r /home/bbb /opt
15.4.7 rm指令
功能描述:rm 指令移除文件或目录
基本语法:rm [选项] 要删除的文件或目录
基本选项:
- -r :递归删除整个文件夹
- -f : 强制删除不提示
应用案例:
案例1: 将 /home/hello.txt 删除
rm /home/hello.txt
案例2: 递归删除整个文件夹 /home/bbb
rm -rf /home/bbb
使用细节
强制删除不提示的方法:带上 -f 参数即可
15.4.8 mv指令
功能描述:mv 移动文件与目录或重命名
基本语法:
mv oldNameFile newNameFile 功能描述:重命名
mv /temp/movefile /targetFolder 功能描述:移动文件
应用案例:
案例1: 将 /home/cat.txt 文件 重新命名为 pig.txt
cd /hometouch cat.txtmv cat.txt pig.txt
案例2:将 /home/pig.txt 文件 移动到 /root 目录下
cd /homemv pig.txt /root/
案例3:将/home/pig.txt文件移动到/root目录下并且重名为fish.txt
cd /homemv pig.txt /root/fish.txt
案例4:移动整改目录,比如将/opt/bbb 移动到/home下
cd /optmv bbb/ /home/
15.4.9 cat指令
功能描述:cat 查看文件内容
基本语法:cat [选项] 要查看的文件
常用选项:
- -n :显示行号
应用案例:
案例1: /etc/profile 文件内容,并显示行号
cat -n /etc/profile
使用细节
cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上 管道命令 | more,这里表示把前面的结果交给more去处理
cat -n /etc/profile | more
15.4.10 more指令
功能描述:more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。 more指令中内置了若干快捷键,详见操作说明
基本语法:more 要查看的文件
操作说明,如图

应用案例:
案例: 采用more查看文件 /etc/profile
more /etc/profile
15.4.11 less指令
功能描述:less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率
基本语法:less 要查看的文件
操作说明,如图

应用案例:
采用less查看一个大文件/opt/杂文.txt
less /opt/杂文.txt
15.4.12 echo指令
功能描述:echo输出内容到控制台
基本语法:echo [选项] [输出内容]
应用案例:
案例1:使用echo 指令输出环境变量,比如输出$PATH $HOSTNAME
echo $PATHecho $HOSTNAME
案例2: 使用echo 指令输出 hello,world!
echo "hello,world"
15.4.13 head指令
功能描述:head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容
基本语法:
head 文件 功能描述:查看文件头10行内容
head -n 5 文件 功能描述:查看文件头5行内容,5可以是任意行数
应用案例:
案例1: 查看/etc/profile 的前面5行代码
head -n 5 /etc/profile
15.4.14 tail指令
功能描述:tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的最后10行内容
基本语法:
tail 文件 功能描述:查看文件尾10行内容
tail -n 5 文件 功能描述:查看文件尾5行内容,5可以是任意行数
tail -f 文件 功能描述:实时追踪该文档的所有更新
应用案例:
案例1:查看/etc/profile 最后5行的代码
tail -n 5 /etc/profile
案例2: 实时监控 mydate.txt , 看看到文件有变化时,是否看到, 实时的追加日期
cd /home/touch mydate.txttail -f /home/mydate.txt然后再用另一个终端登陆往mydate.txt写入一些内容看第一个客户端的控制台是否能监控到mydate.txt内容的变化echo "hello" > /home/mydate.txt
15.4.15 > 指令 和 >> 指令
功能描述:> 输出重定向和 >> 追加。> 会把覆盖。>> 会追加
基本语法:
ls -l > 文件 功能描述:列表的内容写入文件a.txt中(覆盖写)
ls -al >> 文件 功能描述:列表的内容追加到文件aa.txt的末尾
cat 文件1 > 文件2 功能描述:将文件1的内容覆盖到文件2
echo "内容" >> 文件
应用案例:
案例1: 将 /home 目录下的文件列表 写入到 /home/info.txt 中,覆盖写入,如果info.txt不存在则会自动创建
ls -l /home > /home/info.txt
案例2: 将当前日历信息追加到 /home/mycal 文件中
cal >> /home/mycal
15.4.16 ln 指令
功能描述:软链接也称为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径
基本语法:ln -s [原文件或目录] [软链接名] 功能描述:给原文件创建一个软链接
应用案例:
案例1: 在/home 目录下创建一个软连接 myroot,连接到 /root 目录
ln -s /root /home/myroot
案例2: 删除软连接 myroot。提示:最后面的那个斜杠不要带上,例如:rm /home/myroot/会提示rm:无法删除”/home/myroot”:是一个目录
rm /home/myroot
细节说明:
当我们使用pwd指令查看目录时,仍然看到的是软链接所在目录
15.4.17 history指令
功能描述:查看已经执行过历史命令,也可以执行历史指令
基本语法:history
应用案例:
案例1: 显示所有的历史命令
history
案例2: 显示最近使用过的10个指令。
history 10
案例3:执行历史编号为5的指令
!5
15.5 时间日期类
15.5.1 date指令-显示当前日期
功能描述:显示当前日期
基本语法:
date 功能描述:显示当前时间
date +%Y 功能描述:显示当前年份
date +%m 功能描述:显示当前月份
date +%d 功能描述:显示当前是哪一天
date "+%Y-%m-%d %H:%M:%S" 功能描述:显示年月日时分秒
应用案例:
案例1: 显示当前时间信息
date
案例2: 显示当前时间年月日
date "+%Y-%m-%d"
案例3: 显示当前时间年月日时分秒
date "+%Y-%m-%d %H:%M:%S"
15.5.2 date指令-设置日期
基本语法:date -s 字符串时间
应用案例:
案例1:设置系统当前时间,比如设置成2020-11-03 20:02:10
date -s "2020-11-03 20:02:10"
15.5.3 cal指令
基本语法:cal [选项] 功能描述:不加选项,显示本月日历
应用案例:
案例1: 显示当前日历
cal
案例2: 显示2020年日历
cal 2020
15.6 搜索查找类
15.6.1 find指令
功能描述:find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。
基本语法:
find [搜索范围] [选项]
选项说明:

应用案例:
案例1: 按文件名:根据名称查找/home 目录下的hello.txt文件
find /home -name hello.txt
案例2:按拥有者:查找/opt目录下,用户名称为 nobody的文件
find /opt -user nobody
案例3:查找整个linux系统下大于200m的文件(+n 大于 -n小于 n等于,单位还有K,M,G)
find / -size +200M
15.6.2 locate指令
功能描述:locaate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径 的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。 为了保证查询结果的准确度,管理员必须定期更新locate时刻
基本语法:
locate 搜索文件
特别说明
由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate 数据库
应用案例:
案例1: 请使用locate 指令快速定位 hello.txt 文件所在目录
locate hello.txt
15.6.3 which指令
功能描述:可以查看某个指令在哪个目录下,比如:ls
which ls
15.6.4 grep指令和管道符号|
功能描述:grep 过滤查找 , 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
基本语法:grep [选项] 查找内容 源文件
常用选项:

应用案例:
案例1: 请在 hello.txt 文件中,查找 “yes” 所在行,并且显示行号
写法一
cat /home/hello.txt | grep -n "yes"
写法二
grep -n "yes" /home/hello.txt
15.7 压缩和解压类
15.7.1 gzip/gunzip指令
功能描述:gzip 用于压缩文件, gunzip 用于解压的
基本语法:
gzip 文件 功能描述:压缩文件,只能将文件压缩为*.gz文件
gunzip 文件.gz 功能描述:解压缩文件命令
应用案例:
案例1: gzip压缩, 将 /home下的 hello.txt文件进行压缩
gzip /home/hello.txt
案例2: gunzip压缩, 将 /home下的 hello.txt.gz 文件进行解压缩
gunzip /home/hello.txt.gz
15.7.2 zip/unzip指令
功能描述:zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
基本语法:
zip [选项] XXX.zip 将要压缩的内容 功能描述:压缩文件和目录的命令
unzip [选项] XXX.zip 功能描述:解压缩文件
zip常用选项
- -r:递归压缩,即压缩目录
unzip的常用选项
- -d<目录> :指定解压后文件的存放目录
应用案例:
案例1: 将 /home下的 所有文件进行压缩成 myhome.zip
zip -r myhone.zip /home/
案例2: 将 myhone.zip 解压到 /opt/tmp 目录下
mkdir /opt/tmpunzip -d /opt/tmp /home/myhome.zip
15.7.2 tar指令
功能描述:tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件。tar指令既可以用来打包又可以用来解压
基本语法:
tar [选项] XXX.tar.gz 打包的内容 功能描述:打包目录,压缩后的文件格式.tar.gz
选项说明:

应用案例:
案例1: 压缩多个文件(如果有多个文件,那么多个文件之间用空格隔开),将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz
cd /home/touch pig.txttouch cat.txttar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
案例2:将/home 的文件夹压缩成 myhome.tar.gz
tar -zcvf myhome.tar.gz /home/
案例3:将pc.tar.gz解压到当前目录,切换到/opt/
tar -zxvf pc.tar.gz
案例4:将myhome.tar.gz 解压到/opt/tmp2目录下
mkdir /opt/tmp2tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
16 组管理和权限管理
16.1 Linux组基本介绍
在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件 有所有者、所在组、其它组的概念
- 所有者
- 所在组
- 其它组
- 改变用户所在的组

16.2 文件/目录 所有者
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
16.2.1 查看文件的所有者
指令:ls -ahl
应用案例:

16.2.2 修改文件所有者
指令:chown 用户名 文件名
应用案例:使用root 创建一个文件apple.txt ,然后将其所有者修改成 tom
chown tom apple.txt
16.3 组的创建
基本指令
groupadd 组名
应用案例
案例1:创建一个组monster。创建一个用户fox,并放入到monster组中
groupadd monsteruseradd -g monster fox
16.4 文件/目录 所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组
16.4.1 查看文件/目录所在组
基本指令
ls -ahl
应用案例
使用fox创建一个文件,看看这个文件属于哪个组

16.4.2 修改文件/目录所在组
基本指令
chgrp 组名 文件名
应用案例
案例1:使用root用户创建文件 orange.txt ,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到 fruit组
groupadd fruittouch orange.txtchgrp fruit orange.txt
16.5 其他组
除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组。
16.6 改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组
基本指令
usermod –g 组名 用户名
usermod –d 目录名 用户名 改变该用户登陆的初始目录。特别说明:用户需要有进入到新目录的权限。
应用案例
案例1:将 zwj 这个用户从原来所在组,修改到 wudang 组
usermod -g wudang zwj
16.7 权限的基本介绍
ls -l 中显示的内容如下:
-rwxrw-r— 1 root root 1213 Feb 2 09:39 abc
0-9位说明
- 第0位确定文件类型(d, - , l , c , b)
- l是链接,相当于windows的快捷方式
- d是目录,相当于windows的文件夹
- c是字符设备文件,比如鼠标,键盘
- b是块设备,比如硬盘
- -是普通文件
- 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。—-User
- 第4-6位确定所属组(同用户组的)拥有该文件的权限,—-Group
- 第7-9位确定其他用户拥有该文件的权限 —-Other
16.8 rwx权限详解(难点)
16.8.1 rwx作用到文件
- [ r ]代表可读(read):可以读取,查看
- [ w ]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
- [ x ]代表可执行(execute):可以被执行
16.8.2 rwx作用到目录
- [ r ]代表可读(read):可以读取,ls查看目录内容
- [ w ]代表可写(write):可以在目录里面进行删除文件+创建文件+重命名目录 。
- [ x ]代表可执行(execute):可以进入该目录
注意:即使某一个用户没有对该目录的rwx权限,但是如果这个用户有对目录里面的文件的操作权限,那么这个用户依然可以根据他所拥有的权限去操作目录里面的文件
例如:目录A对甲用户没有赋予任何权限,但是目录A里面有一个hello.java文件,hello.java文件对甲用户有rwx权限,
那么甲用户仍然可以去查看和修改hello.java里面的内容,只是不能删除hello.java这个文件。
16.9 文件及目录权限实际案例
ls -l 中显示的内容如下:
-rwxrw-r— 1 root root 1213 Feb 2 09:39 abc
10个字符确定不同用户能对文件干什么
第一个字符代表文件类型: 普通文件 (-),目录(d),链接(l),字符设备(c),块设备(b)
其余字符每3个一组(rwx) 读(r) 写(w) 执行(x)
第一组rwx : 文件拥有者的权限是读、写和执行
第二组rw-: 与文件拥有者同一组的用户的权限是读、写但不能执行
第三组r-- : 不与文件拥有者同组的其他用户的权限是读不能写和执行
可用数字表示为: r=4,w=2,x=1 因此rwx=4+2+1=7
1:文件:如果abc是一个文件那这就是一个1,如果abc是一个目录:那么它表示abc的子目录数+子文件数
root:文件所有者
root:文件所在组
1213:文件大小(字节),如果是文件夹,显示 4096字节
Feb 2 09:39:最后修改日期
abc:文件名
16.10 修改权限-chmod
16.10.1 基本说明
通过chmod指令,可以修改文件或者目录的权限
16.10.2 第一种方式:+ 、-、= 变更权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
chmod u=rwx,g=rx,o=x 文件/目录名chmod o+w 文件/目录名chmod a-x 文件/目录名
案例演示
- 给abc文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rwx,g=rx,o=rx abc
- 给abc文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
- 给abc文件的所有用户添加读的权限
chmod a+r abc
16.10.3 第二种方式:通过数字变更权限
r=4 w=2 x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名 相当于 chmod 751 文件目录名
案例演示
要求:将 /home/abc.txt 文件的权限修改成 rwxr-xr-x, 使用给数字的方式实现
chmod 755 /home/abc.txt
16.11 修改文件所有者-chown
基本介绍
chown newowner 文件/目录 改变文件的所有者
chown newowner:newgroup 文件/目录 改变用户的所有者和所有组
-R 如果是目录 则使其下所有子文件或目录递归生效
案例演示
- 请将 /home/abc .txt 文件的所有者修改成 tom
chown tom /home/abc.txt
- 请将 /home/kkk 目录下所有的文件和目录的所有者都修改成tom
chown -R tom /home/kkk
16.12 修改文件/目录所在组-chgrp
基本介绍
chgrp newgroup 文件/目录 修改文件所在组
案例演示
案例1:请将 /home/abc .txt 文件的所在组修改成 shaolin (少林)
groupadd shaolinchgrp shaolin /home/abc.txt
案例2:请将 /home/kkk 目录下所有的文件和目录的所在组都修改成 shaolin(少林)
chgrp -R shaolin /home/kkk
16.13 最佳实践-警察和土匪游戏
组名:police , bandit
jack, jerry: 警察
xh, xq: 土匪
- 创建组
groupadd policegroupadd bandit
- 创建用户,并且设置密码
useradd -g police jackuseradd -g police jerryuseradd -g bandit xhuseradd -g bandit xqpasswd jackpasswd jerrypasswd xhpasswd xq
- jack 创建一个文件,自己可以读r写w,本组人可以读,其他组没有任何权限,首先jack登陆
vim jack.txtchmod 640 jack.txt
- jack 修改该文件,让其他组人可以读,本组人可以读写
chmod o=r,g=rw jack.txt
- xh 投靠警察,看看是否可以读写,注意:普通用户不可以修改其他用户的用户组,需要切换成root用户去修改
usermod -g police xh
- 测试,用xh登陆,看xh是否可以读写,xq是否可以读写,小结论:如果要对目录内的文件进行操作,需要有对该目录的相应权限
#先用xh登陆,进入/home/jack目录,发现没有权限#然后用jack登陆,修改/home/jack目录所在组的权限为rwx#再次用xh进入/home/jack目录,这时候就能进入了#然后看xh是否能对/home/jack/jack.txt进行读写操作
示意图

16.14 课后练习
练习文件权限管理[课堂练习],完成如下操作
1)建立两个组(神仙,妖怪)
groupadd shenxiangroupadd yaoguai
2)建立四个用户(唐僧,悟空,八戒,沙僧)
useradd tangsenguseradd wukonguseradd bajieuseradd shaseng
3)设置密码
passwd tangsengpasswd wukongpasswd bajiepasswd shaseng
4)把悟空、八戒放入妖怪组,唐僧、沙僧在神仙组
usermod -g yaoguai wukongusermod -g yaoguai bajieusermod -g shenxian tangsengusermod -g shenxian shaseng
5)用wukong建立一个文件 (monkey.java 该文件要输出 i am monkey)
#使用wk登陆vim monkey.java
6)给bajie一个可以r w 的权限
chmod g=rw monkey.java
7)bajie修改monkey.java 加入一句话( i am pig)
#先让wukong给bajie开放/home/wukong/目录rwx权限chmod g+r+w+x /home/wukong/#用户bajie登陆,进入/home/wukong/目录,修改monkey.java,vim monkey.java
8)tangseng、shaseng对该文件没有权限
9)把沙僧放入妖怪组
#切换root用户登陆,让root用户修改shaseng所在组为yaoguaiusermod -g yaoguai shaseng#注意:如果shaseng在修改组为yaoguai组之前就已经登陆,那么即使现在把shaseng修改为yaoguai组,shaseng还是无法进入到/home/wukong/目录,因为shaseng是在你修改组之前登陆的,在登陆的时候,组就已经被确认为shenxian组了,解决方法1是让shaseng重写登陆,解决方法2是
10)让shaseng修改该文件monkey, 加入一句话 (“我是沙僧,我是妖怪!”);
11)对文件夹rwx的细节讨论和测试
- x:表示可以进入到该目录,比如cd
- r:表示可以ls,将目录里面的文件列举出来
- w:表示可以在该目录删除或者创建文件
12)示意图

17 定时任务调度
17.1 crond任务调度
crontab 进行定时任务的设置
17.1.1 概述
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等 2.个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。
示意图

17.1.2 基本语法
crontab [选项]
17.1.3 常用选项

17.1.4 快速入门
设置任务调度文件:/etc/crontab
设置个人任务调度。执行crontab –e命令。
接着输入任务到调度文件
如:/1 * ls –l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行ls –l /etc/ > /tmp/to.txt命令
参数细节说明
- 5个占位符的说明
- 特殊符号的说明
- 特定时间执行任务案例
17.1.5 应用案例
案例1:每隔1分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
*/1 * * * * date >> /tmp/mydate
案例2:每隔1分钟, 将当前日期和日历都追加到 /home/mycal 文件中
第1步:先写一个shell脚本my.sh,在脚本中写入内容date >> /home/mycal和cal >> /home/mycal
date >> /home/mycalcal >> /home/mycal
第2步:给my.sh的增加一个可执行的权限
chmod u+x /home/my.sh
第3步:接着输入crontab -e增加定时执行my.sh文件
*/1 * * * * /home/my.sh
案例3: 每天凌晨2:00 将mysql数据库 testdb ,备份到文件中。(提示:指令为mysqldump -u root -p 密码 数据库 > /home/db.bak)
第1步:
crontab -e
第2步:
0 2 * * * mysqldump -u root -p root testdb > /home/db.bak
17.1.6 crond相关指令
- conrtab –r:终止任务调度。
- crontab –l:列出当前有那些任务调度
- service crond restart [重启任务调度]
17.2 at定时任务
17.2.1 基本介绍
1)at命令一次性定时任务计划,at的守护线程atd会以后台模式运行,检查作业队列来运行。
2)默认情况下,atd守护线程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
3)at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
4)在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看
ps -ef | grep atd 可以检测atd是否运行
5)画一个示意图

17.2.2 at命令格式
at [选项] [时间]
Ctrl+D 结束at命令的输入,需要输入两次Ctrl+D
17.2.3 at命令选项

17.2.4 at时间定义
at指定时间的方法:
1)接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00
2)使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
3)采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。例如:12pm
4)指定命令执行的具体时间,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-03-1
5)使用相对计时法。指定格式为:now + count time-units,now 就是当前时间,time-units是时间单位,这里能够是miniutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,几天,几小时。例如:now + 5 miniutes
6)直接使用today(今天)、tomorrow(明天)来指定完成命令的时间
17.2.5 应用案例
案例1:2天后的下午5点执行 /bin/ls /home

案例2:atq命令来查看系统中没有执行的工作任务

案例3:明天17点钟,输出时间到指定文件内,比如/root/date100.log

案例4:2分钟后,输出时间到指定文件内,比如/root/date200.log

案例5:删除已经设置的任务,atrm 编号

18 Linux磁盘分区、挂载
18.1 Linux分区
18.1.1 原理介绍
- Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。
- Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一 个目录下获得。
- 示意图

18.1.2 硬盘说明
- Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
- 对于IDE硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指 IDE硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属 盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就 是逻辑分区。例,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为 第二个IDE硬盘上的第二个主分区或扩展分区。
对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样。

18.1.3 查看所有设备挂载的情况
指令
lsblk 或者 lsblk -f


18.2 挂载的经典案例
18.2.1 说明
下面我们以增加一块硬盘为例来熟悉下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念
18.2.2 如何增加一块硬盘
- 虚拟机添加硬盘
- 分区
- 格式化
- 挂载
- 设置可以自动挂载
18.2.3 虚拟机增加硬盘步骤1
在【虚拟机】菜单中,选择【设 置】,然后设备列表里添加硬盘, 然后一路【下一步】,中间只有选择磁盘大小的地方需要修改, 至到完成。然后重启系统(才能 识别)!






最后重启系统才能识别这块新添加的硬盘

18.2.4 虚拟机增加硬盘步骤2
分区命令
fdisk /dev/sdb
开始对/sdb分区
m 显示命令列表
p 显示磁盘分区 同 fdisk –l
n 新增分区
d 删除分区
w 写入并退出
说明: 开始分区后输入n,新增分区,然后选择p ,分区类型为主分区。分区号输入1,两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q。
分区成功后的结果

18.2.5 虚拟机增加硬盘步骤3

格式化磁盘
格式化命令:mkfs -t ext4 /dev/sdb1
其中ext4是分区类型

18.2.6 虚拟机增加硬盘步骤4
挂载:将一个分区与一个目录联系起来
- 挂载:
mount 设备名称 挂载目录,例如: mount /dev/sdb1 /newdisk
挂载后的结果

卸载:将分区和目录断开联系
- 卸载:
umount 设备名称 或者 挂载目录,例如: umount /dev/sdb1 或者 umount /newdisk
用命令行挂载重启后会失效,即用命令行的方式挂载重启后挂载关系会被去掉
18.2.7 虚拟机增加硬盘步骤5
永久挂载: 通过修改/etc/fstab实现挂载,添加完成后执行mount –a 即刻生效
vim /etc/fstab 手动添加挂载

然后重启或者执行命令mount -a,它的挂载关系就会永久存在了
18.3 磁盘情况查询
18.3.1 查询系统整体磁盘使用情况
基本语法
df -h
应用案例
查询系统整体磁盘使用情况

18.3.2 查询指定目录的磁盘占用情况
基本语法
du -h /目录
查询指定目录的磁盘占用情况,默认为当前目录
选项
- -s:指定目录占用大小汇总
- -h:带计量单位
- -a:含文件
- —max-depth=1 子目录深度
- -c:列出明细的同时,增加汇总值
应用案例
查询/opt 目录的磁盘占用情况,深度为1
du -hac --max-depth=1 /opt

18.4 磁盘情况-工作实用指令
- 统计/opt文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l

- 统计/opt文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l

- 统计/opt文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l

- 统计/opt文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l
- 以树状显示目录结构,注意,如果没有tree,则使用
**yum install tree**安装一下
tree /opt/
19 网络配置
19.1 Linux网络配置原理图

linux的ip要和vmnet8的ip在同一个网段才能进行通讯,这样linux就可以通过vmnet8访问外网
自己可以尝试用本机windows去ping本地的虚拟机linux看能不能ping通,然后用本地虚拟机linux去ping本机windows看能不能ping通
注意:虚拟机ping本机windows需要让windows把防火墙关了才能ping通
19.2 查看网络IP和网关
19.2.1 查看虚拟网络编辑器和修改IP地址
打开虚拟网络编辑器

这里就是为什么我们的虚拟机的ip是以192.168.2开头的原因

19.2.2 查看网关


子网掩码最后一位是0,网关最后一位是2
19.3 查看windows环境中VMnet8网络配置(ipconfig指令)

19.4 查看linux的网络配置(ifconfig)

19.5 ping测试主机之间网络连通性
基本语法
ping 目的主机的ip 功能描述:测试当前服务器是否可以连通目的主机
应用案例
测试当前服务器是否可以连接百度

19.6 linux网络环境配置
19.6.1 第一种方法(自动获取)
说明:登陆后,通过界面的来设置自动获取ip。它的优点是可以避免ip冲突,它的缺点就是:linux启动后会自动获取IP,每次自动获取的ip地址可能不一样,所有它就不能做服务器。



19.6.2 第二种方法(指定ip)
说明
直接修改配置文件来指定IP,并可以连接到外网(程序员推荐)
编辑
vi /etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置为静态的,比如ip地址为192.168.200.130
ifcfg-ens33文件说明
DEVICE=eth0 #接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx #MAC地址
TYPE=Ethernet #网络类型(通常是Ethemet)
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id
系统启动的时候网络接口是否有效(yes/no)
ONBOOT=yes
IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
BOOTPROTO=static
IP地址
IPADDR=192.168.200.130
网关
GATEWAY=192.168.200.2
域名解析器
DNS1=192.168.200.2
以上黑体部分为需要修改的部分
修改完以上配置文件后然后去虚拟网络编辑器,把vmnet8的子网ip改为192.168.200.0,原因是因为vmnet8必须和linux在同一个网段才能进行通信

修改vmnet8的网关为192.168.200.2

最后重启网络服务或者重启系统生效
service network restart或者reboot
修改成功后,用指令ifconfig查看当前的linux的ip和用ipconfig查看windows的vmnet8的ip


然后让linux(192.168.200.130)和vmnet8(192.168.200.1)相互ping,看能不能ping通
最后再测试看linux能不能上网
19.7 设置主机名和hosts映射
19.7.1 设置主机名
1)为了方便记忆,可以给linux系统设置主机名,也可以根据需要修改主机名
2)指令hostname可以查看当前主机名
3)可以在配置文件/etc/hostname修改主机名
4)修改后,需要重启生效
19.7.2 设置hosts映射
思考:如何通过主机名能够找到(比如ping)某个linux系统?
当我们去ping 主机的时候,windows环境下它会去C:\Windows\System32\drivers\etc\hosts找到这个主机名,然后拿到对应的ip再去ping这个ip。而linux环境下它会去找/etc/hosts文件里面找这个主机名,然后拿到对应的ip再去ping这个ip
在windows里面配置主机名和ip的映射关系
在C:\Windows\System32\drivers\etc\hosts 文件指定即可
案例:192.168.200.130 hspedu100
打开C:\Windows\System32\drivers\etc\hosts文件

在里面添加以下配置即可
192.168.200.130 hspEdu100
配置完在windows环境ping hspEdu100测试是否能ping通
在linux里面配置主机名和ip的映射关系
在/etc/hosts 文件 指定
案例:192.168.200.1 ThinkPad-PC
vim /etc/hosts

修改后保存上面的配置,然后ping ThinkPad-PC测试是否能ping通
19.8 主机名解析过程分析(Hosts、DNS)
19.8.1 Hosts是什么
一个文本文件,用来记录IP和Hostname(主机名)的映射关系
19.8.2 DNS
DNS就是Domain Name System的缩写,翻译过来就是域名系统
DNS是互联网上作为域名和IP地址相互映射的一个分布式数据库
19.8.3 应用案例:用户在浏览器输入了www.baidu.com
1)浏览器先检查浏览器缓存中有没有该域名解析IP地址,有就先调用这个IP完成解析;如果没有,就检查DNS解析器缓存,如果有直接返回IP完成解析。这两个缓存可以理解为本地解析器缓存
2)一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的IP地址(DNS解析记录),如在cmd窗口中输入
ipconfig /displaydns //DNS域名解析缓存
ipconfig/flushdns //手动清理dns缓存
3)如果本地解析器缓存没有找到对应映射,检查系统中hosts文件中有没有配置对应的域名IP映射,如果有,则完成解析并返回
4)如果本地DNS解析器缓存和hosts文件中均没有找到对应的IP,则到域名服务器DNS进行解析
5)示意图

20 进程管理(重点)
20.1 基本介绍
1)在LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一 个ID号(pid,进程号)。=>windows=>linux
2)每个进程都可以以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
3)一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才结束。
4)示意图

20.2 显示系统执行的进程
20.2.1 基本介绍
ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。 可以不加任何参数



20.2.2 ps详解
- 指令:
ps –aux|grep xxx,比如我看看有没有sshd服务 - 指令说明
System V展示风格
USER:用户名称
PID:进程号
%CPU:进程占用CPU的百分比
%MEM:进程占用物理内存的百分比
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
TTY:终端名称,缩写
STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通 优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
STARTED:进程的启动时间
TIME:CPU时间,即进程使用CPU的总时间
COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
20.2.3 应用案例
要求:以全格式显示当前所有的进程,查看进程的父进程。例如:查看sshd的父进程信息,先用ps -ef | grep sshd查看sshd的父进程id,然后再用ps -aux查看父进程信息

ps -ef是以全格式显示当前所有的进程
选项
- -e:显示所有进程。
- -f:全格式
ps -ef|grep xxx
是BSD风格
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算, 执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU时间
CMD:启动进程所用的命令和参数

20.3 终止进程kill和killall
20.3.1 介绍
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务
20.3.2 基本语法
kill [选项] 进程号 功能描述:通过进程号杀死进程
killall 进程名称 功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用。如果使用killall杀掉一个进程,那么这个进程的所有子进程也会被干掉
20.3.3 常用选项
-9:表示强迫进程立即停止
20.3.4 最佳实践
案例1:踢掉某个非法登录用户 ,例如踢掉xh这个非法登陆用户
#先使用指令ps -ef | grep sshd或者ps -aux | grep sshd查询这个非法登陆用户的进程号#然后使用kill 进程号的方式终止这个进程

案例2: 终止远程登录服务sshd, 在适当时候再次重启sshd服务
#先使用指令ps -ef | grep sshd 或者 ps -aux | grep sshd查看sshd进程的进程号#然后使用kill 进程号杀死sshd进程kill sshd对应的进程号可以使用指令/bin/systemctl start sshd.service重启sshd进程

杀死sshd进程后xshell就无法进行远程连接了,可以使用指令/bin/systemctl start sshd.service重启sshd进程
案例3: 终止多个gedit 编辑器
#可以使用指令killall 进程名称 来杀死geditkillall gedit
案例4:强制杀掉一个终端,例如要杀掉bash终端
#使用指令ps -aux | grep bash 查出bash对应的进程号#然后使用kill -9 进程号 杀掉某一个bash终端窗口kill -9 bash对应的进程号
20.4 查看进程树pstree
20.4.1 基本语法
pstree [选项] 功能描述:可以更加直观的来看进程信息
20.4.2 常用选项
-p:显示进程的PID
-u:显示进程的所属用户
20.4.3 应用案例
案例1:请你树状的形式显示进程的pid
pstree -p
案例2:请你树状的形式进程的用户
pstree -u
20.5 服务(service)管理
20.5.1 介绍
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd 防火墙等),因此我们又称为守护进程,是Linux中非常重要的知识点
原理图

20.5.2 service管理指令
1)service 服务名 [start | stop | restart | reload | status]
2)在CentOS7.0以后很多服务不再使用service指令来管理了 ,而是使用systemctl指令(后面专门讲)
3)service指令管理的服务在/etc/init.d/可以查看,可以通过指令ls -l /etc/init.d/来查看

20.5.3 service管理指令案例
请使用service指令,查看,关闭,启动network【注意:在虚拟系统演示,因为网络连接会关闭】
#可以通过xshell远程连接测试network服务是否已关闭service network statusservice network stopservice network start
20.5.4 查看服务名
方式1:使用setup->系统服务 就可以看到全部。
直接输入setup指令

前面带了*号的会随着linux系统启动而自动启动,前面没有带*号的需要自己手动启动
把光标放在上面输入空格键,然后点击确定就可以关闭/开启这个服务的自启动
方式2:/etc/init.d/ 看到service指令管理的服务,这个指令只能看到service指令管理的部分服务
ls -l /etc/init.d/

20.5.5 服务的运行级别
服务的运行级别(runlevel)
Linux系统有7种运行级别(runlevel):常用的是级别3和5
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS),不支持网络
- 运行级别3:完全的多用户状态(有NFS),无界面,登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
开机的流程说明:

20.5.6 CentOS7 后运行级别说明
Centos7以后在/etc/inittab进行了简化(注意:虽然Centos7以后对常用的运行级别进行了简化,但是其他运行级别仍然是存在的),
/etc/inittab文件的内容如下:
# inittab is no longer used when using systemd.## ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.## Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target## systemd uses 'targets' instead of runlevels. By default, there are two main targets:## multi-user.target: analogous to runlevel 3# graphical.target: analogous to runlevel 5## To view current default target, run:# systemctl get-default## To set a default target, run:# systemctl set-default TARGET.target#
可以通过以下指令设置运行级别
#设置为运行级别5systemctl set-default graphical.target#设置为运行级别3systemctl set-default multi-user.target
20.5.7 chkconfig指令
介绍
通过chkconfig 命令可以给每个服务的各个运行级别设置自启动/关闭
chkconfig指令管理的服务在/etc/init.d查看
注意:Centos7.0后,很多服务使用systemctl指令管理服务的自启动/关闭(后面马上讲)
基本语法
- 查看服务
chkconfig --list 查找chkconfig指令管理的全部服务的自启动/关闭
chkconfig --list | grep xxx 根据服务名过滤查找chkconfig指令管理的某个服务的自启动/关闭

chkconfig 服务名 --list根据服务名查找chkconfig指令管理的某个服务的自启动/关闭chkconfig --level 运行级别 服务名 on/off设置某个服务在某一个运行级别下的自启动/关闭
案例演示
对network服务进行各种操作,把network在3运行级别,关闭自启动
chkconfig --level 3 network off

使用细节
chkconfig重写设置服务在某个运行级别下的自启动或关闭,需要重启机器reboot生效
20.5.8 systemctl管理指令
基本语法
systemctl [start|stop|restart|status] 服务名
systemctl指令管理的服务在/usr/lib/systemd/system 可以查看
ls -l /usr/lib/systemd/system
20.5.9 systemctl设置服务的自启动状态
systemctl list-unit-files [|grep 服务名] 查看服务开机启动状态,grep可以进行拦截。例如查看防火墙firewalld

systemctl enable 服务名 设置服务开机自启动(对运行级别3和5都会生效)
systemctl disable 服务名 设置关闭服务开机自启动(对运行级别3和5都会生效)
systemctl is-enabled 服务名 查询某个服务是否是自启动的。例如查看firewalld服务是否是自启动的

注意:可以写服务的全名,例如firewalld.service也可以不写全名,例如firewalld
20.5.10 应用案例
查看当前防火墙的状况,关闭防火墙和重启防火墙。=>firewalld.service
#查看防火墙的状态systemctl status firewalld#关闭防火墙systemctl stop firewalld#开启防火墙systemctl start firewalld



20.5.11 细节讨论
防火墙的原理示意图

关闭或者启用防火墙后,会立即生效。(可以使用cmd客户端telnet ip 端口号 测试判断服务器服务端口是否处于开启状态)
使用**systemctl start 服务名**和**systemctl stop 服务名**这两种开启和关闭服务的方式只是临时生效,当重启系统后,还是会回归以前对服务的设置
如果希望设置某个服务自启动或关闭永久生效,要使用systemctl [enable|disable] 服务名
20.5.12 打开或者关闭指定端口
在真正的生产环境,往往需要将防火墙打开,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。比如80、22、8080等,这个怎么做呢?示意图

20.5.13 firewall指令
1)打开端口:firewall-cmd --permanent --add-port=端口号/协议
2)关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
3)不管是打开端口还是关闭端口都要重写载入,才能生效:firewall-cmd --reload
4)查询端口是否开放:firewall-cmd --query-port=端口/协议
5)查询哪些端口开放:firewall-cmd --list-port
6)查询防火墙开放的所有端口号:firewall-cmd —list-all
可以通过指令netstat -anp | more查看端口的协议

20.5.14 应用案例
1)启用防火墙,测试111端口是否能telnet

2)开放111端口
firewall-cmd --permanent --add-port=111/tcp#做完以上指令后需要重写载入才能生效firewall-cmd --reload

然后使用cmd的telnet ip 端口号测试防火墙是否开放了111端口

如果弹出以下窗口说明防火墙开通了111号端口

3)再次关闭111端口
firewall-cmd --permanent --remove-port=111/tcp#做完以上指令后需要重写载入才能生效firewall-cmd --reload

然后使用cmd的telnet ip 端口号测试防火墙是否关闭了111端口

20.6 动态监控进程
20.6.1 介绍
top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程
20.6.2 基本语法
top [选项]

20.6.3 选项说明

20.6.4 交互操作说明

20.6.5 应用案例
案例1.监视特定用户,比如监控tom用户
top:输入此命令,按回车键,查看执行的进程。
u:然后输入“u”回车,再输入用户名,即可
案例2:终止指定的进程,比如我们要结束tom登陆
top:输入此命令,按回车键,查看执行的进程。
k:然后输入“k”回车,再输入要结束的进程ID号,然后输入9
案例3:指定系统状态更新的时间(每隔10秒自动更新),默认是3秒
top -d 10
20.7 监控网络状态
20.7.1 查看系统网络情况netstat
基本语法
netstat [选项]
选项说明
- -an:按一定顺序排列输出
- -p:显示哪个进程在调用
应用案例
请查看服务名sshd的服务信息
netstat -anp | grep sshd


20.7.2 检查主机连接命令ping
是一种网络检测检测工具,它主要是用检测远程主机是否正常,或是两部主机间 的介质是否为断、网线是否脱落或网卡故障。如: ping 对方ip地址
21 RPM与YUM
21.1 rpm包的管理
21.1.1 介绍
rpm是用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成 具有.RPM扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工 具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了RedHat的 标志,但理念是通用的
Linux的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标 准了
21.1.2 rpm包的简单查询指令
查询已安装的rpm列表:rpm –qa|grep xx
举例:看看当前系统,是否安装了firefox
指令:rpm -qa | grep firefox

21.1.3 rpm包名基本格式
一个rpm包名:firefox-60.2.2-1.el7.centos.x86_64.rpm
名称:firefox
版本号:60.2.2-1
适用操作系统:el7.centos.x86_64
表示centos7.x的64位系统
如果是i686、i386表示32位系统,noarch表示通用
21.1.4 rpm包的其他查询指令
rpm -qa:查询所安装的所有rpm软件包
rpm -qa | more
rpm -qa | grep X 过滤查询,例如rpm -qa | grep firefox
rpm -q 软件包名:查询软件包是否安装
案例:rpm -q firefox
rpm -qi 软件包名:查询软件包信息
案例:rpm -qi firefox

rpm -ql 软件包名:查询软件包中的文件,即安装这个软件包后生成了哪些文件
比如:rpm -ql firefox
rpm -qf 文件全路径名:查询文件所属的软件包
比如:rpm -qf /etc/passwd
比如:rpm -qf /root/install.log
21.1.5 卸载rpm包
基本语法
rpm -e RPM包的名称
应用案例
删除firefox软件包
rpm -e firefox
细节讨论
- 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
如: rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
- 如果我们就是要删除 foo这个rpm 包,可以增加参数 —nodeps ,就可以强制删除,但是一 般不推荐这样做,因为依赖于该软件包的程序可能无法运行
如:rpm -e --nodeps foo
21.1.6 安装rpm包
基本语法
rpm -ivh RPM包全路径名称
参数说明
- i:install 安装
- v:verbose 提示
- h:hash 进度条
应用案例
演示卸载和安装firefox浏览器
rpm -e firefoxrpm -ivh firefox的RPM包的全路径名
寻找RPM包的方法
1)打开centos7.6 x86_64

2)进入Packages

3)搜索firefox的RPM包

4)最后使用指令rpm -ivh firefox的RPM包的全路径名称安装即可。例如RPM包下载到了/opt目录下
rpm -ivh /opt/firefox-60.2.2-1.el7.centos.x86_64.rpm
21.2 yum
21.2.1 介绍
Yum 是一个Shell前端软件包管理器。基于RPM包管理,能够从指定 的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并 且一次安装所有依赖的软件包
21.2.2 yum的基本指令
查询yum服务器是否有需要安装的软件:yum list | grep xx软件列表
21.2.3 安装指定的yum包
安装指定的yum包:yum install xxx
21.2.4 yum应用实例
案例:请使用yum的方式来安装firefox
#先删除firefoxrpm -e firefox#查询yum服务器是否有需要安装的软件yum list | grep firefox#开始安装firefoxyum install firefox
22 Linux之JavaEE定制篇-搭建JavaEE环境
22.1 概述
如果需要在Linux下进行JavaEE的开发,我们需要安装如下软件

22.2 安装JDK
22.2.1 安装步骤
1)mkdir /opt/jdk
2)通过xftp上传jdk的安装包到/opt/jdk目录下
3)cd /opt/jdk
4)解压tar -zxvf jdk-8u26-linux-x64.tar.gz
5)mkdir /usr/local/java
6)mv /opt/jdk/jdk1.8.0_261 /usr/local/java
7)配置环境变量的配置文件vim /etc/profile
8)export JAVA_HOME=/usr/local/java/jdk1.8.0_261
9)export PATH=PATH

10)**source /etc/profile** 让新的环境变量生效
11)输入echo $PATH测试path环境变量是否包含了jdk/bin

12)最后随便在哪个目录下输入java和javac命令测试环境变量是否配置成功
22.2.2 测试是否安装成功
编写一个简单的Hello.java输出”hello,world”
vim Hello.java
public Hello {public static void main(String[] args) {System.out.println("hello,world!");}}
然后使用命令javac Hello.java和java Hello编译运行
22.3 Tomcat的安装
22.3.1 安装步骤
1)mkdir /opt/tomcat
2)通过xftp上传tomcat安装文件到/opt/tomcat目录下
3)cd /opt/tomcat
4)解压tar -zxvf tomcat压缩包
5)mkdir /usr/local/tomcat
6)mv tomcat解压后的目录 /usr/local/tomcat
7)进入/usr/local/tomcat/tomcat目录/bin,启动tomcat,./startup.sh

8)在防火墙开放8080端口(如果防火墙没开发8080端口,使用地址http://linuxip:8080/是访问不了tomcat的)
#防火墙开发8080端口firewall-cmd --permanent --add-port=8080/tcp#重写载入才能生效firewall-cmd --reload#查看防火墙是否开启了8080端口firewall-cmd --query-port=8080/tcp
22.3.2 测试是否安装成功
在windows、linux下访问http://linuxip:8080,如果出现以下界面就说明成功了

22.3 idea2020的安装
22.3.1 安装步骤
1)下载地址:https://www.jetbrains.com/idea/download/#section=linux
2)在linux创建/opt/idea目录
3)通过xftp上传idea的压缩包到/opt/idea目录
4)在linux创建/opt/idea目录,并把idea压缩包解压缩到/opt/idea目录下
5)在图形界面下启动idea bin目录下的./idea.sh,配置jdk
6)编写Hello world程序并测试成功
22.4 Mysql5.7的安装
安装步骤请看centos安装mysql5.7.md
23 大数据定制篇-shell编程
23.1 为什么要学习Shell编程
- Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
- 对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本 进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
- 对于大数据程序员来说,需要编写Shell程序来管理集群。
23.2 Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

23.3 Shell脚本的执行方式
23.3.1 脚本格式要求
- 脚本以#!/bin/bash开头
- 脚本需要有可执行权限
23.3.2 编写第一个Shell脚本
需求说明:创建一个Shell脚本,输出hello world!
mkdir /root/shcodecd /root/shcode/vim hello.sh
hello.sh
#!/bin/bashecho "hello,world"

23.3.3 脚本的常用执行方式
方式1(输入脚本的绝对路径或相对路径)
说明:首先要赋予helloworld.sh 脚本的+x权限,再执行脚本
比如:./hello.sh或者使用绝对路径/root/shcode/hello.sh

方式2(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。
比如:sh hello.sh,也可以使用绝对路径

23.4 Shell的变量
23.4.1 shell变量介绍
1)Linux Shell中的变量分为系统变量和用户自定义变量。
2)系统变量:PWD、
USER、$PATH等等 比如: echo $HOME 等等..
3)显示当前shell中所有变量:set
23.4.2 shell变量定义
基本语法
1)定义变量:变量名=值 (注意变量名和值之间不能有空格)
2)撤销变量:unset 变量
- 声明静态变量:readonly 变量,注意:静态变量不能unset
快速入门
创建var.sh文件
案例1:定义变量A
案例2:撤销变量A
案例3:声明静态的变量B=2,不能unset
#!/bin/bash#案例1:定义变量AA=100#输出变量需要加上$echo A=$Aecho "A=$A"#案例2:撤销变量Aunset Aecho "A=$A"#这里也可以用${变量名}的方式,${变量名}和$变量名,其实他们的功能是一样的,唯一的区别是使用${}会比较精确的界定变量名称的范围echo "A=${A}"#案例3:声明静态的变量B=2,不能unsetreadonly B=2echo "B=$B"unset B
案例4:可把变量提升为全局环境变量,可供其他shell程序使用(该案例后面讲)
定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。 例如:5A=200
- 等号两侧不能有空格
- 变量名称一般习惯为大写,这是一个规范,我们遵守即可
将命令的返回值赋给变量有两种方式
1)方式二:A=ls -la 反引号,运行里面的命令,并把结果返回给变量A
C=`date`echo "C=$C"
2)方式一:A=$(ls -la) 等价于反引号
D=$(date)echo "D=$D"
23.5 设置环境变量
23.5.1 基本语法
- export 变量名=变量值 (功能描述:将shell变量输出为环境变量(全局变量)
- source 配置文件 (功能描述:让修改后的配置信息立即生效)
- echo $变量名 (功能描述:查询环境变量的值)
4)示意图

23.5.2 快速入门
- 在/etc/profile文件中定义TOMCAT_HOME环境变量
- 查看环境变量TOMCAT_HOME的值
- 在另外一个shell程序中使用 TOMCAT_HOME
注意:在输出JAVA_HOME 环境变量前,需要让其生效 source /etc/profile
vim /etc/profile
/etc/profile

#让其生效source /etc/profile#输出TOMCAT_HOMEecho $TOMCAT_HOME#然后去/root/var.sh测试输出这个刚定义的环境变量
var.sh
#!/bin/bashecho "TOMCAT_HOME=$TOMCAT_HOME"
shell脚本的多行注释,开头和结尾都要单独一行
:<<!内容!
23.6 位置参数变量(了解)
23.6.1 介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量 比如 : ./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息
23.6.2 基本语法
$n (功能描述:n为数字,$0代表命令本身,$1-{10})
把所有的参数看成一个整体*)
@把每个参数区分对待**)
$#(功能描述:这个变量代表命令行中所有参数的个数)
23.6.3 位置参数变量
应用案例
编写一个shell脚本 position.sh , 在脚本中获取到命令行的各个参数信息
vim position.sh
position.sh
#!/bin/bashecho "0=$0 1=$1 2=$2"echo "所有的参数=$*"echo "$@"echo "参数的个数=$#"
chmod u+x position.sh./position.sh 100 200
执行结果

23.7 预定义变量(了解)
23.7.1 基本介绍
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
23.7.2 基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:获取后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
23.7.3 应用案例
在一个shell脚本中简单使用一下预定义变量
vim preVar.sh
preVar.sh
#!/bin/bashecho "当前执行的进程id=$$"#以后台的方式运行一个脚本,并获取他的进程号/root/shcode/myshell.sh &echo "最后一个后台方式运行的进程id=$!"echo "执行的结果是=$?"
chmod u+x preVar.sh./preVar.sh
23.8 运算符
23.8.1 基本介绍
学习如何在shell中进行各种运算操作。
23.8.2 基本语法
- “
)%E2%80%9D%20%E6%88%96%20%E2%80%9C#card=math&code=%28%28%E8%BF%90%E7%AE%97%E5%BC%8F%29%29%E2%80%9D%20%E6%88%96%20%E2%80%9C&id=zIWBq)[运算式]” 或者
expr m + n//expression表达式 - 注意expr运算符间要有空格,m和n之间要有空格,如果希望将expr的结果赋给某个变量,使用``
- expr m - n
- expr
\*,/,%乘,除,取余
23.8.3 应用案例
案例1:计算(2+3) x 4的值
案例2:请求出命令行的两个参数[整数]和
vim oper.sh
oper.sh
#!/bin/bash#案例1:计算(2+3)x4的值#使用第一种方式RES1=$(((2+3)*4))echo "res1=$RES1"#使用第二种方式,推荐使用RES2=$[(2+3)*4]echo "res2=$RES2"#使用第三种方式 exprTEMP=`expr 2 + 3`RES4=`expr $TEMP \* 4`echo "temp=$TEMP"echo "res4=$RES4"#案例2:请求出命令行的两个参数[整数]的和 20 50SUM=$[$1+$2]echo "sum=$SUM"
给oper.sh一个可执行的权限,然后再执行
chmod u+x oper.sh#执行案例1./oper.sh#执行案例2./oper.sh 20 50
23.9 条件判断
23.9.1 判断语句
基本语法
[ condition ](注意condition前后要有空格)
非空返回true,可使用$?验证(0为true,>1为false)
应用案例
[ hspEdu ] 返回true
[] 返回false
[condition] && echo OK || echo notok 条件满足,执行后面的语句
判断语句
常用判断条件
1)= 字符串比较
2)两个整数的比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
3)按照文件权限进行判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
4)按照文件类型进行判断
- -f 文件存在,并且是一个常规文件
- -e 文件存在
- -d 文件存在并且是一个目录
应用案例
案例1:”ok”是否等于”ok”
案例2:23是否大于等于22
案例3:/root/shcode/aaa.txt 目录中的文件是否存在
创建一个ifdemo.sh
vim ifdemo.sh
ifdemo.sh
#!/bin/bash#案例1:"ok"是否等于"ok"#判断语句:使用 =if [ "ok" = "ok" ]thenecho "equal"fi#案例2:23是否大于等于22#判断语句:使用 -geif [ 23 -ge 22 ]thenecho "大于"fi#案例3:/root/shcode/aaa.txt 目录中的文件是否存在#判断语句:使用-fif [ -f /root/shcode/aaa.txt ]thenecho "存在"fi#看几个案例,即使条件为空,[]里面也要有空格if [ ]thenecho "为假"fiif [ hspEdu ]thenecho "hello hspEdu"fi
给ifdemo.sh可执行的权限然后开始执行
chmod u+x ifdemo.sh./ifdemo.sh
23.10 流程控制
23.10.1 if判断
基本语法
if[ 条件判断式 ]then代码fi或者多分支if[ 条件表达式 ]then代码elif[ 条件表达式 ]then代码fi
注意事项
[ 条件判断式 ],中括号和条件判断式之间必须有空格
应用案例
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出”及格了“,如果小于60,则输出”不及格“
创建一个ifCase.sh
vim ifCase.sh
ifCase.sh
#!/bin/bashif [ $1 -ge 60 ]thenecho "及格了"elif [ $1 -lt 60 ]thenecho "不及格"fi
给ifCase.sh一个可执行的权限,然后开始执行
chmod u+x ifCase.sh./ifCase.sh 70
23.10.2 case语句
基本语法
case $变量名 in"值1")如果变量的值等于值1,则执行程序1;;"值2")如果变量的值等于值2,则执行程序2;;.....省略其他分支......*)如果变量的值都不是以上的值,则执行此程序;;esac
应用案例
案例1:当命令行参数是1时,输出“周一”,是2是,就输出“周二”,其他情况输出“other”
创建一个文件testCase.sh
vim testCase.sh
testCase.sh
#!/bin/bash#案例1:当命令行参数是1时,输出“周一”,是2是,就输出“周二”,其他情况输出“other”case $1 in"1")echo "周一";;"2")echo "周二";;*)echo "other...";;esac
给testCase.sh一个可执行的权限,然后开始执行
chmod u+x testCase.sh./testCase.sh 1
23.10.3 for循环
基本语法1
for 变量 in 值1 值2 值3.....do程序/代码done
应用案例
案例1:打印命令行输入的参数(这里可以看出@的区别),
$*是把输入的参数当做一个整体来对待,$@是把输入的参数分别对待
创建一个testFor1.sh
vim testFor1.sh
testFor1.sh
#!/bin/bash#案例1:打印命令行输入的参数(这里可以看出$*和$@的区别)#注意,$*是把输入的参数,当做一个整体,所以,只会输出一句for i in "$*"doecho "num is $i"done#使用$@来获取输入的参数,注意:这时是分别对待,所以有几个参数,就输出几句echo "===================================="for j in "$@"do echo "num is $j"done
给testFor1.sh一个可执行的权限,然后开始执行
chmod u+x testFor1.sh
基本语法2
for(( 初始值;循环控制条件;变量变化 ))do程序代码done
应用案例
案例1:从1加到100的值输出显示
创建一个testFor2.sh
vim testFor2.sh
testFor.sh
#!/bin/bash#案例1:从1加到100的值输出显示#定义一个变量 SUMSUM=0for(( i=1; i<=$1; i++))do#写上你的业务代码SUM=$[$SUM=$i]doneecho "总和SUM=$SUM"
给testFor2.sh一个可执行的权限,然后开始执行
chmod u+x testFor2.sh./testFor2.sh 100
23.10.4 while循环
基本语法
while [ 条件判断式 ]do程序/代码done
注意:while和 [ 有空格,条件判断式和 [ 也有空格
应用案例
案例1:从命令行输入一个数n,统计从1+2+….+n的值是多少?
创建一个testWhile.sh
vim testWhile.sh
testWhile.sh
#!/bin/bash#案例1:从命令行输入一个数n,统计从1+2+....+n的值是多少?SUM=0i=0while [ $i -le $1 ]doSUM=$[$SUM+$i]#i自增i=$[$i+1]doneecho "执行结果=$SUM"
给testWhile.sh一个可执行的权限,然后开始执行
chmod u+x testWhile.sh./testWhile.sh 100
23.11 read读取控制台输入
23.11.1 基本语法
read(选项)(参数)
选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数
- 变量:指定读取值时的变量名
23.11.2 应用案例
案例1:读取控制台输入一个NUM1值
案例2:读取控制台输入一个NUM2值,在10秒内输入。
创建一个testRead.sh
vim testRead.sh
testRead.sh
#!/bin/bash#案例1:读取控制台输入一个NUM1值read -p "请输入一个数NUM1=" NUM1echo "你输入的NUM1=$NUM1"#案例2:读取控制台输入一个NUM2值,在10秒内输入。read -t 10 -p "请输入一个数NUM2=" NUM2echo "你输入的NUM2=$NUM2"
给testRead.sh一个可执行的权限,然后开始执行
chmod u+x testRead.sh./testRead.sh
23.12 函数
23.12.1 函数介绍
shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中, 我们这里就介绍两个
23.12.2 系统函数
basename基本语法
- 功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix] 功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’) 字符,然后将字符串显示出来。
- 选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
应用案例
案例1:请返回/home/aaa/test.txt的“test.txt”部分
basename /home/aaa/test.txtbasename /home/aaa/test.txt .txt

dirname基本语法
- 功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分), 然后返回剩下的路径(目录的部分))
应用案例
案例1:请返回/home/aaa/test.txt的/home/aaa
dirname /home/aaa/test.txt

23.12.3 自定义函数
基本语法
[ function ] funname[()]{Action;[return int;]}
调用直接写函数名:funname [值]
应用案例
案例1:计算输入两个参数的和(动态的获取), getSum
创建一个testFun.sh
vim testFun.sh
testFun.sh
#!/bin/bash#案例1:计算输入两个参数的和(动态的获取), getSum#定义函数 getSumfunction getSum() {SUM=$[$n1+$n2]echo "和是$SUM"}#输入两个值read -p "请输入一个数n1=" n1read -p "请输入一个数n2=" n2#调用自定义函数getSum $n1 $n2
给testFun.sh一个可执行的权限,然后开始执行
chmod u+x testFun.sh./testFun.sh
23.13 Shell编程综合案例
23.13.1 需求分析
- 每天凌晨 2:30 备份 数据库 hspEdu到 /data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如: 2021-03-12_230201.tar.gz
- 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
5)画一个思路分析图

23.13.2 代码
/usr/sbin/mysql_db.backup.sh
cd /usr/sbinvim mysql_db_backup.sh
mysql_db_backup.sh
#!/bin/bash#备份目录BACKUP=/data/backup/db#当前时间DATETIME=$(date +%Y-%m-%d_%H%M%S)echo $DATETIME#数据库的地址HOST=localhost#数据库用户名DB_USER=root#数据库密码DB_PW=hspedu100#备份的数据库名DATABASE=hspedu#创建备份目录,如果不存在,就创建#这里用${变量名}而没有用$变量名,其实他们的功能是一样的,唯一的区别是使用${}会比较精确的界定变量名称的范围[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"#备份数据库mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz#将文件处理成tar.gzcd ${BACKUP}tar -zcvf $DATETIME.tar.gz ${DATETIME}#删除对应的备份目录rm -rf ${BACKUP}/${DATETIME}#删除10天前的备份文件find ${BACKUP} -atime + 10 -name "*.tar.gz" -exec rm -rf {} \;echo "备份数据库${DATABASE} 成功"
设置crond定时任务
crontab -e
定时任务内容
30 2 * * * /usr/sbin/mysql_db_backup.sh
