Linux笔记

目录

1、Linux入门

1.1、Linux介绍

Linux的应用领域:

  1. 个人桌面领域的应用:Linux应用的薄弱环节。

  2. 服务器领域:最专业的领域,liunx免费、稳定、高效等特点得到很好的体现。

  3. 嵌入式领域:linux运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百kb等特点。

    主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等,以后在物联网中应用会更广泛。

1.2、概述

  1. Linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级项目(C/C++/PHP/Python/Java/Go)都会部署到Linux/Unix系统上。
  2. 常见的操作系统:Windows、IOS、Android、MacOS、Linux、Unix。
  3. Linux吉祥物:Tux
  4. Linux之父:Linus Torvads(Git创作者)
  5. Linux主要的发行版:Ubuntu(乌班图)、RedHat(红帽)、CentOS、Debain、Fedora、SuSE、OpenSUSE,都是基于Linux内核开发的版本。

1.3、Unix和Linux

Unix是由Ken Tompson 和Dennis richres开发的适用于大型服务器的系统

Linux是由Linus Torvads在Unix基础上开发的适用于x86个人计算机的系统,全称:GNU/Linux

Linux怎么来的

Linux和Unix关系

2、VM和Linux的安装

需要环境:安装一个虚拟机,在虚拟机上安装一个CentOS系统。

2.1、安装VM和CentOS

安装步骤:

  1. 安装virtual Machine ware Workstation16

    激活密钥(批量激活):

    ZF3R0-FHED2-M80TY-8QYGC-NPKYF
    YF390-0HF8P-M81RQ-2DXQE-M2UT6
    ZF71R-DMX85-08DQY-8YMNC-PPHV8

  2. 安装Linux(CentOS 7.6/CentOS 8.5

  3. VM和Linux的关系:

VM和Linux关系

  1. Linux磁盘的手动分区:
    1. boot分区
    2. swap分区(交换分区):用来交换的分区,充当临时内存的角色,需要加载到内存的程序在内存已满的情况下暂时加载到交换分区上,等内存释放资源后再将程序加载到内存中。(交换分区只是虚拟内存,速度比内存慢)
    3. 根分区

2.2、VMware网络连接的三种模式

VMware网络连接的三种方式

桥接模式

VMWare会虚拟一块网卡和真正的物理网卡就行桥接,这样,发到物理网卡的所有数据包就到了VMWare虚拟机,而由VMWare发出的数据包也会通过桥从物理网卡的那端发出。桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接。相当于在一个局域网内创立了一个单独的主机,他可以访问这个局域网内的所有的主机。该模式下主机网卡和虚拟机网卡的IP地址处于同一个网段,子网掩码、网关、DNS等参数都相同。但是同一网段下最多有255种ip地址,超过数量就会造成ip冲突

桥接模式下虚拟机和主机在网络上地位相等,可以理解为一台新的电脑。

NAT模式

nat地址转换 虚拟系统通过本主机与外部系统通信,不造成ip冲突,而且外部系统无法进入到虚拟系统与虚拟系统通信。

主机系统

主机模式:独立的系统,不和外部发生联系。

2.3、虚拟机的克隆

如果已经安装了一台 linux 操作系统,你还想再更多的,没有必要再重新安装,只需要克隆就可以。

  • 方式1:直接拷贝一份安装好的虚拟机文件
    在我的电脑中找到要克隆的虚拟机的文件,赋值后粘贴到另一个位置,在 vmware 中打开就好了。

  • 方式2:使用 vmware 的克隆操作(注意:克隆时,需要先关闭 linux 系统 先关机)

    在 vmware 中鼠标右击要克隆的虚拟机---->管理---->克隆---->克隆方法

    • 克隆方法:
      • 链接克隆:对原系统的引用(本质上没有克隆,就一个系统)
      • 完整克隆:一般选这个,克隆出来的系统与原系统完全一样

2.4、虚拟机的快照

如果在使用虚拟机系统的时候(比如 linux),想回到原先的某一个状态,担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态,vmware 也提供了这样的功能,就叫快照管理

方法:对左栏虚拟机鼠标右击--->快照--->拍摄快照,查看快照管理器,点击要回到的快照图标,转到快照记录的虚拟机状态。

注意:每次拍摄一个快照都是对当前状态进行保存,会占用硬盘空间,做有意义的快照。

虚拟机的快照

2.5、安装vmtools

  1. vmtools 安装后,可以让我们在 windows 下更好的管理 vm 虚拟机

  2. 可以设置 windows 和 centos 的共享文件夹 (主机和虚拟系统都可以操作共享文件夹,更加方便)

2.6、设置共享文件夹

在主机上找到一个位置创建一个文件夹作为共享文件夹
然后在vm上操作:鼠标右击虚拟系统--->设置--->选项--->共享文件夹--->添加(将上述文件夹路径填上就好了)
点击主文件夹--->其他位置--->计算机---->mnt---->hgfs--->共享的文件夹

注意:在实际开发中,文件的上传下载是需要使用远程方式完成的。因为是主机A与主机B上的虚拟系统通信。

3、Linux的目录结构(⭐)

3.1、目录结构的基本介绍

linux 的文件系统是采用级层式的树状目录结构, 在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。

经典名言:在 Linux 世界里,一切皆文件(!!!)

linux的目录结构

注意:Linux操作系统中,每个目录叫什么名字,以及每个目录下存放什么东西都是规定好的。

常用目录说明:

  • /root:存放root用户的文件
  • /bin:存放linux常用指令
  • /boot:linux启动时需要的文件
  • /home:每创建一个用户,在home目录下都会有一个对应用户名的文件夹
  • /dev:设备管理器(linux会把所有硬件映射成文件来管理 ——> Linux下一切皆文件!)

Linux目录结构都是规定好的,需要会背!(实际开发环境中都是使用小黑窗口操作linux系统)

3.2、具体的目录结构

目录 注解 介绍
/bin 常用 是 Binary 的缩写, 这个目录存放着最经常使用的命令;子目录:/usr/bin 和 /usr/local/bin
/sbin s 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序;子目录:/usr/sbin 和 /usr/local/sbin
/home 常用 存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名
/root 常用 该目录为系统管理员,也称作超级权限者的用户主目录
/lib 系统开机所需要最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
/lost+found 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件(该目录隐藏起来了,使用命令可以看到)
/etc 常用 所有的系统管理所需要的配置文件和子目录, 比如安装 mysql 数据库 my.conf
/user 常用 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows 下的 program files 目录
/boot 常用 存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件
/proc 不能动这个文件,可能造成系统崩溃 这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息
/srv 不能动 service 缩写,该目录存放一些服务启动之后需要提取的数据
/sys 不能动 这是 linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs
/tmp 这个目录是用来存放一些临时文件的
/dev 类似于 windows 的设备管理器,把所有的硬件用文件的形式存储
/media 常用 linux 系统会自动识别一些设备,例如 U 盘、光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下
/mnt 常用 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。 (比如共享文件)
/opt 这是给主机额外安装软件所存放的目录(想要安装某个软件,把它的安装软件放在这个目录下)。如想要在虚拟系统上安装 ORACLE 数据库就可以先把其安装文件放在该目录下。默认为空
/user/local 常用 这是另一个给主机额外安装软件所安装的目录(软件安装后的目标目录)。一般是通过编译源码方式安装的程序
/var 常用 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件
/selinux security-enhanced linux SELinux 是一种安全子系统,它能控制程序只能访问特定文件, 有三种工作模式,可以自行设置. 类似于360,保证系统安全。这个目录看不到,因为没有被启用

4、远程登陆Linux服务器

4.1、为什么需要远程登录linux

说明: 公司开发时候,具体的应用场景:

  1. linux 服务器是开发小组共享
  2. 正式上线的项目是运行在公网
  3. 因此程序员需要远程登录到 Linux 进行项目管理或者开发

如何远程操作linux

4.2、远程登录工具Xshell

  1. Xshell 是目前最好的远程登录到 Linux 操作的软件,流畅的速度并且完美解决了中文乱码的问题,是目前程序员首选的软件。
  2. Xshell 是一个强大的安全终端模拟软件,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。
  3. Xshell 可以在 Windows 界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。

注意:

  1. 使用Xshell之前,需要知道Linux的ip地址
    在Linux中,鼠标右击桌面打开终端,输入ifconfig指令,ens33中,就可以知道ip地址了。
  2. 要保证本机可以ping通虚拟主机:在本机DOS命令窗口中输入命令:ping 虚拟主机ip地址

登录Xshell:

  1. 打开Xshell--->添加会话--->主机(虚拟主机ip地址)--->确定
  2. 双击密钥--->选择接受并保存主机密钥(就不用重复接受了)
  3. 远程登陆成功

Xshell7

说明:在Linux终端或Xshell页面中,输入指令clear,可以“清空”当前页面内容(实际上是另开了一页,原有信息仍保存)。

4.3、远程传输文件工具Xftp

  1. 是一个基于 windows 平台的功能强大的 SFTP、FTP 文件传输软件。
  2. 使用了 Xftp 以后,windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件

注意:xftp打开时乱码:属性--->选项--->UTF-8编码

Xftp7

5、Vi 和 Vim编辑器

5.1、vi和vim基本介绍

Linux 系统会内置 vi 文本编辑器。

Vim可以看作是Vi的增强版本,Vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富。

5.2、vi和vim常用三种模式

  1. 正常模式(默认模式,一般模式)
    以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。
    在这个模式中,可以使用『上下左右』按键来移动光标
    可以使用『删除字符』『删除整行』来处理档案内容,
    也可以使用『复制、粘贴』来处理你的文件数据。

  2. 插入模式

    一般模式下,按『i』键进入编辑模式(按下 i, I, o, O, a, A, r, R 中任何一个字母之后都会进入编辑模式,一般按『i』键,表示insert插入)后,可以在当前文件中执行写入操作

  3. 命令模式

    一般模式下,按『:』键 或 『/』键 进入命令模式(注意:如果是按冒号,必须是英文状态下的冒号)

    在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开 vim,显示行号等动作,输入指令后需要按『Enter』键执行指令。

5.3、vim三种模式的切换

vim三种模式的切换

5.4、vim常用快捷键

快捷键 模式 介绍
wq 命令模式 保存写入并退出vim(wq, write quit)
q 命令模式 退出vim(不保存)
q! 命令模式 强制退出vim(不保存)
yy 一般模式 复制光标所在的当前行
p 一般模式 在当前行的下一行粘贴复制的内容
5yy 一般模式 复制光标所在行开始的5行(yy前的数字任意)
dd 一般模式 删除光标所在行的当前行
5dd 一般模式 删除光标所在行开始的5行(dd前的数字任意)

在文件中查找某个单词

  1. 初始在正常模式,输入/,进入命令行模式,然后输入要查找的单词,回车查找
  2. 输入n查找到下一个
  3. 想查找另一个单词:输入/,重复上述即可

给文件每行设置行号

  1. 先按『:』键
  2. 然后输入set nu (set number)
  3. 按『Enter』键

取消行号

  1. 先按『:』键
  2. 然后输入set nonu (set none number)
  3. 按『Enter』键

修改主机名

指令:hostnamectl set-hostname 新主机名

其他快捷键

  • 快捷键到该文档的最首行(正常模式下):gg

  • 快捷键到该文档的最末行(正常模式下):G

  • 撤销动作(比如删除某一行,发现删错了,然后恢复这一行)(正常模式):u

  • 在某个文件中,想让光标移动到第n行(正常模式):输入n,然后再按『shift+g』

5.5、vim键位图

vim键位图

vim键盘图

6、开机/重启/用户登录注销

6.1、关机和重启命令

命令 介绍
shutdown -h now 立即关机(h—>halt停止)
halt 立即关机,同上
shutdown 1分钟后关机
shutdown -h 1 同上,给每一个登录到Linux系统的用户发一条消息:1分钟后关机
shutdown -h 2 2分钟后关机
shutdonw -r now 现在重新启动(r—>rboot重启)
reboot 现在重新启动,同上
sync 把内存的数据同步到磁盘
注意 不管是重启还是关机,首先要运行 sync 命令,把内存中的数据写到磁盘中;目前的 shutdown/reboot/halt 等命令均已经在关机前进行了sync,但还是手动执行一下sync保险

既可以在Xshell,也可以在Linux执行上述指令

6.2、用户登录和注销

用户登录:
登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。
而且以后也用不到root,除非你是系统管理员。
可以利用普通用户登录,登录后再用 su - 用户名 命令来切换成系统管理员身份.

注销:在提示符下输入 logout 即可注销用户

注意:logout 注销指令在图形运行级别无效,在运行级别 3 下有效.

7、用户管理

7.1、基本介绍

Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

一个Linux系统中只有一个root用户,但是由root用户可以创建多个其他用户,可以给这些用户分配权限,
其中每个用户会对应一个目录,这个目录称为家目录。

7.2、添加用户

语法:

useradd 用户名
useradd milan

注意:当创建用户成功后,会自动创建和用户同名的家目录,该用户的家目录默认在home目录下

也可以给新用户指定家目录:useradd -d 指定目录 新用户名
比如:useradd -d /home/test king -> 创建一个新用户king,其家目录test

7.3、指定、修改密码

语法:passwd 用户名 表示给某个用户设置/更改密码

注意:要写用户名。不写用户名默认设置当前用户,如果当前用户是root就麻烦了。

比如:给milan设置密码,输入:passwd milan 后再按Enter键输入milan的密码。

命令:pwd --->显示当前用户所在目录(pwd, Print Working Directory)

7.4、删除用户

语法:userdel 用户名

普通用户不能删除别的用户,只有root用户可以;并且不能自己删除自己

  1. 删掉用户,但是保留其家目录:userdel 用户名

  2. 将用户和其家目录一起删除(这个操作要谨慎):user -r 用户名

  3. 一般情况,建议保留家目录(不删除)

注意:如果使用user1用户登录系统,然后使用su - root方式切换登录到root用户,去删除user1用户会操作失败(因为user1的用户系统还在运行,无法删除自己)。

7.5、查询用户信息

语法:id 用户名

[root@luminescent home]# id root
uid=0(root) gid=0(root) 组=0(root)

userid是0 gruopid组id是0 所在组0

当用户不存在:返回无此用户 no such user

[root@luminescent home]# id milan
id: milan: no such user

7.6、切换用户

在操作Linux中,如果当前用户的权限不够,可以通过su - 指令,切换到高权限用户(需要输入高权限用户的密码)(比如 root)

语法:su - username

注意:

  1. 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
  2. 当需要返回到原来用户时,使用exit/logout指令。

su usernamesu - username的区别:

  • su username:只切换执行权限,并没有切换Shell环境,使用pwd指令查看工作空间还是上一次su - username后的工作空间(如果没有su - username操作则显示第一次登录系统时)的username工作目录。使用su切换执行权限后只能使用exit指令返回原用户。注意:su后面如果不跟username,则默认切换到root执行权限
  • su - username:切换到用户的变量。su - username操作连用户和环境变量一起切换到username,使用pwd查看工作空间会发现已经切换到工作空间。使用su - username切换后会有username上一次的登录信息提示。使用su-切换执行权限和环境变量后可以使用logout或exit指令返回原用户。注意:su-默认切换到root并获得root环境变量和执行权限。
  • 总结:su默认切换到root,su-默认切换到root并获得root的环境变量及执行权限

7.7、查看当前用户/登录用户

  1. 指令who am i/I -> 查看第一次登录系统的用户,如:who am Iwho am i

  2. 指令whoami -> 查看当前登陆系统的用户(如果使用su指令切换了用户,则显示切换后的用户名)。

    注意:连写后i只能小写。错误指令×:whoamI

假设A用户登录系统,切换到B用户,B输入命令who am i,输出的还是A用户的信息。

7.8、用户组

介绍:类似于角色,系统可以对有共性/有相同的权限的多个用户进行统一的管理

新增组:groupadd 组名

需求:假如A用户和B用户有相同的权限,给每个用户赋权。

解决方案:可以把A用户和B用户放在一个组里,然后给这个组赋权限,组里的用户有相同的权限。

说明:新增一个用户,其实会默认生成一个跟用户名相同的组,然后把用户放到该组里。
就像是 id root:uid=0(root) gid=0(root) 组=0(root)--->root组

案例1:增加一个用户zwj,把他直接放到组wudang中

groupadd wudang
useradd -g wudang zwj
id zwj:uid=1001(zwj) gid=1001(wudang) 组=1001(wudang)

修改用户的组:usermod -g 用户组 用户名
案例2:把zwj 放到组 mojiao 中

groupadd mojiao
usermod -g mojiao zwj
id zwj:uid=1001(zwj) gid=1002(mojiao) 组=1002(mojiao)

说明:当新增一个用户user时,user默认在以自己的名字命名的组user中,想要将新增的用户user放进其他组中,使用usermod命令

新增一个用户john,怎么把john放进组mojiao中?
useradd jhon
usermod -g mojiao jhon
新增一个用户john,john在以自己的名字命名的组john中,从john组到mojiao组

删除组:groupdel 组名

7.9、用户和组相关文件

注意:用户和组相关文件需要root权限

(1)/etc/passwd 文件

每增加一个用户,就会把用户的信息保存到该文件。用户(user)的配置文件,记录用户的各种信息

每行都是一个用户,每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

说明:

  • 主目录:用户所在的家目录

  • Shell:命令解释程序。shell是连接用户和Linux内核的桥梁

    将发布的指令通过shell解析,再传给Linux内核,Linux是看不懂发布的指令的,shell有很多种,中国一般用的是bash

  • 使用命令:vim /etc/passwd 可以查看该文件(还有其他命令也可以查看,如cat指令)

(2)/etc/shadow 文件

口令的配置文件

每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

(3)/etc/group 文件

组(group)的配置文件,记录 Linux 包含的组的信息每行含义:组名:口令:组标识号:组内用户列表

7.10、拓展-Shell

Shell是什么?

图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?

用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell

Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质

Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux

Shell如何连接用户和内核?

Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!

其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。

接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

比如,我们都知道在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了

Shell连接其他程序

在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。

Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。

可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。

用户-Shell-内核

Shell是一种脚本语言

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。

这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。

而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。

这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可

8、实用指令

8.1、指定运行级别

Linux系统运行级别:

  • 0:关机 -> 类似于shutdown -h now指令
  • 1:单用户【可以找回丢失密码】
  • 2:多用户状态没有网络服务(一般不用,没网络)
  • 3:多用户状态有网络服务(实际开发中,linux系统都是以级别3运行的 -> 没有图形化界面,只有窗口)
  • 4:系统未使用保留给用户
  • 5:图形界面
  • 6:系统重启

切换运行级别命令:init 0-6

指定默认运行级别:

  • CentOS7之前是在文件/etc/inittab文件中设置
  • CentOS7之后对设置进行了简化:
    • multi-user.target 代表3运行级别
    • graphical.target 代表5运行级别

命令:systemctl get-default 查看当前系统运行级别

命令:systemctl set-default multi-user.target|graphical.target 设置默认运行级别

注意:设置默认运行级别后需要重启系统才能生效。

8.2、重置root用户密码

  1. 启动虚拟机时 按【ESC】键

  2. 在linux启动页面选择Linux内核后,按【e】键

    linux启动页面

  3. 找到以“linux16”开头的行,【→】方向键移动光标至改行的“UTF-8”之后,添加以下红框中的内容即:rw single init=/bin/bash,再按【Ctrl】+【x】键执行

    Linux重置root密码步骤1

  4. 在如下图所示位置,输入passwd指令设置新的root密码(输入的root密码是隐藏的,所以切记谨慎输入并记住新的root密码)

    Linux重置root密码步骤2

  5. 输入新的root密码后,再输入指令exec /sbin/init重新初始化,正常启动系统

  6. 输入刚刚新设置的root密码(输入内容是隐藏的),如下图所示

    Linux重置root密码步骤3

  7. 进入系统后,输入reboot指令,重启系统即可使用新的root密码登录

  8. Linux系统root用户密码重置完成。

8.3、帮助指令

  1. man命令
  • 语法:man 命令/配置文件

    是manual的简写,manual是手册的意思,获得帮助信息

  • 例子:查看ls命令的帮助信息

    输入:man ls 之后,会看到ls的具体信息(要回到前一个页面,输入q)

    注意:可能不止一页,使用空格或下键,可以往下看

    ==在Linux系统下,隐藏文件是以.开头的

  1. ls命令:列出目录内容
  • 格式:ls [选项] [文件名...]

    ls -a --->列出所有文件,包括隐藏文件(隐藏文件以 . 开头)

    ls -l --->单列输出

  • 选项以 - 开始
    选项可以组合使用,没有顺序:
    比如:ls -al也可以ls -a -l表示列出所有的文件 并 单列输出,ls -lll等价

  • ls默认是对当前目录下的文件
    也可以指定某个目录:
    如:ls -al /root 表示把root目录下的所有文件单列输出

  1. 语法:help 命令
  • 功能:获得 shell 内置命令的帮助信息
  • 例子:查看 cd 命令的帮助信息:help cd

8.4、关于文件目录的指令

  • pwd指令:显示当前工作目录的绝对路径

  • ls [选项] [目录|文件]指令:

    常用选项:

    • -a:显示当前目录所有的文件和目录,包括隐藏的
    • -l:以列表的方式显示信息
    • -R:递归列出遇到的子目录
  • cd [绝对路径|相对路径]指令:切换到指定目录

    cd ~或者cd回到自己的家目录

    cd ..:回到当前目录的上一级目录。如果已经在根目录,则保持不变

  • mkdir [选项] 要创建的目录

    理解:mkdir指令用于创建目录(默认只能创建一级目录)

    选项-p:创建多级目录。如:mkdir -p /home/test/linux

  • rmdir [选项] 要删除的空目录

    rmdir删除的是空目录,如果欲删除的目录下有内容则无法删除

    如果需要删除非空目录,需要使用rm -rf 要删除的目录

    比如:删除animal目录:rm -rf /home/animal

  • touch 要创建的文件名称

    如:touch /home/a.txt 表示在home目录下创建一个a.txt空文件

  • cp [选项] source dest指令:拷贝文件到指定目录

    常用选项:-r 递归复制整个文件夹

    应用实例:将 /home/hello.txt 拷贝到 /home/bbb 目录下

    cp /home/hello.txt /home/bbb
    

    递归复制整个文件夹,将/home/aaa 目录下的文件全部拷贝到/home/bbb下

    cp -r /home/aaa /hom/bbb
    

    (是将整个目录和目录本身拷贝进来),使用强制覆盖不提示的方法:\cp。如:\cp -r /home/aaa /home/bbb

  • rm指令:移除文件或目录

    基本语法:rm [选项] 要删除的文件或目录

    常用选项:

    -r:递归删除整个文件夹

    -f:强制删除不提示

    案例1:将 /home/hello.txt 删除

    rm /home/hello.txt
    

    案例2:递归删除整个文件夹 /home/bbb ,并不提示

    rm -rf /home/bbb 
    

    注意:强制删除不提示的方法:带上 -f 参数即可

  • mv指令:移动文件与目录或重命名
    基本语法:

    mv	原文件名 新文件名 	    (如果两个文件在同一个目录下,mv指令功能:重命名)
    mv  被移动的文件 移动到哪   (如果两个文件不在同一个目录下,mv指令功能:移动文件)
    

    案例 1: 将 /home/cat.txt 文件 重新命名为 pig.txt

    [root@luminescent ~]# cd /home
    [root@luminescent home]# touch cat.txt
    [root@luminescent home]# ls
    cat.txt  jack  king  milan  zwj
    [root@luminescent home]# mv cat.txt pig.txt
    [root@luminescent home]# ls
    jack  king  milan  pig.txt  zwj
    

    案例 2:将 /home/pig.txt 文件 移动到 /root 目录下

    [root@luminescent home]# mv pig.txt /root
    [root@luminescent home]# ls
    jack  king  milan  zwj
    [root@luminescent home]# cd /root
    [root@luminescent ~]# ls
    Hello.java  pig.txt
    

    移动并重名:mv pig.txt /root/cow.txt

    案例 3: 移动整个目录,比如将 /opt/bbb 移动到 /home 下

    mv /opt/bbb /home/
    
  • cat指令:查看文件内容

    vi和vim指令能查看文件内容,但是容易误操作编辑文件内容。相比于vi|vim指令,cat也可以查看,cat只能查看不能修改,cat更安全。

    基本语法:cat [选项] 要查看的文件

    常用选项:-n(显示行号)

    案例1:查看 /etc/profile 文件内容,并显示行号。

    cat -n /etc/profile 
    

    注意:
    cat 只能浏览文件,而不能修改文件;为了浏览方便再加上管道命令 | more

    管道命令:把前面的结果再交给下一个指令进行处理。语法:| 其他指令

    cat	-n /etc/profile | more
    意思:先执行cat -n /etc/profile 然后,按回车键输出一行,按空格翻页等。
    
  • more指令:管道命令

    基本语法:more 要查看的文件 功能: more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。 more 指令中内置了若干快捷键(交互的指令),详见操作说明:

    操作 功能说明
    空格键 代表向下翻一页
    Enter(回车) 代表向下翻一行
    q 代表立刻离开more,不再显示该文件内容
    Ctrl+F 向下滚动一屏
    Ctrl+B 返回上一屏
    = 输出当前行的行号
    :f 输出当前文件名号和当前行的行号
  • less指令:查看文件内容

    基本语法:less 要查看的文件

    功能:
    less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。

    less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率

    有一个文件是100M,用vim查看会将其全部加载再显示出来,这样会很慢。使用less,会先加载一部分显示出来,再根据指令显示剩下的,这样更快。

    所以要查找一些大的文件,建议用less。

    案例: 采用 less 查看一个大文件文件 /root/武炼巅峰.txt

    首先使用Xftp将 武炼巅峰.txt 传输到root目录下,然后输入指令:less /root/武炼巅峰.txt

    下面操作中:

    • 想要找某个字或词
    • 输入:/要找的字或词 然后按n向下找 按N向上找
    • 操作说明:
    操作 功能说明
    空格键 向下翻一页
    [pagedown] 向下翻动一页
    [pageup] 向上翻动一页
    /字串 向下搜寻[字串]的功能,[n]键向下查找,[N]键向上查找
    ?字串 向上搜寻[字串]的功能,[n]键向上查找,[N]键向下查找
    q 离开less命令
  • echo指令:输出内容到控制台

    基本语法:echo [选项] [输出内容]

    案例: 使用 echo 指令输出环境变量输出$PATH $HOSTNAME

    echo $HOSTNAME (环境变量一般加$)
    

    案例: 使用 echo 指令输出 hello,world

    echo "hello,world" (加不加引号都可以)
    
  • head指令:用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容。

    基本语法:

    head  文件	    (功能描述:查看文件头 10 行内容)
    head -n 5 文件	(功能描述:查看文件头 5 行内容,5 可以是任意行数)
    

    案例: 查看/etc/profile 的前面 5 行代码

    head -n 5 /etc/profile
    
  • tail指令:tail 用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前 10 行内容。

    基本语法:

    tail 文件	    (功能描述:查看文件尾 10 行内容)
    tail -n 5 文件	(功能描述:查看文件尾 5 行内容,5 可以是任意行数)
    tail -f	文件	    (功能描述:实时追踪该文档的所有更新,只要该文件改动了什么内容就可实时看到,常用于监控用户操作)
    
  • >指令和>>指令:

    >指令:输出重定向(覆盖)

    >>指令:文件末尾追加

    基本语法:

    ls -l > 文件1	         (功能描述:将列表的内容写入文件1中(覆盖写))
    ls -al >> 文件1        (功能描述:将列表的内容追加到文件1的末尾)
    cat 文件1 > 文件2	  (功能描述:将文件1的内容覆盖到文件2)
    echo "内容" >> 文件1     (将内容追加到文件1的末尾)
    

    案例 1: 将 /home 目录下的文件列表 写入到 /home/info.txt 中,覆盖写入。

    ls -l /home > /home/info.txt	[如果 info.txt 没有,则会自动创建] 
    

    案例 2: 将当前日历信息追加到 /home/mycal 文件中

    cal >> /home/mycal
    
  • ln指令:给原文件创建一个软链接,软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径(ln:link)

    基本语法:

    ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)
    

    案例1:在/home 目录下创建一个软连接 myroot,连接到 /root 目录(这样 切换到myroot 其实就是切换到root)

    ln -s /root	/home/myroot
    

    案例2: 删除软连接 myroot

    rm	/home/myroot
    

    当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录。

  • history指令

    功能:查看已经执行过历史命令,也可以执行历史指令

    基本语法:

    history (功能描述:查看已经执行过历史命令)
    可以看其他登录的用户做了什么操作。
    

    案例 1: 显示所有的历史命令:history

    案例 2: 显示最近使用过的 10 个指令:history 10

    案例 3:执行历史编号为 5 的指令:!5

8.5、关于时间日期的指令

  1. date指令:显示当前日期

    1. 基本语法:
    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"
    
    1. 设置日期
    date -s	字符串时间
    

    案例 1: 设置系统当前时间:date -s "2020-11-03 20:02:10"

  2. cal指令:查看日历

    cal [选项] (功能描述:不加选项,默认显示本年本月日历)
    

    案例 1: 显示当前日历:cal
    案例 2: 显示 2020 年日历:cal 2020

8.6、关于搜索查找的指令

  1. find指令:从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法:

    find [搜索范围] [选项]
    
    选项 功能
    -name<查询方式> 按照指定的文件名查找模式查找文件
    -user<用户名> 查找属于指定用户名所有文件
    -size<文件大小> 按照指定的文件大小查找文件,文件大小单位:k,M,G

    案例 1: 按文件名:根据名称查找 /home 目录下的 hello.txt 文件

    find /home -name hello.txt
    

    案例 2:按拥有者:查找 /opt 目录下,用户名称为 nobody 的文件

    find /opt -user nobody
    

    案例 3:查找整个 linux 系统下大于200M的文件(+n 大于,-n 小于,n 等于)

    find / -size +200M
    ls -l  /home/yxz/novel
    总用量 57504
    -rw-r--r--. 1 root root 58882838 4月   3 11:59 武炼巅峰.txt
    ls -lh  /home/yxz/novel (上面的总用量大小看不懂,加上h->human表示能看懂的内容)
    总用量 57M
    -rw-r--r--. 1 root root 57M 4月   3 11:59 武炼巅峰.txt
    
  2. locate指令:
    可以快速定位文件路径。利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。

    基本语法:locate 搜索文件

    注意:由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。

    案例 1: 请使用 locate 指令快速定位 hello.txt 文件所在目录

    updatedb
    locate hello.txt
    
  3. which指令:可以查看某个指令在哪个目录下

    案例:ls 指令在哪个目录:which ls

  4. grep指令和管道符号|

    grep指令往往和管道符号 | 结合使用

    grep:过滤查找,管道符:| -> 表示将前一个命令的处理结果输出传递给后面的命令处理。

    比如:先cat a.txt,然后又想看a.txt文件中有没有hello这个词,那么就 cat a.txt | grep "hello" --->先找到a.txt,然后再在a.txt中找hello。

    基本语法grep [选项] 查找内容 源文件

    常用选项

    • -n:显示匹配行及行号
    • -i:忽略字母大小写

    案例 1: 请在 hello.txt 文件中,查找"yes"所在行,并且显示行号

    写法 1: cat /home/hello.txt	| grep "yes"  引号写不写都行
    		cat /home/hello.txt	| grep -n "yes"   显示行号
    写法 2: grep -n "yes" /home/hello.txt
    

    案例 2:在武炼巅峰.txt 文件中,查找"扇轻罗"所在行,并显示行号

    cat /home/yxz/novel/武炼巅峰.txt | grep -n "扇轻罗" | more
    grep -n "扇轻罗" /home/yxz/novel/武炼巅峰.txt | more
    

8.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
  1. zip/unzip 指令

    zip 用于压缩文件

    unzip 用于解压的 (这个在项目打包发布中很有用)

    基本语法

zip	[选项] XXX.zip 将要压缩的内容    (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip	              (功能描述:解压文件)

zip 常用选项-r:递归压缩,即压缩目录

unzip 的常用选项-d<目录>:指定解压后文件的存放目录

案例 1:将 /home 下的所有文件/文件夹压缩成 myhome.zip

zip -r myhome.zip /home/	[将 home 目录及其包含的文件和子文件夹都压缩] 

案例 2:将 myhome.zip 解压到 /opt/tmp 目录下

mkdir /opt/tmp
unzip -d /opt/tmp /home/myhome.zip
  1. tar 指令:打包指令,最后打包后的文件是 .tar.gz 的文件。把一个或者多个文件(夹)用压缩软件进行压缩的过程,一般可称之为打包。

    tar指令可以压缩也可以解压。根据选项来 压缩还是解压。基本语法:

tar	[选项] XXX.tar.gz 打包的内容	  (功能描述:打包目录,压缩后的文件格式.tar.gz)
选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar文件

案例 1:压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz

tar -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 解压到当前目录:tar -zxvf pc.tar.gz

案例 4:将 myhome.tar.gz 解压到 /opt/tmp2 目录下

(1)	mkdir /opt/tmp2 
(2) tar -zxvf /home/myhome.tar.gz -C /opt/tmp2

注意:-C 后写要解压到的位置

9、组管理和权限管理

9.1、Linux组基本介绍

在 linux 中的每个用户必须属于一个组,不能独立于组外。

在 linux 中每个文件都有所有者、所在组、其它组的概念。

  1. 所有者
  2. 所在组
  3. 其它组
  4. 改变用户所在的组

9.2、文件/目录的所有者

一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。但是所有者也可以更改。

  1. 查看文件/目录的所有者(在/home下才能看到)

    指令:ls –ahl

drwxr-xr-x.  6 root root   4.0K 2月  23 13:59 .
dr-xr-xr-x. 18 root root   4.0K 2月  20 16:45 ..
-rw-r--r--.  1 root root     24 2月  22 21:59 hello.txt
...

第三列就是文件/目录的所有者,第四列是文件/目录所在组(创建该文件/目录的所有者所在的组,也可以后期修改所在组)

  1. 修改文件/目录所有者指令:chown 新所有者 文件名

    案例:使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom

    chown tom apple.txt

9.3、组的创建

基本指令:groupadd 组名

案例:创建一个用户 fox ,并放入到 monster 组中:useradd -g monster fox

9.4、文件/目录所在组

当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。

查看文件/目录所在组,指令:ls –ahl或者ll

注意:ll并不是linux下一个基本的命令,它实际上是ls -l的一个别名。Ubuntu默认不支持命令ll,必须用 ls -l,这样使用起来不是很方便。

注意:/etc/group下存放着所有的组

使用指令:cat /etc/group可以查看所有的组

比如查看有没有mojiao这个组,可以使用管道命令和grep过滤:cat /etc/group | grep mojiao

9.5、其他组

除文件的所有者和所在组的用户外,系统的其它用户都是该文件的其它组。

9.6、改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组。

改变用户所在组

usermod	–g	新组名	用户名
usermod	–d	目录名	用户名	 (改变该用户登陆的初始目录)

特别说明:用户需要有进入到新目录的权限。

如何查看用户所在的组?id 用户名 --->显示用户信息

案例:将 zwj 这个用户从原来所在组,修改到 wudang 组

先查看zwj在哪个组:id zwj
然后查看有没有wudang这个组:cat /etc/group | grep wudang
修改:usermod -g wudang zwj

9.7、权限基本介绍

ls -l中显示的内容如下:

[root@luminescent home]# ll
总用量 8
-rw-r--r--.  1 root root    0 4月   4 15:19 a.txt
drwxr-xr-x.  2 root root 4096 4月   4 15:21 file
lrwxrwxrwx.  1 root root    5 4月   4 15:18 myroot -> /root
drwx------. 16 yxz  yxz  4096 4月   4 14:45 yxz

第一列共10位,以drwxr-xr-x为例:

0-9 位说明:

  • 第 0 位确定文件类型(d, - , l , c , b)

    • d 是目录,相当于 windows 的文件夹

    • - 代表是普通文件(.txt)

    • l 是链接(link),相当于 windows 的快捷方式

    • c 是字符(char)设备文件,比如鼠标,键盘 ---> /dev/目录下可以看到

    • b 是块(block)设备,比如硬盘 ---> /dev/目录下可以看到

  • 第 1-3 位确定该文件的所有者对该文件的权限。---User

  • 第 4-6 位确定该文件所属的组和该组中的用户对该文件的权限。---Group

  • 第 7-9 位确定其他用户(不是所有者,也不是同一组的其他用户)对该文件的权限 ---Other

9.8、rwx权限详解

权限有三种:

  • r 代表可读(read)
  • w 代表可写(write)
  • x 代表可执行(execute)

rwx作用到文件:

  • r: 可以读取,查看

  • w: 可以修改,但是不代表可以删除该文件

    注意:删除一个文件的前提条件是 对该文件所在的目录 有 写(w)权限,才能删除该文件.

  • x: 可以被执行,前提是可执行文件

rwx作用到目录:

  • r: 可以读取,可以使用ls指令查看目录内容
  • w: 可以修改,可以对目录进行 创建+删除(删除该目录的前提是:对父目录拥有w权限)+重命名目录
  • x: 可以使用cd指令进入该目录

9.9、文件/目录权限实际案例

-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc为例,进行分析:

  1. 第一列中 10 个字符:-rwxrw-r--

    确定不同用户能对文件干什么(权限):

    第一个字符代表文件类型:- l d c b

    其余字符每 3 个一组(rwx):读(r) 写(w) 执行(x)

    第一组 rwx:文件所有者的权限是 可读、写和执行
    第二组 rw-:与文件所有者同一组的用户的权限是 可读、写但不能执行
    第三组 r--:不与文件拥所有者同组的其他用户 的权限是 可读但不能写和执行

也可以用数字表示对应的权限:r=4,w=2,x=1 -> 7种组合情况:rwx=4+2+1=7, rw-=4+2=6, r-x=4+1=5, r--=4, -wx=2+1=3, -w-=2, --x=1

  1. 第二列:1
  • 如果是普通文件,直接就是1;
  • 如果是目录,代表该目录下有多少内容(即子目录数+文件数),目录最少是2 -> 每个目录至少包含两个隐藏目录(子目录. 和 父目录..)
  1. 第三列:root 该文件/目录的所有者
  2. 第四列:root 该文件/目录的所在组
  3. 第五列:1213 文件大小(这里是字节)
  4. 第六列:Feb 2 09:39 最后修改日期
  5. 第七列:abc 文件名

9.10、chmod修改权限

基本说明

通过 chmod 指令,可以修改文件或者目录的权限。

第一种方式:通过 + 、-、= 变更权限

  • u:所有者
  • g:所在组(同一个组的其他用户)
  • o:其他人(不同一个组的其他用户)
  • a:所有人(所有用户)(u、g、o 的总和)

语法格式

chmod u=rwx,g=rx,o=x 文件/目录名  (该文件/目录的u的权限是rwx,g的权限是rx,o的权限是x)
chmod o+w 文件/目录名  			(该文件/目录的o的权限加上w)
chmod a-x 文件/目录名 			 (取消该文件/目录的所有人的x权限)

案例演示:

1.给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。

chmod u=rwx,g=rx,o=rx abc

2.给 abc 文件的所有者除去执行的权限,增加组写的权限

chmod u-x,g+w abc

3.给 abc 文件的所有用户添加读的权限

chmod a+r abc

注意:文件名的颜色表示该文件类型

  • 可执行文件 ——> 文件名 绿色
  • 普通文件 ——> 文件名 白色
  • 目录/文件夹 ——> 文件名 蓝色
  • 压缩文件 ——> 文件名 红色

第二种方式:通过数字变更权限

权限可以用数字代替:r=4 w=2 x=1

chmod u=rwx,g=rx,o=x 文件/目录名
相当于 
chmod 751 文件/目录名

案例演示:将/home/abc.txt文件的权限修改成rwxr-xr-x,使用给数字的方式实现

rwxr-xr-x:u-rwx g=r-x o=r-x
chmod 755 /home/abc.txt

9.11、chown修改文件/目录所有者

语法格式

chown newowner 文件/目录			(修改所有者)
chown newowner newgroup	文件/目录 	(同时修改所有者和所在组)

选项:-R:如果是目录 则使其下所有子文件或目录递归生效(R:Recursive递归)

案例演示

1.请将 /home/abc.txt 文件的所有者修改成 tom

chown tom /home/abc.txt

2.请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom

chown -R tom /home/test

9.12、chgrp修改文件/目录的所在组

语法格式chgrp newgroup 文件/目录

案例演示:

  1. 将 /home/abc.txt 文件的所在组修改成shaolin(少林)

groupadd shaolin

chgrp shaolin /home/abc.txt

  1. 将 /home/test 目录下所有的文件和目录的所在组都修改成shaolin(少林)

chgrp -R shaolin /home/test

9.13、实操-警察土匪游戏

有两个组:police组,bandit组

有四个用户:jack,jerry,xh,xq

jack,jerry:警察 xh,xq:土匪

  1. 创建组
    groupadd police,groupadd bandit

  2. 创建用户(直接放到对应组)
    useradd -g police jack
    useradd -g police jerry
    useradd -g bandit xh
    useradd -g bandit xq

  3. jack创建一个文件,自己可以读 r 写 w,本组人可以读,其它组没人任何权限

    1. 首先jackie登录,可以使用切换用户:su jackie ----> 这样不行,无法创建文件,权限不够
    2. 先设置jack登陆密码:passwd jack,密码为:jack
    3. su - jack,切换到jack的环境变量和执行权限
    4. 创建文件:touch jackie.txt
    5. 原文件权限:-rw-r--r--,设置文件权限:chmod o-r jack.txt 或者使用数字修改权限:chmod 640 jack.txt
  4. jack修改jack.txt文件,让其它组人可以读,本组人可以读写

    chmod o+r jack.txt 或者 chmod 664 jack.txt

    改后的权限:rw-rw-r--

  5. xh投靠警察:usermod -g police xh(需要root权限)

  6. 测试xh和xq能不能对jackie.txt文件进行读写,分别使用xh和xq登录(首先对其设置密码123)

    1. 要想对jack.txt文件进行操作,首先需要进入jack目录,但是jack目录权限是:rwx------,所以xh连jackie目录都进不去
    2. 登录jack,对jack目录权限进行修改(也可以登录root进行修改)(必须都在home下才能执行这个修改权限命令)

结论:如果要对目录内的文件进行操作,首先要有对该目录有相应权限

9.14、练习

练习一:西游记的角色管理

  1. 建立两个组(神仙(sx),妖怪(yg))

    groupadd sx, groupadd yg

  2. 建立四个用户(唐僧ts,悟空wk,八戒bj,沙僧ss),妖怪组yg:悟空,八戒;神仙组sx:唐僧,沙僧

    神仙组用户:useradd -g sx ts, useradd -g sx ss, 妖怪组用户: useradd -g yg wk, useradd -g yg bj

  3. 设置密码(都为123):passwd 用户名

  4. 用悟空建立一个文件 monkey.txt ,该文件要输出 i am a monkey

    1. 切换至悟空登录:su - wk
    2. 修改文件内容:vim monkey.txt -> 输入内容:i am a monkey
    3. 保存并退出到命令行:[ESC]键 -> :wq
  5. 给八戒一个可以 rw 的权限

    1. 修改悟空的家目录权限(给同组用户增加rwx权限):cd /home -> chmod g+r+w+x wk
    2. 修改monkey.txt的权限(添加rw权限):chmod g+r+w /home/wk/monkey.txt
  6. 八戒修改 monkey.txt 加入一句话(i am a pig)

    1. 切换至八戒登录:su - bj
    2. 修改文件内容:vim /home/wk/monkey.txt -> i am a pig
  7. 唐僧 沙僧 对该文件没有权限,把 沙僧 放入妖怪组:

    1. 普通用户没有修改用户组的权限,切换至root权限:su - root,输入root密码
    2. 将沙僧放入妖怪组:usermod -g yg ss
  8. 让沙僧修改该文件monkey.txt, 加入一句话 ("我是沙僧,我是妖怪!")

    1. 切换至沙僧登录:su - ss
    2. 修改文件:vim /home/wk/monkey.txt -> 输入一句话:我是沙僧,我是妖怪!
    3. 保存并退出到命令行:[ESC]键:wq

注意:rwx权限对于文件夹(目录)的细节讨论和测试

x: 表示可以进入到该目录,比如 cd

r: 表示可以 ls ,将目录的内容显示

w: 表示可以在该目录下删除或者创建文件

练习二:

  1. 用 root 登录,建立用户mycentos,自己设定密码:useradd mycentos -> passwd mycentos

  2. 用 mycentos 登录,在主目录下建立目录 test/t11/t1

    1. 切换mycentos登录:su - mycentos
    2. 主目录下创建目录:mkdir -p test/t11/t1
  3. 在 t1 中建立一个文本文件 aa,用 vi 编辑其内容为 ls –ahl

    vi /home/mycentos/test/t11/t1/aa -> 输入内容ls -ahl

  4. 改变 aa 的权限为可执行文件[可以将当前日期追加到一个文件],运行该文件./aa

    1. 在aa文件中追加日期:vim test/t11/t1/aa -> [i]键进入编辑模式 -> 输入date "+%F %T"
    2. 修改aa的权限:chmod u+x test/t11/t1/aa
    3. 运行文件:. /文件
  5. 删除新建立的目录 test/t11/t1:rm -rf test

  6. 删除用户 mycentos 及其主目录中的内容:userdel -r mycentos

  7. 将 linux 设置成进入到图形界面:init 5

  8. 重新启动 linux 或关机:reboot 或者 init 0

10、定时任务调度

10.1、crond任务调度

  1. 概述

    任务调度:是指系统在某个时间执行特定的命令或程序。crond--->周期任务

    任务调度分类:

    • 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等\
    • 个别用户工作:个别用户可能希望执行某些程序,比如对 mysql 数据库的备份。

    示意图:

crond任务调度示意图

  1. 基本语法:crontab [选项]

    功能:进行定时任务的设置

  2. 常用选项:

    -e 编辑crontab定时任务
    -l 查询crontab定时任务
    -r 删除当前用户所有的crontab任务
  3. 快速入门

    1. crontab -e (进入/etc/crontab文件,所有的定时任务都在该文件中)
    2. 在文件中输入定时任务的命令,语法格式:* * * * * user command
      1. */1**** date > /home/my
      2. */1**** cal >> /home/my
    3. 保存并退出
  4. 参数说明

    参数 含义 范围
    第一个* 一小时当中的第几分钟 0-59
    第二个* 一天当中的第几小时 0-23
    第三个* 一个月中的第几天 1-31
    第四个* 一年中的第几个月 1-12
    第五个* 一周的星期几 0-7(0和7都代表星期日)

    特殊符号说明:

    特殊符号 说明
    * 代表任何时间,比如第一个*就代表一小时中每分钟都执行一次的意思
    , 代表不连续时间,比如“0 8,12,16 * * * 命令”,代表每天的8点0分,12点0分,16点0分都执行一次命令
    - 代表连续时间,比如“0 5 ** 1-6 命令”,代表周一到周六凌晨5点0分执行命令
    */n 代表每隔多久执行一次,比如“*/10 * * * * 命令”,代表每隔十分钟就执行一次命令

    案例:

    1. 45 22 * * *命令 -> 在每天22点45分执行命令
    2. 0 17 * * 1 命令 -> 每周一的17点0分执行命令
    3. 0 5 1,15 * * 命令 -> 每月1号和15号的凌晨5点0分执行命令
    4. 40 4 * * 1-5 命令 -> 每周一到周五的凌晨4点40分执行命令
    5. */10 4 * * * 命令 -> 每天的凌晨4点,每隔10分钟执行一次命令,4点0分、4点10分、4点20分..依次类推
    6. 0 0 1,15 * 1 命令 -> 每月1号和15号,每周一的0点0分都会执行命令 -> 1号和15号哪一天是周一就执行命令,没有则不执行。建议星期几和几号不要同时出现,容易产生混乱。
  5. 应用实例

    案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
    crontab -e
    */1 * * * * date >> /tmp/mydate
    
    案例 2:每隔 1 分钟,将当前日期和日历都追加到 /home/mycal 文件中
    第一种方法:
    	crontab -e
    	在crontab文件中输入:
    	*/1 * * * * date >> /home/mycal 
    	*/1 * * * * cal >> /home/mycal 
    	保存退出
    
    第二种方法:
    	将 date >> /home/mycal 和  cal >> /home/mycal 命令写在文件 /home/my.sh中
    	就是将命令都写在shell脚本中,直接调用shell脚本
    
    	步骤:
    		vim /home/my.sh
    		在my.sh中写入:
    			date >> /home/mycal
    			cal >> /home/mycal
    			:wq
    		给 my.sh 增加执行权限:chmod u+x /home/my.sh (否则无法使用crontab命令)
    		crontab -e
    		在crontab中写入:*/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 -proot testdb > /home/db.bak
    
  6. crond相关指令

    • crontab –r:终止任务调度。
    • crontab –l:列出当前有哪些任务调度
    • service crond restart:重启任务调度

10.2、at定时任务

  1. 基本介绍

    1. at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行;

    2. 每个作业队列(任务队列)中都有作业(作业里是指令/脚本);

    3. 默认情况下,atd守护进程每60秒检查作业队列;

      有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业;

      运行完这个作业(任务)之后,这个作业就不会再被执行了;

    4. at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了;

    5. 在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看

      ps -ef ---> 查看所有的进程

      ps -ef | grep atd -> 可以检测 atd 是否在运行

      root       1284      1  0 08:14 ?        00:00:00 /usr/sbin/atd -f		-> 表示atd守护线程正在执行
      root       3922   1964  0 10:16 pts/0    00:00:00 grep --color=auto atd
      

    总结:at命令就是对某个定时任务只执行一次

atd守护线程示意图

  1. at 命令格式
    语法:at [选项] [时间]

    然后输入两次:Ctrl + D(结束 at 命令的输入)

    如果在at命令中要删除光标前的内容:Ctrl+[Backspace]键

  2. at 命令选项:

选项 含义
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印人物的内容到标准输出
-V 显示版本信息
-q<队列> 使用指定的队列
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务
  1. 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 是时间单位,这里能够是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。
      count 是时间的数量,几天,几小时。 例如:now + 5 minutes
    6. 直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。
  2. 应用实例

    案例 1:2 天后的下午 5 点执行 /bin/ls /home
    	at 5pm + 2 days
    	/bin/ls /home
    	两次ctrl+D
    	
    案例 2:atq 命令来查看系统中没有执行的工作任务
    	直接输入atq 查询
    
    案例 3:明天17点钟,输出时间到指定文件内 比如 /root/date100.log
    	at 5pm tomorrow
    	date > /root/date100.log
    	两次ctrl+D
    	
    案例 4:2分钟后,输出时间到指定文件内 比如 /root/date200.log
    	at now + 2 minutes
    	date > /root/date200.log
    	两次ctrl+D
    	
    案例 5:删除已经设置的任务
    	atrm 任务编号
    	atrm 4 //表示将 job 队列,编号为 4 的 job 删除.
    
    	atq:
    	2	Thu Feb 24 09:53:00 2022 a root
    	1	Fri Feb 25 17:00:00 2022 a root
    	第一列就是编号
    
    注意:也可以执行脚本
    比如:
        at now + 2 minutes
        /root/my.sh
        但要有这个脚本,并且有执行权限x
    

11、Linux磁盘分区挂载

11.1、Linux分区

  • 原理介绍

    Linux无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录/,一个独立且唯一的文件结构

    Linux中每个分区都是用来组成整个文件系统的一部分。

    Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。

    这时要载入的一个分区将使它的存储空间在一个目录下获得。

    图解:硬盘上的一个分区 通过挂载mount机制 与文件系统中的某个目录联系起来,即分区挂载到目录,访问这个目录即访问这个分区

    硬盘分区挂载Linux文件系统

    可以通过指令lsblk查看挂载情况:(lsblk:list block devices)

    lsblk命令查看磁盘挂载

    说明:sda1分区挂载到/boot目录,sda2分区挂载到/根目录,sda3分区挂载到swap交换分区

  • lsblk -f指令:查看更详细的磁盘分区挂载情况

    详细的分区挂载说明
    说明:

    • 第一列可以看到设备/硬盘分区情况:sda硬盘下有三个分区sda1、sda2、sda3

    • FSTYPE:文件系统类型(File System TYPE)

    • UUID:格式化之后,会给每一个分区分配一个 唯一的 不重复的 40位 的 字符串

    • MOUNTPOINT:挂载点

  1. 硬盘说明:

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

11.2、挂载的经典案例

为虚拟机添加一块硬盘的步骤:

  1. 虚拟机添加硬盘
  2. 分区
  3. 格式化
  4. 挂载
  5. 设置可以自动挂载(永久挂载)

11.2.1、虚拟机添加硬盘

  1. 选中【虚拟机】,右键菜单中选择【设置】
  2. 点击【添加】,选择添加【硬盘】
  3. 然后一路【下一步】,磁盘类型选择【SCSI】,后面只有选择磁盘大小的地方需要修改,直到完成

使用命令lsblk发现没有新增的硬盘? -> 需要重启系统(才能识别)

[root@luminescent ~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
└─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
sdb                                                                 
sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00

新增硬盘sdb,还未分区。

11.2.2、硬盘分区

对新增磁盘sdb进行分区步骤:

  1. 分区命令:fdisk /dev/sdb -> dev目录下都是对硬件映射的文件

  2. 开始分区后输入命令:n(add a new partition)

    常用命令:

    • a toggle a bootable flag
    • b edit bsd disklabel
    • c toggle the dos compatibility flag
    • d delete a partition
    • g create a new empty GPT partition table
    • G create an IRIX (SGI) partition table
    • l list known partition types
    • m print this menu
    • n add a new partition(新增分区)
    • o create a new empty DOS partition table
    • p print the partition table
    • q quit without saving changes(退出不保存)
    • s create a new empty Sun disklabel
    • t change a partition's system id
    • u change display/entry units
    • v verify the partition table
    • w write table to disk and exit(写入分区设置并退出)
    • x extra functionality (experts only)
  3. 输入选择:p(primary主分区 默认选择, extended扩展分区)

  4. 分区号(1-4,默认1):1(输入2,磁盘就有2个分区)

  5. 两次回车,设置扇区默认值

    起始 扇区 (2048-2097151,默认为 2048):
    将使用默认值 2048
    Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
    将使用默认值 2097151
    分区 1 已设置为 Linux 类型,大小设为 1023 MiB
    
  6. 最后输入:w -> 写入分区并退出(若不保存并退出输入 q,即上面步骤出错了想重来就可以输入q)

    [root@luminescent ~]# lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   20G  0 disk 
    ├─sda1   8:1    0    1G  0 part /boot
    ├─sda2   8:2    0   17G  0 part /
    └─sda3   8:3    0    2G  0 part [SWAP]
    sdb      8:16   0    1G  0 disk 
    └─sdb1   8:17   0 1023M  0 part 
    sr0     11:0    1  4.4G  0 rom  
    

    分区成功,磁盘sdb中只有一个分区sdb1

11.2.3、格式化分区

格式化分区目的:给这个分区指定它的文件类型

[root@luminescent ~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
└─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
sdb                                                                 
└─sdb1                                                              
sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00

sdb1的UUID为空,说明该分区尚未格式化

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

[root@luminescent ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 261888 blocks
13094 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

查看格式化后的分区详细信息:

[root@luminescent ~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
└─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
sdb                                                                 
└─sdb1 ext4                    68dedbb9-310d-4fb3-94c0-33947729c395 
sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00 

可以看到sdb1分区有UUID唯一标识符 -> sdb1分区格式化完成,但是MOUNTPOINT(挂载点)尚未指定

11.2.4、分区挂载

挂载的目的:将一个分区与一个目录联系起来

挂载命令:mount 设备名称 挂载目录

挂载步骤:

  1. 首先创建一个目录newdisk (目录位置随便) 假如在根目录下创建:mkdir newdisk
  2. 进行挂载:mount /dev/sdb1 /newdisk

查看分区挂载信息:

[root@luminescent /]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
└─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
sdb                                                                 
└─sdb1 ext4                    68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk
sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00 

挂载点有了,挂载成功。

  • 卸载(去除分区与目录的联系):仅仅删除联系,不会删除已经写入到分区中的文件

    命令:umount [设备名称|挂载的目录]

    例如:umount /dev/sdb1 或者 umount /newdisk

    注意: 用命令行挂载,重启后会失效。

11.2.5、设置自动挂载

设置自动挂载目的:解决命令行设置挂载重启后失效问题

自动挂载(永久挂载)步骤:

  1. 通过修改文件/etc/fstab实现挂载

    新增一行:UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk ext4 defaults 0 0

    #
    # /etc/fstab
    # Created by anaconda on Fri Mar 31 15:15:26 2023
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    # 或者写成以下方式:
    # /dev/sdb1 							  /newdisk                ext4    defaults        0 0
    UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk                ext4    defaults        0 0
    UUID=b219b5da-e417-4ab2-9bf1-c506930a68b0 /                       ext4    defaults        1 1
    UUID=13781296-efb8-4f86-8810-834f301cab2a /boot                   ext4    defaults        1 2
    UUID=5e43ae36-a647-46aa-aea1-542ee2afcb63 swap                    swap    defaults        0 0
    

    注意:要挂在的设备可以是上一步生成的sdb1的UUID(建议此种方式设置),也可以是磁盘分区映射到Linux系统的文件/dev/sdb1

    要挂载的设备或伪文件系统  挂载点  文件系统类型  挂载选项 转储频率 自检次序
    UUID=上面sdb1的UUID   /newdisk    ext4    defaults   0 	   0
    

    说明:

    1. 要挂载的设备或伪文件系统:设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
    2. 挂载点:指定的文件夹
    3. 文件系统类型:一般是ext4,交换分区是swap
    4. 挂载选项:defaults
    5. 转储频率:0:不做备份 1:每天转储 2:每隔一天转储
    6. 自检次序:0:不自检 1:首先自检;一般只有rootfs才用1;
  2. 添加完成后,执行mount –a即刻生效 或者 重启系统reboot

11.3、磁盘情况查询

  1. 查询系统整体磁盘使用情况

    基本语法:df -h (disk free)

    [root@luminescent ~]# df -h
    文件系统        容量    已用  可用 已用% 挂载点
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sda2        17G  5.4G   11G   34% /
    /dev/sdb1       991M  2.6M  922M    1% /newdisk
    /dev/sda1       976M  178M  732M   20% /boot
    vmhgfs-fuse     254G  194G   61G   77% /mnt/hgfs
    tmpfs           199M   12K  199M    1% /run/user/42
    tmpfs           199M     0  199M    0% /run/user/0
    
  2. 查询指定磁盘的占用情况

    基本语法:du -h 指定目录 (disk usage)

    功能:查询指定目录的磁盘占用情况,默认为当前目录

    • -s:指定目录占用大小汇总
    • -h:带计量单位
    • -a:含文件
    • -c:列出明细的同时,增加汇总值
    • --max-depth=1:子目录深度
  3. 应用实例:查询 /opt 目录的磁盘占用情况,深度为 1

    du -hac --max-depth=1 /opt

11.4、磁盘情况-工作实用指令

  1. 统计/opt 文件夹下文件的个数:ls -l /opt | grep "^-" | wc -l

说明:

  • grep "^-" ---> 筛选出以-开头的,因为以-开头的都是文件

  • wc(word count): 统计数量

    wc -l: 统计行数l(lines)

  • 统计grep筛选后的行数即文件个数

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

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

-R选项: 递归列出遇到的子目录

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

  2. tree 目录指令:以树状显示目录结构

    默认情况下没有tree指令,需要使用yum install tree指令安装,一直选择y选项即可完成安装。

12、网络配置

12.1、Linux网络配置原理

Linux网络配置原理图

  1. 通过ifconfig指令查看Linux虚拟机的ip地址:192.168.218.129

  2. 然后在本机DOS命令窗口输入指令ipconfig,查看vmnet8的ip地址:192.168.218.1

    Linux虚拟机和vmnet8在同一网段(192.168.218),所以可以互相通信

  3. 得到本机的无线网络适配器(无线网卡)的ip地址

为什么Linux虚拟机可以连外网(比如打开百度)?Linux虚拟机 ---> 本机vmnet8 ---> 本机无线网卡 ---> 教室局域网网关 ---> 外网

每次开机linux虚拟机的ip地址不一定相同(动态ip),linux虚拟机的ip地址可以设置成为静态ip -> 确保每次开机后linux虚拟机的ip不会变化

12.2、查看网络ip和网关

修改Linux虚拟机ip地址:vmware--->编辑--->虚拟网络编辑器
查看和修改虚拟机ip地址

通过本机DOS命令窗口,输入指令:ipconfig -> 查看vmnet8的网络配置

在xshell或linux终端输入命令:ifconfig -> 查看 linux 的网络配置

ping命令:测试主机之间网络连通性

基本语法:ping 目的主机ip地址

功能描述:测试当前服务器是否可以连接目的主机

如:ping www.baidu.com

12.3、Linux网络环境配置

自动获取IP

登陆图形化界面后,通过界面设置自动获取ip

Linux设置自动获取IP第一步

Linux设置自动获取IP第二步

特点:linux 启动后会自动获取 IP,可以避免IP冲突

缺点:每次自动获取的 IP 地址可能不一样,但是作为服务器的Linux系统,Linux的IP地址不能变。

开发环境中,一般将Linux的IP地址手动设定,IP地址固定不能改变。

手动获取IP

手动指定linux的ip地址,使其不变化。

直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)

关于网络的配置文件在:/etc/sysconfig/network-scripts/ifcfg-ens33

要求:将ip地址配置为静态的(不变的),比如: ip 地址为 192.168.200.130

  1. 输入指令:vim /etc/sysconfig/network-scripts/ifcfg-ens33

  2. 修改文件内容:

# BOOTPROTO="DHCP"
BOOTPROTO="static"
IPADDR=192.168.200.130   # (IP地址,自己设定的)
GATEWAY=192.168.200.2	 # (网关,自己设定的)
DNS1=192.168.200.2		 # (域名解析器,自己设定的)
  1. vmnet8和Linux在同一网段上,要能够通信,也要修改相应的vmnet8

    vmware ---> 编辑 ---> 虚拟网络编辑器

    打开虚拟编辑器,点击vmnet8,修改下面的子网ip为:192.168.200.0

    然后点击NAT设置,将网关改为192.168.200.2

  2. 应用确定

  3. 输入指令:service network restartreboot使上述修改生效

12.4、设置Linux主机名和hosts映射

12.4.1、设置主机名

Linux系统的主机名相当于其ip地址的别名,起一个主机名是因为ip地址不好记忆,不方便 -> 修改主机名。

查看当前主机的主机名指令:hostname

主机名放在/etc/hostname文件中,要修改主机名即修改文件内容:

  1. vim /etc/hostname
  2. 修改内容 -> 保存退出
  3. reboot重启系统

12.4.2、设置hosts映射

在Windows系统中,如何通过主机名找到(比如 ping)某个linux系统:

  1. 修改ip地址与主机名的映射关系

    在windows C:\Windows\System32\drivers\etc\hosts 文件中,指定Linux系统的ip地址与主机名的映射关系

    格式:linux系统ip地址 linux系统主机名

    如指定为:192.168.218.129 luminescent (这行代码添加到文件中就行了)

  2. ping luminescent ---->就会去该文件中找相应的ip地址

在Linux系统中,使用主机名 来 ping 某个Windows系统,怎么做

  1. 在 linux 系统的 /etc/hosts 文件中指定ip和hostname映射关系:vim /etc/hosts
  2. 输入要添加的文件内容:192.168.218.1 Windows主机名

注意:使用Ctrl + C快捷键终止ping命令

12.5、主机名解析过程分析

12.5.1、hosts

hosts是一个文本文件,用来记录 IP 和 Hostname(主机名)的映射关系

12.5.2、DNS

DNS(Domain Name System)域名系统:是互联网上作为域名和 IP 地址相互映射的一个分布式数据库

为什么可以通过主机名访问?通过DNS域名解析系统,将主机名解析为ip地址,实际上还是用的ip地址。

12.5.3、DNS解析机制

用户在浏览器输入了www.baidu.com

  1. 浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,有就先调用这个 IP 完成解析;

    如果没有,就检查 DNS 解析器缓存,如果有直接返回 IP 完成解析。

    这两个缓存,可以理解为本地解析器缓存

  2. 如果本地解析器缓存没有找到对应映射,检查系统中 hosts 文件中有没有配置对应的域名 IP 映射,如果有,则完成解析并返回。

  3. 如果本地DNS解析器缓存 和 hosts文件 中均没有找到对应的IP,则到域名服务器找

  4. 还找不到,就没有了。

说明:DNS解析器缓存
一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的 IP 地址(DNS解析记录)
如在cmd窗口中输入:

ipconfig /displaydns //DNS域名解析缓存
ipconfig /flushdns //手动清理dns缓存

示意图:DNS解析机制

13、进程管理(⭐)

13.1、基本介绍

  1. 在 LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。

    程序执行之后加载到内存中成为进程。程序是静态的,进程是动态的。

  2. 每个进程都可能以两种方式存在:前台与后台

    前台进程:是用户目前的屏幕上可以进行操作的。

    后台进程:是实际在操作的,但屏幕上无法看到,通常使用后台方式执行。

  3. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

13.2、ps指令:查看系统正在执行进程

  1. 基本介绍

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

  2. 语法格式:ps [选项] -> 线程状态(Process Status)

    常用选项:

    • -a:显示当前终端的所有进程信息
    • -u:以用户的格式显示进程信息
    • -x:显示后台程序运行的参数

    一般是三个选项一起用:ps -aux

    ps指令查看线程状态

    说明:

    • USER: 执行进程用户名称
    • PID: 进程号
    • %CPU: 进程占用CPU百分比
    • %MEM: 进程占用物理内存的百分比
    • VSZ: 进程占用的虚拟内存大小(单位:KB)
    • RSS: 进程占用的物理内存大小(单位:KB)
    • TTY: 终端名称(有时缩写)
    • STAT: 进程状态:
      • S-睡眠
      • s-表示该进程是会话的先导进程
      • N-表示进程拥有比普通优先级更低的优先级
      • R-正在运行
      • D-短期等待
      • Z-僵死进程
      • T-被跟踪或者被停止等等
    • START: 进程执行的开始时间
    • TIME: CPU 时间,即进程使用 CPU 的总时间
    • COMMAND: 启动进程所用的命令和参数,如果过长会被截断显示
  3. ps -axu是将所有进程状态信息显示出来,若只想查找某个进程信息,使用grep指令过滤:ps -axu | grep 进程名

  4. 应用实例:以全格式显示当前所有的进程,查看进程的父进程。(父进程:一个进程可以生成多个子进程,该进程称为父进程)

    指令:ps -ef -> 以全格式显示当前所有的进程。-e 显示所有进程。-f 全格式。

    ps-ef全格式显示所有进程

    • UID: 用户ID
    • PID: 进程ID
    • PPID: 父进程ID
    • C: CPU 用于计算执行优先级的因子。
      • 数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;
      • 数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
    • STIME: 进程启动的时间
    • TTY: 完整的终端名称
    • TIME: CPU 使用时间
    • CMD: 启动进程所用的命令和参数

    ps -ef | grep sshd指令显示内容如下:

    [root@luminescent ~]# ps -ef | grep sshd
    root       1294      1  0 08:31 ?        00:00:00 /usr/sbin/sshd -D
    root       1443   1294  0 08:31 ?        00:00:00 sshd: root@pts/0
    root       6916   1858  0 15:16 pts/0    00:00:00 grep --color=auto sshd
    

    得到第三列为1,即父进程ID=1

13.3、kill指令:终止进程

  1. 介绍:

    若是某个进程执行一半需要停止时,或是已经消耗了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。

  2. 基本语法:

    kill [选项] 进程号 -> 通过进程号杀死/终止进程

    killall 进程名称 -> 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用

    使用killall,会将该进程的所有子进程也都终止

    常用选项:-9 -> 表示强制终止进程,系统觉得某个程序重要,可能会屏蔽kill指令,这时使用选项-9强制终止进程

  3. 案例:

    • 案例 1:踢掉某个非法登录用户

      kill 进程号

      假如使用tom登录,然后在图形界面打开终端写代码。假设认为tom是个非法用户,要踢掉它

      先在图形界面写代码:ps -aux | grep sshdsshd 是记载远程连接服务的配置文件

      上述指令显示出了,远程登录的进程信息,从中看到了tom登录的进程的进程号11421,以 kill 11421 这样tom就下线了!

    • 案例 2:终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务

      sshd ---> secure shell

      1. 首先查看 sshd 对应的进程号:

        使用命令:ps -aux | grep sshd,有 /user/sbin/sshd 的那个进程就是sshd服务进程,进程号10748

        终止 sshd 之后,就无法在xshell远程登陆了!

      2. 重启 sshd 服务指令:/bin/systemctl start 服务名称

        /bin/systemctl start sshd.service

    • 案例 3:终止多个gedit(文本编辑器) -> killall 进程名

      在Linux桌面,主文件夹中,打开多个文本,然后使用killall 可以同时关闭所有打开的文本

      killall gedit

    • 案例 4:强制杀掉一个终端

      在Linux系统桌面打开两个终端,bash即代表终端进程

      在一个终端中输入指令强制关闭另一个终端

      1. 首先:查看终端进程的进程号:ps -aux | grep bash -> 得到对应的进程号
      2. 输入:kill -9 对应的进程号

      也可以终端自己终止自己

      kill进程

13.4、pstree指令:查看进程树

  1. 基本语法:pstree [选项]
    功能:可以更加直观的来看进程信息(树的形式)

  2. 常用选项:
    -p :显示进程的 PID (父进程ID)
    -u :显示进程的所属用户

  3. 应用实例:

    案例 1:用树状的形式显示进程的pid(进程号) -> pstree -p

    pstree-p指令

    案例 2:用树状的形式显示进程的用户 -> pstree -u

    pstree-u指令

13.5、服务管理

13.5.1、基本介绍

服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd防火墙等),

因此后台程序也称为 服务/守护进程,是 Linux 中非常重要的知识点。

13.5.2、service管理指令

  1. 指令:service 服务名 [start | stop | restart | reload | status]

    start:开启服务

    stop:终止服务

    restart:重启服务

    reload:重载服务

    status:查看服务的状态

  2. 在 CentOS7.0 后很多服务不再使用service指令管理,而是使用systemctl

  3. 还有一些在 /etc/init.d 下的服务仍使用 service 指令管理

    案例:使用 service 指令,查看,关闭,启动 network。[注意:在虚拟系统打开终端演示,因为网络连接会关闭]

    • service network status -> 查看网络连接状态
    • service network stop -> 关闭网络连接
    • service network start -> 开启网络连接

13.5.3、查看服务名

方式 1:直接输入setup即可看到所有服务,其中前面带*的服务会随着Linux系统的启动而自动启动

setup查看系统服务1

服务页面说明

netstat查看守护进程sshd监听端口

方式 2:ls -l /etc/init.d 只能看到部分服务,还有一些在/etc/rc.d/init.d下的服务仍使用service指令管理

服务页面说明2

service指令管理的服务

13.5.4、服务的运行级别

Linux 系统有 7 种运行级别(runlevel):常用的是级别 3 和 5

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

开机的流程说明:开机 ——> BIOS ——> /boot ——> systemd进程1 ——> 运行级别 ——> 运行 级别对应的服务

CentOS7 后运行级别说明:在/etc/initab进行了简化,如下:

multi-user.target: analogous to runlevel 3

graphical.target: analogous to runlevel 5

查看当前运行级别:systemctl get-default

更改开机默认运行级别:systemctl set-default multi-user.target/graphical.target -> 重启reboot

13.5.5、chkconfig指令

通过chkconfig命令可以给服务在 各个运行级别 设置开启自启动/关闭自启动

chkconfig指令管理的服务在/etc/init.d查看

注意:Centos7.0 后,很多服务使用 systemctl 管理

chkconfig 基本语法:

  1. 查看服务和服务在各个级别是开启/关闭自启动 (有限,只能查看chkconfig管理下的服务)

    chkconfig --list [| grep xxx]    (若查找某一个服务使用grep过滤)
    
  2. chkconfig 服务名 --list

  3. chkconfig --level 3 服务名 on   	给该服务在3运行级别开启自启动
    chkconfig --level 5 服务名 off     给该服务在5运行级别关闭自启动
    

案例演示: 对network服务进行各种操作,把 network 在 3 运行级别 关闭自启动

chkconfig --level 3 network off

注意:chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 生效.

13.5.6、systemctl指令管理服务

基本语法:systemctl [start | stop | restart | status] 服务名

systemctl 指令管理的服务在/usr/lib/systemd/system查看: ls -l /usr/lib/systemd/system

  • systemctl list-unit-files [| grep 服务名]:查看服务开机启动状态, grep 可以进行过滤
  • systemctl enable 服务名:设置服务开机自启动
  • systemctl disable 服务名:关闭服务开机自启动
  • systemctl is-enabled 服务名:查询某个服务是否是自启动的

centos7之后运行级别只有3和5,所以以上指令对3和5运行级别同时适用

应用案例:查看当前防火墙的状况,关闭防火墙和重启防火墙 firewalld.service

  • 查看当前防火墙情况:systemctl status firewalld

    Active: active (running) -> 表示防火墙已经打开

    [root@luminescent ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since 五 2023-04-14 08:24:06 CST; 1h 20min ago
         Docs: man:firewalld(1)
     Main PID: 863 (firewalld)
        Tasks: 2
       CGroup: /system.slice/firewalld.service
               └─863 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    
    4月 14 08:24:06 luminescent systemd[1]: Starting firewalld - dynamic firewall daemon...
    4月 14 08:24:06 luminescent systemd[1]: Started firewalld - dynamic firewall daemon.
    4月 14 08:24:07 luminescent firewalld[863]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure confi...t now.
    Hint: Some lines were ellipsized, use -l to show in full.
    
  • 关闭防火墙:systemctl stop firewalld

  • 重启防火墙:systemctl start firewalld

    .service写不写都行

注意:关闭或者启用防火墙后,立即生效。但是这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置

如果希望设置某个服务自启动或关闭永久生效要使用systemctl [enable|disable] 服务名

13.5.7、防火墙firewall指令

在真正的生产环境,往往需要将防火墙打开。但问题来了,如果把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。比如 80、22、8080 等。

Linux防火墙

  1. 打开端口: firewall-cmd --permanent --add-port=端口号/协议

    通过netstat -anp | more指令查看端口号的协议 (more 分页显示),部分显示内容如下

    [root@luminescent ~]# netstat -anp | more
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      710/rpcbind	(监听客户端cmd的服务)
    tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1650/dnsmasq        
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1290/sshd 	(监听Xshell的服务)
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1293/cupsd          
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1450/master         
    tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1324/sshd: root@pts 
    tcp        0      0 192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts 
    tcp6       0      0 :::111                  :::*                    LISTEN      710/rpcbind         
    tcp6       0      0 :::22                   :::*                    LISTEN      1290/sshd
    

    该指令输出的信息中:

    Local Address表示 ip地址:端口号Proto 是协议(protocol 协议)

  2. 关闭端口: firewall-cmd --permanent --remove-port=端口号/协议

    注意:无论是打开端口还是关闭端口,要重新载入才能生效

    重新载入:firewall-cmd --reload

  3. 查询端口是否开放: firewall-cmd --query-port=端口/协议

应用案例:

Windows使用telnet指令提示不是内部命令或可执行程序的解决方案:

  1. 方案一:以管理员身份运行cmd后,输入:dism /Online /Enable-Feature /FeatureName:TelnetClient
  2. 方案二:打开 控制面板 -> 程序和功能 -> 启用或关闭Windows功能,在这里就可以看到“Telnet客户端”。打勾安装即可
  1. 启用防火墙,测试 111 端口是否能 telnet (远程登录) 不行

  2. 在Linux系统查看防火墙的111端口的监听状态:

    [root@luminescent ~]# firewall-cmd --query-port=111/tcp
    no
    

    在本地主机DOS命令窗口输入:telnet Linux虚拟机ip地址 端口号

    测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 失败

    总结:防火墙打开+端口关闭--->不可以访问端口

  3. 防火墙开放 111 端口:firewall-cmd --permanent --add-port=111/tcp

    开放端口后,需要重载:firewall-cmd --reload

    [root@luminescent ~]# firewall-cmd --permanent --add-port=111/tcp
    success
    [root@luminescent ~]# firewall-cmd --reload
    success
    

    测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 成功

    防火墙打开+端口打开--->可以访问端口

  4. 再次关闭 111 端口:firewall-cmd --permanent --remove-port=111/tcp

    关闭端口后,需要重载:firewall-cmd --reload

13.6、top指令:动态监控进程

  1. 基本介绍:top 与 ps 命令很相似,都用来显示正在执行的进程。

    top与ps最大的不同之处在于: top 在执行一段时间可以更新正在运行的的进程

  2. 基本语法top [选项]

    常用选项:

    • -d 秒数:指定top指令每隔几秒更新,默认是3秒。如:top -d 5
    • -i:使top不显示任何闲置或僵死进程
    • -p:通过指定监控进程ID来仅仅监控某个进程的状态

    top指令显示内容说明:

    1. 输入top指令后,每一条都是一个进程

    2. 显示内容:

      top动态监控进程

      1. 第一行:

        第一个时间 -> 当前时间

        第二个时间 -> 系统已经运行的时长

        3 users -> 有3个用户

        load average -> 负载值(三个值相加除以3>0.7 说明系统负载过大,要提高性能)

      2. 第二行:
        Tasks -> 系统任务数

        1 running -> 1个正在运行进程

        257 sleeping -> 184个休眠进程

        0 stopped -> 0个终止进程

        0 zombie -> 0个僵死进程(要清除僵死进程,因为僵死进程无用且占内存空间)

      3. 第三行:占用的CPU百分比

        us -> 用户(user)占用的CPU

        sy -> 系统(system)占用的CPU

        ni -> 优先级调用

        id -> 空闲(idle)的CPU

        wa -> I/O等待占用比

      4. 第四行:Mem 内存占用情况

        total -> 总共内存

        free -> 空闲内存

        user -> 已使用内存

      5. 第五行:Swap 分区
        total -> 总共大小
        free -> 未使用大小
        used -> 已用大小
        avail Mem -> 可获取的内存大小

    3. 交互操作说明:输入top然后输入以下命令,得以下功能对进程进行排序

      • P:以CPU使用率排序,默认此选项
      • M:以内存的使用率排序
      • N:以PID排序
      • q:退出top指令
      • u:监控指定用户的进程
      • k:终止进程,终止指定进程ID后,需要输入信号量9表示强制删除
      • e:切换进程占用内存的显示单位,KB/MB/GB/TB/PB
    4. 应用实例

      案例 1:监视特定用户, 比如监控 yxz 用户
      输入top -> 回车 -> 输入u -> 回车 -> 输入要监控用户名 (该用户要登录才能看到他的进程信息)
      
      案例 2:终止指定的进程, 比如我们要结束 yxz 登录
      输入top -> 回车 -> 输入k -> 回车 -> 输入要结束的进程 ID 号(bash那个进程的PID) -> 回车 -> 输入信号量 9 强制删除 -> yxz掉线
      

13.7、netstat指令:监控网络状态

  1. netstat指令:查看系统网络情况

    基本语法:netstat [选项]

    选项说明:

    • -an:按一定顺序排列输出
    • -p:显示哪个进程在调用

    netstat显示内容

    netstat指令显示内容说明:

    • Proto:协议

    • Recv-Q:接收信息队列

    • Send-Q:发送信息队列

    • Local Address:本地地址 Linux地址

    • Foreign Address:外部地址

    • State:

      • LISTEN 监听

      • ESTABLISHED 已建立连接

      • TIME_WAIT 超时等待 ---> 某个连接断了之后(如用户退出登录),连接不会立刻消失,而是State变为TIME_WAIT

        系统认为可能是网络状态不好,过一段时间仍无法连接,则连接消失。

    案例:查看服务名为 sshd 的服务的信息。

    [root@luminescent ~]# netstat -anp | grep sshd
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1290/sshd           
    tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1324/sshd: root@pts 
    tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      7206/sshd: yxz@pts/ 
    tcp        0     36 192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts 
    tcp        0      0 192.168.218.129:22      192.168.218.1:56341     ESTABLISHED 7201/sshd: yxz [pri 
    tcp6       0      0 :::22                   :::*                    LISTEN      1290/sshd           
    tcp6       0      0 ::1:6010                :::*                    LISTEN      1324/sshd: root@pts 
    tcp6       0      0 ::1:6011                :::*                    LISTEN      7206/sshd: yxz@pts/ 
    unix  3      [ ]         STREAM     CONNECTED     25985    1290/sshd            
    unix  2      [ ]         DGRAM                    32095    1324/sshd: root@pts  
    unix  3      [ ]         STREAM     CONNECTED     95392    7201/sshd: yxz [pri  
    unix  3      [ ]         STREAM     CONNECTED     95391    7206/sshd: yxz@pts/  
    unix  2      [ ]         DGRAM                    95388    7201/sshd: yxz [pri
    

    记录详解:

    Proto 	Recv-Q 	Send-Q 		Local Address           Foreign Address         State 
    tcp        0     	36 		192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts 
    tcp        0      	0 		192.168.218.129:22      192.168.218.1:56341    	ESTABLISHED 7201/sshd: yxz [pri 
    

    要建立连接双方都要有一个端口:22端口在Linux,60660端口和56341端口在Windows。

    示意图如下:

    netstat-anp监听进程端口

    1. 检测连接主机命令ping:是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。

      语法格式:ping 远程主机的ip地址 -> ping www.baidu.com

14、RPM与YUM

14.1、RPM

14.1.1、介绍

RPM(Red-Hat Package Manager, 红帽软件包管理器),这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准。是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。类似于Windows的setup.exe。

14.1.2、RMP的简单查询指令

查询已安装的 rpm软件包 列表:rpm –qa | grep xx

查询结果返回一个软件包的包名

举例:查看当前系统是否安装了 firefox:rpm -qa | grep firefox

查询结果:firefox-102.9.0-3.el7.centos.x86_64

结果说明:

  • 软件名:firefox
  • 版本号:102.9.0-3
  • 适用操作系统: el7.centos.x86_64 (表示centos7.x的64位系统)

如果是i686、i386表示32位系统,noarch表示通用(32/64位系统都适用)

14.1.3、RMP的其他指令

  • rpm -qa:查询所安装的所有 rpm 软件包

  • 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

14.1.4、删除RPM的软件包

基本语法:rpm -e RPM 软件包的名称

-e erase擦去

案例:删除firefox软件包:rpm -e firefox

注意:

  1. 如果其它软件包依赖于您要删除的软件包,删除时则会产生错误信息。
    如:rpm -e foo
    removing these packages would break dependencies:foo is needed by bar-1.0-1

    foo软件包被 bar-1.0-1需要,删除foo对barr-1.0-1有影响

  2. 如果我们就是要删除 foo 这个 rpm 包,可以增加参数--nodeps,就可以强制删除。但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
    如:rpm -e --nodeps foo(nodeps 不检查依赖关系 no dependencies)

14.1.5、安装RPM软件包

基本语法:rpm -ivh RPM软件包全路径名称

rpm软件包其实是一个软件的安装包

点击Linux系统桌面的光盘,里面有一个Packages文件夹,这个文件夹里有很多rpm软件安装包在/run/media/root/CentOS 7 x86_64/Packages目录下

选项:

  • i=install 安装
  • v=verbose 提示
  • h=hash 进度条

应用实例:演示卸载和安装 firefox 浏览器

  1. 卸载:rpm -e firefox
  2. 安装:rpm -ivh /run/media/root/CentOS 7 x86_64/Packages/firefox-102.9.0-3.el7.centos.x86_64.rpm

也可以在Packages中找到firefox安装包,复制到某一个目录下,这样写路径简单

14.2、YUM

  1. 基本介绍

    Yum(Yellow dog Updater, Modified)是一个Shell前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,
    可以自动处理依赖性关系,并且一次安装所有依赖的软件包

    使用yum list | grep 软件名向yum服务器查询有没有该软件(类似于手机的应用商城)。有的话,使用yum install 软件名下载安装该软件

  2. yum基本指令

    查询 yum 服务器是否有 需要安装的软件:yum list | grep 软件名

    安装指定的软件:yum install 软件名

    案例:请使用 yum 的方式来安装 firefox

    1. rpm -e firefox
    2. yum list | grep firefox
    3. yum install firefox
  3. 总结:rpm 是从本地安装包下载,yum 是从yum服务器下载安装软件

15、Linux配置开发环境

15.1、安装JDK8

安装jdk8的步骤:

  1. 官网下载Linux版本的jdk8

    Linux版本的jdk8

  2. Linux系统创建目录/opt/jdk:mkdir /opt/jdk

  3. 使用Xftp7传输到Linux系统下的/opt/jdk

    建议:将下载的压缩包都放在/opt目录下

    Xftp传输jdk8

  4. 进入/opt/jdk目录,使用tar命令解压jdk的压缩包:tar -zxvf jdk-8u361-linux-x64.tar.gz

    解压完成后,得到目录:jdk1.8.0_361

    [root@luminescent jdk]# ll
    总用量 135516
    drwxr-xr-x. 8 root root      4096 4月  14 17:14 jdk1.8.0_361
    -rw-r--r--. 1 root root 138762230 4月  14 17:10 jdk-8u361-linux-x64.tar.gz
    
  5. 创建目录/usr/local/java:mkdir /usr/local/java

    建议:将安装的软件放在 /usr/local 目录下

  6. 将第三步解压得到的文件夹整个移动到/usr/local/java目录下:mv /opt/jdk/jdk1.8.0_361/ /usr/local/java/

  7. 为了能够在任意目录下使用java指令,需要配置环境变量

    配置环境变量的配置文件在/etc/profile文件中

    1. 配置java的环境变量JAVA_HOME
    2. 配置类路径CLASSPATH,注意:一定要在类路径的开头加上.:
    3. 将JAVA_HOME引入到PATH环境变量中,一定要在PATH的最后加上$PATH

    在/etc/profile文件最后,输入以下内容

    export JAVA_HOME=/usr/local/java/jdk1.8.0_361
    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
    export PATH=$JAVA_HOME/bin:$PATH
    
    1. :wq(保存退出)
  8. (⭐)为了更新环境变量,使用source命令:source /etc/profile

  9. Java环境配置完成。在任意目录使用java -version查看jdk版本

    查看jdk版本

Linux系统下编写第一个Java程序

  1. 创建Hello.java文件:vim Hello.java

    public class Hello {
            public static void main(String[] args) {
                    System.out.println("Hello,java!");
            }
    }
    

    :wq保存退出

  2. 编译:javac Hello.java

  3. 运行:java Hello

Linux的第一个Java程序

15.2、安装tomcat9

15.2.1、安装Tomcat 9

  1. Tomcat镜像网站下载对应版本的tar.gz文件

    Tomcat 9的下载地址

  2. 在linux系统创建tomcat目录:mkdir /opt/tomcat

  3. 使用Xftp7将tomcat的压缩包传输到Linux虚拟机的/opt/tomcat目录

  4. 进入/opt/tomcat目录,解压文件:tar -zxvf apache-tomcat-9.0.73.tar.gz

  5. 进入解压后的tomcat的bin目录,bin目录结构如下

    tomcat目录

  6. 在/usr/local目录下创建文件夹tomcat:mkdir /usr/local/tomcat

  7. 将第四步解压得到的文件夹整个移动到/usr/local/tomcat目录下:mv /opt/tomcat/apache-tomcat-9.0.73/ /usr/local/tomcat/

  8. 配置tomcat环境变量

    1. 添加tomcat环境变量CATALINA_HOME
    2. 将CATALINA_HOME/bin引入到PATH变量中
    export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.73
    export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
    
    1. :wq保存退出
  9. 更新环境变量:source /etc/profile

15.2.2、启动/关闭Tomcat

  1. 任意目录下启动tomcat服务:startup.sh

  2. 查看8080端口的状态信息:netstat -anp | grep 8080

    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp6       0      0 :::8080                 :::*                    LISTEN      58900/java
    
  3. 在本机windows访问虚拟机的tomcat:虚拟机的ip地址:8080 -> 失败 -> 原因:虽然开启了tomcat服务,但是防火墙的8080端口任是关闭状态所以无法访问 -> 查看防火墙关于8080端口的状态:firewall-cmd --query-port=8080/tcp

    [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
    no
    
  4. 永久开启防火墙的8080端口:firewall-cmd --permanent --add-port=8080/tcp

  5. 每一次防火墙的更改都需要重载:firewall-cmd --reload

  6. 再次查看关于防火墙的8080端口的状态:firewall-cmd --query-port=8080/tcp

    [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
    yes
    
  7. 再次在主机Windows系统上访问虚拟机的tomcat服务:192.168.218.130:8080 -> 成功

  8. 在任意目录下关闭tomcat服务:shutdown.sh

15.2.3、编写第一个网页

  1. 启动tomcat服务:startup.sh

  2. 进入tomcat的目录webapps下的默认访问目录ROOT:cd /usr/local/tomcat/apache-tomcat-9.0.73/webapps/ROOT

  3. 编写一个页面:vim yxz.html,内容如下:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <h1> 这是我的第一个Linux系统下的页面 </h1>
    

    :wq保存退出

    注意:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 必须加上,否则会出现中文乱码问题

  4. 主机windows访问yxz.html页面:192.168.218.130:8080/yxz.html -> 成功显示

    Linux的第一个HTML页面

15.3、安装MySQL8.0

15.3.1、CentOS7卸载已经安装好的MySQL

  1. 关闭MySQL服务:systemctl stop mysqld.service

  2. 查看当前mysql的安装情况:rpm -qa | grep -i mysqlyum list installed | grep mysql

  3. 卸载第二步查找到的所有文件:yum remove mysql-xxx

    务必卸载干净,反复执行rpm -qa | grep -i mysql确认是否有卸载残留

  4. 删除mysql相关文件

    1. 查找mysql相关文件:find / -name mysql
    2. 删除上述命令查找出的相关文件:rm -rf xxx
    3. 删除Linux系统下mysql的配置文件my.cnfrm -rf /etc/my.cnf
  5. 卸载完成。

15.3.2、安装MySQL

  1. 新建文件夹mysql:mkdir /opt/mysql -> 并进入mysql文件夹:cd /opt/mysql

  2. 查看Linux系统下是否有自带的数据库:rpm -qa | grep mari

    [root@luminescent mysql]# rpm -qa | grep mari
    marisa-0.2.4-4.el7.x86_64
    mariadb-libs-5.5.68-1.el7.x86_64
    
  3. 删除安装Linux时自带的类mysql数据库mariadb相关文件

    1. rpm -e --nodeps marisa
    2. rpm -e --nodeps mariadb-libs
  4. 下载Linux版本的mysql安装包:下载地址

    Linux版本的MySQL下载

  5. 得到压缩包,使用Xftp7将第4步下载好的压缩包传输到Linux系统的 /opt/mysql 目录下

    安装包名称详解

  6. 进入/opt/mysql目录,解压文件:tar -xvf mysql-8.0.25-1.el7.x86_64.rpm-bundle.tar

    mysql压缩包解压后的文件

  7. CentOS7下检查MySQL依赖

    1. 由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,需要给/tmp较大的权限。

      执行指令:chmod -R 777 /tmp

    2. 安装前检查依赖(如果安装Linux时带图形化界面,则以下依赖都是自带的,可以跳过此步)

      1. rpm -qa|grep libaio
      2. rpm -qa|grep net-tools
      [root@luminescent mysql]# rpm -qa|grep libaio
      libaio-0.3.109-13.el7.x86_64
      [root@luminescent mysql]# rpm -qa|grep net-tools
      net-tools-2.0-0.25.20131004git.el7.x86_64
      
  8. 在mysql的安装目录(/opt/mysql)下依次执行以下命令(必须按照顺序执行)

    rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
    

    mysql安装过程

    注意: 如果没有检查mysql依赖环境,在安装mysql-community-server会报错

    rpm(Redhat Package Manage):通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。

    • -i --install 安装软件包

    • -v --verbose 提供更多的详细信息输出

    • -h --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条

  9. 在mysql的安装目录(/opt/mysql)下查看mysql版本信息:mysql --versionmysqladmin --verison
    linux查看mysql版本信息

  10. 执行命令:rpm -qa | grep -i mysql,查看mysql是否安装成功,-i忽略mysql的大小写,可加可不加

    [root@luminescent mysql]# rpm -qa | grep -i mysql
    mysql-community-client-8.0.25-1.el7.x86_64
    mysql-community-common-8.0.25-1.el7.x86_64
    mysql-community-libs-8.0.25-1.el7.x86_64
    mysql-community-server-8.0.25-1.el7.x86_64
    mysql-community-client-plugins-8.0.25-1.el7.x86_64
    
  11. 为了保证数据库目录与文件的所有者为 mysql 登录用户,如果你是以 root 身份运行 mysql 服务,需要执行下面的命令初始化

    mysqld --initialize --user=mysql

    说明:--initialize选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将 该密码标记为过期登录后需要设置一个新的密码生成的 临时密码 会往日志中记录一份

    使用命令:cat /var/log/mysqld.log 查看日志中记录的密码,root@localhost: 后面就是初始化的密码

    查看mysql初始密码

  12. 启动mysql服务:systemctl start mysqld 或者 systemctl start mysqld.service -> 下同,.service可加可不加

    查看mysql服务状态:systemctl status mysqld

    关闭mysql服务:systemctl stop mysqld

    重启mysql服务:systemctl restart mysqld

    说明:mysqld 这个可执行文件就代表着 MySQL 服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。

    查看mysql服务状态

  13. 查看mysql进程:ps -ef | grep mysql

    ps查看mysql进程

  14. 查看mysql服务监听端口的网络信息:netstat -anp | grep mysql

    netstat查看mysql服务

  15. 查看mysql服务是否自启动:systemctl list-unit-files | grep mysqld.service

    [root@luminescent mysql]# systemctl list-unit-files|grep mysqld.service
    mysqld.service                                enabled 
    
  16. 查看防火墙关于3306端口的开放状态:firewall-cmd --query-port=3306/tcp

    [root@luminescent mysql]# firewall-cmd --query-port=3306/tcp
    no
    
  17. 将防火墙的3306端口设置永久开放:

    firewall-cmd --permanent --add-port=3306/tcp

    firewall-cmd --add-service=http --permanent

    重启防火墙:firewall-cmd --reload

15.3.3、远程登录MySQL

  1. Linux下首次登录mysql需要重新设置密码

    1. Linux下,输入mysql -h localhost -P 3306 -u root -p 回车 -> 输入初始密码

      登录mysql

    2. 因为初始化密码已经过期,所以查看数据库会报错,在mysql中修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

      注意:5.7版本之后(不含5.7),mysql加入了全新的密码安全机制。设置新密码太简单会报错。

    3. 执行flush privileges; 刷新权限

  2. Linux下修改远程连接配置

    1. 登录mysql

    2. 使用mysql数据库:use mysql;

    3. 查看user表的信息:select Host,User from user;

      mysql数据库的user表

      可以看到root用户的当前主机配置信息为localhost。

    4. 修改Host为通配符%

      Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.218.1。这里的意思就是说root用户只能通过192.168.218.1的客户端去访问。 user=root Host=localhost,表示只能通过本机客户端去访问。而%是个通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。如果 Host=% ,表示所有IP都有连接权限(存在安全问题)。

      注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。

      update user set host = '%' where user ='root';

      更新后的mysql数据库的user表

  3. 刷新权限:flush privileges; -> 使对数据库的修改立即生效

  4. 如果在远程主机上使用图形化界面工具配置新连接到linux下的mysql8.0出现错误码2058(高版本的图形化界面不会出现该问题)

    原因:分析是mysql8.0密码的加密方法变了。

    解决方案:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Linux上MySQL的密码';

  5. Linux系统下MySQL的安装、配置、登录完成。

  6. 测试远程主机的图形化界面工具Navicat Premium 16连接mysql8.0.25

    Navicat连接mysql8.0.25

Navicat测试连接

16、Shell编程

16.1、为什么用Shell

  1. Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
  2. 对于JavaEE和Python程序员来说,工作的需要编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
  3. 对于大数据程序员来说,需要编写Shell程序来管理集群

16.2、Shell入门

  1. 脚本格式要求:

    脚本以#!/bin/bash开头 ---> 确定shell的类型

    脚本需要有可执行权限(x),shell脚本文件以.sh结尾(建议shell脚本文件以.sh结尾),也可以不以.sh结尾

  2. 编写第一个Shell 脚本

    需求说明:创建一个 Shell 脚本,输出:hello world!

    1. 创建目录:mkdir /root/shcode

    2. 进入目录并编辑文件:cd /root/shcode -> vim hello.sh

    3. 写入文件内容:

      #!/bin/bash
      echo "hello,world!"
      
  3. shell脚本的常用执行方式

    1. 首先要给shell脚本加x执行权限:chomod u+x hello.sh

      再输入该脚本的相对路径或绝对路径来执行该脚本

      使用相对路径:./hello.sh

      使用绝对路径:/root/shcode/hello.sh

    2. 不用赋予脚本+x 权限,直接执行即可。(使用以下指令,即使没有执行权限也可以执行)

      使用指令:sh shell脚本 或者 sh shell脚本的绝对路径

      比如:sh /root/shcode/hello.sh

16.3、Shell变量

  1. Linux Shell中的变量分为:系统变量和用户自定义变量

    1. 系统变量:系统自带的变量,如PATH(环境变量)、HOME(当前用户的家目录)
    2. 用户自定义变量

    可以通过set指令显示出shell中的所有系统变量

    使用变量:$变量名 -> $PATH $HOME

  2. 基本语法

    定义变量:变量名=值注意:=两边不能有空格 -> Shell编程中定义变量时,=号两边不能有空格)

    撤销变量:unset 变量名(相当于销毁变量)

    声明静态变量:readonly 变量名=值,静态变量只能读,不能修改,也不能撤销unset

    案例:编写脚本var.sh,测试变量:vim var.sh

    #!/bin/bash
    # 案例1:定义变量 A=520  (#为注释符)
    A=520
    # 输出变量需要加上$ ($ -> 引用变量)
    echo $A
    # 输出A = 520
    echo A = $A
    echo "A = $A"
    # 案例2:撤销变量A
    unset A
    echo A=$A
    # 案例 3:声明静态的变量 B=1314.520,不能 unset
    readonly B=1314.520
    echo B = $B
    # unset B -> 报错信息 var.sh: 第 15 行:unset: B: 无法反设定: 只读 variable
    
  3. Shell编程中变量名的定义规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
    • 等号两侧不能有空格
    • 变量名称一般习惯为大写(规范)
  4. 将 命令的返回值 赋给变量

    方式1:变量名=`指令` -------> 反引号``,运行里面的命令,并把结果返回给变量A

    方式2:变量名=$(指令) 等价于反引号

    # 将命令的返回值赋给变量
    C=`date`
    echo "当前日期时间$C"
    D=$(cal)
    echo "当前月的月历$D"
    
  5. 设置环境变量

    基本语法:

    1. export 变量名=变量值 (功能描述:将shell变量输出为环境变量)

      profile环境变量截图

    2. source 配置文件 (功能描述:让修改后的配置信息立即生效)

      source /etc/profile

    3. echo $变量名 (功能描述:查询环境变量的值)

      # 使用环境变量CATALINA_HOME
      echo "CATLINA_HOME=$CATALINA_HOME"
      
  6. shell脚本的注释

    单行注释:

    # 这是shell脚本的单行注释
    

    多行注释:

    :<<!
    多行注释1
    多行注释2...
    !
    

    注意:多行注释起始符和终止符都必须独占一行

16.4、位置参数变量

  1. 介绍:当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
    比如:./myshell.sh 100 200这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息

  2. 基本语法

    • $n: n 为数字,$0 代表命令本身(如./myshell.sh),
    • $1-$9: 代表第一到第九个参数(如:$1 就是100 $2 就是200),十以上的参数需要用大括号包含,如${10})
    • $*: 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
    • $@: 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
    • $#: 这个变量代表命令行中所有参数的个数)
  3. 案例:vim myshell.sh

    #!/bin/bash
    echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
    echo "所有的参数=$*"
    echo "$@"
    echo "参数个数=$#"
    

16.5、预定义变量

  1. 基本介绍:预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
  2. 基本语法
    1. $$:当前进程的进程号(PID)
    2. $!:后台运行的最后一个进程的进程号(PID)
    3. $?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
  3. 应用实例:vim preVar.sh
#!/bin/bash
echo "当前执行的进程ID=$$"
# 以后台方式运行一个脚本,并获取它的进程号
sh /root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程ID=$!"
echo "执行的结果是=$?"

16.6、运算符

  1. 基本介绍:适用运算符在 shell 中进行各种运算操作。

  2. 基本语法(三种写法)

    1. $((运算式))$

    2. $[运算式]$ ---> 推荐使用

    3. expr m + n (expression表达式,注意expr表达式中运算符两边要有空格,否则会把整个表达式当成字符串处理)

      expr \*, /, % ----> 表示乘,除,取余

      注意:要将expr的返回值赋给变量,需要使用``将整个expr表达式括起来

  3. 应用实例

    #!/bin/bash
    # 案例 1:计算(2+3)X4 的值
    # 方式1
    RES1=$(((2+3)*4))
    echo "res1=$RES1"
    # 方式2(推荐使用)
    RES2=$[(2+3)*4]
    echo "res2=$RES2"
    # 方式3
    TEMP=`expr 2 + 3`
    echo "temp=$TEMP"
    RES4=`expr $TEMP \* 4`
    echo "res4=$RES4"
    # 案例 2:求出命令行的两个参数[整数]的和
    SUM=$[$1+$2]
    echo "sum=$SUM"
    

16.7、条件判断

  1. 基本语法:if [ condition ] -> 注意:condition前后都必须要有空格

    if [ condition ]
    then
    	语句
    fi
    

    condition非空返回true,可以使用$?验证(0为true,>1 为false)

    [ shell ] -> 返回 true
    [ ] -> 返回 false
    [ condition ] && echo OK || echo notok -> 条件满足,执行后面的语句

  2. 常用判断条件

    1. =:字符串比较
    2. 两个整数比较
      • -lt 小于(less than)
      • -le 小于等于(less equal)
      • -eq 等于(equal)
      • -gt 大于(greater)
      • -ge 大于等于(greater equal)
      • -ne 不等于(not equal)
    3. 按照文件权限进行判断
      • -r 有读的权限
      • -w 有写的权限
      • -x 有执行的权限
    4. 按照文件类型进行判断
      • -f 文件存在并且是一个常规的文件
      • -e 文件存在
      • -d 文件存在并是一个目录
  3. 应用实例:vim ifdemo.sh

    #!/bin/bash
    if [ "ok" = "ok" ]
    then
            echo "相等"
    fi
    # 案例2:整数比较
    if [ 12 -gt 2 ]
    then
            echo "大于"
    fi
    
    # 案例3:/root/shcode/var.sh 文件是否存在
    if [ -f /root/shcode/var.sh ]
    then
            echo "文件存在"
    fi
    
    # condition非空返回true
    if [ ] # condition为假
    then
            echo "false"
    fi
    
    if [ studyShell ] # condition为真
    then
            echo "true"
    fi
    
    输出结果:
    相等
    大于
    文件存在
    true
    

16.8、流程控制

16.8.1、if elif语句

  1. 基本语法(相当于Java中的else if语句)

    if [ 条件判断式 ]
    then
    	代码
    elif [ 条件判断式 ]
    then
    	代码
    fi
    

    注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格

  2. 应用实例:vim ifCase.sh

    #!/bin/bash
    # 案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
    if [ $1 -ge 60 ]
    then
            echo "及格了"
    else
            echo "不及格"
    fi
    
    if [ $1 -ge 60 ]
    then
            echo "及格了"
    elif [ $1 -lt 60 ]
    then
            echo "不及格"
    fi
    

16.8.2、case语句

  1. 基本语法(相当于Java中的switch-case语句)

    case $变量名 in
    "值 1")
    	如果变量的值等于值 1,则执行程序 1
    ;;
    "值 2")
    	如果变量的值等于值 2,则执行程序 2
    ;;
    ...省略其他分支...
    *)
    	如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
    

    每个case分支都以;;结尾,这两个;;不能分开

  2. 应用实例

    #!/bin/bash
    # 案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",是3时,就输出"周三",其它情况输出"other"
    case $1 in
    "1")    echo "周一";;
    "2")    echo "周二";;
    "3")    echo "周三"
    ;;
    *)      echo "other...";;
    esac
    

16.8.3、for循环

  1. 基本语法

    # 语法格式1
    for 变量 in  值 1  值 2  值 3...
    do
    	程序/代码
    done
    
    # 语法格式2
    for (( 初始值;循环控制条件;变量变化 ))
    do
    	程序/代码
    done
    
  2. 应用实例

    vim testFor1.sh

    #!/bin/bash
    # for语法格式1
    # 案例:打印命令行输入的参数 [这里可以看出$*  和 $@ 的区别]
    # 注意:$* 是把输入的参数当作一个整体,所以只会输出一句话
    for i in "$*"
    do
    	echo "num is $*"
    done
    # 使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句
    echo "======================================"
    for j in "$@"
    do
    	echo "num is $@"
    done
    
    [root@luminescent shcode]# sh testFor1.sh 100 200 300 400
    num is 100 200 300 400
    ======================================
    num is 100 200 300 400
    num is 100 200 300 400
    num is 100 200 300 400
    num is 100 200 300 400
    

    vim testFor2.sh

    #!/bin/bash
    # 案例1:从 1 加到 100 的值输出显示
    SUM=0
    for((i=1;i<=100;i++))
    do
            SUM=$[$SUM+$i]
    done
    echo "1-100的总和:$SUM"
    # 案例2:根据命令行的参数传入的x值,计算1-x的和
    SUMX=0
    for(( i=1; i <= $1; i++ ))
    do
            SUMX=$[$SUMX + $i]
    done
    echo "1-$1的总和:$SUMX"
    
    [root@luminescent shcode]# sh testFor2.sh 1000
    1-100的总和:5050
    1-1000的总和:500500
    

16.8.4、while循环

  1. 基本语法

    while [ 条件判断式 ]
    do
    	循环体
    done
    

    注意:

    1. while和[]中间有空格
    2. 条件判断式两边也必须有空格
    3. while循环体内必须有循环变量自增
  2. 应用实例:vim testWhile.sh

    #!/bin/bash
    SUM=0
    i=0
    while [ $i -le $1 ]
    do
            SUM=$[$SUM+$i]
    i=$[$i+1]
    done
    echo "执行结果=$SUM"
    
    [root@luminescent shcode]# sh testWhile.sh 10
    执行结果=55
    

16.9、read读取控制台输入

  1. 基本语法:read 选项 参数

    选项:

    -p:指定读取值时的提示符

    -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了

    参数:指定读取值的变量名

  2. 应用实例:vim testRead.sh

    #!/bin/bash
    #案例 1:读取控制台输入一个 NUM1 值
    read -p "请输入一个数 NUM1=" NUM1
    echo "你输入的 NUM1=$NUM1"
    #案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
    read -t 10 -p "请输入一个数 NUM2=" NUM2
    echo "你输入的 NUM2=$NUM2"
    
    [root@luminescent shcode]# sh testRead.sh
    请输入一个数NUM1=10
    输入的NUM1=10
    请输入一个数NUM2=520
    输入的NUM2=520
    

16.10、函数

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。

16.10.1、系统函数

  1. basename函数:返回完整路径最后 / 的部分,常用于获取文件名

    basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

    基本语法:

    basename [pathname] [suffix]
    basename [string] [suffix]
    

    选项:suffix为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

    案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
    basename /home/aaa/test.txt
    test.txt
    basename /home/aaa/test.txt .txt
    test
    
  2. dirname函数:返回完整路径最后 / 的前面的部分,常用于返回路径部分

    dirname从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

    基本语法:dirname 文件绝对路径

    案例 1:请返回 /home/aaa/test.txt 的 /home/aaa 
    dirname /home/aaa/test.txt
    /home/aaa
    

16.10.2、自定义函数

  1. 基本语法

    基本语法:
    [ function ] funname[()]
    {
    	Action;
    	[return int;]
    }
    

    调用直接写函数名:funname [值]

  2. 案例:计算输入两个参数的和(动态的获取) testFun.sh

#!bin/bash
#案例 1:计算输入两个参数的和(动态的获取)
#定义函数 getSum 
function getSum() {
    SUM=$[$n1+$n2] 
    echo "和是=$SUM"
}

#输入两个值
read -p "请输入一个数 n1=" n1 
read -p "请输入一个数 n2=" n2

#调用自定义函数
getSum $n1 $n2
[root@luminescent shcode]# sh testFun.sh
请输入一个整数n1=520
请输入一个整数n2=1314
两数之和=1834

Shell编程综合案例-定时数据库备份

需求分析:

  1. 每天凌晨2:30备份数据库 girls 到/data/backup/db
  2. 备份开始和备份结束能够给出相应的提示信息
  3. 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2023-04-17_164041.tar.gz
  4. 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。

思路分析示意图:

定时备份数据库示意图

前提:切换到/usr/sbin/目录下(该目录为root用户执行权限,使用root执行)

  1. 脚本代码实现:mysql_db_backup.sh -> vim /usr/sbin/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=数据库的密码
    # 备份的数据库名
    DATABASE=girls
    
    # 创建备份目录,如果不存在就创建
    [ ! -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.gz
    cd ${BACKUP}
    tar -zcvf $DATETIME.tar.gz ${DATETIME}
    # 删除对应的备份目录
    rm -rf ${BACKUP}/${DATETIME}
    # 删除十天前的备份文件
    find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
    echo "备份数据库${DATABASE}成功~"
    
  2. 设置定时调度任务

    30 2 * * * /usr/sbin/mysql_db_backup.sh
    

17、日志管理

17.1、基本介绍

  1. 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。

  2. 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。

  3. 日志是用来记录重大事件的工具

17.2、系统常用日志

系统日志文件的保存位置:/var/log/目录下

应用案例:使用root用户通过Xshell7登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure里有没有记录相关信息。

系统常用日志:

日志文件 说明
/var/log/boot.log 系统启动日志
/var/log/cron 记录与系统定时任务相关的日志
/var/log/cups/ 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息
/var/log/btmp 记录错误登录的日志。这是一个二进制文件,不能直接使用vi/vim/cat查看,而要使用lastb命令查看。
/var/log/lastlog 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,要使用lastlog命令查看
/var/log/maillog 记录邮件信息的日志
/var/log/message 记录系统重要信息的日志,这个日志文件中会记录Linux系统的绝大多数重要信息。如果系统出现问题,首先要检查的应该就是这个日志文件
/var/log/secure 记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户、sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。是二进制文件,使用last命令查看
/var/log/ulmp 记录当前已经登陆的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。这个文件不能用vi/vim/cat命令查看,要使用wwhousers等命令查看

17.3、日志管理服务rsyslogd

CentOS7.6 日志服务是 rsyslogd(rocket-fast system for log),CentOS6.x日志服务是syslogd。rsyslogd 功能更强大,rsyslogd 的使用、日志文件的格式,和 syslogd 服务是兼容的。rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。将日志记录到对应的文件中。/etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。

原理示意图:

日志管理服务原理图

  1. 在进行日志管理时,要保证rsyslogd服务是启动的!

    1. 查询 Linux 中的 rsyslogd 服务是否启动:

      ps aux | grep "rsyslog"

      ps aux | grep "rsyslog" | grep -v "grep" -> -v选项:表示过滤出不包含的内容(相当于补集)

    2. 查询 rsyslogd 服务的自启动状态(是否是自启动状态enable):systemctl list-unit-files | grep rsyslog

  2. 配置文件:/etc/rsyslog.conf -> 该配置文件中记录了日志和日志存放在哪个文件

    关于日志:*.* -> 其中第一个*代表日志类型,第二个*代表日志级别

    rsyslog.conf部分内容

    日志类型 说明
    auth pam 产生的日志
    authpriv ssh、ftp 等登录信息的验证信息
    corn 时间任务相关
    kern 内核
    lpr 打印
    mail 邮件
    mark(syslog)-rsyslog 服务内部的信息,时间标识
    news 新闻组
    user 用户程序产生的相关信息
    uucp unix to nuix copy主机之间相关的通信
    local 1-7 自定义的日志设备
    日志级别 级别说明
    debug 有调试信息的,日志通信最多
    info 一般信息日志,最常用
    notice 最具有重要性的普通条件的信息
    warning 警告级别
    err 错误级别,阻止某个功能或者模块不能正常工作的信息
    crit 严重级别,阻止整个系统或者整个软件不能正常工作的信息
    alert 需要立刻修改的信息
    emerg 内核崩溃等重要信息
    none 什么都不记录
    注意:从上到下,级别从低到高,记录信息越来越少
  3. 由日志服务 rsyslogd 记录的日志文件,日志文件的内容:每一行都代表一个事件,每一行有以下四个内容

    1. 事件产生的时间
    2. 产生事件的服务器的主机名
    3. 产生事件的服务名或程序名
    4. 事件的具体信息
  4. 查看日志:查看一下 /var/log/secure 日志,这个日志中记录的是用户验证和授权方面的信息 来分析如何查看

    secure日志的信息

  5. 日志管理服务应用实例(增加自定义的日志)

    在/etc/rsyslog.conf 中添加一个日志文件/var/log/yxz.log,当有事件发送时(比如sshd服务相关事件),该文件会接收到信息并保存.

    1. vim /etc/rsyslog.conf
    2. 写入:*.*/var/log/yxz.log
    3. 保存退出
    4. >/var/log/yxz.log(创建空的日志文件)

    然后重启,重启事件会被记录到/var/log/yxz.log中

17.4、日志轮替

日志轮替(logrotate)就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后(旧日志文件数量达到某个值的时候),就会进行删除清除日志中旧的信息。

17.4.1、日志轮替时文件命名

  1. centos7 使用 logrotate 进行日志轮替管理

    要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数

  2. 如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20201010”。

    这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件即可。

  3. 如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。

    当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。

    当第二次进行日志轮替时,“secure.1” 会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来

    保存新的日志,以此类推。

17.4.2、logrotate配置文件

/etc/logrotate.conf为logrotate 的全局配置文件(写了日志文件轮替规则)

/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)

可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则

也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用

/etc/logrotate.conf文件内容

[root@luminescent ~]# more /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# --->可以把一些单独的轮替规则写在/etc/logrotate.d下(在本文件中include调用一下就行),也可以写在本文件中(如下面写的)

#下面是单独设置,优先级更高。
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly					 # 每月对日志文件进行一次轮替
    create 0664 root utmp 	 # 建立的新日志文件,权限是 0664  ,所有者是 root ,所属组是 utmp 组
    minsize 1M				 # 日志文件最小轮替大小是 1MB 。也就是日志一定要超过 1MB 才会轮替,否则就算时间达到一个月,也不进行日志转储
    rotate 1 				 # 仅保留一个日志备份。也就是只有 wtmp  和 wtmp.1  日志保留而已
}

/var/log/btmp {
    missingok 				 # 如果日志不存在,则忽略该日志的警告信息
    monthly
    create 0600 root utmp rotate 1
}
# system-specific logs may be also be configured here.

单独指定某个日志文件的轮替规则的参数说明:

轮替规则的参数 说明
daily 日志的轮替周期是每天
weekly 日志的轮替周期是每周
monthly 日志的轮替周期是每月
rotate 数字 保留的日志文件的个数。0 指没有备份
compress 日志轮替时,旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和所属组。
mail address 当日志轮替时,输出内容通过邮件发送到指定的邮件地址。
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。
dateext 使用日期作为日志轮替文件的后缀。
sharedscripts 在此关键字之后的脚本只执行一次。
prerotate/endscript 在日志轮替之前执行脚本命令。
postrotate/endscript 在日志轮替之后执行脚本命令。

17.4.3、自定义的日志加入日志轮替

  1. 第一种方法:直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
  1. 第二种方法:在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。

    推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

  1. 练习

    1. 在/etc/logrotate.d/下创建文件yxz.log:vim yxzlog

    2. 写入内容:

      /var/log/yxz.log
      {
          missingok
          daily
          copytruncate
          rotate 1
          notifempty
      }
      
    3. 这样就好了,因为/etc/logrotate.conf 中有:include /etc/logrotate.d

17.5、日志轮替机制原理

日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。

在 /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的。crond定时后台程序会定时执行cron.daily内的文件。logrotate 文件在cron.daily下所以也会定时执行文件中的轮替规则 -> 写日志是rsyslogd,日志轮替是logrotate

17.6、查看内存日志

有一些日志是写到内存里的,还没有写到文件里,因为这些日志是实时变化的
重启之后内存日志会被清空

查看内存日志指令:journalctl

journalctl:查看全部

journalctl -n 3:查看最新 3 条

journalctl --since 19:00 --until 19:10:10:查看起始时间到结束时间的日志可加日期

journalctl -p err:报错日志

journalctl -o verbose:日志详细内容

journalctl _PID=1245 _COMM=sshd:查看包含这些参数的日志(在详细日志查看) 或者 journalctl | grep sshd

注意: journalctl查看的是内存日志, 重启清空

演示案例:使用 journalctl | grep sshd 来看看用户登录清空, 重启系统,再次查询,看看日志有什么变化没有

18、Linux系统备份与恢复

18.1、基本介绍

虚拟机可以做快照。实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。所以可以使用备份和恢复技术

linux的备份和恢复两种方式:

  1. 把需要的文件(或者分区)用tar命令打包就行,下次需要恢复的时候,再解压开覆盖即可
  2. 使用 dump 和 restore 命令

18.2、安装dump和restore

如果 linux 上没有 dump 和 restore 指令,要先安装

yum -y install dump -> 会安装依赖restore

yum -y install restore

18.3、使用dump完成备份

  1. 基本介绍:dump 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)

  2. 语法说明:

    dump [-cu] [-0123456789]	[-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统] 
    dump [] -wW
    

    选项说明:
    -c:创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。

    -0123456789:备份的层级。0为最完整备份,会备份所有文件。若指定0以上的层级,则备份至上一次备份以来修改或新增的文件,到9后,可以再次轮替。

    -f <备份后文件名>:指定备份后文件名

    -j:调用 bzlib 库压缩备份文件,也就是将备份后的文件压缩成 bz2 格式,让文件更小

    -T <日期>:指定开始备份的时间与日期

    -u:备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。

    -t:指定文件名,若该文件已存在备份文件中,则列出名称

    -W:显示需要备份的文件及其最后一次备份的层级,时间,日期。

    -w:与-W 类似,但仅显示需要备份的文件。

    进行增量备份/备份层级要加-u,因为-u可以记录层级

  3. 案例 1:将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0”

    dump -0uj -f /opt/boot.bak0.bz2 /boot -----> /boot 要备份的分区

    案例 2:在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看这次生成的备份文件 boot1.bak 有多大
    dump -1uj -f /opt/boot.bak1.bz2 /boot

    注意:通过 dump 命令在配合 crontab 可以实现无人值守备份 -> 写一个脚本

  4. 显示需要备份的文件及其最后一次备份的层级,时间,日期:dump -W

  5. 查看备份时间文件:cat /etc/dumpdates

  6. dump 备份文件或者目录

    前面在备份分区时,是可以支持增量备份的,如果备份文件或者目录,不再支持增量备份, 即只能使用 0 级别备份(-u不能写)

    案例:使用 dump 备份 /etc 整个目录:dump -0j -f /opt/etc.bak.bz2 /etc/

注意:如果要备份重要的文件,比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子。

19、Linux面试题

第一题

题目:分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯)

t.log内容:

http://192.168.218.20/index1.html
http://192.168.218.30/index2.html
http://192.168.218.20/index1.html
http://192.168.218.10/index1.html
http://192.168.218.10/index1.html
http://192.168.218.20/order.html
http://192.168.218.10/order.html

解决步骤

  1. 读取文件t.log内容

    cat t.log

  2. 将读取到的内容以/截断

    cat t.log | cut -d '/'

    所以 以/截断后

    第一段内容:http:

    第二段内容为空(//之间为空)

    第三段内容为ip地址

    第四段内容为网页xxx.html

  3. 查找第三段的内容(ip地址)

    cat t.log | cut -d '/' -f 3

    192.168.218.20
    192.168.218.30
    192.168.218.20
    192.168.218.10
    192.168.218.10
    192.168.218.20
    192.168.218.10
    
  4. 将获取到的ip地址排序

    cat t.log | cut -d '/' -f 3 | sort

    192.168.218.10
    192.168.218.10
    192.168.218.10
    192.168.218.20
    192.168.218.20
    192.168.218.20
    192.168.218.30
    
  5. 统计每个ip地址出现的次数

    cat t.log | cut -d '/' -f 3 | sort | uniq -c

    3 192.168.218.10
    3 192.168.218.20
    1 192.168.218.30
    
  6. 按出现的次数从大到小排序(sort默认以从小到大排序)

    cat t.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr

    3 192.168.218.20
    3 192.168.218.10
    1 192.168.218.30
    

注意:如果第四步不排序直接统计次数后再排序,会导致不在一起的相同的ip地址出现两个记录的情况

[root@luminescent interview]# cat t.log | cut -d '/' -f 3 | uniq -c | sort -nr
2 192.168.218.10
1 192.168.218.30
1 192.168.218.20
1 192.168.218.20
1 192.168.218.20
1 192.168.218.10

第二题

题目:统计连接到服务器的各个ip情况,并按连接数从大到小排序(腾讯)

面试题2

解决步骤

  1. 找出建立连接的服务

    netstat -an | grep ESTABLISHED

    tcp        0     36 192.168.218.130:22      192.168.218.1:64958     ESTABLISHED 2526/sshd: root@pts 
    tcp6       0      0 192.168.218.130:3306    192.168.218.1:53640     ESTABLISHED 15843/mysqld 
    
  2. 以空格分割第一步获取到的服务信息并打印第5段内容(多个空格 看作 1个空格)

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'

    192.168.218.1:64958
    192.168.218.1:53640
    
  3. 继续以:分割第二步获取到的信息并打印第一段内容

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}'

    或者

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | cut -d ':' -f 1

    192.168.218.1
    192.168.218.1
    
  4. 对第三步获取到的ip地址进行排序

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort

    192.168.218.1
    192.168.218.1
    
  5. 统计ip地址出现的次数

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c

    2 192.168.218.1
    
  6. 根据 ip地址出现的次数多少 从大到小排序

    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr

    2 192.168.218.1
    

第三题

题目:如何重置mysql5.7数据库的ROOT用户的密码?(滴滴)

解决步骤

  1. 编辑mysql的配置文件:vim /etc/my.cnf

    在文件中的[mysqld]标签下添加一行内容:skip-grant-tables

    表示忽略检查权限(不需要输入密码)

  2. 重启mysql服务,使修改后的配置文件内容立即生效:service mysqld restart

  3. 登录mysql数据库:mysql -u root -p,输入密码的地方直接回车

    1. 使用数据库mysql:use mysql;

    2. 修改表user的列authentication_string值为数据库的新密码

      update user set authentication_string=password('新密码') where user='root';

    3. 刷新权限:flush privileges;

    4. 退出数据库:exit;

  4. 再次编辑mysql的配置文件,注释掉第一步写入的内容:vim /etc/my.cnf

    #skip-grant-tables

  5. 重启mysql服务(使修改的配置文件立即生效):service restart mysqld

  6. 重置密码工作已完成。可以使用新密码登录mysql数据库

第四题

题目:统计ip访问情况,要求分析nginx访问日志(access.log),找出访问页面数量在前两位的ip地址(美团)

解决步骤:(原理和第二题一样)

指令:cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2'

head -2 -> 表示只获取前两个信息

第五题

常用的Nginx模块,用来做什么?

  1. rewrite模块:实现重写功能
  2. access模块:来源控制
  3. ssl模块:安全加密
  4. ngx_http_gzip_module:网络传输压缩模块
  5. ngx_http_proxy_module:网络代理模块
  6. ngx_http_upstream_module:模块实现定义后端服务器列表
  7. ngx_cache_purge:实现缓存清除功能

第六题

如果你是系统管理员,在进行Linux系统权限划分时,应考虑哪些因素?

回答方向:

  1. 首先阐述Linux权限的主要对象

    比如rwx权限作用在文件上的含义,作用在目录上的含义

    rwx权限如何修改,-R权限递归修改选项

  2. 根据自己的实际经验考虑因素

    • 注意权限分离,比如Linux系统权限和数据库权限不要再同一个部门
    • 权限最小原则 -> 权限够用就行
    • 减少使用root用户,尽量用普通用户+sudo提权进行操作
    • 重要的系统文件,比如/etc/passwd,/etc/shadow等,日常建议使用chattr(change attribute)锁定,需要操作时再打开
    • 使用SUID,SGID,Sticky设置特殊权限
    • 可以利用工具,比如chkrootkit hunter检测rootkit脚本(rootkit是入侵者使用工具,在不察觉的情况下建立了入侵系统途径)
    • 利用工具Tripwire检测文件系统完整性

第七题(⭐)

题目:Linux的CentOS 7的启动流程?和CentOS 6的相同点和不同点?

CentOS 7的启动流程

CentOS 7启动流程

CentOS 6的启动流程

CentOS 6启动流程

第八题

题目:列举Linux高级命令,至少6个(百度)

回答:

  1. netstat -> 网络状态监控
  2. top -> 动态监控系统运行状态
  3. lsblk -> 查看硬盘分区
  4. find
  5. ps -aux -> 查看运行进程
  6. chkconfig -> 查看服务启动状态
  7. systemctl -> 管理系统服务

第九题

题目:Linux 查看内存、io读写、磁盘存储、端口占用、进程查看 的命令是什么?(瓜子)

回答

  1. 查看内存 -> top指令

  2. io读写 -> iotop指令(需要手动安装:yum install iotop

    iotop指令动态监控io读写

  3. 磁盘存储:df -lh指令

  4. 端口占用:netstat -tunlp

    netstat-tunlp指令

  5. 进程查看:ps -aux指令 配合管道指令可以查看目标进程

第十题

题目:用linux命令计算t2.txt第二列的和并输出(美团)

t2.txt内容:

张三 60
李四 40
王五 80

答案cat t2.txt | awk " " '{sum+=$2} END {print sum}'

第十一题

题目:Shell脚本里如何检查一个文件是否存在?并给出提示(百度)

答案:if [ -f 文件名 ] then echo "存在" else echo "不存在" fi

第十二题

题目:用Shell写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出(百度)。t3.txt内容:

6
4
8
3
2
1
5
10

答案:

  1. 排序:sort -n t3.txt -> 从小到大排序,sort -nr t3.txt -> 从大到小排序

  2. 统计综合

    sort -nr t3.txt | awk '{sum+=$0; print $0} END'

  3. 输出提示信息

    sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}'

    [root@luminescent interview]# sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}'
    10
    8
    6
    5
    4
    3
    2
    1
    和=39
    

第十三题

题目:使用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat”的文件名称(金山)

答案grep -r "cat" /home | cut -d ":" -f 1

第十四题

题目:统计/home目录下所有文件个数和所有文件总行数的指令(金山面试题拓展)

答案

  1. 统计所有文件个数:find /home -name "*.*" | wc -l
  2. 统计所有文件的总行数:find /home -name "*.*" | xargs wc -l

第十五题

题目:列出你了解的web服务器负载架构(滴滴)

Nginx、Haproxy、Keepalived、LVS

第十六题

题目:每天晚上10点30分,打包站点目录/var/spool/mail 备份到/home目录下(每次备份按事件生成不同的备份包 比如按照 年月日时分秒)(滴滴)

  1. 编写shell脚本:vim /root/shcode/mail.sh

    #!/bin/bash
    cd /var/spool/ && /bin/tar zcf /home/mail-`date +%Y-%m-%d_%H%M%S`.tar.gz mail/
    
  2. 设置crond任务调度:crontab -e

    30 22 * * * /bin/sh /root/shcode/mail.sh
    

第十七题

题目:如何优化Linux系统?

  1. 对Linux架构的优化

    部署集群 -> 访问一个linux服务器优化成访问多个Linux服务器 -> LVS实现负载均衡

    1. 网络优化 -> 每个客户访问LVS,带宽大小优化
    2. 磁盘IO优化 -> 提升访问文件系统的速度
    3. 文件连接数 -> 读写分离
    4. 安全性
    5. 防火墙 -> 内部的服务不对外部开放
    6. 内存优化,比如关闭不必要的服务
  2. 对Linux系统本身的优化----规则

    1. 不使用root,使用sudo提示权限
    2. 定时的自动更新服务时间,使用nptdate npt1.aliyun.com,让crond定时更新
    3. 配置yum源,指向国内镜像
    4. 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
    5. 打开最大文件数(调整文件的描述的数量):vim /etc/profile ulimit-SHn 65535
    6. 配置合理的监控策略
    7. 配置合理的系统重要文件的备份策略
    8. 对安装的软件进行优化,如Nginx,apache
    9. 内核参数进行优化:/etc/sysctl.conf
    10. 锁定一些重要的系统文件
    11. 禁用不必要的服务,setup指令,ntsysv
posted @ 2023-04-19 18:33  Yxz-smile  阅读(188)  评论(1编辑  收藏  举报