Linux基础

第一章 Linux开山篇

1.1 Linux学习方向

Linux运维工程师:服务器的管理,安全保障,需要迅速恢复

Linux嵌入式工程师:熟悉掌握Linux下各自驱动程序开发,在嵌入式系统中进行程序开发

Linux下开发项目:JavaEE、大数据、Python、PHP、c/c++(Linux部署,管理大数据集群)

1.2 Linux应用领域

个人桌面领域

服务器领域:免费稳定高效,程序最终需要部署到Linux上运行

嵌入式领域:运行稳定 Linux内核可以定制

1.3 Linux学习方法

第一阶段:Linux环境下的基本操作命令,包括文件操作命令(rm mkdir chmod chown) 编辑工具使用(vi vim) linux用户管理(useradd userdel usermod)等

第二阶段:Linux的各自配置(环境变量配置 网络配置 服务配置)

第三阶段:Linux下如何搭建对应语言的开发环境(大数据 JavaEE Python)

第四阶段:能编写shell脚本,对Linux服务器进行维护

第五阶段:能进行安全设置,防止攻击从,保障服务器正常运行,能对系统调优

第六阶段:深入理解Linux系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法

第二章 Linux基础篇

Linux基础_第1张图片

Vmtools可以让Windows和Linux的系统之间互相粘贴,且可以存在共享文件夹

共享文件夹Linux打开方式

  1. 运行如下命令行

    sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000

    切入共享文件夹所在位置 cd /mnt/hgfs/,可见当前共享文件

  2. 或直接进入root模式 su root

    切入共享文件夹所在位置即可

2.1 Linux文件系统目录结构

Linux的文件系统采用级层式的树状目录结构,只有一个根目录 / ,其下有许多子目录

在Linux世界里,一切皆文件,例如声卡等都以文件形式管理

/dev

​ 管理硬件计算设备,如CPU,DISK

/media 管理媒体输出设备,如DVD,USB等

基本的文件目录如下:

image-20210914215227589

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。 FHS 定义了两层规范
第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc应该要放置设置文件,/bin 与 /sbin 则应该要放置可执行文件等等。
第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件、/usr/share 放置共享数据等等。

FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动(注意,不是不能,学习过程中,不要怕这些),将目录定义为四种交互作用的形态,如下表所示:

Linux基础_第2张图片 image-20210914214548419
指令 作用
/bin 主要的Linux的指令目录;/user/bin:可执行二进制文件的目录,如常见的命令ls、tar、mv、cat等
/sbin 放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能查看而不能设置和使用
/dev 管理计算机的硬件与计算设备,如CPU,DISK
/etc 存放系统配置文件,不建议存放可执行文件,重要的配置文件有:/etc/inittab、/etc/fstab、/etc/X11、/etc/sysconfig、/etc/xinetd.d。注:/etc/X11 存放与 x windows 有关的设置。(X11也叫做X Window系统,是图形化窗口管理系统 。它是诞生于Unix 、以及 OpenVMS,是传统上Unix环境中建立图形用户界面 的标准工具包和协议)
/home 家目录,当创建普通用户时会在home文件夹下生成对应的用户文件,表示当前用户的家目录,edu表示用户edu的家目录
/lib 动态库,一般文件格式为.so,是系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules
/root 系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在同一分区
/boot 放置Linux系统启动时用到的一些文件。/boot/vmlinuz为Linux的内核文件,以及/boot/gurb
/proc 一个虚拟的目录。是系统内存的映射,访问这个目录来获取系统信息
/srv service的缩写,存放一些服务启动后需要提炼的数据
/sys 安装了Linux2.6内核下新出现的一个文件系统/ysfs
/user 应用程序存放目录
/user/bin 存放应用程序
/user/share 存放共享数据
/user/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件
/user/local 存放软件升级包
/user/shar/doc 系统说明文件存放目录
/user/share/man 程序说明文件存放位置,使用man is时会查询/user/share/man/man1/ls.1.gz的内容
/opt 给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的 KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下
/mnt 光盘默认挂载点,/mnt/hgfs为Windows共享文件夹
/tmp 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在该目录下
/media 用于加载各种媒体
/lost+found 一般是空的,当系统非法关机后这里就存放一些文件
/var 这个目录中存放习惯被修改的文件,包括各种日志文件
/selinux[security-enhanced linux] 一个安全子系统,能控制程序只能访问特定文件
Linux基础_第3张图片

总结:

  • Linux 的目录中有且只有一个根目录
  • Linux 的各个目录存放的内容是规划好的,不要乱放文件
  • Linux是以文件的形式管理我们的设备,因此Linux系统中一切皆为文件
  • Linux 的各个文件存储内容

第三章 Linux实操篇

3.1 远程登录Linux系统Xshell

3.1.1 为什么需要远程登录Linux

公司可能服务器在远端,所以需要远程登录

Xshell5:远程登录Linux系统

Xftp5:远程上传下载文件

3.1.2 安装Xshell5并使用

需要Linux开启sshd服务(22端口),来监听是否有服务,可以确认是否可以远程登录

setup:一个指令,可以打开Linux设置界面

端口开的越多,安全性就越弱,一般只开22号端口

远程登录步骤:

  • 首先检查Linux的IP地址(ipconfig)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6eta2KEe-1635161857628)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915100640039.png)]

  • 在Xshell中新建会话,填入查出来的IP地址

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QfbDYvua-1635161857632)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915100823374.png)]

  • 连接后输入Linux的账号和密码即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9QGXG48-1635161857638)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915100905888.png)]

测试:

​ 输入touch hello在文件夹中创建一个hello文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIpWAeXZ-1635161857641)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915101106128.png)]

​ 可见远程的Linux真的创建出了该文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCE5GSI1-1635161857645)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915101153082.png)]

3.2 远程上传下载文件Xftp

直接安装后新建会话(过程与Xshell一致),连接后上传下载文件直接拖就好

乱码问题:

在会话属性中选择UTF-8格式,就可以解决该问题

3.3 Vi和Vim编辑器

3.3.1 基本介绍

所有的Linux系统都会内置vi文本编辑器

Vim具有程序编辑的能力,可以主动的以字体颜色判断语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能丰富

3.3.2 常用模式

  • 正常模式
    • 以vim打开一个文档就会进入一般模式(默认模式)。可以使用各种快捷键
  • 插入模式/编辑模式
    • 在该模式下,程序员可以编辑程序
    • 一般输入i就可以进入
  • 命令行模式
    • 可以提供相关指令,完成读取、存盘、替换、离开vim、显示行号等的动作

3.3.3 快速入门

开发一个Hello.java程序

首先在命令行中输入vim Hello.java

image-20210915143603285

按i进入插入模式

编写完毕后按esc键进入命令行模式

输入:wq表示存储并退出

vi和vim模式的相互切换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xvg6yJ6S-1635161857650)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915143822202.png)]

:wq 保存并退出

:q 退出,已修改要退出则会报错

:q! 强制退出

3.3.4 vi和vim快捷键

  • 拷贝当前行 yy,粘贴为 p,拷贝当前行往下的5行 5yy,并粘贴

  • 删除当前行 dd,删除当前行往下的5行 5dd

  • 在文件中查找某个单词[命令行下/关键字,回车查找,输入n就是查找下一个]

  • 设置文件的行号,取消文件的行号[命令行下:set nu和:set nonu]

  • 编辑/etc/profile文件,使用快捷键到底文档的最末行[G]和最首行[gg]

  • 在一个文件中输入“hello”,然后撤销这个操作 u

  • 编辑/etc/profile文件,并将光标移动到20行 shift+g

    显示行号,输入20,shift+g

3.4 关机&重启命令

shutdown -h now 立刻进行关机

shutdown -h 1 “hello,1分钟后关机”

shutdown -r now 现在重启计算机

halt 直接使用,作用和shutdown一致

reboot 现在重启计算机

sync 把内存的数据同步到磁盘

注意

不管重启系统还是关机都会运行sync来保存当前状态

3.5 用户登录与注销

一般不用root用户登录,可以用普通用户登录后再使用su来切换成系统管理员

使用logout即可注销用户

注意

logout在图形运行级别界面无效,在运行级别3有效

3.6 用户管理

3.6.1 基本介绍

Linux操作系统下可能有多个用户,每个用户都至少属于一个组(root用户属于root组).

/home/:目录下有各个创建的用户对应的家目录,当用户登录时,会自动的进入自己的家目录中

3.6.2 添加用户

useradd 用户名

当创建用户成功后,会自动的创建和用户同名的家目录

也可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录

useradd是一个相对复杂一些的命令,而且它的自由度更高。如果只是运行useradd+username的话,它会创建一个三无用户,即:无用户家目录,无指定shell版本,无密码。

为了顺利创建一个用户,我们还需通过一些选项来完善它的参数。useradd命令常用的选项如下:

  • -c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
  • -d<登入目录>:指定用户登入时的启始目录;
  • -D:变更预设值;
  • -e<有效期限>:指定帐号的有效期限;
  • -f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
  • -g<群组>:指定用户所属的群组;
  • -G<群组>:指定用户所属的附加群组;
  • -m:自动建立用户的登入目录;
  • -M:不要自动建立用户的登入目录;
  • -n:取消建立以用户名称为名的群组;
  • -r:建立系统帐号;
  • -s:指定用户登入后所使用的shell;
  • -u:指定用户id。

对于我们普通用户而言,更常用的选项是以上标红的三个。而对于管理人员而言,则以上所有的选项都需要掌握。我们目前重点介绍以上标红的三个选项。

-d选项用于指定用户家目录,也就是用户登录时所进来的目录。比如:-d /home/alvin,就是指定用户的家目录是/home/alvin。通常-d选项与-m选项一起使用,-m选项的作用是,如果指定目录不存在时,则自动创建。

而**-s选项则是指定用户默认shell版本**。如果不设定的话,它的默认版本是/bin/sh。所以,我们使用useradd创建新用户时的经典用法如下:

sudo useradd alvin -m -d /home/alvin -s /bin/bash
通过这种方式用户可以成功创建,但还是没有密码。创建密码的方式依然使用passwd命令,在此不再赘述。

image-20210915153921955

3.6.3 指定/修改密码

passwd 用户名 指定用户密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQRrUQnd-1635161857653)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210915154148802.png)]

3.6.4 删除用户

userdel 用户名

删除用户保留家目录 userdel 用户名

删除用户及主目录 userdel -r 用户名

3.6.5 查询用户信息

id 用户名

当用户不存在时,返回无此用户

image-20210916113212258

3.6.6 切换用户

su - 用户名

image-20210916113505582

输入exit即可返回

低权限进高权限需要密码,高权限到低权限不需要

3.6.7 查看当前用户

whoami 即可查看

3.6.8 用户组

类似于角色,系统可以对有共性的用户进行统一的管理

3.6.8.1 增加组

groupadd 组名

如创建组名为元明清

image-20210916113853692

3.6.8.2 删除组

groupdel 组名

image-20210916113937876

3.6.8.3 增加用户时加上当前组

useradd -g 用户组 用户名

若无当前组,则会创建一个与当前用户同名的组

image-20210916114238734

3.6.8.4 修改用户的组

usermod -g 用户组 用户名

image-20210916114603836

3.6.9 用户和组的配置文件

因为Linux一切皆为文件,所以用户和组也要有配置文件

用户配置文件(用户信息):/etc/passwd

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

image-20210916115530991

组配置文件(组信息):/etc/group

​ 每行的含义:组名:口令:组标识号:组内用户列表

image-20210916115950657

口令配置文件(密码和登录信息,已加密):/etc/shadow

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

image-20210916115812956

所以每次增加一个用户,上述三个文件都会进行修改

3.7 实用指令

3.7.1 指定运行级别

共7个运行级别

  • 0:关机
  • 1:单用户,在找回丢失的密码时很有用
  • 2:多用户无网络服务
  • 3:多用户有网络级别,使用最多
  • 4:保留级别
  • 5:图形化界面
  • 6:重启,一直重启

系统的运行级别配置文件:/etc/inittab(已废弃)

常用运行级别是3和5,要修改默认的运行级别可以修改文件/etc/inittab的id:5:initdefault:这一行中的数字

命令:init[0123456]

如 init 3 进入命令行界面,此时需要重新登录 3到5需要进入root模式

image-20210917183633439

ubuntu与传统的不太一样,默认情况下是找不到/etc/inittab文件的,而且运行级别也有差别,具体分这样几个级别:

# 0 –关闭系统

# 1 –单用户模式

# 2~5 –完整的多用户模式

# 6 –重新启动

也就是说,默认情况下级别2、3、4、5都是一样的,同时系统的默认级别设定也不是在inittab文件中,而是写在/etc/init/rc- sysinit.conf文件中。打开此文件,可以找到下面一句:

env DEFAULT_RUNLEVEL=2

这表明系统当前默认是进入级别2。

如何找回root密码?

进入单用户模式,然后修改root密码,因为进入单用户模式,root不需要密码就可以登录

开机->在引导式输入回车键->看到一个界面输入 e->看到一个新的界面,选中第二行(编辑内核)再输入 e->再这行最后输入1.回车键->再次输入b,这时就会进入单用户模式

这时我们就都进入单用户模式,使用passwd指令来修改root密码

关于这部分的理解

必须在本机上才能使用,远程ssh不可以

3.7.2 帮助指令

3.7.2.1 介绍

当我们对某个指令不熟悉时,我们可以通过帮指令来了解指令的信息

3.7.2.2 man获得帮助信息

语法:man 命令或配置文件 功能描述,获得帮助信息

应用实例:

​ 查看ls的帮助信息

image-20210917201235526

3.7.2.3 help指令

语法:help 命令 功能描述:获得shell内置命令的帮助信息

应用实例:

​ 查看cd的帮助信息

image-20210917201427068

注:help ls不好使,因为ls不是内核命令,而help只能查看内核命令的帮助

3.7.3 文件目录类

3.7.3.1 pwd指令

语法:pwd 功能描述,显示当前工作目录的绝对路径

应用实例:

​ 查看当前工作的绝对路径

image-20210917205616411

3.7.3.2 ls指令

语法:ls 选项 目录或是文件

常用选项

  • -a 显示当前目录的所有文件和目录,包括隐藏的
  • -l 以列表形式显示信息

应用实例:

​ 查看当前目录的所有内容信息

image-20210917205807890

3.7.3.3 cd指令

语法:cd 参数 功能描述切换到指定目录

常用参数:

​ 绝对路径和相对路径

  • cd~/cd 回到自己的家目录
  • cd… 回到当前目录的上一级目录

应用实例:

​ 使用绝对路径切换到root目录 /root 即从根目录开始定位

image-20210917210659648

​ 使用相对路径切换到root目录 …/root 即从当前目录开始定位,需要知道当前的目录结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iON1A9GM-1635161857656)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210917210717153.png)]

​ 回到家目录

image-20210917210829247

​ 表示回到当前目录的上一级目录

image-20210917210856651

3.7.3.4 mkdir指令

mkdir用于创建目录

语法:mkdir 选项 要创建的目录

常用选项:

​ -p:创建多级目录

应用案例:

​ 创建一个目录 /home/dogimage-20210917211522932

​ 创建多级目录/home/animal/tiger,创建多级目录需要带上-p参数

image-20210917211618235

3.7.3.5 rmdir指令

rmdir可以删除空目录

语法:rmdir 选项 要删除的空目录

应用实例:

​ 删除/home/dog

image-20210917211922732

​ 删除/home/animal/tiger

image-20210917212428018

使用细节:

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

​ 提示:如果删除非空目录,则需要使用 rm -rf 要删除的目录

3.7.3.6 touch指令

touch创建空文件,可以一次性创建多个文件

语法:touch 文件名称

应用案例:

​ 创建一个空文件hello.txt

image-20210917212656479

3.7.3.7 cp指令[重点]

cp指令拷贝文件到指定目录

语法:cp 选项 source dest

常用选项:

​ -r 递归复制整个文件夹

应用案例:

​ 将/home/aaa.txt拷贝到/home/bbb目录下(相对路径可以直接写bbb/)

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBiJWn5E-1635161857660)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210917213252437.png)]

​ 递归复制整个文件夹

使用细节:

​ 强制覆盖不提示的方法:\cp ubuntu会直接覆盖

3.7.3.8 rm指令[重点]

rm指令移除文件或目录

语法:rm 选项 要删除的文件或目录

常用选项:

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

​ -f 强制删除不提示

应用实例

​ 删除/home/aaa.txt

​ 递归删除整个文件夹/home/bbb

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2e1XMiBo-1635161857662)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210917215402441.png)]

使用细节:

​ 强制删除不提示的方法 带上-f参数

3.7.3.9 mv指令

mv 移动文件与目录或重命名

语法:

​ mv oldNameFile newNameFile 重命名

​ mv /temp/moveFile /targetFolder 移动文件

应用实例

​ 将/home/aaa.txt文件重命名为pig.txt

​ 将/home/pig.txt文件移动到/root目录

image-20210917220726253

3.7.3.10 cat指令

cat查看文件内容,是以只读的方式打开

语法:cat 选项 要查看的文件

选项:

​ -n 显示行号

应用实例:

​ /ect/profile文件内容,并显示行号

使用细节:

​ cat只能浏览文件,而不能修改文件,为了浏览方便,一般会带上 管道命令 | more(分页显示)

3.7.3.11 more指令

more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键

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

操作说明:

image-20210918184537829

应用实例:

​ 采用more查看文件/etc/profile

3.7.3.12 less指令

less指令用来分屏查看文件内容,它的功能与more指令类似,但比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载后才显示,而是根据显示需要加载内容,对于显示大型文件具有更高的效率。

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

操作说明:

image-20210918184932828

应用实例:

​ 采用less查看一个大文件文件/opt/xxxxx

3.7.3.13 >指令和>>指令

输出重定向和>>追加

image-20210918192941944

语法:

  1. ls -l > 文件 列表中的内容写入文件a.txt中(覆盖写 )

  2. ls -al >> 文件 列表的内容追加到文件aa.txtx的末尾

  3. cat 文件1 > 文件2 将文件1的内容覆盖到文件2

  4. echo “内容” >> 文件

  5. image-20210918193338616
  6. aaa.txt

    image-20210918193406649 image-20210918193742749

应用实例:

​ 将/home目录下的文件列表写入到/home/info.txt

image-20210918193929159

​ 将当前的日历信息追加到/home/mycal文件中[提示cal]

image-20210918194244043

3.7.3.14 echo指令

输出内容到控制台

语法:echo 选项 输出内容

应用案例:

​ 使用echo指令输出环境变量($PATH)

image-20210919155357435

​ 使用echo指令输出hello world

image-20210919155435676

3.7.3.15 head指令

用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容

语法:

​ head 文件 查看文件头10行内容

​ head -n 5 文件 查看文件头5行内容,5可以是任意行数

应用实例:

​ 查看/etc/profile的前面5行代码

image-20210919155514891

3.7.3.16 tail指令

用于输出文件中尾部的内容,默认情况下显示文件的后10行内容

语法:

​ tail 文件 查看文件后10行内容

​ tail -n 5 文件 查看文件后5行内容,5可以是任意行数

​ tail -f 文件 实时追踪该文档的实时更新,工作中经常使用

应用实例:

​ 查看/etc/profile最后5行的代码

image-20210919155544690

​ 实时监控mydate.txt,看看到文件有变化时是否可以看到实时的追加日期

3.7.3.17 ln指令

软链接也叫符号链接,类似于 Windows 中的快捷方式,主要存放了链接其他文件的路径

语法:

​ ln -s 原文件或目录 软链接名 给原文件创建一个软链接

应用实例:

​ 在/home目录下创建一个软链接 linkToRoot,链接到/root目录

image-20210919160953764

image-20210919161112756

​ 删除软链接linkToRoot

​ rm -rd linkToRoot 如果加上/的话则会删除root文件夹,不加则只删除软链接

细节说明:

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

3.7.3.18 history指令

查看已执行过的历史指令,也可以执行历史指令

语法:history 查看已经执行过的历史指令

应用实例:

​ 显示所有的历史指令

image-20210919163228450

​ 显示最近使用过的10个指令

image-20210919163314673

​ 执行历史指令为5的指令 !5即可执行第5个指令

image-20210919163446298

注意:/root文件夹误删除执行以下命令cp -a /etc/skel/.[!.] /root*

其中/etc/skel/目录是用来存放新用户配置文件的目录,当我们添加新用户的时候,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。
这个目录下的所有文件都是隐藏文件(以.点开头的文件)。
通过修改、添加、删除/etc/skel目录下的文件,我们可为新创建的用户提供统一的、标准的、初始化用户环境。所以当/root目录被误删除,可以从/etc/skel中复制一份文件到/root下。
由于是刚部署完成的生产环境,相关服务还未有数据进入,以此将服务器进行重启,重启之后恢复完成。若是在正式环境中,我们要考虑服务器能否重启,若不能,则将/etc/skel中的文件复制到/root下即可。

3.7.4 时间日期类

3.7.4.1 date指令

3.7.4.1.1 显示当前日期

语法:

​ date 显示当前时间

​ date +%Y 显示当前年份

​ date +%m 显示当前月份

​ date +%d 显示当前是哪一天

​ date +“%Y-%m-%d %H:%M:%S” 显示年月日时分秒

应用实例:

​ 显示当前时间信息

​ 显示当前时间年月日

​ 显示当前时间年月日时分秒

image-20210919164031962

注:中间的连接符是随意的

3.7.4.1.2 设置日期

语法:

​ data -s 字符串时间

应用实例:

​ 设置当前系统时间,比如设置成2020-11-11 11:22:22

3.7.4.2 cal指令

查看日历信息

语法

​ cal 选项 不加选项就显示本月日历

应用实例

​ 显示当前日历

​ 显示2022年日历

image-20210919164749442

3.7.5 搜索查找类

3.7.5.1 find指令

find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端,可以使用通配符*

语法:find 搜索范围 选项

选项说明:

选项 功能
-name<查询方式> 按照指定的文件名查找模式查找文件
-user<用户名> 查找属于指定用户名的所有文件
-size<文件大小> 按照指定的文件大型查找文件

应用实例:

​ 按文件名:根据名称查找/home目录下的info.txt文件

image-20210919165627890

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

image-20210919165822721

​ 查找整个Linux系统下大于20m的文件(+n大于 -n小于 n等于,n表示文件大小)

image-20210919165926957

3.7.5.2 locate指令

可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现了快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻

语法: locate 搜索文件

说明:

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

应用实例:

​ 使用locate指令定位info.txt

image-20210920104523415

3.7.5.3 grep指令和管道符号 |

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

语法:grep 选项 查找内容 源文件

常用选项:

选项 功能
-n 显示匹配行及行号
-i 忽略字母大小写

应用实例:

​ 在info.txt文件夹中,查找yes所在行,并显示行号

image-20210920105808226

3.7.6 压缩和解压类

3.7.6.1 gzip/gunzip指令

gzip用于压缩文件,gunzip用于解压

其在压缩完后将会自动删除源文件

语法:

​ gzip 文件 压缩文件,只能将文件压缩为*.gz文件

​ gunzip 文件.gz 解压缩文件命令

应用实例:

​ 将/home下的info.txt进行压缩

image-20210921102155200

​ 对info.txt.gz进行解压缩

image-20210921102309886

细节说明:

​ 当我们使用gzip对源文件进行压缩后,不会保留源文件

3.7.6.2 zip/unzip指令

zip用于压缩文件,unzip用于解压,在项目打包中经常使用

语法:

​ zip 选项 XXX.zip 将要压缩的内容 压缩文件和目录的命令

​ unzip 选项 XXX.zip 解压缩文件

zip常用选项:

​ -r:递归压缩,即压缩目录

unzip常用选项:

​ -d 目录:指定解压后文件存放目录

应用实例:

​ 将/home下的所有文件都进行压缩为mypackage.zip

image-20210921103153398

​ 将mypackage.zip解压到/opt/tmp目录下

unzip -d /opt/tmp mypackage.zip

3.7.6.3 tar指令

tar指令是打包指令,最后打包后的文件是.tar.gz的文件

压缩时选项直接-zcvf

解压缩时-zxvf

语法:

​ tar 选项 XXX.tar.gz 打包的内容 打包目录,压缩后的文件格式.tar.gz

选项:

选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar文件

应用实例:

​ 压缩多个文件,将/home/a1.txt和/home/a2.txt压缩成a.tar.gz

image-20210921104225275

​ 将/home的文件夹压缩成myhome.tar.gz

image-20210921104616344

​ 将a.tar.gz解压到当前目录

image-20210921104918188

​ 将myhome.tar.gz解压到/opt/tmp2目录下

​ tar -zxvf myhome.tar.gz -C /opt/

此处-C表示切换到指定的目录

3.8 组管理和权限管理

3.8.1 Linux组的基本介绍

在Liunx中每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者、所有组、其他组的概念

文件有如下概念:

  • 所有者 默认为文件创建人,可以通过指令修改
  • 所在组
  • 其他组

改变用户所在的组 usermod -g 组名 用户名

3.8.2 文件/目录所有者

一般为文件的创建者,谁创建了该文件,就自然的称为该文件所有者

3.8.2.1 查看文件的所有者

  1. 指令:ls -ahl
  2. 应用实例:创建一个组police,再创建一个用户tom,然后使用tom来创建一个文件
image-20210922141045243 image-20210922141309721

3.8.2.2 修改文件所有者

  1. 指令:chown 用户名 文件名

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

    image-20210922141644152

3.8.3 文件/目录所在组

当某一个用户创建了一个文件后,默认这个文件所在组介绍该用户所在组

3.8.3.1 查看文件/目录所在组

指令:ls -ahl

3.8.3.2 修改文件所在组

指令:chgrp 组名 文件名

应用实例:

​ 使用root用户创建文件,看看这个文件属于哪个组,然后将这个文件修改到yuanzaizhichi所在组

image-20210922142558838

3.8.4 其他组

除了文件所有者和所有组的用户外,其他的其他用户都是文件的其他组

3.8.5 权限的基本介绍

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

image-20210922145159070
  • 0-9位说明
    • 第0位表示文件类型(d, -, l, c, b)
    • 第1~3位确认所有者(该文件的所有者)拥有该文件的权限
    • 第4-6位确认所属组(同用户组的)拥有该文件的权限
    • 第7-9位确定其他用户拥有该文件的权限

3.8.5.1 rwx权限

3.8.5.1.1 rwx作用到文件
  1. r代表可读:可以读取查看
  2. w代表可写:可以修改,但不代表可以删除该文件,删除文件的前提条件是对该文件所在目录由写权限,才能删除文件
  3. x代表可执行:可以被执行
3.8.5.1.2 rwx作用到目录
  1. r代表可读:可以读取,ls查看目录内容
  2. w代表可写:可以修改,目录内创建+删除+重命名目录
  3. x代表可执行:可以进入该目录
3.8.5.1.3 实际案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FJX351fL-1635161857665)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210922150426748.png)]

3.8.5.2 权限的操作指令

3.8.5.2.1 修改权限 -chmod

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

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

+表示添加,-表示删除,=表示等于

u:所有者 g:所有组 o:其他人 a:所有人

  1. chmod u=rwx,g=rx,o=x 文件目录名
  2. chmod o+w 文件目录名
  3. chmod a-x 文件目录名

案例演示

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

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

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

    image-20210922152442000

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

r=4 w=2 x=1 rwx=4+2+1=7

chmod u=rwx,g=rx,o=x 文件目录名 = chmod 751 文件目录名

案例演示:

​ 将abc.txt文件的权限修改成rwxr-xr-x,使用数字的方式实现

image-20210922153101885
3.8.5.2.2 修改文件所有者-chown

chown newowner file 改变文件的所有者

chown newowner:newgroup file 改变文件的所有者和所有组

-R 如果是目录,则使其下所有的子文件或目录递归生效

案例演示:

​ 将abc.txt文件的所有者修改为tom

​ 将/kkk目录下所有文件和目录的所有者都修改为tom

image-20210922154039035
3.8.5.2.3 修改文件所在组 -chgrp

chgrp newgroup file 改变文件所有组

案例演示:

​ xxx.txt所在组修改为root

​ kkk文件夹下所有组修改为root

image-20210922155235387

3.8.5.3 最佳实践-警察与土匪游戏

组:police bandit

用户:

​ jack、jerry 警察

​ xh、xq 土匪

  1. 创建组

  2. 创建用户

  3. jack创建一个文件,自己可以读写,本组人可以读,其他组人没有权限

    image-20210923163249647
  4. jack修改该文件,让其他组人可以读,本族人可以读写

    image-20210923163405371
  5. xh投靠警察,看看是否可以读写

    image-20210923163621764 image-20210923163708463

1、2点较简单就不展示了,有啥就看用户管理那一章

3.8.5.4 课堂练习

image-20210923164909885
groupadd god
groupadd monster

useradd tangseng -m -d /home/tangseng -s /bin/bash -g god
useradd wukong -m -d /home/wukong -s /bin/bash -g monster
useradd bajie -m -d /home/bajie -s /bin/bash -g monster
useradd shaseng -m -d /home/shaseng -s /bin/bash -g god

passwd tangseng
passwd wukong
passwd bajie
passwd shaseng

su - wukong
vim monkey.java

su - root
chmod 660 monkey.java

su - bajie
cd /home/wukong
vim monkey.java

usermod -g monster shaseng

su - shaseng
cd /home/wukong
vim monkey.java
image-20210923165854235
useradd mycentos -m -d /home/mycentos -s /bin/bash
passwd mycentos
su - mycentos

mkdir -p /home/mycentos/test/t11/t1
cd /home/mycentos/test/t11/t1

touch aa
vim aa

chmod u=rwx aa
date

rm -rf /home/mycentos/test/t11/t1
userdel -r mycentos
init 5

reboot
init 0
shutdown -h now

3.9 crond 任务调度

3.9.1 原理

在Linux系统中,存在定时调度我们的脚本或代码的机制叫做crontab,其将在某个规定时间段对代码进行调用

3.9.2 概述

任务调度:是指系统在某个实践执行的特定命令或程序

任务调度分类:

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

3.9.3 语法

​ crontab 选项

3.9.3.1 常用选项

选项 作用
-e 编辑crontab定时任务
-l 查询crontab任务
-r 删除当前用户的所有crontab任务

3.9.4 快速入门

设置任务调度文件:/etc/crontab

设置个人任务调度:执行crontab -e命令

接着输入任务到调度文件

如:

*/1 * * * * ls -l /etc/ >> /tmp/to.txt

意思是每个校史的每分钟执行ls -l /etc/ > /tmp/to.txt命令

注意

  1. 如果只是简单的任务,可以不写脚本,直接在crontab中加入任务即可
  2. 对于比较复杂的任务,需要些脚本(Shell脚本)

3.9.4.1 参数细节说明

  • 5个占位符的说明

    项目 含义 范围
    第一个 * 一小时当中的第几分钟 0-59
    第二个 * 一天当中的第几小时 0-23
    第三个 * 一个月当中的第几天 1-31
    第四个 * 一年当中的第几月 1-12
    第五个 * 一周当中的星期几 0-7(0和7都代表星期日)
  • 特殊符号的说明

    特殊符号 含义
    * 代表任何时间。比如第一个*就代表一小时中每分钟都执行一次
    代表不连续的时间。如“0 8,12,16 * * * 命令”,就代表在每一天的8点,12点,16点准时执行一次命令
    - 代表连续的时间范围。比如“0 5 * * 1-6 命令”,表示在周一到周六的5点执行命令
    */n 代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔10分钟就执行一次命令
  • crond相关指令

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

3.9.5 应用案例

每隔1分钟就将当前的日期信息,追加到/tmp/mydate文件中

  1. 先编写一个文件,/home/mytask1.sh

    date >> /tmp/mydate

  2. 给mytask1.sh一个可执行权限

  3. crontab -e

  4. */1 * * * * /home/mytask1.sh

  5. 成功

    image-20210924153353074 image-20210924153444939

每隔一分钟。将当前日期和日历信息都追加到/home/mycal中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lq369bT-1635161857667)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210924153945580.png)]

每天凌晨2点将mysql数据库文件testdb,备份到文件中

​ /user/local/mysql/bin/mysqldump -u root -p root testdb > /tmp/mydb.bak

3.10 Linux 磁盘分区、挂载

3.10.1 分区基础知识

3.10.1.1 分区的方式

  1. mbr分区
    • 最多支持四个主分区
    • 系统只能安装在主分区
    • 扩展分区需要占一个主分区
    • MBR最大只支持2TB,但拥有最好的兼容性
  2. gpt分区
    • 支持无限多个分区(但操作系统可能限制,比如windows下最多128个分区)
    • 最大支持18EB的大容量
    • window7 64位以后支持gtp

3.10.1.2 windows下的磁盘分区

image-20210924155518274

Windows使用GPT引导,所以所有盘都是主分区

3.10.2 Linux分区

3.10.2.1 原理介绍

将分区挂载到Linux的文件系统上,将硬盘分区映射为文件目录结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQacqgeg-1635161857669)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210925105231026.png)]

3.10.2.2 硬盘标识

硬盘说明

  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硬盘的表示方法一样

分区和挂载情况查看命令

lsblk -f (不加-f就可以看到硬盘大小)

image-20210925111023081

可见sda1挂载到了/boot/efi下,sr0代表光驱

3.10.3 挂载的经典案例

需求是给我们的Linux系统,增加一块新的硬盘,并且挂载到/home/newdisk下

如何增加一块硬盘

  1. 虚拟机添加硬盘

    在虚拟机设置中添加即可,可发现已经添加成功

    image-20210925112923772
  2. 分区

    指令为:fdisk /dev/sdb

    image-20210925113110488

    可以发现-n参数可以添加分区

    image-20210925113238368

    此处输入p则选择主分区,之后使用默认值即可

    image-20210925113349113

    w则表示将分区信息写入硬盘并退出,输入w即可,此时分区已经分好了,但其没有UUID和文件类型,需要进行格式化,才能更新该内容

    image-20210925113514778
  3. 格式化

    mkfs -t ext4 /dev/sdb1

    该指令会将sdb1的文件类型格式化为ext4,由图可见格式化成功

    image-20210925113904082

    lsblk -f后可见该分区格式化成功

    image-20210925114025758
  4. 挂载

    先创建一个目录/home/newdisk

    挂载指令:mount /dev/sdb1 /home/newdisk 可见挂载已成功image-20210925114330851

    且newdisk中存在文件lost+found

    image-20210925114434989
  5. 设置可以自动挂载

    上述挂载在重启后就会消失,是临时挂载

    自动挂载后便每次重启机器后,仍然可以挂载到newdisk上

    • 首先编辑/etc/fstab文件(vim /etc/fstab)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsGkmXvp-1635161857671)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210925115343716.png)]

    • 添加完成后,输入mount -a开始生效

    • 可见自动挂载成功

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BT7344G8-1635161857672)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210925115600609.png)]

卸载磁盘

umount /dev/sdb1

可能出现的问题:device is busy

解决方法:返回到家目录对其进行卸载

3.10.4 磁盘情况查询

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

语法:df -h

应用实例:

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

image-20210926210727284

另一种:df -l

image-20210926210838100

3.10.4.2 查询指定目录的磁盘占用情况

语法:

​ du -h /目录

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

选项:

选项 作用
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
-max-depth=1 子目录深度,查到子目录第一级还是多少
-c 列出明细的同时,增加汇总值

应用实例:

​ 查询/opt目录的磁盘占用情况,深度为1

image-20210926212247054 image-20210926212311075

3.10.4.3 磁盘情况-工作实用指令

  1. 统计/home文件夹下的文件的个数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWcBVF2K-1635161857674)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210926213739125.png)]

  2. 统计/home文件夹下的目录的个数

    image-20210926213934706
  3. 统计/home文件夹下文件的个数,包括子文件夹里的

    image-20210926214151190
  4. 统计文件夹下目录的个数,包括子文件夹里的

    image-20210926214044614

    -r是逆序,-R是递归显示子目录

  5. 以树状显示目录结构

    • 使用apt install tree安装tree指令,可视化文件目录
    • image-20210926214519792

3.11 网络配置

3.11.1 Linux网络配置原理图

目前我们采用的网络配置是NAT模式

Linux中的ip为192.168.18.128,而Windows中VMnet8虚拟网卡的ip为192.168.18.1,所以可见二者构成了一个网络

Window上还有一个真实网卡(无线)为172.22.103.216

在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。VMware Network Adapter VMnet8网卡是为了实现主机与虚拟机之间的通信。

可见NAT模式下主机更像是虚拟机们的"路由器",通过VMnet8虚拟网卡为虚拟机分发地址。所以虚拟机和主机不在同一网段下,可以理解为主机是虚拟机的"上级",这也就是为什么桥接模式没有VMnet0这个虚拟网卡,因为桥接模式下的虚拟机和主机是"平等"的,共用同一个路由器呀。

img

3.11.2 查看网络IP和网关

3.11.2.1 查看虚拟网络编辑器

image-20210926220724582

3.11.2.2 查看网关

image-20210926221125453

3.11.2.3 查看Windows环境中的VMnet8的配置

  1. 使用ipconfig查看

  2. 在设置中的网络中的更改适配器即可

    image-20210926221520942

3.11.3 Linux网络环境配置

3.11.3.1 自动获取

登录后,通过界面来设置自动获取IP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5L0aYtLO-1635161857678)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210927163731713.png)]

缺点:Linux启动后会自动获取IP地址 每次自动获取的地址可能都不一样 | 不适用于服务器,因为服务器IP需要固定

3.11.3.2 指定固定的IP

直接修改配置文件的IP,并可以连接到外网,编辑

vim /etc/network/interfaces文件即可

文件重点配置

  • ONBOOT=yes
  • BOOTPROTO=static 以静态方式获取IP
  • IPADDR=xxx.xxx.xxx.xxx 指定IP
  • GATWAY=xxx.xxx.xxx.xxx 网关
  • DNS1=xxx.xxx.xxx.xxx DNS需要与网关一致

修改后需要重启网络服务 service network restart/reboot

3.12 进程管理

3.12.1 进程基本介绍

  1. 在Linux中,每个执行的**程序(代码)**都称为一个进程。每个进程都分配一个ID号
  2. 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程
  3. 每个进程都可能以两种方式存在。前台和后台,所谓前台进程就是用户目前屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方法执行
  4. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

3.12.2 显示系统执行的进程

ps指令可以用来查看目前系统中有哪些进程正在执行,以及它们的执行情况,可以不加任何参数。一般来说使用的选项是-aux

信息选项:

选项 说明
PID 进程识别号
TTY 终端机号
TIME 此进程所消耗的CPU时间
CMD 正在执行的命令或进程名

语法:

ps -a 显示当前终端的所有进程信息

ps -u 以用户的格式显示所有进程信息

ps -x 显示后台进程运行的参数

应用实例:

ps -aux | more

image-20210927171639114

详解:

  1. 指令:ps -aux | grep xxx
  2. 指令说明:
    • System V 展示风格
    • USER:用户名称
    • PID:进程号
    • %CPU:进程占CPU的百分比
    • %MEM:进程占物理内存的百分比
    • VSZ:进程占用的虚拟内存大小(单位:KB)
    • RSS:进程占用的物理内存大小(单位:KB)
    • TT:终端名称,缩写
    • STAT:进程状态,其中S-睡眠,s-表示该进程时会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等
    • STARTED:进程启动时间
    • TIME:CPU时间,即进程使用CPU的时间
    • COMMAND:启动进程所用的命令和参数,如果过长则会被截断显示

查看父进程:

ps -ef | more(使用全格式查看进程)

image-20210927173300955

3.12.3 终止进程 kill 和 killall

若是某个进程执行到一半时需要停止,或者已经消耗了很大的系统资源时,此时可以考虑停止该进程

语法:

kill 选项 进程号 通过进程号杀死进程

killall 进程名称 通过进程名称杀死进程,也支持通配符

常用选项:

-9 表示强迫进程立即停止

应用实践:

踢掉某个非法登录的用户

  • kill 用户进程id号

终止远程登录进程sshd从,在适当的时候重启

  • kill sshdId号
  • service sshd restart

终止多个gedit编辑器

  • killall gedit

强制杀掉一个终端(/bin/bash 就是一个终端)

  • kill -9 进程id

3.12.4 查看进程数 pstree

语法:pstree 选项,可以直观的来看进程信息

选项:

-p 显示进程的PID

-u 显示进程的所属用户

二者同时使用只显示其中一个

应用实例:

使用pstree显示进程信息

image-20210928111208335

3.13 服务管理

3.13.1 介绍

服务(Service)本质就是进程,其运行在后台,通常都会监听某个端口,等待其他程序的请求,比如 sshd 防火墙、mysql等,因此我们又称之为守护进程

3.13.2 service管理指令

service 服务名 start | stop | restart | reload | status

systemctl

使用案例

查看当前放火墙的状况,关闭放火墙和重启防火墙(Ubuntu的防火墙为ufw,CentOs7为firewall)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djBgLZCK-1635161857680)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210928112832245.png)]

细节讨论

  1. 关闭或启动防火墙后,立即生效
    • 通过telnet指令检查linux某个端口是否可以使用
    • telnet ip 端口
    • 在DOS窗口中使用
  2. 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
  3. 如果希望设置某个服务自启动或关闭永久生效,要使用chkconfig指令

3.13.3 查看服务名

  • 使用setup -> 系统服务 就可以看到(centos特色,Ubuntu没有)
  • /etc/init.d/服务名称
    • 有*号的服务表示自启动
    • image-20210928113612584

3.13.4 运行级别

查看或修改默认级别:vi /etc/inittab

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

开机流程说明

每个指令在各个运行级别都可以设置是否自启动,如你可以将一个指令在级别3设置为自启动,而级别5不设置自启动

开机
BIOS
boot目录
init进程
运行级别
运行级别对应的服务

3.13.5 chkconfig指令

通过chkconfig指令可以给各个运行级别设置自启动/关闭

语法:

  • 查看服务 chkconfig –list | grep xxx (此处需要两个-)
  • chkconfig 服务名 –list(两个-)
  • chkconfig –level 5 服务名 on/off

在Ubuntu中已经改成了systemctl指令,如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIWBJhwE-1635161857682)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20210928115653156.png)]

使用systemctl enable 进程名 即可设置是否自启动

3.13.6 进程监控

3.13.6.1 动态监控进程

top指令类似于ps,它们都用来显示正在执行的进程,其最大不同在于top可以在执行过程中更新正在执行的进程

语法:top 选项

选项说明

选项 功能
-d 秒数 指定top指令每隔几秒更新,默认是3秒
-i 使top不显示任何显示或僵死进程
-p 通过指定监控进程来仅仅监控某个进程的状态

交互操作说明

操作 说明
P 以CPU使用率排序,默认就是该项
M 以内存的使用率排序
N 以PID排序
q 退出top
u 显示指定用户的进程
k 杀死指定的进程
image-20210929150127137

应用实例

监控特定用户

  • 输入top命令,查看执行的进程
  • 输入u回车,在输入用户名即可

终止指定进程

  • 输入top查看执行的进程
  • 输入k回车,在输入要结束的进程ID

指定系统状态更新的时间为10秒

  • top -d 10

3.13.6.2 监控网络状态

语法:netstat 选项

选项说明:

选项 说明
-an 按一定顺序输出
-p 显示哪个进程正在调用

可以监控哪个端口正在监听,以及使用的网络层协议是什么

应用案例:

查看所有的服务

image-20210929151016544

查看服务名为sshd的服务的信息(sshd支持IPv4和IPv6的远程连接)

image-20210929151108745

使用ping可以检测远程主机是否正常、两台主机之间介质是否为断,网线是否脱落或网卡故障

3.14 RPM和YUM包

3.14.1 RPM包

3.14.1.1 介绍

一种用于互联网下载包的打包和安装工具在,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM使RedHat Package Manager(Redhat软件包管理工具)的缩写,类似于Windows的setup.exe,这一文件格式名称虽有Redhat的标识但理论上通用。

3.14.1.2 RPM包的简单查询指令

查询已安装的RPM列表 rpm -qa | grep xxx

3.14.1.3 RPM包名基本格式

一个RPM包名:firefox -45.0.1-1.el6.centos.x86_64.rpm

名称:firefox

版本号:45.0.1-1

适用操作系统:el6.centos.x86_64

​ 表示centos6.x的64位系统

​ 如果是i686、i386表示32位系统,noarch表示通用

3.14.1.4 RPM包的其他查询指令

指令 说明 指令
rpm -qa 查询所安装的所有rpm安装包 rpm -qa | more rpm -qa | grep X[rpm -qa | grep firefox]
rpm -q 软件包名 查询软件包是否安装 rpm -q firefox
rpm -qi 软件包名 查询软件包信息 rpm -qi file
rpm -ql 软件包名 查询软件包中的文件 rpm -ql firefox
rpm -qfv文件全路径名 查询文件所属的软件包 rpm -qf /etc/passwd rpm -qf /root/install.log

3.14.1.5 卸载RPM包

语法:

​ rpm -e RPM包的名称

应用案例:

​ 卸载Firefox安装包

细节讨论

  • 如果其它软件包依赖于您要卸载的软件包,卸载时就会产生错误信息
  • 如果我们就是要删除,则添加参数 -nodeps ,可以强制删除,但可能会使依赖软件无法运行

3.14.1.6 安装RPM包

语法:

​ rpm -ivh RPM包全路径名称

参数说明

  • i 安装
  • v 提示
  • h 进度条

3.14.2 YUM包

3.14.2.1 介绍

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

3.14.2.2 YUM的基本指令

  • 查询yum服务器是否有需要安装的软件
    • yum list | grep xx软件列表
  • 安装指定的YUM包
    • yum install xxx 下载安装

第四章 Linux的JavaEE环境搭建

4.1 概述

为了JavaEE环境正常使用,我们需要安装如下环境

  • JDK
  • Mysql
  • Tomcat
  • eclipse(我用VSCode)

4.2 安装JDK

注意:

​ 传输文件失败时需要修改文件夹权限为读写可执行

​ javac用来编译java程序生成class文件

​ java用来使class文件运行

安装步骤:

  • 先将软件通过xftp5上传到/opt下
  • 解压缩到/opt
  • 配置环境变量的配置文件 vim /etc/profile
    • JAVA_HOME=/opt/jdk1.7.0_79
    • PATH=/opt/jdk1.7.0_79/bin:$PATH
    • export JAVA_HOME PATH
    • 上面三条写到配置文件中
  • 配置完成后需要注销用户,环境变量才能生效
    • 如果在命令行下,直接logout
    • 如果在GUI下,需要重新登录
image-20211004114915897

4.3 安装Tomcat

步骤:

  • 解压缩到/opt
  • 启动tomcat ./startup.sh
    • 先进入到 tomcat 的bin目录
    • 使用Linux本地可以访问但Windows不行(如果开放了端口就可以)
  • 开放端口 vim /etc/sysconfig/iptables(ubuntu自动开放,外网可以自动访问)

测试是否安装成功

​ 在Windows下访问 http://linuxip:8080

image-20211004120014512

4.4 安装Mysql数据库

安装Mysql8.0版本时报错没有libaio.so.1 解决方法:

  • ​ apt-get install libaio1即可

步骤:

  • 下载安装包,并使用Xftp发送文件

  • 解压

    • tar -xvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz
      
    • 可以修改默认文件夹名称

      • mv mysql-8.0.25-linux-glibc2.12-x86_64 /home/mysql-8.0.25
        #详解: mv 当前文件名称 修改的文件夹名称
        
  • 创建数据目录

    • # 1.创建文件夹
      
      mkdir -p /data/mysqldata/
      #2 创建数据库用户 后边文件配置及初始化会用到, 如果你自己有其他用户也可以不创建新的
      	#2.1创建用户组
      	groupadd mysql
      	#2.2创建用户
      	useradd -r -g mysql mysql
      #赋权限
      
      2. chown mysql:mysql -R /data/mysqldata #chown 用户名:用户组 -R /data/mysqldata
      3. chmod 750 /data/mysqldata/ -R
      
  • 配置环境

    • vim /etc/profile 
      #如果你的系统不支持vim命令 使用下边这个
      vi /etc/profile
      #编辑,在文档最后一行 添加下边代码
      export PATH=$PATH:你的MySQL解压路径/mysql-8.0.25/bin:你的MySQL解压路径/mysql-8.0.25/lib
      
  • 编辑my.cnf

    • #1. 编辑my.cnf文件
      vim /etc/my.cnf #或者 vi /etc/my.cnf 
      
      #2. 按insert 进入编辑模式 添加以下脚本
      [mysql]
      # 客户端默认字符集
      default-character-set=utf8mb4
      [client]
      port=3306
      socket=/var/lib/mysql/mysql.sock
      [mysqld]
      port=3306
      server-id=3306
      user=mysql
      datadir=/var/lib/mysql
      socket=/var/lib/mysql/mysql.sock
      # 设置mysql的安装目录
      basedir=/home/mysql-8.0.25 #你自己的安装路径
      # 设置mysql数据库的数据的存放目录
      datadir=/data/mysqldata/mysql  #你自己创建的数据库文件存放路径
      log-bin=/data/mysqldata/mysql/mysql-bin
      innodb_data_home_dir=/data/mysqldata/mysql
      innodb_log_group_home_dir=/data/mysqldata/mysql
      character-set-server=utf8mb4
      lower_case_table_names=1
      autocommit=1
      # Disabling symbolic-links is recommended to prevent assorted security risks
      symbolic-links=0
      # Settings user and group are ignored when systemd is used.
      # If you need to run mysqld under a different user or group,
      # customize your systemd unit file for mariadb according to the
      # instructions in http://fedoraproject.org/wiki/Systemd
      
      [mysqld_safe]
      #设置mysql数据库的日志及进程数据的存放目录
      log-error=/data/mysqldata/mysql/mysql.log
      pid-file=/data/mysqldata/mysql/mysql.pid
      
  • 初始化Mysql

    • cd /home/mysql-8.0.25/bin/
      ./mysqld --defaults-file=/etc/my.cnf --basedir=/home/mysql-8.0.25/ --datadir=/data/mysqldata/mysql --user=mysql --initialize
         #参数详解
         --defaults-file=/etc/my.cnf 指定配置文件(一定要放在最前面,至少 --initialize 前面)
         --user=mysql 指定用户(很关键)
         --basedir=/home/mysql-8.0.25/ 指定安装目录
         --datadir=/data/mysqldata/mysql/ 指定初始化数据目录
      
    • 初始化结束后会生成一个临时密码:g(ft.riNp2qr

      • image-20211004155213501
      • g(ft.riNp2qr
  • 启动Mysql

    • # 1.复制 mysql.server 文件
      cp /home/mysql-8.0.25/support-files/mysql.server /etc/init.d/mysql
      cp /home/mysql-8.0.25/support-files/mysql.server /etc/init.d/mysqld
      # 2.赋予权限
      chown 777 /etc/my.cnf
      chmod +x /etc/init.d/mysql
      chmod +x /etc/init.d/mysqld
      # 3.检查一下/var/lib/mysql是否存在,否进行创建
      mkdir /var/lib/mysql #目录和my.cnf保持一致
      # 4.赋予权限
      chown -R mysql:mysql /var/lib/mysql/ #目录和my.cnf保持一致
      # 5.启动数据库
      service mysql start #或者 systemctl mysql start 
      

Ubuntu安装方式

  • sudo apt-get update  #更新源
    sudo apt-get install mysql-server #安装
    

第五章 Linux的Shell编程

5.1 为啥要学Shell编程

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

5.2 什么是Shell

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至编写一些程序

外部应用程序
Shell命令解释器
内核
硬件

5.3 Shell脚本的执行方式

5.3.1 脚本格式要求

  • 脚本要以#!/bin/bash开头
  • 脚本需要有可执行权限

5.3.2 编写第一个Shell脚本

  • 需求说明

    创建一个Shell脚本,输出Hello World!

5.3.3 脚本的常用执行方法

  • 方式一(输入脚本的绝对路径或相对路径)
    • 首先要赋予脚本的+x权限
    • 执行脚本
  • 方式2(sh+脚本)
    • 不用赋予脚本+x权限,直接执行即可,其跳过执行权限进行运行
image-20211005105102997

5.4 Shell的变量

5.4.1 Shell的变量的介绍

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

  2. 系统变量:$HOME $PWD $SHELL $USER等

    • echo $HOME
  3. 显示当前Shell中所有的变量:set

    image-20211005110559872

5.4.2 Shell变量的定义

5.4.2.1 基本语法

​ 定义变量:变量=值

​ 撤销变量:unset 变量

​ 声明静态变量:readonly变量

​ 注意:变量和静态变量都占用内存,只是存放地方不同

5.4.2.2 快速入门

  • 定义变量A

  • 撤销变量A

  • 声明静态的变量B=2,不能unset

    image-20211005111020785
  • 可把变量提升为全局环境变量,可供其他Shell程序使用

5.4.2.3 定义变量的规则

  • 变量名称可以由字母、数字和下划线组成,但不能以数字开头
  • 等号两侧不能有空格
  • 变量名称一般习惯为大写

5.4.2.4 将命令的返回值赋给变量

  • A=`ls -la`
    

    反引号,运行里面的命令,并把结果返回给变量A

  • A=$(ls -la)
    

    等价于反引号

  • image-20211005112109089

5.4.3 设置环境变量

5.4.3.1 语法

  • export 变量名=变量值
  • source 配置文件
  • echo $变量名

5.4.3.2 快速入门

​ 在/etc/profile文件中定义TOMCAT_HOME环境变量

​ 查看环境变量TOMCAT_HOME的值

​ 在另一个shell程序中使用TOMCAT_HOME

注意:在输出环境变量前,需要让其生效 source /etc/profile

注释

  • 单行注释:#
  • 多行注释::<

5.4.4 位置参数变量

5.4.4.1 介绍

​ 当我们执行一个Shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量

​ 如:./myShell.sh 100 200,这就是一个执行Shell的命令行,可以在myShell脚本中获取到参数信息

5.4.4.2 基本语法

语法 介绍
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号表示,如${10}
$* (这个变量表示命令行中的所有参数,$*把所有的参数都看成一个整体
$@ 这个变量也代表命令行中的所有参数,不过其将每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

*当$@和$不被双引号包围时,它们之间没有任何区别,都将参数区别对待

5.4.4.3 应用实例

​ 编写一个Shell脚本 positionPara.sh,在脚本中获取到命令行的各个参数信息‘

​ 即脚本可以通过命令行传参(可以从命令行获取参数),0号参数为命令本身,而1号参数则为传入的第一个参数

#!/bin/bash
  
#获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"

#获取到参数个数
echo "$#"
image-20211005124743511

5.4.5 预定义变量

5.4.5.1 基本介绍

Shell设计者已经定义好的变量,可以直接在Shell脚本中使用

5.4.5.2 基本语法

语法 介绍
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
$? 最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体值由程序决定),则证明上一个命令执行不正确

5.4.5.3 应用实例

#!/bin/bash

#输出预定义变量
echo "当前进程进程号=$$"
#后台的方式运行myShell.sh
./myShell.sh & 
#以后台方式运行只需要一个&,正常运行则需要两个&
echo "最后一个运行的进程进程号=$!"
echo "最后一个命令运行情况=$?"
image-20211005130426176

5.5 运算符

5.5.1 语法

  • $((运算式))或$[运算式]
  • expr m + n
    • 注意expr运算符间要有空格
  • expr m - n
  • expr \*,/,% 乘除余

5.5.2 应用实例

​ 计算(2+3)*4的值

#!/bin/bash
  
#第一个方式$(())
RESULT1=$(((2+3)*4))
echo "result=$RESULT1"

#第二种方式$[]
RESULT2=$[(2+3)*4]
echo "result=$RESULT2"

#第三种方式expr
$TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result=$RESULT3"

​ 请求出命令行的两个参数的和

#!/bin/bash

echo "$[$1+$2]"
image-20211005132330805

5.6 条件判断

5.6.1 判断语句

5.6.1.1 语法

[ condition ] 注意condition前后要有空格

#非空返回true,可用$?验证(0表示true,>1为false)

5.6.1.2 应用实例

[asdasdas]    	#返回true
[]
[condition] && echo OK || echo notOK

5.6.1.3 常用判断条件

  • 两个整数的比较

    语法 介绍
    = 字符串的比较
    -lt 小于
    -le 小于等于
    -eq 等于
    -gt 大于
    -ge 大于等于
    -ne 不等于
  • 按照文件权限进行判断

    语法 介绍
    -r 有读的权限
    -w 有写的权限
    -x 有执行的权限
  • 按照文件类型进行判断

    语法 介绍
    -f 文件存在且为一个正常的文件
    -e 文件存在
    -d 文件存在且为一个目录
  • 应用实例

    • “ok”是否等于“ok”

    • 23是否大于等于22

    • /root/install.log目录中的文件是否存在

      #!/bin/bash
        
      # ok是否等于ok
      if [ "ok"="ok" ]
      then
              echo "equal"
      fi
      
      # 23是否大于等于22
      if [ 23 -ge 22 ]
      then
              echo "23 is greater and equ then 22"
      fi
      
      # /root/install.log目录中的文件是否存在
      if [ -e /root/install.log ]
      then
              echo "exist"
      fi
      
      # /home/shell/myShell.sh的文件是否存在
      if [ -e /home/shell/myShell.sh ]
      then
              echo "exist /home/shell/myShell.sh"
      fi
      
      image-20211005204326111

5.6.2 流程控制

5.6.2.1 if语句

5.6.2.1.1 语法
if [条件判断式];then
	程序
fi
# 或者
if [条件判断式]
	then
		程序
	elif[条件判断式]
	then
		程序
fi

注意:[条件判断式],中括号和条件判断式之间必须有空格;推荐使用第二种方式

5.6.2.1.2 应用实例

编写一个Shell程序,如果输入的参数大于等于60,则输出及格了,反之输出不及格

#!/bin/bash
  
if [ $1 -ge 60 ]
then
        echo "及格"
elif [ $1 -lt 60 ]
then
        echo "挂科"
fi
image-20211005205809638

5.6.2.2 case语句

5.6.2.2.1 语法
case $变量名 in
	"值1")
	如果变量的值等于值1,则执行程序1
	;;
	"值2")
	如果变量的值等于值2,则执行程序2
	;;
	…省略其他分支…
	*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac
5.6.2.2.2 应用实例

当参数为1时,输出周一v,是2时输出周二,其他情况输出other

#!/bin/bash
  
case $1 in
        "1")
                echo "周一"
                ;;
        "2")
                echo "周二"
                ;;
        *)
                echo "other"
                ;;
esac
image-20211005211010242

5.6.2.3 for循环

5.6.2.3.1 语法1
for 变量 in 值1 值2 值3 ...
	do
		程序
done
5.6.2.3.2 语法2
for ((初始值;循环控制条件;变量变化))
	do
	 	程序
done

5.6.2.3.3 应用实例

  • 语法1:打印命令行输入的参数

    • #!/bin/bash
        
      # 打印命令行输入的参数
      # 使用$*
      echo "\$* case"
      for i in "$*"
      do
              echo "the num is $i"
      done
      
      # 使用$@
      echo "\$@ case"
      for i in "$@"
      do
              echo "the num is $i"
      done
      
    • image-20211006100655754

    • 当$@和$*不被双引号包围时,它们之间没有任何区别,都将参数区别对待

  • 语法2:从1加到100的值输出显示[这里可以看到$*和$@的区别]

    • # 从1加到100
      echo "================="
      SUM=0
      for ((i=1;i<=100;i++))
      do      
              SUM=$[$SUM+$i]
      done    
      echo "sum=$SUM"
      

5.6.2.4 while循环

5.6.2.4.1 语法
while [条件判断式]
do
	程序
done
5.6.2.4.2 应用实例

从命令行输入一个数n,计算从1+…+n的值是多少

#!/bin/bash

SUM=0
N=$1
while [ $N -gt 0 ]
do
        SUM=$[$SUM+$N]
        N=$[$N-1]
done
echo "sum=$SUM"

5.7 读取控制台输入

5.7.1 语法

read 选项 参数
选项 说明
-p 指定读取值时的提示
-t 指定读取值时等待的时间(秒),如果没有在指定时间内输入则不等了

参数为指定读取值后赋值到的变量的名字

5.7.2 应用实例

  • 读取控制台输入一个num值

  • 读取控制台输入一个num值,在10秒内输入

    • #!/bin/bash
      
      # 读取控制台输入一个num值
      read -p "请输入一个数num=" NUM1
      echo "你输入的值为num=$NUM1"
      
      # 读取控制台输入一个num值,在10秒内输入
      read -t 10 -p "请在10秒内输入一个数num=" NUM2
      echo "你输入的值为num=$NUM2"
      
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5lghjwVc-1635161857684)(C:\Users\九三\AppData\Roaming\Typora\typora-user-images\image-20211006103758122.png)]

5.8 函数

5.8.1 介绍

Shell中由系统函数和自定义函数,这里我们介绍两个系统函数

5.8.2 系统函数

5.8.2.1 basename

5.8.2.1.1 basename基本语法

功能:返回完整路径最后/的部分,常用于获取文件名

basename pathname suffix
basename string suffix # basename命令或删除所有的前缀并包括最后一个/,然后将字符串显示出来

选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

5.8.2.1.2 应用实例

返回/home/aaa/text.txt的text.txt部分

5.8.2.2 dirname

5.8.2.2.1 dirname基本语法

功能:返回完整路径最后/的前面部分,常用于返回路径部分

dirname 文件绝对路径 # 从给定的包含绝对路径的文件中取出文件名,返回剩下的部分
5.8.2.2.2 应用实例

返回/home/aaa/text.txt的/home/aaa部分

#!/bin/bash
  
# 返回/home/aaa/text.txt的text.txt部分
basename "/home/aaa/text.txt"
basename "/home/aaa/text.txt" .txt 

# 返回/home/aaa/text.txt的/home/aaa部分
dirname "/home/aaa/text.txt"

5.8.3 自定义函数

5.8.3.1 语法

[ function ] funname[()]
{
	Action;
	[return int;]
}

调用之间写函数名

5.8.3.2 应用实例

计算输入两个参数的和

#!/bin/bash

function getSum()
{
        SUM=$[$n1+$n2]
        echo "sum=$SUM"
}

read -p "请输入第一个参数:" n1
read -p "请输入第二个参数:" n2

getSum $n1 $n2

5.9 综合案例

image-20211006110718806 image-20211006111223529
#!/bin/bash
  
# 完成数据库的定时备份
# 定义备份路径
BACKUP=/data/backup/db

# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)

# 可以输出变量调试
# echo $DATETIME

echo "===========开始备份=========="
echo "=====备份的路径是$BACKUP/$DATETIME.tar.gz====="

# 定义数据库必需属性
# 主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
# 备份数据库名
DATABASE=user

# 创建备份的路径
# 如果备份的路径或文件夹不存在则需要实现创建,否则直接使用
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"

# 执行mysql的备份数据库的指令 备份完就压缩到文件夹中
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

# 打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME

# 删除临时目录
rm -rf $BACKUP/$DATETIME

# 删除10天前的文件
# {} \ 表示把找到的文件删除
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "====备份文件成功===="
crontab -e

10 2 * * * /usr/sbin/mysql_db_backup.sh

第六章 Linux的Python开发

一般使用Ubuntu做Python开发

6.1 Ubuntu下开发Python

Ubuntu自带Python开发环境[Python3.8.10]

image-20211006185251165 image-20211006185511713

创建一个名为pytorch的环境,指定Python版本是3.6
conda create --name pytorch python=3.6

查看当前拥有的所有的环境
conda info -e

环境切换,切换到名为pytorch的环境
source activate pytorch
conda activate YourEnvs (第一个命令无效时使用)

删除一个名为pytorch的环境
conda remove --name pytorch --all

安装python包
conda install 包名
conda install -n 环境名 包名
如果不用-n指定环境名称,则被安装在当前活跃环境
也可以通过-c指定通过某个channel安装

查看当前环境下已安装的包
conda list

查看某个指定环境的已安装包
conda list -n 环境名

查找包信息
conda search 包名

更新package
conda update -n 环境名 包名

删除package
conda remove -n 环境名 包名

更新conda,保持conda最新
conda update conda

更新anaconda
conda update anaconda

退出当前base环境
conda deactivate

dirname 文件绝对路径 # 从给定的包含绝对路径的文件中取出文件名,返回剩下的部分
5.8.2.2.2 应用实例

返回/home/aaa/text.txt的/home/aaa部分

#!/bin/bash
  
# 返回/home/aaa/text.txt的text.txt部分
basename "/home/aaa/text.txt"
basename "/home/aaa/text.txt" .txt 

# 返回/home/aaa/text.txt的/home/aaa部分
dirname "/home/aaa/text.txt"

5.8.3 自定义函数

5.8.3.1 语法

[ function ] funname[()]
{
	Action;
	[return int;]
}

调用之间写函数名

5.8.3.2 应用实例

计算输入两个参数的和

#!/bin/bash

function getSum()
{
        SUM=$[$n1+$n2]
        echo "sum=$SUM"
}

read -p "请输入第一个参数:" n1
read -p "请输入第二个参数:" n2

getSum $n1 $n2

5.9 综合案例

image-20211006110718806 image-20211006111223529
#!/bin/bash
  
# 完成数据库的定时备份
# 定义备份路径
BACKUP=/data/backup/db

# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)

# 可以输出变量调试
# echo $DATETIME

echo "===========开始备份=========="
echo "=====备份的路径是$BACKUP/$DATETIME.tar.gz====="

# 定义数据库必需属性
# 主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
# 备份数据库名
DATABASE=user

# 创建备份的路径
# 如果备份的路径或文件夹不存在则需要实现创建,否则直接使用
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"

# 执行mysql的备份数据库的指令 备份完就压缩到文件夹中
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

# 打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME

# 删除临时目录
rm -rf $BACKUP/$DATETIME

# 删除10天前的文件
# {} \ 表示把找到的文件删除
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "====备份文件成功===="
crontab -e

10 2 * * * /usr/sbin/mysql_db_backup.sh

第六章 Linux的Python开发

一般使用Ubuntu做Python开发

6.1 Ubuntu下开发Python

Ubuntu自带Python开发环境[Python3.8.10]

image-20211006185251165 image-20211006185511713

创建一个名为pytorch的环境,指定Python版本是3.6
conda create --name pytorch python=3.6

查看当前拥有的所有的环境
conda info -e

环境切换,切换到名为pytorch的环境
source activate pytorch
conda activate YourEnvs (第一个命令无效时使用)

删除一个名为pytorch的环境
conda remove --name pytorch --all

安装python包
conda install 包名
conda install -n 环境名 包名
如果不用-n指定环境名称,则被安装在当前活跃环境
也可以通过-c指定通过某个channel安装

查看当前环境下已安装的包
conda list

查看某个指定环境的已安装包
conda list -n 环境名

查找包信息
conda search 包名

更新package
conda update -n 环境名 包名

删除package
conda remove -n 环境名 包名

更新conda,保持conda最新
conda update conda

更新anaconda
conda update anaconda

退出当前base环境
conda deactivate

你可能感兴趣的:(linux,运维,服务器)