Linux

Linux基础

一、Linux 介绍

1.1 Linux 的应用领域

  • 个人桌面应用领域
  • 服务器应用领域
    • Linux 在 应用领域是最强的,Linux 免费、稳定、高效
    • 很多公司都会把项目部署到Linux上。
  • 嵌入式应用领域

2.2 Linux 基本介绍

  • linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到 业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上。
  • Linux 的主要发行版本:Ubuntu(乌班图)、RedHat(红帽)、CentOS、Debain[蝶变]、Fedora、SuSE、 OpenSUSE

二、Linux 基础

1、安装 VM 【virtual machine 】

1.1 VM 和 Linux 的关系

1648888099703

官方下载地址: Windows 虚拟机 | Workstation Pro | VMware | CN

2、 安装 CentOS

CentOS7镜像文件下载地址: Index of /centos-vault/7.6.1810/isos/x86_64/ (kernel.org)

2.1 文件 --> 创建虚拟机

1648890585244

2.2 安装 ISO 镜像文件

1648891214249

2.3 配置 CentOS 虚拟机系统

第一步:

1648891395946

第二步:当安装源和软件选择是灰色时,千万不要乱点,等等!!!!

1648898794209

选择图形化界面:

1648898891094

安装位置 --》 选择 我要配置分区

自定义配置分区情况

1648899716582

1648899936466

KDUMP :

如果部署项目时打开,如果不是就关闭。因为会占用一些内存

1648900079396

网络和主机名:

1648900268702

配置好以上配置,点击安装,设置用户和密码:

在工作时,一定要将密码设置成复杂的,不然会被破解~~~~!!!!!!

1648900444959

安装好后,出现以下图标,表示连接上网络了,安装成功!!!

1648901450099

如果没有此标志,按以下流程操作:

1649405125730

1649405186277

3、 网络连接的三种模式

  • 桥接模式
  • NAT 模式
  • 仅主机模式
桥接模式:
  1. 桥接模式会自动与主机生成同一网段的 IP 地址,虚拟机可以和局域网内的主机可以互相通讯,但是容易造成 IP 地址冲突。

  2. 比如:有几百个学生,几百个学生都开启桥接模式,会生成 几百个同一网段 的IP 地址。 同一网段的地址最多有 255 个,其中还包括 网关,广播地址… 因此会造成 IP 冲突

1648902894189

NAT 模式:

网络地址转换模式

  1. NAT 模式 会自动在主机里生成一个模拟网卡,会有一个 IP 地址,这俩个之间会生成一个独立的网络,可以互相通信。
  2. 并且 Linux 里面的虚拟机可以通过 这个虚拟网卡和外界进行通信,而且不会造成 IP 冲突
  3. 但是有一点, 虚拟机 可以利用虚拟网卡 和主机 通讯,但是 主机 不能和 虚拟机通讯。

1648903106775

仅主机模式:

就是一个 独立的系统。

4、虚拟机克隆

当已经有了一个 Linux 之后,无需在重新创建虚拟机,只需要克隆就 OK 了。

方法一:

直接拷贝一份安装好的 虚拟机文件

方法二:

通过 VM 的克隆操作,克隆时需要关闭虚拟机

1648904256693

5、虚拟机快照

回到快照时的状态…可以拍摄多个快照。

6、安装 vmtools

安装 vmtools 后,Windows 可以更好的管理 Linux

  1. 可以直接粘贴命令在windows 和 centos系统之间

  2. 可以设置windows和centos的共享文件夹

安装步骤:

1、将镜像光盘弹出

1648905643263

2、安装 vmtools

1648905696588

3、安装后,Linux 界面会出现一个 vmtools 光盘,如果没有就取消重新装一下。

1648905834364

4、拷贝这个文件到 opt 目录下

1648905902616

5、依次输入以下命令

1648907136283

6、启用共享文件

1648906429916

7、在以下位置就可以共享文件夹了,文件夹内的任何修改都是实时更新的

1648906861963

三、目录结构

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

在Linux世界里,一切皆文件,Linux 会将所有硬件都当做一个文件来处理。

1648953129491

  • /bin【/user/bin、/user/local/bin】

    • 这个目录存放着最经常使用的命令
  • /sbin (/usr/sbin 、 /usr/local/sbin)

    • s 就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
  • /home【重点】

    • 存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般 该目录名是以用户的账号命名的。
  • /root 【重点】

    • 该目录为系统管理员,也称作超级权限者的用户主目录。
  • /lib

    • 系统开机所需要最基本的动态连接共享库,其作用类似Windows里的DLL文件。几 乎所有的应用程序都需要用到这些共享库。
  • /lost+found

    • 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
  • /etc 【重点】

    • 所有的系统管理所需要的配置文件和子目录 my.conf
  • /usr 【重点】

    • 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows下的program files目录。
  • /boot

  • 存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件

  • /proc【不能动】

    • 这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。
  • /srv 【不能动】

    • service缩写,该目录存放一些服务启动之后需要提取的数据。
  • /sys 【不能动】

  • 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统

  • /tmp

    • 这个目录是用来存放一些临时文件的。
  • /dev 【重点】

    • 类似于windows的设备管理器,把所有的硬件用文件的形式存储。
  • /media 【重点】

    • linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下。
  • /mnt【重点】

    • 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂 载在/mnt/上,然后进入该目录就可以查看里的内容了。 c:/myshare
  • /opt

    • 这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下。 默认为空。
  • /usr/local 【重点】

    • 这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序。
  • /var [重点]

    • 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。

      包括各种日志文件。

  • /selinux [security-enhanced linux] 360

    • SELinux是一种安全子系统,它能控制程序只能访问特定文件。

四、远程登录以及文件上传下载

XShell, Xftp下载: 家庭/学校免费 - NetSarang Website (xshell.com)

在公司中开发中的流程是这样的:

  1. linux服务器是开发小组共享的.

  2. 正式上线的项目是运行在公网的.

  3. 因此程序员需要远程登录到centos进行项目管理或者开发.

  4. 远程登录客户端有 Xshell, Xftp, 我们学习使用 Xshell 和 Xftp , 其它的 远程工具大同小异.

1648957214356

XShell : 远程登录

Xftp : 远程上传下载文件

XShell 使用:

1、先在 Linux 中查询 IP 地址

1648955945513

2、XShell 中 新建会话

1648955976816

3、输入 IP 地址 以及端口号,名称随意、IP 地址要对

1648956036946

4、一次性接受:每次登录都输入用户名密码

​ 接受并保存:只需要输入一次用户名和密码

1648956182758

Xftp 使用:

和 XShell 一样,创建会话

1648956598527

图左边是Windows 右边是 Linux 。直接在左边双击就会将文件上传到 Linux 中。

1648956931642

解决 xftp 乱码问题:

1648967101758

五、Vi 和 Vim

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

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

1、Vi 和 Vim 的三种模式

  • 正常模式

    • 以 vim 打开一个档案后直接进入 正常模式
  • 插入模式

    • 按下i, I, o, O, a, A, r, R等任何一个字母之后才会进入编辑模式, 一般来说按i即可
  • 命令行模式

    • 在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的 动作则是在此模式中达成的!

三种模式之间的互换:

1648968017452

2、Vim 的常用命令

  1. 拷贝当前行 yy , 拷贝当前行向下的5行 5yy,并粘贴(p键)。

  2. 删除当前行 dd , 删除当前行向下的5行 5dd

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

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

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

6)撤销前一个个动作 u

  1. 编辑 /etc/profile 文件,并将光标移动到 20行 ,先输入 :20,在按shift+g 。或者 在一般模式下,nG ,n 代表移动到第几行。

8)替换命名:

:%s/abc/def    将文件中的所有abc 替换成 def

六、关机、重启、用户登录和注销命令

1、关机重启命令

作用
shutdown –h now立该进行关机
shutdown -h 1“hello, 1 分钟后会关机了”
shutdown –r now现在重新启动计算机
halt关机,作用和上面一样.
reboot现在重新启动计算机
sync把内存的数据同步到磁盘.

shutdown 默认表示:shutdown -h 1

注意:

不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中

虽然现在的 shutdown /halt/reboot 命令执行之前,自动指定了sync 命令。但建议还是手动执行一遍

2、用户登录、注销

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

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

注意: logout 只在运行级别 3 下 有效。

root --》普通用户 无需输入登录密码

普通用户 --》 root 需要输入登录密码

七、用户管理

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

1、增加用户

useradd 用户名

  • 当创建成功用户后,会自动创建和用户同名的 家目录
  • 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录

1648972333305

2、指定密码

passwd 用户名

如果不指定用户名,默认为当前登录的用户名设置密码

3、删除用户

userdel 用户名

  1. 删除用户xiaoming,但是要保留家目录 userdel 用户名

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

对于正在登录的用户是无法删除的。

4、查询用户信息

id 用户名

1648973218665

显示当前正在登录的用户:

who am i

1648973507558

显示第一次登录的用户。

5、用户组

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

增加组:

groupadd 组名

删除组:

groupdel 组名

增加用户时直接增加到组:

useradd -g 组名 用户名

修改用户的组

usermod -g 组名 用户名

6、用户和组相关的文件

  • /etc/passwd
    • 用户(user)的配置文件,记录用户的各种信息
    • 每行的含义:用户名 : 口令 : 用户标识号[uid] : 组标识号[gid] : 注释性描述 : 主目录 : 登录Shell
    • 登录 Shell 是 命令 与 Linux 内核之间一种转机器语言,负责解析命令。

1648975193637

  • /etc/shadow

    • 口令的配置文件
    • 每行的含义: 登录名 : 加密口令[对密码进行加密] : 最后一次修改的时间 : 最小时间间隔 : 最大时间间隔 : 警告时间 :不活动时间 : 失效时间 :标志

    1648975459843

  • /etc/group

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

1648975543713

八、常用的命令

1、运行级别

0 :关机

1 :单用户【找回丢失密码】

2:多用户状态没有网络服务

3:多用户状态有网络服务 【命令行模式】

4:系统未使用保留给用户

5:图形界面

6:系统重启

常用运行级别是3和5 ,要修改默认的运行级别可改文件

使用命令:init 命令级别 ,修改运行级别

在 CentOS7 以后对 inittab 文件进行了简化:

# multi-user.target: analogous to runlevel 3   // 表示 运行级别 3
# graphical.target: analogous to runlevel 5	   //运行级别 5 
#
# To view current default target, run:
# systemctl get-default  //通过这行命令 ,获取运行级别
#
# To set a default target, run:
# systemctl set-default TARGET.target  //设置运行级别

设置运行级别 3:

1648978523654

设置运行级别 5:

1648978620899

2、找回 root 密码

第一步:在启动界面按 :“e”

1648978921417

第二步:找到 UTF-8 的位置,输入: init=/bin/sh 进入单用户模式

1648985441456

第三步:输入完后,按 Ctrl + X

第四步:进入单用户模式,输入:mount -o remount,rw /

1648979690249

第五步:输入 passwd --》回车 --》输入重置的密码 --》回车 --》再次输入密码 --》最终输入:

touch /.autorelabel --》回车 --》 exec /sbin/init

过程会有一点慢,耐心等待!!!!!

1648979819094

3、帮助命令

man [命令或配置文件] 获取帮助信息

help 命令 获取shell 内置命令的帮助信息

4、文件目录命令

ls [选项] 文件名

h :人性化显示

(1)cd [参数] 切换到指定目录

​ cd ~ 或者 cd :回到自己的家目录,比如:你是 root, cd ~ 到 /root

​ cd … 回到当前目录的上一级目录

相对路径与绝地路径:

1648987924495

比如当前在 home 目录切换到 root 目录:

​ 绝对路径 : cd /root

​ 相对路径 : cd …/root

绝对路径是从 / 根路径开始

相对路径是从当前路径开始, cd … 返回上一级目录 / ,在到 /root 目录。

(2)mkdir [选项] 目录名

常用选项:

-p : 递归创建目录

(3)rmdir [选项] 要删除的空目录

只能删除一个空目录。

如果删除当前目录中的某一个目录,只需要 : rmdir 目录名 不需要加 /

1648989301860

rm -rf 可以删除有内容的目录。

(4)touch 创建空文件

创建一个空的文件,没有内容

(5)cp [选项] source dest

拷贝文件到指定的目录

常用选项:

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

实战: 将 /tom/test.text 拷贝到 /home/aaa 目录下

1648989827300

实战二: 将 /tom/bbb 目录 拷贝到 /home/aaa 的目录下

1648989974435

强制覆盖不提示:\cp

(6)rm 指令

移除文件或目录

rm [选项] 要删除的文件或目录

常用选项:

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

-f : 强制删除不提示

rm -rf 删除整个目录,不提示,一定要小心!!!!!!

(7)mv 指令

mv oldNameFile newNameFile

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

实例一: 将 /home/tom 目录下的 test.text 文件重命名为 newTest.text

1649038343026

实例二:将 /home/tom 目录下的 newTest.text 文件移动到 /home 目录下

1649038390290

实例三:将 /home 下的 newTest.text 的文件移动到 /root 目录 并且重命名:newTest2.text

1649038728911

(8)cat 指令

cat [选项] 查看的内容

查看文件内容

常用选项:

-n : 显示行号

cat 指令只能浏览文件,不能修改文件,为了浏览方便,一般会带上 管道命令 | more

管道命令 | :类似于 将前面的结果交给后面的指令执行

(9)more 指令

more 查看的文件

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

1649039537511

more 可以和 cat 进行交互使用,也可以单独使用

(10) less 命令

less 查看的文件

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

1649039951370

(11)echo 指令

向控制器中输出内容

输出主机名:

1649040334896

输出 hello :

1649042824951

(12)head 指令

head [选项] 文件名

head -n 5 显示文件前5行的内容

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

1649040484689

(13)tail 指令

tail [选项] 文件名

tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的前10行内容。

1) tail 文件 (功能描述:查看文件头10行内容)

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

3) tail -f 文件 (功能描述:实时追踪该文档的所有更新)

(14)> 指令 和 >> 指令

> 输出重定向 和 >> 追加

如果追加的文件不存在,会自动创建

ls -l > 文件名 将显示列表的内容写入文件中【覆盖文件中的所有内容】

ls -l >> 文件名 将显示列表的内容追加到文件中【不会覆盖之前的内容】

1649041425502

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

echo "内容" >> 文件 将 “内容” 追加到文件当中

1649041611327

(1 5)ln 软链接

软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径

ln -s [源文件或目录] [软链接名] 给源文件创建一个软链接

为 /root 目录创建一个软链接:

1649042427065

1649042494100

(16)history

查看历史命令

history 5 查看前5条命令

!5 执行历史命令中的第五条命令

5、时间日期类指令

  1. date (功能描述:显示当前时间)

  2. date +%Y (功能描述:显示当前年份)

  3. date +%m (功能描述:显示当前月份)

  4. date +%d (功能描述:显示当前是哪一天)

  5. date “+%Y-%m-%d %H:%M:%S” (功能描述:显示年月日时分秒)

设置日期:

date -s 字符串时间

cal 日历指令

cal [选项]

不加选项显示本月日历,加具体的年份显示一年的月份

6、搜索查找类指令

(1)find 指令

find [搜索范围] [选项]

find 将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端

1649057200617

**实例一:**找到 home 目录下name为 hello.text 的文件

find /home -name test.text

精确查找,如果 *.text 找到所有以 .text 结尾的文件。

**实例二:**找到 home 目录下 user 为 tom 的文件

find /home -user tom

实例三:查找整个 Linux 系统下大于 200M 的文件(+n 大于,-n 小于,n 等于,单位有:k,M,G)

find / -size +200M

(2)locate 指令.

locate 搜索文件名

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

​ 在使用 locate 前,需要更新查询库 updatedb .

实例一:快速查找 test.text 文件

updatedb

locate test.text

(3)which 指令

which 指令

查找 指令在哪个目录

(4)grep 指令 和 管道符号 |

grep 过滤查找 ,文本搜索工具, 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。

grep [选项] 查找内容 源文件

常用选项:

1649058525727

实例一:查找 test.text 文件中 “yes” 字符串,并显示行号,忽略大小写

方法一:cat /home/test.text | grep -in "yes"

方法二:grep -in "yes" /home/test.text

7、压缩、解压缩类指令

(1)gzip / gunzip 指令

gzip : 压缩文件 gunzip:解压缩

gzip 文件名 将文件压缩成 *.gz 文件

gunzip 文件.gz 将文件解压缩

1649059519190

gzip / gunzip 是对文件进行压缩/解压缩,对目录无法压缩/解压缩

(2)zip/unzip 指令

zip/unzip : 压缩/解压缩 文件或者目录为:xx.zip。

zip [选项] xxx.zip 将要压缩的内容

unzip [选项] 文件.zip

常用的选项:

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

unzip的常用选项

-d <目录> :指定解压后文件的存放目录

实例一:将 /home 以及 /home 下的文件进行压缩,压缩名:myhome.zip

zip -r myhome.zip /home/

实例二:将 压缩后的 myhome.zip 解压到 /opt 目录下

unzip -d /opt/ myhome.zip

(3)tar 指令

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

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

常用选项:

1649061115779

-C <目录> 指定解包之后的目录

**实例一:**将 /home 目录下的 test1.text 和 test.text 文件打包 成 pc.tar.gz

tar -czvf pc.tar.gz /home/test1.text /home/test.text

多个文件使用空格分开就行。

实例二: 将 /home 目录打包到 /opt 目录下

tar -czvf myhome.tar.gz /home/

实例三: 将 myhome.tar.gz 解压到 /opt/ 目录下.

tar -xzvf myhome.tar.gz -C /opt/home

九、组管理和权限管理

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

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

  • 所有者:文件的创建者,可以更改
  • 所在组:所有者所在的组
  • 其他组:除所在组和所有者之外,都是其他组。
  1. 修改文件/目录所有者:chown 用户名 文件名/目录名

  2. 修改目录下所有文件的所有者 : chown -R 用户名 文件名/目录名

  3. 修改文件所在组: chgrp 组名 文件名

  4. 修改所在组下的所有文件的所在组: chgrp -R 组名 文件名

  5. 增加用户时修改用户所在组: useradd -g 组名 用户名

  6. 直接修改用户所在组: usermod -g 组名 用户名

1、权限基本介绍

使用 ls -l 显示的内容都是什么意思:

1649125695443

0-9位说明

  • 第0位确定文件类型(d, - , l , c , b)
    • l : 表示软链接,类似于 Windows 中的快捷方式
    • -:表示普通文件
    • d : 表示目录
    • c : 表示字符设备文件,鼠标键盘
    • b:是块设备,比如硬盘
  • 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。—User
  • 第4-6位确定所属组(同用户组的)拥有该文件的权限,—Group
  • 第7-9位确定其他用户拥有该文件的权限 —Other
  • 1 : 文件:硬链接数 目录:子目录数
  • root/fox/zwj/tom : 用户
  • root /master/tom/wudnag: 文件所在组
  • 4096 : 文件大小
  • 4月 4 19:35 :最后修改日期
  • a.text : 文件名

2、rwx 权限详解

rwx 作用到文件:

  • r : read ,可读,可以查看,阅读

  • w:write,可写,可以修改,但是不代表可以删除该文件,删除该文件的前提是该文件所在的目录拥有 w 写权限。

  • x :execute,执行,可以被执行。

rwx 作用到目录:

  • r : read ,可读,可以使用 ls 查看目录内容
  • w:write,可写,可以修改,可以对目录内创建+删除+重命名目录/文件【touch,rm,cp,mv】
  • x :execute,执行,可以进入该目录,执行 cd 命令

3、修改文件或者目录权限

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

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

u = 所有者 g=所在组 o=其他人 a=所有人【u、g、o总和】

例一:

chmod u=rwx,g=rw,o=r 文件名/目录名 给文件所有者 rwx 权限,所在组 rw 权限,其他人 r 权限

例二:

chmod g+x 文件名/目录名 为文件/目录 的所在组增加 x 权限

例三:

chmod u-w 文件名/目录名 为文件/目录 所有者减少 w 权限

例四:

chmod a=rwx 文件名/目录名 为文件/目录 的所有者,所在组,其他人设置 rwx 权限

文件变为绿色,代表该文件可执行。1649127848480

**第二种方式:**通过数字设置权限

r=4,w=2,x=1

例一:

chmod 741 文件名/目录名 将文件/目录 的所有者权限设置为:rwx,所在组:r,其他人:x

三位数字可随意组合:1~7之内的数

注意:

如果相对目录内的文件进行操作,需要有对该目录相对应的权限。

十、任务调度

1、crond 任务调用

crontab 进行 定时任务的设置。---- 循环执行

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

任务调度分类:

1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等

2.个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。

crontab [选项]

常用选项:

1649140609523

实例一:

设置定时任务,每隔1分钟执行 该任务 :ls -l /root > /home/b.txt

crontab -e 设置定时任务

增加: */1 * * * * ls -l /root/ > /home/b.txt

1649142030013

1649142248251

案例说明:

1649142276050

实例二:

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

第一步:设计执行俩条命的脚本 my.sh

vim my.sh

输入以下内容:

cal >> /home/mycal date >> /home/mycal

第二步:为所有者增加 x 权限,不然是无法执行脚本的

第三步:设置定时任务 crontab -e 里面增加:*/1 * * * * /home/my.sh

实例三:

每天凌晨 2:00 将 mysql 数据库 test ,备份到文件中

crontab -e 增加:0 2 * * * mysqldump -u root -proot test > /home/mysql.bak

2、at 定时任务

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

2、默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

3、at 命令试一次性定时计划任务,执行完一个任务后不再执行此任务了。

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

使用 ps -ef | grep atd

1649145486889

基本语法:

at [选项] [时间]

输入完按:俩次 Ctrl + D

常用选项:

1649146073505

atq:查看当前没有执行的任务

指定时间的方法:

1、接受当天的 hh:mm (小时,分钟) 的时间指定,假如改时间已过去,那么就会 放在第二天执行。例如:4:12 会在凌晨 4点12 执行

2、采用 midnight(深夜),noon(中午),teatime(饮茶时间),等比较模糊的词语来指定时间。

3、采用12小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午,例如:12PM

4、指定命令执行的具体日期,指定格式为 month day(月 日) 或 mm/dd/yy 或 dd.mm.yy (日.月.年) , 指定的日期必须跟在指定时间的后面。例如:4:00 2021-03-01

5、直接使用 today(今天)、tomorrow(明天)来指定完成指令的时间

6、使用相对计时法,指定格式为:now + count time-units ,now 就是当前时间,time-units 是时间单位,这里能够是 minutes,hours,days,weeks。count是时间的数量,几天,几小时。例如:now + 5 minutes ,现在开始 5 分钟后

实例一:

2天后的下午 5 点执行 : /bin/ls /home === ls /home

1649146427170

明天 17:00 ,输出时间到指定文件内: /home/date.txt

1649146588065

实例三:

俩分钟后,输入时间到:/home/date.txt 中

1649146739137

按住:Ctrl +删除键,可删除内容。

十一、硬盘

1、硬盘分区机制

  1. Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独 立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。

  2. Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目 录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一 录下获得。

  3. 通过 mount 挂载,来指明 硬盘 与 目录之间的关系,进入到该目录时就相当于访问了该分区。

1649157926688

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

1649158552962

lsblk -f 或者 lsblk 查看硬盘分区情况

3、挂载硬盘实例

第一步:增加硬盘

虚拟机右键 --》 设置 --》 增加 --》 硬盘 --》 SCSI(S) --》下一步 --》分配硬盘大小 --》 下一步 --》完成 --》 重启虚拟机

第二步:硬盘分区

(1)fdisk /dev/sdb 进行分区

(2)n 键: 创建分区 – 》 p : 创建主分区 – 》 设置分区号 --》回车 --》设置分区大小 --》回车 --》w 保存退出

1649159675474

​ • m 显示命令列表

​ • p 显示磁盘分区 同 fdisk –l

​ • n 新增分区

​ • d 删除分区

​ • w 写入并退出

第三步:格式化分区

1649163023704

虽然我们增加了硬盘,但是并没有分配 UUID ,也就是说该硬盘并没法用,需要进行格式化

格式化: mkfs -t ext4 /dev/sdb1

第四步:挂载 到目录

(1)创建挂载的目录 mkdir newDisk

(2)挂载 mount /dev/sdb1 /home/newDisk/

1649163641921

这时候在 newDisk 创建的文件就会保存在 sdb1 分区里边了。

卸载挂载点:

umount 目录名/分区名

注意:

使用命令行的挂载方式,重启之后挂载会失效的。

第五步:实现永久挂载

修改 /etc/fstab 配置文件实现挂载

可以增加 UUID,也可以直接增加 分区名字

1649164374323

添加完成后,执行 mount -a 即可生效。

如果移除硬盘后, /etc/fstab 中的配置没有删除该硬盘的内容,是会报错的。

4、查看硬盘分区情况

查看系统整体磁盘使用情况:

df -h

1649164698289

查看指定目录的磁盘占用情况:

du -h 目录名

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

  • -s 指定目录占用大小汇总
  • -h 带计量单位
  • -a 含文件
  • –max-depth=1 子目录深度
  • -c 列出明细的同时,增加汇总值

1649165171873

关于磁盘实用的命令:

**实例一:**统计 /opt 目录下文件的个数

ls -l /opt | grep "^-" | wc -l

**实例二:**统计 /opt 目录下 目录的个数

ls -l /opt | grep "^d" | wc -l

实例三:统计 /opt 目录下的文件数,包括子文件

ls -lR /opt | grep "^-" | wc -l

实例四:树状显示目录结构:

tree 目录

默认是没有安装这个命令的使用 yum install tree安装指令。

1649222014727

十二、 网络配置

NAT 网络配置原理图:

1649223839101

VMnet8 : 这是Host 用于与NAT 虚拟网络进行通信的虚拟网卡

1、查看网络IP网络和网关

编辑 --》虚拟网络编辑器

1649316603868

Windows 中查看 VMnet8 的指令:ipconfig

Linux 中查看 IP 的地址:ifconfig

2、Linux 网络配置

  • 第一种方式:自动获取IP
    • ip 地址不会冲突,但是每次重启都可能生成一个不同的 ip 地址
  • 🔺 第二种方式:手动设置 IP

设备名称:

1649314839231

第一步:

修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33 ,ens33 为虚拟机的网卡,每块网卡都不一样,使用 ifconfig 查看

修改以下内容:

BOOTPROTO=static

#IP地址

IPADDR=192.168.200.130

#网关

GATEWAY=192.168.200.2

#域名解析器

DNS1=192.168.200.2

1649224922805

第二步:

重启网络服务或者重启服务器生效

service network restartreboot

修改的IP 已经生效了:

1649225323110

3、设置主机名 和 hosts 映射

🔴 修改主机名:

  • 查看 主机名: hostname
  • 设置主机名:
    • 修改 /etc/hostname
  • 重启

🔴 设置 hosts 映射关系:

如果实现 ping 主机名 就能够ping通

💛 windows:

​ 修改 :C:\Windows\System32\drivers\etc\hosts 文件 ,增加 Linux IP 与主机映射关系

192.168.200.130 yangzhaoguang

这时候 从 cmd 命令行 通过主机名:yangzhaogunag 就能ping 通 Linux 了。

1649227082166

💛Linux :

通过 电脑–》右键属性查看计算机的 主机名

修改:vim /etc/hosts 文件,增加:192.168.200.1 yangzhaoguang-PC

ping 之前需要关闭 windows 防火墙。

1649227009426

🔴 主机名解析过程分析(DNS,Hosts)

  • Hosts 是什么?
    • 一个文本文件,用来记录 IP 和 Hostname(主机名)的映射关系
  • DNS 是什么?
    • 域名系统,是互联网上作为域名和 IP 地址 相互映射的一个分布式数据库。

假设在地址栏上输入:www.baidu.com 他的流程如下:

1649227725074

1649227792093

十三、进程

1、进程基本介绍

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

(2)每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目 前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法 看到的进程,通常使用后台方式执行。

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

2、ps 指令

(1)ps -aux

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

1649229572059

1649229637927

可以组合使用 ps -aux

1649230055981

• USER:用户名称

• PID:进程号

%CPU:进程占用CPU的百分比

• %MEM:进程占用物理内存的百分比

• VSZ:进程占用的虚拟内存大小(单位:KB)

• RSS:进程占用的物理内存大小(单位:KB)

• TT:终端名称,缩写

• STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通 优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等

• STARTED:进程的启动时间

• TIME:CPU时间,即进程使用CPU的总时间

• COMMAND:启动进程所用的命令和参数**,如果过长会被截断显示**

(2)ps -ef

-e 显示所有进程。-f 全格式。

实例一: 要求以全格式显示进程当前所有进程,并显示进程的父进程

1649296002484

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

他们之间的关系

1649231387894

3、终止进程 kill 和 killall

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

kill [选项] 进程号

通过进程号杀死进程

killall 进程名称

通过进程名称杀死进程,也会杀死所有子进程。支持通配符

常用选项:

-9 : 表示强制终止这个进程杀死

对于正在工作的进程,需要加上 -9 强制杀死。

4、pstree 指令

pstree [选项] 可以更加直观的来看进程信息

-p :显示进程的PID

-u :显示进程的所属用户

十四、 service 管理

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

原理图:

1649234204501

1、service 管理命令

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

比如: service network restart

在CentOS7.0后 不再使用service ,而是 systemctl , 现在还使用 service 命令管理的服务:

1649233937564

2、查看服务名

  • 第一种方式:

    • setup 命令查看所有服务
    • 1649234588008.
    • 使用 空格 来开启/关闭 自动启动服务
  • 第二种方式:

    • 使用 ls -l /etc/init.d/ 查看 支持 service 的服务

3、服务的运行级别

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

❌ 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

运行级别2:多用户状态(没有NFS),不支持网络

• 🔴 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

运行级别4:系统未使用,保留

🔴 运行级别5:X11控制台,登陆后进入图形GUI模式

❌ 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

1649234968328

CentOS 7 以后对运行级别进行了简化:

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

4、chkconfig 指令

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

查看运行级别的设置情况:

chkconfig --list 查看所有服务在各个运行级别的启动情况

1649235433989

chkconfig --list | grep network

chkconfig network --list

以上俩个都是 查看 network 服务的启动情况

1649235498764

设置 运行级别的设置情况:

chkconfig --level 5 服务名 on/off

设置好后,需要重启后才会生效。

🔴 5、 systemctl 指令

systemctl [start | stop | restart | reload | status] 服务名

[开启 | 关闭 | 重启 | 重载 | 状态]

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

systemctl = service + chkconfig

**实例一:**查看防火墙服务启动状态

systemctl list-unit-files | grep fire

enable : 开启自启动 disable: 关闭自启动

1649308262810

**实例二:**关闭开机自启动防火墙服务

systemctl disable firewalld

1649308431209

**实例三:**开启开机自启动防火墙服务

systemctl enable firewalld

实例四: 查询防火墙的自启动状态

systemctl is-enabled firewalld

1649308603942

防火墙:

用于开启端口的访问,保护系统。如果关闭防火墙,任意客户端都能访问所有的端口。

1649309357103

6、firewall 指令

在真正的生产环境下,往往需要防火墙打开,但是问题来了,把防火墙打开,那么外部请求数据包就不能和服务监听端口通讯,这时就需要打开某个端口。

开启端口:firewall-cmd --permanent --add-port=端口号/协议

1649310604971

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

1649310643073

重新载入:firewall-cmd --reload 开启/关闭 后必须重新载入才会生效。

1649310696891

查询端口是否开放firewall-cmd --permanent --query-port=111/tcp

1649310769779

查询所有已开放的端口 :firewall-cmd --zone=public --list-ports

十五、动态监控进程

1、​​ top 指令

top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程。

top [选项]

1649311297128

1649311593534

  • 14:06:27 系统当前时间
  • user : 目前用户数量
  • load average : 负载均衡,如果三个的平均值 大于 0.7 说明该提升性能了
  • Tasks : 任务数量
  • 1 running : 一个正在运行
  • 212 sleeping : 212 个正在睡眠
  • 1 stopped : 1 一个停止了
  • zombie: 僵死进程,表示进程已经结束了,但是内存还没有释放掉。
  • us : 用户占用的 CPU
  • sy : 系统占用的 CPU
  • id : 空闲的 CPU
  • KiB Mem : 内存占用情况
  • KiB Swap : 交换分区

交互操作:

1649312109971

**实例一:**监控指定的用户进程

top 中 ,输入 u ,输入用户名即可

**实例二:**终止指定的进程

输入 top 查看所有进程,输入 k ,输入终止进程的 pid ,回车,出现以下提示,是否给一个信号 输入数字 9 回车强制终止 即可。

1649335708882

2、监控网络状态

netstat [选项]

常用选项:

-an 按一定顺序排列输出

-p 显示哪个进程在调用

1649317301747

  • Proto : 协议
  • LocalADdress : 本地地址。也就是 Linux 中的地址。
  • ForeignAddress :外部地址
  • state : 状态。 LISTEN : 监听,ESTABLISHED : 连接

1649317266043

**实例一:**检查sshd 服务的状态信息:

netstat -anp | grep shhd

十六、RPM 和 YUM

1、 ​​ rpm 包的管理

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

rpm 包的简单查询指令:

rpm -qa

查询Firefox 安装包:rpm -qa | grep firefox

firefox-60.2.2-1.el7.centos.x86_64

  • 名称firefox

  • 版本号:60.2.2-1

  • 使用操作系统:el7.centos.x86_64

    • 表示 CentOS 7 .X 的64 位系统。
    • 如果是 i 686,i386 表示 32位系统,noarch : 表示通用。
  • 查询软件包是否安装:

    • rpm -q 软件包名
  • 查询软件包信息:

    • rpm -qi 软件包名
  • 查询软件包的文件:

    • rpm -ql 软件包名
  • 查询某个文件归属于哪一个软件包:

    • rpm -qf 软件包名
  • 安装 rpm 包

    • rpm -ivh RPM包全路径名称
      • i = install 安装 v=verbose 提示 h=hash 进度条

查询 RPM 包的全路径:

1649319853866

  • 卸载 rpm 包
    • rpm -e 包名
  1. 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。

如: rpm -e foo

removing these packages would break dependencies:foo is needed by bar-1.0-1

表示我们要删除的软件包被某个包锁依赖。

  1. 如果我们就是要删除 foo这个rpm 包,可以增加参数 --nodeps ,就可以强制删除,但是一 般不推荐这样做,因为依赖于该软件包的程序可能无法运行

如:rpm -e --nodeps foo

2、 yum

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

yum 基本命令:

  • 查询 yum 服务器是否有需要安装的软件
    • yum -list | grep xx软件名
  • 下载安装
    • yum install xxx

十七、配置 javaEE 环境

1、安装 JDK

第一步:

先到Oracle 官网下载 Linux 需要的Jdk 压缩包: Java Downloads | Oracle

下载需要注册账号~~~

1649323357478

第二步:

在 /usr/local/ 目录下创建 java 目录,用于存放 jdk

mkdir /user/local/java

第三步:

使用 xftp 工具,将下载好的压缩包传到 /usr/local/java 目录下,并解压缩

tar -xzvf jdk-8u321-linux-x64.tar.gz

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A7s2Ojr-1661223286618)(https://images-1313160403.cos.ap-beijing.myqcloud.com/MarkDown/202208231052647.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCUeSfu1-1661223286619)(https://images-1313160403.cos.ap-beijing.myqcloud.com/MarkDown/202208231052648.png)]

第四步:配置环境变量,打开 /etc/profile 文件,在文件的末尾配置环境变量:

export JAVA_HOME=/usr/local/java/jdk1.8.0_321
export PATH=$JAVA_HOME/bin:$PATH

第五步:让 刚才配置的 /etc/profile 文件生效 source /etc/profile

第六步:测试,编写一个 hello,world 是否安装成功。

vim Hello.java --> javac Hello.java --> java Hello

echo $PATH 展示 Linux系统中的环境变量

/usr/local 目录相当于 Windows 中的 C:\Program Files 默认存放软件的地方。

/opt 目录相当于 D:/ 盘

2、安装 Tomcat

第一步:

官方下载 Tomcat 压缩包:

1649329000382

第二步:

使用 xftp 将 tomcat 压缩包 传输到 /opt/tomcat 目录下

1649330608585

第三步:

解压,并启动tomcat

解压: tar -xzvf apache-tomcat-8.5.78.tar.gz

执行 tomcat/bin/目录下的 startup.sh 脚本 。

第四步:

由于开启了防火墙,所以不需手动开启 8080 端口

开启8080端口:firewall-cmd --permanent --add-port=8080/tcp

重新加载: firewall-cmd --reload

开启/关闭后必须重新加载,不然不会生效。

只需要将 html 放在 /opt/tomcat/apache-tomcat-8.5.78/webapps/ROOT 目录下即可访问页面。

3、安装 MySQL

Windows 安装

详情查看文档。

C:\05_Linux\资料

1、安装在/usr/local/mysql 目录下
# 在线安装 8.0 版本
2. wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
3. rpm -ivh mysql80-community-release-el7-5.noarch.rpm
4、yum -y install mysql-community-server

==============================此时就已经安装完 mysql了 

10、systemctl start mysqld.service 
 #查询数据库的初始密码 
11、grep "password" /var/log/mysqld.log
#A temporary password is generated for root@localhost:  后面的就是初始密码
12、mysql -u root   -p    # 登录mysql
==================================================
13、# 如果此时输入密码正确,但是报错 28000 
	#Access denied for user 'root'@'localhost' (using password: YES)
	# 在这个配置文件中加入 skip-grant-tables 
14、vim /etc/my.cnf 
# 不用输入密码,直接回车即可
15、mysql -u root   -p 

登录之后设置密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

但是会报错:image-20220921115050325

密码过于简单,不符合规则,那么好,咱就修改一下密码规则:

# 版本5.7 之前
set global validate_password_policy=0;
set global validate_password_length=1;
# 8.0 之后
set global validate_password.policy=0; # 密码安全级别
set global validate_password.length=6; # 密码长度

又报错了:

image-20220921115247877

意思是:只有重置完密码之后才能进行别的操作。

因此只能将密码先设置成复杂的,然后再设置密码规则:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'ucih-jjkx0aG';

设置密码规则:

set global validate_password.policy=0;
set global validate_password.length=6;

设置密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

image-20220921115544380

十八、Shell 编程

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

1649397593511

简单来说我们在Linux终端敲的命令,并不会直接被Linux 内核执行,而是通过 Shell 命令解析器 将我们敲的命令转化成 Linux 内核 能够执行的 命令。

这有点类似有我们学的高级语言,最终都会通过编译器编译成 机器语言。

1、Shell 脚本的执行方式

脚本格式要求

  1. 脚本以#!/bin/bash开头

  2. 脚本需要有可执行权限 。

实例一:输出一个 hello , world

#!/bin/bash   指明脚本类型
echo "hello,world"   输出 hello world

脚本的执行方式:

  • 创建的 脚本默认是没有 x 权限,想要执行需要赋给 x 权限。 chmod u+x 文件名
    • ./hello.sh ---- 相对路径
    • /root/shcode/hello.sh ----绝对路径
  • 使用 sh 文件名 的方式

2、Shell 中的变量

引用任何变量都需要使用: $变量名 的格式

(1)系统变量

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

2)系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER 等等

比如: echo $HOME 等等…

3)显示当前shell中所有变量:set

(2)自定义变量

1)定义变量:变量名=值

2)撤销变量:unset 变量

  1. 声明静态变量:readonly 变量注意:不能unset

案例1:定义变量A

案例2:撤销变量A

案例3:声明静态的变量B=2,不能unset

#!/bin/bash
#案例一:定义变量A
A=1000
#输出变量需要加上$
echo A=$A
#也可以通过这种方式进行输出变量
echo "A=$A"
#案例二:撤销变量A
unset A
echo A=$A
#案例三:声明静态变量B=2,,不能unset
readonly B=2
#静态变量不能 unset
unset B
echo B=$B

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

  2. 等号两侧不能有空格

  3. 变量名称一般习惯为大写 (规范)

将命令的返回值赋给变量

1)

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

2)A=$(date) 等价于反引号

#将命令执行的结果赋值给变量
C=`date`
D=$(date)
echo C=$C
echo D=$D

#运行结果:
C=2022年 04月 08日 星期五 14:32:22 CST
D=2022年 04月 08日 星期五 14:32:22 CST

(3)设置环境变量
  • export 变量名=变量值 (功能描述:将shell变量输出为环境变量/全局变量)
    • 比如说:如果多个 shell 文件都会用到一个 变量那么就可以将该变量设置为 环境变量
  • source 配置文件 (功能描述:让修改后的配置信息立即生效)
  • 设置为环境变量后,必须 source 以下,使配置的环境变量生效
  • echo $变量名 (功能描述:查询环境变量的值)

**实例一:**在/etc/profile文件中定义TOMCAT_HOME环境变量

#/etc/profile中增加: 
export TOMCAT_HOME=/opt/tomcat
#保存退出
#终端输入,务必 source 以下 :
source /etc/profile 

**实例二:**查看环境变量TOMCAT_HOME的值

echo $TOMCAT_HOME

实例三: 在另外一个shell程序中使用 TOMCAT_HOME

#使用TOMCAT_HOME 环境变量
echo  TOMCAT_HOME=$TOMCAT_HOME

shell 中的 多行注释:

:<<!
	多行注释
!
(4)位置参数变量

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

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

$n: (功能描述:n为数字,$0代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参 数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10})

$ ∗ :(功能描述:这个变量代表命令行中所有的参数, * :(功能描述:这个变量代表命令行中所有的参数, :(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)

$ @ : (功能描述:这个变量也代表命令行中所有的参数,不过 @:(功能描述:这个变量也代表命令行中所有的参数,不过 @:(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)

$#:(功能描述:这个变量代表命令行中所有参数的个数)

在 for 循环中 会体验出 $@ $* 的不同

(5)预定义变量

就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

$$ (功能描述:当前进程的进程号(PID))

$! (功能描述:后台运行的最后一个进程的进程号(PID))

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正 确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正 确了。)

3、运算符

  1. $((运算式)) $[运算式 ]

  2. expr m + n

​ 注意expr运算符间要有空格 ,如果希望将运算结果作为返回值需要使用 ``

  1. expr m - n

  2. expr *, /, % 乘,除,取余 注意 乘法 前面有一个 \

案例1:计算(2+3)✖️ 4的值

案例2:请求出命令行的两个参数[整数]的和

#!/bin/bash
#案例1:计算(2+3)* 4的值 
#第一种方式
res1=$(((2+3)*4))
echo res1=$res1
#第二种方式,推荐使用
res2=$[(2+3)*4]
echo res1=$res2
#第三种方式
res3=`expr 2 + 3 `
res4=`expr $res3 \* 4`
echo res3=$res4
#案例2:请求出命令行的两个参数[整数]的和
SUM=$[$1+$2]
echo SUM=$SUM


4、if 条件判断

[ condition ](注意condition前后要有空格, 后面所有的条件判断均有空格)

[ atguigu ] 返回 true

[] 返回 false

[ condition ] && echo OK || echo notok 条件满足,执行 && 后面的语句,条件不满足执行 || 后面的语句

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

if [ 条件判断式 ]
then						条件为真执行下面的程序 
	程序
fi 	.						代表结束	

或者

if [ 条件判断式 ] 
then 
	程序
elif [ 条件判断式 ]
then
	程序
fi

常用判断条件

1)俩个字符串比较使用 =

1) 两个整数的比较

-lt 小于 less than

-le 小于等于 less equal

-eq 等于 eq

-gt 大于

-ge 大于等于

-ne 不等于

2) 按照文件权限进行判断

-r 有读的权限

-w 有写的权限

-x 有执行的权限

3) 按照文件类型进行判断

-f 文件存在并且是一个常规的文件

-e 文件存在

-d 文件存在并是一个目录

应用实例

案例1:“ok"是否等于"ok” 使用 = 判断

案例2:23是否大于等于22 使用 -ge

案例3:/root/shcode/aaa.txt 目录中的文件是否存在 ,使用 -f

#!/bin/bash
#案例1:"ok"是否等于"ok"  使用 = 判断
if [ "ok" = "ok" ]
then
        echo "equal"
fi
#案例2:23是否大于等于22   使用 -ge 
if [ 23 -ge 22 ]
then
        echo "大于等于"
fi
#案例3:/root/shell/aaa.txt 目录中的文件是否存在 ,使用 -f
if [ -f /root/shcode/aaa.txt  ]
then
        echo "文件存在"
fi

案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出 “及格了”,如果小于

60,则输出 “不及格”

#!/bin/bash
if [ $1 -ge 60 ]
then
        echo "成绩及格"
elif [ $1 -le 60 ]
then
        echo "成绩不合格"
fi

5、case 语句

基本语法:

case $变量名  in  

"值1") 

如果变量的值等于值1,则执行程序1  

;;  

"值2") 

如果变量的值等于值2,则执行程序2  

;;  

…省略其他分支…  

*) 

如果变量的值都不是以上的值,则执行此程序 

;;  

esac

**案例1 :**当命令行参数是 1 时,输出 “周一”, 是2 时,就输出"周二", 其它情况输出 “other”

#!/bin/bas
#当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other"h
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "Other"
;;
esac

6、for 循环

基本语法一:

for 变量 in 值1 值2 值3…  
do  
程序 
done 

**案例1 :*打印命令行输入的参数 [分析 $ 和 $@ 的不同]

#!/bin/bash
#案例1 :打印命令行输入的参数 分析 $* $@ 的区别
for i in "$*"
do
        echo i=$i
done

echo "==================="

for i in "$@"
do
        echo i=$i
done

输出结果:

1649406085950

$* : 所有的参数都会获取到,但是会拼接成一个整体

$@ : 所有的参数都会获取到,不会拼接成一个整体,每一个参数都会分隔开

基本语法二:

for (( 初始值;循环控制条件;变量变化 ))     # 注意 初始值 和 变量变化 与括号之前是由空格的
do 
程序
done

案例1 :从1加到100的值输出显示

案例2 :获取位置参数,并进行循环加和

#!/bin/bash
#案例1 :从1加到100的值输出显示
SUM=0
for (( i=1; i<=100; i++ ))    # 注意 里面括号内 俩边有空格。
do
        # 这里进行求和
        SUM=$[ $SUM+$i ]
done
echo "总和 SUM=$SUM"
#案例2 :获取位置参数,并进行循环加和
echo "============================"
SUM2=0
for (( i=1; i<=$1; i++ ))
do
        # 这里进行求和
        SUM2=$[ $SUM2+$i ]
done
echo "总和 SUM2=$SUM2" 

7、while 循环

基本语法:

while [ 条件判断式 ]    # 注意空格!注意空格!注意空格!
do 
程序
done

**案例1 :**从命令行输入一个数n,统计从 1+…+ n 的值是多少?

#!/bin/bash
#案例1 :从命令行输入一个数n,统计从 1+..+ n 的值是多少?
i=0
SUM=0
while [ $i -le $1 ]
do
        SUM=$[ $SUM+$i ]
        # 变量 i+1, 不支持 i++
        i=$[ $i+1 ]
done
echo "1~$1 的加和=$SUM"

8、read 控制台输入

read 选项 参数

选项:

-p: 指定读取值时的提示符;

-t: 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。

参数

变量:指定读取值的变量名

**案例1:**读取控制台输入一个num值

**案例2:**读取控制台输入一个num值,在10秒内输入。

#!/bin/bash
#案例1:读取控制台输入一个num值 
read -p "请输入一个数" NUM1
echo "NUM1=$NUM1"
#案例2:读取控制台输入一个num值,在10秒内输入。
read -p "请输入一个数" -t 10 NUM2
echo "NUM2=$NUM2

9、函数

(1)系统函数

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中, 我们这里就介绍两个。

第一个系统函数: basename

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

基本语法: basename [pathname] [suffix]

pathname : 为文件路径。如果不指定 suffix 会将最后一个 / 后边的内容获取到。比如:

basename /home/aaa/a.text	--->  结果为: a.txt

suffix : 指定截取的后缀

basename /home/aaa/a.text  .text	--->  结果为: a
第二个系统函数: dirname

**功能:**与 basename 正好相反 ,会获取到 最后一个 / 前面的路径,常用于获取文件路径

基本语法: dirname 文件绝对路径

dirname  /home/aaa/a.text  .text	--->  结果为: /home/aaa
(2)自定义函数

基本语法:

function  funname(){

 方法体
[return int;]
}

调用直接写函数名:funname 值

**实例一:**计算输入两个参数的和【要求动态的获取俩个参数】, getSum

#!/bin/bash
#3、编写方法
function getSum(){

        SUM=$[ $n1+$n2 ]
        echo "和是$SUM"

}

#1、动态获取 n1 和 n2 的值
read -p "请输入n1=" n1
read -p "请输入n2=" n2

#2、调用方法
getSum $n1 $n2

10、Shell 变成综合案例—备份数据库

  1. 每天凌晨 2:10 备份 数据库 test 到 /data/backup/db/

  2. 备份开始和备份结束能够给出相应的提示信息

  3. 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:

2018-03-12_230201.tar.gz

  1. 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
cround -e  --》 设置 任务调度 ---》执行 shell 脚本
shell脚本里完成 备份,提示信息,打包,删除操作

目录关系: /data/backup/db/2018-03-12_230201/2018-03-12_230201.sql.gz

应该是将 2018-03-12_230201 以及目录下的 2018-03-12_230201.sql.gz 文件打包成:2018-03-12_230201.tar.gz

第一步:

在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本。

之所以是在 /usr/sbin 目录下创建脚本,是因为在该目录下的文件是 root 管理才能执行的 。

#!/bin/bash
#备份目录的位置
BACKUP=/data/backup/db
#获取当前时间 2018-03-12_230201.tar.gz
DATETIME=$(date +%Y-%m-%d_%H%M%S)

#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=yangzhaoguang
#备份数的据库名
DATABASE=test
#创建备份目录,如果不存在就创建,存在就不创建
[ ! -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}
#删除10天前的 *.tar.gz
find ${BACKUP} -atime +10 -name "*.tar.gz" |  rm -rf
#提示信息
echo "备份数据库${DATABASE}信息成功"

第二步:

设置定时任务 crontab -e

30 2 * * * /usr/sbin/mysql_db_backup.sh    # 这里注意一个问题,编写完命令,将光标回退一格。再按ESC保存退出。

十九、安装 CenTOS8.1

1649485596577

在生产环境下可直接选择最小安装

其余步骤和CentOS 7 安装步骤一模一样。

二十、日志文件

1、日志介绍

  • 日志文件是重要的系统信息文件,其中记录了许多重要的系统时间,包括用户的登录信息,系统的启动信息,系统的安全信息,邮件的相关信息,各种服务相关信息。
  • 日志对于安全来说也很重要,他记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者收到攻击时攻击者留下的痕迹
  • 日志是用来记录重大事件的。

所有的日志文件都在:/var/log 目录下

日志名字作用
/var/log/boot.log记录系统在引导过程中发生的事件,即linux系统开机自检过程显示的信息
var/log/cron记录与系统定时任务相关的日志
var/log/cups记录打印信息的日志
var/log/dmesg记录了系统在开机时内核自检的信总,也可以使用 dmesg 命令直接查看内核信息
/var/log/btmp记录linux登陆失败的用户,时间和远程IP,二进制文件,需要使用 lastb 命令查看
/var/log/lastlog记录最后一次用户成功登陆的时间,IP等信息,使用命令 lastlog 查看
/var/log/mailog记录邮件信息的日志
/var/log/messages包括整体系统普通信息,其中也包含系统启动期间的日志。此外,还包括mail,cron,daemon,kern,auth等内容.
/var/log/securelinux系统安全日志,记录用户和工作组变坏情况,用户登陆认证情况
/var/log/wtmp此日志文件永久记录每个用户登录,注销及系统的启动,停机的事件,用last查看
/var/log/utmp记录有关当前登录的每个用户的信息。使用 who,w,users,finger 访问此文件

2、日志管理服务

CentOS7 .6 的日志服务是 rsyslogd ,CentOS 6 的日志服务是 syslogd ,rsyslogd 的日志服务功能更强大。

rsyslogd 和 rsyslogd 是兼容的。

通过 rsyslog 的服务对 所有配置文件进行管理 。

实例一: 查看 Linux 的中rsyslogd 服务是否启动

systemctl status rsyslog.service

**实例二:**查看 rsyslog 服务的自启动状态

systemctl is-enabled rsyslog.service

🔴 3、日志配置文件

/etc/rsyslog.conf:配置文件路径

该配置文件指明了 什么级别的日志信息保存到 哪个日志当中。

文件的格式: *.* 存放日志文件

其中第一个 * 代表日志类型,第二个 * 代表日志级别

日志类型分为:

服务名称服务说明
auth(LOG_AUTH)安全和认证相关消息(不推荐使用 authpriv 替代)
authpriv(LOG_AUTHPRIV)ssh、ftp安全和认证相关消息(私有的)
cron(LOG_CRON)系统定时任务 cront 和 at 产生的日志
kern(LOG_KERN)内核产生的日志(不是用户进程产生的)
lpr(LOG_LPR)打印产生的日志
mail(LOG_MAIL)邮件收发信息
news(LOG_NEWS)与新闻服务器相关的日志
user(LOG_USER)用户等级类别的日志信息
uucp(LOG_UUCP)uucp 子系统的日志信息,uucp 是早期 linux 系统进行数 据传递的协议,后来也常用在新闻组服务中。
local0-local7(LOG_LOCAL0-7)为本地使用预留的服务
syslog(LOG_SYSLOG)有 syslogd 服务产生的日志信息虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了 syslogd 的,这里 并没有修改服务名。

日志级别:

等级名称等级说明
debug(LOG_DEBUG)一般的调试信息说明
info(LOG_INFO)基本的通知信息
notice(LOG_NOTICE)普通信息,但是有一定的重要性
warning(LOG_WARNING)警告信息,但是还不回影响到服务或系统的运行
err(LOG_ERR)错误信息,一般达到 err 等级的信息以及可以影响到服务或系 统的运行了
crit(LOG_CRIT)临界状况信息,比 err 等级还要严重
alert(LOG_ALERT)警告状态信息,比 crit 还要严重。必须立即采取行动
emerg(LOG_EMERG)疼痛等级信息,系统已经无法使用了
none忽略这个日志服务,该服务的 所有日志都不再记录。
从上到下、级别从低到高,记录的信息越来越少

由日志服务 rsyslog 服务记录的信息一般由以下四部分组成:

  • 事件产生的时间;
  • 发生事件的服务器的主机名;
  • 产生事件的服务名或程序名;
  • 事件的具体信息。

1649490643635

实例:自定义日志功能, 将 登录,重启 等信息保存到自定义的日志中。

/etc/rsyslog.conf 配置文件中增加规则:*.* /var/log/customer.log

将所有级别的信息都保存在 customer.log 这个日志当中。

4、日志轮替

日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名

之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中“dateext”参数:

  • 如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure–20180605”。这样的话日志文件名不会重叠,所以也就不需要日志文件的改名, 只需要保存指定的日志个数,删除多余的日志文件即可。

  • 如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。**当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,**用来保存新的日志,以此类推。

1649492090791

/etc/logrotate.conf 中可以配置 全局日志轮替规则:

# see "man logrotate" for details
# rotate log files weekly -- 每周对日志文件进行一次轮替
weekly

# keep 4 weeks worth of backlogs -- 共保存 4 份日志文件
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
# 会将 /etc/logrotate.d 这个目录下的文件读取进来。
include /etc/logrotate.d

# system-specific logs may be also be configured here.
#下面是单独设置某个日志文件轮替规则,优先级更高

也可以把某个日志轮替规则文件写到 /etc/logrotate.d 目录下 :


# 为 /var/log/boot.log 日志 设置轮替规则
/var/log/boot.log
{
    missingok   # 如果日志不存在,忽略该日志的警告信息
    daily   	# 每日对文件进行一次轮替
    copytruncate # 
    rotate 7  # 共备份 7 次
    notifempty #如果日志为空,则不进行轮替
}

1649492709910

轮替命令作用
daily日志的轮替周期是每天
weekly日志的轮替周期是每周
monthly日志的轮替周期是每月
rotate 数字保留的日志文件的个数;0 表示没有备份
compress日志轮替时,旧的日志进行压缩
create mode owner group建立新日志,同时指定新日志的权限与所有者和所属组
mail address当日志轮替时,输出内容通过邮件发送到指定的邮件地址
missingok如果日志不存在,则忽略该日志的警告信息
notifempty如果日志为空文件,则不进行日志轮替
minsize 大小日志轮替的最小值。也就是日志一定要达到这个最小值才会轮 替,否则就算时间达到也不轮替
size 大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。 如 size 100k
dateext使用日期作为日志轮替文件的后缀
sharedscripts在此关键字之后的脚本只执行一次
prerotate/endscript在日志轮替之前执行脚本命令。endscript 标示 prerotate 脚本结束
postrotate/endscript在日志轮替之后执行脚本命令。endscript 标示 postrotate 脚本结束

实例一:将刚刚创建的日志 /var/log/customer.log 设置轮替规则:

方法一: 直接在 /etc/logrotate.conf 文件中为日志设置轮替规则

方法二:在 /etc/logrotate.d / 目录下创建一个新的文件,为 日志设置轮替规则

建议使用方法二,如果都在 /etc/logrotate.conf 中设置,不利于维护。

/var/log/customer.log
{ 
    missingok
    daily
    copytruncate
    rotate 7
    notifempty
}

5、logrotate 命令

我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务;/etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件,通过logrotate 这个文件依赖定时任务执行的

命令格式:logrotate [选项] 配置文件名

选项:

  • -v: 显示日志轮替过程。加了-v 选项,会显示日志的轮替的过程
  • -f: 强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有 的日志进行轮替

6、内存日志

journalctl 可以查看内存日志。

journalctl 查看全部

journalctl -n 3 查看最新的三条

journalctl --since 19:00 --until 19:10:10 查看起始时间到结束时间的日志,可以加日期

journalctl -p err 报错日志

journalctl -o verbose 日志详细内容

journalctl _PID=123 _COMM=sshd 查看包含这些参数的日志

或者 journalctl | grep sshd

内存日志 重启就会被清空

二十一、定制自己的 Linux

通过对Linux中一些用不到的功能进行裁剪,创建属于自己的 Linux 系统。

Linux 启动流程:

1649557784895

实现自定义 Linux 系统的步骤 :

1649570473517

第一步:

在原始 Linux 中创建 sdb 硬盘,大小 20G ,创建完重启虚拟机,并进行分区

在为新硬盘取名字时。要和其他硬盘区分开。方便后面容易找到

1649558868554

1649570121264

分区结果:

1649559641377

初始化分区:

mkfis -t ext4 /dev/sdb1

mkfis -t ext4 /dev/sdb2

**创建目录: **

mkdir -p /mnt/boot /mnt/sysroot

1649567147337

进行挂载:

mount /dev/sdb1 /mnt/boot

mount /dev/sdb2 /mnt/sysroot

使用 lsblk 命令检查一下:

1649567268862

第二步:

安装grub, 内核文件拷贝至目标磁盘

grub2-install --root-directory=/mnt /dev/sdb

检查是否安装:

hexdump -C -n 512 /dev/sdb

拷贝 /boot/ * 下的文件 到 新创建的目录: /mnt/boot/ 下

cp -rf /boot/* /mnt/boot/

第三步:

修改 /mnt/boot/grub2/ grub.cfg 文件

1649568853726

  • 在 grub.cfg 描述了 boot 分区 和 / 分区对应的 UUID ,修改成 sdb 对应的 UUID 即可。
  • /mnt/boot/grub2/ grub.cfg 文件,这个文件是我们刚从 sda1 分区上拷贝过来的,所以我们需要修改 该文件中对应的 UUID 号,改成 sdb 硬盘对应 UUID 。
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-27828a5d-7d2a-4474-a32f-a0cfb3bffc7f' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  979615d7-4331-4bc6-a279-f0392e235b57   # 这里是修改的,改成 sdb1的UUID 
        else
          search --no-floppy --fs-uuid --set=root 979615d7-4331-4bc6-a279-f0392e235b57  # 这里是修改的,改成 sdb1的UUID 
        fi  # 下面的 UUID 是修改的,改成 sdb2 的UUID 
        linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=UUID=77635142-6f03-4792-ae64-bade574023b9 ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8selinux=0 init=/bin/bash   # 在这里加上  init=/bin/bash
        initrd16 /initramfs-3.10.0-957.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-f65638842c9840178fe3de73f92d7d11) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-f65638842c9840178fe3de73f92d7d11-advanced-27828a5d-7d2a-4474-a32f-a0cfb3bffc7f' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  979615d7-4331-4bc6-a279-f0392e235b57    # 这里是修改的,改成 sdb1的UUID 
        else
          search --no-floppy --fs-uuid --set=root  979615d7-4331-4bc6-a279-f0392e235b57    # 这里是修改的,改成 sdb1的UUID 
        fi	# 下面的 UUID 是修改的,改成 sdb2 的UUID 
        linux16 /vmlinuz-0-rescue-f65638842c9840178fe3de73f92d7d11 root=UUID=77635142-6f03-4792-ae64-bade574023b9 ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet selinux=0 init=/bin/bash     # 在这里加上  init=/bin/bash
        initrd16 /initramfs-0-rescue-f65638842c9840178fe3de73f92d7d11.img
}

第四步:

创建目标主机根目录系统

mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}

第五步:

拷贝 sda 中的 命令库 到 sdb 中

cp /lib64/*.* /mnt/sysroot/lib64/

cp /bin/bash /mnt/sysroot/bin/

第六步:

创建新的虚拟机,将原有硬盘移除掉,指向 sdb

1649569927551

这时候很多指令都无法使用,只需要从原来的 Linux 系统中拷贝到 sdb 硬盘上就行了

root@hspedu100 ~]# mount /dev/sdb2 /mnt/sysroot/

[root@hspedu100 ~]# cp /bin/ls /mnt/sysroot/bin/

[root@hspedu100 ~]# cp /bin/systemctl /mnt/sysroot/bin/

[root@hspedu100 ~]# cp /sbin/reboot /mnt/sysroot/sbin/

二十二、备份与恢复

实体机无法进行快照,如果系统出现异常或数据损坏,后果严重,要重做系统,还会造成数据丢失。所以可以使用备份和恢复技术

Linux 的备份和恢复有俩种方式:

1、把需要的文件(或者分区) 用 tar 打包就行,下次需要恢复时,在解压覆盖即可

2、使用 dump 和 restore 命令。

安装 dump 和 restore

yum -y install dump

yum -y install restore

1、dump

dump 命令使用“备份级别”来实现增量备份,它支持 0~9 共 10 个备份级别。其中,0 级别指的就是完全备份,1~9 级别都是增量备份级别。

举个列子,当我们备份一份数据时,第一次备份应该使用 0 级别,会把所有数据完全备份一次;

第二次备份就可以使用 1 级别了,它会和 0 级别进行比较,把 0 级别备份之后变化的数据进行备份

第三次备份使用 2 级别,2 级别会和 1 级别进行比较,把 1 级别备份之后变化的数据进行备份,以此类推。

需要注意的是,只有在备份整个分区或整块硬盘时,才能支持 1~9 的增量备份级别;如果只是备份某个文件或不是分区的目录,则只能使用 0 级别进行完全备份

1649572439898

基本语法:

dump [选项] 备份之后的文件名 原文件或目录

常用的选项:

**-level:**level 就是我们说的 0~9 共 10 个备份级别;
-f 文件名:指定备份之后的文件名;
**-u:**备份成功之后,把备份时间、备份级别以及实施备份的文件系统等信息,都记录在 /etc/dumpdates 文件中;
-v:显示备份过程中更多的输出信息;
**-j:**调用 bzlib 库压缩备份文件,其实就是把备份文件压缩为 .bz2 格式,默认压缩等级是 2;
-W:显示允许被 dump 的分区的备份等级及备份时间;

查看备份时间文件:

cat /etc/dumpdates

1649574636255

**实例一:**将 /boot 分区 下的所有内容备份到 /opt/boo.bak0.bz2 文件中,备份层级为0

dump -0uj -f /opt/boo.bak0.bz2 /boot/

实例二: 在 /boot 目录下增加一个文件test.txt,随便写点内容,备份层级为1 , /opt/boo.bak1.bz2

dump -1uj -f /opt/boo.bak1.bz2 /boot/

查看俩次备份的文件有什么不同:

1649572969713

可以看到第一次与第二次备份的大小相差还是很大的,这是因为,第二次备份只会备份相对于第一次备份中多的内容,也就是 增量备份!

注意:

dump 命令也可以文件或目录,不过,只要不是备份分区,就只能使用 0 级别进行完全备份,而不再支持增量备份。同时,不能使用“-u”选项更新分区的备份时间,当然也不能使用“dump -W”命令查询到文件或目录的备份。

如果对文件或者目录使用其他级别的备份,就会报错:

1649574046416

#!/bin/bash
#设置备份的位置
BACKUP=/opt/dump
#设置备份的级别
LEVEL=0
#判断该目录是否存在,如果不存在就进行创建
[ ! -d "${BACKUP}"] && mkdir -p "${BACKUP}"
dump 

2、restore

restore 命令是 dump 命令的配套命令,dump 命令是用来备份分区和数据的,而 restore 命令是用来恢复数据的。

基本语法:

restore [模式选项] [-f] 指定备份的文件名

此命令中,-f 选项用于指定备份文件的文件名;restore 命令常用的模式有以下 4 种,这 4 种模式不能混用:

  • -C:比较备份数据和实际数据的变化。如果实际数据中的现有数据发生了变化,那么这个选项能够检测到这个变化。但是如果实际数据中新增了数据,那么这个选项是不能检测到变化的。举个例子:别人给我了 100 万元投资(实际数据),但是他有一个投资的账本(备份数据),他要时不时地比对账本和实际的 100 万元投资,如果 100 万元减少则马上就能发现改变;但是如果投资增加,则不会报警;
  • -i:进入交互模式,手工选择需要恢复的文件;
  • -t:查看模式,用于查看备份文件中拥有哪些数据;
  • -r:还原模式,用于数据还原

**实例一:**删除 /boot/test.txt 文件,使用 比较模式,测试有什么提示

1649576588274

会出现一个比较错误,找不到 test.txt 文件

也就是说,如果与备份的内容不一样他会报错的,但是如果增加文件/目录 ,他是不报错的。

还原模式:

restore 命令的还原模式既可以用于还原整个分区,也可以用于还原文件或目录。命令格式是一样的,不过要注意,如果要还原增量备份的数据,则一定要先还原完全备份的数据 ,其次按顺序恢复所有增量备份

restore -r -f boo.bak0.bz2

restore -r -f boo.bak1.bz2

千万注意、顺序不能错~~~~!!!!!

二十三、WebMin 工具的使用

下载: Index of /download/yum (webmin.com)

什么是 webmin ? 官方是这样描述的:

Webmin是一个基于Web的Unix系统管理界面。使用任何现代Web浏览器,您可以设置用户帐户,Apache,DNS,文件共享等等。Webmin消除了手动编辑Unix配置文件(如/etc/passwd)的需要,并允许您从控制台或远程管理系统。

安装步骤:

第一步:

下载好后,使用 xftp 工具传输到 /opt/webmin 下

第二步:

使用 rpm -ivh webmin-1.990-1.noarch.rpm --force --nodeps 命令安装

第三步:

修改root用户的密码。该 root 用户不是 Linux 系统的 root 管理员,而是 属于 webmin 中的 root

/usr/libexec/webmin/changepass.pl /etc/webmin/ root root

第一个root是root 用户,第二个root 是用户密码 。修改 为 root 密码

第四步:

修改端口号。默认是 10000 。

vim /etc/webmin/miniserv.conf

1649579310899

第五步:

webmin 相关的命令:

  • 启动:service webmin start
  • 停止:service webmin stop
  • 重启:service webmin restart

重启 webmin

第六步:

由于防火墙是开启的,所以需要开启我们配置好的端口号:8888

firewall-cmd --permanent --add-port=8888/tcp 打开 8888端口

firewall-cmd --reload 重载

firewall-cmd --zone=public --list-ports 查询所有已开放的端口

访问: 192.168.200.130:8888 【ip:端口号】

如果访问不成功,重启,重启不行换一个端口。

1649579408390

二十四、bt 宝塔

官网介绍“提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能。”还有他是免费的,收费功能针对技术支持等业务。所以直接用bt面板来建网站和管理网站了

安装步骤:

安装 wget 指令并且安装 bt :

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

&& 的作用就是 : 连接的俩条指令都会执行,类似于 |

安装成功后:

1649580933813

外网面板地址: http://123.182.163.244:8888/93313bbf
内网面板地址: http://192.168.200.130:8888/93313bbf
username: lzkj4fgy
password: e5de63d4

宝塔账号:

15511513972

Qq1209694409

输入 bt 可查看 bt 工具箱:

1649581014688

bt default 查看密码和用户名、网址

通过浏览器访问 提供的内网地址即可。~!

1649581284529

二十五、Linux 面试题

介绍常使用的指令:

1、cut 指令

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

基本语法:

cat [选项] [参数]

选项:

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。
  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

2、sort 命令

对文件进行排序 ,并输出排序结果

基本语法:

sort [选项] 文件名

-r以相反的顺序来排序
-n依照数值的大小排序

3、uniq 命令

uniq命令全称是“unique”,中文释义是“独特的,唯一的”。该命令的作用是用来去除文本文件中连续的重复行,中间不能夹杂其他文本行。去除了重复的,保留的都是唯一的,也就是独特的,唯一的了。

我们应当注意的是,它和sort的区别,sort只要有重复行,它就去除,而uniq重复行必须要连续,也可以用它忽略文件中的重复行

基本语法:

uniq [参数] [文件]

-c打印每行在文本中重复出现的次数
-d只显示有重复的纪录,每个重复纪录只出现一次
-u只显示没有重复的纪录

4、awk 命令

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

他的作用有点类似 cut 但是他比 cut 命令更加强大,就是他支持 脚本命令

基本语法:

awk [选项] '脚本命令' 文件名

F fs指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。

awk 的强大之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执行命令,如下所示:

'匹配规则{执行命令}' 注意是单引号

awk 使用数据字段变量

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:

  • $0 代表整个文本行;
  • $1 代表文本行中的第 1 个数据字段;
  • $2 代表文本行中的第 2 个数据字段;
  • $n 代表文本行中的第 n 个数据字段。

5、面试题1

1649588585958

获取中间的 ip 地址,并进行排序

思路: 使用 cut 命令 对 “/” 进行截取,指定显示 第三个 / 的区域,使用 sort 进行排序,最后使用 uniq 统计

cut -d "/" -f 3 1.txt | sort -r | uniq -c

6、面试题2

1649589421485

思路分析:

1、首先明白使用什么指令可以查看到图中的信息。没错就是 nestat --监控网络状态

2、明白在什么状态下表示 连接, 就是 ESTABLISHED 状态

3、Foreign Address 为远程连接的地址。也就是统计该列的 IP 地址

4、使用 awk 命令对数据字段进行分割。并使用 cut 命令 对 : 进行分割,获取前面的 id 地址。

5、sort排序,uniq统计

netstat -an | grep ESTABLISHED | awk '{print $5}'| cut -d ":" -f 1 |sort -r | uniq -c

7、面试题3

如果忘掉了 mysql 的密码。如何找回

第一步:

vim /etc/my.cnf 配置文件中增加 以下代码 :

1649591386928

表示 跳过权限检查,不用输入密码可直接进入 mysql。

修改完记得重启服务 : service mysqld restart

第二步:

登录到 mysql 后,有一个mysql数据库,里面有一张 user 表 。user 表中的 authentication_string 字段就是 mysql 的原生密码。只需要修改这个字段的密码即可。

use mysql ; #使用 mysql 数据库
desc user ;  #  user 表
update user set authentication_string=password("想要修改的密码") where user='root'; #重置密码
flush privileges;  # 刷新
exit ; 
修改完密码,将  /etc/my.cnf  中增加的那个代码注释掉。就 OK 了。

8、面试题4

1649598471664

192.168.13.20  aaa.html
192.168.13.20  aaa.html
192.168.13.20  aaa.html
192.168.13.10  aaa.html
192.168.13.50  aaa.html
192.168.13.40  aaa.html
192.168.13.30  aaa.html
192.168.13.30  aaa.html
192.168.13.20  aaa.html
192.168.13.10  aaa.html

思路:

1、使用 cut 或者 awk 进行分割,取到前面的 IP

2、使用 sort 进行排序

3、使用 uniq 统计每个IP 出现的次数

4、统计完,对次数进行排序,降序

5、head 输出前俩条

cut -d " " -f 1 2.txt | sort | uniq -c | sort -r | head -2

1649599016953

9、面试题5

如果你是系统管理员,在进行 Linux 系统权限划分时,应该考虑哪些因素?

1、首先阐述 Linux 权限的主要对象

1649645493023

1649645669600

1649645943797

10、面试题6

1649646921244

1649647696959

(1)yes、no、yes

文件只读,当然是不能修改。文件是否能删除,取决于它所属的目录是否有 w 权限

(2)no,no,no

cd 目录都进不去,更别说其他操作 了

(3)yes ,no,no

文件的修改取决于文件是否有 w 权限,文件的删除取决于 所属目录是否有 w 权限。

(4)yes,no,yes

11、面试题 7

列举 Linux 高级命令,至少 6 个

  • nestat 网络状态监控
  • top 系统运行状态监控
  • lsblk 查看硬盘分区情况
  • find
  • ps -aux 查看系统运行进程
  • chkconfig 查看服务启动状态
  • systemctl 管理系统服务
  • awk 文本编辑命令

12、面试题8

1649663273921

1649663394352

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨瓜2号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值