Linux学习笔记-B站韩顺平_KK-Greyson的博客-CSDN博客

Linux-从入门到入土

image-20230531150126370

VMware 下载

进入官网的 VMware Workstation Pro 页面,浏览功能特性、应用场景、系统要求等。下滑页面点击 试用 Workstation 16 Pro 下方的下载链接,跳转至下载页面。

在这里插入图片描述
在下载页面中下滑,根据操作系统选择合适的产品,在这里以 Windows10 系统为例,选择 Workstation 16 Pro for Windows,开始下载安装文件。

在这里插入图片描述

VMware 安装

打开下载好的 .exe 文件, 即可开始安装。

在这里插入图片描述

安装位置默认在 C 盘下,在这里我选择安装在 D 盘,安装路径尽量不要有中文。可勾选 增强型键盘驱动程序 ,此功能可更好地处理国际键盘和带有额外按键的键盘。

在这里插入图片描述

一直点击 下一步 等待软件安装完成。

在这里插入图片描述

安装成功后点击 许可证 输入密钥激活软件。

密钥 (过期了可以自行百度一个)填写到文本框中点击 输入。

安装后可能要求重启系统,重启后进入软件。依次点击导航栏中的 帮助 -> 关于 VMware Workstation ,查看许可证信息的状态,如下图所示即为激活成功。

在这里插入图片描述

VMware创建虚拟机

1、首先打开下载好的VMware软件,在主页上点击“创建新的虚拟机”

在这里插入图片描述

2、弹出向导窗口,“典型”选项安装过程比较简单,“自定义”选项则可以提供更多高级的选项。这里我选择“自定义”

在这里插入图片描述

3、选择虚拟机硬件兼容性。理论上来说硬件版本越高,兼容性越好。所以我选择列表中版本最高的Workstation 16.x

在这里插入图片描述

4、 安装客户机操作系统。因为该软件比较智能,现在安装会将操作系统直接装好而不需要向导,基于对linux系统安装的学习,这里我选稍后安装。其实只是先后顺序的问题,无太大影响。

在这里插入图片描述

5、 选择操作系统。这里就看使用者的个人要求了,版本众多,都可以。这里我选择Linux(版本如图)

???

6、下一步,命名虚拟机。为虚拟机起一个好听的名字,在给他安个家(就是命名虚拟机和设置虚拟机文件位置,最好别放到C盘)
在这里插入图片描述

7、下一步,处理器配置。处理器内核总数=处理器数量*每个处理器内核数量,根据自己电脑配置,合理选择数量

在这里插入图片描述

8、设置虚拟机内存。在推荐范围内均可,虚拟机是用多少内存就占多少内存(也用不了多少),所以不用担心浪费,只要不太多或太少就行

在这里插入图片描述

9、 网络类型。也就是选择网卡类型。一般选第二个或第三个即可。这里我选第三个。

在这里插入图片描述

10、 后两步选择I/O控制器类型和磁盘类型均选择系统推荐的选项即可

在这里插入图片描述
在这里插入图片描述

11、选择磁盘。若以前没有配置的磁盘,选第一个选项“创建新虚拟磁盘”,若有则选第二个即可

在这里插入图片描述

12、指定磁盘容量。即分配给磁盘的空间大小。推荐大小就够用,也是用多少占多少。注意不要勾选下面的复选框(勾上它就把你设置的磁盘空间全部占为己有了),下面单选选择第一个选项(单个文件便于管理,提高磁盘性能)

在这里插入图片描述

13、到这里虚拟机雏形就准备好了

在这里插入图片描述

14、下面通过配置ISO映像文件来安装系统

首先,我们需要访问CentOS的官方网站。并选择好需要下载的CentOS的版本以及系统架构。

在这里插入图片描述

然后点击镜像所在的下载地址,本文中选择使用了来自清华源的镜像地址

在这里插入图片描述
然后选择一下需要下载的iso镜像文件的版本。如果自己电脑配置比较低,可以选择boot类型的iso镜像文件。本文选择了dvd带图形界面的镜像文件。
在这里插入图片描述
选择ISO文件准备开机
在这里插入图片描述

网络连接的三种方式

1、桥接模式

在此模式下,虚拟机就像是独立的主机,和真实的物理主机是一样的地位,可以通过虚拟机所在的物理主机访问外网,外网中的其他主机也可以访问此虚拟机。虚拟机与外网主机通讯需要满足以下条件:

  • 虚拟机所创建保存的物理主机与其他主机在同一局域网下
  • 为虚拟机设置一个与创建该虚拟机的主机的物理网卡在同一网段的IP
  • 虚拟机与创建该虚拟机的物理主机设置为桥接模式

下面针对以上三个条件进行详解:

条件1只需满足几台电脑连接在同一局域网即可;

条件2需要设置虚拟机和物理主机的网络在同一网段下,具体设置方法如下(以VM软件为例):

1、在VW的编辑菜单中选择虚拟网络编辑器,并将VMnet信息中的模式选为桥接模式。若物理主机使用的无线网卡连接局域网,则同样需要在VM中设置为桥接至无线网卡;同理桥接至有线网卡。设置好点击确定即可。

2、设置好桥接模式之后,由于模式的改变,需要在Linux终端中重启网络连接,否则无法实现通讯。重启网络连接的命令行为:

1
systemctl restart network

3、网络重启之后,在物理主机的系统上(默认为Win)查看当前正在使用的网卡的IP地址:

4、最后在Linux终端上修改虚拟机的IP,为保证虚拟机IP与物理主机的IP在同一网段,需要保证IP地址的前三位是相同,最后一位在符合定义的情况下随意设置即可。命令行操作为:

1
ifconfig ens33 10.141.117.12/24

其中,ens33为虚拟机的网卡,/24表示子网掩码

至此,在桥接模式下即可实现虚拟机与其他物理主机的通讯,通讯命令为:ping 其他物理主机的IP地址

1
ping 10.141.117.22

2、仅主机模式

仅主机模式表示的是物理主机与物理主机之间用同一局域网连接,虚拟机则是采用的虚拟网络连接,它与物理网络是隔开的,所以此模式下虚拟机与别的物理主机无法实现通信。一般在安装VM之后,软件会自动添加VMnet1和VMnet8两块虚拟网卡。也就是说,仅主机模式下,只能实现虚拟机和创建虚拟机的物理主机之间的通讯。该模式通讯需满足的条件为

  • 虚拟机的IP和物理主机的VMnet1网卡的IP在同一网段内

下面针对该条件进行详解:

1.在VM中设置虚拟网络模式为仅主机模式,然后重启虚拟机的网络

2.在Win中找到VMnet1的IP地址,然后在虚拟机中设置为同一网段即可

3.最后ping 物理主机IP地址

3、NAT模式(网络地址转换模式)

NAT模式对应的虚拟网络为VMnet8,这是一个独立的网络。此模式下物理主机就像是一台支持NAT功能的代理服务器,虚拟机就像是NAT的客户端一样。虚拟机可以使用物理主机的IP地址访问互联网,但由于NAT技术的特点,外部网络中的主机无法主动与NAT模式下的虚拟机进行通讯。也就是说,只能是由虚拟机到外部网络计算机的单向通信物理主机与NAT模式下的虚拟机是可以互通的,前提是要虚拟机的IP与VMnet8的网卡IP在同一网段内。

此模式的结构图与仅主机模式结构图一样。

主机与NAT模式下的虚拟机是可以互通的,前提是要虚拟机的IP与VMnet8的网卡IP在同一网段内。

虚拟机克隆

虚拟机快照

在学习阶段我们无法避免的可能损坏Linux操作系统。

如果损坏的话,重新安装一个Linux操作系统就会十分麻烦。

VMware虚拟机(Workstation和Funsion)支持为虚拟机制作快照。

通过快照将当前虚拟机的状态保存下来,在以后可以通过快照恢复虚拟机到保存的状态。

img

VMware Workstation Pro中制作并还原快照(windows)

img

img

img

img

img

vmtools–与电脑主机共享文件


VM Tools安装过程


一、VM Tools安装步骤

在这里插入图片描述在这里插入图片描述
此时系统会弹出装载虚拟CD驱动器 点击打开文件

在这里插入图片描述
打开文件后可将 文件夹里的文件全部复制到自己的某个文件夹中,比如桌面

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
注意:这里的文件名是你自己桌面上那个.gz文件 的名称,根据自己对应的版本来哦

这时候你的桌面上应该多了一个文件夹,下面执行命令:

1
2
3
4
cd vmware-tools-distrib

sudo ./vmware-install.pl
123

然后输入密码,一路 enter/YES,就OK了!

到这里VMware tools安装完成,试着将文件拖动到liunx系统当中!
在这里插入图片描述
重启虚拟机,有个重新安装VM Tools证明安装成功了
在这里插入图片描述


二、安装后无法使用问题解决办法之一

root用户进入后设置共享文件夹总是启动

1.更改虚拟机设置,选择“编辑虚拟机设置”,在“选项”中启用“共享文件夹”,然后设置自己方便的文件夹,我这里设置为自己电脑的桌面,方便文件的复制。同时检查“客户机隔离”选项内是否启用拖放和复制粘贴,如果没有记得打开。

在这里插入图片描述在这里插入图片描述

我设置的是我的桌面
在这里插入图片描述

在这里插入图片描述
2.找到刚刚设置的文件夹路径(C:\Users\user\Desktop),将该文件夹路径开启共享权限,为了防止出现问题,我选择把“共享”和“高级共享”都开启

在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.打开Ubuntu,在终端界面依次输入以下命令,检查共享的文件夹能否在Ubuntu内查看,首先进入mnt/hgfs文件夹,输入“ls”看看共享的文件夹“Desktop”是否存在,如果存在则说明共享成功。

在这里插入图片描述
这个时候进入Desktop里面的文件就是WIN桌面的文件

Linux系统目录结构----重点记忆!

目录

1、Linux目标结构的特点

2. Linux目录结构

二、Linux文件系统介绍

1. 索引介绍:

2. Linux链接介绍

三、linux文件系统操作

1. 文件的基本概念

2. Linux系统下的通配符(20个)

3. Linux系统下的常用快捷操作(七个)

四、Linux文件操作

五、linux目录操作


1、Linux目标结构的特点

Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。 微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。 Linux的虚拟文件系统允许众多不同类型的文件系统共存,并支持跨文件系统的操作。 Linux的文件是无结构字符流式文件,不考虑文件内部的逻辑结构,只把文件简单地看作是一系列字符的序列。 Linux的文件可由文件拥有者或超级用户设置相应的访问权限而收到保护。 Linux把所有的外部设备都看作文件,可以使用与文件系统相同的系统调用来读写外部设备。

2. Linux目录结构

img

常见:

/:是所有文件的根目录;

/bin:存放二进制可执行命令目录;

/home:用户主目录的基点目录,默认情况每个用户主目录都设在该目录下,如默认:用户user01的主目录是/home/user01,可用~user01表示

/lib:存放标准程序设计库目录,又叫动态链接共享库目录,目录中文件类似windows里的后缀名为dll的文件;

/etc:存放系统管理和配置文件目录;

/dev:存放设备特殊文件目录,如声卡文件,磁盘文件等;

/usr:最庞大的目录,存放应用程序和文件目录;

/proc[不能动]:虚拟目录,是系统内存的映射,可直接访问这个目录来获取系统信息;

/root:系统管理员的主目录(特权阶级)

/var:存放系统产生的经常变化文件的目录,例如打印机、邮件等假脱机目录、日志文件、格式化后的手册页以及一些应用程序的数据文件等;

/tmp:存放公用临时文件目录。

补充:
/etc/rc.d 启动的配置文件和脚本

/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序

/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。

/lost+found 这个目录平时是空的,用于存放系统非正常关机而留下未保存的文件

/opt 软件安装包文件夹

/usr其中包含:

/usr/X11R6 存放X window的目录

/usr/bin 众多的应用程序

/usr/sbin 超级用户的一些管理程序

/usr/doc linux文档

/usr/include linux下开发和编译应用程序所需要的头文件

/usr/lib 常用的动态链接库和软件包的配置文件

/usr/man 帮助文档

/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里

/usr/local/bin 本地增加的命令

/usr/local/lib 本地增加的库

二、Linux文件系统介绍

文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。 linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。 一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。

1. 索引介绍:

Llinux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。

索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。

一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。

系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。

linux文件系统将文件索引节点号和文件名同时保存在目录中。

所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。

对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。

因此,在磁盘上的同一个文件可以通过不同的路径去访问它。

2. Linux链接介绍

可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。

linux文件系统操作

1. 文件的基本概念

在linux中,一切皆文件。文件是由创建者定义的,具有文件名的一组相关元素的集合,文件可以是文本文档、图片、程序等。Linux系统下文件名长度根据不同类型文件系统有所不同。

文件取名必须遵守以下规则:
\1. 除“/”外,所有字符都可使用;

\2. 转义字符最好不用,如“ ? ”," * “(星号),” "(空格),“ $ ”,“ & ”等;

\3. 避免使用“ + ”,“ - ”或“ . ”作为普通文件名的第一个字符(在Linux下以“ . ”开头的文件都是隐藏文件);

\4. Linux系统的文件名大小写敏感。

2. Linux系统下的通配符(20个)

* :通配符,代表任意字符(0到多个)

?:通配符,代表一个字符

# :注释

\ :转义符号,将特殊字符或通配符还原成一般符号

| :分割两个管线命令的界定

; :连续性命令的界定

~ :用户的根目录

$ :变量前需要加的变量值

! :逻辑运算中的“非”

/ :路径分割符号

> :输出导向,分别为“取代”和“累加”

>>:输出导向,分别为“取代”和“累加”

’ :不具有变量置换功能

" :具有变量置换功能

:quote符号,两个中间为可以先执行的指令

() :中间为子shell的起始与结束

[] :中间为字符组合

{} :中间为命令区块组合

&&:当该符号前一个指令执行成功时,执行后一个指令

|| :当该符号前一个指令执行失败时,执行后一个指令

3. Linux系统下的常用快捷操作(七个)

Ctrl+C:终止当前命令

Ctrl+D:输入结束

Ctrl+M:相当于Enter

Ctrl+S:暂停屏幕的输出

Ctrl+Q:恢复屏幕的输出

Ctrl+U:在提示符下,将整行命令删除

Ctrl+Z:暂停当前命令

四、Linux文件操作

\1. 显示文件内容(6个):cat、more、less、head、tail

\2. 搜索、排序、去重(三个):grep、sort、uniq

\3. 比较(两个):comm、diff

\4. 复制、删除、移动(三个):cp、rm、mv

\5. 统计(一个):wc

\6. 查找(一个):find locate which grep

\7. 压缩解压缩(三个):bzip2、gzip、tar

五、linux目录操作

\1. 切换工作目录和显示当前目录(3个):cd、pwd、ls

\2. 创建和新建目录(2个):mkdir、rmdir

\3. 改变文件或目录存取权限命令(1个):权限概念、文件长格式解读、chmod(改编权限)

\4. 改变用户组和文件组(2个):chgrp、chown

\5. 链接文件(1个):ln

Linux远程登录—xshell

第一步:在Linux上查看SSH的工作状态:打开Linux终端,输入systemctl status sshd,如图所示,红色方框里的内容说明你安装了SSH并且正在工作;

58f23bf43f634e9abefc7710ca634bab.png

第二步:查看服务器的IP地址:打开Linux终端,输入ifconfig,如图所示红色方框里的内容,即为IP地址(每一台电脑都不一样);798579d9f9ae4020b2c09f6bfd012855.png

第三步:连通测试:打开Windows系统的黑窗口,按住Windows+R,输入cmd,打开之后直接输入ping+IP地址(为第二步里面的IP地址),显示如图所示,即为连通成功;

1cc96c3ae15a46cc9fff13c4326c74f7.png

第四步:提前下载安装好Xmanager5,打开里面的xshell.exe(不止这一种远程登录工具,也可使用其他的),

37ef1c85d65a4e8dbb9062ef4faa4384.png

即可看到会话窗口,点击新建,fb5328fa55134f948c56fa9a4a289fbf.png

为了方便区分,可将名称改为 CentOS 虚拟机,协议和端口号不可以更改,将主机修改为IP地址(为第二步里的IP地址),点击确定,ca961a6005d34809a631b37094f43885.png

选择CentOS 虚拟机,点击连接,

47026e69d0244acf979b687536f0bd49.png 输入root(为超级管理员),点击确定,

61306cfbb85045e189bade6152f24dcd.png

输入root的密码,再点击确定。(注意:如果登录失败,可以试试使用普通用户登录,且虚拟机登录的用户也需要是普通用户,虚拟机和xshell的用户需要保持一致。)

890620369ed7416c8a35871d238d68ab.png

如图所示,即为远程登录Linux成功 。431b617a1c544453b5711e6cede6b6cd.png

Linux远程传输文件—xtfp6

4.3 远程上传下载文件-Xftp6

4.3.1 Xftp介绍

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

img
​ 软件下载方法在前面说过了

4.3.2 Xftp6安装

步骤一:以管理员的身份运行 这个安装包

img

点击下一步
img

接受协议,点击下一步
img

用户名和公式名称默认,点击下一步

img

步骤二:选择安装目录,点击下一步
img

点击安装

img
安装成功,点击完成
img

到这里 Xftp6 就安装成功了!

4.3.3 Xftp6的配置和使用

步骤一:双击打开 Xftp6,点击新建
img

步骤二:输入会话名称,可以随意 => 输入主机地址,要连接的虚拟机的IP地址 => 协议选择:SFTP => 端口号选则:22。点击确定。

img

步骤三:选择刚刚创建的会话,点击连接
img
点击一次性接受
img

**步骤四:输入用户名,点击确定。输入密码,点击确定。(*这里的用户名和密码,就是你虚拟机的用户名密码,*账号为:root,密码为:root)
img

img

这个时候就连接成功了。左边为我们 Windows 的文件目录,而右边的是 虚拟机Linux 的文件目录。img

4.3.4 使用 Xftp6 传输文件

鼠标右击 需要传输到Linux虚拟机的文件,点击传输。

img

img

此时打开Linux虚拟机,进入/opt目录下,就可以查看到这张图片img

到这,我们的文件传输就成功了。同样的道理,也可以把Linux中的文件传输到Windows。

Linux中的记事本软件–vim

一、VIM编辑器

1)vi概述

vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。

2)vim编辑器

Vim(Vi improved)是vi编辑器的加强版,比vi更容易使用。vi的命令几乎全部都可以在vim上使用。

3)vim编辑器的安装

☆ 已安装

Linux通常都已经默认安装好了 vi 或 Vim 文本编辑器,我们只需要通过vim命令就可以直接打开vim编辑器了,如下图所示:

vim

☆ 未安装

有些精简版的Linux操作系统,默认并没有安装vim编辑器(可能自带的是vi编辑器)。当我们在终端中输入vim命令时,系统会提示"command not found"。

解决办法:有网的前提下,可以使用yum工具对vim编辑器进行安装

1
2
3
# 安装vim且询问是否时自动选择yes
# yum install vim -y
12

4)vim编辑器的四种模式(!)

☆ 命令模式

使用VIM编辑器时,默认处于命令模式。在该模式下可以移动光标位置,可以通过快捷键对文件内容进行复制、粘贴、删除等操作。

☆ 编辑模式或输入模式

在命令模式下输入小写字母a或小写字母i即可进入编辑模式,在该模式下可以对文件的内容进行编辑

☆ 末行模式

在命令模式下输入冒号:即可进入末行模式,可以在末行输入命令来对文件进行查找、替换、保存、退出等操作

☆ 可视化模式

可以做一些列选操作(通过方向键选择某些列的内容,类似于Windows鼠标刷黑)

二、VIM四种模式的关系

1)VIM四种模式

  • 命令模式
  • 编辑模式
  • 末行模式
  • 可视化模式

2)VIM四种模式的关系

Vim编辑器模式关系图

三、VIM编辑器的使用

1)使用vim打开文件

基本语法:

1
2
# vim  文件名称
1

① 如果文件已存在,则直接打开

② 如果文件不存在,则vim编辑器会自动在内存中创建一个新文件

案例:使用vim命令打开readme.txt文件

1
2
# vim readme.txt
1

2)vim编辑器保存文件

在任何模式下,连续按两次Esc键,即可返回到命令模式。然后按冒号:,进入到末行模式,输入wq,代表保存并退出。

Vim 低行模式 wq 保存退出

3)vim编辑器强制退出(不保存)

在任何模式下,连续按两次Esc键,即可返回到命令模式。然后按冒号:,进入到末行模式,输入q!,代表强制退出但是不保存文件。

Vim 低行模式 Q叹强制退出

vim命令大全

1.vim介绍

vim编辑器有三种模式:

命令模式、编辑模式、末行模式

模式间切换方法
(1)命令模式下,输入:后,进入末行模式
(2)末行模式下,按esc慢退、按两次esc快退、或者删除所有命令,可以回到命令模式
(3)命令模式下,按下ia等键,可以计入编辑模式
(4)编辑模式下,按下esc,可以回到命令模式

vim打开文件

Vi 使用的选项 说 明
vim filename 打开或新建一个文件,并将光标置于第一行的首部
vim -r filename 恢复上次 vim 打开时崩溃的文件
vim -R filename 把指定的文件以只读方式放入 Vim 编辑器中
vim + filename 打开文件,并将光标置于最后一行的首部
vi +n filename 打开文件,并将光标置于第 n 行的首部
vi +/pattern filename 打幵文件,并将光标置于第一个与 pattern 匹配的位置
vi -c command filename 在对文件进行编辑前,先执行指定的命令

2.命令模式

1.光标移动

快捷键 功能描述
jkhl 基本上下左右
gg 光标移动到文档首行
G 光标移动到文档尾行
^或_ 光标移动到行首第一个非空字符
home键或0或者g0 光标移动到行首第一个字符
g_ 光标移动到行尾最后一个非空字符
end或或者 g 或者g或者g 光标移动到行尾最后一个字符
gm 光标移动到当前行中间处
b/B 光标向前移动一个单词(大写忽略/-等等特殊字符)
w/W 光标向后移动一个单词(大写忽略/-等等特殊字符)
e/E 移到单词结尾(大写忽略/-等等特殊字符)
ctrl+b或pageUp键 翻屏操作,向上翻
ctrl+f或pageDn键 翻屏操作,向下翻
数字+G 快速将光标移动到指定行
`. 移动到上次编辑处
数字+上下方向键 以当前光标为准,向上/下移动n行
数字+左右方向键 以当前光标为准,向左/右移动n个字符
H 移动到屏幕顶部
M 移动到屏幕中间
L 移动到屏幕尾部
z+Enter键 当前行在屏幕顶部
z+ . 当前行在屏幕中间
z+ - 当前行在屏幕底部
shift+6 光标移动到行首
shift+4 光标移动到行尾
- 移动到上一行第一个非空字符
+ 移动到下一行第一个非空字符
) 向前移动一个句子
( 向后移动一个句子
} 向前移动一个段落
{ 向前移动一个段落
count l 移动到count 列
counth 向左移动count 字符
countl 向右移动count字符
countgo 移动到count字符

2.选中内容

快捷键 功能描述
v 进行字符选中
V 或shift+v 进行行选中
gv 选中上一次选择的内容
o 光标移动到选中内容另一处结尾
O 光标移动到选中内容另一处角落
ctr + V 进行块选中

3.复制(配合粘贴命令p使用)

快捷键 功能描述
y 复制已选中的文本到剪贴板
n+yy 复制光标所在行,此命令前可以加数字 n,可复制多行
yw 复制光标位置的单词
ctrl+v + 方向键+yy ctrl+v,并按方向键选中区块,按下yy复制

4.剪切

快捷键 功能描述
dd 剪切光标所在行
数字+dd 以光标所在行为准(包含当前行),向下剪切指定行数
D 剪切光标所在行

5.粘贴

快捷键 功能描述
p 将剪贴板中的内容粘贴到光标后
P(大写) 将剪贴板中的内容粘贴到光标前

6.删除

快捷键 功能描述
x 删除光标所在位置的字符
X(大写) 删除光标前一个字符
dd 删除光标所在行,删除之后,下一行上移
D 删除光标位置到行尾的内容,删除之后,下一行不上移
ndd 删除当前行(包括此行)后 n 行文本
dw 移动光标到单词的开头以删除该单词
dG 删除光标所在行一直到文件末尾的所有内容
:a1,a2d 删除从 a1 行到 a2 行的文本内容

7.撤销/恢复

快捷键 功能描述
u 撤销
ctrl+r 恢复
U(大写) 撤销所有编辑

8.字符转换

快捷键 功能描述
~ 转换大小写
u 变成小写
U 变成大写

9.编辑命令的快捷键

快捷键 功能描述
↑或ctr + p 上一条命令
↓或ctr + n 下一条命令
ctr + b 移动到命令行开头
ctr + e 移动到命令行结尾
ctr + ← 向左一个单词
ctr + → 向右一个单词

3.末行模式(: xxx命令)

1.保存/退出文件操作

命令 功能描述
:wq 保存并退出 Vim 编辑器
:wq! 保存并强制退出 Vim 编辑器
:q 不保存就退出 Vim 编辑器
:q! 不保存,且强制退出 Vim 编辑器
:w 保存但是不退出 Vim 编辑器
:w! 强制保存文本
:w filename 另存到 filename 文件
x! 保存文本,并退出 Vim 编辑器
ZZ 直接退出 Vim 编辑器

2.查找:“/关键词”

在查找结果中,用Nn可以切换上下结果;输入nohl,可以取消高亮

快捷键 功能描述
/abc 从光标所在位置向前查找字符串 abc
/^abc 查找以 abc 为行首的行
/abc$ 查找以 abc 为行尾的行
?abc 从光标所在位置向后查找字符串 abc
n或; 向同一方向重复上次的查找指令
N或, 向相反方向重复上次的查找指定

3.替换

快捷键 功能描述
r 替换光标所在位置的字符
R 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束
:s/a1/a2 替换当前光标所在行第一处符合条件的内容
:s/a1/a2/g 替换当前光标所在行所有的 a1 都用 a2 替换
:%s/a1/a2 替换所有行中,第一处符合条件的内容
:%s/a1/a2/g 替换所有行中,所有符合条件的内容
:n1,n2 s/a1/a2 将文件中 n1 到 n2 行第一处 a1 都用 a2 替换
:n1,n2 s/a1/a2/g 将文件中 n1 到 n2 行所有 a1 都用 a2 替换

4.行号显示:“: set nu”;

  1. 行号显示:set nu
  2. 取消行号显示::set nonu

5.文件切换

使用vim打开多个文件后,在末行模式下可以进行切换。

  1. 查看当前已经打开的所有文件::files(%a表示激活状态,#表示上一个打开的文件)
  2. 切换到指定文件::open 文件名
  3. 切换到上一个文(back previous)::bp
  4. 切换到下一个文件(back next)::bn

4.编辑模式

快捷键 功能描述
i 在当前光标所在位置插入,光标后的文本相应向右移动
I 光标所在行的行首插入,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令
o 光标所在行的下插入新的一行。光标停在空行首,等待输入文本
O(大写) 光标所在行的上插入新的一行。光标停在空行的行首,等待输入文本
a 在当前光标所在位置之后插入
A 光标所在行的行尾插入,相当于光标移动到行尾再执行 a 命令
esc键 退出编辑模式

image-20230601172933668

5.扩展

1.代码颜色显示:“:syntax on/off”

2.vim内置计算器
a.进入编辑模式
b.按“ctrl+r,光标变成引号,,输入=,光标转到最后一行
c.输入需要计算的内容,按下enter后,计算结果回替代上一步中的引号,光标恢复

3.vim的配置
a.文件打开时,末行模式下输入的配置为临时配置,关闭文件后配置无效
b.修改个人配置文件,可以永久保存个人配置(~/.vimrc,如果没有可以自行创建)
c.修改全局配置文件,对每个用户生效(vim自带,/etc/vimrc)

注:个人配置文件优先级更高,当个人配置和全局配置发生冲突时,系统以当前用户的个人配置文件为准

4.异常退出
在编辑文件后,未正常保存退出时,会产生异常退出交换文件(.原文件名.swp)
将交换文件删除后,再次打开文件时,无提示:“#rm -f .原文件名.swp”

5.别名机制:自定义指令
Linux中,存在一个别名映射文件: ~/.bashrc
修改文件内容,可以自定义指令,重新登录账号后生效

6.文件快捷方式
对于深层文件,可以创建文件快捷方式,便于后续操作:#ln -s 源路径 新路径
\7. 退出方式
(1)在vim中退出文件编辑模式,可以使用:q或者:wq
(2)建议使用:x:使用效果等同于wq,如果文件有改动则先保存后退出;但是如果文件没有做修改,会直接退出,不会修改文件更新时间,避免用户混淆文件的修改时间

五、可视化模式

1)如何进入到可视化模式

在命令模式中,直接按ctrl + v(可视块)或V(可视行)或v(可视),然后按下↑ ↓ ← →方向键来选中需要复制的区块,按下y 键进行复制(不要按下yy),最后按下p 键粘贴

退出可视模式按下Esc

2)可视化模式复制操作

第一步:在命令模式下,直接按小v,进入可视化模式

第二步:使用方向键↑ ↓ ← →选择要复制的内容,然后按y键

第三步:移动光标,停在需要粘贴的位置,按p键进行粘贴操作

3)为配置文件添加#多行注释(!)

第一步:按Esc退出到命令模式,按gg切换到第1行

第二步:然后按Ctrl+v进入到可视化区块模式(列模式)

第三步:在行首使用上下键选择需要注释的多行

第四步:按下键盘(大写)“I”键,进入插入模式(Shift + i)

第五步:输入#号注释符

第六步:输入完成后,连续按两次Esc即可完成添加多行注释的过程

4)为配置文件去除#多行注释(!)

第一步:按Esc退出到命令模式,按gg切换到第1行

第二步:然后按Ctrl+v进入可视化区块模式(列模式)

第三步:使用键盘上的方向键的上下选中需要移除的#号注释

第四步:直接按Delete键即可完成删除注释的操作

六、VIM编辑器实用功能

1)代码着色

之前说过vim 是vi 的升级版本,其中比较典型的区别就是vim 更加适合coding,因为vim比vi 多一个代码着色的功能,这个功能主要是为程序员提供编程语言升的语法显示效果,如下:

第一步:定义后缀名为网页文件的代码文件

1
2
# vim index.php
1

第二步:编写对应的PHP代码

1
2
3
4
<?php
echo 'hello world';
?>
123

在VIM编辑器中,我们可以通过:syntax on:syntax off开启或关闭代码着色功能。

2)异常退出解决方案

什么是异常退出:在编辑文件之后并没有正常的去wq(保存退出),而是遇到突然关闭终端或者断电的情况,则会显示下面的效果,这个情况称之为异常退出:

vim bug

温馨提示:每个文件的异常文件都会有所不同,其命名规则一般为.文件名称.swp

解决办法:将交换文件(在编程过程中产生的临时文件)删除掉即可【在上述提示界面按下D 键或者使用rm 指令删除交换文件】

1
2
# rm .1.php.swp
1

3)退出vim编辑器

回顾:在vim中,退出正在编辑的文件可以使用:q或者:wq除了上面的这个语法之外,vim 还支持另外一个保存退出(针对内容)方法:x

:x在文件没有修改的情况下,表示直接退出(等价于:q),在文件修改的情况下表示保存并退出(:wq

② 如果文件没有被修改,但是使用wq 进行退出的话,则文件的修改时间会被更新;但是如果文件没有被修改,使用x 进行退出的话,则文件修改时间不会被更新的;主要是会混淆用户对文件的修改时间的认定。

Linux中的关机与重启命令

1. 关机重启命令汇总

halt 关机 root用户 halt:只关闭系统,电源还在运行 halt -p:关闭系统,关闭电源(先执行halt,再执行poweroff)
poweroff 关机 root用户 poweroff会发送一个关闭电源的信号给acpi
reboot 重启 root用户
shutdown -h:关机 -r:重启 -c:取消shutdown操作 root用户 shutdown实际上是调用init 0, init 0会cleanup一些工作然后调用halt或者poweroff shutdown -r now:一分钟后重启 shutdown -r 05:30:最近的5:30重启 shutdown -r +10:十分钟后重启
init init 0:关机 init 6:重启 root用户 init:切换系统的运行级别
systemctl systemctl halt [-i]:关机 systemctl poweroff [-i]:关机 systemctl reboot [-i]:重启 普通用户 超级用户 普通用户需要加-i root用户不需要加-i

在关机或者重启之前,执行3至4次sync,将在内存中还未保存到硬盘的数据更新到硬盘中,否则会造成数据的丢失。执行sync时要以管理员的身份运行,因为管理员具有所有文件的权限,而普通用户只具有自己的部分文件的权限。

最经常使用的关机重启的命令是shutdown,因此下面详细学习的使用。

2.shutdown命令

基本格式:shutdown [选项] [时间] [警告信息]

选项:

  1. -h:关机
  2. -r:重启
  3. -c:取消shutdown执行的关机或者重启命令
  4. -k:不关机,发出警告

时间:

  1. shutdown:一分钟后关机(默认)
  2. shutdown now:立刻关机
  3. shutdown +10:10分钟后关机
  4. shutdown 5:00:5点关机

示例:

shutdown -r now:一分钟后重启
shutdown -r 05:30:最近的5:30重启
shutdown -r +10:十分钟后重启

shutdown -h now:一分钟后关机
shutdown -h 05:30:最近的5:30关机
shutdown -h +10:十分钟后关机

shutdown -c:取消上面的关机重启操作

shutdown -k +10 “I will shutdown in 10 minutes”:10分钟后并不会真的关机,但是会把警告信息发给所有的用户。

3.sync命令

sync :linux同步数据命令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。如果不去手动的输入sync命令来真正的去写磁盘,linux系统也会周期性的去sync数据。

使用场景:
1.在 关机或者开机之前最好多执行这个几次,以确保数据写入硬盘。
2.挂载时,需要很长时间的操作动作(比如,cp 大文件,检测文件),在这个动作之后接sync。
3.卸载U盘或其他存储设备,需要很长时间,使用sync。

关机与重启命令

1.1 基本介绍

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

1.2 注意细节

  1. 不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中
  2. 目前的 shutdown / reboot / halt 等命令均已经在关机前进行了 sync 【特别提醒,小心驶得万年船】

在这里插入图片描述
在这里插入图片描述

2.用户登录与注销

2.1 基本介绍

  1. 登录时尽量少用 root 账号登录,因为它是系统管理员,最大的权限,避免操作失误,可以利用普通用户登录,登录后再 su-用户名 命令来切换成系统管理员身份
  2. 在提示符下输入 logout ,即可注销用户

2.2 使用细节

  1. logout 注销指令在图形运行级别无效,在运行级别 3 下有效
  2. 运行级别这个概念,后面再介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

-----logout 注销指令在图形运行级别无效-----

在这里插入图片描述

🐧用户和组的概念

🌏用户的概念

有的人喜欢说“用户”,有的人喜欢说“账号”,再Linux系统中,他们是指同一个概念:使用Linux系统的人,他的信息必须事先已经在Linux系统中登记好,

在Linux中,创建(即登记)一个用户时需要提供如下信息:
1、用户名:也叫账号,合法的账号由AZ,az,09,-和_组成,账号长度介于132.在Linux系统中用户名是唯一的,用户名主要用于身份鉴别。
2、口令:或称为密码,主要用于身份鉴别,一个好的口令最好同时包含大小写字母、数字和其他字符,长度建议大于6 注意:密码中字符的大小写是由区分的
3、用户ID号:简称为UID,犹如人的身份证号,
image.png
image.png
4、组:每一个用户只能归属于一个主要组群,但是可以同时归属于多个附加组群。给用户分组主要是便于管理同一类用户的权限,例如赋予一个组某种权限,那么这个组所有的用户自动拥有该权限
image.png
5、家目录:使用户登录之后默认进入的目录,如果不特别指定,用户的家目录就是/home/<账号>,例如创建用户Gremmie102,那么默认的家目录就是/home/Gremmie102。root用户的家目录有些特别,默认是/root
6、登录shell:用户登录Linux的过程中,会自动执行一系列的程序,其中最后执行的那个程序成为shell程序。shell以为“壳”,可以想象为包裹在Linux系统外面的壳,用户登录之后就一直在这个壳中,用户输入的任何命令都由Shell代为执行1648268827367-screenshot.png
7、备注:对用户的描述,这个可以省略
这些用户信息主要保存在文件/etc/passwd中,加密过后的密码保存在文件/etc/shadow中。/etc/passwd每一行对应一个用户,格式如下。

用户名:密码:UID:GID:备注:家目录:登录shell

每个参数之间用“:”分开,其中的“密码”都用x来表示,GID是该用户的主要组群的组号。
例如/etc/passwd文件中由如下一行:
image.png
从上面这一行可以获得这些信息:用户名是Gremmie3,密码的位置出现x是表示加密后的密码串错放在/etc/shadow中,用户ID号是1000,隶属主要族群1000号,用户的家目录是/home/Gremmie2003,登录Shell是bin/bash,没有备注信息。
同样/etc/shadow也是一行对应一个用户,格式如下:

账号:密码:最后一次更改密码的日期:密码有效期最少天数:密码有效期最多的天数:密码修改警告期:密码禁用期:账号过期日期:保留字段

image.png
1、密码:经过加密之后的密文。这种加密算法是不可逆的,也就是说不能从密文反推出原始密码。在用户登录校验密码时,Linux系统采用相同的加密方法对用户登录时输入的密码进行加密得到密文,然后通过比较两份密文是否相同来判断密码输入是否正确,这里图中的感叹号则表示还未设置密码
2、上一次更改密码的日期:具体表现为从1970年1月1日以来的天数。例如在2022年3月26日修改过密码,那么这里就是19077.
image.png
3、密码有效期最少天数:即上次修改密码之后要过多少天之后才允许再次修改密码。如果为0或者空表示没有显示,即可随时修改密码。
4、密码有效期最多天数:即多少天前必须修改密码,如果过了有效期最多天数还没有修改密码,那么下一次用户登录时提示用户必须修改密码;为空则表示没有限制,同时也没有密码修改警告期;如果密码有效期最多天数小于密码有效期最少天数,那么用户不能修改密码。
5、密码修改警告期:即开始不断地通知用户要修改密码,如果为0或者空则不通知
6、密码警用期:过了密码有效期最多天数如果仍然没有修改密码,则进入密码禁用期,在禁用期内,用户登录时要求强行修改密码。过了禁用期,那么账号就完全冻结了,冻结的账号经过解冻之后就可以继续使用
7、账号过期日期:表示为从1970年1月1日以来的天数,为空则表示没有限制。账号过期之后不能再使用了。例如打算让账号在2022年3月26日失效,那么这里的值就是19077.
参数之间的关系表示为👇:
1648273557320-screenshot.png
Linux系统的用户分为3类,分别是超级用户root、系统用户和普通用户。在安装系统时默认创建超级用户root,root的权力没有限制,它的UID和GID都是0.
image.png
超级用户的作用是管理系统,例如创建用户、给硬盘分区、配置网络等。系统用户主要用来启动服务或者用作一些特殊权限控制,系统用户的权限收到限制,系统用户也是在安装Linux或者应用软件时自动创建的,它们得到UID小于1000,系统用户不能登录。普通用户也是由超级用户root创建并分配给Linux系统的使用者,权限有限制,使用者用普通用户登录以完成他们的日常工作,普通用户的UID一般大于等于1000.
image.png
image.png

🍰组的概念

Linux下组群的概念如下👇:
组群.png
一个用户必须且只能属于一个主要组群,但是可以属于0个或者多个附加组群,一个组群可以包含0个或者多个用户。例如我是南京医科大学的一个学生,我只能属于21生物信息班(主要族群),但我可以同时加入计算机设和音乐社(附加组群)。
用户和组群的关系.png

🤯用户和组的管理

用户和组的管理包括创建、删除、修改属性、修改密码等。具体操作可以采用可视化的图形界面方式,也可以采用命令方式,这里重点介绍后者。Linux下的命令语法为:*<命令> <选项> <目标>*
“命令”是用来操纵“目标”的,那么怎么操纵呢?这是由“选项”规定的。由于可能存在多个选项,所以选项采用 “-<一个数字或字母>[参数]”或者“-<多个数字或字母>[参数]”的形式,例如创建用户Gremmie102的命令为:useradd -u 1007 -d /home/zbc–shell/bin/bash Gremmie102
image.png
命令是useradd,目标是Gremmie102,选项是-u 1007 -d /home/zbc–shell/bin/bash
文件/etc/login.defs定义了组群和用户的默认属性,在创建用户和组的时候,如果没有给出相对应的参数,那么就去默认值。主要参数如下👇:

序号 参数 默认值 说明
1 PASS_MAX_DAYS 99999 密码有效期最多多少天
2 PASS_MIN_DAYS 0 密码有效期最少多少天
3 PASS_WARN_AGE 7 密码警告十七,密码到期前7天发出警告
4 PASS_MIN_LEN 5 密码最小长度,即密码必须多于5个字符
5 UID_MIN 1000 创建用户时默认选择的UID最小值
6 UID_MAX 60000 创建用户时默认选择的UID最大值
7 GID_MAX 1000 创建组群时默认选择的GID最小值
8 GID_MIN 60000 创建组群时默认选择的GID最大值

🦖组的管理

我们可以利用groupadd --help、groupdel --help、groupmod --help来查询相关的命令说明
image.png
image.png
image.png

🦉创建组

(1)创建组群class1:groupadd class1
image.png
(2)创建组群grade2且指定GID为555:groupadd -g 555 grade2
image.png
(3)创建已经存在的组群root的别名组群administrators:groupadd -g 0 -o administrators
image.png
注意:只能创建不存在的组群。新建的组信息保存在/etc/group中,可以采用more或cat命令查看,例如
cat /etc/group
image.png

🦝删除组群

删除组群class1:groupdel class1
注意:只能删除已经存在的空组群,也就是组里没有用户成员

🦌修改组群的属性

  1. 修改组群sales的组号(GID)为1650:groupmod -g 1650 sales
  2. 修改组群sales的组群名为sales1:groupmod -n sales1 sales
  3. 用一条命令完成上述两个任务:groupmod -g 1650 -n sales1 sales

注意:只能修改已经存在的组群属性。

🛹查看组群的信息

查看文件/etc/group 的内容即可,可以采用cat、more、tail等命令进行查看
(1)查看文件/etc/group的末尾10行:tail /etc/group
image.png
(2)翻页显示/etc/group的信息:more /etc/group
image.png

🚃用户管理

同样,我们可以用useradd --help、userdel --help、usermod --help来查询命令信息

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	改变用户所有组

usermod –g 新组名 用户名
usermod –d 目录名 用户名 (改变该用户登陆的初始目录)
特别说明:用户需要有进入到新目录的权限。

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

案例:
将 zwj 这个用户从原来所在组,修改到 wudang 组
先查看zwj在哪个组:id zwj
然后查看有没有wudang这个组:cat /etc/group | grep wudang
修改:usermod -g wudang zwj ```



image.png
image.png
image.png

1、所有者

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

1.1、查看文件的所有者

指令:ls -ahl

1.2、修改文件/目录的所有者-chown

1
2
3
4
5
6
7
8
9
10
11
12
13
14
基本介绍
chown newowner 文件/目录 (修改所有者)
chown newowner:newgroup 文件/目录 (同时修改所有者和所在组)

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

案例演示
1.请将 /home/abc.txt 文件的所有者修改成 tom
chown tom /home/abc.txt

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

R:Recursive递归
2、所在组

2.1、组的创建

基本指令:groupadd 组名

创建monster组:groupadd monster

创建fox用户并放入monster组:useradd -g monster fox

2.2、所在组

当某个用户创建一个文件后,该用户的所在组就是该文件的所在组

查看文件/目录所在组

基本指令:ls -ahl

2.3 修改文件/目录的所在组-chgrp

1
2
3
4
5
6
7
8
9
chgrp  newgroup  文件/目录	(改变所在组)

案例演示:
1.请将 /home/abc.txt 文件的所在组修改成 shaolin (少林)
groupadd shaolin
chgrp shaolin /home/abc.txt

2.请将 /home/test 目录下所有的文件和目录的所在组都修改成 shaolin(少林)
chgrp -R shaolin /home/test
3、其他组

处文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组

4、改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,也可以使用root用户改变某个用户的所在组。

改变用户所在组:

1、usermod -g 组名 用户名

2、usermod -d 目录名 用户名 (改变该用户登录的初始目录)

🎥创建用户

我们常常用到这几个选项
-d, --home-dir HOME_DIR home directory of the new account
-m, --create-home create the user’s home directory
-g, --gid GROUP name or ID of the primary group of the new account
-s, --shell SHELL login shell of the new account

*在你的创建的classmates中加入一个叫做bingdundun的用户*

useradd -m -g classmates bingdwendwen
useradd -m -g classmates -s /bin/bash bingdwendwen

📸删除用户

userdel -r bingdundun 删除用户bingdundun
userdel -r bingdundun 删除用户bingdundun,连同家目录一起删除
userdel -f -r bingdundun 强行删除用户bingdundun ,即便此用户已经登录

注意,只能删除已经存在的用户

修改用户属性

uesermod -d /opt/bingdundun -s /bin/tcsh

👆修改用户的家目录和登录的shell

usermod -g grade1 -G class2 -a bingdundun

👆修改用户的主要族群为grade1,同时再加入附加组群class2

usermod -l bingdundun Gremmie

👆修改bingdundun的用户名为Gremmie

usermod -u 1020 bingdundun

修改用户bingdundun的UID为1020

usermod -d /opt/bingdundun -s /bin/tcsh -g grade1 -G class2 -a -l Gremmie -u 1020 -m bingdundun

合并上述操作

🐱用户密码管理

passwd -l bingdundun

锁住bingdundun,被锁的用户不能登录

passwd -u bingdundun

解锁后的用户可以继续登录

passwd bingdundun

修改bingdundun的密码
注意:用户的密码只有root和用户本人可以修改

passwd -d nanjinglele

删除用户nanjinglele的密码,这样nanjinglele就可以不用密码直接登录了

passwd -n 10 -x 20 -w 3 -i 5 bingdundun

修改用户bingdundun的密码老化时间,密码有效期最少天数10,最大天数20,过期前3天会发出警告,密码禁用期5天。

🥽查看用户信息

id Gremmie

查看Gremmie的UID、主要组群和附加组群的GID
image.png

more /etc/passwd

这里有个小细节,我将Gremmie放入了sudo系统组群中,这样Gremmie就可以使用sudo的权限

rwx权限

-rw-------. 1 root root 1696 Jul 16 09:27 anaconda-ks.cfg
-rw-r–r–. 1 root root 0 Aug 16 12:14 at
-rw-r–r–. 1 root root 12 Aug 1 10:48 at_alram
-rw-r–r–. 1 root root 4 Jul 30 16:11 at_task2
-rw-r–r–. 1 root root 0 Jul 20 09:28 cd
-rw-r–r–. 1 root root 0 Oct 8 15:00 cro_test
drwxr-xr-x. 2 root root 6 Jul 16 09:28 Desktop
drwxr-xr-x. 2 root root 6 Jul 16 09:28 Documents
drwxr-xr-x. 2 root root 6 Jul 16 09:28 Downloads

# 请大家思考下 上示 内容是通过那个命令显示出来的? 代表的意义又是什么?

​ ====>>> *ls -l* 命令

# 我们带着 上述问题 开启 对 Linux 文件权限 知识的带入 :

​ 之前的文章我们简单的 介绍过 文件权限的部分内容,现在我们开始整块儿知识地学习!

# 之前在学习 文件权限的时候 也对 ls -l 展示的内容做过解释,现在再复盘下 :

img

​ 第一列 : 文件类型

​ 第二列 : 访问权限 ( 实际上一共有 10 位)

​ 第三列 :

​ ***** 如果是文件的话就是 1

​ ***** 如果是目录的话 : 数字就代表目录里的文件个数 !

​ 第四列 : 所属用户

​ 第五列 : 所属用户组

​ 注 : 所属用户及所属用户组 都不完全代表 该文件就是所属用户或用户组创建

​ 的( 因为 所属用户即用户组 是可以后期改变的!)

​ 第六列 : 文件大小

​ 第七列 : 时间日期

​ 第八列 : 文件名 ( 如果是链接文件的话则会 显示 指向 )

# 关于文件类型在此再做以下解释 : img

​ 这九位分为 三组 :

​ ===>>>>

​ 第一部分(2-4位) : 代表用户的权限

​ 第二部分(5-7位) : 代表用户组的权限

​ 第三部分(8-10位) : 代表其他人的权限

​ 对于文件权限主要是由 以下 四个字符表示 :

r : 代表 读的权限

w : 代表 写的权限

x : 代表 执行的权限

- : 代表 没有赋予任何权限

# r w x 权限的数字表示方法

img

​ 其实上图就直接完全总结了!!

​ 会发现 r w x 三种权限 可以用 两种数字进制去表示

​ 我们直接举例( 直接看例子最好理解 )

二进制表示

1
2
3
4
5
rwxrwxrwx :   111111111 

rwxrw-rw- : 111110110

-w-r-xr-- : 010101100

: 二进制其实就是说白了, r w x 那个有权限那个就是 1 没有权限就是 0

十进制(八进制)表示 : 我们仍以上示例子举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rwxrwxrwx :   111 111 111 



7 7 7



rwxrw-rw- : 111 110 110



7 6 6



-w-r-xr-- : 010 101 100



2 5 4

: 你会很显然的发现 其实 所谓 十进制 就是把二进制转成了 十进制

​ ( 没有什么神奇的!! )

​ 但需要注意的是 我们仍是 以 三位三位一组!!!

# 九位权限的简写表示 :

1
2
3
4
5
6
7
8
rwx                rwx                 rwx 


user( 用户) group(组) other(其他人)



u g o

​ ***** 还有一个 a ( all ) : 代表所有即 user group other

​ u 、g、 o、 就是缩写表示 !!!

# 针对于 文件的 rwx 和 目录 的 rwx 是有区别的( 意义不一样 ~ )!!

img

Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

img

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。

img

使用权限 : 所有使用者

语法

1
chmod [-cfvR] [--help] [--version] mode file...

参数说明

mode : 权限设定字串,格式如下 :

1
[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:

who 用户类型 说明
u user 文件所有者
g group 文件所有者所在组
o others 所有其他用户
a all 所有用户, 相当于 ugo

operator 的符号模式表:

Operator 说明
+ 为指定的用户类型增加权限
- 去除指定用户类型的权限
= 设置指定用户权限的设置,即将用户类型的所有权限重新设置

permission 的符号模式表:

模式 名字 说明
r 设置为可读权限
w 设置为可写权限
x 执行权限 设置为可执行权限
X 特殊执行权限 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
s setuid/gid 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
t 粘贴位 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

chmod指令(增减权限)

八进制语法

chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。

# 权限 rwx 二进制
7 读 + 写 + 执行 rwx 111
6 读 + 写 rw- 110
5 读 + 执行 r-x 101
4 只读 r– 100
3 写 + 执行 -wx 011
2 只写 -w- 010
1 只执行 –x 001
0 000

例如, 765 将这样解释:

  • 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
  • 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
  • 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。

实例

将文件 file1.txt 设为所有人皆可读取 :

1
chmod ugo+r file1.txt

将文件 file1.txt 设为所有人皆可读取 :

1
chmod a+r file1.txt

将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

1
chmod ug+w,o-w file1.txt file2.txt

ex1.py 文件拥有者增加可执行权限:

1
chmod u+x ex1.py

将目前目录下的所有文件与子目录皆设为任何人可读取 :

1
chmod -R a+r *

此外chmod也可以用数字来表示权限如 :

1
chmod 777 file

语法为:

1
chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

  • 若要 rwx 属性则 4+2+1=7;
  • 若要 rw- 属性则 4+2=6;
  • 若要 r-x 属性则 4+1=5。
1
chmod a=rwx file

1
chmod 777 file

效果相同

1
chmod ug=rwx,o=x file

1
chmod 771 file

效果相同

若用 chmod 4755 filename 可使此程序具有 root 的权限。

更多说明

命令 说明
chmod a+r *file* 给file的所有用户增加读权限
chmod a-x *file* 删除file的所有用户的执行权限
chmod a+rw *file* 给file的所有用户增加读写权限
chmod +rwx *file* 给file的所有用户增加读写执行权限
chmod u=rw,go= *file* 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
chmod -R u+r,go-r *docs* 对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
chmod 664 *file* 对file的所有者和用户组设置读写权限, 为其其他用户设置读权限
chmod 0755 *file* 相当于u=rwx (4+2+1),go=rx (4+1 & 4+1)0 没有特殊模式。
chmod 4755 *file* 4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。
find path/ -type d -exec chmod a-x {} \; 删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件
find path/ -type d -exec chmod a+x {} \; 允许所有用户浏览或通过目录path/

对于目录

X 权限 !

img

: 使用 ls -ld 查看 /home/natash 这个目录的权限

img

: 让 harry 用户 访问 /home/natash 发现 没有权限 ( 废话,你要是理解

​ /home/natash 的权限你就知道为什么了)

img

: 显然,我们是用 root 用户添加权限的!!( 你用普通用户添加权限试试??)

​ 会发现我们权限添加是 o + *x*

​ ( x 权限 针对目录 就不再是 执行的意思了,是 访问的意思! )

img

: 显然, harry 可以访问 /home/natash 了!!

r 权限

img

*注* : 当我们在 harry 用户下,在 访问 natash 的家目录成功后,想要查看 家目录下的内

​ 容时,发现 没有权限!!

​ ( 因为刚才只是添加了 o+x, 并没有 r 的权限!)

img

: 还是在 root 下( 当然了也只能在 root 下)

​ 添加 o + r ( 加 r 权限 )

img

w 权限

img

: 发现无法在 natash 家目录下 创建文件 !!

​ ( 都没有 w 权限当然不行了!!)

img root 用户下 添加 w 权限

img

​ 创建成功,并展示出来!!

​ 这就是 w 权限的作用!!

最佳实践-警察和土匪游戏

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
有两个组:police组,bandit组
有四个用户:jackie,jerry,xh,xq
jackie,jerry: 警察
xh,xq: 土匪

1.创建组
groupadd police
groupadd bandit
2.创建用户(直接放到对应组)
useradd -g police jackie
useradd -g police jerry
useradd -g bandit xh
useradd -g bandit xq
3.jackie 创建一个文件,自己可以读 r 写 w,本组人可以读,其它组没人任何权限
首先jackie登录,可以使用切换用户:su jackie ---->这样不行,无法创建文件,权限不够

使用jackie登录,先设置密码123,然后退出系统用jackie登录:passwd jackie
然后创建文件:touch jackie.txt
权限设置:
原权限:rw-r--r--
chmod o-r jackie.txt
修改后权限:rw-r-----

也可以直接使用数字方式:chmod 640 jackie.txt

4.jackie 修改该文件,让其它组人可以读,本组人可以读写
chmod g+w o+r jackie.txt
或者
chmod 664 jackie.txt

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

5.xh投靠警察
由root执行这条指令
usermod -g police xh

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

jackie.txt文件在jackie目录下
要想对jackie.txt文件进行操作,首先进入jackie目录
但是jackie目录权限是:rwx------
所以xh连jackie目录都进不去

解决办法:登录jackie,对jackie目录权限进行修改(也可以登录root进行修改)(必须都在home下才能执行这个修改权限命令)
登录
cd /home/
ll
得到jackie原目录权限:rwx------
修改权限:chmod 770 jackie (权限中有x才能进入目录)
修改后jackie目录权限:rwxrwx---

这时xh就可以进入jackie目录,并对jackie.txt进行读写


结论:如果要对目录内的文件进行操作,首先要有对该目录有相应权限,且必须有x,表示可以进入该目录
ps:,如果一个用户原来不是那个组的,后来改为那个组并把该组成员权限放开,也无法访问那个组的内容时,权限可能没有立刻更新,重新登录即可,

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
	groupadd sx
groupadd yg
2.建立四个用户(唐僧,悟空,八戒,沙僧)
useradd ts
useradd wk
useradd bj
useradd ss
3.设置密码(都为123)
passwd ts
passwd wk
passwd bj
passwd ss
4.妖怪组:悟空,八戒;神仙组:唐僧,沙僧
usermod -g yg wk
usermod -g yg bj
usermod -g sx ts
usermod -g sx ss
5.用悟空建立一个文件 monkey.txt ,该文件要输出 i am a monkey
先使用悟空登录
vim monkey.txt
i am a monkey
:wq
6.给八戒一个可以 r w 的权限
悟空和八戒是一组的
当前monkey.txt权限:-rw-r--r--
此时八戒只能r
命令:chmod g+w monkey.txt
现在monkey.txt权限:-rw-rw-r--
monkey.txt 加入一句话( i am a pig)
1
2
3
4
5
6
7
monkey.txt文件在wk目录下
八戒要修改monkey.txt文件就要先进入wk目录
但是此时wk目录权限:rwx------
八戒进不去wk目录
所以先修改wk目录权限:chmod g+r+w+x wk (先把所以权限都给,在wk的home下写指令或root的home下写指令,因为目录在home下)
现在wk目录权限:rwxrwx---
这时八戒就能进入wk目录了
沙僧 对该文件没有权限
1
唐僧和沙僧是其他组,进不去wk目录
沙僧 放入妖怪组
1
2
3
4
5
6
7
8
	usermod -g yg ss

10.让沙僧修改该文件 monkey.txt, 加入一句话 ("我是沙僧,我是妖怪!");
使用沙僧登录
cd /home/wk
viw monkey.txt
...
:wq
1
2
3
4
rwx权限对于 文件夹(目录) 的细节讨论和测试!!!
x: 表示可以进入到该目录,比如 cd
r: 表示可以 ls ,将目录的内容显示
w: 表示可以在该目录下删除或者创建文件
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
```

#### 关于文件和目录的rwx权限的不同含义



| 文件类型 | 内容 | r | w | x |
| -------- | ------------ | ------------ | -------------------------- | -------- |
| 文件 | 详细数据data | 读取文件内容 | 修改文件内容 | 执行文件 |
| 目录 | 文件名 | 读到文件名 | 修改文件名,以及目录中内容 | 进入目录 |

- 只有对目录有执行权限,才可以进入目录

![https://img-blog.csdnimg.cn/img_convert/6c864b2ff2ef590858b7af6a242fd432.png#clientId=u93de3467-ed8b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=230&id=u89a2e397&margin=[object Object]&name=image.png&originHeight=287&originWidth=662&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27901&status=done&style=none&taskId=u03d679e4-8b90-4803-babb-c2b49f47600&title=&width=529.6](https://raw.githubusercontent.com/godwad/2023/main/20236c864b2ff2ef590858b7af6a242fd432.png)

- 如果对目录没有`r`权限,则即使有`x`权限进入了目录,使用`ls`命令也是会报`permission deny`错误

![https://img-blog.csdnimg.cn/img_convert/58c45c1ca39506e30965a58faeef7ef4.png#clientId=u93de3467-ed8b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=250&id=uc1945c47&margin=[object Object]&name=image.png&originHeight=313&originWidth=652&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29877&status=done&style=none&taskId=u58fc4823-f2b3-4b80-a69a-ab8bb54d9f5&title=&width=521.6](https://raw.githubusercontent.com/godwad/2023/main/202358c45c1ca39506e30965a58faeef7ef4.png)

> 上图中,我们为zean用户,对test目录权限为`--x`,所以执行`cd test`成功,但是在目录中执行`ls`失败

- 若用户对目录没有`w`权限,则无法在目录中添加、删除文件

![https://img-blog.csdnimg.cn/img_convert/306c0fa0b2fb54b25326da4336af04b9.png#clientId=u93de3467-ed8b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=314&id=u4e39b276&margin=[object Object]&name=image.png&originHeight=393&originWidth=670&originalType=binary&ratio=1&rotation=0&showTitle=false&size=37802&status=done&style=none&taskId=u45aae9fa-9f49-4233-816b-50b434ab0de&title=&width=536](https://raw.githubusercontent.com/godwad/2023/main/2023306c0fa0b2fb54b25326da4336af04b9.png)

> 上图中为zean用户,对test目录权限为`r-x`,没有写权限,所以执行`cd test`和`ls`成功,但是在用`echo hello > b.txt`创建b.txt文件时失败,`rm a.txt`删除a.txt时失败。
> 在目录中添加文件和删除文件,需要的是`wx`权限

![https://img-blog.csdnimg.cn/img_convert/d8944f808c6b2aa925af5e394278d425.png#clientId=u93de3467-ed8b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=341&id=ua8f5f6c3&margin=[object Object]&name=image.png&originHeight=426&originWidth=700&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36005&status=done&style=none&taskId=u56952ea8-a7b5-4edd-a422-f7d46d30985&title=&width=560](https://raw.githubusercontent.com/godwad/2023/main/2023d8944f808c6b2aa925af5e394278d425.png)

> 将test权限设置为`777`之后,zean用户就可以在目录中添加或删除文件



# Linux运行级别

Linux系统有7种运行级别(runlevel):

- 运行级别 0:系统**停机状态**,系统默认运行级别不能设为0,否则不能正常启动运行
- 运行级别 1:单用户工作状态,root权限,用于系统维护,**找回丢失root密码**,禁止远程登陆
- 运行级别 2:多用户状态没有网络服务(没有NFS)
- 运行级别 3(multi-user.target):多用户状态有网络服务(有NFS),登陆后进入控制台**命令行模式**
- 运行级别 4:系统未使用保留给用户
- 运行级别 5(graphical.target):图形界面
- 运行级别 6:系统正常关闭并**重启**,默认运行级别不能设为6,否则不能正常启动

常用运行级别是**3和5**,工作中一般用3,也可以指定默认运行级别

命令:`init [0123456]`
通过init:来切换不同的运行级别,比如动5-3,然后关机。

init 3

1
2
3
4
5
6
7
8
9
10
11
12



查看当前默认级别:`systemctl get-default`
设置默认级别:`systemctl set-default TARCET.target`

其中TARCET可用以下代码:

```c
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
12

我们在 /etc/inittab 目录下就可以查看
在这里插入图片描述

在这里插入图片描述

如何找回 root 密码

root 作为系统最高权限管理者,它的密码自然是至关重要的,那么 root 账户的密码应该怎么找回呢?步骤如下:

\1. 启动 Linux 系统,待进入开机界面后按 “e” 进入编辑界面,注意此处要快,在系统进入登录页面之前进行操作;

img

\2. 进入编辑界面后,找到以“Linux 16 ”开头的内容所在行,并在行最后输入 init=/bin/sh;

img

\3. 输入完成后,按下 Ctrl+X 进入单用户模式,如下界面即为单用户模式;

img

\4. 在光标闪烁的位置输入 mount -o remount,rw /,输入完成后回车;

img

\5. 在新的行末输入 passwd 并回车,接下来输入密码、确认密码即可,修改密码成功后显示 passwd… 字样;

img

\6. 接下来在新的行末输入 touch /.autorelabel,输入完成回车;

\7. 新的行末继续输入 exec /sbin/init,完成后回车等待系统修改密码;

img

\8. 耐心等待,系统自动重启后新的 root 密码即可生效。

Linux中的帮助命令

一、Linux帮助命令简介

Linux 系统的命令数量有上千个,每个命令又有若干个甚至数十个参数指出不同情景下的使用。

有一些命令是我们日常工作需要经常使用的,即便不是特意背命令,也会因熟能生巧而印象深刻。但是对于那些不熟悉的命令,或者是熟悉命令的不熟悉的参数呢?

当然,我们不需要耗费大量精力去记忆这些命令和参数,只需要正确使用Linux 的帮助命令,就能够快速地定位到自己想要的命令和参数。

Linux 的帮助命令主要包含三个:

  1. help 命令与 --help 参数
  2. man 命令
  3. info 命令

接下来,将介绍这三个命令的使用方法及区别。

二、help 命令与 --help 参数

2.1 help 命令

help 命令能够在控制台上打印出我们需要的命令的帮助信息,使用方式为:

1
2
help <command>
1

例如,我们要查看 cd 命令和 mv 命令的帮助命令,使用上述形式的 help 命令时能够得到如下输出:

查看cd命令

查看mv命令

为什么会出现上述差异?为什么不能查看 mv 命令的帮助信息?这里需要引入一个“内建命令”和“外部命令”的概念

2.2 内建命令与外部命令

Linux 的内建命令是 shell 程序的一部分,Linux 系统加载运行时就被加载并驻留在系统内存里的,因此执行速度较快。

Linux 的外部命令是通过额外安装获得的命令,不随系统一起被加载到内容中,运行速度慢但功能强大。

使用 type 命令可以查看该命令是内建命令还是外部命令

1
2
type <command>
1

例如上文中,提及的 cd 命令和 mv 命令,我们看一下它们分别属于什么类型的命令

cd 是一个内建命令

mv 是一个外部命令
从上述信息中,我们发现 cd 命令是一个内建命令,mv 命令是一个外部命令。多次尝试后,可以发现,上述形式的 help 命令只能用于内建命令的帮助信息查询。

我们可以尝试查看 help 命令本身的帮助文档

1
2
help help
1

查看 help 的帮助文档

不难看出,只有内建命令能够使用下述形式的 help 命令查询帮助文档。

1
2
help [option] <command>
1

2.3 – help 参数

若是想用 help 来查询外部命令的帮助文档,上述形式是行不通的,但是可以用下述形式查询外部命令的帮助文档

1
2
<command> --help
1

**需要注意的是,这两个形式的 help 并不能完全等同。**前一种通过执行内建的 help 命令查看帮助文档,后一种是通过命令后携带参数 help 的方式来展示所查询命令的帮助文档。我们不妨尝试查询外部命令 mv 的帮助文档:

1
2
mv --help
1

mv  命令支持了--help

不难发现,mv 命令支持了 --help 的参数,才能展示这个命令的帮助信息并退出。

三、man 命令

3.1 man 提供的帮助信息

man 是 manual 的简写,与 help 命令和 --help 参数不同,使用 man 命令查询帮助手册时会进入 man page 界面,而非直接打印在控制台上。同时,相比与 help,man 命令的信息更全,help 则显示的信息简洁

1
2
man [option] <command>
1

例如,我们要查看 mv 命令的帮助信息

1
2
man mv
1

man 命令查看 mv 的帮助文档

man page 中提供了关于 mv 命令的 “名字” 、 “概要” 、 “介绍” 等信息,还有诸如 “作者信息” 、 “更多” 等其他信息未在图中展示。具体包括:

名称 含义
NAME 命令名称及简要说明
SYNOPSIS 命令执行语法概要
DESCRIPTION 完整的命令说明
OPTIONS 列举所有可用的参数项
COMMANDS 当命令在执行的时候,可以在程序中执行的命令
FILES 这个命令所参考或链接的某些文件
SEE ALSO 有关这个命令的其他说明
EXAMPLE 一些可以参考的范例
BUGS 是否有相关的错误

我们注意到,在第一行有 “MV(1)” 的字样,括号内的数字代表什么含义呢?它其实是对所查询信息的一个分类。

数字 代表含义
1 用户在shell环境中可操作的标准命令或可执行文件
2 系统内核调用的函数及工具
3 常用的库函数
4 设备文件与设备说明等
5 配置文件或文件格式
6 游戏等娱乐
7 协议信息等
8 系统管理员可用的管理命令
9 与 Linux 内核相关的文件文档

3.2 man page 中的按键操作

man 命令相比于 help 命令最大的优势在于用户可以在 man page 中,通过按键交互进行翻页、查找等操作。常见的按键操作如下所示。

按键 功能
空格键 翻页
/str 向后查找str字符串
?str 向前查找str字符串
n, N n 为搜索到的下一个字符串,N 为搜索到的上一个字符串
q 退出 man page

四、 info 命令

4.1 info 提供的帮助信息

1
2
info [option] <command>
1

info 命令的功能基本与 man 命令相似,能够显示出命令的相关资料和信息。

而与 man 命令稍有区别的是,一方面,info 命令可以获取所查询命令相关的更丰富的帮助信息;另一方面,info page 将文件数据进行段落拆分,并以 “节点” 的形式支撑整个页面框架,并将拆分的段落与节点对应,使得用户可以在节点间跳转而方便阅读每一个段落的内容。

以 info info 为例,我们进入了关于命令 info 的 info page

第一层:顶层节点,展示了关于 info 命令的基本信息及目录信息

第一层 info page 的内容

第二层:一级目录节点,展示了一级目录中的详细内容,其中可能包含了二级目录列表

第二层 info page 的内容

第三层:二级目录节点:展示了二级目录中的详细内容

第三层 info page的内容

以此类推。

4.2 info page 中的按键操作

info page 提供了翻页、节点跳转、搜索等交互操作。

按键 功能
空格键 向下翻一页
回车键 跳到下一个节点
P 跳到上一个节点
U 回到上一层节点
回车键 光标移动到下一层节点处,以回车键进入
B 跳到当前 info page 的第一个节点处
E 跳到当前 info page 的最后一个节点处
/ 在 info page 中进行搜索
Q 退出 info page

Linux文件目录指定

一、新建操作


1、mkdir /路径/文件夹名字 :新建一个文件夹

2、mkdir -p /路径/文件夹名/文件夹名/文件夹名 :当创建没有上一级时将自动创建

1
2
3
4
[root@localhost ~]# mkdir /tmp/aaa     #在根目录下的tmp文件夹下面创建一个名为aaa的文件夹


[root@localhost ~]# mkdir -p /tmp/aaa/bbb/ccc #在/tmp/aaa/bbb下创建ccc,因为有-p所以就算没有bbb文件夹也会自动帮你创建好,然后在bbb下创建ccc文件夹

img

img

3、touch /路径/文件名 :在指定路径下创建一个文件

1
[root@localhost ~]# touch /tmp/bbb      #在根目录下的tmp文件夹下创建一个名为bbb的文件

img

二、查看操作


1、查看目录(代码中的数字是我自己加的,为了方便对应阅读)

1、ls /路径 :显示指定路径下的文件。

2、ls -l /路径 :以列表的形式展示指定路径下的文件。

3、cd /路径 :切换路径。

4、pwd :显示路径。

1.路径、目录命令

(1)pwd:显示当前所在位置的绝对路径

4a1b41bcfb994fdbb74578ad6ef13373.png

(2)cd系列

cd 路径:切换当前工作位置

cd:切换目录:cd 要切换的位置(绝对路径/相对路径)

cd . :退回到当前位置

cd … :退回到上一层

cd ~:直接进入到当前用户的家目录

cd -:切换到上一次所在位置,在两个位置之间来回切换;

a394a132bd5f4a608202ab7e4c16fdd6.png

(3)ls:

默认显示当前位置当前目录下的内容

(4)清屏

clear:清屏(相当于翻页)

2、查看文件内容(代码中的数字是我自己加的,为了方便对应阅读)

1、cat /路径/文件名 :查看文件的内容。

2、head -5 /路径/文件名 :查看文件前五行内容。

3、tail -num 文件名 :从距文件尾num行开始显示。

  1. more 文件名

  2. less文件名(最常用)

1
2
3
4
5
6
1、[root@localhost tmp]# cat /wang        #查看根目录下wang文件的内容

2、[root@localhost tmp]# head -5 /wang #查看根目录下wang文件前五行内容

3、[root@localhost /]# tail -3 /wang #从距尾3行开始显示

more命令

Linux中 more命令功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more 是一个基于VI编辑器的文本过滤器,会以全屏幕的方式按页显示文本文件的内容,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

1.语法:
1
more [选项] 要查看的文件
2.功能:

more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。

3.参数:
1
2
3
4
5
6
7
8
9
10
+n   从笫n行开始显示。
-n 定义屏幕大小为n行。
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示。
-c 从顶部清屏,然后显示。
-d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能。
-l 忽略Ctrl+l(换页)字符。
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似。
-s 把连续的多个空行显示为一行。
-u 把文件内容中的下画线去掉。
123456789
4.常用操作命令:
操作 功能说明
空格键 (space) 代表向下翻一页。
Enter 代表向下翻n行,需要定义,默认为1行。
q 代表立刻离开 more ,不再显示该文件内容。
Ctrl+F 向下滚动一屏。
Ctrl+B 返回上一屏。
= 输出当前行的行号。
:f 输出文件名和当前行的行号。
!命令 调用Shell,并执行命令。
V 调用vi编辑器

less命令也是对文件或其它输出进行分页显示的工具,功能极其强大。less 的用法比起 more 更加有弹性。前面more介绍中,按b可以向前翻页, 按空格向后翻页, less 可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。最主要的区别:less 在查看之前不会加载整个文件。

less

1
2
less [参数]  文件 
1
1.命令功能

less 与 more 类似,但使用 less 可以随意浏览文件,而且 less 在查看之前不会加载整个文件。显示方面,显示内容方式不是输出到窗口,而是类似vi打开的文件一样,退出按q。

2.命令参数

  • -b <缓冲区大小> 设置缓冲区的大小
  • -e 当文件显示结束后,自动离开
  • -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
  • -g 只标志最后搜索的关键词
  • -i 忽略搜索时的大小写
  • -m 显示类似more命令的百分比
  • -N 显示每行的行号
  • -o <文件名> 将less 输出的内容在指定文件中保存起来
  • -Q 不使用警告音
  • -s 显示连续空行为一行
  • -S 行过长时间将超出部分舍弃
  • -x <数字> 将“tab”键显示为规定的数字空格
3.按键操作

  • /字符串:向下搜索“字符串”的功能
  • ?字符串:向上搜索“字符串”的功能
  • n:重复前一个搜索(与 / 或 ? 有关)
  • N:反向重复前一个搜索(与 / 或 ? 有关)
  • b 向后翻一页
  • d 向后翻半页
  • h 显示帮助界面
  • Q 退出less 命令
  • u 向前滚动半页
  • y 向前滚动一行
  • 空格键 滚动一行
  • 回车键 滚动一页
  • [pagedown]: 向下翻动一页
  • [pageup]: 向上翻动一页
4.实例

命令:

1
2
less test1.txt
1

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ubuntu@VM-4-14-ubuntu:~/less$ less test1.txt
1
2
3
4
5
6
7
8
9
10
11
1
13
14
15
16
17
18
19
20

12345678910111213141516171819202122

如果显示END了 按 q退出,没有的情况下可以按page up page down 上下翻页,也可用上下键一行行上下翻动。less命令也是对文件或其它输出进行分页显示的工具,功能极其强大。less 的用法比起 more 更加有弹性。前面more介绍中,按b可以向前翻页, 按空格向后翻页, less 可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。最主要的区别:less 在查看之前不会加载整个文件。

tail命令(可用于追踪抓包)

ail命令,主要是查看文件内容。结合一些参数,更方便于查看动态的文件内容,比如日志信息等。
【tail -f filename】显示文件的尾部最后10行的信息,并且循环刷新,只要文件有更新,就会将更新信息显示到屏幕上,CTRL+C进行停止。

【tail -n num】显示文件尾部的n行内容。如【tail -n +10】显示第十行及之后一直到文件尾部的内容。【tail -n 10】则显示文件最后十行的内容。

【tail -c num】显示文件尾部的字节数。如【tail -c 100】显示文件的最后100个字节。【tail -c +1000】从第1000个字节开始展示,到文件的末尾。

【tail -v filename】显示文件名及文件详细处理信息。还可以同时指定多个文件输出【tail -v filename1 filename2】
在这里插入图片描述
【tail -q filename】不显示详细的处理信息。【tail -q filename1 filename2】指定多个文件,但不展示文件名称:
在这里插入图片描述
【tail -f filename --pid=PID】当进程号对应的进程停止时,则自动退出tail命令。
在这里插入图片描述

3、查看状态或者文件类型

1、stat /路径/文件名 :查看文件的详细信息。

2、file /路径/文件名 :查看文件的类型。

3、du -h /路径/文件名 :以合适的单位显示文件的大小(会根据文件的大小自动选择单位)。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1、[root@localhost /]# stat /wang             #查看根目录下wang文件详细信息



文件:"/wang"



大小:166 块:8 IO 块:4096 普通文件



设备:fd00h/64768d Inode:77747 硬链接:1



权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)



环境:unconfined_u:object_r:etc_runtime_t:s0



最近访问:2022-08-16 18:42:15.170251766 +0800



最近更改:2022-08-16 18:40:47.729281581 +0800



最近改动:2022-08-16 18:40:47.729281581 +0800



创建时间:-



2、[root@localhost /]# file /wang #查看根目录下wang文件的类型



/wang: ASCII text


3、[root@localhost /]# du -h /wang #查看根目录下wang文件的大小



4.0K /wang #显示大小为4.0kb

三、删除操作


1、rm -rf /路径/文件夹名 :强制删除文件夹和文件夹内的多有内容,注意请不要输入“rm -rf / ” 因为这个命令是前置删除根目录如果这样操作计算机将无法打开了

2、rm -f /路径/文件名 :强制删除文件,无法删除文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1、[root@localhost /]# rm -rf /aaa           #强制删除根目录下aaa文件夹和文件夹下的所有内容




2、[root@localhost /]# rm -f /tmp/aaa #aaa是文件夹,无法删除文件夹



rm: 无法删除"/tmp/aaa": 是一个目录



[root@localhost /]# rm -f /tmp/bbb #bbb是一个文件,可以删除一个文件

img

img

四、移动操作


1、 mv 原文件路径 目标文件路径 :将源文件移动到目标文件

2、mv 原文件路径 目标路径/名字 :将源文件移动到目标文件并且将原文件的名字进行重命名

1
2
3
4
5
6
7
8
9
10
11
12
13
1、[root@localhost /]# mv  /tmp/aaa    /aaa      #将/tmp的aaa文件夹移动到根目录下结果如图一











2、[root@localhost /]# mv /aaa /bbb #将根目录下的aaa文件夹移动到/根目录,虽然路径没换 但是名字换了,将aaa改为了bbb结果如图二

图一:

img

图二

img

五、复制操作


1、cp 源文件 目标文件 :将源文件复制到目标目录下 不可以复制文件夹
2、cp -r 源文件 目标文件:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。

1
2
3
4
5
6
7
8
9
1、cp   /aaa   /tmp        #(aaa是一个文件)将根目录下的aaa文件复制到/tmp路径下


[root@localhost /]# cp /bbb /tmp #因为bbb是一个文件夹所以系统直接略过不可以复制

cp: 略过目录"/bbb"


2、cp -r /bbb /tmp #(bbb是一个文件夹)将根目录下的bbb文件夹复制到/tmp路径下

echo指令

Shell中的echo命令类似于php中的echo命令,都是用于输出。Shell中另有一个输出命令为printf命令,我没有另写文章介绍该命令,大家可以在Shell printf 命令中查阅学习。

本文中的一系列实例用到的命令我都是在终端直接写的,输出也是输出在终端,这样方便学习和记录吧!其实也都可以放到脚本文件中执行。

一、语法

1
2
echo [-neE]  [arg ...]
1

(1)含义

-n:表示输出字符串不换行
-e:表示对于转义字符按对应的方式进行处理(若不加-e ,那么在输出时转义字符会按照普通字符进行处理,并不会达到自己想要达到的目的。)
-E:禁用转义解释

转义字符 含义
\b 删除前一个字符
\n 换行
\t 水平制表符(tab)
\v 垂直制表符(tab)
\c \c后面的字符将不会输出,输出完毕后也不会换行
\r 光标移动到首行,不换行
\f 换行,光标停在原处
\e 删除后一个字符
\ 输出\
\0nnn 输出八进制nnn代表的ASCII字符
\xHH 输出十六进制数HH代表的ASCII字符
\a 输出一个警告的声音

(2)实例

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
31
[root@localhost my_shell]# echo "hello "
hello
[root@localhost my_shell]# echo -n "hello "
hello [root@localhost my_shell]# echo "hello \b"
hello \b
[root@localhost my_shell]# echo -e "hello \b"
hello
[root@localhost my_shell]# echo -en "hello \b"
hello[root@localhost my_shell]# echo -e "hello\tworld"
hello world
[root@localhost my_shell]# echo -e "hello\nworld"
hello
world
[root@localhost my_shell]# echo -e "hello\vworld"
hello
world
[root@localhost my_shell]# echo -e "hello\cworld"
hello[root@localhost my_shell]# echo -e "hello\rworld"
world
[root@localhost my_shell]# echo -e "hello\aworld"
helloworld
[root@localhost my_shell]# echo -e "hello\cworld"
hello[root@localhost my_shell]# echo -e "\ehelloworld"
elloworld
[root@localhost my_shell]# echo -e "hello\\world"
hello\world
[root@localhost my_shell]# echo -e "\x31"
1
[root@localhost my_shell]# echo -e "\0123"
S
123456789101112131415161718192021222324252627282930

(3)具体用法
  上面介绍的主要是一些输出字符串相关的具体用法,下面详细例举一些echo命令的其他用法。
1、显示普通字符串

1
2
3
4
5
6
7
[root@localhost ~]# echo "hello world"
hello world
[root@localhost ~]# echo hello world
hello world

#双引号可以省略,效果一致。(字符串的输出都是如此,下面一些实例也是可以省略双引号也能达到相同效果)
123456

2、显示变量
  这里用到read命令(从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量)

1
2
3
4
5
[root@localhost ~]# read name
Michael Zhang
[root@localhost ~]# echo "My name is $name"
My name is Michael Zhang
1234

3、显示换行

1
2
3
4
[root@localhost ~]# echo -e "hello \nworld"
hello
world
123

4、显示不换行

1
2
3
4
5
6
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "hello world"
#结果如下
OK! hello world
12345

5、显示转义字符

1
2
3
[root@localhost ~]# echo "\"hello world\""
"hello world"
12

6、重定向
结果输出到文件

1
2
3
echo "hello world" > my_file
#将hello world输出到my_file文件
12

7、原样输出
用单引号可原样输出。

1
2
3
4
5
[root@localhost ~]# echo '$name\"'
$name\"
[root@localhost ~]# echo '$name'
$name
1234

8、显示命令执行结果

1
2
3
4
#显示当前日期
[root@localhost ~]# echo `date`
Sat Jan 2 23:12:39 CST 2021
123

这里使用的是反引号`, 而不是单引号’。
实际上输出一些执行命令的结果就是这样用反引号。

二、echo的重定向(其它指令也可以像echo一样重定向)

重定向是Shell中的一个重要内容,可以查看我的文章Linux中的重定向
echo命令的重定向功能经常被用于清空文件内容(删除文件)时使用,具体在我的另一篇文章中介绍:Linux中清空文件的方式

(1)echo "content" > filename
将content覆盖到filename文件当中去,filename文件当中之前的内容不复存在了,实际上是修改了原文件的内容。

(2)echo "content" >> filename
将content追加到filename文件后,对filename文件之前的内容不修改,只进行增添,也叫追加重定向。

(3)实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost my_shell]# touch test
[root@localhost my_shell]# cat test
[root@localhost my_shell]# ll
total 4
-rw-r--r-- 1 root root 175 Nov 6 17:46 del.sh
-rw-r--r-- 1 root root 0 Nov 7 23:33 test
[root@localhost my_shell]# echo "123456" > test
[root@localhost my_shell]# cat test
123456
[root@localhost my_shell]# echo "111111" > test
[root@localhost my_shell]# cat test
111111
[root@localhost my_shell]# echo "123456" >> test
[root@localhost my_shell]# cat test
111111
123456
[root@localhost my_shell]#

ln指令

介绍

lnlinux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。平时使用感觉就像桌面应用上的快捷图标一样,比如你安装的nginx文件在usr/local/nginx/sbin/nignx,可以在usr/local/bin中建立一个nginx的软连接,这样每次就可以全局访问了。

1
2
3
4
5
// 给nginx建立一个可以全局访问的软连接



ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

命令

命令格式

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
ln [参数][源文件或目录][目标文件或目录]







"ln -b" 如果目标目录中已经有同名的文件,那么在覆盖之前先进行备份



"ln -f" 如果目标目录中已经有同名的文件,无需提示,直接覆盖



"ln -i" 人机交互,如果目标目录中已经有同名的文件,则提示是否进行覆盖



"ln -n" 把软链接视为一般目录(说明:范例中我会详细解释)



"ln -s" 创建软链接



"ln -v" 详细显示操作进行的步骤。(v为verbose的意思)







选择参数:







-S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>”







-V “-V<备份方式>”或“--version-control=<备份方式>”







--help 显示帮助信息







--version 显示版本信息

命令功能

Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

软链接:

  1. 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  2. 软链接可以 跨文件系统 ,硬链接不可以
  3. 软链接可以对一个不存在的文件名进行链接
  4. 软链接可以对目录进行链接

硬链接:

  1. 硬链接,以文件副本的形式存在。但不占用实际空间。
  2. 不允许给目录创建硬链接
  3. 硬链接只有在同一个文件系统中才能创建

这里有两点要注意:

第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;

第二,ln的链接又分软链接和硬链接两种,软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

ln指令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。

事例

创建一个硬链接文件

img

创建一个软链接文件

img

创建一个硬链接文件,如果目标目录中已经有同名文件,覆盖前先进行备份

img

给目录创建一个软链接

img

“ln -n” 命令实例说明

img

创建软链接失败实例说明

img

特别说明

  1. 创建软链接时,如果软链接文件跟源文件不在同一个目录,那么源文件地址必须为绝对路径,否则创建出来的软链接
    无法使用。
  2. 不能针对文件创建硬链接。“linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。
    至于第一个限制,很好理解,而第二个就不那么好理解了。 我们对任何一个目录用 ls -l 命令都可以看到其连接数至少
    是2,这也说明了系统中是存在硬连接的,而且命令 ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对
    目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进行限制呢?如果引
    入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许你会说,符号
    连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)
    都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是
    说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环
    了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接
    ,由于操作系统中采用的数据结构和算法限制,目前是不能防这种死循环的。”

history指令

1.history 显示历史命令

  • 作用:用于显示历史记录和执行过的指令命令
  • 当登录shell或者是退出的时候会自动进行读取和存储

1.常用参数

1
2
3
4
5
6
7
8
9
10
11
语法:
# history 选项 参数

#参数
-n #显示最近的n条记录
-a #将历史命令缓冲区中命令写入历史命令文件中
-c #将目前的shell中的所有 history 内容全部消除 实际为假删除
-r #将历史命令文件中的命令读入当前历史命令缓冲区
-w #将当前历史命令缓冲区命令写入历史命令文件中
-d #删除历史记录中指定的行
12345678910

2.常用范例

1.获取历史记录的最新2两条

1
2
3
4
5
[root@localhost ~]# history 2
342 cd
343 history 2
这种方式获取的最新两条记录,也会把最后一条命令算上
1234

2.执行最后一次命令

1
2
3
4
5
[root@localhost ~]# !!
history 2
342 cd
343 history 2
1234

3.清空当前历史记录(只是清空缓存中的历史记录,伪删除)

-c 参数是清空所有历史记录

1
2
3
4
[root@localhost ~]# history -c
[root@localhost ~]# history
1 history
123

这种方式类似于clear,并不会文件中的历史记录删除,如果要真正的历史记录,需要用文本中第3条关于history的配置文件.

4.将当前缓存中的历史记录写入文件(缓存中的记录是空的-用空的数据写入文件,将文件内部删除)

1
2
[root@localhost ~]# history -w
1

5.删除某行历史记录(这样可以有针对性的保留历史记录)

1
2
3
删除第25行历史记录
[root@localhost ~]# history -d 25
12

6.!+数字 代表执行历史中第n条命令

1
2
3
[root@localhost ~]# !30
cd /etc/sysconfig/network-scripts/
12

7.!+字符串 代表搜索历史命令最近一个以xxxx字符开头的命令

1
2
3
4
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# !cd
cd /etc/sysconfig/network-scripts/
123

8.crtl+r 输入某条命令的关键字,找出对应的命令,按右光标键

在终端中按捉 [Ctrl] 键的同时 [r] 键,出现提示:(reverse-i-search),
此时你尝试一下输入你以前输入过的命令,当你每输入一个字符的时候,终端都会滚动显示你的历史命令。
当显示到你想找的合适的历史命令的时候,直接 [Enter],就执行了历史命令。

3.关于history的配置文件

  • 所有我们用history命令看到的历史记录,都默认保存在:~/.bash_history;
  • 如果是root用户就是在/root/.bash_history文件里;
  • 直接删除这个文件会清除历史记录,再登陆系统会自动重新生成这个文件

在这里插入图片描述

  1. Linux命令的历史记录,会持久化存储,默认位置是当前用户家目录的 .bash_history 文件中,读取历史记录,存储在相应内存的缓冲区中
  2. 我们平时操纵的Linux命令,都会记录在缓冲区中,包括history命令所执行的历史命令管理,都是在操纵缓冲区,而不是直接操纵.bash_history文件
  3. 当我们退出shell时,比如按下 Ctrl+D 时,shell进程会把历史记录缓冲区的内容,写回到.bash_history 文件中

时间与日期日历指令-date 与 cal

一、date指令

date指令用处较多,下面一个一个来介绍

1.显示当前系统日期时间

举个例子,显示当前系统日期,直接写

1
2
date
1

给大家看一下它的一个格式
在这里插入图片描述
当然,我们也可以让它只显示你想显示的日期格式
比如
显示当前年份

1
2
date +%Y
1

显示当前月份

1
2
date +%m
1

显示当前是哪一天

1
2
date +%d
1

显示当前的年月日

1
2
date "+%Y-%m-%d"
1

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

1
2
date "+%Y-%m-%d %H:%M:%S"
1

2.设置系统日期

1
2
date -s "日期字符串"
1

比如把系统时间设置成2022年6月20日9点33分50秒

1
2
date -s "2022-6-20 9:33:50"
1

二、cal指令

cal指令用于查看日历

比如,查看当前日历

1
2
cal 
1

如果我想查看2020年的日历

1
2
cal 2020
1

如果我想查看2020年6月份的日历

1
cal 6 2020

查找指令

在使用 Linux 系统的时候,我们经常会需要查找某些文件,但是大多数情况下我们并不能确定这些文件的具体位置,这样的话就非常浪费我们的时间。Linux 为我们提供了很多的用于文件搜索的命令,如果需求比较简单可以使用 locate,which,whereis 来完成搜索,如果需求复杂可以使用 find, grep 进行搜索。其中 which 在前边已经介绍过了, 使用方法和功能就直接略过了,whereis 局限性太大,不常用这里也就不介绍了。

1. find(查文件)

find 是 Linux 中一个搜索功能非常强大的工具,它的主要功能是根据文件的属性,查找对应的磁盘文件,比如说我们常用的一些属性 文件名 , 文件类型 , 文件大小 , 文件的目录深度 等,下面基于这些常用数据来讲解一些具体的使用方法。

如果想用通过属性对文件进行搜索, 只需要指定出属性对应的参数就可以了, 下面将依次进行介绍。

1.1 文件名 (-name)

根据文件名进行搜索有两种方式: 精确查询和模糊查询。关于模糊查询必须要使用对应的通配符,最常用的有两个, 分别为 * 和 ?。其中 * 可以匹配零个或者多个字符, ?用于匹配单个字符。

如果我们进行模糊查询,建议(非必须)将带有通配符的文件名写到引号中(单引号或者双引号都可以),这样可以避免搜索命令执行失败(如果不加引号,某些情况下会这样)。

如果需要根据文件名进行搜索,需要使用参数 -name。

1
2
3
4
5
# 语法格式: 根据文件名搜索 



$ find 搜索的路径 -name 要搜索的文件名

根据文件名搜索举例:

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
31
32
# 模式搜索



# 搜索 root 家目录下文件后缀为 txt 的文件



[root@VM-8-14-centos ~]# find /root -name "*.txt"



# 精确搜索

# 搜索 root 家目录下文件名为 onepiece.txt 的文件


[root@VM-8-14-centos ~]# find /root -name "onepiece.txt"

/root/luffy/get/onepiece/onepiece.txt



/root/luffy/get/onepiece.txt



/root/luffy/onepiece.txt



/root/onepiece.txt

1.2 文件类型 (-type)

在前边文章中已经介绍过 Linux 中有 7 中文件类型 , 如果有去求我们可以通过 find 对指定类型的文件进行搜索,该属性对应的参数为 -type。其中每种类型都有对应的关键字,如下表:

文件类型 类型的字符描述
普通文件类型 f
目录类型 d
软连接类型 l
字符设备类型 c
块设备类型 b
管道类型 p
本地套接字类型 s
1
2
3
4
5
# 语法格式: 



$ find 搜索的路径 -type 文件类型

根据文件类型搜索举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 搜索 root 用户家目录下, 软连接类型的文件



[root@VM-8-14-centos ~]# find /root -type l


/root/link.lnk


/root/luffy/get/link.lnk

/root/file/link

1.3 文件大小 (-size)

如果需要根据文件大小进行搜索,需要使用参数 -size。关于文件大小的单位有很多,可以根据实际需求选择,常用的分别有 k(小写), M(大写), G(大写)。

在进行文件大小判断的时候,需要指定相应的范围,涉及的符号有两个分别为:加号 (+) 和 减号 (-),下面具体说明其使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 语法格式: 



$ find 搜索的路径 -size [+|-]文件大小



- 文件大小需要加单位:



- k (小写)



- M (大写)



- G (大写)

关于文件大小的区间划分非常重要,请仔细阅读,并思考,可以自己画个图,这里以 4k 来举例:

  1. -size 4k 表示的区间为 (4-1k,4k], 表示一个区间,大于 3k, 小于等于 4k
  2. -size -4k: [0k, 4-1k], 表示一个区间,大于等于 0 并且 小于等于 3k
  3. -size +4k: (4k, 正无穷), 表示搜索大于 4k 的文件

根据文件大小搜索举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 搜索当前目录下 大于1M的所有文件 (file>3M)


$ find ./ -size +3M

# 搜索当前目录下 大于等于0M并且小于等于2M的文件 (0M <= file <=2M)

$ find ./ -size -3M


# 搜索当前目录下 大于2M并且小于等于3M的文件 (2M < file <=3M)



$ find ./ -size 3M

# 搜索当前目录下 大于1M 并且 小于等于 3M 的文件



$ find ./ -size +1M -size -4M

1.4 目录层级

因为 Linux 的目录是树状结构,所有目录可能有很多层,在搜索某些属性的时候可以指定只搜索某几层目录,相关的参数有两个,分别为: -maxdepth 和 -mindepth。

这两个参数不能单独使用, 必须和其他属性一起使用,也就是搜索某几层目录中满足条件的文件。

  • -maxdepth: 最多搜索到第多少层目录,
  • -mindepth: 至少从第多少层开始搜索

下面通过 find 搜索某几层目录中文件名满足条件的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查找文件, 从根目录开始, 最多搜索5层, 这个文件叫做 *.txt (1 <= 层数 <= 5)



$ sudo find / -maxdepth 5 -name "*.txt"




# 查找文件, 从根目录开始, 至少从第5层开始搜索, 这个文件叫做 *.txt (层数>=5层)



$ sudo find / -mindepth 5 -name "*.txt"

1.5 同时执行多个操作

在搜索文件的时候如果想在一个 find 执行多个操作,通过使用管道 (|) 的方式是行不通的,比如下面的操作:

1
2
3
4
5
6
7
8
9
10
11
12
# 比如: 通过find搜索最多两层目录中后缀为 .txt 的文件, 然后再查看这些满足条件的文件的详细信息



# 在find操作中直接通过管道操作多个指令, 最终输出的结果是有问题, 因此不能直接这样使用



$ find ./ -maxdepth 2 -name "*.txt" | ls -l


-rw-r--r-- 1 root root 598314 Dec 2 02:07 rarlinux-x64-6.0.0.tar.gz

如果想要实现上面的需求,需要在 find 中使用 exec, ok, xargs, 这样就可以在 find 命令执行完毕之后,再执行其他的子命令了。

1.5.1 exec

-exec 是 find 的参数,可以在exec参数后添加其他需要被执行的shell命令。

find 添加了 exec 参数之后,命令的尾部需要加一个后缀 {} ;, 注意 {} 和 \ 之间需要有一个空格。

在参数 -exec 后添加的 shell 命令处理的是 find 搜索之后的结果,find 的结果会作为 新添加的 shell 命令 的输入,最后在终端上输出最终的处理结果。

1
2
3
# 语法:

$ find 路径 参数 参数值 -exec shell命令2 {} \;

命令的使用效果演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 搜索最多两层目录, 文件名后缀为 .txt的文件



$ find ./ -maxdepth 2 -name "*.txt"

./luffy/robin.txt

# 搜索到满足条件的文件之后, 再继续查看文件的详细属性信息

$ find ./ -maxdepth 2 -name "*.txt" -exec ls -l {} \;

-rw-r--r-- 1 root root 0 Jan 25 17:54 ./luffy/robin.txt

1.5.2 ok

-ok 和 -exec 都是 find 命令的参数,使用方式类似,但是这个参数是交互式的,在处理 find 的结果的时候,会向用户发起询问,比如在删除搜索结果的时候,为了保险起见,就需要询问机制了。

语法格式如下:

1
2
3
# 语法: 其实就是将 -exec 替换为 -ok, 其他都不变

$ find 路径 参数 参数值 -ok shell命令2 {} \;

命令效果演示:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 搜索到了2个满足条件的文件

$ find ./ -maxdepth 1 -name "*.txt"



./aaaaa.txt



./english.txt



# 查找并显示文件详细信息



$ find ./ -maxdepth 1 -name "*.txt" -ok ls -l {} \;



< ls ... ./aaaaa.txt > ? y # 同意显示文件详细信息



-rw-rw-r-- 1 robin robin 10 Apr 17 11:34 ./aaaaa.txt



< ls ... ./english.txt > ? n # 不同意显示文件详细信息, 会跳过显示该条信息



# 什么时候需要交互呢? ---> 删除文件的时候



$ find ./ -maxdepth 1 -name "*.txt" -ok rm -rf {} \;



< rm ... ./aaaaa.txt > ? y # 同意删除



< rm ... ./english.txt > ? n # 不同意删除





# 删除一个文件之后再次进行相同的搜索



$ find ./ -maxdepth 1 -name "*.txt"



./english.txt # 只剩下了一个.txt 文件。
1.5.3 xargs

在使用 find 的 -exec 参数的时候,需要在指定的子命令尾部添加几个特殊字符 {} ;,一不小心就容易写错,有一种看起来更加直观、书写更加简便的方式,我们可以使用 xargs 替换掉 -exec 参数,而且在处理数据的时候 xargs更高效。有了 xargs 的加持我们就可以在 find 命令中直接使用管道完成前后命令的数据传递,使用方法如下:

1
2
3
4
5
6
7
8
9
# 在find 中 使用 xargs 关键字我们就可以使用管道了, 否则使用管道也不会起作用



# 将 find 搜索的结果通过管道传递给后边的shell命令继续处理



$ find 路径 参数 参数值 | xargs shell命令2

命令效果演示:

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
# 查找文件

$ find ./ -maxdepth 1 -name "*.cpp"

./occi.cpp

./main.cpp

./test.cpp


# 查找文件, 并且显示文件的详细信息

robin@OS:~$ find ./ -maxdepth 1 -name "*.cpp" | xargs ls -l

-rw-r--r-- 1 robin robin 2223 Mar 2 2020 ./main.cpp

-rw-r--r-- 1 robin robin 1406 Mar 2 2020 ./occi.cpp

-rw-r--r-- 1 robin robin 2015 Mar 1 2020 ./test.cpp

# xargs的效率比使用 -exec 效率高

-exec: 将find查询的结果逐条传递给后边的shell命令

-xargs: 将find查询的结果一次性传递给后边的shell命令

2. grep(查文件里具体内容)

一、grep基本介绍

全拼:Global search REgular expression and Print out the line.

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行.

模式:由正则表达式的元字符及文本字符所编写出的过滤条件﹔

img
grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式

img

二、正则表达式grep实践

首先先看一下这个测试文件的内容吧

img

2.1、输出以 I 开头的行(不区分大小写)

img

注: 这里的-i代表不区分大小写, -n代表显示匹配行和行号

2.2、输出以.结尾的行

img

注: 因为.在这里有着特殊含义, 所以要用\转义一下, 如果不加转义字符的话, grep就会把它当做正则表达式来处理(.代表的含义是匹配任意一个字符)

2.3、$符号
  • 注意在Linux平台下, 所有文件的结尾都有一个$符
  • 可以利用cat -A 查看文件

img

2.4、^$(代表空行的意思)组合符

找出文件的空行, 以及行号

img

2.5、.点符号

"."点表示任意一个字符, 有且只有一个, 不包含空行

img

2.6、*符号

"*"表示找出前一个字符0次或一次以上

找出文件中i出现0次或多次的行和行号

img

2.7、.*组合符
".*"表示所有内容, 包括空行

img

2.8、^.*t符 (含义: 以任意内容开头, 直到t结束)

img

2.9、[abc]中括号

中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下;

  • [a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母
  • [a-zA-Z]匹配所有的单个大小写字母
  • [0-9]匹配所有单个数字
  • [a-zA-ZO-9]匹配所有数字和字母

匹配abc字符中的任意一个,得到它的行数和行号

img

2.10、grep的参数-o

使用"-o"选项, 可以值显示被匹配到的关键字, 而不是讲整行的内容都输出.

img

显示出文章中有多少行有a

img

"-c"只统计匹配的行数

2.11、[^abc]中括号中去反

[^abc]或[^a-c]这样的命令, "^"符号在中括号中第一位表示排除, 就是排除字符a,b,c

注: 出现再中括号里的尖角号表示取反

img

三、扩展正则表达式grep实践

此处使用grep -E进行实践扩展正则, egrep官网已经弃用了

3.1、+号

+号表示匹配前一个字符1一次或多次,必须使用grep-E扩展正则

img

3.2、?符

匹配前一个字符0次或1次

找出文件中包含gd或者god的行

img

3.3、|符

竖线|再正则中是或者的意思

找出opt目录中txt结尾的文件, 其名字中包含a或者e, 不区分大小写(-i)

img

3.4、()小括号

将一个或多个字符捆绑在一起, 当作一个整体进行处理

img

3.5、{n,m}匹配次数

{n,m}:匹配前一个字符至少n次, 最多m次

{n,}: 匹配前一个字符至少n次, 没有上限

{,m}: 匹配前一个字符最多m次,可以没有*

重复前一个字符各种次数, 可以通过-o参数显示明确的匹配过程

img

3.locate(查文件)

我们可以将 locate 看作是一个简化版的 find, 使用这个命令我们可以根据文件名搜索本地的磁盘文件 , 但是 locate的效率比find要高很多。原因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

1
2
3
4
5
6
7
# 使用管理员权限更新本地数据库文件, root用户这样做

$ updatedb

# 非root用户需要加 sudo

$ sudo updatedb

locate 有一些常用参数,使用之前先来介绍一下:

搜索所有目录下以某个关键字开头的文件

1
$ locate test		# 搜索所有目录下以 test 开头的文件

搜索指定目录下以某个关键字开头的文件,指定的目录必须要使用绝对路径

1
$ locate /home/robin/test    # 指定搜索目录为 /home/robin/, 文件以 test 开头

搜索文件的时候,忽略文件名的大小写,使用参数 -i

1
$ locate TEST -i	# 文件名以小写的test为前缀的文件也能被搜索到

列出前 N 个匹配到的文件名称或路径名称,使用参数 -n

1
$ locate test -n 5		# 搜索文件前缀为 test 的文件, 并且只显示5条信息

基于正则表达式进行文件名匹配,查找符合条件的文件,使用参数 -r

1
2
3
# 使用该参数, 需要有正则表达式基础

$ locate -r "\.cpp$" # 搜索以 .cpp 结尾的文件

正则表达式小科普:

  1. 在正则表达式中 . 可以匹配任意一个 非 \n 的单字符
  2. 上边的命令中使用转译字符 \ 对特殊字符. 转译,就得到了普通的字符.
  3. 在正则表达式中 $ 放到字符尾部,表示字符串必须以这个字符结尾,上边的命令中修饰的是字符 p
  4. 正则表达式中的 字符 c 和后边的字符 p 需要进行字节匹配,没有特殊含义
  5. 通过上面的解释就能明白 .cpp$ 说的就是以 .cpp 结尾的字符串

4.whereis命令(查找二进制)

在Linux中,可执行文件被称为二进制文件,如果你想定位一个二进制文件,whereislocate更加有效。

1
whereis binary

这个命令将返回二进制文件的位置,以及它的源代码和手册页,如果有的话。

1
whereis aircrack-ng

img

5.which命令(查找二进制)

Linux中的PATH变量存放着操作系统寻找你在命令行中执行的命令的目录。

1
2
which binary
which ls

which命令在你的PATH中找到一个二进制文件。如果它在当前PATH中没有找到该二进制文件,它就什么也不返回。

1
which aircrack-ng

img

这些目录通常包括/usr/bin,但也可能包括/usr/sbin和其他一些目录。

打包压缩与解压命令

zip与unzip命令

zip 用于压缩文件,压缩为*.zip文件。 unzip 用于解开被zip压缩过的文件。

(1) zip [选项] 压缩后的名称 文件或目录

选项:

选项较多,不一一详细介绍。

-d :从压缩文件内删除指定的文件;

-r :递归处理,将指定目录下的所有文件和子目录一并处理;

例:

zip aa aa.txt 在当前目录下将aa.txt压缩为aa.zip文件

zip -r myx /tmp/xxx 将xxx目录及其内容压缩为myx.zip文件

(2) unzip [选项] 解压到的目录 *.zip文件

选项:

选项较多,不一一详细介绍。

-d<目录> :指定文件解压缩后所要存储的目录;

例:

unzip aa.zip 在当前目录下将aa.zip文件解压

unzip aa.zip -d /tmp/yyy 或 unzip -d /tmp/yyy aa.zip    将aa.zip解压到/tmp/yyy目录下

gzip与gunzip命令

gzip 用于压缩文件,压缩为*.gz文件。 gunzip 用于解开被gzip压缩过的文件。

(1) gzip [选项] 文件

选项:

选项较多,不一一详细介绍。

-d :解开压缩文件。

例:

gzip aa.txt 将aa.txt压缩为aa.txt.gz文件

gzip aa.txt bb.txt 将两个文件分别压缩为*.gz文件

gzip -d aa.txt.gz 将aa.txt.gz文件解压为aa.txt文件

补充:

当使用gzip命令压缩文件时,不会保留原文件。

(2) gunzip [选项] *.gz文件

选项:

没有什么重要的选项

例:

gunzip aa.txt.gz 将aa.txt.gz文件解压为aa.txt文件

tar命令

打包命令,打包后的文件是 .tar.gz 的文件。

tar [选项] 文件或目录

选项:

选项较多,不一一详细介绍。

-c :产生.tar打包文件

-v :显示详细信息

-f :指定压缩后的文件名

-z :用gzip进行解压或压缩

-x :解包.tar文件

-C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

打包用解压用zxcf

例:

tar -zcvf myfile.tar.gz a.txt b.txt

在当前目录下将a.txt、b.txt这两个文件一块打包成myfile.tar.gz文件

tar -zxvf myfile.tar.gz

将myfile.tar.gz文件解压到当前目录

tar -zcvf myfile.tar.gz /tmp/xxx

在当前目录下将/tmp/xxx目录及其内容一块打包成myfile.tar.gz文件

tar -zxvf myfile.tar.gz -C /tmp/mydir

将myfile.tar.gz文件解压到/tmp/mydir目录下

切割指令

cut命令详解

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。注意,cut一行为一个单位切割的,每一行相互独立

一、基本语法

1
2
cut [选项参数]  filename
1

说明:默认分隔符是制表符

选项与参数:

-d:分隔符,按照指定分隔符分割列。与 -f 一起使用

-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列)

-c:以字符 (characters) 的单位取出固定字符区间

-b:以字节为单位进行分割

二、实操案例

准备数据

1
2
3
4
5
6
7
8
[root@jiangnan data]$ touch cut.txt
[root@jiangnan data]$ vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
1234567
  1. 切割cut.txt第一列
1
2
3
4
5
6
7
8
[root@jiangnan data]# cut -d ' ' -f 1 cut.txt 
dong
guan
wo
lai
le
[root@jiangnan data]#
1234567

注意双引号里面是空格,因为要以空格作为分隔符。

  1. 切割cut.txt第二、三列
1
2
3
4
5
6
7
8
[root@jiangnan data]# cut -d ' ' -f 2,3 cut.txt 
shen
zhen
wo
lai
le
[root@jiangnan data]#
1234567

注意后面三个的前面是有一个空格的,因为我们在准备数据的时候就写了两个空格。

  1. 切割cut.txt的第5-8个字符
1
2
3
4
5
6
7
8
[root@jiangnan data]# cut -c 5-8 cut.txt 
she
zhe
wo
lai
le
[root@jiangnan data]#
1234567
  1. 切割cut.txt的第2,4,6个字节
1
2
3
4
5
6
7
8
[root@jiangnan data]# cut -b 2,4,6 cut.txt 
ogs
unz
o o
a l
e e
[root@jiangnan data]#
1234567

可以看出纯英文状态下字节和字符等效

  1. 切割cut.txt的第6个字节以前的内容
1
2
3
4
5
6
7
8
[root@jiangnan data]# cut -b -6 cut.txt 
dong s
guan z
wo wo
lai l
le le
[root@jiangnan data]#
1234567
  1. 切割字符串中的汉字
1
2
3
4
5
6
7
8
[root@jiangnan data]# echo "我爱你中国" | cut -c 2,3
爱你
[root@jiangnan data]# echo "我爱你中国" | cut -b 2,3

[root@jiangnan data]# echo "我 爱 你 中 国" | cut -d ' ' -f -2
我 爱
[root@jiangnan data]#
1234567

对于汉字的切割最好使用-c(字符),字节(-b)无法满足要求。

  1. 在cut.txt文件中切割出guan
1
2
3
4
[root@jiangnan data]# cat cut.txt | grep "guan" | cut -d " " -f 1
guan
[root@jiangnan data]#
123
  1. 选取系统PATH变量值,第1个“:”开始后的所有路径:
1
2
3
4
5
6
[root@jiangnan data]# echo $PATH
/usr/local/java/jdk1.8.0_161/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@jiangnan data]# echo $PATH | cut -d: -f 2-
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@jiangnan data]#
12345

三、cut有哪些缺陷和不足

如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。

awk 命令

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1. 基本用法

1
2
awk [选项参数] 'pattern1{action1}  pattern2{action2}...' filename
1

pattern:表示AWK在数据中查找的内容,就是匹配模式。action:在找到匹配内容时所执行的一系列命令。

注意:行匹配语句 awk 只能用单引号。单引号内部可以使用双引号,但是顺序不能错。

2. 工作流程

读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,$NF表示文本行中的最后一个数据字段。默认域分隔符是"空白键" 或 “[tab]键”。

3. 常用选项参数说明

  • -F:指定输入文件折分隔符。
  • -v:赋值一个用户定义变量。
  • -f:引入awk执行脚本。

4. 实操案例

准备数据

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@jiangnan awk]# cp /etc/passwd ./
[root@jiangnan awk]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
...
[root@jiangnan awk]#
123456789101112
  1. 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
1
2
3
4
[root@jiangnan awk]# awk -F: '/^root/{print $7}' passwd
/bin/bash
[root@jiangnan awk]#
123

-F,指定分隔符为:。print,打印。$7,第7列(域)。
^在root前,表示以指定字符开头,如果没有,则表示有指定字符的行,位置不限。

  1. 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以","号分割。
1
2
3
4
[root@jiangnan awk]# awk -F: '/^root/{print $1","$7}' passwd
root,/bin/bash
[root@jiangnan awk]#
123

注意:只有匹配了pattern的行才会执行action。

  1. 将passwd文件中的用户id增加数值1并输出
1
2
3
4
5
6
7
8
[root@jiangnan awk]# awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
...
[root@jiangnan awk]#
1234567

-v:赋值一个用户定义变量

  1. 如果awk命令是日常重复工作,而又没有太多变化,可以将程序写入文件,每次使用-f调用程序文件就好,方便、高效。
1
2
3
4
5
6
7
8
9
10
11
[root@jiangnan awk]# cat abc 
{print $1,$3,$NF}
[root@jiangnan awk]# awk -F : -f abc passwd
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
...
[root@jiangnan awk]#
12345678910

-f:引入awk执行脚本。

  1. 只显示passwd的第一列和第七列,以逗号分割,且在行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"。
1
2
3
4
5
6
7
8
9
[root@jiangnan awk]# awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
...
ntp,/sbin/nologin
dahaige,/bin/zuishuai
[root@jiangnan awk]#
12345678

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

5. 常用awk的内置变量

变量 说明
FILENAME awk浏览的文件名
NR 已读的记录数
NF 浏览记录的域的个数
  1. 统计passwd文件名,每行的行号,每行的列数。
1
2
3
4
5
6
7
8
9
[root@jiangnan awk]# awk -F: '{print "filename:"  FILENAME ", linenumber:" NR  ",columns:" NF}' passwd
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7
filename:passwd, linenumber:4,columns:7
...
filename:passwd, linenumber:24,columns:7
[root@jiangnan awk]#
12345678
  1. 查询sed.txt中空行所在的行号
1
2
3
4
5
6
7
8
9
10
11
[root@jiangnan awk]# cat sed.txt 
1 the quick green fox jumps over the lazy dog.
2 the quick green fox jumps over the lazy dog.

3 the quick green fox jumps over the lazy dog.
4 the quick green fox jumps over the lazy dog.
5 the quick green fox jumps over the lazy dog.
[root@jiangnan awk]# awk '/^$/{print NR}' sed.txt
3
[root@jiangnan awk]#
12345678910
  1. 输出passwd第3行的所有数据
1
2
3
4
[root@jiangnan awk]# awk 'NR==3{print $0}' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@jiangnan awk]#
123
  1. 输出passwd第5行的第6个字段
1
2
3
4
[root@jiangnan awk]# awk -F: 'NR==5{print $6}' passwd 
/var/spool/lpd
[root@jiangnan awk]#
123
  1. 输出第一个字段为root所在的行
1
2
3
4
[root@jiangnan awk]# awk -F: '$1=="root"{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
[root@jiangnan awk]#
123

以上案例要注意需要指定切割符:

  1. 查看已使用的内存
1
2
3
4
[root@jiangnan awk]# head -2 /proc/meminfo | awk 'NR==1{a=$2}NR==2{b=$2;print (a-b)*100/a "%"}'
95.6707%
[root@jiangnan awk]#
123

6. awk程序的优先级

BEGIN是优先级最高的代码块,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及到任何数据的处理,也不依赖与PROGRAM代码块;PROGRAM是对数据流干什么,是必选代码块,也是默认代码块。所以在执行时必须提供数据源;END是处理完数据流后的操作,如果需要执行END代码块,就必须需要PROGRAM的支持,单个无法执行。

总结起来awk程序运行优先级是:

  • 1)BEGIN: 在开始处理数据流之前执行,可选项
  • 2)program: 如何处理数据流,必选项
  • 3)END: 处理完数据流后执行,可选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@jiangnan awk]# awk 'BEGIN{print "hello ayitula"}{print $0}END{print "bye ayitula"}' sed.txt 
hello ayitula
1 the quick green fox jumps over the lazy dog.
2 the quick green fox jumps over the lazy dog.

3 the quick green fox jumps over the lazy dog.
4 the quick green fox jumps over the lazy dog.
5 the quick green fox jumps over the lazy dog.
bye ayitula
[root@jiangnan awk]#
12345678910
[root@jiangnan awk]# awk 'BEGIN{print "hello world"}'
hello world
[root@jiangnan awk]#
123

可以看出BEGIN不需要数据源(sed.txt)就可以执行。

1
2
[root@jiangnan awk]# awk 'END{print "hello world"}'
1

END没有数据源则无法执行。

tcpdump抓包指令

1.精简版

Linux下使用tcpdump:抓包的实现方法

很多时候我们的系统部署在Liux系统上面,在一些情况下定位问题就需要查看各个系统之间发送数据报文是否正常,下面我就简单讲解一下如何使用tcpdumpi抓包
tcpdump;是Linux下面的一个开源的抓包工具,和Windows"下面的wiresharkj抓包工具一样,支持抓取指定网口、指定目的地址、指定源地址、指定端口、指定协议的数据。

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
31
1、安装tcpdump
yum install -y tcpdump
2、常见的使用方法
抓取所有经过eth2目的或源地址是192.168.1.2的网络数据,并且保存到XX.pcap文件中
tcpdump -i eth2 host 192.168.1.2 -w xx.pcap
抓取所有经过eth2,目的地址是192.168.1.2的网络数据,并且保存到XX.pcap文件中tcpdump-ieth2 dst host
192.168.1.2-wx.pcap
抓取所有经过eth1,源地址是192.168.1.2的网络数据,并且保存到XX.pcap文件中
tcpdump -i eth2 dst host 192.168.1.2 -w xx.pcap
抓取网口1源端口是25的数据,保存到xx.pcap中
tcpdump -i eth1 src port 25 -w xx.pcap
抓取网口1目的端口是25的数据,保存到xx.pcap中
tcpdump -i eth1 dst port 25 -w xx.pcap



示例:
tcpdump -i enp4s0f0 -s 0 port 25228 -w hk2.pcap -v

enp4s0f0---ifconfig--->网卡名称

-s 0 ---->不限制抓包的大小

port 25228---->只抓取服务器上25228端口的数据流量

-w hk2.pcap --->保存的文件名称

-v --->显示抓包的大小数字



2.复杂版

Tcpdum是Linux上强大的网络数据采集分析工具。

tcpdump选项可划分为四大类型:
1.控制抓包行为
2.控制信息如何显示
3.控制显示什么数据
4.过滤命令

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
31
32
33
#tcpdump --help



Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]



[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]



[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]



[ -Q|-P in|out|inout ]



[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]



[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]



[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]



[ -Z user ] [ expression ]

抓包文件保存:

1
#tcpdump -i any -s 0 -X -w /tmp/tcpdump.pcap

抓包文件解析:

1
#tcpdump -A -r /tmp/tcpdump.pcap|less

1. 控制抓包行为

​ 这一类命令行选项影响抓包行为,包括数据收集的方式。之前已介绍了两个例子:-r 和 -w。
-w 选项允许用户将输出重定向到一个文件,之后可通过-r选项将捕获数据显示出来。
如果用户知道需要捕获的报文数量或对于数量有一个上限,可使用-c选项。
则当达到该数量时程序自动终止,而无需使用kill命令或Ctrl-C。
如收集到100个报文之后tcpdump终止:

1
tcpdump -c 100

通过 -i 选项指定接口。在不确定的情况下,可使用ifconfig -a来检查哪一个接口可用及对应哪一个网络。

1
#tcpdump -i enp131s0 icmp

通过 -p 选项将网卡接口设置为非混杂模式。这一选项理论上将限制为捕获接口上的正常数据流,来自或发往主机,多播数据,以及广播数据。
-s 选项控制数据的截取长度。通常,tcpdump默认为一最大字节数量并只会从单一报文中截取到该数量长度。实际字节数取决于操作系统的设备驱动。通过默认值来截取合适的报文头,而舍弃不必要的报文数据。
如果用户需截取更多数据,通过-s选项来指定字节数。也可以用-s来减少截取字节数。
对于少于或等于200字节的报文,以下命令会截取完整报文:

1
#tcpdump -s 200

2. 控制信息如何显示

1
2
3
4
5
#tcpdump -n -tt -i bond_mgmt port 22



1639923887.526816 IP 172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], seq 1931446332:1931446528, ack 3414141942, win 318, options [nop,nop,TS val 2697135390 ecr 1876028651], length 196

-a,-n,-N和-f选项决定了地址信息是如何显示的。
-a 选项强制将网络地址显示为名称。
-n 阻止将地址显示为名字。
-N 阻止将域名转换。
-f 选项阻止远端名称解析。
-t 和 -tt 选项控制时间戳的打印。-t选项不显示时间戳而 -tt 选项显示无格式的时间戳。

3. 控制显示什么数据

可以通过 -v 和 -vv 选项来打印更多详细信息。例如,-v选项将会打印TTL字段。
要显示较少信息,使用 -q,或quiet选项。
-e 选项用于显示链路层头信息。上例中-e选项的输出为:

1
2
3
4
5
#tcpdump -ne -tt -i bond_mgmt port 22



1639923776.246051 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], seq 1929912564:1929912760, ack 3414140358, win 318, options [nop,nop,TS val 2697024109 ecr 1875917372], length 196

-x 选项将报文以十六进制形式dump出来,排除了链路层报文头。-x 和 -vv 选项报文显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#tcpdump -ne -v -x  -i bond_mgmt port 22



22:26:32.122212 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 190: (tos 0x10, ttl 64, id 23674, offset 0, flags [DF], proto TCP (6), length 176)



172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], cksum 0x698d (incorrect -> 0x5143), seq 1934042648:1934042772, ack 3414143698, win 318, options [nop,nop,TS val 2697239985 ecr 1876133235], length 124



0x0000: 4510 00b0 5c7a 4000 4006 74d3 ac1e 883b



0x0010: ac1e 8872 0016 9ff4 7347 2618 cb7f b2d2 ... ...

4. 过滤命令

要有效地使用tcpdump,掌握过滤器非常必要的。过滤允许用户指定想要抓取的数据流,从而用户可以专注于感兴趣的数据。

如果用户很清楚对何种数据流不感兴趣,可以将这部分数据排除在外。如果用户不确定需要什么数据,可以将源数据收集到文件之后再读取时应用过滤器。
实际应用中,需要经常在两种方式之间转换。

简单的过滤器是加在命令行之后的关键字。但是,复杂的命令是由逻辑和关系运算符构成的。对于这样的情况,通常最好用-F选项将过滤器存储在文件中。

1
2
3
4
5
6
7
8
9
非 : ! or "not" (without the quotes)



且 : && or "and"



或 : || or "or"

4.1 地址过滤

过滤器可以按照ip地址选择数据流。例如,考虑如下命令:

1
2
3
4
5
6
7
8
9
#tcpdump -ne -i bond_virt host 192.168.1.1







22:31:21.456181 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.4 > 192.168.1.1: ICMP echo request, id 9327, seq 54, length 64

通过机器的以太网mac地址来选择数据流:

1
2
3
4
5
#tcpdump -ne -i bond_virt ether host fa:16:3e:ed:88:5a



22:32:58.459154 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.4 > 192.168.1.1: ICMP echo request, id 9327, seq 151, length 64

数据流可进一步限制为单向,分别用src或dst指定数据流的来源或目的地。

1
2
3
4
5
#tcpdump -ne -i bond_virt dst 192.168.1.4



22:35:15.465312 fa:16:3e:f0:51:b2 > fa:16:3e:ed:88:5a, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.1 > 192.168.1.4: ICMP echo reply, id 9327, seq 288, length 64

广播和多播数据相应可以使用broadcast和multicast。由于多播和广播数据流在链路层和网络层所指定的数据流是不同的,所以这两种过滤器各有两种形式。过滤器ether multicast抓取以太网多播地址的数据流,ip multicast抓取IP多播地址数据流。广播数据流也是类似的使用方法。注意多播过滤器也会抓到广播数据流。
除了抓取特定主机以外,还可以抓取特定网络。例如,以下命令限制抓取来自或发往224.0.0的vrrp报文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#tcpdump -ne -i bond_virt net 224.0.0



22:37:15.092693 fa:16:3e:3a:19:69 > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 58: vlan 4003, p 0, ethertype IPv4, 169.254.192.11 > 224.0.0.18: VRRPv2, Advertisement, vrid 69, prio 50, authtype none, intvl 2s, length 20







#tcpdump -ne -i bond_virt net 224.0.0.0 mask 255.255.255.0



22:38:14.880908 fa:16:3e:09:5a:de > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 58: vlan 3994, p 0, ethertype IPv4, 169.254.192.143 > 224.0.0.18: VRRPv2, Advertisement, vrid 72, prio 50, authtype none, intvl 3s, length 20

抓取目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据

1
#tcpdump '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
4.2 协议及端口过滤

制抓取指定协议如IP,UDP或TCP。还可以限制建立在这些协议之上的服务,如DNS或HTTP。这类抓取可以通过三种方式进行:使用tcpdump关键字,通过协议关键字proto,或通过服务使用port关键字。
当我们继续之前,必须了解tcp/ip包头的头部信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
proto[x:y]          : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出2、3字节(第三、第四字节)(第一字节从0开始排)



proto[x:y] & z = 0 : proto[x:y]和z的与操作为0



proto[x:y] & z !=0 : proto[x:y]和z的与操作不为0



proto[x:y] & z = z : proto[x:y]和z的与操作为z



proto[x:y] = z : proto[x:y]等于z

操作符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>  : greater 大于



< : lower 小于



>= : greater or equal 大于或者等于



<= : lower or equal 小于或者等于



= : equal 等于



!= : different 不等于

一些协议名能够被tcpdump识别到因此可通过关键字来指定。以下命令限制抓取UDP数据流:

1
2
3
4
5
# tcpdump -ne -i bond_virt udp



22:40:17.030950 90:1b:0e:ea:ea:7e > Broadcast, ethertype 802.1Q (0x8100), length 86: vlan 3122, p 0, ethertype IPv4, 10.34.244.146.49664 > 255.255.255.255.sentinelsrm: UDP, length 40

有很多传输层服务没有可以识别的关键字。在这种情况下,可以使用关键字proto或 ip proto 加上 /etc/protocols能够找到的协议名或相应的协议编号。

1
2
3
4
5
# tcpdump -ne -i bond_virt proto 112



22:48:07.891750 fa:16:3e:f3:fb:c8 > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 64: vlan 3981, p 0, ethertype IPv4, 169.254.192.22 > 224.0.0.18: VRRPv2, Advertisement, vrid 234, prio 50, authtype none, intvl 2s, length 20

对于更高层级的建立于底层协议之上的服务,必须使用关键字port。

1
2
3
4
5
# tcpdump -nnne -i bond_virt port 137



22:51:58.320013 94:c6:91:7f:bb:f7 > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 96: vlan 3122, p 0, ethertype IPv4, 172.16.0.89.137 > 172.16.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
4.3 报文特征过滤

过滤器也可以基于报文特征比如报文长度或特定字段的内容,过滤器必须包含关系运算符。要指定长度,使用关键字less或greater。如下例所示:

1
2
3
4
5
# tcpdump -nnne -i bond_virt greater 200



22:54:38.206873 3c:8c:40:ad:11:ff > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 342: LLDP, length 328: NET-ACCE-05-XX.XX.XXX

该命令收集长度大于200字节的报文。

根据报文内容过滤更加复杂,因为用户必须理解报文头的结构。但是尽管如此,或者说正因如此,这一方式能够使用户最大限度的控制抓取的数据。

4.3.1 IP选项设置(20字节,可变部分(0-20)B,最大40字节)

在这里插入图片描述

4.3.1.1 IP version & Hdr Len

一般”的IP头是20字节,但IP头有选项设置,不能直接从偏移21字节处读取数据。IP头有个长度字段可以知道头长度是否大于20字节。
通常第一个字节的二进制值是:01000101,分成两个部分:
0100 = 4 表示IP版本 0101 = 5 表示 IP头32 bit的块数,5 x 32 bits = 160 bits or 20 bytes
如果第一字节第二部分的值大于5,那么表示头有IP选项。

  • 比较第一字节的值是否大于01000101(十进制等于69),这可以判断IPv4带IP选项的数据和IPv6的数据。
1
#tcpdump 'ip[0] > 69'
  • 位操作(IPv6的数据也可以匹配)

0100 0101 : 第一字节的二进制
0000 1111 : 与操作
0000 0101 : 结果

1
#tcpdump  'ip[0] & 15 > 5'

或者

1
#tcpdump  'ip[0] & 0x0f > 5'
4.3.1.2 DF分片标记
  • Is DF bit (don’t fragment) set?

当发送端的MTU大于到目的路径链路上的MTU时就会被分片
分片信息在IP头的第七和第八字节:
Bit 0: 保留,必须是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片
Bit 2: (MF) 0 = 最后的分片, 1 = 还有分片
Fragment Offset字段只有在分片的时候才使用。

  • :要抓带DF位标记的不分片的包,第七字节的值应该是:01000000 = 64
1
2
3
4
5
6
7
8
9
#tcpdump  'ip[6] = 64'



# tcpdump -nnne -c 10 -i bond_mgmt 'ip[6] = 64'



11:18:00.670704 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.22 > 172.30.136.114.57414: Flags [P.], seq 3649304248:3649304444, ack 1818371249, win 318, options [nop,nop,TS val 2743528534 ecr 1922421795], length 196
  • :抓分片包

a:匹配MF,分片包(测试方法:ping -M want -s 3000 114.114.114.114)

1
2
3
4
5
# tcpdump -nnne -c 5 -i bond_mgmt  'ip[6] = 32'



11:20:49.542309 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ICMP echo request, id 24301, seq 1, length 1480

b:匹配分片和最后分片

1
2
3
4
5
6
7
8
9
10
11
12
13
# tcpdump -nnne -c 10 -i bond_mgmt  '((ip[6:2] > 0) and (not ip[6] = 64))'



11:23:34.367123 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ICMP echo request, id 24873, seq 1, length 1480



11:23:34.367136 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ip-proto-1



11:23:34.367140 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 82: 172.30.136.59 > 114.114.114.114: ip-proto-1

4.3.1.3 匹配小于ttl的数据报

TTL字段在第九字节,并且正好是完整的一个字节,TTL最大值是255,二进制为11111111。
可以来验证下,我们试着制定一个特需的ttl长度为 256 (ping -M want -s 3000 -t 256 192.168.1.200 ping: ttl 256 out of range)

1
2
3
4
5
 # tcpdump -nnne -c 10 -i bond_mgmt 'ip[8] < 80'



11:31:08.076553 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.22 > 172.30.136.114.57414: Flags [P.], seq 3649329072:3649329268, ack 1818381829, win 318, options [nop,nop,TS val 2744315940 ecr 1923209214], length 196

4.3.1.4匹配协议头

一般使用语法 proto [ expr : size ]。字段proto指定要查看的报文头,ip则查看IP头,tcp则查看TCP头,以此类推。
expr字段给出从报文头索引0开始的位移。
即:报文头的第一个字节为0,第二字节为1,以此类推。
size字段是可选的,指定需要使用的字节数,1,2或4。

1
2
3
4
5
6
7
8
9
# tcpdump -nnne -vv -i bond_virt "ip[9] = 6"



tcpdump: listening on bond_virt, link-type EN10MB (Ethernet), capture size 262144 bytes



23:05:43.092721 fa:16:3e:26:67:7c > fa:16:3e:ed:88:5a, ethertype 802.1Q (0x8100), length 78: vlan 4030, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 8074, offset 0, flags [DF], proto TCP (6), length 60)

查看第十字节的IP头,协议值为6。注意这里必须使用引号。撇号或引号都可以,但反引号将无法正常工作。

1
2
3
4
5
 # tcpdump -nnne -vv -i bond_virt "ip[9] = 1" (ICMP的协议值为1)



23:08:52.719465 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 58371, offset 0, flags [DF], proto ICMP (1), length 84)

这一方式常常作为掩码来选择特定比特位。值可以是十六进制。可通过语法&加上比特掩码来指定。

4.3.2 TCP选项设置(基础长度20字节,最长可达60字节)

在这里插入图片描述

4.3.2.1.抓取源端口TCP数据包

  • 源端口大于1024的TCP数据包
1
#tcpdump 'tcp[0:2] > 1024'

or

1
#tcpdump 'tcp src portrange 1025-65535'

4.3.2.2.匹配TCP数据包的特殊标记

TCP标记定义在TCP头的第十四个字节

++++++++++++++
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
++++++++++++++

在TCP 3次握手中,两个主机是如何交换数据
1、源端发送 SYN
2、目标端口应答 SYN,ACK
3、源端发送 ACK
只抓取SYN包,第十四字节是二进制的00000010,也就是十进制的2

  • 只抓取SYN包,第十四字节是二进制的00000010,也就是十进制的2
1
#tcpdump 'tcp[13] = 2'
  • 抓取 SYN,ACK (00010010 or 18)
1
#tcpdump 'tcp[13] = 18'
  • 抓取SYN 或者 SYN-ACK
1
#tcpdump 'tcp[13] & 2 = 2'
  • 抓取PSH-ACK
1
#tcpdump 'tcp[13] = 24'
  • 抓所有包含FIN标记的包(FIN通常和ACK一起)
1
#tcpdump 'tcp[13] & 1 = 1'
  • 抓取RST
1
#tcpdump 'tcp[13] & 4 = 4'
  • 抓取TCP连接建立及关闭报文。该过滤器跳过TCP头的13个字节,提取flag字节。掩码0x03选择第一和第二比特位,即FIN和SYN位。如果其中一位不为0则报文被抓取。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# tcpdump -nnne -vv -i bond_mgmt  "tcp[13] & 0x03 != 0"



23:14:51.210165 00:e0:ed:2e:43:6e > 00:e0:ed:49:3d:cd, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 53928, offset 0, flags [DF], proto TCP (6), length 60)



172.30.136.59.53094 > 172.30.136.89.6789: Flags [S], cksum 0x6900 (incorrect -> 0x276e), seq 3618113769, win 29200, options [mss 1460,sackOK,TS val 2700139073 ecr 0,nop,wscale 7], length 0



23:14:51.211618 00:e0:ed:2e:43:6e > 00:e0:ed:49:3d:cd, ethertype IPv4 (0x0800), length 66: (tos 0x0, ttl 64, id 53936, offset 0, flags [DF], proto TCP (6), length 52)



172.30.136.59.53094 > 172.30.136.89.6789: Flags [F.], cksum 0x68f8 (incorrect -> 0x646a), seq 332, ack 433, win 237, options [nop,nop,TS val 2700139075 ecr 1881252428], length 0
  • 如果需要查找端口号大于23的所有TCP数据流,必须从报文头提取端口字段,使用表达式:
1
2
3
4
5
6
7
8
9
10
11
12
13
 # tcpdump -nnne -vv -i bond_mgmt "tcp[0:2] & 0xffff > 0x0017"







23:12:56.113286 6c:92:bf:22:7f:d5 > 00:e0:ed:2e:43:6e, ethertype IPv4 (0x0800), length 66: (tos 0x10, ttl 64, id 53673, offset 0, flags [DF], proto TCP (6), length 52)



172.30.136.114.40948 > 172.30.136.59.22: Flags [.], cksum 0x614b (correct), seq 3414195790, ack 1936528380, win 4372, options [nop,nop,TS val 1878917274 ecr 2700023976], length 0
4.3.3.匹配TCP标志位

4.3.3.1 TCP标记值:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg

  • 实际上有一个很简单的方法过滤 flags(man pcap-filter and look for tcpflags)
1
#tcpdump 'tcp[tcpflags] == tcp-ack'
  • 抓取所有的包,用TCP-SYN 或者 TCP-FIN 设置
1
#tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0

下图表示了TCP各状态转换的标记:

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tcpdump 提供了常用的字段偏移名字:



icmptype (ICMP类型字段)



icmpcode (ICMP符号字段)



tcpflags (TCP标记字段)



ICMP类型值有:



icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit,icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply

4.3.3.2 HTTP数据过滤

十六进制转换方法:python -c ‘print “MAIL”.encode(“hex”)’ --> 4d41494c

  • 抓取http请求开始头格式为GET / HTTP/1.1\r\n (16 bytes counting the carriage return but not the backslashes !) “GET ” 十六进制是 47455420
1
#tcpdump 'tcp[32:4] = 0x47455420'

在这里插入图片描述

  • 查看HTTP GET请求(GET = 0x47, 0x45, 0x54, 0x20),(tcp[12:1] & 0xf0) >> 2 等价于 (tcp[12:1] & 0xf0) /4 ,因为头部的长度为32bit 一个字,偏移量除4获取到data的数组位置。
1
2
3
4
5
6
$offset = ((tcp[12:1] & 0xf0) >> 2)



tcp[$offset:4]
#tcpdump -nnne -i bond_virt -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
  • 查看HTTP POST请求(POST = 0x50, 0x4f, 0x53, 0x54))

查看HTTP请求响应头以及数据

在这里插入图片描述

1
#tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

在这里插入图片描述

1
2
3
4
5
#tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'



# tcpdump -nnne -i bond_virt -c 5 -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

在这里插入图片描述

4.3.3.3 wireshark分析http包过滤:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
按请求头、请求体



http contains "XXXXX" #显示HTTP包中包含指定内容的数据包



http.request.uri contains "XXXXX" #显示HTTP请求包中包含指定内容的数据包



http.time >=0.1 #显示HTTP响应时间大于等于指定时间的数据包



http.request #显示HTTP请求数据包



http.respone #显示HTTP应答数据包



http.response.code == 404 #显示代码为404的HTTP响应数据包



http.content_length < 10 #显示HTTP的内容长度小于指定长度的数据包



#显示特定时间的数据包



frame.time == "May 27, 2021 15:23:57.932344000"



#显示时间间隔的数据包



frame.time >= "May 27, 2021 15:23:57.0" && frame.time < "May 27, 2021 15:23:58.0"

4.3.3.4 使用tcpdump方式抓取uri包:

  • 抓取请求:GET /me-a-milkshake-please/ HTTP/1.1

过滤表达式:

在这里插入图片描述

1
tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:4] = 0x2f6d652d && tcp[((tcp[12:1] & 0xf0) >> 2) + 8:4] = 0x612d6d69 && tcp[((tcp[12:1] & 0xf0) >> 2) + 12:4] = 0x6c6b7368 && tcp[((tcp[12:1] & 0xf0) >> 2) + 16:4] = 0x616b652d && tcp[((tcp[12:1] & 0xf0) >> 2) + 20:4] = 0x706c6561 && tcp[((tcp[12:1] & 0xf0) >> 2) + 24:4] = 0x73652f20 && tcp[((tcp[12:1] & 0xf0) >> 2) + 28:4] = 0x48545450 && tcp[((tcp[12:1] & 0xf0) >> 2) + 32:4] = 0x2f312e31
  • 请求头 GET /productlist…

在这里插入图片描述

1
tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:4] = 0x2f70726f && tcp[((tcp[12:1] & 0xf0) >> 2) + 8:4] = 0x64756374 && tcp[((tcp[12:1] & 0xf0) >> 2) + 12:4] = 6c697374'

在这里插入图片描述

4.3.4 链路层数据头选项设置匹配(18字节)
Ethernet II 帧头:6+6+2+4=18Bytes
目标MAC|源MAC|类型|数据|FCS
最小帧长6+6+2+46+4 = 64字节,最大6+6+2+1500+4 = 1518字节。(注:ISL封装后可达1548字节(ISL标记的长度为30字节,思科私有),802.1Q封装后可达1522字节(+4字节vlan信息))

在这里插入图片描述

  • 下例提取从以太网头第一字节开始(即目的地址第一字节),提取低阶比特位,并确保该位不为0,该条件会选取广播和多播报文。
1
2
3
4
5
6
7
8
9
10
11
12
13
# tcpdump -nnne -vv -i bond_mgmt "ether[0] & 1 != 0"



tcpdump: listening on bond_mgmt, link-type EN10MB (Ethernet), capture size 262144 bytes



23:13:52.540436 a0:36:9f:89:0c:66 > 01:00:5e:00:00:12, ethertype IPv4 (0x0800), length 60: (tos 0xc0, ttl 255, id 23668, offset 0, flags [none], proto VRRP (112), length 40)



172.30.140.129 > 224.0.0.18: vrrp 172.30.140.129 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 50, authtype none, intvl 2s, length 20, addrs: 172.30.140.252

在这里插入图片描述

Dest MAC: 目的MAC地址
Src MAC: 源MAC地址
帧类型: 0x0806
硬件类型: 1( 以太网)
协议类型: 0x0800( IP地址)
硬件地址长度: 6
协议地址长度: 4
OP: 1( ARP请求) , 2( ARP应答) , 3( RARP请求) , 4( RARP应答)

在这里插入图片描述

  • 抓取vlan号:
1
#tcpdump -nnne -c 3 -i bond_virt  vlan 1012
  • 老版本内核已不支持tag信息流经libcap,所以下面命令无返回结果(使用vlan vlanid抓包):
1
2
3
4
5
6
7
8
9
#tcpdump -nnne -c 3 -i  bond_virt  'ether[12:2] = 0x8100'







#tcpdump -nnne -c 3 -i bond_virt 'ether[12:2] = 0x8100 and ((ether[14] << 8)+ ether[15]) = 1021 '

文件加密防误操作-chattr

1
chattr +i 文件名 //+i对文件进行加密,-i解锁

常见命令参数

A:即Atime,告诉系统不要修改对这个文件的最后访问时间。

S:即Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。

a:即Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。

b:不更新文件或目录的最后存取时间。

c:将文件或目录压缩后存放。

d:当dump程序执行时,该文件或目录不会被dump备份。

D:检查压缩文件中的错误。

i:即Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。

s:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。

u:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。

t:文件系统支持尾部合并(tail-merging)。

X:可以直接访问压缩文件的内容。

常用的命令展示

chatter: 锁定文件,不能删除,不能更改

+a: 只能给文件添加内容,但是删除不了,

chattr +a /etc/passwd

-d: 不可删除

加锁:chattr +i /etc/passwd 文件不能删除,不能更改,不能移动

查看加锁:lsattr /etc/passwd 文件加了一个参数 i 表示锁定

解锁:chattr -i /home/jiaxu/test.txt - 表示解除

隐藏chattr命令:

1
2
3
4
5
6
which chattr
mv /usr/bin/chattr /opt/ftl/
cd /opt/ftl/
mv chattr h -->更改命令,使用别名h隐藏身份
/opt/ftl/h +i /home/jiaxu/test.txt -->利用h 行驶chattr命令
lsattr /home/jiaxu/test.txt -->查看加密信息

恢复隐藏命令:

1
2
3
mv h /usr/bin/chattr
chattr -i /home/jiaxu/test.txt
lsattr /home/jiaxu/test.txt

任务调度

crond

1
2
3
4
5
6
7
8
9
10
1.概述
任务调度:是指系统在某个时间执行特定的命令或程序。
crond--->周期任务

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

示意图:
123456789

在这里插入图片描述

1
2
3
4
5
6
2.基本语法
crontab [选项]
功能:进行定时任务的设置

3.常用选项
12345

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
4.快速入门
/etc/下有一个crontab文件,在这个文件中写入所有的定时任务

输入crontab -e 就会进入crontab文件
然后在文件中写入定时任务:*/1 * * * * ls –l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令
最后保存退出


参数细节说明:
12345678910

分 时 天 月 星期几

在这里插入图片描述

1
2
特定时间执行任务案例:
1

在这里插入图片描述

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
31
32
33
34
35
36
37
38
39
40
41
42
43
5.应用实例
案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
crontab -e
*/1 * * * * date >> /tmp/mydate


案例 2:每隔 1 分钟,将当前日期和日历都追加到 /home/mycal 文件中
第一种方法:
crontab -e
在crontab文件中输入:
*/1 * * * * date >> /home/mycal
*/1 * * * * cal >> /home/mycal
保存退出

第二种方法:
将 date >> /home/mycal 和 cal >> /home/mycal 命令写在文件 /home/my.sh中
就是将命令都写在shell脚本中,直接调用shell脚本

步骤:
vim /home/my.sh
在my.sh中写入:
date >> /home/mycal
cal >> /home/mycal
:wq
给 my.sh 增加执行权限:chmod u+x /home/my.sh (否则无法使用crontab命令)
crontab -e
在crontab中写入:*/1 * * * * /home/my.sh

注意:可以写脚本也可以不写脚本


案例 3: 每天凌晨 2:00 将 mysql 数据库 testdb 备份到文件中。
提示: 指令为 mysqldump -u root -p密码 数据库 > /home/db.bak
步骤(1) crontab -e
步骤(2) 0 2 * * * mysqldump -u root -proot testdb > /home/db.bak




6. crond 相关指令
conrtab –r:终止任务调度。
crontab –l:列出当前有那些任务调度
service crond restart:重启任务调度

at定时任务

1
2
3
4
5
6
7
8
9
10
11
12
13
1.基本介绍
(1) at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行;
(2) 每个作业队列(任务队列)中都有作业(作业里是指令/脚本)
(3) 默认情况下,atd 守护进程每 60 秒检查作业队列;
有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业;
运行完这个作业(任务)之后,这个作业就不会再被执行了;
(4) at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了;
(5) 在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看
ps -ef | grep atd //可以检测 atd 是否在运行
ps -ef ---> 查看所有的进程

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

在这里插入图片描述

1
2
3
4
5
6
2. at 命令格式
at [选项] [时间]
然后输入两次:Ctrl + D (结束 at 命令的输入)

3. at 命令选项:
12345

在这里插入图片描述

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
4. at 指定时间的方法:

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



5.应用实例
案例 12 天后的下午 5 点执行 /bin/ls /home
at 5pm + 2 days
/bin/ls /home
两次ctrl+D

案例 2:atq 命令来查看系统中没有执行的工作任务
直接输入atq 查询

案例 3:明天17点钟,输出时间到指定文件内 比如 /root/date100.log
at 5pm tomorrow
date > /root/date100.log
两次ctrl+D

案例 42分钟后,输出时间到指定文件内 比如 /root/date200.log
at now + 2 minutes
date > /root/date200.log
两次ctrl+D

案例 5:删除已经设置的任务
atrm 任务编号
atrm 4 //表示将 job 队列,编号为 4 的 job 删除.

atq:
2 Thu Feb 24 09:53:00 2022 a root
1 Fri Feb 25 17:00:00 2022 a root
第一列就是编号


注意:也可以执行脚本
比如:
at now +2 minutes
/root/my.sh
但要有这个脚本,并且有执行权限x

Linux 实操篇-Linux 磁盘分区、挂载

12.1. Linux 分区

12.1.1.原理介绍

1
2
3
4
5
6
7
8
9
10
11
12
(1) Linux 无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 
Linux 中每个分区都是用来组成整个文件系统的一部分。

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

(3)图解:
硬盘上的一个分区 通过挂载mount机制 与文件系统中的某个目录联系起来
即分区挂载到目录
访问这个目录即访问这个分区
可以通过指令查看挂载情况,下面会说。
1234567891011

在这里插入图片描述

12.1.2.硬盘说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(1)	Linux 硬盘主要分为:
IDE 硬盘和 SCSI 硬盘
目前基本上是 SCSI 硬盘

(2) 对于 IDE 硬盘,驱动器标识符为“hdx~”
其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘

“x”为盘号
a 为基本盘 第一个硬盘
b 为基本从属盘 第二个硬盘
c 为辅助主盘 第三个硬盘
d 为辅助从属盘 第四个硬盘

“~”代表分区
前四个分区用数字 14 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区

例:hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区
hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区

(3) 对于 SCSI 硬盘则标识为“sdx~”
SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样
123456789101112131415161718192021

12.1.3.查看所有设备挂载情况

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
31
命令 :lsblk	或者 lsblk -f

lsblk:list block devices

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sr0 11:0 1 4.3G 0 rom

sda1分区挂载到/boot目录
sda2分区挂载到swap目录
sda3分区挂载到根目录



lsblk -f (更加详细的显示)

NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 bd7b7249-b3fa-434f-acfd-5127a56c0673 /boot
├─sda2 swap 4381675a-652c-4ffa-9a9d-cb23d19be79b [SWAP]
└─sda3 ext4 531c2867-a7e9-4ae7-8f79-4453ceb76c5b /
sr0 iso9660 CentOS 7 x86_64 2018-11-25-23-54-16-00

第一列可以看到设备/硬盘分区情况
FSTYPE:文件系统类型
UUID:格式化之后,会给每一个分区分配一个 唯一的 不重复的 40位 的 字符串
MOUNTPOINT:挂载点
123456789101112131415161718192021222324252627282930

12.2.挂载的经典案例

12.2.1.说明

1
2
下面我们以增加一块硬盘为例来熟悉一下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念。
1

12.2.2.如何增加一块硬盘

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

12.2.3.虚拟机增加硬盘步骤 1-虚拟机添加硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在【虚拟机】菜单中选择【设置】
然后设备列表里添加硬盘
然后一路【下一步】
中间只有选择磁盘大小的地方需要修改,至到完成

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

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 1G 0 disk
sr0 11:0 1 4.3G 0 rom
新增硬盘sdb,还未分区。
12345678910111213141516

12.2.4 虚拟机增加硬盘步骤 2-分区

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
对sdb进行分区:

分区命令:fdisk /dev/sdb (dev目录下是一些设备)
步骤:
开始分区后输入 n (新增分区)
然后选择 p (分区类型为主分区)
两次回车
最后输入 w (写入分区并退出)(若不保存并退出输入 q,即上面步骤出错了想重来就可以输入q)

说明:
m 显示命令列表
p 显示磁盘分区 (同 fdisk –l)
n 新增分区
d 删除分区
w 写入并退出


命令(输入 m 获取帮助):m
命令操作
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)


选择分区类型:主分区/扩展分区
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p


分区号 (1-4,默认 1): --->输入2,硬盘就有2个分区
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
将使用默认值 2097151
分区 1 已设置为 Linux 类型,大小设为 1023 MiB


命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。


lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part
sr0 11:0 1 4.3G 0 rom
分区成功
硬盘sdb中只有一个分区sdb1
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273

12.2.5 虚拟机增加硬盘步骤 3-格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
格式化磁盘

为什么要格式化?
给这个分区指定它的文件类型

[root@Edu01 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 bd7b7249-b3fa-434f-acfd-5127a56c0673 /boot
├─sda2 swap 4381675a-652c-4ffa-9a9d-cb23d19be79b [SWAP]
└─sda3 ext4 531c2867-a7e9-4ae7-8f79-4453ceb76c5b /
sdb
└─sdb1
sr0 iso9660 CentOS 7 x86_64 2018-11-25-23-54-16-00

sdb1的UUID为空,说明还没有格式化。

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

12.2.6.虚拟机增加硬盘步骤 4-挂载

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
挂载: 将一个分区与一个目录联系起来,
命令:mount 设备名称 挂载目录

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

NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 bd7b7249-b3fa-434f-acfd-5127a56c0673 /boot
├─sda2 swap 4381675a-652c-4ffa-9a9d-cb23d19be79b [SWAP]
└─sda3 ext4 531c2867-a7e9-4ae7-8f79-4453ceb76c5b /
sdb
└─sdb1 ext4 d1856552-dee4-4fbc-9953-f650231ecaac /newdisk
sr0 iso9660 CentOS 7 x86_64 2018-11-25-23-54-16-00
挂载点有了,挂载成功。


卸载(去除分区与目录的联系):
命令:umount 设备名称 或者 挂载目录
例如:umount /dev/sdb1 或者 umount /newdisk


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

12.2.7.虚拟机增加硬盘步骤 5-设置可以自动挂载

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
31
32
解决  用命令行挂载,重启后会失效 问题

永久挂载:
通过修改/etc/fstab 实现挂载
添加完成后 执行 mount –a 即刻生效 或者 重启系统reboot

步骤:
vim /etc/fstab
增加一行:UUID=上面sdb1的UUID /newdisk ext4 defaults 0 0
也可以是:/dev/sdb1 /newdisk ext4 defaults 0 0




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

要挂载的设备或伪文件系统:
设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)

挂载点:指定的文件夹

挂载选项:defaults

转储频率:
0:不做备份
1:每天转储
2:每隔一天转储

自检次序:
0:不自检
1:首先自检;一般只有rootfs才用1

12.3.磁盘情况查询

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

1
2
3
4
5
基本语法:
df -h (disk free)

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
基本语法:
du -h 指定目录 (disk usage)
功能:查询指定目录的磁盘占用情况,默认为当前目录
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 子目录深度
-c 列出明细的同时,增加汇总值

应用实例
查询 /opt 目录的磁盘占用情况,深度为 1
du -hac --max-depth=1 /opt
123456789101112

12.4.磁盘情况-工作实用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1. 统计/opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l

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

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

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

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

5. 以树状显示目录结构
指令:tree 目录
默认情况下没有tree指令
如果没有 tree ,则使用 yum install tree 指令安装

Linux 实操篇-网络配置

13.1. Linux 网络配置原理图

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.通过ifconfig指令查看Linux虚拟机的ip地址
192.168.2.131
2.然后在本机DOS命令窗口输入指令ipconfig,查看vmnet8的ip地址
192.168.2.1
上两个在同一网段,所以可以通信。

3.由第二步骤可以得到本机的无线网络适配器(无线网卡)的ip地址
192.168.101.8

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

每次开机linux虚拟机的ip地址不一定相同
linux虚拟机的ip地址可以设置

以下:如何编辑虚拟机的网络和修改其ip地址?
12345678910111213141516

13.2.查看网络IP和网关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vmware--->编辑--->虚拟网络编辑器
这样就可以查看和修改虚拟网络vmnet8的ip地址和网关

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

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



ping命令 测试主机之间网络连通性
基本语法:
ping 目的主机 (功能描述:测试当前服务器是否可以连接目的主机)

应用实例
测试当前服务器是否可以连接百度
ping www.baidu.com
123456789101112131415161718

13.3. linux 网络环境配置

13.3.1.第一种方法(自动获取ip):

1
2
3
4
5
6
7
登陆后,通过界面设置自动获取ip
应用程序--->系统工--->设置--->网络--->小齿轮--->IPV4
特点:linux 启动后会自动获取 IP,可以避免ip冲突
缺点:每次自动获取的 ip 地址可能不一样,但是作为服务器ip地址不能变。

工作时,一般将Linux的ip地址手动设定,不改变。
123456

13.3.2.第二种方法(手动设置ip)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
手动指定linux的ip地址,使其不变化。

直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
关于网络的配置文件在:/etc/sysconfig/network-scripts/ifcfg-ens33

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

输入指令:vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改文件内容:
BOOTPROTO="static"
加上:
IPADDR=192.168.200.130 (IP地址,自己设定的)
GATEWAY=192.168.200.2 (网关,自己设定的)
DNS1=192.168.200.2 (域名解析器,自己设定的)

下一步:vmnet8和Linux在同一网段上,要能够通信,也要修改相应的vmnet8
vmware--->编辑--->虚拟网络编辑器
打开虚拟编辑器,点击vmnet8,修改下面的子网ip为:192.168.200.0
然后点击NAT设置,将网关改为192.168.200.2

应用确定

输入指令:service network restart 或 reboot 使上述修改生效
1234567891011121314151617181920212223

13.4.设置Linux系统的主机名和 hosts 映射

13.4.1.设置主机名

1
2
3
4
5
6
7
8
9
10
11
12
Linux系统的主机名相当于其ip地址,起一个主机名是因为ip地址不好记忆,不方便。
也可以修改主机名。

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

主机名放在/etc/hostname文件中,要修改主机名即修改文件内容:
输入指令:
vim /etc/hostname
修改内容
:wq
重启系统
1234567891011

13.4.2.设置 hosts 映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在Windows中,如何通过 主机名 找到(比如 ping) 某个 linux 系统?

修改ip地址与主机名的映射关系:
在windows C:\Windows\System32\drivers\etc\hosts 文件中
指定Linux系统的ip地址与主机名的映射关系
格式:linux系统ip地址 linux系统主机名
如指定为: 192.168.200.130 hspedu100 (这行代码添加到文件中就行了)

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


那么,如果也想在Linux系统中,使用主机名 来 ping 某个Windows系统,怎么做?
在 linux 系统的 /etc/hosts 文件中 指定
如指定为: 192.168.200.1 ThinkPad-PC
这样就可以 ping ThinkPad-PC
123456789101112131415

13.5.主机名解析过程分析(hosts、DNS)

13.5.1. hosts

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

13.5.2. DNS

1
2
3
4
5
6
DNS  Domain Name System 域名系统
是互联网上作为域名和 IP 地址相互映射的一个分布式数据库

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

13.5.3.应用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用户在浏览器输入了www.baidu.com

1.浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,有就先调用这个 IP 完成解析;
如果没有,就检查 DNS 解析器缓存,如果有直接返回 IP 完成解析。
这两个缓存,可以理解为 本地解析器缓存

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

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

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

示意图:
123456789101112131415161718

在这里插入图片描述

linux中的进程(ps与kill指令)

1. ps命令详解

作用:查看系统进程,比如正在运行的进程有哪些,什么时候开始运行的,哪个用户运行的,占用了多少资源。

参数:

  • -e 显示所有进程
  • -f 显示所有字段(UID,PPIP,C,STIME字段)
  • -a 显示一个终端的所有进程
  • -u 显示当前用户进程和内存使用情况
  • -x 显示没有控制终端的进程
  • –sort 按照列名排序

一、常用操作

ps命令常用的方式有三种:

  • ps -ef:查看所有进程
  • ps -aux:查看所有进程
  • ps -ef | grep tomcat:查看指定进程

1、查看所有进程(连带命令行)

1
2
ps -ef
1

在这里插入图片描述

字段解释:

  • UID:用户ID,即进程的拥有者
  • PID:进程ID
  • PPID:父进程ID
  • C:进程占用的CPU百分比
  • STIME:进程开始启动时间
  • TTY:登入者的终端机位置
  • TIME:进程使用的CPU(运算)时间
  • CMD:调用进程的命令

2、显示所有包含其他使用者的进程

1
2
ps -aux
1

在这里插入图片描述

字段解释:

  • USER:创建进程的用户
  • PID:进程ID
  • %CPU:进程占用CPU的百分比
  • %MEM:进程占用物理内存的百分比
  • VSZ:进程占用虚拟内存的大小(单位KB)
  • RSS:进程占用实际物理内存的大小(单位KB)
  • TTY:进程在哪个终端运行。
  • STAT:进程状态
  • START:进程开始启动的时间
  • TIME:进程使用的CPU(运算)时间
  • COMMAND:调用进程的命令

3、查看指定进程(grep过滤)

ps -ef 通常会配合 grep 来过滤指定的进程,比如

搜索 mysql 的进程:ps -ef | grep mysql

在这里插入图片描述

搜索 tomcat 的进程:ps -ef | grep tomcat

在这里插入图片描述

4、查看CPU/内存占用率最高的进程

1)查看进程的时候,让进程按照CPU使用率排序,然后展示前10行,就能清晰地看到哪些进程占用的资源比较多。

PS1:head -11 是因为标题也算一行
PS2+-号可以调整排序,-pcpu 表示降序,+pcpu 表示升序

1
2
ps -aux --sort=-pcpu | head -11
1

在这里插入图片描述

2)同理,把 -pcpu 换成 -pmem,就能查看内存使用最多的10个进程。

1
2
ps -aux --sort=-pmem | head -11
1

在这里插入图片描述

3)如果不限制行数,也可以使用 sort 按照指定的列排序

降序:

1
2
ps -aux | sort -nk 4 -r
1

升序:

1
2
ps -aux | sort -nk 4
1

在这里插入图片描述

5、查看指定用户的进程

查看某个用户开启了哪些进程,可以使用 -u 参数指定用户名,比如,查看root用户的进程有哪些:

1
2
ps -u root -ef
1

在这里插入图片描述

6、分页查看进程

除了 grep 外,还可以配合 more 分页查看进程:ps -ef | more

在这里插入图片描述
翻页的操作同 more 命令,q键退出,空格键翻页

二、拓展

1、TTY字段(终端类型)

TTY字段表示运行进程的终端是哪个,这里的终端类型有两种:tty和pts。

  • tty:表示物理终端,其中tty1~6是本地字符界面终端,tty7是本地图形终端
  • pts:表示虚拟终端,通常指远程连接的终端,范围是pts/0~255,比如第一个远程连接的终端是pts/0,第二个远程连接的终端是pts/1,依次类推。

2、STAT字段(进程状态)

STAT字段表示进程的状态,常见的状态有以下几种:

  • D:睡眠状态(不可被唤醒),常用于I/O情况。
  • R:进程正在运行
  • S:睡眠状态(可被唤醒)
  • T:停止状态
  • W:内存交互状态
  • Z:僵尸进程(不存在但暂时无法消除)
  • <:高优先级
  • N:低优先级
  • L:被锁入内存
  • s:包含子进程
  • l:多线程
  • +:位于后台

3、僵尸进程

进程由于非正常停止或程序编写错误,导致子进程比父进程先结束,而父进程又没有正常回收子进程,使子进程一直在内存中,导致资源浪费。这种情况就是僵尸进程。

PS:正常情况下应该是父进程先结束,然后子进程由init接管,init 结束子进程并回收对应的资源。

2.kill 和 killall指令:终止进程

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
1.介绍:
若是某个进程执行一半需要停止时,或是已经消耗了很大的系统资源时,此时可以考虑停止该进程。
使用 kill 命令来完成此项任务。

2.基本语法:
kill [选项] 进程号 (功能描述:通过进程号杀死/终止进程)
killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
使用killall,会将该进程的所有子进程也都删除/终止。


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




4.案例:
案例 1:踢掉某个非法登录用户
kill 进程号
比如 kill 11421

假如使用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 (文本编辑器)
在Linux桌面,主文件夹中,打开多个文本,然后使用killall 可以同时关闭所有打开的文本
killall gedit



案例 4:强制杀掉一个终端
在Linux系统桌面打开两个终端,bash即代表终端进程
在一个终端中输入指令强制关闭另一个终端
首先:查看终端进程的进程号:ps -aux | grep bash
得到对应的进程号,输入:kill -9 对应的进程号

也可以终端自己终止自己

3.查看进程树 pstree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.基本语法:pstree [选项] 
功能:可以更加直观的来看进程信息(树的形式)

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


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

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

4.服务(service)管理

14.5.1.介绍

1
2
3
4
5
服务(service) 本质就是进程,但是是运行在后台的,
通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd防火墙等),
因此我们又称为守护进程,是 Linux 中非常重要的知识点。
xshell为22端口
123

14.5.2. service 管理指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(1)	service	服务名 [start | stop | restart | reload | status]
start 开启服务
stop 终止服务
restart 重启服务
reload 重载服务
status 查看服务的状态

(2) 在 CentOS7.0 后很多服务不再使用 service指令管理,而是使用 systemctl (后面专门讲)

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


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

14.5.3.查看服务名方式

1
2
3
4
5
6
7
8
方式 1:直接输入 setup 即可看到所有服务
其中前面带 * 的服务会随着Linux系统的启动而自动启动。
选中按enter 确定按空格
退出时按tab!!!!

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

image-20230607204452177

服务的运行级别(runlevel)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Linux 系统有 7 种运行级别(runlevel):常用的是级别 35

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

授课时使用5,工作时大多使用3

开机的流程说明:
12345678910111213

在这里插入图片描述

CentOS7 后运行级别说明

1
2
3
4
5
6
7
8
9
10
11
在 /etc/initab 
进行了简化,如下:
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5

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

更改运行级别:systemctl set-default multi-user.target/graphical.target
然后重启 reboot
12345678910

chkconfig 指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
通过 chkconfig 命令可以给服务在 各个运行级别(上面讲的) 设置开启自启动/关闭自启动

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

注意: Centos7.0 后,很多服务使用 systemctl 管理 (后面马上讲)



chkconfig 基本语法:
(1)查看服务和服务在各个级别是开启/关闭自启动 (有限,只能查看chkconfig管理下的服务)
chkconfig --list [| grep xxx] (若查找某一个服务使用grep过滤)

(2)chkconfig 服务名 --list

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



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

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

systemctl 管理指令

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

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

systemctl 设置服务的自启动状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
systemctl list-unit-files [ | grep 服务名] (查看服务开机启动状态, grep 可以进行过滤) 
systemctl enable 服务名 (设置服务开机自启动)
systemctl disable 服务名 (关闭服务开机自启动)
systemctl is-enabled 服务名 (查询某个服务是否是自启动的)

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

应用案例:
查看当前防火墙的状况,关闭防火墙和重启防火墙 firewalld.service
查看当前防火墙情况:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
重启防火墙:systemctl start firewalld
.service写不写都行


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

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

firewall 指令:打开或者关闭指定端口

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

在这里插入图片描述

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
31
32
33
34
(1)	打开端口: firewall-cmd --permanent --add-port=端口号/协议

通过 netstat -anp | more 指令查看端口号的协议 (more 分页显示)
该指令输出的信息中:
Local Address下是 ip地址:端口号
Proto 是协议 (protocol 协议)

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

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

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



应用案例:
(1) 启用防火墙,测试 111 端口是否能 telnet (远程登录) 不行
在本地主机DOS命令窗口输入:telnet Linux虚拟机ip地址:端口号
测试本地主机能否访问虚拟机的111端口
telnet 192.168.200.130 111

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

(2) 开放 111 端口
firewall-cmd --permanent --add-port=111/tcp ;
需要 firewall-cmd --reload

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

(3) 再次关闭 111 端口
firewall-cmd --permanent --remove-port=111/tcp
需要 firewall-cmd --reload

5. top指令:动态监控进程

14.6.1.介绍

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

14.6.2.基本语法

1
2
3
4
top [选项]

选项说明:

在这里插入图片描述

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
31
32
33
输入top指令后:每一条都是一个进程
显示:
第一行
第一个时间 当前时间
第二个时间 系统运行时间
2 users 有几个用户
load average 负载值(三个值相加除以3>0.7 说明系统负载过大,要提高性能)
第二行
Tasks 系统任务数
1 running 1个正在运行进程
184 sleeping 184个休眠进程
0 stopped 0个终止进程
0 zombie 0个僵死进程 (要清除僵死进程,因为僵死进程无用且占内存空间)
第三行 占用的CPU百分比
us 用户占用的CPU
sy 系统占用的CPU
id 空闲
第四行 Mem 内存占用情况
total 总共内存
free 空闲内存
user 已使用内存
第五行 Swap 分区
total 总共大小
free 未使用大小
used 已用大小
avail Mem 可获取的内存大小

CPU状态信息分别为:
us用户占用百分比、
sy内核占用比、
ni:优先级调用、
id:空闲CPU百分比、
wa:I/O(输入/输出)等待占用比

image-20230607212855106

14.6.3.交互操作说明

1
2
3
输入命令top
然后输入以下命令,得以下功能对进程进行排序,注意是大写!!!
12

在这里插入图片描述

14.6.4.应用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
案例 1:监视特定用户, 比如监控 tom 用户
输入top
回车
输入u
回车
输入要监控用户名 (该用户要登录才能看到他的进程信息)


案例 2:终止指定的进程, 比如我们要结束 tom 登录
输入top
回车
输入k
回车
输入要结束的进程 ID 号 (bash那个进程的PID)
回车
输入信号量 9 强制删除
tom掉线

案例 3:指定系统状态更新的时间(每隔 10 秒自动更新),默认是 3
top -d 10

6. netstat指令:监控网络状态

14.7.1.查看系统网络情况netstat

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
基本语法:
netstat [选项]

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

输入netstat -an | more (more 分页展示)
显示:
Proto 协议
Recv-Q 接收信息队列
Send-Q 发送信息队列
Local Address 本地地址 Linux地址
Foreign Address 外部地址
State LISTEN 监听 ESTABLISHED 已建立连接 TIME_WAIT 超时等待

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


Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 36 192.168.200.130:22 192.168.200.1:14498 ESTABLISHED
要建立连接双方都要有一个端口
22端口在Linux
14498端口在Windows
如下图:

在这里插入图片描述

image-20230607215917898

1
2
3
案例:查看服务名为 sshd 的服务的信息。
netstat -anp | grep sshd

14.7.2.检测主机连接命令ping

1
2
是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。
如: ping 对方的ip地址

Linux 实操篇- RPM 与 YUM

15.1. RPM

15.1.1.介绍

1
2
3
4
5
6
7
8
RPM 是 Red-Hat Package Manager(红帽软件包管理器)的缩写
这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,
包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。

是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。

类似于 windows 的 setup.exe
1234567

15.1.2. rpm 的简单查询指令

1
2
3
4
5
6
7
8
9
10
11
12
13
查询已安装的 rpm软件包 列表:
rpm –qa|grep xx
查询结果返回一个软件包的包名

举例:查看当前系统是否安装了 firefox
指令: rpm -qa | grep firefox
查询结果:firefox-60.2.2-1.el7.centos.x86_64
结果说明:
软件名:firefox
版本号:60.2.2-1
适用操作系统: el7.centos.x86_64 (表示 centos7.x64 位系统)
如果是 i686i386 表示 32 位系统,noarch 表示通用(32/64位系统都适用)
123456789101112

15.1.3. rpm 的其它查询指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rpm -qa 			(查询所安装的所有 rpm 软件包)

rpm -qa | more (分页显示more)

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
12345678910111213141516171819

15.1.4.删除 rpm 软件包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
基本语法:rpm -e RPM软件包的名称	//-e erase擦去
案例:删除 firefox 软件包
rpm -e firefox


注意:
(1)如果其它软件包依赖于您要删除的软件包,删除时则会产生错误信息。
如:
rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
foo软件包被 bar-1.0-1需要,删除foo对barr-1.0-1有影响

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

15.1.5.安装 rpm 软件包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
基本语法: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-60.2.2-1.el7.centos.x86_64.rpm

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

15.2. yum

15.2.1.介绍

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

使用 yum list|grep 软件名 向yum服务器查询有没有该软件
有的话,使用 yum install 软件名 下载安装该软件
123456

15.2.2. yum 的基本指令

1
2
3
4
5
6
7
8
9
10
11
查询 yum 服务器是否有 需要安装的软件:
yum list|grep 软件名

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

案例:请使用 yum 的方式来安装 firefox
rpm -e firefox
yum list | grep firefox
yum install firefox
12345678910

15.3.总结

1
2
rpm 是从本地安装包下载
yum 是从yum服务器下载安装软件

image-20230608173952020

大数据定制篇-Shell编程

17.1.为什么要学习Shell 编程

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

17.2. Shell 是什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

在计算机科学中,Shell俗称壳(用来区别于核)
是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。
它类似于DOS下的COMMAND.COM和后来的cmd.exe。
它接收用户命令,然后调用相应的应用程序。

中文名 壳
外文名 shell
性质 命令解析器
用途 接收用户命令

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。是用户使用 Linux 的桥梁.

用户写了一个指令,该指令不能直接发给Linux内核去执行,而是由shell帮我们去执行,执行完之后再通过shell返回给我们结果。
在Linux中不止一种shell,我们常用的是bash。
可以直接发一个指令给shell,也可以将指令写在一个文件/脚本(.sh shell脚本)里。
shell编程就是在shell脚本中写指令。
123456789101112131415161718

17.3. Shell 脚本

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
1.脚本格式要求:
脚本以 #!/bin/bash 开头 --->确定shell的类型
脚本需要有可执行权限
shell脚本文件以.sh结尾,也可以不以.sh结尾

2.编写第一个Shell 脚本
需求说明:创建一个 Shell 脚本,输出 hello world!
创建一个目录:mkdir /root/shcode
cd /root/shcode
vim hello.sh
写入:
#!/bin/bash
echo "hello,world!"

3.shell脚本的常用执行方式
方式 1
首先要给shell脚本加x执行权限:chomod u+x hello.sh
再输入该脚本的相对路径或绝对路径来执行该脚本
比如:
使用相对路径: ./hello.sh
使用绝对路径: /root/shcode/hello.sh

方式 2
不用赋予脚本+x 权限,直接执行即可。(使用以下指令,即使没有执行权限也可以执行)
使用指令: sh shell脚本/shell脚本的绝对路径
比如 sh hello.sh
1234567891011121314151617181920212223242526

17.4. Shell 的变量

17.4.1. Shell 变量介绍

1
2
3
4
5
6
7
8
(1)	Linux Shell 中的变量分为:系统变量和用户自定义变量。
系统变量:系统自带的变量

(2) 系统变量比如:$HOME$PWD$SHELL$USER 等等
echo $HOME --->显示当前用户的家目录

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

17.4.2. shell 自定义变量

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
基本语法:
(1) 定义变量:变量名=值 --->不加空格
(2) 撤销变量:unset 变量名
(3) 声明静态变量:readonly 变量 (改变量不能 unset撤销)


案例 1:定义变量 A
案例 2:撤销变量 A
案例 3:声明静态的变量 B=2,不能 unset

cd /root/shcode
vim vr.sh
输入:
#!/bin/bash

#案例 1:定义变量 A=100 (#为注释符)
A=100
#输出变量需要加上$ ($--->引用变量)
echo $A

#上述输出结果是100,想要输出结果为A=100,这样写(A=以普通文本形式输出,$A引用变量的值)
echo A=$A 或者 echo "A=$A"


#案例 2:撤销变量 A
unset A
echo "A=$A" (--->输出 A= )


#案例 3:声明静态的变量 B=2,不能 unset
readonly B=2
echo "B=$B"

保存:wq
最后输入执行命令:sh vr.sh

--------------------------------------------------------------------


shell 变量名的定义规则:
(1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
(2) 等号两侧不能有空格
(3) 变量名称一般习惯为大写,这是一个规范,我们遵守即可

--------------------------------------------------------------------
将命令的返回值赋给变量:
(1) A=`date`反引号,运行里面的命令,并把结果返回给变量 A
(2) A=$(date) 等价于反引号

案例:
#将指令返回的结果赋给变量
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"

#使用环境变量 TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

在这里插入图片描述****

17.5.设置环境变量(全局变量)

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
31
32
33
34
35
36
37
38
可以将变量提升为全局环境变量,供多个shell程序共同使用。

基本语法:
(1) export 变量名=变量值
(功能描述:将 shell 变量输出为环境变量/全局变量)

(2) source 配置文件
(功能描述:在某文件中定义环境变量之后,要对该文件进行刷新才能使其生效,即让修改后的配置信息立即生效)

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


快速入门:
(1) 在/etc/profile 文件中定义 TOMCAT_HOME 环境变量
TOMCAT_HOME --->意思是tomcat的家目录是什么
(2) 查看环境变量 TOMCAT_HOME 的值
vim /etc/profile
写入:export TOMCAT_HOME=/opt/tomcat
保存退出
source /etc/profile
echo $TOMCAT_HOME ---输出 /opt/tomcat


(3) 在另外一个 shell 程序中使用 TOMCAT_HOME
在另一个shell程序中写入:
echo "tomcat_home=$TOMCAT_HOME"


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


shell 脚本的
单行注释:#
多行注释: :<<! 独占一行
内容
! 独占一行
12345678910111213141516171819202122232425262728293031323334353637

17.6.位置参数变量

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
1.介绍
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如: ./myshell.sh 100 200 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息

./myshell.sh --->执行myshell脚本命令
100 200 都是该命令行的参数
使用位置参数变量可以在myshell脚本中获得参数


2.基本语法
$n (功能描述:n 为数字,$0 代表命令本身(如./myshell.sh),$1-$9 代表第一到第九个参数(如:$1 就是100 $2 就是200),十以上的参数需要用大括号包含,如${10}
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)

案例:编写一个 shell 脚本 myshell.sh ,在脚本中获取到命令行的各个参数信息。
vim myshell.sh
写入:
#!/bin/bash
echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数个数=$#"
保存退出
sh myshell.sh 100 200
12345678910111213141516171819202122232425

17.7.预定义变量

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
1.基本介绍:
预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用


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

3.应用实例:
在一个 shell 脚本中简单使用一下预定义变量

vim preVar.sh
写入:
#!/bin/bash
echo "当前执行的进程 id=$$"

#以后台的方式运行一个脚本(在脚本后加一个$),并获取他的进程号
/root/shcode/myshell.sh &

echo "最后一个后台方式运行的进程 id=$!"

echo "执行的结果是=$?"
保存并退出
sh preVar.sh
12345678910111213141516171819202122232425

image-20230608212540085

17.8.运算符

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
1.基本介绍:
学习如何在 shell 中进行各种运算操作。


2.基本语法:
(1) 三种写法:
$((运算式))
$[运算式]
expr m + n (expression 表达式)

(2) 注意 expr 运算符间要有空格
如果希望将 expr 的结果赋给某个变量,使用 `` 或者 $( )

(3) expr m - n

(4) expr \*, /, % 乘,除,取余


3.应用实例 oper.sh
案例 1:计算(2+3)X4 的值
案例 2:请求出命令行的两个参数[整数]的和 20 50

vim oper.sh
写入:
#!/bin/bash
#案例 1:计算(2+3)X4 的值
#使用第一种方式
RES1=$(((2+3)*4)) --->用一个变量RES1接收
echo "res1=$RES1"
保存并退出
sh oper.sh

vim oper.sh
写入:
#!/bin/bash
#使用第二种方式, 推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
保存并退出
sh oper.sh

vim oper.sh
写入:
#!/bin/bash
#使用第三种方式 expr
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
保存并退出
sh oper.sh

vim oper.sh
写入:
#!/bin/bash
#案例 2:请求出命令行的两个参数[整数]的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"
保存并退出
sh oper.sh 20 50
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

image-20230608214541259

17.9.条件判断

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
1.基本语法:
[ condition ] (注意 condition 前后要有空格)
#非空返回 true,可使用$?验证(0 为 true,>1 为 false)


2.应用实例:
[ hspEdu ] 返回 true
[ ] 返回 false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句


3.判断语句:
常用判断条件:
(1) = 字符串比较
(2) 两个整数的比较
-lt 小于 less than
-le 小于等于 less equal
-eq 等于 equal
-gt 大于 greater
-ge 大于等于 greater equal
-ne 不等于 not equal
(3) 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
(4) 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录


4.应用实例:
案例 1:"ok"是否等于"ok"
判断语句:使用 =
案例 2:23 是否大于等于 22
判断语句:使用 -ge
案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
判断语句: 使用 -f

代码如下:
vim ifdemo.sh
#!/bin/bash
#案例 1:"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
echo "equal"
fi -----> if语句 以if开头 以fi结尾

#案例 2:23 是否大于等于 22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
echo "大于"
fi

#案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
#判断语句: 使用 -f
if [ -f /root/shcode/aaa.txt ]
then
echo "文件存在"
fi

#看几个案例
if [ ]
then
echo "存在"
fi

if [ hspEdu01 ]
then
echo "hello hspEdu01"
fi
sh ifdemo.sh

输出结果:
equal
大于
hello hspEdu01
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

image-20230608222411117

17.10.流程控制

17.10.1. if 语句

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
31
32
33
34
35
36
37
1.基本语法:
if [ 条件判断式 ]
then
代码
fi

或者 多分支

if [ 条件判断式 ]
then
代码
elif [条件判断式]
then
代码
fi

2.注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格

3.应用实例 ifCase.sh
案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
else
echo "不及格"
fi

或者

if [ $1 -ge 60 ]
then
echo "及格了"
elif[ $1 -lt 60]
then
echo "不及格"
fi
123456789101112131415161718192021222324252627282930313233343536

17.10.2. case 语句

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
31
32
33
34
35
36
37
38
1.基本语法:

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…

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

应用实例 testCase.sh
案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",其它情况输出"other"
vim testCase.sh
写入:
#!/bin/bash
#案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",其它情况输出"other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
保存并退出

sh testCase.sh 1
周一
12345678910111213141516171819202122232425262728293031323334353637

17.10.3. for 循环

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
基本语法:

第一种方式:

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

应用实例 testFor1.sh
案例:打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
#!/bin/bash
#案例:打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
#注意:$* 是把输入的参数当作一个整体,所以只会输出一句话
for i in "$*"
do
echo "num is $*"
done

#使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句
echo "======================================"
for j in "$@"
do
echo "num is $@"
done

sh testFor1.sh 100 200 300
num is 100 200 300
======================================
num is 100 200 300
num is 100 200 300
num is 100 200 300





第二种方式:

for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done

应用实例 testFor2.sh
案例:从 1 加到 100 的值输出显示
#!/bin/bash
#案例:从 1 加到 100 的值输出显示
#定义一个变量SUM
SUM=0
for(( i=1; i<=100; i++ ))
do
SUM=$[$SUM+$i]
done
echo "总和SUM=$SUM"

sh testFor2.sh
总和SUM=5050

如果1加到x x由自己输入
SUM=0
for(( i=1; i<=$1; i++ ))
do
SUM=$[$SUM+$i]
done
echo "总和SUM=$SUM"

sh textFor2.sh 1000
总和SUM=500500
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

17.10.4. while 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
基本语法:
while [ 条件判断式 ]
do
程序/代码
done

注意:while 和 [有空格,条件判断式和[ ]也有空格

应用实例:testWhile.sh
案例:从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
#i 自增
i=$[$i+1]
done
echo "执行结果=$SUM"

sh testWhile.sh 100
执行结果=5050
1234567891011121314151617181920212223

17.11. read 读取控制台输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1.基本语法:
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数:
变量:指定读取值的变量名

2.应用实例 testRead.sh
案例 1:读取控制台输入一个 NUM1
案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。代码:

#!/bin/bash
#案例 1:读取控制台输入一个 NUM1
read -p "请输入一个数 NUM1=" NUM1
echo "你输入的 NUM1=$NUM1"

#案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
read -t 10 -p "请输入一个数 NUM2=" NUM2
echo "你输入的 NUM2=$NUM2"

sh testRead.sh
请输入一个数 NUM1=100
你输入的 NUM1=100

函数

17.12.1.函数介绍

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

17.12.2.系统函数

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
1.basename 基本语法
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]

功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
basename /home/aaa/test.txt
返回test.txt

如果输入:basename /home/aaa/test.txt .txt
返回test


2.dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

案例 1:请返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
返回/home/aaa
12345678910111213141516171819202122232425

17.12.3.自定义函数

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
31
32
33
基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}

调用直接写函数名:funname [值]


案例 1:计算输入两个参数的和(动态的获取) testFun.sh
#!/bin/bash
#案例 1:计算输入两个参数的和(动态的获取)

#定义函数 getSum
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}

#输入两个值
read -p "请输入一个数 n1=" n1
read -p "请输入一个数 n2=" n2

#调用自定义函数
getSum $n1 $n2


sh testFun.sh
请输入一个数 n1=10
请输入一个数 n2=90
和是=100
1234567891011121314151617181920212223242526272829303132

17.13. Shell 编程综合案例

1
2
3
4
5
6
7
1.需求分析:
(1) 每天凌晨 2:30 备份 数据库 hspedu 到 /data/backup/db
(2) 备份开始和备份结束能够给出相应的提示信息
(3) 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2021-03-12_230201.tar.gz
(4) 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
(5) 画一个思路分析图
123456

在这里插入图片描述

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2.代码 
切换到/usr/sbin/目录下(该目录为root用户执行权限,使用root执行)
vim mysql_db.backup.sh
写入:
#备份目录
BACKUP=/data/backup/db

#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME

#数据库的地址
HOST=localhost

#数据库用户名
DB_USER=root

#数据库密码
DB_PW=hspedu100

#备份的数据库名
DATABASE=hspedu

#创建备份目录, 如果不存在,就创建(这个应该可以用if语句写)
[ ! -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 天前的备份文件
#查找BACKUP目录下10天前的备份文件 备份文件名字为 *.tar.gz 如果有删除
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE} 成功~"

保存并退出

sh /user/sbin/mysql_db.backup.sh

{} --->应该可以不用写

定时:
crontab -e
30 2 * * * /user/sbin/mysql_db.backup.sh
保存并退出

Ubuntu

1.下载

Ubuntu系统下载官方链接:Ubuntu系统下载

在这里插入图片描述

VMware下载官方链接: VMware Workstation 16 Player下载

在这里插入图片描述

下完VMware直接安装就行了

2 VM安装Ubuntu

双击打开VMware Workstation 16 Player
双击打开
点击创建新虚拟机

在这里插入图片描述
选择稍后安装操作系统,再点下一步

在这里插入图片描述
然后注意这两个地方,选择操作系统和版本如下,再点下一步

在这里插入图片描述
自己定一个系统存储位置,再下一步

在这里插入图片描述
最大磁盘大小按需修改,选择存储为单个文件,再下一步

在这里插入图片描述
点击自定义硬件

在这里插入图片描述
选择使用ISO映像文件,浏览选中刚开始下载的Ubuntu系统,然后点右下角的关闭,再点完成

在这里插入图片描述
选中,点击播放虚拟机

在这里插入图片描述
然后等待…

在这里插入图片描述
进入之后,下拉选中 中文简体,再点Ubuntu安装

在这里插入图片描述
再双击chinese。这里因为Ubuntu系统显示器大小不对,下面的界面显示不出来,我们在下一步先来修改它的显示器大小

在这里插入图片描述
到这里后,本来右下箭头所指地方有 继续 按钮,但是显示不出来,我们先关掉安装界面,退出安装

在这里插入图片描述
在这里插入图片描述
等待…然后进入如下页面,点击右上角倒三角形,再点击设置

在这里插入图片描述
下拉找到显示器,点击分辨率

在这里插入图片描述
任意改为另一个,例如1024x768,再点击应用

在这里插入图片描述
选择保留更改

在这里插入图片描述
然后点击左上角图标,重新进入系统安装

在这里插入图片描述
可以看到这时能显示继续的按钮,点击继续

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
点击现在安装

在这里插入图片描述
再点击继续

在这里插入图片描述
选择地区
点中国所在范围在这里插入图片描述

自行填写以下信息

在这里插入图片描述
然后便进入安装等待界面

在这里插入图片描述
下载文件时间较长,可点击展开选择skip,然后再等待一段时间…

在这里插入图片描述
安装完成,提示重启,点击重启

在这里插入图片描述
然后根据提示,进入系统,显示如下界面,即安装完成。

在这里插入图片描述

3 更改Ubuntu软件源

配置系统的软件源,提高下载速度
先点左下角矩形网格,找到并打开 软件与更新

在这里插入图片描述
按图示修改

在这里插入图片描述
在这里插入图片描述
点击选择一个服务器,如第一个,再点选择服务器

在这里插入图片描述
再点关闭

在这里插入图片描述
点击重新载入,并等待

在这里插入图片描述
其中需输入密码,即之前自行设置的密码,此后有软件更新点击更新即可
到这里软件源更改完成。

4 Windows与Ubuntu跨系统复制粘贴

打开终端,手动输入以下命令,再重启ubuntu系统就可以了
即通过安装VMtools实现了Windows与Ubuntu跨系统复制粘贴,也实现了Ubuntu窗口自适应

1
2
3
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop

所有命令

命令 说明
apt-get update 更新源
apt-get upgrade 更新所有已安装的包
apt-get install 安装软件包多个软件包用空格隔开
apt-get install –reinstall 重新安装软件包
apt-get install -f 修复安装(破损的依赖关系)软件
apt-get remove 删除软件包(不包括配置文件)
apt-get purge 删除软件包(包括配置文件)
apt-get clean 清除缓存(/var/cache/apt/archives/{,partial}下) 中所有已下载的包
apt-cache stats 显示系统软件包的统计信息
apt-cache search 使用关键字pkg搜索软件包
apt-cache show 显示软件包pkg_name的详细信息
apt-cache depends 查看pkg所依赖的软件包
apt-cache rdepends 查看pkg被那些软件包所依赖
apt-get build-dep 构建pkg源码包的编译依赖 (这条命令很神奇,一步搞定所有编译依赖)

Ubuntu中的apt命令(相当于centos yum)

apt-get命令本身并不具有管理软件包功能,只是提供了一个软件包管理的命令行平台。在这个平台上使用更丰富的子命令,完成具体的管理任务。

apt-get命令的一般语法格式为:

1
apt-get subcommands [ -d | -f | -m | -q| --purge | --reinstall | -b | -s | -y | -u | -h | -v ] [pkg] 

apt-cache提供了搜索功能。

说明:下文命令中,尖括号中内容为用户视具体情况而定,如可替换为实际的软件包名 MySQL-server等。


  1. 更新或升级操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    apt-get update                  # 更新源  



    apt-get upgrade # 更新所有已安装的包



    apt-get dist-upgrade # 发行版升级(如,从10.10到11.04)
  2. 安装或重装类操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    apt-get install <pkg>             # 安装软件包<pkg>,多个软件包用空格隔开  



    apt-get install --reinstall <pkg> # 重新安装软件包<pkg>



    apt-get install -f <pkg> # 修复安装(破损的依赖关系)软件包<pkg>
  3. 卸载类操作:

    1
    2
    3
    4
    5
    apt-get remove <pkg>          # 删除软件包<pkg>(不包括配置文件)  



    apt-get purge <pkg> # 删除软件包<pkg>(包括配置文件)
  4. 下载清除类操作:

    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
    apt-get source <pkg>              # 下载pkg包的源代码到当前目录  



    apt-get download <pkg> # 下载pkg包的二进制包到当前目录



    apt-get source -d <pkg> # 下载完源码包后,编译



    apt-get build-dep <pkg> # 构建pkg源码包的依赖环境(编译环境?)



    apt-get clean # 清除缓存(/var/cache/apt/archives/{,partial}下)中所有已下载的包



    apt-get autoclean # 类似于clean,但清除的是缓存中过期的包(即已不能下载或者是无用的包)



    apt-get autoremove # 删除因安装软件自动安装的依赖,而现在不需要的依赖包
  5. 查询类操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    apt-cache stats             # 显示系统软件包的统计信息  



    apt-cache search <pkg> # 使用关键字pkg搜索软件包



    apt-cache show <pkg_name> # 显示软件包pkg_name的详细信息



    apt-cache depends <pkg> # 查看pkg所依赖的软件包



    apt-cache rdepends <pkg> # 查看pkg被那些软件包所依赖
  6. 关于软件安装目录的说明:

    一般的deb包(包括新立得或者apt-get下载的)都在**/usr/share**。 自己下载的压缩包或者编译的包,有些可以选择安装目录,一般放在/usr/local/,也有在/opt的。

  7. 关于apt-get的缓存目录:

    默认的缓存目录是**/var/cache/apt/archives/**, 为日后重装系统后安装软件节省下载时间或者将软件包给别人用,可以将该目录下的软件包压缩备份后清理以节省空间。

  • apt 安装

  • sudo apt search package #搜索包 
    
    
    
    sudo apt show package #获取包的相关信息,如说明、大小、版本等  
    
    
    
    sudo apt depends package #了解使用依赖  
    
    
    
    sudo apt rdepends package #查看该包被哪些包依赖  
    
    
    
    sudo apt-cache pkgnames  #执行pkgnames子命令列出当前所有可用的软件包 
    
    
    
    sudo apt policy package #使用policy命令显示软件包的安装状态和版本信息。
    
    
    
    sudo apt install package #安装包  
    
    
    
    sudo apt install package=version #安装指定版本的包  
    
    
    
    sudo apt install package --reinstall #重新安装包  
    
    
    
    sudo apt -f install #修复安装, "-f = --fix-missing"  
    
    
    
    sudo apt remove package #删除包
    
    
    
    sudo apt purge package  #删除包,包括删除配置文件等
    
    
    
    sudo apt autoremove #自动卸载所有未使用的软件包
    
    
    
    sudo apt source package #下载该包的源代码   
    
    
    
    sudo apt update #更新apt软件源信息  
    
    
    
    sudo apt upgrade #更新已安装的包
    
    
    
    sudo apt full-upgrade #在升级软件包时自动处理依赖关系  
    
    
    
    sudo apt dist-upgrade #升级系统  
    
    
    
    sudo apt dselect-upgrade #使用dselect升级  
    
    
    
    sudo apt build-dep package #安装相关的编译环境  
    
    
    
    sudo apt clean && sudo apt autoclean #清理无用的包
    
    
    
    sudo apt clean  #清理已下载的软件包,实际上是清楚/var/cache/apt/archives目录中的软件包
    
    
    
    sudo apt autoclean  #删除已经卸载的软件包备份  
    
    
    
    sudo apt-get check #检查是否有损坏的依赖 
    
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41



    ```sql
    sudo aptitude update 更新可用的包列表



    sudo aptitude upgrade 升级可用的包



    sudo aptitude dist-upgrade 将系统升级到新的发行版



    sudo aptitude install pkgname 安装包



    sudo aptitude remove pkgname 删除包



    sudo aptitude purge pkgname 删除包及其配置文件



    sudo aptitude search string 搜索包



    sudo aptitude show pkgname 显示包的详细信息



    sudo aptitude clean 删除下载的包文件



    sudo aptitude autoclean 仅删除过期的包文件
    ## 使用Deb包安装
  • sudo dpkg -i <package.deb>    #安装包
    
    
    
    sudo dpkg -r <package.deb>   #删除包
    
    
    
    sudo dpkg -p <package.deb>   #彻底删除包(包括配置文件)
    
    
    
    dpkg -l                       #列出当前已安装的包
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    ![image-20230610214734592](https://raw.githubusercontent.com/godwad/2023/main/2023image-20230610214734592.png)

    可更换下载源,具体可参照[Ubuntu更换国内源(apt更换源)_ubuntu换源_墨痕诉清风的博客-CSDN博客](https://blog.csdn.net/u012206617/article/details/122321849?ops_request_misc=%7B%22request%5Fid%22%3A%22168640487816800192226268%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168640487816800192226268&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-122321849-null-null.142^v88^insert_down38v5,239^v2^insert_chatgpt&utm_term=ubuntu更换国内源&spm=1018.2226.3001.4187)

    # Ubuntu远程登录

    ## 1.ssh介绍

    SSH为 Secure Shell (安全外壳协议)的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。

    SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录。几乎所有 UNIX/LInux 平台都可运行 SSH。

    使用 SSH服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A 机器想被 B 机器远程控制,那么,**A机器需要安装 SSH服务器,B 机器需要安装 SSH客户端**。

    和 CentOS 不一样,Ubuntu 默认没有安装 SSHD服务(**使用 netstat -anp | more 指令查看: apt install net-tools**),因此,我们不能进行远程登录。

    ## 2.安装SSH和启用

    ```bash
    sudo apt-get install openssh-server
    1

执行上面指令后,在当前这台 Linux 上就安装了 SSH服务端和客户端。

1
2
service sshd restart
1

执行上面的指令,就启动了 sshd 服务。会监听端口 22

3.远程登录

image-20230610220628568

1.使用ssh远程工具(xshell)登录 Ubuntu

查看 ip 地址: ifconfig
在这里插入图片描述
注意:使用普通用户登录,需要的时候再 su 切换成 root 用户
在这里插入图片描述

2.用另一台机器远程登录Ubuntu

在Windows端打开CMDGit Bash 命令窗口,或者在另一台centos或Ubuntu机器系统(该机器也要安装ssh服务器)控制终端输入“ssh 用户名@目标主机IP”,即可控制该机器

退出用exit 或 logout

image-20230610220710400

Linux 高级篇-日志管理

21.1.基本介绍

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

21.2.系统常用的日志

1
2
3
4
5
6
7
系统日志文件的保存位置:/var/log/ 目录下

应用案例:
使用 root 用户通过 xshell6 登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure 里有没有记录相关信息

系统常用日志:
123456

在这里插入图片描述

21.3.日志管理服务 rsyslogd

1
2
3
4
5
6
7
8
9
10
11
12
CentOS7.6 日志服务是 rsyslogd   (rocket-fast system for log)
CentOS6.x 日志服务是 syslogd
rsyslogd 功能更强大
rsyslogd 的使用、日志文件的格式,和 syslogd 服务是兼容的

rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。
将日志记录到对应的文件中。

/etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。

原理示意图:
1234567891011

在这里插入图片描述

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
1.在进行日志管理时,要保证rsyslogd服务是启动的!

(1)查询 Linux 中的 rsyslogd 服务是否启动
ps aux | grep "rsyslog"

ps aux | grep "rsyslog" | grep -v "grep"
| grep -v "grep" ---> 筛选出ps aux | grep "rsyslog" 结果中不是grep的

(2)查询 rsyslogd 服务的自启动状态(是否是自启动状态enable)
systemctl list-unit-files | grep rsyslog


2.配置文件:/etc/rsyslog.conf
该配置文件中记录了:日志和日志存放在哪个文件

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

(1)日志类型分为:
auth ##pam 产生的日志
authpriv ##ssh、ftp 等登录信息的验证信息
corn ##时间任务相关
kern ##内核
lpr ##打印
mail ##邮件
mark(syslog)-rsyslog ##服务内部的信息,时间标识
news ##新闻组
user ##用户程序产生的相关信息
uucp ##unix to nuix copy主机之间相关的通信
local 1-7 ##自定义的日志设备

(2)日志级别分为:
debug ##有调试信息的,日志通信最多
info ##一般信息日志,最常用
notice ##最具有重要性的普通条件的信息
warning ##警告级别
err ##错误级别,阻止某个功能或者模块不能正常工作的信息
crit ##严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert ##需要立刻修改的信息
emerg ##内核崩溃等重要信息
none ##什么都不记录
注意:从上到下,级别从低到高,记录信息越来越少


3.由日志服务 rsyslogd 记录的日志文件,
日志文件的内容:每一行都代表一个事件,每一行有以下四个内容:
1) 事件产生的时间
2) 产生事件的服务器的主机名
3) 产生事件的服务名或程序名
4) 事件的具体信息


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

5.日志管理服务应用实例(增加自定义的日志)
在/etc/rsyslog.conf 中添加一个日志文件/var/log/hsp.log,当有事件发送时(比如 sshd 服务相关事件),该文件会接收到信息并保存.
给小伙伴演示 重启,登录 的情况,看看是否有日志保存

vim /etc/rsyslog.conf
写入:
*.* /var/log/hsp.log
保存退出
> /var/log/hsp.log (创建日志文件)
然后重启,重启事件会被记录到/var/log/hsp.log中
cat hsp.log | grep sshd 就可以查到信息(sshd远程连接)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

image-20230610230234354

21.4.日志轮替

21.4.1.基本介绍

1
2
3
日志轮替(logrotate)就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除
清除日志中旧的信息
12

21.4.2.日志轮替文件命名

1
2
3
4
5
6
7
8
9
10
(1)	centos7 使用 logrotate 进行日志轮替管理
要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数

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

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

21.4.3. logrotate 配置文件

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/etc/logrotate.conf 为 logrotate 的全局配置文件(写了日志文件轮替规则)

/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)
可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则
也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用

/etc/logrotate.conf文件内容:
# 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
include /etc/logrotate.d--->可以把一些单独的轮替规则写在/etc/logrotate.d下(在本文件中include调用一下就行),也可以写在本文件中(如下面写的)

#下面是单独设置,优先级更高。
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly # 每月对日志文件进行一次轮替
create 0664 root utmp # 建立的新日志文件,权限是 0664 ,所有者是 root ,所属组是 utmp 组
minsize 1M # 日志文件最小轮替大小是 1MB 。也就是日志一定要超过 1MB 才会轮替,否则就算时间达到一个月,也不进行日志转储
rotate 1 # 仅保留一个日志备份。也就是只有 wtmp 和 wtmp.1 日志保留而已
}

/var/log/btmp {
missingok # 如果日志不存在,则忽略该日志的警告信息
monthly
create 0600 root utmp rotate 1
}




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

image-20230611135133585

也可以写在/etc/logrotate.d目录下

image-20230611135313506

21.4.4.把自己的日志加入日志轮替

1
2
3
4
5
6
7
1)	第一种方法:
直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
2) 第二种方法:
/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。

3) 推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写 入/etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。
123456

21.4.5.应用实例

1
2
3
案例:在/etc/logrotate.conf 进行配置, 或者直接在 /etc/logrotate.d/ 下创建文件 hsplog  
编写如下内容, 具体轮替的效果 可以参考 /var/log 下的 boot.log 情况.
12

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/etc/logrotate.d/ 下创建文件 hsplog  
vim hsplog
写入:
/var/log/hsp.log
{
missingok
daily
copytruncate
rotate 1
notifempty
}
保存退出

这样就好了,因为/etc/logrotate.conf 中有:include /etc/logrotate.d
1234567891011121314

21.5.日志轮替机制原理

1
2
3
4
5
6
7
8
9
10
11
12
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。
/etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),
logrotate 通过这个文件依赖定时任务执行的。

crond定时后台程序会定时执行cron.daily内的文件
logrotate 文件在cron.daily下
所以也会定时执行文件中的轮替规则


写日志是rsyslogd
日志轮替是logrotate
1234567891011

image-20230611141413007

image-20230611141445295

21.6.查看内存日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
有一些日志是写到内存里的,还没有写到文件里,因为这些日志是实时变化的
重启之后内存日志会被清空

查看内存日志指令: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 来看看用户登录清空, 重启系统,再次查询,看看日志有什么变化没有

image-20230611141914561

Linux 高级篇-定制自己的 Linux 系统

22.1.基本介绍

1
2
通过裁剪现有 Linux 系统(CentOS7.6),创建属于自己的 min Linux 小系统
1

22.2.基本原理

1
2
3
4
5
6
7
8
9
10
11
12
13
启动流程介绍:
制作 Linux 小系统之前,再了解一下 Linux 的启动流程:
1、首先 Linux 要通过自检,检查硬件设备有没有故障
2、如果有多块启动盘的话,需要在 BIOS 中选择启动磁盘
3、启动 MBR 中的 bootloader 引导程序
4、加载内核文件
5、执行所有进程的父进程、老祖宗 systemd
6、欢迎界面

在 Linux 的启动流程中,加载内核文件时关键文件:
1)kernel 文件: vmlinuz-3.10.0-957.el7.x86_64
2)initrd 文件: initramfs-3.10.0-957.el7.x86_64.img
123456789101112

22.3.制作 min linux 思路分析

1
2
3
4
5
6
7
8
9
10
11
12
1.在现有的 Linux 系统(centos7.6)上加一块硬盘/dev/sdb
在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。
需要明确的是,现在加的这个硬盘在现有的 Linux 系统中是/dev/sdb,但是,当我们把东西全部设置好时,要把这个硬盘拔除,放在新系统上,此时,就是/dev/sda

2.在/dev/sdb 硬盘上,将其打造成独立的 Linux 系统,里面的所有文件是需要拷贝进去的

3.作为能独立运行的 Linux 系统,内核是一定不能少,要把内核kernel 文件和 initramfs 文件也一起拷到/dev/sdb 上

4.以上步骤完成,我们的自制 Linux 就完成,创建一个新的 linux 虚拟机,将其硬盘指向我们创建的硬盘,启动即可

5.示意图
1234567891011

image-20230611143340045

22.4.操作步骤

  1. 首先,我们在现有的linux添加一块大小为20G的硬盘

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Edgyugcy-1659016464933)(../../../Pictures/Linux/wps1-16590160625644.jpg)]

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pIG9BUdl-1659016464933)(../../../Pictures/Linux/wps3-16590160625632.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mxrDRrX4-1659016464933)(../../../Pictures/Linux/wps4-16590160625643.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmvNxczU-1659016464934)(../../../Pictures/Linux/wps5-16590160625645.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37wWXZmh-1659016464934)(../../../Pictures/Linux/wps6.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAfeKdgK-1659016464934)(../../../Pictures/Linux/wps7.jpg)]

点击完成,就OK了, 可以使用 lsblk 查看,需要重启

  1. 添加完成后,点击确定,然后启动现有的linux(centos7.6)。 通过fdisk来给我们的/dev/sdb进行分区
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
1 [root@localhost ~]# fdisk /dev/sdb
2 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
3 Building a new DOS disklabel with disk identifier 0x4fde4cd0.
4 Changes will remain in memory only, until you decide to write them.
5 After that, of course, the previous content won't be recoverable.
6
7
8 Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
9
10
11 WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
12 switch off the mode (command 'c') and change display units to
13 sectors (command 'u').
14 15 16 Command (m for help): n
17 Command action
18 e extended
19 p primary partition (1-4)
20 p
21 Partition number (1-4): 1
22 First cylinder (1-2610, default 1):
23 Using default value 1
24 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): ***\*+\*******\*5\*******\*00M\****
25
26
27 Command (m for help): n
28 Command action29 e extended
30 p primary partition (1-4)
31 p
32 Partition number (1-4): 2
33 First cylinder (15-2610, default 15):
34 Using default value 15
35 Last cylinder, +cylinders or +size{K,M,G} (15-2610, default 2610):
36 Using default value 261037 #查看分区38 Command (m for help): p
39
40
41 Disk /dev/sdb: 21.5 GB, 21474836480 bytes
42 255 heads, 63 sectors/track, 2610 cylinders
43 Units = cylinders of 16065 * 512 = 8225280 bytes
44 Sector size (logical/physical): 512 bytes / 512 bytes
45 I/O size (minimum/optimal): 512 bytes / 512 bytes
46 Disk identifier: 0x4fde4cd0
47
48
49 Device Boot Start End Blocks Id System
50 /dev/sdb1 1 14 112423+ 83 Linux
51 /dev/sdb2 15 2610 20852370 83 Linux
52 #保存并退出
53 Command (m for help): w
54 The partition table has been altered!
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. 接下来,我们对/dev/sdb的分区进行格式化

[root@localhost ~]# mkfs.ext4 /dev/sdb1

[root@localhost ~]# mkfs.ext4 /dev/sdb2

  1. 创建目录,并挂载新的磁盘

#mkdir -p /mnt/boot /mnt/sysroot

#mount /dev/sdb1 /mnt/boot

#mount /dev/sdb2 /mnt/sysroot/

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

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

#我们可以来看一下二进制确认我们是否安装成功

#hexdump -C -n 512 /dev/sdb

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

  1. 修改 grub2/grub.cfg 文件, 标红的部分 是需要使用 指令来查看的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSRjCOhS-1659016464934)(…/…/…/Pictures/Linux/wps8.jpg)] 在grub.cfg文件中 , 红色部分用 上面 sdb1 的 UUID替换,蓝色部分用 sdb2的UUID来替换, 紫色部分是添加的,表示selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiyfO80L-1659016464935)(../../../Pictures/Linux/QQ%E5%9B%BE%E7%89%8720220728215211.png)]

  1. 创建目标主机根文件系统

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

  1. 拷贝需要的bash(也可以拷贝你需要的指令)和库文件给新的系统使用

#cp /lib64/. /mnt/sysroot/lib64/

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

  1. 现在我们就可以创建一个新的虚拟机,然后将默认分配的硬盘 移除掉,指向我们刚刚创建的磁盘即可.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SixoQJN-1659016464935)(../../../Pictures/Linux/wps9.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hFhRSA2-1659016464935)(../../../Pictures/Linux/wps10.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bd9jIKxF-1659016464935)(../../../Pictures/Linux/wps11.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1paMP4bO-1659016464936)(../../../Pictures/Linux/wps12.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0R1ziBTC-1659016464936)(../../../Pictures/Linux/wps13.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B99lSfuy-1659016464936)(../../../Pictures/Linux/wps14.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxXA3Eog-1659016464937)(../../../Pictures/Linux/wps15.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYebY6ka-1659016464937)(../../../Pictures/Linux/wps16.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3L320UJR-1659016464937)(../../../Pictures/Linux/wps17.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uTb4l5FP-1659016464937)(../../../Pictures/Linux/wps18.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7BNVp37-1659016464938)(../../../Pictures/Linux/wps19.jpg)]

  1. 这时,很多指令都不能使用,比如 ls , reboot 等,可以将需要的指令拷贝到对应的目录即可
  2. 如果要拷贝指令,*重新进入到原来的 linux系统拷贝相应的指令即可*,比较将 /bin/ls 拷贝到 /mnt/sysroot/bin 将/sbin/reboot 拷贝到 /mnt/sysroot/sbin

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/

  1. 再重新启动新的min linux系统,就可以使用 ls , reboot 指令了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6W6868xA-1659016464938)(../../../Pictures/Linux/wps20.jpg)]

linux 系统-备份与恢复

24.1.基本介绍

1
2
3
4
5
6
7
8
虚拟机可以做快照。
实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。
所以我们可以使用备份和恢复技术

linux 的备份和恢复很简单,有两种方式:
(1) 把需要的文件(或者分区)用 TAR 打包就行,下次需要恢复的时候,再解压开覆盖即可
(2) 使用 dump 和 restore 命令
1234567

24.2.安装 dump 和 restore

1
2
3
4
如果 linux 上没有 dump  和 restore 指令,要先安装
yum -y install dump
yum -y install restore
123

24.3.使用 dump 完成备份

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
1.基本介绍:
dump 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)

2.语法说明:
dump [-cu] [-123456789] [-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统]
dump [] -wW

选项说明:
-c 创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。
-0123456789 备份的层级。0 为最完整备份,会备份所有文件。若指定 0 以上的层级,则备份至上一次备份以来修改或新增的文件,到 9 后,可以再次轮替.
-f <备份后文件名> 指定备份后文件名
-j 调用 bzlib 库压缩备份文件,也就是将备份后的文件压缩成 bz2 格式,让文件更小
-T <日期> 指定开始备份的时间与日期
-u 备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。
-t 指定文件名,若该文件已存在备份文件中,则列出名称
-W 显示需要备份的文件及其最后一次备份的层级,时间,日期。
-w 与-W 类似,但仅显示需要备份的文件。

进行增量备份/备份层级要加-u,因为-u可以记录层级

3.案例
案例 1:将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0
dump -0uj -f /opt/boot.bak0.bz2 /boot
/boot 要备份的分区

案例 2:在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看这次生成的备份文件 boot1.bak 有多大
dump -1uj -f /opt/boot.bak1.bz2 /boot


注意:通过 dump 命令在配合 crontab 可以实现无人值守备份
写一个脚本


4. 显示需要备份的文件及其最后一次备份的层级,时间,日期
dump -W


5.查看备份时间文件
cat /etc/dumpdates


6.dump 备份文件或者目录
前面我们在备份分区时,是可以支持增量备份的,
如果备份文件或者目录,不再支持增量备份, 即只能使用 0 级别备份(-u不能写)

案例:使用 dump 备份 /etc 整个目录
dump -0j -f /opt/etc.bak.bz2 /etc/

#下面这条语句会报错,提示 DUMP: Only level 0 dumps are allowed on a subdirectory
dump -1j -f /opt/etc.bak.bz2 /etc/


注意:如果要备份重要的文件,比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

24.4.使用 restore 完成恢复

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
31
32
33
34
35
36
37
38
39
40
41
1.基本介绍:
restore 命令用来恢复已备份的文件,可以从 dump 生成的备份文件中恢复原文件

2.基本语法:
restore [模式选项] [选项]

模式选项说明:不能混用,在一次命令中,只能指定一种。
-C 使用对比模式,将备份的文件与已存在的文件相互对比,看看是否存在差异
-i 使用交互模式,在进行还原操作时,restore 指令将依序询问用户
-r 进行还原模式 (一般用这个)
-t 查看模式,看备份文件有哪些文件

选项
-f <备份设备> 从指定的文件中读取备份数据,进行还原操作

3.案例:
案例 1:restore 命令比较模式,比较备份文件和原文件的区别测试
mv /boot/hello.java /boot/hello100.java
restore -C -f boot.bak1.bz2 //注意和 最新的文件比较

mv /boot/hello100.java /boot/hello.java
restore -C -f boot.bak1.bz2

案例 2:restore 命令查看模式,看备份文件有哪些数据/文件
restore -t -f boot.bak0.bz2


案例 3:restore 命令还原模式
注意细节:如果你有增量备份,需要把增量备份文件也进行恢复,有几个增量备份文件,就要恢复几个,按顺序来恢复即可。
mkdir /opt/boottmp
cd /opt/boottmp
restore -r -f /opt/boot.bak0.bz2 //恢复到第 1 次完全备份状态
restore -r -f /opt/boot.bak1.bz2 //恢复到第 2 次增量备份状态


案例 4:restore 命令恢复备份的文件,或者整个目录的文件
基本语法: restore -r -f 备份好的文件

[root@hspedu100 opt]# mkdir etctmp
[root@hspedu100 opt]# cd etctmp/
[root@hspedu100 etctmp]# restore -r -f /opt/etc.bak0.bz2

Linux部分源码解读

image-20230611152320376

image-20230611152407028

数据备份与恢复

dump备份

一、命令简介

Linux dump命令用于备份文件系统。dump为备份工具程序,可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。dump命令只可以备份ext2/3/4格式的文件系统,centos7默认未安装dump命令,可以使用yum install -y dump安装此命令。

二、使用示例

1、全量备份/boot分区

[root@s135 ~]# dump -0uj -f /root/boot.bak.bz2 /boot/
DUMP: Date of this level 0 dump: Fri Jul 30 16:10:06 2021
DUMP: Dumping /dev/sda1 (/boot) to /root/boot.bak.bz2
DUMP: Label: none
DUMP: Writing 10 Kilobyte records
DUMP: Compressing output at compression level 2 (bzlib)
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 115437 blocks.
DUMP: Volume 1 started with block 1 at: Fri Jul 30 16:10:06 2021
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: Closing /root/boot.bak.bz2
DUMP: Volume 1 completed at: Fri Jul 30 16:10:22 2021
DUMP: Volume 1 took 0:00:16
DUMP: Volume 1 transfer rate: 6656 kB/s
DUMP: Volume 1 116040kB uncompressed, 106506kB compressed, 1.090:1
DUMP: 116040 blocks (113.32MB) on 1 volume(s)
DUMP: finished in 16 seconds, throughput 7252 kBytes/sec
DUMP: Date of this level 0 dump: Fri Jul 30 16:10:06 2021
DUMP: Date this dump completed: Fri Jul 30 16:10:22 2021
DUMP: Average transfer rate: 6656 kB/s
DUMP: Wrote 116040kB uncompressed, 106506kB compressed, 1.090:1
DUMP: DUMP IS DONE
[root@s135 ~]# ll -h /root/
总用量 105M
-rw-------. 1 root root 1.8K 7月 30 16:03 anaconda-ks.cfg
-rw-r–r–. 1 root root 105M 7月 30 16:10 boot.bak.bz2
[root@s135 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root ext4 9.8G 1.2G 8.1G 13% /
devtmpfs devtmpfs 908M 0 908M 0% /dev
tmpfs tmpfs 919M 0 919M 0% /dev/shm
tmpfs tmpfs 919M 8.5M 911M 1% /run
tmpfs tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/sda1 ext4 976M 115M 795M 13% /boot
/dev/mapper/centos-home ext4 17G 45M 16G 1% /home
tmpfs tmpfs 184M 0 184M 0% /run/user/0

2、增量备份/boot分区

在/boot分区创建一个测试文件hi.txt
[root@s135 ~]# cd /boot/
[root@s135 boot]# touch hi.txt
[root@s135 boot]# echo “this is a test” > hi.txt
然后增量备份/boot分区
[root@s135 ~]# dump -1uj -f /root/boot.bak1.bz2 /boot/
DUMP: Date of this level 1 dump: Fri Jul 30 16:17:15 2021
DUMP: Date of last level 0 dump: Fri Jul 30 16:16:41 2021
DUMP: Dumping /dev/sda1 (/boot) to /root/boot.bak1.bz2
DUMP: Label: none
DUMP: Writing 10 Kilobyte records
DUMP: Compressing output at compression level 2 (bzlib)
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 39 blocks.
DUMP: Volume 1 started with block 1 at: Fri Jul 30 16:17:15 2021
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: Closing /root/boot.bak1.bz2
DUMP: Volume 1 completed at: Fri Jul 30 16:17:15 2021
DUMP: 40 blocks (0.04MB) on 1 volume(s)
DUMP: finished in less than a second
DUMP: Date of this level 1 dump: Fri Jul 30 16:17:15 2021
DUMP: Date this dump completed: Fri Jul 30 16:17:15 2021
DUMP: Average transfer rate: 0 kB/s
DUMP: Wrote 40kB uncompressed, 11kB compressed, 3.637:1
DUMP: DUMP IS DONE
查看增量备份文件大小
[root@s135 ~]# ll -h /root
总用量 105M
-rw-------. 1 root root 1.8K 7月 30 16:03 anaconda-ks.cfg
-rw-r–r–. 1 root root 12K 7月 30 16:17 boot.bak1.bz2
-rw-r–r–. 1 root root 105M 7月 30 16:10 boot.bak.bz2

3、查询分区的最新备份记录

[root@s135 ~]# dump -W
Last dump(s) done (Dump ‘>’ file systems):
/dev/mapper/centos-root ( /) Last dump: never
/dev/sda1 ( /boot) Last dump: Level 1, Date Fri Jul 30 16:17:15 2021
/dev/mapper/centos-home ( /home) Last dump: never

4、备份文件或目录

备份文件和目录只能使用0级别,即只能全量备份。
[root@s135 ~]# dump -0j -f /home/etc.dump.bz2 /etc/
DUMP: Date of this level 0 dump: Fri Jul 30 16:23:29 2021
DUMP: Dumping /dev/mapper/centos-root (/ (dir etc)) to /home/etc.dump.bz2
DUMP: Label: none
DUMP: Writing 10 Kilobyte records
DUMP: Compressing output at compression level 2 (bzlib)
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 35010 blocks.
DUMP: Volume 1 started with block 1 at: Fri Jul 30 16:23:30 2021
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: Closing /home/etc.dump.bz2
DUMP: Volume 1 completed at: Fri Jul 30 16:23:35 2021
DUMP: Volume 1 took 0:00:05
DUMP: Volume 1 transfer rate: 2470 kB/s
DUMP: Volume 1 39190kB uncompressed, 12350kB compressed, 3.174:1
DUMP: 39190 blocks (38.27MB) on 1 volume(s)
DUMP: finished in 5 seconds, throughput 7838 kBytes/sec
DUMP: Date of this level 0 dump: Fri Jul 30 16:23:29 2021
DUMP: Date this dump completed: Fri Jul 30 16:23:35 2021
DUMP: Average transfer rate: 2470 kB/s
DUMP: Wrote 39190kB uncompressed, 12350kB compressed, 3.174:1
DUMP: DUMP IS DONE

三、使用语法及参数说明

1、使用语法

#dump [参数]

2、参数说明

常用参数 参数说明
-0123456789 备份的层级
-b 指定区块的大小,单位为KB
-B 指定备份卷册的区块数目
-c 修改备份磁带预设的密度与容量
-d 设置磁带的密度。单位为BPI
-f 指定备份设备
-h 当备份层级等于或大于指定的层级时,将不备份用户标示为”nodump”的文件
-j 使用bzlib库压缩备份文件
-n 当备份工作需要管理员介入时,向所有”operator”群组中的使用者发出通
-s 备份磁带的长度,单位为英尺
-T 指定开始备份的时间与日期
-u 备份完毕后,在/etc/dumpdates中记录备份的文件系统,层级,日期与时间等
-w 与-W类似,但仅显示需要备份的文件
-W 显示需要备份的文件及其最后一次备份的层级,时间与日期

restore恢复

一、命令简介

Linux restore命令用来还原由dump操作所备份下来的文件或整个文件系统(一个分区)。restore 指令所进行的操作和dump指令相反,dump操作可用来备份文件,而restore操作则是写回这些已备份的文件。可以从完整或部分备份中恢复单个文件和目录子树。

二、使用示例

1、获取命令帮助

#restore --help或者man restore |more
在这里插入图片描述

2、比较数据变化

比较变化参数-C只可以比较出更新或者删除的数据变化,在备份后新增的文件无法比较出来。
[root@s135 ~]# restore -C -f boot.bak.bz2
Dump tape is compressed.
Dump date: Fri Jul 30 16:16:41 2021
Dumped from: the epoch
Level 0 dump of /boot on s135:/dev/sda1
Label: none
filesys = /boot
[root@s135 ~]# rm -rf /boot/symvers-3.10.0-957.el7.x86_64.gz
[root@s135 ~]# restore -C -f boot.bak.bz2
Dump tape is compressed.
Dump date: Fri Jul 30 16:16:41 2021
Dumped from: the epoch
Level 0 dump of /boot on s135:/dev/sda1
Label: none
filesys = /boot
restore: unable to stat ./symvers-3.10.0-957.el7.x86_64.gz: No such file or directory
Some files were modified! 1 compare errors

3、查看模式查看备份文件包含的文件内容

[root@s135 ~]# restore -t -f boot.bak.bz2
Dump tape is compressed.
Dump date: Fri Jul 30 16:16:41 2021
Dumped from: the epoch
Level 0 dump of /boot on s135:/dev/sda1
Label: none
2 .
11 ./lost+found
12 ./efi
13 ./efi/EFI
14 ./efi/EFI/centos
8193 ./grub2
24 ./grub2/device.map
25 ./grub2/i386-pc
27 ./grub2/i386-pc/testload.mod
29 ./grub2/i386-pc/cbtable.mod
31 ./grub2/i386-pc/normal.mod
32 ./grub2/i386-pc/legacy_password_test.mod

22 ./initramfs-0-rescue-c0886fb731a041bb9fee61901f7b6427.img
23 ./vmlinuz-0-rescue-c0886fb731a041bb9fee61901f7b6427
333 ./initramfs-3.10.0-957.el7.x86_64kdump.img

4、全量备份还原

# restore -r -f /root/boot.bak.bz2全量备份还原
[root@s135 boot]# ll
总用量 106440
-rw-r–r–. 1 root root 151918 11月 9 2018 config-3.10.0-957.el7.x86_64
drwxr-xr-x. 3 root root 4096 7月 30 15:56 efi
drwxr-xr-x. 2 root root 4096 7月 30 15:57 grub
drwx------. 5 root root 4096 7月 30 16:03 grub2
-rw-r–r–. 1 root root 15 7月 30 16:13 hi.txt
-rw-------. 1 root root 57412428 7月 30 16:01 initramfs-0-rescue-c0886fb731a041bb9fee61901f7b6427.img
-rw-------. 1 root root 21379638 7月 30 16:03 initramfs-3.10.0-957.el7.x86_64.img
-rw-------. 1 root root 13176073 7月 30 16:05 initramfs-3.10.0-957.el7.x86_64kdump.img
drwx------. 2 root root 16384 7月 30 15:56 lost+found
-rw-------. 1 root root 3543471 11月 9 2018 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root 6639904 7月 30 16:01 vmlinuz-0-rescue-c0886fb731a041bb9fee61901f7b6427
-rwxr-xr-x. 1 root root 6639904 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@s135 boot]# restore -r -f /root/boot.bak.bz2
Dump tape is compressed.
restore: ./lost+found: File exists
restore: ./efi: File exists
restore: ./efi/EFI: File exists
restore: ./efi/EFI/centos: File exists
restore: ./grub2: File exists
restore: ./grub2/i386-pc: File exists
restore: ./grub2/locale: File exists
restore: ./grub2/fonts: File exists
restore: ./grub: File exists
在这里插入图片描述

5、增量备份还原

#创建还原临时目录
[root@s135 ~]# mkdir bootdir
[root@s135 ~]# cd bootdir/
#首先完成全量备份还原
[root@s135 bootdir]# restore -r -f /root/boot.bak.bz2
Dump tape is compressed.
[root@s135 bootdir]# ll
总用量 106876
-rw-r–r–. 1 root root 151918 11月 9 2018 config-3.10.0-957.el7.x86_64
drwxr-xr-x. 3 root root 4096 7月 30 15:56 efi
drwxr-xr-x. 2 root root 4096 7月 30 15:57 grub
drwx------. 5 root root 4096 7月 30 16:03 grub2
-rw-------. 1 root root 57412428 7月 30 16:01 initramfs-0-rescue-c0886fb731a041bb9fee61901f7b6427.img
-rw-------. 1 root root 21379638 7月 30 16:03 initramfs-3.10.0-957.el7.x86_64.img
-rw-------. 1 root root 13176073 7月 30 16:05 initramfs-3.10.0-957.el7.x86_64kdump.img
drwx------. 2 root root 4096 7月 30 15:56 lost+found
-rw-------. 1 root root 144136 8月 2 10:41 restoresymtable
-rw-r–r–. 1 root root 314036 11月 9 2018 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root 3543471 11月 9 2018 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root 6639904 7月 30 16:01 vmlinuz-0-rescue-c0886fb731a041bb9fee61901f7b6427
-rwxr-xr-x. 1 root root 6639904 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
#然后还原增量备份
[root@s135 bootdir]# restore -r -f /root/boot.bak1.bz2
Dump tape is compressed.
[root@s135 bootdir]# ll
总用量 106880
-rw-r–r–. 1 root root 151918 11月 9 2018 config-3.10.0-957.el7.x86_64
drwxr-xr-x. 3 root root 4096 7月 30 15:56 efi
drwxr-xr-x. 2 root root 4096 7月 30 15:57 grub
drwx------. 5 root root 4096 7月 30 16:03 grub2
-rw-r–r–. 1 root root 15 7月 30 16:13 hi.txt
-rw-------. 1 root root 57412428 7月 30 16:01 initramfs-0-rescue-c0886fb731a041bb9fee61901f7b6427.img
-rw-------. 1 root root 21379638 7月 30 16:03 initramfs-3.10.0-957.el7.x86_64.img
-rw-------. 1 root root 13176073 7月 30 16:05 initramfs-3.10.0-957.el7.x86_64kdump.img
drwx------. 2 root root 4096 7月 30 15:56 lost+found
-rw-------. 1 root root 144208 8月 2 10:44 restoresymtable
-rw-r–r–. 1 root root 314036 11月 9 2018 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root 3543471 11月 9 2018 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root 6639904 7月 30 16:01 vmlinuz-0-rescue-c0886fb731a041bb9fee61901f7b6427
-rwxr-xr-x. 1 root root 6639904 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64

6、交互式模式下还原指定文件

#创建还原临时目录
[root@s135 ~]# mkdir bootdir
#进入交互模式
[root@s135 bootdir]# restore -i -f /root/boot.bak.bz2
Dump tape is compressed.
#获取交互式下的命令帮助
restore > help
Available commands are:
ls [arg] - list directory
cd arg - change directory
pwd - print current directory
add [arg] - add arg' to list of files to be extracted delete [arg] - deletearg’ from list of files to be extracted
extract - extract requested files
setmodes - set modes of requested directories
quit - immediately exit program
what - list dump header information
verbose - toggle verbose flag (useful with ``ls’’)
prompt - toggle the prompt display
help or ?' - print this list If noarg’ is supplied, the current directory is used
#列出备份文件中的内容
restore > ls
.:
.vmlinuz-3.10.0-957.el7.x86_64.hmac
System.map-3.10.0-957.el7.x86_64
config-3.10.0-957.el7.x86_64
efi/
grub/
grub2/
initramfs-0-rescue-c0886fb731a041bb9fee61901f7b6427.img
initramfs-3.10.0-957.el7.x86_64.img
initramfs-3.10.0-957.el7.x86_64kdump.img
lost+found/
symvers-3.10.0-957.el7.x86_64.gz
vmlinuz-0-rescue-c0886fb731a041bb9fee61901f7b6427
vmlinuz-3.10.0-957.el7.x86_64
#将config-3.10.0-957.el7.x86_64文件添加到还原列表
restore > add config-3.10.0-957.el7.x86_64
#开始原因
restore > extract
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1
set owner/mode for ‘.’? [yn] n
restore > quit
[root@s135 bootdir]# ls
config-3.10.0-957.el7.x86_64

三、使用语法及参数说明

1、使用语法

#restore [模式] [选项]

2、模式参数说明

参数 参数说明
-C 比较备份数据和实际数据的变化
-i 进入交互模式手动指定需要恢复的文件
-P 还原从现有转储文件创建新的快速文件访问文件,而不还原其内容
-R 全面还原文件系统时,检查应从何处开始进行。
-r 还原模式,用于数据还原
-t 查看模式,查看备份文件中的数据
-x 设置文件名称,且从指定的存储媒体里读入它们,若该文件已存在在备份文件中,则将其还原到文件系统内。

3、常用选项参数说明

参数 参数说明
-b<区块大小> 设置区块大小,单位是Byte。
-c 不检查dump操作的备份格式,仅准许读取使用旧格式的备份文件。
-D<文件系统> 允许用户指定文件系统的名称。
-f<备份文件> 从指定的文件中读取备份数据,进行还原操作。
-h 仅解出目录而不包括与该目录相关的所有文件。
-m 解开符合指定的inode编号的文件或目录而非采用文件名称指定。
-s<文件编号> 当备份数据超过一卷磁带时,您可以指定备份文件的编号。
-v 显示指令执行过程。
-y 不询问任何问题,一律以同意回答并继续执行指令。

Linux图形化界面-webmin和bt宝塔

webmin由于太老不多做介绍,可查看Linux操作系统——Linux可视化管理-webmin 和 bt 运维工具_linux可视化管理工具_胖虎不秃头的博客-CSDN博客

一、宝塔面板简介

宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率。例如:创建管理网站、FTP、数据库,拥有可视化文件管理器,可视化软件管理器,可视化CPU、内存、流量监控图表,计划任务等功能。宝塔面板拥有极速方便的一键配置与管理,可一键配置服务器环境(LAMP/LNMP/Tomcat/Node.js),一键部署SSL,异地备份;提供SSH开启关闭服务,SSH端口更改,禁ping,防火墙端口放行以及操作日志查看;CPU、内存、磁盘IO、网络IO数据监测,可设置记录保存天数以及任意查看某天数据;计划任务可按周期添加执行,支持SHELL脚本,提供网站、数据库备份以及日志切割,且支持一键备份到又拍云存储空间,或者其他云存储空间里;通过web界面就可以轻松管理安装所用的服务器软件,还有实用的扩展插件;集成方便高效的文件管理器,支持上传、下载、打包、解压以及文件编辑查看。
  博文实验环境:

  • 操作系统:centos7.9
  • 宝塔面板版本:7.9.0

二、安装步骤

0、安装要求:

  • 内存:512M以上,推荐768M以上(纯面板约占系统60M内存)
  • 硬盘:300M以上可用硬盘空间(纯面板约占20M磁盘空间)
  • 系统:CentOS 7.1+ (Ubuntu16.04+.、Debian9.0+),确保是干净的操作系统,没有安装过其它环境带的Apache/Nginx/php/MySQL/pgsql/gitlab/java(已有环境不可安装)
  • 架构:x86_64

2、安装wget命令

[root@s146 ~]# yum install -y wget

3、下载安装脚本

[root@s146 ~]# wget -O install.sh http://download.bt.cn/install/install_6.0.sh

4、执行安装脚本

在这里插入图片描述

#请注意,需要root用户执行安全脚本
[root@s146 ~]# sh install.sh 28615082

5、注册一个宝塔账户

利用安装间隙注册一个宝塔账户,脚本安装执行大概需要10分钟。
在这里插入图片描述

6、安装完成

安装完成后会有如下提示,请保存用户名、密码、面板地址。登录宝塔面板需要使用到。另外如果需要访问外网面板地址需要在出口防火墙上进行NAT映射和安全策略开放。
在这里插入图片描述

7、登录宝塔面板

在这里插入图片描述

8、阅读并同意用户协议

在这里插入图片描述

9、绑定宝塔官网注册的账号

在这里插入图片描述

10、宝塔面板安装完成

在这里插入图片描述

三、使用简介

1、软件安装示例——ftp软件安装

  • 软件商店搜索ftp并选择Pure-Ftpd,点击安装
    在这里插入图片描述
  • 点击确定
    在这里插入图片描述
  • 安装完成
    在这里插入图片描述
  • 添加ftp账户
    在这里插入图片描述
  • ftp登录测试
    在这里插入图片描述

2、面板设置

  • 面板设置
    在这里插入图片描述
  • 安全设置
    在这里插入图片描述
  • 通知设置
    在这里插入图片描述

3、命令行终端操作

在这里插入图片描述

4、安全管理

在这里插入图片描述

5、文件上传下载

在这里插入图片描述

6、定时任务

在这里插入图片描述

7、系统监控

在这里插入图片描述

8、服务启停管理

  • 查看宝塔面板服务状态

[root@s146 ~]# bt status
Bt-Panel (pid 6867) already running
Bt-Task (pid 6893) already running

  • 启动宝塔面板服务

[root@s146 ~]# bt start
Starting Bt-Panel… done
Starting Bt-Tasks… done

  • 停止宝塔面板服务

[root@s146 ~]# bt stop
Stopping Bt-Tasks… done
Stopping Bt-Panel… done

  • 重启宝塔面板服务

[root@s146 ~]# bt restart
Stopping Bt-Tasks… done
Stopping Bt-Panel… done
Starting Bt-Panel… done
Starting Bt-Tasks… done

  • 重载宝塔面板服务配置

[root@s146 ~]# bt reload
Reload Bt-Panel… done

  • 查看宝塔面板日志

[root@s146 ~]# bt logs
192.168.0.32 - - [2022-04-12 11:57:06] “GET /static/img/soft_ico/ico-php_filter.png HTTP/1.1” 304 188 0.007153
192.168.0.32 - - [2022-04-12 11:57:06] “GET /static/img/soft_ico/ico-coll_admin.png HTTP/1.1” 304 188 0.005967

  • 查看宝塔面板默认信息

bt default

此指令可用于查看当前宝塔的账户和密码,如果忘记了的话

BT-Panel default info!

四、QA

1、报错请使用正确的入口登录面板

  • 报错信息:
    在这里插入图片描述
  • 报错原因:当前新安装的已经开启了安全入口登录,新装机器都会随机一个8位字符的安全入口名称
  • 解决方案:
    使用安全入库url链接访问,就是安装完成后提示中的内网面板地址。如果未保持,可以使用命令bt default命令查看。

2.正在重新连接服务器

此情况是ssh面板开启导致的,关闭ssh面板即可

注:宝塔面板 账户和密码为 vljenqxz 55ab60cb

ftp账户 密码为root XTj2wR3zk84Fd5t8

数据库名:www_godwad_com

用户:www_godwad_com

密码:BysXzkcYnH

访问站点:http://www.godwad.com/index.php

数据库:MySQL数据库编码:utf8mb4账号:666_com密码:KBHt4MYkaE

防木马病毒入侵—chkrootkit

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。

chkrootkit简介

chkrootkit是一个linux下检RootKit的脚本,在某些检测中会调用当前目录的检测程序

官网:http://www.chkrootkit.org/

下载源码:wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

解压后执行 make 命令,就可以使用了

一般直接运行,一旦有INFECTED,说明可能被植入了RootKit

1
./chkrootkit | grep INFECTED

Linux面试题(节选)

cut分割 3为分割后的第三段 sort排序(从小到大) uniq -c统计次数

sort -nr从大到小排

awk分割与cut原理相同

awk -F " "分割空格 ’ {printf $5表示分割出来的第五段} ’

image-20230612144512692

1
2
3
4
5
6
7
8
9
10
11
1.用户tom对目录/home/test有执行x和读r写w权限,/home/test/hello.java是只读文件,问tom对
hello.java文件能读吗(ok)?能修改吗(no)?能删除吗?(ok)

2.用户tom对目录home/test只有读写权限,home/test/hello,java是只读文件,问tom对hello.java
文件能读吗(no)?能修改吗(no)?能删除吗(no)?

3.用户tom对目录/home/test只有执行权限x,/home/test/hello.java是只读文件,问tom对
hello,java文件能读吗(ok)?能修改吗(no)?能删除吗(no)?

,4.用户tom对目录/home/test只有执行和写权限,/home/test/hello.java是只读文件,问tom对
hello.java文件能读吗(ok)?能修改吗(no)?能删除吗(ok)?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Linux面试题

问题:列举Liux高级命令,至少6个(百度
netstat//网络状态监控
top//系统运行状态
Isblk//查看硬盘分区find
ps-aux//查看运行进程
chkconfig//查看服务启动状态
systemctl//管理系统服务器
问题:Liux查看内存、io读写、磁盘存储、端口占用、进程查看命令是什么?(瓜子)
top,iotop,df-lh,netstat-tunlp,ps-aux|grep关心的进程

使用Linuxi命令计算t2.txt第二列的和并输出(美团)
张三40
李四50
王五60
cat t2.txt | awk -F " " '{sum+=$2} END {print sum}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Linux面试题
Shell脚本里如何检查一个文件是否存在?并给出提示(百度)
if[-f文件名]then echo"存在”else echo“不存在”fi
●用shel写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出(百度)
9
8
7
6
5
4
3
2
10
sort -nr t3.txt |awk '{sum+=$0;print $0}END {print"和="sum}'
请用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat
的文件名称(金山)
grep -r "cat"/home |cut -d ":-f 1
请写出统计/hom目录下所有文件个数和所有文件总行数的指令(在金山面试题扩展)
find /home/test -name "*.*|
wc -l
find /home/test -name "*.*|
xargs wc -I

image-20230612161531017

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
如何优化Linux系统,说出你的方法
1.对Linux的架构的优化,和原则分析
2.对linux系统本身的优化-规则
(1)不用root,使用sudo提示权限
(②)定时的自动更新服务时间,使用nptdate npt1.aliyun.com,让croud定时更新

(3)配置yum源,指向国内镜像(清华,163

(4)配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
(5)打开最大文件数(调整文件的描述的数量)vim/etc/profile ulimit-SHn65535

(6)配置合理的监控策略
(7)配置合理的系统重要文件的备份策略

(8)对安装的软件进行优化,比如nginx,apache

(9)内核参数进行优化/etc/sysctl..conf
(1O)锁定一些重要的系统文件chattr/etc/passwd/ect/shadow/etc/inittab
(11)禁用不必要的服务setup,ntsysv