• 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

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

    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  //设置运行级别
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    设置运行级别 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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
    
    • 1
    • 2

    第五步:让 刚才配置的 /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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    登录之后设置密码

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

    但是会报错: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; # 密码长度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    又报错了:

    image-20220921115247877

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

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

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

    设置密码规则:

    set global validate_password.policy=0;
    set global validate_password.length=6;
    
    • 1
    • 2

    设置密码:

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

    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
    
    • 1
    • 2

    脚本的执行方式:

    • 创建的 脚本默认是没有 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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    定义变量的规则

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

    2. 等号两侧不能有空格

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

    将命令的返回值赋给变量

    1)

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

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

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

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

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

    echo $TOMCAT_HOME
    
    • 1

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

    #使用TOMCAT_HOME 环境变量
    echo  TOMCAT_HOME=$TOMCAT_HOME
    
    • 1
    • 2

    shell 中的 多行注释:

    :<<!
    	多行注释
    !
    
    • 1
    • 2
    • 3
    (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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    常用判断条件

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    60,则输出 “不及格”

    #!/bin/bash
    if [ $1 -ge 60 ]
    then
            echo "成绩及格"
    elif [ $1 -le 60 ]
    then
            echo "成绩不合格"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5、case 语句

    基本语法:

    case $变量名  in  
    
    "值1") 
    
    如果变量的值等于值1,则执行程序1  
    
    ;;  
    
    "值2") 
    
    如果变量的值等于值2,则执行程序2  
    
    ;;  
    
    …省略其他分支…  
    
    *) 
    
    如果变量的值都不是以上的值,则执行此程序 
    
    ;;  
    
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    #!/bin/bas
    #当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other"h
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    *)
    echo "Other"
    ;;
    esac
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6、for 循环

    基本语法一:

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

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

    #!/bin/bash
    #案例1 :打印命令行输入的参数 分析 $* $@ 的区别
    for i in "$*"
    do
            echo i=$i
    done
    
    echo "==================="
    
    for i in "$@"
    do
            echo i=$i
    done
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出结果:

    1649406085950

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

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

    基本语法二:

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

    案例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" 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    7、while 循环

    基本语法:

    while [ 条件判断式 ]    # 注意空格!注意空格!注意空格!
    do 
    程序
    done
    
    • 1
    • 2
    • 3
    • 4

    **案例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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9、函数

    (1)系统函数

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

    第一个系统函数: basename

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

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

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

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

    suffix : 指定截取的后缀

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

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

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

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

    基本语法:

    function  funname(){
    
     方法体
    [return int;]
    }
    
    调用直接写函数名:funname 值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    **实例一:**计算输入两个参数的和【要求动态的获取俩个参数】, 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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脚本里完成 备份,提示信息,打包,删除操作
    
    • 1
    • 2

    目录关系: /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}信息成功"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    第二步:

    设置定时任务 crontab -e

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

    十九、安装 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.
    #下面是单独设置某个日志文件轮替规则,优先级更高
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

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

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    第四步:

    创建目标主机根目录系统

    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 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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 了。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    思路:

    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

  • 相关阅读:
    iperf/iperf3 测试网络性能
    有效三角形的个数 ---- 双指针
    DeOldify 接口化改造 集成 Flask
    深度学习课后week2 编程(识别猫)
    ensp基础命令大全(华为设备命令)
    C++核心编程 day09 类型转换、异常、输入输出流
    Java从入门到精通-流程控制(一)
    Vue实战篇三十二:实现新闻的无限加载
    【docker】Mac M1 构建 x64 linux镜像
    Hadoop编程——第一章:大数据概念
  • 原文地址:https://blog.csdn.net/aetawt/article/details/126480415