翼度科技»论坛 云主机 LINUX 查看内容

Linux笔记

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
目录

1、Linux入门

1.1、Linux介绍

Linux的应用领域:

  • 个人桌面领域的应用:Linux应用的薄弱环节。
  • 服务器领域:最专业的领域,liunx免费、稳定、高效等特点得到很好的体现。
  • 嵌入式领域:linux运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百kb等特点。
    主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等,以后在物联网中应用会更广泛。
1.2、概述


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

Unix是由Ken Tompson 和Dennis richres开发的适用于大型服务器的系统
Linux是由Linus Torvads在Unix基础上开发的适用于x86个人计算机的系统,全称:GNU/Linux


2、VM和Linux的安装

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

安装步骤:

  • 安装virtual Machine ware Workstation16
    激活密钥(批量激活):
    ZF3R0-FHED2-M80TY-8QYGC-NPKYF
    YF390-0HF8P-M81RQ-2DXQE-M2UT6
    ZF71R-DMX85-08DQY-8YMNC-PPHV8

  • 安装Linux(CentOS 7.6/CentOS 8.5
  • VM和Linux的关系:


  • Linux磁盘的手动分区:

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

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


桥接模式
VMWare会虚拟一块网卡和真正的物理网卡就行桥接,这样,发到物理网卡的所有数据包就到了VMWare虚拟机,而由VMWare发出的数据包也会通过桥从物理网卡的那端发出。桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接。相当于在一个局域网内创立了一个单独的主机,他可以访问这个局域网内的所有的主机。该模式下主机网卡和虚拟机网卡的IP地址处于同一个网段,子网掩码、网关、DNS等参数都相同。但是同一网段下最多有255种ip地址,超过数量就会造成ip冲突
桥接模式下虚拟机和主机在网络上地位相等,可以理解为一台新的电脑。
NAT模式
nat地址转换 虚拟系统通过本主机与外部系统通信,不造成ip冲突,而且外部系统无法进入到虚拟系统与虚拟系统通信。
主机系统
主机模式:独立的系统,不和外部发生联系。
2.3、虚拟机的克隆

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

  • 方式1:直接拷贝一份安装好的虚拟机文件
    在我的电脑中找到要克隆的虚拟机的文件,赋值后粘贴到另一个位置,在 vmware 中打开就好了。
  • 方式2:使用 vmware 的克隆操作(注意:克隆时,需要先关闭 linux 系统 先关机)
    在 vmware 中鼠标右击要克隆的虚拟机---->管理---->克隆---->克隆方法

    • 克隆方法:

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


2.4、虚拟机的快照

如果在使用虚拟机系统的时候(比如 linux),想回到原先的某一个状态,担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态,vmware 也提供了这样的功能,就叫快照管理
方法:对左栏虚拟机鼠标右击--->快照--->拍摄快照,查看快照管理器,点击要回到的快照图标,转到快照记录的虚拟机状态。
注意:每次拍摄一个快照都是对当前状态进行保存,会占用硬盘空间,做有意义的快照。

2.5、安装vmtools


  • vmtools 安装后,可以让我们在 windows 下更好的管理 vm 虚拟机
  • 可以设置 windows 和 centos 的共享文件夹 (主机和虚拟系统都可以操作共享文件夹,更加方便)
2.6、设置共享文件夹

在主机上找到一个位置创建一个文件夹作为共享文件夹
然后在vm上操作:鼠标右击虚拟系统--->设置--->选项--->共享文件夹--->添加(将上述文件夹路径填上就好了)
点击主文件夹--->其他位置--->计算机---->mnt---->hgfs--->共享的文件夹
注意:在实际开发中,文件的上传下载是需要使用远程方式完成的。因为是主机A与主机B上的虚拟系统通信。
3、Linux的目录结构(⭐)

3.1、目录结构的基本介绍

linux 的文件系统是采用级层式的树状目录结构, 在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。
经典名言:在 Linux 世界里,一切皆文件(!!!)

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

  • /root:存放root用户的文件
  • /bin:存放linux常用指令
  • /boot:linux启动时需要的文件
  • /home:每创建一个用户,在home目录下都会有一个对应用户名的文件夹
  • /dev:设备管理器(linux会把所有硬件映射成文件来管理 ——> Linux下一切皆文件!)
Linux目录结构都是规定好的,需要会背!(实际开发环境中都是使用小黑窗口操作linux系统)
3.2、具体的目录结构

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

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

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

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

4.2、远程登录工具Xshell


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

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

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

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


  • 是一个基于 windows 平台的功能强大的 SFTP、FTP 文件传输软件。
  • 使用了 Xftp 以后,windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件
注意:xftp打开时乱码:属性--->选项--->UTF-8编码

5、Vi 和 Vim编辑器

5.1、vi和vim基本介绍

Linux 系统会内置 vi 文本编辑器。
Vim可以看作是Vi的增强版本,Vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富。
5.2、vi和vim常用三种模式


  • 正常模式(默认模式,一般模式)
    以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。
    在这个模式中,可以使用『上下左右』按键来移动光标
    可以使用『删除字符』『删除整行』来处理档案内容,
    也可以使用『复制、粘贴』来处理你的文件数据。
  • 插入模式
    一般模式下,按『i』键进入编辑模式(按下 i, I, o, O, a, A, r, R 中任何一个字母之后都会进入编辑模式,一般按『i』键,表示insert插入)后,可以在当前文件中执行写入操作
  • 命令模式
    一般模式下,按『:』键 或 『/』键 进入命令模式(注意:如果是按冒号,必须是英文状态下的冒号)
    在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开 vim,显示行号等动作,输入指令后需要按『Enter』键执行指令。
5.3、vim三种模式的切换


5.4、vim常用快捷键

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


  • 初始在正常模式,输入/,进入命令行模式,然后输入要查找的单词,回车查找
  • 输入n查找到下一个
  • 想查找另一个单词:输入/,重复上述即可
给文件每行设置行号


  • 先按『:』键
  • 然后输入set nu  (set number)
  • 按『Enter』键
取消行号


  • 先按『:』键
  • 然后输入set nonu  (set none number)
  • 按『Enter』键
修改主机名

指令:hostnamectl set-hostname 新主机名
其他快捷键


  • 快捷键到该文档的最首行(正常模式下):gg
  • 快捷键到该文档的最末行(正常模式下):G
  • 撤销动作(比如删除某一行,发现删错了,然后恢复这一行)(正常模式):u
  • 在某个文件中,想让光标移动到第n行(正常模式):输入n,然后再按『shift+g』
5.5、vim键位图



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

6.1、关机和重启命令

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

用户登录:
登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。
而且以后也用不到root,除非你是系统管理员。
可以利用普通用户登录,登录后再用 su - 用户名 命令来切换成系统管理员身份.
注销:在提示符下输入 logout  即可注销用户
注意:logout 注销指令在图形运行级别无效,在运行级别 3 下有效.
7、用户管理

7.1、基本介绍

Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
一个Linux系统中只有一个root用户,但是由root用户可以创建多个其他用户,可以给这些用户分配权限,
其中每个用户会对应一个目录,这个目录称为家目录。
7.2、添加用户

语法:
  1. useradd 用户名
  2. useradd milan
复制代码
注意:当创建用户成功后,会自动创建和用户同名的家目录,该用户的家目录默认在home目录下
也可以给新用户指定家目录:useradd -d 指定目录 新用户名
比如:useradd -d /home/test king -> 创建一个新用户king,其家目录test
7.3、指定、修改密码

语法:passwd 用户名  表示给某个用户设置/更改密码
注意:要写用户名。不写用户名默认设置当前用户,如果当前用户是root就麻烦了。
比如:给milan设置密码,输入:passwd milan 后再按Enter键输入milan的密码。
命令:pwd --->显示当前用户所在目录(pwd, Print Working Directory)
7.4、删除用户

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

  • 删掉用户,但是保留其家目录:userdel 用户名
  • 将用户和其家目录一起删除(这个操作要谨慎):user -r 用户名
  • 一般情况,建议保留家目录(不删除)
注意:如果使用user1用户登录系统,然后使用su - root方式切换登录到root用户,去删除user1用户会操作失败(因为user1的用户系统还在运行,无法删除自己)。
7.5、查询用户信息

语法:id 用户名
  1. [root@luminescent home]# id root
  2. uid=0(root) gid=0(root) 组=0(root)
复制代码
userid是0 gruopid组id是0 所在组0
当用户不存在:返回无此用户 no such user
  1. [root@luminescent home]# id milan
  2. id: milan: no such user
复制代码
7.6、切换用户

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

  • 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
  • 当需要返回到原来用户时,使用exit/logout指令。
su username和su - username的区别:

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


  • 指令who am i/I -> 查看第一次登录系统的用户,如:who am I 或 who am i
  • 指令whoami -> 查看当前登陆系统的用户(如果使用su指令切换了用户,则显示切换后的用户名)。
    注意:连写后i只能小写。错误指令×:whoamI
假设A用户登录系统,切换到B用户,B输入命令who am i,输出的还是A用户的信息。
7.8、用户组

介绍:类似于角色,系统可以对有共性/有相同的权限的多个用户进行统一的管理
新增组:groupadd 组名
需求:假如A用户和B用户有相同的权限,给每个用户赋权。
解决方案:可以把A用户和B用户放在一个组里,然后给这个组赋权限,组里的用户有相同的权限。
说明:新增一个用户,其实会默认生成一个跟用户名相同的组,然后把用户放到该组里。
就像是 id root:uid=0(root) gid=0(root) 组=0(root)--->root组
案例1:增加一个用户zwj,把他直接放到组wudang中
  1. groupadd wudang
  2. useradd -g wudang zwj
  3. id zwj:uid=1001(zwj) gid=1001(wudang) 组=1001(wudang)
复制代码
修改用户的组:usermod -g 用户组 用户名
案例2:把zwj 放到组 mojiao 中
  1. groupadd mojiao
  2. usermod -g mojiao zwj
  3. id zwj:uid=1001(zwj) gid=1002(mojiao) 组=1002(mojiao)
复制代码
说明:当新增一个用户user时,user默认在以自己的名字命名的组user中,想要将新增的用户user放进其他组中,使用usermod命令
  1. 新增一个用户john,怎么把john放进组mojiao中?
  2. useradd jhon
  3. usermod -g mojiao jhon
  4. 新增一个用户john,john在以自己的名字命名的组john中,从john组到mojiao组
复制代码
删除组:groupdel 组名
7.9、用户和组相关文件

注意:用户和组相关文件需要root权限
(1)/etc/passwd 文件
每增加一个用户,就会把用户的信息保存到该文件。用户(user)的配置文件,记录用户的各种信息
每行都是一个用户,每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
说明:

  • 主目录:用户所在的家目录
  • Shell:命令解释程序。shell是连接用户和Linux内核的桥梁
    将发布的指令通过shell解析,再传给Linux内核,Linux是看不懂发布的指令的,shell有很多种,中国一般用的是bash
  • 使用命令:vim /etc/passwd 可以查看该文件(还有其他命令也可以查看,如cat指令)
(2)/etc/shadow 文件
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
(3)/etc/group 文件
组(group)的配置文件,记录 Linux 包含的组的信息每行含义:组名:口令:组标识号:组内用户列表
7.10、拓展-Shell

Shell是什么?

图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。
然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell
Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质
Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。
Shell如何连接用户和内核?

Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!
其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。
接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。
比如,我们都知道在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。
Shell连接其他程序

在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。
Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。
大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。
可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。

Shell是一种脚本语言

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。
有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。
这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。
这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。
8、实用指令

8.1、指定运行级别

Linux系统运行级别:

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

  • CentOS7之前是在文件/etc/inittab文件中设置
  • CentOS7之后对设置进行了简化:

    • 用 multi-user.target 代表3运行级别
    • 用 graphical.target 代表5运行级别

命令:systemctl get-default 查看当前系统运行级别
命令:systemctl set-default multi-user.target|graphical.target  设置默认运行级别
注意:设置默认运行级别后需要重启系统才能生效。
8.2、重置root用户密码


  • 启动虚拟机时 按【ESC】键
  • 在linux启动页面选择Linux内核后,按【e】键

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

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

  • 输入新的root密码后,再输入指令exec /sbin/init重新初始化,正常启动系统
  • 输入刚刚新设置的root密码(输入内容是隐藏的),如下图所示

  • 进入系统后,输入reboot指令,重启系统即可使用新的root密码登录
  • Linux系统root用户密码重置完成。
8.3、帮助指令


  • man命令


  • 语法:man 命令/配置文件
    是manual的简写,manual是手册的意思,获得帮助信息
  • 例子:查看ls命令的帮助信息
    输入:man ls 之后,会看到ls的具体信息(要回到前一个页面,输入q)
    注意:可能不止一页,使用空格或下键,可以往下看
    ==在Linux系统下,隐藏文件是以.开头的

  • ls命令:列出目录内容


  • 格式:ls [选项] [文件名...]
    ls  -a  --->列出所有文件,包括隐藏文件(隐藏文件以 . 开头)
    ls  -l  --->单列输出
  • 选项以 - 开始
    选项可以组合使用,没有顺序:
    比如:ls -al也可以ls -a -l表示列出所有的文件 并 单列输出,ls -l和ll等价
  • ls默认是对当前目录下的文件
    也可以指定某个目录:
    如:ls -al /root 表示把root目录下的所有文件单列输出

  • 语法:help 命令


  • 功能:获得 shell 内置命令的帮助信息
  • 例子:查看 cd 命令的帮助信息:help cd
8.4、关于文件目录的指令


  • pwd指令:显示当前工作目录的绝对路径
  • ls [选项] [目录|文件]指令:
    常用选项:

    • -a:显示当前目录所有的文件和目录,包括隐藏的
    • -l:以列表的方式显示信息
    • -R:递归列出遇到的子目录

  • cd [绝对路径|相对路径]指令:切换到指定目录
    cd ~或者cd回到自己的家目录
    cd ..:回到当前目录的上一级目录。如果已经在根目录,则保持不变
  • mkdir [选项] 要创建的目录:
    理解:mkdir指令用于创建目录(默认只能创建一级目录)
    选项-p:创建多级目录。如:mkdir -p /home/test/linux
  • rmdir [选项] 要删除的空目录:
    rmdir删除的是空目录,如果欲删除的目录下有内容则无法删除
    如果需要删除非空目录,需要使用rm -rf 要删除的目录
    比如:删除animal目录:rm -rf /home/animal
  • touch 要创建的文件名称:
    如:touch /home/a.txt 表示在home目录下创建一个a.txt空文件
  • cp [选项] source dest指令:拷贝文件到指定目录
    常用选项:-r 递归复制整个文件夹
    应用实例:将 /home/hello.txt 拷贝到 /home/bbb 目录下
    1. cp /home/hello.txt /home/bbb
    复制代码
    递归复制整个文件夹,将/home/aaa 目录下的文件全部拷贝到/home/bbb下
    1. cp -r /home/aaa /hom/bbb
    复制代码
    (是将整个目录和目录本身拷贝进来),使用强制覆盖不提示的方法:\cp。如:\cp -r /home/aaa /home/bbb
  • rm指令:移除文件或目录
    基本语法:rm [选项] 要删除的文件或目录
    常用选项:
    -r:递归删除整个文件夹
    -f:强制删除不提示
    案例1:将 /home/hello.txt 删除
    1. rm /home/hello.txt
    复制代码
    案例2:递归删除整个文件夹 /home/bbb ,并不提示
    1. rm -rf /home/bbb
    复制代码
    注意:强制删除不提示的方法:带上 -f 参数即可
  • mv指令:移动文件与目录或重命名
    基本语法:
    1. mv        原文件名 新文件名             (如果两个文件在同一个目录下,mv指令功能:重命名)
    2. mv  被移动的文件 移动到哪   (如果两个文件不在同一个目录下,mv指令功能:移动文件)
    复制代码
    案例 1: 将 /home/cat.txt 文件 重新命名为 pig.txt
    1. [root@luminescent ~]# cd /home
    2. [root@luminescent home]# touch cat.txt
    3. [root@luminescent home]# ls
    4. cat.txt  jack  king  milan  zwj
    5. [root@luminescent home]# mv cat.txt pig.txt
    6. [root@luminescent home]# ls
    7. jack  king  milan  pig.txt  zwj
    复制代码
    案例 2:将 /home/pig.txt 文件 移动到 /root 目录下
    1. [root@luminescent home]# mv pig.txt /root
    2. [root@luminescent home]# ls
    3. jack  king  milan  zwj
    4. [root@luminescent home]# cd /root
    5. [root@luminescent ~]# ls
    6. Hello.java  pig.txt
    复制代码
    移动并重名:mv pig.txt /root/cow.txt
    案例 3: 移动整个目录,比如将 /opt/bbb  移动到 /home 下
    1. mv /opt/bbb /home/
    复制代码
  • cat指令:查看文件内容
    vi和vim指令能查看文件内容,但是容易误操作编辑文件内容。相比于vi|vim指令,cat也可以查看,cat只能查看不能修改,cat更安全。
    基本语法:cat [选项] 要查看的文件
    常用选项:-n(显示行号)
    案例1:查看 /etc/profile 文件内容,并显示行号。
    1. cat -n /etc/profile
    复制代码
    注意:
    cat 只能浏览文件,而不能修改文件;为了浏览方便再加上管道命令 | more
    管道命令:把前面的结果再交给下一个指令进行处理。语法:| 其他指令
    1. cat        -n /etc/profile | more
    2. 意思:先执行cat -n /etc/profile 然后,按回车键输出一行,按空格翻页等。
    复制代码
  • more指令:管道命令
    基本语法:more 要查看的文件 功能: more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。 more 指令中内置了若干快捷键(交互的指令),详见操作说明:
    操作功能说明空格键代表向下翻一页Enter(回车)代表向下翻一行q代表立刻离开more,不再显示该文件内容Ctrl+F向下滚动一屏Ctrl+B返回上一屏=输出当前行的行号:f输出当前文件名号和当前行的行号
  • less指令:查看文件内容
    基本语法:less 要查看的文件
    功能:
    less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。
    less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
    有一个文件是100M,用vim查看会将其全部加载再显示出来,这样会很慢。使用less,会先加载一部分显示出来,再根据指令显示剩下的,这样更快。
    所以要查找一些大的文件,建议用less。
    案例: 采用 less 查看一个大文件文件 /root/武炼巅峰.txt
    首先使用Xftp将 武炼巅峰.txt 传输到root目录下,然后输入指令:less /root/武炼巅峰.txt
    下面操作中:

    • 想要找某个字或词
    • 输入:/要找的字或词    然后按n向下找  按N向上找
    • 操作说明:
    操作功能说明空格键向下翻一页[pagedown]向下翻动一页[pageup]向上翻动一页/字串向下搜寻[字串]的功能,[n]键向下查找,[N]键向上查找?字串向上搜寻[字串]的功能,[n]键向上查找,[N]键向下查找q离开less命令
  • echo指令:输出内容到控制台
    基本语法:echo [选项] [输出内容]
    案例: 使用 echo 指令输出环境变量输出$PATH $HOSTNAME
    1. echo $HOSTNAME (环境变量一般加$)
    复制代码
    案例: 使用 echo 指令输出 hello,world
    1. echo "hello,world" (加不加引号都可以)
    复制代码
  • head指令:用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容。
    基本语法:
    1. head  文件            (功能描述:查看文件头 10 行内容)
    2. head -n 5 文件        (功能描述:查看文件头 5 行内容,5 可以是任意行数)
    复制代码
    案例: 查看/etc/profile 的前面 5 行代码
    1. head -n 5 /etc/profile
    复制代码
  • tail指令:tail 用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前 10 行内容。
    基本语法:
    1. tail 文件            (功能描述:查看文件尾 10 行内容)
    2. tail -n 5 文件        (功能描述:查看文件尾 5 行内容,5 可以是任意行数)
    3. tail -f        文件            (功能描述:实时追踪该文档的所有更新,只要该文件改动了什么内容就可实时看到,常用于监控用户操作)
    复制代码
  • >指令和>>指令:
    >指令:输出重定向(覆盖)
    >>指令:文件末尾追加
    基本语法:
    1. ls -l > 文件1                 (功能描述:将列表的内容写入文件1中(覆盖写))
    2. ls -al >> 文件1        (功能描述:将列表的内容追加到文件1的末尾)
    3. cat 文件1 > 文件2          (功能描述:将文件1的内容覆盖到文件2)
    4. echo "内容" >> 文件1     (将内容追加到文件1的末尾)
    复制代码
    案例 1: 将 /home 目录下的文件列表 写入到 /home/info.txt 中,覆盖写入。
    1. ls -l /home > /home/info.txt        [如果 info.txt 没有,则会自动创建]
    复制代码
    案例 2: 将当前日历信息追加到 /home/mycal 文件中
    1. cal >> /home/mycal
    复制代码
  • ln指令:给原文件创建一个软链接,软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径(ln:link)
    基本语法:
    1. ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)
    复制代码
    案例1:在/home 目录下创建一个软连接 myroot,连接到 /root 目录(这样 切换到myroot 其实就是切换到root)
    1. ln -s /root        /home/myroot
    复制代码
    案例2: 删除软连接 myroot
    1. rm        /home/myroot
    复制代码
    当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录。
  • history指令
    功能:查看已经执行过历史命令,也可以执行历史指令
    基本语法:
    1. history (功能描述:查看已经执行过历史命令)
    2. 可以看其他登录的用户做了什么操作。
    复制代码
    案例 1: 显示所有的历史命令:history
    案例 2: 显示最近使用过的 10 个指令:history 10
    案例 3:执行历史编号为 5 的指令:!5
8.5、关于时间日期的指令


  • date指令:显示当前日期

    • 基本语法:
    1. date          (功能描述:显示当前时间)
    2. date +%Y  (功能描述:显示当前年份)
    3. date +%m  (功能描述:显示当前月份)
    4. date +%d  (功能描述:显示当前是哪一天)
    5. date "+%Y-%m-%d %H:%M:%S"(功能描述:显示年月日时分秒)
    6.         案例 1: 显示当前时间信息
    7.         date
    8.         案例 2: 显示当前时间年月日
    9.         date "+%Y-%m-%d"
    10.         案例 3: 显示当前时间年月日时分秒
    11.         date "+%Y-%m-%d %H:%M:%S"
    复制代码

    • 设置日期
    1. date -s        字符串时间
    复制代码
    案例 1: 设置系统当前时间:date -s "2020-11-03 20:02:10"

  • cal指令:查看日历
    1. cal [选项] (功能描述:不加选项,默认显示本年本月日历)
    复制代码
    案例 1: 显示当前日历:cal
    案例 2: 显示 2020 年日历:cal 2020
8.6、关于搜索查找的指令


  • find指令:从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法:
    1. find [搜索范围] [选项]
    复制代码
    选项功能-name按照指定的文件名查找模式查找文件-user查找属于指定用户名所有文件-size按照指定的文件大小查找文件,文件大小单位:k,M,G案例 1: 按文件名:根据名称查找 /home 目录下的 hello.txt 文件
    1. find /home -name hello.txt
    复制代码
    案例 2:按拥有者:查找 /opt 目录下,用户名称为 nobody 的文件
    1. find /opt -user nobody
    复制代码
    案例 3:查找整个 linux 系统下大于200M的文件(+n 大于,-n 小于,n 等于)
    1. find / -size +200M
    2. ls -l  /home/yxz/novel
    3. 总用量 57504
    4. -rw-r--r--. 1 root root 58882838 4月   3 11:59 武炼巅峰.txt
    5. ls -lh  /home/yxz/novel (上面的总用量大小看不懂,加上h->human表示能看懂的内容)
    6. 总用量 57M
    7. -rw-r--r--. 1 root root 57M 4月   3 11:59 武炼巅峰.txt
    复制代码
  • locate指令:
    可以快速定位文件路径。利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。
    基本语法:locate 搜索文件
    注意:由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
    案例 1: 请使用 locate 指令快速定位 hello.txt 文件所在目录
    1. updatedb
    2. locate hello.txt
    复制代码
  • which指令:可以查看某个指令在哪个目录下
    案例:ls 指令在哪个目录:which ls
  • grep指令和管道符号|:
    grep指令往往和管道符号 | 结合使用
    grep:过滤查找,管道符:| -> 表示将前一个命令的处理结果输出传递给后面的命令处理。
    比如:先cat a.txt,然后又想看a.txt文件中有没有hello这个词,那么就 cat a.txt | grep "hello" --->先找到a.txt,然后再在a.txt中找hello。
    基本语法:grep [选项] 查找内容 源文件
    常用选项

    • -n:显示匹配行及行号
    • -i:忽略字母大小写
    案例 1: 请在 hello.txt 文件中,查找"yes"所在行,并且显示行号
    1. 写法 1: cat /home/hello.txt        | grep "yes"  引号写不写都行
    2.                 cat /home/hello.txt        | grep -n "yes"   显示行号
    3. 写法 2: grep -n "yes" /home/hello.txt
    复制代码
    案例 2:在武炼巅峰.txt 文件中,查找"扇轻罗"所在行,并显示行号
    1. cat /home/yxz/novel/武炼巅峰.txt | grep -n "扇轻罗" | more
    2. grep -n "扇轻罗" /home/yxz/novel/武炼巅峰.txt | more
    复制代码
8.7、关于压缩和解压的指令


  • gzip/gunzip指令
    gzip:用于压缩文件
    gunzip:用于解压的
    基本语法
  1. gzip 文件                   (功能描述:压缩文件,只能将文件压缩为*.gz 文件)
  2. gunzip 文件.gz (功能描述:解压缩文件命令)
复制代码
案例 1: gzip 压缩,将 /home 下的 hello.txt 文件进行压缩
  1. gzip /home/hello.txt
复制代码
案例 2: gunzip 解缩,将 /home 下的 hello.txt.gz 文件进行解压
  1. gunzip /home/hello.txt.gz
复制代码

  • zip/unzip 指令
    zip 用于压缩文件
    unzip 用于解压的 (这个在项目打包发布中很有用)
    基本语法
  1. zip        [选项] XXX.zip 将要压缩的内容    (功能描述:压缩文件和目录的命令)
  2. unzip [选项] XXX.zip                      (功能描述:解压文件)
复制代码
zip 常用选项-r:递归压缩,即压缩目录
unzip 的常用选项-d:指定解压后文件的存放目录
案例 1:将 /home 下的所有文件/文件夹压缩成 myhome.zip
  1. zip -r myhome.zip /home/        [将 home 目录及其包含的文件和子文件夹都压缩]
复制代码
案例 2:将 myhome.zip 解压到 /opt/tmp 目录下
  1. mkdir /opt/tmp
  2. unzip -d /opt/tmp /home/myhome.zip
复制代码

  • tar 指令:打包指令,最后打包后的文件是 .tar.gz 的文件。把一个或者多个文件(夹)用压缩软件进行压缩的过程,一般可称之为打包。
    tar指令可以压缩也可以解压。根据选项来 压缩还是解压。基本语法:
  1. tar        [选项] XXX.tar.gz 打包的内容          (功能描述:打包目录,压缩后的文件格式.tar.gz)
复制代码
选项功能-c产生.tar打包文件-v显示详细信息-f指定压缩后的文件名-z打包同时压缩-x解包.tar文件案例 1:压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz
  1. tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
复制代码
案例 2:将 /home 的文件夹压缩成 myhome.tar.gz:tar -zcvf myhome.tar.gz /home/
案例 3:将 pc.tar.gz 解压到当前目录:tar -zxvf pc.tar.gz
案例 4:将 myhome.tar.gz 解压到 /opt/tmp2 目录下
  1. (1)        mkdir /opt/tmp2
  2. (2) tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
复制代码
注意:-C 后写要解压到的位置
9、组管理和权限管理

9.1、Linux组基本介绍

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

  • 所有者
  • 所在组
  • 其它组
  • 改变用户所在的组
9.2、文件/目录的所有者

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

  • 查看文件/目录的所有者(在/home下才能看到)
    指令:ls –ahl
  1. drwxr-xr-x.  6 root root   4.0K 2月  23 13:59 .
  2. dr-xr-xr-x. 18 root root   4.0K 2月  20 16:45 ..
  3. -rw-r--r--.  1 root root     24 2月  22 21:59 hello.txt
  4. ...
复制代码
第三列就是文件/目录的所有者,第四列是文件/目录所在组(创建该文件/目录的所有者所在的组,也可以后期修改所在组)

  • 修改文件/目录所有者指令:chown 新所有者 文件名
    案例:使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom
    chown tom apple.txt
9.3、组的创建

基本指令:groupadd 组名
案例:创建一个用户 fox ,并放入到 monster 组中:useradd -g monster fox
9.4、文件/目录所在组

当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
查看文件/目录所在组,指令:ls –ahl或者ll
注意:ll并不是linux下一个基本的命令,它实际上是ls -l的一个别名。Ubuntu默认不支持命令ll,必须用 ls -l,这样使用起来不是很方便。
注意:/etc/group下存放着所有的组
使用指令:cat /etc/group可以查看所有的组
比如查看有没有mojiao这个组,可以使用管道命令和grep过滤:cat /etc/group | grep mojiao
9.5、其他组

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

在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组。
改变用户所在组
  1. usermod        –g        新组名        用户名
  2. usermod        –d        目录名        用户名         (改变该用户登陆的初始目录)
复制代码
特别说明:用户需要有进入到新目录的权限。
如何查看用户所在的组?id 用户名 --->显示用户信息
案例:将 zwj 这个用户从原来所在组,修改到 wudang 组
  1. 先查看zwj在哪个组:id zwj
  2. 然后查看有没有wudang这个组:cat /etc/group | grep wudang
  3. 修改:usermod -g wudang zwj
复制代码
9.7、权限基本介绍

ls -l中显示的内容如下:
  1. [root@luminescent home]# ll
  2. 总用量 8
  3. -rw-r--r--.  1 root root    0 4月   4 15:19 a.txt
  4. drwxr-xr-x.  2 root root 4096 4月   4 15:21 file
  5. lrwxrwxrwx.  1 root root    5 4月   4 15:18 myroot -> /root
  6. drwx------. 16 yxz  yxz  4096 4月   4 14:45 yxz
复制代码
第一列共10位,以drwxr-xr-x为例:
0-9 位说明:

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

    • d 是目录,相当于 windows 的文件夹
    • - 代表是普通文件(.txt)
    • l 是链接(link),相当于 windows 的快捷方式
    • c 是字符(char)设备文件,比如鼠标,键盘    ---> /dev/目录下可以看到
    • b 是块(block)设备,比如硬盘    ---> /dev/目录下可以看到

  • 第 1-3 位确定该文件的所有者对该文件的权限。---User
  • 第 4-6 位确定该文件所属的组和该组中的用户对该文件的权限。---Group
  • 第 7-9 位确定其他用户(不是所有者,也不是同一组的其他用户)对该文件的权限 ---Other
9.8、rwx权限详解

权限有三种:

  • r 代表可读(read)
  • w 代表可写(write)
  • x 代表可执行(execute)
rwx作用到文件:

  • r: 可以读取,查看
  • w: 可以修改,但是不代表可以删除该文件
    注意:删除一个文件的前提条件是 对该文件所在的目录 有 写(w)权限,才能删除该文件.
  • x: 可以被执行,前提是可执行文件
rwx作用到目录:

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

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

  • 第一列中 10 个字符:-rwxrw-r--
    确定不同用户能对文件干什么(权限):
    第一个字符代表文件类型:- l d c b
    其余字符每 3 个一组(rwx):读(r) 写(w) 执行(x)
    第一组 rwx:文件所有者的权限是 可读、写和执行
    第二组 rw-:与文件所有者同一组的用户的权限是 可读、写但不能执行
    第三组 r--:不与文件拥所有者同组的其他用户 的权限是 可读但不能写和执行
也可以用数字表示对应的权限:r=4,w=2,x=1 -> 7种组合情况:rwx=4+2+1=7, rw-=4+2=6, r-x=4+1=5, r--=4, -wx=2+1=3, -w-=2, --x=1

  • 第二列:1


  • 如果是普通文件,直接就是1;
  • 如果是目录,代表该目录下有多少内容(即子目录数+文件数),目录最少是2 -> 每个目录至少包含两个隐藏目录(子目录. 和 父目录..)

  • 第三列:root        该文件/目录的所有者
  • 第四列:root        该文件/目录的所在组
  • 第五列:1213        文件大小(这里是字节)
  • 第六列:Feb 2 09:39        最后修改日期
  • 第七列:abc        文件名
9.10、chmod修改权限

基本说明
通过 chmod 指令,可以修改文件或者目录的权限。
第一种方式:通过 + 、-、=  变更权限

  • u:所有者
  • g:所在组(同一个组的其他用户)
  • o:其他人(不同一个组的其他用户)
  • a:所有人(所有用户)(u、g、o 的总和)
语法格式
  1. chmod u=rwx,g=rx,o=x 文件/目录名  (该文件/目录的u的权限是rwx,g的权限是rx,o的权限是x)
  2. chmod o+w 文件/目录名                          (该文件/目录的o的权限加上w)
  3. chmod a-x 文件/目录名                          (取消该文件/目录的所有人的x权限)
复制代码
案例演示:
1.给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rwx,g=rx,o=rx abc
2.给 abc 文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
3.给 abc 文件的所有用户添加读的权限
chmod a+r abc
注意:文件名的颜色表示该文件类型

  • 可执行文件 ——> 文件名 绿色
  • 普通文件 ——> 文件名 白色
  • 目录/文件夹 ——> 文件名 蓝色
  • 压缩文件 ——> 文件名 红色
第二种方式:通过数字变更权限
权限可以用数字代替:r=4 w=2 x=1
  1. chmod u=rwx,g=rx,o=x 文件/目录名
  2. 相当于
  3. chmod 751 文件/目录名
复制代码
案例演示:将/home/abc.txt文件的权限修改成rwxr-xr-x,使用给数字的方式实现
  1. rwxr-xr-x:u-rwx g=r-x o=r-x
  2. chmod 755 /home/abc.txt
复制代码
9.11、chown修改文件/目录所有者

语法格式
  1. chown newowner 文件/目录                        (修改所有者)
  2. chown newowner newgroup        文件/目录         (同时修改所有者和所在组)
复制代码
选项:-R:如果是目录 则使其下所有子文件或目录递归生效(R:Recursive递归)
案例演示
1.请将 /home/abc.txt 文件的所有者修改成 tom
chown tom /home/abc.txt
2.请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom
chown -R tom /home/test
9.12、chgrp修改文件/目录的所在组

语法格式:chgrp newgroup 文件/目录
案例演示:

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

  • 将 /home/test 目录下所有的文件和目录的所在组都修改成shaolin(少林)
chgrp -R shaolin /home/test
9.13、实操-警察土匪游戏

有两个组:police组,bandit组
有四个用户:jack,jerry,xh,xq
jack,jerry:警察        xh,xq:土匪

  • 创建组       
    groupadd police,groupadd bandit
  • 创建用户(直接放到对应组)
    useradd -g police jack
    useradd -g police jerry
    useradd -g bandit xh
    useradd -g bandit xq
  • jack创建一个文件,自己可以读 r 写 w,本组人可以读,其它组没人任何权限

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

  • jack修改jack.txt文件,让其它组人可以读,本组人可以读写
    chmod o+r jack.txt 或者 chmod 664 jack.txt
    改后的权限:rw-rw-r--
  • xh投靠警察:usermod -g police xh(需要root权限)
  • 测试xh和xq能不能对jackie.txt文件进行读写,分别使用xh和xq登录(首先对其设置密码123)

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

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

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


  • 建立两个组(神仙(sx),妖怪(yg))
    groupadd sx, groupadd yg
  • 建立四个用户(唐僧ts,悟空wk,八戒bj,沙僧ss),妖怪组yg:悟空,八戒;神仙组sx:唐僧,沙僧
    神仙组用户:useradd -g sx ts, useradd -g sx ss, 妖怪组用户: useradd -g yg wk, useradd -g yg bj
  • 设置密码(都为123):passwd 用户名
  • 用悟空建立一个文件 monkey.txt ,该文件要输出 i am a monkey

    • 切换至悟空登录:su - wk
    • 修改文件内容:vim monkey.txt -> 输入内容:i am a monkey
    • 保存并退出到命令行:[ESC]键 -> :wq

  • 给八戒一个可以 rw 的权限

    • 修改悟空的家目录权限(给同组用户增加rwx权限):cd /home -> chmod g+r+w+x wk
    • 修改monkey.txt的权限(添加rw权限):chmod g+r+w /home/wk/monkey.txt

  • 八戒修改 monkey.txt 加入一句话(i am a pig)

    • 切换至八戒登录:su - bj
    • 修改文件内容:vim /home/wk/monkey.txt -> i am a pig

  • 唐僧 沙僧 对该文件没有权限,把 沙僧 放入妖怪组:

    • 普通用户没有修改用户组的权限,切换至root权限:su - root,输入root密码
    • 将沙僧放入妖怪组:usermod -g yg ss

  • 让沙僧修改该文件monkey.txt, 加入一句话 ("我是沙僧,我是妖怪!")

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

注意:rwx权限对于文件夹(目录)的细节讨论和测试
x: 表示可以进入到该目录,比如 cd
r: 表示可以 ls ,将目录的内容显示
w: 表示可以在该目录下删除或者创建文件
练习二:


  • 用 root 登录,建立用户mycentos,自己设定密码:useradd mycentos -> passwd mycentos
  • 用 mycentos 登录,在主目录下建立目录 test/t11/t1

    • 切换mycentos登录:su - mycentos
    • 主目录下创建目录:mkdir -p test/t11/t1

  • 在 t1 中建立一个文本文件 aa,用 vi 编辑其内容为 ls –ahl
    vi /home/mycentos/test/t11/t1/aa -> 输入内容ls -ahl
  • 改变 aa 的权限为可执行文件[可以将当前日期追加到一个文件],运行该文件./aa

    • 在aa文件中追加日期:vim test/t11/t1/aa -> 键进入编辑模式 -> 输入date "+%F %T"
    • 修改aa的权限:chmod u+x test/t11/t1/aa
    • 运行文件:. /文件

  • 删除新建立的目录 test/t11/t1:rm -rf test
  • 删除用户 mycentos 及其主目录中的内容:userdel -r mycentos
  • 将 linux 设置成进入到图形界面:init 5
  • 重新启动 linux 或关机:reboot 或者 init 0
10、定时任务调度

10.1、crond任务调度


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

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



  • 基本语法:crontab [选项]
    功能:进行定时任务的设置
  • 常用选项:
    -e编辑crontab定时任务-l查询crontab定时任务-r删除当前用户所有的crontab任务
  • 快速入门

    • crontab -e (进入/etc/crontab文件,所有的定时任务都在该文件中)
    • 在文件中输入定时任务的命令,语法格式:* * * * * user command

      • */1**** date > /home/my
      • */1**** cal >> /home/my

    • 保存并退出

  • 参数说明
    参数含义范围第一个*一小时当中的第几分钟0-59第二个*一天当中的第几小时0-23第三个*一个月中的第几天1-31第四个*一年中的第几个月1-12第五个*一周的星期几0-7(0和7都代表星期日)特殊符号说明:
    特殊符号说明*代表任何时间,比如第一个*就代表一小时中每分钟都执行一次的意思,代表不连续时间,比如“0 8,12,16 * * * 命令”,代表每天的8点0分,12点0分,16点0分都执行一次命令-代表连续时间,比如“0 5 ** 1-6 命令”,代表周一到周六凌晨5点0分执行命令*/n代表每隔多久执行一次,比如“*/10 * * * * 命令”,代表每隔十分钟就执行一次命令案例:

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

  • 应用实例
    1. 案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
    2. crontab -e
    3. */1 * * * * date >> /tmp/mydate
    4. 案例 2:每隔 1 分钟,将当前日期和日历都追加到 /home/mycal 文件中
    5. 第一种方法:
    6.         crontab -e
    7.         在crontab文件中输入:
    8.         */1 * * * * date >> /home/mycal
    9.         */1 * * * * cal >> /home/mycal
    10.         保存退出
    11. 第二种方法:
    12.         将 date >> /home/mycal 和  cal >> /home/mycal 命令写在文件 /home/my.sh中
    13.         就是将命令都写在shell脚本中,直接调用shell脚本
    14.         步骤:
    15.                 vim /home/my.sh
    16.                 在my.sh中写入:
    17.                         date >> /home/mycal
    18.                         cal >> /home/mycal
    19.                         :wq
    20.                 给 my.sh 增加执行权限:chmod u+x /home/my.sh (否则无法使用crontab命令)
    21.                 crontab -e
    22.                 在crontab中写入:*/1 * * * *        /home/my.sh
    23. 注意:可以写脚本也可以不写脚本
    24. 案例 3: 每天凌晨 2:00 将 mysql 数据库 testdb 备份到文件中。
    25. 提示: 指令为 mysqldump -u root -p密码 数据库 > /home/db.bak
    26. 步骤(1) crontab -e
    27. 步骤(2) 0 2 * * * mysqldump -u root -proot testdb > /home/db.bak
    复制代码
  • crond相关指令

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

10.2、at定时任务


  • 基本介绍

    • at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行;
    • 每个作业队列(任务队列)中都有作业(作业里是指令/脚本);
    • 默认情况下,atd守护进程每60秒检查作业队列;
      有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业;
      运行完这个作业(任务)之后,这个作业就不会再被执行了;
    • at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了;
    • 在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看
      ps -ef ---> 查看所有的进程
      ps -ef | grep atd -> 可以检测 atd 是否在运行
      1. root       1284      1  0 08:14 ?        00:00:00 /usr/sbin/atd -f                -> 表示atd守护线程正在执行
      2. root       3922   1964  0 10:16 pts/0    00:00:00 grep --color=auto atd
      复制代码
    总结:at命令就是对某个定时任务只执行一次



  • at 命令格式
    语法:at [选项] [时间]
    然后输入两次:Ctrl + D(结束 at 命令的输入)
    如果在at命令中要删除光标前的内容:Ctrl+[Backspace]键
  • at 命令选项:
选项含义-m当指定的任务被完成后,将给用户发送邮件,即使没有标准输出-Iatq的别名-datrm的别名-v显示任务将被执行的时间-c打印人物的内容到标准输出-V显示版本信息-q使用指定的队列-f从指定文件读入任务而不是从标准输入读入-t以时间参数的形式提交要运行的任务

  • at 指定时间的方法

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

  • 应用实例
    1. 案例 1:2 天后的下午 5 点执行 /bin/ls /home
    2.         at 5pm + 2 days
    3.         /bin/ls /home
    4.         两次ctrl+D
    5.        
    6. 案例 2:atq 命令来查看系统中没有执行的工作任务
    7.         直接输入atq 查询
    8. 案例 3:明天17点钟,输出时间到指定文件内 比如 /root/date100.log
    9.         at 5pm tomorrow
    10.         date > /root/date100.log
    11.         两次ctrl+D
    12.        
    13. 案例 4:2分钟后,输出时间到指定文件内 比如 /root/date200.log
    14.         at now + 2 minutes
    15.         date > /root/date200.log
    16.         两次ctrl+D
    17.        
    18. 案例 5:删除已经设置的任务
    19.         atrm 任务编号
    20.         atrm 4 //表示将 job 队列,编号为 4 的 job 删除.
    21.         atq:
    22.         2        Thu Feb 24 09:53:00 2022 a root
    23.         1        Fri Feb 25 17:00:00 2022 a root
    24.         第一列就是编号
    25. 注意:也可以执行脚本
    26. 比如:
    27.     at now + 2 minutes
    28.     /root/my.sh
    29.     但要有这个脚本,并且有执行权限x
    复制代码
11、Linux磁盘分区挂载

11.1、Linux分区


  • 原理介绍
    Linux无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录/,一个独立且唯一的文件结构
    Linux中每个分区都是用来组成整个文件系统的一部分。
    Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。
    这时要载入的一个分区将使它的存储空间在一个目录下获得。
    图解:硬盘上的一个分区 通过挂载mount机制 与文件系统中的某个目录联系起来,即分区挂载到目录,访问这个目录即访问这个分区

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

    说明:sda1分区挂载到/boot目录,sda2分区挂载到/根目录,sda3分区挂载到swap交换分区
  • lsblk -f指令:查看更详细的磁盘分区挂载情况

    说明:

    • 第一列可以看到设备/硬盘分区情况:sda硬盘下有三个分区sda1、sda2、sda3
    • FSTYPE:文件系统类型(File System TYPE)
    • UUID:格式化之后,会给每一个分区分配一个 唯一的 不重复的 40位 的 字符串
    • MOUNTPOINT:挂载点


  • 硬盘说明:
    1. (1)        Linux 硬盘主要分为:
    2.          IDE 硬盘和 SCSI 硬盘
    3.          目前基本上是 SCSI 硬盘
    4. (2)        对于 IDE 硬盘,驱动器标识符为“hdx~”
    5.         其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘
    6.        
    7.         “x”为盘号
    8.                 a 为基本盘 第一个硬盘
    9.                 b 为基本从属盘 第二个硬盘
    10.                 c 为辅助主盘 第三个硬盘
    11.                 d 为辅助从属盘 第四个硬盘
    12.                
    13.         “~”代表分区
    14.                 前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区
    15.        
    16.     例:hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区
    17.        hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区
    18.              
    19. (3)        对于 SCSI 硬盘则标识为“sdx~”
    20.         SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样
    复制代码
11.2、挂载的经典案例

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

  • 虚拟机添加硬盘
  • 分区
  • 格式化
  • 挂载
  • 设置可以自动挂载(永久挂载)
11.2.1、虚拟机添加硬盘


  • 选中【虚拟机】,右键菜单中选择【设置】
  • 点击【添加】,选择添加【硬盘】
  • 然后一路【下一步】,磁盘类型选择【SCSI】,后面只有选择磁盘大小的地方需要修改,直到完成
使用命令lsblk发现没有新增的硬盘? -> 需要重启系统(才能识别)
  1. [root@luminescent ~]# lsblk -f
  2. NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
  3. sda                                                                 
  4. ├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
  5. ├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
  6. └─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
  7. sdb                                                                 
  8. sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码
新增硬盘sdb,还未分区。
11.2.2、硬盘分区

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

  • 分区命令:fdisk /dev/sdb -> dev目录下都是对硬件映射的文件
  • 开始分区后输入命令:n(add a new partition)
    常用命令:

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

  • 输入选择:p(primary主分区 默认选择, extended扩展分区)
  • 分区号(1-4,默认1):1(输入2,磁盘就有2个分区)
  • 两次回车,设置扇区默认值
    1. 起始 扇区 (2048-2097151,默认为 2048):
    2. 将使用默认值 2048
    3. Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
    4. 将使用默认值 2097151
    5. 分区 1 已设置为 Linux 类型,大小设为 1023 MiB
    复制代码
  • 最后输入:w -> 写入分区并退出(若不保存并退出输入 q,即上面步骤出错了想重来就可以输入q)
    1. [root@luminescent ~]# lsblk
    2. NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    3. sda      8:0    0   20G  0 disk
    4. ├─sda1   8:1    0    1G  0 part /boot
    5. ├─sda2   8:2    0   17G  0 part /
    6. └─sda3   8:3    0    2G  0 part [SWAP]
    7. sdb      8:16   0    1G  0 disk
    8. └─sdb1   8:17   0 1023M  0 part
    9. sr0     11:0    1  4.4G  0 rom  
    复制代码
    分区成功,磁盘sdb中只有一个分区sdb1
11.2.3、格式化分区

格式化分区目的:给这个分区指定它的文件类型
  1. [root@luminescent ~]# lsblk -f
  2. NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
  3. sda                                                                 
  4. ├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
  5. ├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
  6. └─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
  7. sdb                                                                 
  8. └─sdb1                                                              
  9. sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码
sdb1的UUID为空,说明该分区尚未格式化
格式化命令:mkfs -t ext4 /dev/sdb1 -> 其中 ext4 是分区类型
  1. [root@luminescent ~]# mkfs -t ext4 /dev/sdb1
  2. mke2fs 1.42.9 (28-Dec-2013)
  3. 文件系统标签=
  4. OS type: Linux
  5. 块大小=4096 (log=2)
  6. 分块大小=4096 (log=2)
  7. Stride=0 blocks, Stripe width=0 blocks
  8. 65536 inodes, 261888 blocks
  9. 13094 blocks (5.00%) reserved for the super user
  10. 第一个数据块=0
  11. Maximum filesystem blocks=268435456
  12. 8 block groups
  13. 32768 blocks per group, 32768 fragments per group
  14. 8192 inodes per group
  15. Superblock backups stored on blocks:
  16.         32768, 98304, 163840, 229376
  17. Allocating group tables: 完成                           
  18. 正在写入inode表: 完成                           
  19. Creating journal (4096 blocks): 完成
  20. Writing superblocks and filesystem accounting information: 完成
复制代码
查看格式化后的分区详细信息:
  1. [root@luminescent ~]# lsblk -f
  2. NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
  3. sda                                                                 
  4. ├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
  5. ├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
  6. └─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
  7. sdb                                                                 
  8. └─sdb1 ext4                    68dedbb9-310d-4fb3-94c0-33947729c395
  9. sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码
可以看到sdb1分区有UUID唯一标识符 -> sdb1分区格式化完成,但是MOUNTPOINT(挂载点)尚未指定
11.2.4、分区挂载

挂载的目的:将一个分区与一个目录联系起来
挂载命令:mount 设备名称 挂载目录
挂载步骤:

  • 首先创建一个目录newdisk (目录位置随便) 假如在根目录下创建:mkdir newdisk
  • 进行挂载:mount /dev/sdb1 /newdisk
查看分区挂载信息:
  1. [root@luminescent /]# lsblk -f
  2. NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
  3. sda                                                                 
  4. ├─sda1 ext4                    13781296-efb8-4f86-8810-834f301cab2a /boot
  5. ├─sda2 ext4                    b219b5da-e417-4ab2-9bf1-c506930a68b0 /
  6. └─sda3 swap                    5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
  7. sdb                                                                 
  8. └─sdb1 ext4                    68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk
  9. sr0    iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码
挂载点有了,挂载成功。

  • 卸载(去除分区与目录的联系):仅仅删除联系,不会删除已经写入到分区中的文件
    命令:umount [设备名称|挂载的目录]
    例如:umount /dev/sdb1 或者 umount /newdisk
    注意: 用命令行挂载,重启后会失效。
11.2.5、设置自动挂载

设置自动挂载目的:解决命令行设置挂载重启后失效问题
自动挂载(永久挂载)步骤:

  • 通过修改文件/etc/fstab实现挂载
    新增一行:UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk                ext4        defaults        0 0
    1. #
    2. # /etc/fstab
    3. # Created by anaconda on Fri Mar 31 15:15:26 2023
    4. #
    5. # Accessible filesystems, by reference, are maintained under '/dev/disk'
    6. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    7. #
    8. # 或者写成以下方式:
    9. # /dev/sdb1                                                           /newdisk                ext4    defaults        0 0
    10. UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk                ext4    defaults        0 0
    11. UUID=b219b5da-e417-4ab2-9bf1-c506930a68b0 /                       ext4    defaults        1 1
    12. UUID=13781296-efb8-4f86-8810-834f301cab2a /boot                   ext4    defaults        1 2
    13. UUID=5e43ae36-a647-46aa-aea1-542ee2afcb63 swap                    swap    defaults        0 0
    复制代码
    注意:要挂在的设备可以是上一步生成的sdb1的UUID(建议此种方式设置),也可以是磁盘分区映射到Linux系统的文件/dev/sdb1
    1. 要挂载的设备或伪文件系统  挂载点  文件系统类型  挂载选项 转储频率 自检次序
    2. UUID=上面sdb1的UUID   /newdisk    ext4    defaults   0            0
    复制代码
    说明:

    • 要挂载的设备或伪文件系统:设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
    • 挂载点:指定的文件夹
    • 文件系统类型:一般是ext4,交换分区是swap
    • 挂载选项:defaults
    • 转储频率:0:不做备份  1:每天转储  2:每隔一天转储
    • 自检次序:0:不自检  1:首先自检;一般只有rootfs才用1;

  • 添加完成后,执行mount –a即刻生效 或者 重启系统reboot
11.3、磁盘情况查询


  • 查询系统整体磁盘使用情况
    基本语法:df -h (disk free)
    1. [root@luminescent ~]# df -h
    2. 文件系统        容量    已用  可用 已用% 挂载点
    3. devtmpfs        975M     0  975M    0% /dev
    4. tmpfs           991M     0  991M    0% /dev/shm
    5. tmpfs           991M   11M  980M    2% /run
    6. tmpfs           991M     0  991M    0% /sys/fs/cgroup
    7. /dev/sda2        17G  5.4G   11G   34% /
    8. /dev/sdb1       991M  2.6M  922M    1% /newdisk
    9. /dev/sda1       976M  178M  732M   20% /boot
    10. vmhgfs-fuse     254G  194G   61G   77% /mnt/hgfs
    11. tmpfs           199M   12K  199M    1% /run/user/42
    12. tmpfs           199M     0  199M    0% /run/user/0
    复制代码
  • 查询指定磁盘的占用情况
    基本语法:du -h 指定目录 (disk usage)
    功能:查询指定目录的磁盘占用情况,默认为当前目录

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

  • 应用实例:查询 /opt 目录的磁盘占用情况,深度为 1
    du -hac --max-depth=1 /opt
11.4、磁盘情况-工作实用指令


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

  • grep "^-" ---> 筛选出以-开头的,因为以-开头的都是文件
  • wc(word count): 统计数量
    wc -l: 统计行数l(lines)
  • 统计grep筛选后的行数即文件个数

  • 统计/opt 文件夹下目录的个数:ls -l /opt | grep "^d" | wc -l
  • 统计/opt 文件夹下文件的个数,包括子文件夹里的:ls -lR /opt | grep "^-" | wc -l
-R选项: 递归列出遇到的子目录

  • 统计/opt 文件夹下目录的个数,包括子文件夹里的:ls -lR /opt | grep "^d" | wc -l
  • tree 目录指令:以树状显示目录结构
    默认情况下没有tree指令,需要使用yum install tree指令安装,一直选择y选项即可完成安装。
12、网络配置

12.1、Linux网络配置原理



  • 通过ifconfig指令查看Linux虚拟机的ip地址:192.168.218.129
  • 然后在本机DOS命令窗口输入指令ipconfig,查看vmnet8的ip地址:192.168.218.1
    Linux虚拟机和vmnet8在同一网段(192.168.218),所以可以互相通信
  • 得到本机的无线网络适配器(无线网卡)的ip地址
为什么Linux虚拟机可以连外网(比如打开百度)?Linux虚拟机 ---> 本机vmnet8 ---> 本机无线网卡 ---> 教室局域网网关 ---> 外网
每次开机linux虚拟机的ip地址不一定相同(动态ip),linux虚拟机的ip地址可以设置成为静态ip -> 确保每次开机后linux虚拟机的ip不会变化
12.2、查看网络ip和网关

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

通过本机DOS命令窗口,输入指令:ipconfig -> 查看vmnet8的网络配置
在xshell或linux终端输入命令:ifconfig -> 查看 linux 的网络配置
ping命令:测试主机之间网络连通性
基本语法:ping 目的主机ip地址
功能描述:测试当前服务器是否可以连接目的主机
如:ping www.baidu.com
12.3、Linux网络环境配置

自动获取IP

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


特点:linux 启动后会自动获取 IP,可以避免IP冲突
缺点:每次自动获取的 IP 地址可能不一样,但是作为服务器的Linux系统,Linux的IP地址不能变。
开发环境中,一般将Linux的IP地址手动设定,IP地址固定不能改变。
手动获取IP

手动指定linux的ip地址,使其不变化。
直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
关于网络的配置文件在:/etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置为静态的(不变的),比如: ip 地址为 192.168.200.130

  • 输入指令:vim /etc/sysconfig/network-scripts/ifcfg-ens33
  • 修改文件内容:
  1. # BOOTPROTO="DHCP"
  2. BOOTPROTO="static"
  3. IPADDR=192.168.200.130   # (IP地址,自己设定的)
  4. GATEWAY=192.168.200.2         # (网关,自己设定的)
  5. DNS1=192.168.200.2                 # (域名解析器,自己设定的)
复制代码

  • vmnet8和Linux在同一网段上,要能够通信,也要修改相应的vmnet8
    vmware ---> 编辑 ---> 虚拟网络编辑器
    打开虚拟编辑器,点击vmnet8,修改下面的子网ip为:192.168.200.0
    然后点击NAT设置,将网关改为192.168.200.2
  • 应用确定
  • 输入指令:service network restart或reboot使上述修改生效
12.4、设置Linux主机名和hosts映射

12.4.1、设置主机名

Linux系统的主机名相当于其ip地址的别名,起一个主机名是因为ip地址不好记忆,不方便 -> 修改主机名。
查看当前主机的主机名指令:hostname
主机名放在/etc/hostname文件中,要修改主机名即修改文件内容:

  • vim /etc/hostname
  • 修改内容 -> 保存退出
  • reboot重启系统
12.4.2、设置hosts映射

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

  • 修改ip地址与主机名的映射关系
    在windows C:\Windows\System32\drivers\etc\hosts 文件中,指定Linux系统的ip地址与主机名的映射关系
    格式:linux系统ip地址 linux系统主机名
    如指定为:192.168.218.129 luminescent (这行代码添加到文件中就行了)
  • ping luminescent ---->就会去该文件中找相应的ip地址
在Linux系统中,使用主机名 来 ping 某个Windows系统,怎么做

  • 在 linux 系统的 /etc/hosts 文件中指定ip和hostname映射关系:vim /etc/hosts
  • 输入要添加的文件内容:192.168.218.1 Windows主机名
注意:使用Ctrl + C快捷键终止ping命令
12.5、主机名解析过程分析

12.5.1、hosts

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

DNS(Domain Name System)域名系统:是互联网上作为域名和 IP 地址相互映射的一个分布式数据库
为什么可以通过主机名访问?通过DNS域名解析系统,将主机名解析为ip地址,实际上还是用的ip地址。
12.5.3、DNS解析机制

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

  • 浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,有就先调用这个 IP 完成解析;
    如果没有,就检查 DNS 解析器缓存,如果有直接返回 IP 完成解析。
    这两个缓存,可以理解为本地解析器缓存
  • 如果本地解析器缓存没有找到对应映射,检查系统中 hosts 文件中有没有配置对应的域名 IP 映射,如果有,则完成解析并返回。
  • 如果本地DNS解析器缓存 和 hosts文件 中均没有找到对应的IP,则到域名服务器找
  • 还找不到,就没有了。
说明:DNS解析器缓存
一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的 IP 地址(DNS解析记录)
如在cmd窗口中输入:
ipconfig /displaydns        //DNS域名解析缓存
ipconfig /flushdns          //手动清理dns缓存
示意图:

13、进程管理(⭐)

13.1、基本介绍


  • 在 LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。
    程序执行之后加载到内存中成为进程。程序是静态的,进程是动态的。
  • 每个进程都可能以两种方式存在:前台与后台
    前台进程:是用户目前的屏幕上可以进行操作的。
    后台进程:是实际在操作的,但屏幕上无法看到,通常使用后台方式执行。
  • 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。
13.2、ps指令:查看系统正在执行进程


  • 基本介绍
    ps命令是用来查看目前系统中,有哪些进程正在执行,以及它们执行的状况。可以不加任何参数。
  • 语法格式:ps [选项] ->  线程状态(Process Status)
    常用选项:

    • -a:显示当前终端的所有进程信息
    • -u:以用户的格式显示进程信息
    • -x:显示后台程序运行的参数
    一般是三个选项一起用:ps -aux

    说明:

    • USER: 执行进程用户名称
    • PID: 进程号
    • %CPU: 进程占用CPU百分比
    • %MEM: 进程占用物理内存的百分比
    • VSZ: 进程占用的虚拟内存大小(单位:KB)
    • RSS: 进程占用的物理内存大小(单位:KB)
    • TTY: 终端名称(有时缩写)
    • STAT: 进程状态:

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

    • START: 进程执行的开始时间
    • TIME: CPU 时间,即进程使用 CPU 的总时间
    • COMMAND: 启动进程所用的命令和参数,如果过长会被截断显示

  • ps -axu是将所有进程状态信息显示出来,若只想查找某个进程信息,使用grep指令过滤:ps -axu | grep 进程名
  • 应用实例:以全格式显示当前所有的进程,查看进程的父进程。(父进程:一个进程可以生成多个子进程,该进程称为父进程)
    指令:ps -ef -> 以全格式显示当前所有的进程。-e 显示所有进程。-f 全格式。


    • UID: 用户ID
    • PID: 进程ID
    • PPID: 父进程ID
    • C: CPU 用于计算执行优先级的因子。

      • 数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;
      • 数值越小,表明进程是 I/O 密集型运算,执行优先级会提高

    • STIME: 进程启动的时间
    • TTY: 完整的终端名称
    • TIME: CPU 使用时间
    • CMD: 启动进程所用的命令和参数
    ps -ef | grep sshd指令显示内容如下:
    1. [root@luminescent ~]# ps -ef | grep sshd
    2. root       1294      1  0 08:31 ?        00:00:00 /usr/sbin/sshd -D
    3. root       1443   1294  0 08:31 ?        00:00:00 sshd: root@pts/0
    4. root       6916   1858  0 15:16 pts/0    00:00:00 grep --color=auto sshd
    复制代码
    得到第三列为1,即父进程ID=1

13.3、kill指令:终止进程


  • 介绍:
    若是某个进程执行一半需要停止时,或是已经消耗了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。
  • 基本语法:
    kill [选项] 进程号 -> 通过进程号杀死/终止进程
    killall 进程名称 -> 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
    使用killall,会将该进程的所有子进程也都终止
    常用选项:-9 -> 表示强制终止进程,系统觉得某个程序重要,可能会屏蔽kill指令,这时使用选项-9强制终止进程
  • 案例:

    • 案例 1:踢掉某个非法登录用户
      kill 进程号
      假如使用tom登录,然后在图形界面打开终端写代码。假设认为tom是个非法用户,要踢掉它
      先在图形界面写代码:ps -aux | grep sshd,sshd 是记载远程连接服务的配置文件
      上述指令显示出了,远程登录的进程信息,从中看到了tom登录的进程的进程号11421,以 kill 11421 这样tom就下线了!
    • 案例 2:终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务
      sshd ---> secure shell

      • 首先查看 sshd 对应的进程号:
        使用命令:ps -aux | grep sshd,有 /user/sbin/sshd 的那个进程就是sshd服务进程,进程号10748
        终止 sshd 之后,就无法在xshell远程登陆了!
      • 重启 sshd 服务指令:/bin/systemctl start 服务名称
        /bin/systemctl start sshd.service

    • 案例 3:终止多个gedit(文本编辑器) -> killall 进程名
      在Linux桌面,主文件夹中,打开多个文本,然后使用killall 可以同时关闭所有打开的文本
      killall gedit
    • 案例 4:强制杀掉一个终端
      在Linux系统桌面打开两个终端,bash即代表终端进程
      在一个终端中输入指令强制关闭另一个终端

      • 首先:查看终端进程的进程号:ps -aux | grep bash -> 得到对应的进程号
      • 输入:kill -9 对应的进程号
      也可以终端自己终止自己



13.4、pstree指令:查看进程树


  • 基本语法:pstree [选项]
    功能:可以更加直观的来看进程信息(树的形式)
  • 常用选项:
    -p :显示进程的 PID (父进程ID)
    -u :显示进程的所属用户
  • 应用实例:
    案例 1:用树状的形式显示进程的pid(进程号) -> pstree -p

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

13.5、服务管理

13.5.1、基本介绍

服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd防火墙等),
因此后台程序也称为 服务/守护进程,是 Linux 中非常重要的知识点。
13.5.2、service管理指令


  • 指令:service 服务名 [start | stop | restart | reload | status]
    start:开启服务
    stop:终止服务
    restart:重启服务
    reload:重载服务
    status:查看服务的状态
  • 在 CentOS7.0 后很多服务不再使用service指令管理,而是使用systemctl
  • 还有一些在 /etc/init.d 下的服务仍使用 service 指令管理
    案例:使用 service 指令,查看,关闭,启动 network。[注意:在虚拟系统打开终端演示,因为网络连接会关闭]

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

13.5.3、查看服务名

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



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


13.5.4、服务的运行级别

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

  • 运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
  • 运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
  • 运行级别 2:多用户状态(没有 NFS),不支持网络
  • 运行级别 3:完全的多用户状态(有 NFS),无界面但支持网络,登陆后进入控制台命令行模式
  • 运行级别 4:系统未使用,保留
  • 运行级别 5:X11 控制台,登陆后进入图形 GUI 模式
  • 运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
开机的流程说明:开机 ——> BIOS ——> /boot ——> systemd进程1 ——> 运行级别 ——> 运行 级别对应的服务
CentOS7 后运行级别说明:在/etc/initab进行了简化,如下:
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
查看当前运行级别:systemctl get-default
更改开机默认运行级别:systemctl set-default multi-user.target/graphical.target -> 重启reboot
13.5.5、chkconfig指令

通过chkconfig命令可以给服务在 各个运行级别 设置开启自启动/关闭自启动
chkconfig指令管理的服务在/etc/init.d查看
注意:Centos7.0 后,很多服务使用 systemctl 管理
chkconfig 基本语法:

  • 查看服务和服务在各个级别是开启/关闭自启动  (有限,只能查看chkconfig管理下的服务)
    1. chkconfig --list [| grep xxx]    (若查找某一个服务使用grep过滤)
    复制代码
  • chkconfig 服务名 --list
    1. chkconfig --level 3 服务名 on           给该服务在3运行级别开启自启动
    2. chkconfig --level 5 服务名 off     给该服务在5运行级别关闭自启动
    复制代码
案例演示: 对network服务进行各种操作,把 network 在 3 运行级别 关闭自启动
chkconfig --level 3 network off
注意:chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 生效.
13.5.6、systemctl指令管理服务

基本语法:systemctl [start | stop | restart | status] 服务名
systemctl 指令管理的服务在/usr/lib/systemd/system查看: ls -l /usr/lib/systemd/system

  • systemctl list-unit-files [| grep 服务名]:查看服务开机启动状态, grep 可以进行过滤
  • systemctl enable 服务名:设置服务开机自启动
  • systemctl disable 服务名:关闭服务开机自启动
  • systemctl is-enabled 服务名:查询某个服务是否是自启动的
centos7之后运行级别只有3和5,所以以上指令对3和5运行级别同时适用
应用案例:查看当前防火墙的状况,关闭防火墙和重启防火墙 firewalld.service

  • 查看当前防火墙情况:systemctl status firewalld
    Active: active (running) -> 表示防火墙已经打开
    1. [root@luminescent ~]# systemctl status firewalld
    2. ● firewalld.service - firewalld - dynamic firewall daemon
    3.    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    4.    Active: active (running) since 五 2023-04-14 08:24:06 CST; 1h 20min ago
    5.      Docs: man:firewalld(1)
    6. Main PID: 863 (firewalld)
    7.     Tasks: 2
    8.    CGroup: /system.slice/firewalld.service
    9.            └─863 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    10. 4月 14 08:24:06 luminescent systemd[1]: Starting firewalld - dynamic firewall daemon...
    11. 4月 14 08:24:06 luminescent systemd[1]: Started firewalld - dynamic firewall daemon.
    12. 4月 14 08:24:07 luminescent firewalld[863]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure confi...t now.
    13. Hint: Some lines were ellipsized, use -l to show in full.
    复制代码
  • 关闭防火墙:systemctl stop firewalld
  • 重启防火墙:systemctl start firewalld
    .service写不写都行
注意:关闭或者启用防火墙后,立即生效。但是这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
如果希望设置某个服务自启动或关闭永久生效要使用systemctl [enable|disable] 服务名
13.5.7、防火墙firewall指令

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


  • 打开端口: firewall-cmd --permanent --add-port=端口号/协议
    通过netstat -anp | more指令查看端口号的协议 (more 分页显示),部分显示内容如下
    1. [root@luminescent ~]# netstat -anp | more
    2. Active Internet connections (servers and established)
    3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
    4. tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      710/rpcbind        (监听客户端cmd的服务)
    5. tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1650/dnsmasq        
    6. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1290/sshd         (监听Xshell的服务)
    7. tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1293/cupsd         
    8. tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1450/master         
    9. tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1324/sshd: root@pts
    10. tcp        0      0 192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts
    11. tcp6       0      0 :::111                  :::*                    LISTEN      710/rpcbind         
    12. tcp6       0      0 :::22                   :::*                    LISTEN      1290/sshd
    复制代码
    该指令输出的信息中:
    Local Address表示 ip地址:端口号,Proto 是协议(protocol 协议)
  • 关闭端口: firewall-cmd --permanent --remove-port=端口号/协议
    注意:无论是打开端口还是关闭端口,要重新载入才能生效
    重新载入:firewall-cmd --reload
  • 查询端口是否开放: firewall-cmd --query-port=端口/协议
应用案例:
Windows使用telnet指令提示不是内部命令或可执行程序的解决方案:

  • 方案一:以管理员身份运行cmd后,输入:dism /Online /Enable-Feature /FeatureName:TelnetClient
  • 方案二:打开 控制面板 -> 程序和功能 -> 启用或关闭Windows功能,在这里就可以看到“Telnet客户端”。打勾安装即可

  • 启用防火墙,测试 111 端口是否能 telnet (远程登录) 不行
  • 在Linux系统查看防火墙的111端口的监听状态:
    1. [root@luminescent ~]# firewall-cmd --query-port=111/tcp
    2. no
    复制代码
    在本地主机DOS命令窗口输入:telnet Linux虚拟机ip地址 端口号
    测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 失败
    总结:防火墙打开+端口关闭--->不可以访问端口
  • 防火墙开放 111 端口:firewall-cmd --permanent --add-port=111/tcp
    开放端口后,需要重载:firewall-cmd --reload
    1. [root@luminescent ~]# firewall-cmd --permanent --add-port=111/tcp
    2. success
    3. [root@luminescent ~]# firewall-cmd --reload
    4. success
    复制代码
    测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 成功
    防火墙打开+端口打开--->可以访问端口
  • 再次关闭 111 端口:firewall-cmd --permanent --remove-port=111/tcp
    关闭端口后,需要重载:firewall-cmd --reload
13.6、top指令:动态监控进程


  • 基本介绍:top 与 ps 命令很相似,都用来显示正在执行的进程。
    top与ps最大的不同之处在于: top 在执行一段时间可以更新正在运行的的进程。
  • 基本语法:top [选项]
    常用选项:

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

    • 输入top指令后,每一条都是一个进程
    • 显示内容:


      • 第一行:
        第一个时间 -> 当前时间
        第二个时间 -> 系统已经运行的时长
        3 users -> 有3个用户
        load average -> 负载值(三个值相加除以3>0.7 说明系统负载过大,要提高性能)
      • 第二行:
        Tasks -> 系统任务数
        1 running -> 1个正在运行进程
        257 sleeping -> 184个休眠进程
        0 stopped -> 0个终止进程
        0 zombie -> 0个僵死进程(要清除僵死进程,因为僵死进程无用且占内存空间)
      • 第三行:占用的CPU百分比
        us -> 用户(user)占用的CPU
        sy -> 系统(system)占用的CPU
        ni -> 优先级调用
        id -> 空闲(idle)的CPU
        wa -> I/O等待占用比
      • 第四行:Mem 内存占用情况
        total -> 总共内存
        free -> 空闲内存
        user -> 已使用内存
      • 第五行:Swap 分区
        total -> 总共大小
        free -> 未使用大小
        used -> 已用大小
        avail Mem -> 可获取的内存大小

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

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

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

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


  • netstat指令:查看系统网络情况
    基本语法:netstat [选项]
    选项说明:

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

    netstat指令显示内容说明:

    • Proto:协议
    • Recv-Q:接收信息队列
    • Send-Q:发送信息队列
    • Local Address:本地地址 Linux地址
    • Foreign Address:外部地址
    • State:

      • LISTEN 监听
      • ESTABLISHED 已建立连接
      • TIME_WAIT 超时等待 ---> 某个连接断了之后(如用户退出登录),连接不会立刻消失,而是State变为TIME_WAIT
        系统认为可能是网络状态不好,过一段时间仍无法连接,则连接消失。

    案例:查看服务名为 sshd 的服务的信息。
    1. [root@luminescent ~]# netstat -anp | grep sshd
    2. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1290/sshd           
    3. tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1324/sshd: root@pts
    4. tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      7206/sshd: yxz@pts/
    5. tcp        0     36 192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts
    6. tcp        0      0 192.168.218.129:22      192.168.218.1:56341     ESTABLISHED 7201/sshd: yxz [pri
    7. tcp6       0      0 :::22                   :::*                    LISTEN      1290/sshd           
    8. tcp6       0      0 ::1:6010                :::*                    LISTEN      1324/sshd: root@pts
    9. tcp6       0      0 ::1:6011                :::*                    LISTEN      7206/sshd: yxz@pts/
    10. unix  3      [ ]         STREAM     CONNECTED     25985    1290/sshd            
    11. unix  2      [ ]         DGRAM                    32095    1324/sshd: root@pts  
    12. unix  3      [ ]         STREAM     CONNECTED     95392    7201/sshd: yxz [pri  
    13. unix  3      [ ]         STREAM     CONNECTED     95391    7206/sshd: yxz@pts/  
    14. unix  2      [ ]         DGRAM                    95388    7201/sshd: yxz [pri
    复制代码
    记录详解:
    1. Proto         Recv-Q         Send-Q                 Local Address           Foreign Address         State
    2. tcp        0             36                 192.168.218.129:22      192.168.218.1:60660     ESTABLISHED 1324/sshd: root@pts
    3. tcp        0              0                 192.168.218.129:22      192.168.218.1:56341            ESTABLISHED 7201/sshd: yxz [pri
    复制代码
    要建立连接双方都要有一个端口:22端口在Linux,60660端口和56341端口在Windows。
    示意图如下:


    • 检测连接主机命令ping:是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。
      语法格式:ping 远程主机的ip地址 -> ping www.baidu.com

14、RPM与YUM

14.1、RPM

14.1.1、介绍

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

查询已安装的 rpm软件包 列表:rpm –qa | grep xx
查询结果返回一个软件包的包名
举例:查看当前系统是否安装了 firefox:rpm -qa | grep firefox
查询结果:firefox-102.9.0-3.el7.centos.x86_64
结果说明:

  • 软件名:firefox
  • 版本号:102.9.0-3
  • 适用操作系统: el7.centos.x86_64 (表示centos7.x的64位系统)
如果是i686、i386表示32位系统,noarch表示通用(32/64位系统都适用)
14.1.3、RMP的其他指令


  • rpm -qa:查询所安装的所有 rpm 软件包
  • rpm -qa | grep X:过滤,比如 rpm -qa | grep firefox
  • rpm -q 软件包名:查询某个软件包是否安装
    案例:rpm -q firefox
  • rpm -qi 软件包名:查询软件包的详细信息
    案例: rpm -qi firefox
  • rpm -ql 软件包名:查询软件包中的文件和该软件包在哪个文件下
    案例: rpm -ql firefox
  • rpm -qf 文件全路径名:查询某个文件所属在哪个软件包
    案例:rpm -qf /etc/passwd
    案例:rpm -qf /root/install.log
14.1.4、删除RPM的软件包

基本语法:rpm -e RPM 软件包的名称
-e erase擦去
案例:删除firefox软件包:rpm -e firefox
注意:

  • 如果其它软件包依赖于您要删除的软件包,删除时则会产生错误信息。
    如:rpm -e foo
    removing these packages would break dependencies:foo is needed by bar-1.0-1
    foo软件包被 bar-1.0-1需要,删除foo对barr-1.0-1有影响
  • 如果我们就是要删除 foo 这个 rpm 包,可以增加参数--nodeps,就可以强制删除。但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
    如:rpm -e --nodeps foo(nodeps 不检查依赖关系 no dependencies)
14.1.5、安装RPM软件包

基本语法:rpm -ivh RPM软件包全路径名称
rpm软件包其实是一个软件的安装包
点击Linux系统桌面的光盘,里面有一个Packages文件夹,这个文件夹里有很多rpm软件安装包在/run/media/root/CentOS 7 x86_64/Packages目录下
选项:

  • i=install 安装
  • v=verbose 提示
  • h=hash 进度条
应用实例:演示卸载和安装 firefox 浏览器

  • 卸载:rpm -e firefox
  • 安装:rpm -ivh /run/media/root/CentOS 7 x86_64/Packages/firefox-102.9.0-3.el7.centos.x86_64.rpm
也可以在Packages中找到firefox安装包,复制到某一个目录下,这样写路径简单
14.2、YUM


  • 基本介绍
    Yum(Yellow dog Updater, Modified)是一个Shell前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,
    可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
    使用yum list | grep 软件名向yum服务器查询有没有该软件(类似于手机的应用商城)。有的话,使用yum install 软件名下载安装该软件
  • yum基本指令
    查询 yum 服务器是否有 需要安装的软件:yum list | grep 软件名
    安装指定的软件:yum install 软件名
    案例:请使用 yum 的方式来安装 firefox

    • rpm -e firefox
    • yum list | grep firefox
    • yum install firefox

  • 总结:rpm 是从本地安装包下载,yum 是从yum服务器下载安装软件
15、Linux配置开发环境

15.1、安装JDK8

安装jdk8的步骤:

  • 官网下载Linux版本的jdk8

  • Linux系统创建目录/opt/jdk:mkdir /opt/jdk
  • 使用Xftp7传输到Linux系统下的/opt/jdk
    建议:将下载的压缩包都放在/opt目录下

  • 进入/opt/jdk目录,使用tar命令解压jdk的压缩包:tar -zxvf jdk-8u361-linux-x64.tar.gz
    解压完成后,得到目录:jdk1.8.0_361
    1. [root@luminescent jdk]# ll
    2. 总用量 135516
    3. drwxr-xr-x. 8 root root      4096 4月  14 17:14 jdk1.8.0_361
    4. -rw-r--r--. 1 root root 138762230 4月  14 17:10 jdk-8u361-linux-x64.tar.gz
    复制代码
  • 创建目录/usr/local/java:mkdir /usr/local/java
    建议:将安装的软件放在 /usr/local 目录下
  • 将第三步解压得到的文件夹整个移动到/usr/local/java目录下:mv /opt/jdk/jdk1.8.0_361/ /usr/local/java/
  • 为了能够在任意目录下使用java指令,需要配置环境变量
    配置环境变量的配置文件在/etc/profile文件中

    • 配置java的环境变量JAVA_HOME
    • 配置类路径CLASSPATH,注意:一定要在类路径的开头加上.:
    • 将JAVA_HOME引入到PATH环境变量中,一定要在PATH的最后加上$PATH
    在/etc/profile文件最后,输入以下内容
    1. export JAVA_HOME=/usr/local/java/jdk1.8.0_361
    2. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
    3. export PATH=$JAVA_HOME/bin:$PATH
    复制代码

    • :wq(保存退出)

  • (⭐)为了更新环境变量,使用source命令:source /etc/profile
  • Java环境配置完成。在任意目录使用java -version查看jdk版本

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

  • 创建Hello.java文件:vim Hello.java
    1. public class Hello {
    2.         public static void main(String[] args) {
    3.                 System.out.println("Hello,java!");
    4.         }
    5. }
    复制代码
    :wq保存退出
  • 编译:javac Hello.java
  • 运行:java Hello

15.2、安装tomcat9

15.2.1、安装Tomcat 9


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

  • 在linux系统创建tomcat目录:mkdir /opt/tomcat
  • 使用Xftp7将tomcat的压缩包传输到Linux虚拟机的/opt/tomcat目录
  • 进入/opt/tomcat目录,解压文件:tar -zxvf apache-tomcat-9.0.73.tar.gz
  • 进入解压后的tomcat的bin目录,bin目录结构如下

  • 在/usr/local目录下创建文件夹tomcat:mkdir /usr/local/tomcat
  • 将第四步解压得到的文件夹整个移动到/usr/local/tomcat目录下:mv /opt/tomcat/apache-tomcat-9.0.73/ /usr/local/tomcat/
  • 配置tomcat环境变量

    • 添加tomcat环境变量CATALINA_HOME
    • 将CATALINA_HOME/bin引入到PATH变量中
    1. export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.73
    2. export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
    复制代码

    • :wq保存退出

  • 更新环境变量:source /etc/profile
15.2.2、启动/关闭Tomcat


  • 任意目录下启动tomcat服务:startup.sh
  • 查看8080端口的状态信息:netstat -anp | grep 8080
    1. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    2. tcp6       0      0 :::8080                 :::*                    LISTEN      58900/java
    复制代码
  • 在本机windows访问虚拟机的tomcat:虚拟机的ip地址:8080 -> 失败 -> 原因:虽然开启了tomcat服务,但是防火墙的8080端口任是关闭状态所以无法访问 -> 查看防火墙关于8080端口的状态:firewall-cmd --query-port=8080/tcp
    1. [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
    2. no
    复制代码
  • 永久开启防火墙的8080端口:firewall-cmd --permanent --add-port=8080/tcp
  • 每一次防火墙的更改都需要重载:firewall-cmd --reload
  • 再次查看关于防火墙的8080端口的状态:firewall-cmd --query-port=8080/tcp
    1. [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
    2. yes
    复制代码
  • 再次在主机Windows系统上访问虚拟机的tomcat服务:192.168.218.130:8080 -> 成功
  • 在任意目录下关闭tomcat服务:shutdown.sh
15.2.3、编写第一个网页


  • 启动tomcat服务:startup.sh
  • 进入tomcat的目录webapps下的默认访问目录ROOT:cd /usr/local/tomcat/apache-tomcat-9.0.73/webapps/ROOT
  • 编写一个页面:vim yxz.html,内容如下:
    1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2. <h1> 这是我的第一个Linux系统下的页面 </h1>
    复制代码
    :wq保存退出
    注意: 必须加上,否则会出现中文乱码问题
  • 主机windows访问yxz.html页面:192.168.218.130:8080/yxz.html -> 成功显示

15.3、安装MySQL8.0

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


  • 关闭MySQL服务:systemctl stop mysqld.service
  • 查看当前mysql的安装情况:rpm -qa | grep -i mysql 或 yum list installed | grep mysql
  • 卸载第二步查找到的所有文件:yum remove mysql-xxx
    务必卸载干净,反复执行rpm -qa | grep -i mysql确认是否有卸载残留
  • 删除mysql相关文件

    • 查找mysql相关文件:find / -name mysql
    • 删除上述命令查找出的相关文件:rm -rf xxx
    • 删除Linux系统下mysql的配置文件my.cnf:rm -rf /etc/my.cnf

  • 卸载完成。
15.3.2、安装MySQL


  • 新建文件夹mysql:mkdir /opt/mysql -> 并进入mysql文件夹:cd /opt/mysql
  • 查看Linux系统下是否有自带的数据库:rpm -qa | grep mari
    1. [root@luminescent mysql]# rpm -qa | grep mari
    2. marisa-0.2.4-4.el7.x86_64
    3. mariadb-libs-5.5.68-1.el7.x86_64
    复制代码
  • 删除安装Linux时自带的类mysql数据库mariadb相关文件

    • rpm -e --nodeps marisa
    • rpm -e --nodeps mariadb-libs

  • 下载Linux版本的mysql安装包:下载地址

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

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

  • CentOS7下检查MySQL依赖

    • 由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,需要给/tmp较大的权限。
      执行指令:chmod -R 777 /tmp
    • 安装前检查依赖(如果安装Linux时带图形化界面,则以下依赖都是自带的,可以跳过此步)

      • rpm -qa|grep libaio
      • rpm -qa|grep net-tools
      1. [root@luminescent mysql]# rpm -qa|grep libaio
      2. libaio-0.3.109-13.el7.x86_64
      3. [root@luminescent mysql]# rpm -qa|grep net-tools
      4. net-tools-2.0-0.25.20131004git.el7.x86_64
      复制代码

  • 在mysql的安装目录(/opt/mysql)下依次执行以下命令(必须按照顺序执行)
    1. rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
    2. rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
    3. rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
    4. rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
    5. rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
    复制代码

    注意: 如果没有检查mysql依赖环境,在安装mysql-community-server会报错
    rpm(Redhat Package Manage):通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。

    • -i --install 安装软件包
    • -v --verbose 提供更多的详细信息输出
    • -h --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条

  • 在mysql的安装目录(/opt/mysql)下查看mysql版本信息:mysql --version 或 mysqladmin --verison

  • 执行命令:rpm -qa | grep -i mysql,查看mysql是否安装成功,-i忽略mysql的大小写,可加可不加
    1. [root@luminescent mysql]# rpm -qa | grep -i mysql
    2. mysql-community-client-8.0.25-1.el7.x86_64
    3. mysql-community-common-8.0.25-1.el7.x86_64
    4. mysql-community-libs-8.0.25-1.el7.x86_64
    5. mysql-community-server-8.0.25-1.el7.x86_64
    6. mysql-community-client-plugins-8.0.25-1.el7.x86_64
    复制代码
  • 为了保证数据库目录与文件的所有者为 mysql 登录用户,如果你是以 root 身份运行 mysql 服务,需要执行下面的命令初始化
    mysqld --initialize --user=mysql
    说明:--initialize选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将 该密码标记为过期,登录后需要设置一个新的密码。生成的 临时密码 会往日志中记录一份。
    使用命令:cat /var/log/mysqld.log 查看日志中记录的密码,root@localhost: 后面就是初始化的密码

  • 启动mysql服务:systemctl start mysqld 或者 systemctl start mysqld.service -> 下同,.service可加可不加
    查看mysql服务状态:systemctl status mysqld
    关闭mysql服务:systemctl stop mysqld
    重启mysql服务:systemctl restart mysqld
    说明:mysqld 这个可执行文件就代表着 MySQL 服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。

  • 查看mysql进程:ps -ef | grep mysql

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

  • 查看mysql服务是否自启动:systemctl list-unit-files | grep mysqld.service
    1. [root@luminescent mysql]# systemctl list-unit-files|grep mysqld.service
    2. mysqld.service                                enabled
    复制代码
  • 查看防火墙关于3306端口的开放状态:firewall-cmd --query-port=3306/tcp
    1. [root@luminescent mysql]# firewall-cmd --query-port=3306/tcp
    2. no
    复制代码
  • 将防火墙的3306端口设置永久开放:
    firewall-cmd --permanent --add-port=3306/tcp
    firewall-cmd --add-service=http --permanent
    重启防火墙:firewall-cmd --reload
15.3.3、远程登录MySQL


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

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

    • 因为初始化密码已经过期,所以查看数据库会报错,在mysql中修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
      注意:5.7版本之后(不含5.7),mysql加入了全新的密码安全机制。设置新密码太简单会报错。
    • 执行flush privileges; 刷新权限

  • Linux下修改远程连接配置

    • 登录mysql
    • 使用mysql数据库:use mysql;
    • 查看user表的信息:select Host,User from user;

      可以看到root用户的当前主机配置信息为localhost。
    • 修改Host为通配符%
      Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.218.1。这里的意思就是说root用户只能通过192.168.218.1的客户端去访问。 user=root Host=localhost,表示只能通过本机客户端去访问。而%是个通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。如果 Host=% ,表示所有IP都有连接权限(存在安全问题)。
      注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。
      update user set host = '%' where user ='root';


  • 刷新权限:flush privileges; -> 使对数据库的修改立即生效
  • 如果在远程主机上使用图形化界面工具配置新连接到linux下的mysql8.0出现错误码2058(高版本的图形化界面不会出现该问题)
    原因:分析是mysql8.0密码的加密方法变了。
    解决方案:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Linux上MySQL的密码';
  • Linux系统下MySQL的安装、配置、登录完成。
  • 测试远程主机的图形化界面工具Navicat Premium 16连接mysql8.0.25


16、Shell编程

16.1、为什么用Shell


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


  • 脚本格式要求:
    脚本以#!/bin/bash开头 ---> 确定shell的类型
    脚本需要有可执行权限(x),shell脚本文件以.sh结尾(建议shell脚本文件以.sh结尾),也可以不以.sh结尾
  • 编写第一个Shell 脚本
    需求说明:创建一个 Shell 脚本,输出:hello world!

    • 创建目录:mkdir /root/shcode
    • 进入目录并编辑文件:cd /root/shcode -> vim hello.sh
    • 写入文件内容:
      1. #!/bin/bash
      2. echo "hello,world!"
      复制代码

  • shell脚本的常用执行方式

    • 首先要给shell脚本加x执行权限:chomod u+x hello.sh
      再输入该脚本的相对路径或绝对路径来执行该脚本
      使用相对路径:./hello.sh
      使用绝对路径:/root/shcode/hello.sh
    • 不用赋予脚本+x 权限,直接执行即可。(使用以下指令,即使没有执行权限也可以执行)
      使用指令:sh shell脚本 或者 sh shell脚本的绝对路径
      比如:sh /root/shcode/hello.sh

16.3、Shell变量


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

    • 系统变量:系统自带的变量,如PATH(环境变量)、HOME(当前用户的家目录)
    • 用户自定义变量
    可以通过set指令显示出shell中的所有系统变量
    使用变量:$变量名 -> $PATH $HOME

  • 基本语法
    定义变量:变量名=值(注意:=两边不能有空格 -> Shell编程中定义变量时,=号两边不能有空格)
    撤销变量:unset 变量名(相当于销毁变量)
    声明静态变量:readonly 变量名=值,静态变量只能读,不能修改,也不能撤销unset
    案例:编写脚本var.sh,测试变量:vim var.sh
    1. #!/bin/bash
    2. # 案例1:定义变量 A=520  (#为注释符)
    3. A=520
    4. # 输出变量需要加上$ ($ -> 引用变量)
    5. echo $A
    6. # 输出A = 520
    7. echo A = $A
    8. echo "A = $A"
    9. # 案例2:撤销变量A
    10. unset A
    11. echo A=$A
    12. # 案例 3:声明静态的变量 B=1314.520,不能 unset
    13. readonly B=1314.520
    14. echo B = $B
    15. # unset B -> 报错信息 var.sh: 第 15 行:unset: B: 无法反设定: 只读 variable
    复制代码
  • Shell编程中变量名的定义规则

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

  • 将 命令的返回值 赋给变量
    方式1:变量名=`指令`     -------> 反引号``,运行里面的命令,并把结果返回给变量A
    方式2:变量名=$(指令)    等价于反引号
    1. # 将命令的返回值赋给变量
    2. C=`date`
    3. echo "当前日期时间$C"
    4. D=$(cal)
    5. echo "当前月的月历$D"
    复制代码
  • 设置环境变量
    基本语法:

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

    • source 配置文件             (功能描述:让修改后的配置信息立即生效)
      source /etc/profile
    • echo $变量名                    (功能描述:查询环境变量的值)
      1. # 使用环境变量CATALINA_HOME
      2. echo "CATLINA_HOME=$CATALINA_HOME"
      复制代码

  • shell脚本的注释
    单行注释:
    1. # 这是shell脚本的单行注释
    复制代码
    多行注释:
    1. :<<!
    2. 多行注释1
    3. 多行注释2...
    4. !
    复制代码
16.5、预定义变量


  • 基本介绍:预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
  • 基本语法

    • $$:当前进程的进程号(PID)
    • $!:后台运行的最后一个进程的进程号(PID)
    • $?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。

  • 应用实例:vim preVar.sh
  1. #!/bin/bash
  2. echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
  3. echo "所有的参数=$*"
  4. echo "$@"
  5. echo "参数个数=$#"
复制代码
16.6、运算符


  • 基本介绍:适用运算符在 shell 中进行各种运算操作。
  • 基本语法(三种写法)

    • $((运算式))$
    • $[运算式]$ ---> 推荐使用
    • expr m + n (expression表达式,注意expr表达式中运算符两边要有空格,否则会把整个表达式当成字符串处理)
      expr \*, /, % ----> 表示乘,除,取余
      注意:要将expr的返回值赋给变量,需要使用``将整个expr表达式括起来

  • 应用实例
    1. #!/bin/bash
    2. echo "当前执行的进程ID=$$"
    3. # 以后台方式运行一个脚本,并获取它的进程号
    4. sh /root/shcode/myshell.sh &
    5. echo "最后一个后台方式运行的进程ID=$!"
    6. echo "执行的结果是=$?"
    复制代码
16.7、条件判断


  • 基本语法:if [ condition ] -> 注意:condition前后都必须要有空格
    1. #!/bin/bash
    2. # 案例 1:计算(2+3)X4 的值
    3. # 方式1
    4. RES1=$(((2+3)*4))
    5. echo "res1=$RES1"
    6. # 方式2(推荐使用)
    7. RES2=$[(2+3)*4]
    8. echo "res2=$RES2"
    9. # 方式3
    10. TEMP=`expr 2 + 3`
    11. echo "temp=$TEMP"
    12. RES4=`expr $TEMP \* 4`
    13. echo "res4=$RES4"
    14. # 案例 2:求出命令行的两个参数[整数]的和
    15. SUM=$[$1+$2]
    16. echo "sum=$SUM"
    复制代码
    condition非空返回true,可以使用$?验证(0为true,>1 为false)
    [ shell ] -> 返回 true
    [ ] -> 返回 false
    [ condition ] && echo OK || echo notok -> 条件满足,执行后面的语句
  • 常用判断条件

    • =:字符串比较
    • 两个整数比较

      • -lt 小于(less than)
      • -le 小于等于(less equal)
      • -eq 等于(equal)
      • -gt 大于(greater)
      • -ge 大于等于(greater equal)
      • -ne 不等于(not equal)

    • 按照文件权限进行判断

      • -r 有读的权限
      • -w 有写的权限
      • -x 有执行的权限

    • 按照文件类型进行判断

      • -f 文件存在并且是一个常规的文件
      • -e 文件存在
      • -d 文件存在并是一个目录


  • 应用实例:vim ifdemo.sh
    1. if [ condition ]
    2. then
    3.         语句
    4. fi
    复制代码
16.8、流程控制

16.8.1、if elif语句


  • 基本语法(相当于Java中的else if语句)
    1. #!/bin/bash
    2. if [ "ok" = "ok" ]
    3. then
    4.         echo "相等"
    5. fi
    6. # 案例2:整数比较
    7. if [ 12 -gt 2 ]
    8. then
    9.         echo "大于"
    10. fi
    11. # 案例3:/root/shcode/var.sh 文件是否存在
    12. if [ -f /root/shcode/var.sh ]
    13. then
    14.         echo "文件存在"
    15. fi
    16. # condition非空返回true
    17. if [ ] # condition为假
    18. then
    19.         echo "false"
    20. fi
    21. if [ studyShell ] # condition为真
    22. then
    23.         echo "true"
    24. fi
    25. 输出结果:
    26. 相等
    27. 大于
    28. 文件存在
    29. true
    复制代码
    注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
  • 应用实例:vim ifCase.sh
    1. if [ 条件判断式 ]
    2. then
    3.         代码
    4. elif [ 条件判断式 ]
    5. then
    6.         代码
    7. fi
    复制代码
16.8.2、case语句


  • 基本语法(相当于Java中的switch-case语句)
    1. #!/bin/bash
    2. # 案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
    3. if [ $1 -ge 60 ]
    4. then
    5.         echo "及格了"
    6. else
    7.         echo "不及格"
    8. fi
    9. if [ $1 -ge 60 ]
    10. then
    11.         echo "及格了"
    12. elif [ $1 -lt 60 ]
    13. then
    14.         echo "不及格"
    15. fi
    复制代码
    每个case分支都以;;结尾,这两个;;不能分开
  • 应用实例
    1. case $变量名 in
    2. "值 1")
    3.         如果变量的值等于值 1,则执行程序 1
    4. ;;
    5. "值 2")
    6.         如果变量的值等于值 2,则执行程序 2
    7. ;;
    8. ...省略其他分支...
    9. *)
    10.         如果变量的值都不是以上的值,则执行此程序
    11. ;;
    12. esac
    复制代码
16.8.3、for循环


  • 基本语法
    1. #!/bin/bash
    2. # 案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",是3时,就输出"周三",其它情况输出"other"
    3. case $1 in
    4. "1")    echo "周一";;
    5. "2")    echo "周二";;
    6. "3")    echo "周三"
    7. ;;
    8. *)      echo "other...";;
    9. esac
    复制代码
  • 应用实例
    vim testFor1.sh
    1. # 语法格式1
    2. for 变量 in  值 1  值 2  值 3...
    3. do
    4.         程序/代码
    5. done
    6. # 语法格式2
    7. for (( 初始值;循环控制条件;变量变化 ))
    8. do
    9.         程序/代码
    10. done
    复制代码
    1. #!/bin/bash
    2. # for语法格式1
    3. # 案例:打印命令行输入的参数 [这里可以看出$*  和 $@ 的区别]
    4. # 注意:$* 是把输入的参数当作一个整体,所以只会输出一句话
    5. for i in "$*"
    6. do
    7.         echo "num is $*"
    8. done
    9. # 使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句
    10. echo "======================================"
    11. for j in "$@"
    12. do
    13.         echo "num is $@"
    14. done
    复制代码
    vim testFor2.sh
    1. [root@luminescent shcode]# sh testFor1.sh 100 200 300 400
    2. num is 100 200 300 400
    3. ======================================
    4. num is 100 200 300 400
    5. num is 100 200 300 400
    6. num is 100 200 300 400
    7. num is 100 200 300 400
    复制代码
  • 设置定时调度任务
    1. #!/bin/bash
    2. # 案例1:从 1 加到 100 的值输出显示
    3. SUM=0
    4. for((i=1;i<=100;i++))
    5. do
    6.         SUM=$[$SUM+$i]
    7. done
    8. echo "1-100的总和:$SUM"
    9. # 案例2:根据命令行的参数传入的x值,计算1-x的和
    10. SUMX=0
    11. for(( i=1; i <= $1; i++ ))
    12. do
    13.         SUMX=$[$SUMX + $i]
    14. done
    15. echo "1-$1的总和:$SUMX"
    复制代码
17、日志管理

17.1、基本介绍


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

系统日志文件的保存位置:/var/log/目录下
应用案例:使用root用户通过Xshell7登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure里有没有记录相关信息。
系统常用日志:
日志文件说明/var/log/boot.log系统启动日志/var/log/cron记录与系统定时任务相关的日志/var/log/cups/记录打印信息的日志/var/log/dmesg记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息/var/log/btmp记录错误登录的日志。这是一个二进制文件,不能直接使用vi/vim/cat查看,而要使用lastb命令查看。/var/log/lastlog记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,要使用lastlog命令查看/var/log/maillog记录邮件信息的日志/var/log/message记录系统重要信息的日志,这个日志文件中会记录Linux系统的绝大多数重要信息。如果系统出现问题,首先要检查的应该就是这个日志文件/var/log/secure记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户、sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。是二进制文件,使用last命令查看/var/log/ulmp记录当前已经登陆的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。这个文件不能用vi/vim/cat命令查看,要使用w、who、users等命令查看17.3、日志管理服务rsyslogd

CentOS7.6 日志服务是 rsyslogd(rocket-fast system for log),CentOS6.x日志服务是syslogd。rsyslogd 功能更强大,rsyslogd 的使用、日志文件的格式,和 syslogd 服务是兼容的。rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。将日志记录到对应的文件中。/etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。
原理示意图:


  • 在进行日志管理时,要保证rsyslogd服务是启动的!

    • 查询 Linux 中的 rsyslogd 服务是否启动:
      ps aux | grep "rsyslog"
      ps aux | grep "rsyslog" | grep -v "grep" -> -v选项:表示过滤出不包含的内容(相当于补集)
    • 查询 rsyslogd 服务的自启动状态(是否是自启动状态enable):systemctl list-unit-files | grep rsyslog

  • 配置文件:/etc/rsyslog.conf -> 该配置文件中记录了日志和日志存放在哪个文件
    关于日志:*.* -> 其中第一个*代表日志类型,第二个*代表日志级别

    日志类型说明authpam 产生的日志authprivssh、ftp 等登录信息的验证信息corn时间任务相关kern内核lpr打印mail邮件mark(syslog)-rsyslog服务内部的信息,时间标识news新闻组user用户程序产生的相关信息uucpunix to nuix copy主机之间相关的通信local 1-7自定义的日志设备日志级别级别说明debug有调试信息的,日志通信最多info一般信息日志,最常用notice最具有重要性的普通条件的信息warning警告级别err错误级别,阻止某个功能或者模块不能正常工作的信息crit严重级别,阻止整个系统或者整个软件不能正常工作的信息alert需要立刻修改的信息emerg内核崩溃等重要信息none什么都不记录注意:从上到下,级别从低到高,记录信息越来越少
  • 由日志服务 rsyslogd 记录的日志文件,日志文件的内容:每一行都代表一个事件,每一行有以下四个内容

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

  • 查看日志:查看一下 /var/log/secure 日志,这个日志中记录的是用户验证和授权方面的信息 来分析如何查看

  • 日志管理服务应用实例(增加自定义的日志)
    在/etc/rsyslog.conf 中添加一个日志文件/var/log/yxz.log,当有事件发送时(比如sshd服务相关事件),该文件会接收到信息并保存.

    • vim /etc/rsyslog.conf
    • 写入:*.*/var/log/yxz.log
    • 保存退出
    • >/var/log/yxz.log(创建空的日志文件)
    然后重启,重启事件会被记录到/var/log/yxz.log中

17.4、日志轮替

日志轮替(logrotate)就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后(旧日志文件数量达到某个值的时候),就会进行删除清除日志中旧的信息。
17.4.1、日志轮替时文件命名


  • centos7 使用 logrotate 进行日志轮替管理
    要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数
  • 如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20201010”。
    这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件即可。
  • 如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。
    当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。
    当第二次进行日志轮替时,“secure.1” 会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来
    保存新的日志,以此类推。
17.4.2、logrotate配置文件

/etc/logrotate.conf为logrotate 的全局配置文件(写了日志文件轮替规则)
/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)
可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则
也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用
/etc/logrotate.conf文件内容
  1. [root@luminescent shcode]# sh testFor2.sh 1000
  2. 1-100的总和:5050
  3. 1-1000的总和:500500
复制代码
单独指定某个日志文件的轮替规则的参数说明:
轮替规则的参数说明daily日志的轮替周期是每天weekly日志的轮替周期是每周monthly日志的轮替周期是每月rotate 数字保留的日志文件的个数。0 指没有备份compress日志轮替时,旧的日志进行压缩create mode owner group建立新日志,同时指定新日志的权限与所有者和所属组。mail address当日志轮替时,输出内容通过邮件发送到指定的邮件地址。missingok如果日志不存在,则忽略该日志的警告信息notifempty如果日志为空文件,则不进行日志轮替minsize 大小日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替size 大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。dateext使用日期作为日志轮替文件的后缀。sharedscripts在此关键字之后的脚本只执行一次。prerotate/endscript在日志轮替之前执行脚本命令。postrotate/endscript在日志轮替之后执行脚本命令。17.4.3、自定义的日志加入日志轮替


  • 第一种方法:直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略

  • 第二种方法:在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。
    推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

  • 练习

    • 在/etc/logrotate.d/下创建文件yxz.log:vim yxzlog
    • 写入内容:
      1. while [ 条件判断式 ]
      2. do
      3.         循环体
      4. done
      复制代码
    • 这样就好了,因为/etc/logrotate.conf 中有:include /etc/logrotate.d

17.5、日志轮替机制原理

日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。
在 /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的。crond定时后台程序会定时执行cron.daily内的文件。logrotate 文件在cron.daily下所以也会定时执行文件中的轮替规则 -> 写日志是rsyslogd,日志轮替是logrotate
17.6、查看内存日志

有一些日志是写到内存里的,还没有写到文件里,因为这些日志是实时变化的
重启之后内存日志会被清空
查看内存日志指令:journalctl
journalctl:查看全部
journalctl -n 3:查看最新 3 条
journalctl --since 19:00 --until 19:10:10:查看起始时间到结束时间的日志可加日期
journalctl -p err:报错日志
journalctl -o verbose:日志详细内容
journalctl _PID=1245 _COMM=sshd:查看包含这些参数的日志(在详细日志查看) 或者 journalctl |        grep sshd
注意: journalctl查看的是内存日志, 重启清空
演示案例:使用 journalctl | grep sshd 来看看用户登录清空, 重启系统,再次查询,看看日志有什么变化没有
18、Linux系统备份与恢复

18.1、基本介绍

虚拟机可以做快照。实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。所以可以使用备份和恢复技术
linux的备份和恢复两种方式:

  • 把需要的文件(或者分区)用tar命令打包就行,下次需要恢复的时候,再解压开覆盖即可
  • 使用 dump 和 restore 命令
18.2、安装dump和restore

如果 linux 上没有 dump  和 restore 指令,要先安装
yum -y install dump -> 会安装依赖restore
yum -y install restore
18.3、使用dump完成备份


  • 基本介绍:dump 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)
  • 语法说明:
    1. #!/bin/bash
    2. SUM=0
    3. i=0
    4. while [ $i -le $1 ]
    5. do
    6.         SUM=$[$SUM+$i]
    7. i=$[$i+1]
    8. done
    9. echo "执行结果=$SUM"
    复制代码
    选项说明:
    -c:创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。
    -0123456789:备份的层级。0为最完整备份,会备份所有文件。若指定0以上的层级,则备份至上一次备份以来修改或新增的文件,到9后,可以再次轮替。
    -f :指定备份后文件名
    -j:调用 bzlib 库压缩备份文件,也就是将备份后的文件压缩成 bz2 格式,让文件更小
    -T :指定开始备份的时间与日期
    -u:备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。
    -t:指定文件名,若该文件已存在备份文件中,则列出名称
    -W:显示需要备份的文件及其最后一次备份的层级,时间,日期。
    -w:与-W 类似,但仅显示需要备份的文件。
    进行增量备份/备份层级要加-u,因为-u可以记录层级
  • 案例 1:将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0”
    dump -0uj -f /opt/boot.bak0.bz2 /boot -----> /boot 要备份的分区
    案例 2:在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看这次生成的备份文件 boot1.bak  有多大
    dump -1uj -f /opt/boot.bak1.bz2 /boot
    注意:通过 dump 命令在配合 crontab 可以实现无人值守备份 -> 写一个脚本
  • 显示需要备份的文件及其最后一次备份的层级,时间,日期:dump -W
  • 查看备份时间文件:cat /etc/dumpdates
  • dump 备份文件或者目录
    前面在备份分区时,是可以支持增量备份的,如果备份文件或者目录,不再支持增量备份, 即只能使用 0 级别备份(-u不能写)
    案例:使用 dump 备份 /etc 整个目录:dump -0j -f /opt/etc.bak.bz2 /etc/
注意:如果要备份重要的文件,比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子。
19、Linux面试题

第一题

题目:分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯)
t.log内容:
  1. [root@luminescent shcode]# sh testWhile.sh 10
  2. 执行结果=55
复制代码
解决步骤

  • 读取文件t.log内容
    cat t.log
  • 将读取到的内容以/截断
    cat t.log | cut -d '/'
    所以 以/截断后
    第一段内容:http:
    第二段内容为空(//之间为空)
    第三段内容为ip地址
    第四段内容为网页xxx.html
  • 查找第三段的内容(ip地址)
    cat t.log | cut -d '/' -f 3
    1. #!/bin/bash
    2. #案例 1:读取控制台输入一个 NUM1 值
    3. read -p "请输入一个数 NUM1=" NUM1
    4. echo "你输入的 NUM1=$NUM1"
    5. #案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
    6. read -t 10 -p "请输入一个数 NUM2=" NUM2
    7. echo "你输入的 NUM2=$NUM2"
    复制代码
  • 将获取到的ip地址排序
    cat t.log | cut -d '/' -f 3 | sort
    1. [root@luminescent shcode]# sh testRead.sh
    2. 请输入一个数NUM1=10
    3. 输入的NUM1=10
    4. 请输入一个数NUM2=520
    5. 输入的NUM2=520
    复制代码
  • 统计每个ip地址出现的次数
    cat t.log | cut -d '/' -f 3 | sort | uniq -c
    1. basename [pathname] [suffix]
    2. basename [string] [suffix]
    复制代码
  • 按出现的次数从大到小排序(sort默认以从小到大排序)
    cat t.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr
    1. 案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
    2. basename /home/aaa/test.txt
    3. test.txt
    4. basename /home/aaa/test.txt .txt
    5. test
    复制代码
注意:如果第四步不排序直接统计次数后再排序,会导致不在一起的相同的ip地址出现两个记录的情况
  1. 案例 1:请返回 /home/aaa/test.txt 的 /home/aaa
  2. dirname /home/aaa/test.txt
  3. /home/aaa
复制代码
第二题

题目:统计连接到服务器的各个ip情况,并按连接数从大到小排序(腾讯)

解决步骤

  • 找出建立连接的服务
    netstat -an | grep ESTABLISHED
    1. 基本语法:
    2. [ function ] funname[()]
    3. {
    4.         Action;
    5.         [return int;]
    6. }
    复制代码
  • 以空格分割第一步获取到的服务信息并打印第5段内容(多个空格 看作 1个空格)
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'
    1. #!bin/bash
    2. #案例 1:计算输入两个参数的和(动态的获取)
    3. #定义函数 getSum
    4. function getSum() {
    5.     SUM=$[$n1+$n2]
    6.     echo "和是=$SUM"
    7. }
    8. #输入两个值
    9. read -p "请输入一个数 n1=" n1
    10. read -p "请输入一个数 n2=" n2
    11. #调用自定义函数
    12. getSum $n1 $n2
    复制代码
  • 继续以:分割第二步获取到的信息并打印第一段内容
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}'
    或者
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | cut -d ':' -f 1
    1. [root@luminescent shcode]# sh testFun.sh
    2. 请输入一个整数n1=520
    3. 请输入一个整数n2=1314
    4. 两数之和=1834
    复制代码
  • 对第三步获取到的ip地址进行排序
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort
    1. [root@luminescent shcode]# sh testFun.sh
    2. 请输入一个整数n1=520
    3. 请输入一个整数n2=1314
    4. 两数之和=1834
    复制代码
  • 统计ip地址出现的次数
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c
    1. 30 2 * * * /usr/sbin/mysql_db_backup.sh
    复制代码
  • 根据 ip地址出现的次数多少 从大到小排序
    netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr
    1. 30 2 * * * /usr/sbin/mysql_db_backup.sh
    复制代码
第三题

题目:如何重置mysql5.7数据库的ROOT用户的密码?(滴滴)
解决步骤

  • 编辑mysql的配置文件:vim /etc/my.cnf
    在文件中的[mysqld]标签下添加一行内容:skip-grant-tables
    表示忽略检查权限(不需要输入密码)
  • 重启mysql服务,使修改后的配置文件内容立即生效:service mysqld restart
  • 登录mysql数据库:mysql -u root -p,输入密码的地方直接回车

    • 使用数据库mysql:use mysql;
    • 修改表user的列authentication_string值为数据库的新密码
      update user set authentication_string=password('新密码') where user='root';
    • 刷新权限:flush privileges;
    • 退出数据库:exit;

  • 再次编辑mysql的配置文件,注释掉第一步写入的内容:vim /etc/my.cnf
    #skip-grant-tables
  • 重启mysql服务(使修改的配置文件立即生效):service restart mysqld
  • 重置密码工作已完成。可以使用新密码登录mysql数据库
第四题

题目:统计ip访问情况,要求分析nginx访问日志(access.log),找出访问页面数量在前两位的ip地址(美团)
解决步骤:(原理和第二题一样)
指令:cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2'
head -2 -> 表示只获取前两个信息
第五题

常用的Nginx模块,用来做什么?

  • rewrite模块:实现重写功能
  • access模块:来源控制
  • ssl模块:安全加密
  • ngx_http_gzip_module:网络传输压缩模块
  • ngx_http_proxy_module:网络代理模块
  • ngx_http_upstream_module:模块实现定义后端服务器列表
  • ngx_cache_purge:实现缓存清除功能
第六题

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

  • 首先阐述Linux权限的主要对象
    比如rwx权限作用在文件上的含义,作用在目录上的含义
    rwx权限如何修改,-R权限递归修改选项
  • 根据自己的实际经验考虑因素

    • 注意权限分离,比如Linux系统权限和数据库权限不要再同一个部门
    • 权限最小原则 -> 权限够用就行
    • 减少使用root用户,尽量用普通用户+sudo提权进行操作
    • 重要的系统文件,比如/etc/passwd,/etc/shadow等,日常建议使用chattr(change attribute)锁定,需要操作时再打开
    • 使用SUID,SGID,Sticky设置特殊权限
    • 可以利用工具,比如chkrootkit hunter检测rootkit脚本(rootkit是入侵者使用工具,在不察觉的情况下建立了入侵系统途径)
    • 利用工具Tripwire检测文件系统完整性

第七题(⭐)

题目:Linux的CentOS 7的启动流程?和CentOS 6的相同点和不同点?
CentOS 7的启动流程

CentOS 6的启动流程

第八题

题目:列举Linux高级命令,至少6个(百度)
回答:

  • netstat -> 网络状态监控
  • top -> 动态监控系统运行状态
  • lsblk -> 查看硬盘分区
  • find
  • ps -aux -> 查看运行进程
  • chkconfig -> 查看服务启动状态
  • systemctl -> 管理系统服务
第九题

题目:Linux 查看内存、io读写、磁盘存储、端口占用、进程查看 的命令是什么?(瓜子)
回答

  • 查看内存 -> top指令
  • io读写 -> iotop指令(需要手动安装:yum install iotop)

  • 磁盘存储:df -lh指令
  • 端口占用:netstat -tunlp

  • 进程查看:ps -aux指令 配合管道指令可以查看目标进程
第十题

题目:用linux命令计算t2.txt第二列的和并输出(美团)
t2.txt内容:
  1. /var/log/yxz.log
  2. {
  3.     missingok
  4.     daily
  5.     copytruncate
  6.     rotate 1
  7.     notifempty
  8. }
复制代码
答案:cat t2.txt | awk " " '{sum+=$2} END {print sum}'
第十一题

题目:Shell脚本里如何检查一个文件是否存在?并给出提示(百度)
答案:if [ -f 文件名 ] then echo "存在" else echo "不存在" fi
第十二题

题目:用Shell写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出(百度)。t3.txt内容:
  1. dump [-cu] [-0123456789]        [-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统]
  2. dump [] -wW
复制代码
答案:

  • 排序:sort -n t3.txt -> 从小到大排序,sort -nr t3.txt -> 从大到小排序
  • 统计综合
    sort -nr t3.txt | awk '{sum+=$0; print $0} END'
  • 输出提示信息
    sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}'
    1. http://192.168.218.20/index1.html
    2. http://192.168.218.30/index2.html
    3. http://192.168.218.20/index1.html
    4. http://192.168.218.10/index1.html
    5. http://192.168.218.10/index1.html
    6. http://192.168.218.20/order.html
    7. http://192.168.218.10/order.html
    复制代码
第十三题

题目:使用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat”的文件名称(金山)
答案:grep -r "cat" /home | cut -d ":" -f 1
第十四题

题目:统计/home目录下所有文件个数和所有文件总行数的指令(金山面试题拓展)
答案

  • 统计所有文件个数:find /home -name "*.*" | wc -l
  • 统计所有文件的总行数:find /home -name "*.*" | xargs wc -l
第十五题

题目:列出你了解的web服务器负载架构(滴滴)
Nginx、Haproxy、Keepalived、LVS
第十六题

题目:每天晚上10点30分,打包站点目录/var/spool/mail 备份到/home目录下(每次备份按事件生成不同的备份包 比如按照 年月日时分秒)(滴滴)

  • 编写shell脚本:vim /root/shcode/mail.sh
    1. 192.168.218.20
    2. 192.168.218.30
    3. 192.168.218.20
    4. 192.168.218.10
    5. 192.168.218.10
    6. 192.168.218.20
    7. 192.168.218.10
    复制代码
  • 设置crond任务调度:crontab -e
    1. 192.168.218.10
    2. 192.168.218.10
    3. 192.168.218.10
    4. 192.168.218.20
    5. 192.168.218.20
    6. 192.168.218.20
    7. 192.168.218.30
    复制代码
第十七题

题目:如何优化Linux系统?

  • 对Linux架构的优化
    部署集群 -> 访问一个linux服务器优化成访问多个Linux服务器 -> LVS实现负载均衡

    • 网络优化 -> 每个客户访问LVS,带宽大小优化
    • 磁盘IO优化 -> 提升访问文件系统的速度
    • 文件连接数 -> 读写分离
    • 安全性
    • 防火墙 -> 内部的服务不对外部开放
    • 内存优化,比如关闭不必要的服务

  • 对Linux系统本身的优化----规则

    • 不使用root,使用sudo提示权限
    • 定时的自动更新服务时间,使用nptdate npt1.aliyun.com,让crond定时更新
    • 配置yum源,指向国内镜像
    • 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
    • 打开最大文件数(调整文件的描述的数量):vim /etc/profile ulimit-SHn 65535
    • 配置合理的监控策略
    • 配置合理的系统重要文件的备份策略
    • 对安装的软件进行优化,如Nginx,apache
    • 内核参数进行优化:/etc/sysctl.conf
    • 锁定一些重要的系统文件
    • 禁用不必要的服务,setup指令,ntsysv


来源:https://www.cnblogs.com/Yxz-smile/p/17334298.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具