Linux操作系统

重点:linux的安装 linux的常用指令 linux的网络配置 shell编程

难点:linux的磁盘分区 linux的shell编程 linux日志

1 linux基础篇

1.1 linux的基本概述

1.1.1 linux的由来

​ linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上。常见的操作系统有windows、macOS、IOS、Andriod、linux等。

​ 1991年,李纳斯·托瓦兹Linus Torvalds,一个芬兰赫尔辛基大学的学生,出于个人爱好而编写的,当时他觉得教学用的迷你版UNIX操作系统Minix太难用了,于是决定自己开发一个操作系统。第一个版本于1991年9月发布,当时仅有10000行代码。由于Linux具有结构清晰、功能简捷等特点,许多大专院校的学生和科研机构的研究人员纷纷把它作为学习和研究的对象。

​ 关于Linux Logo的由来是一个很有意思的话题,它是一只企鹅,为什么选择企鹅?

​ 对此,有种说法是:企鹅是南极洲的标志性动物,根据国际公约,南极洲为全人类共同所有,不属于世界上的任何国家,任何国家都无权将南极洲纳入其版图。Linux选择企鹅图案作为Logo,其含义是:开放源代码的Linux为全人类共同所有,任何公司无权将其私有。

​ Linux有很多的发行版本,好比windows有windows xp,win7,win10。虽然这个比喻不是很恰当,但是对于初学者来说可以暂时这样理解。在全球范围内有上百款Liunx发行版,常见的主流发行版如下图所示:

1.1.2 linux与unix的关系

1.1.2.1 unix

​ UNIX 操作系统由肯•汤普森(Ken Thompson)和丹尼斯•里奇(Dennis Ritchie)发明。它的部分技术来源可追溯到从 1965 年开始的 Multics 工程计划,该计划由贝尔实验室、美国麻省理工学院和通用电气公司联合发起,目标是开发一种交互式的、具有多道程序处理能力的分时操作系统,以取代当时广泛使用的批处理操作系统。

说明:分时操作系统使一台计算机可以同时为多个用户服务,连接计算机的终端用户交互式发出命令,操作系统采用时间片轮转的方式处理用户的服务请求并在终端上显示结果(操作系统将CPU的时间划分成若干个片段,称为时间片)。操作系统以时间片为单位,轮流为每个终端用户服务,每次服务一个时间片。

​ 可惜,由于 Multics 工程计划所追求的目标太庞大、太复杂,以至于它的开发人员都不知道要做成什么样子,最终以失败收场。

​ 以肯•汤普森为首的贝尔实验室研究人员吸取了 Multics 工程计划失败的经验教训,于 1969 年实现了一种分时操作系统的雏形,1970 年该系统正式取名为 UNIX。

​ 想一下英文中的前缀 Multi 和 Uni,就明白了 UNIX 的隐意。Multi 是大的意思,大而且繁;而 Uni 是小的意思,小而且巧。这是 UNIX 开发者的设计初衷,这个理念一直影响至今。

​ 自 1970 年后,UNIX 系统在贝尔实验室内部的程序员之间逐渐流行起来。1971-1972 年,肯•汤普森的同事丹尼斯•里奇发明了传说中的C语言,这是一种适合编写系统软件的高级语言,它的诞生是 UNIX 系统发展过程中的一个重要里程碑,它宣告了在操作系统的开发中,汇编语言不再是主宰。

​ 到了 1973 年,UNIX 系统的绝大部分源代码都用C语言进行了重写,这为提高 UNIX 系统的可移植性打下了基础(之前操作系统多采用汇编语言,对硬件依赖性强),也为提高系统软件的开发效率创造了条件。可以说,UNIX 系统与C语言是一对孪生兄弟,具有密不可分的关系。

​ 随后出现了各种版本的 UNIX 系统,目前常见的有 Sun Solaris、FreeBSD、IBM AIX、HP-UX 等。

1.1.2.2 linux

​ Linux 内核最初是由李纳斯•托瓦兹(Linus Torvalds)在赫尔辛基大学读书时出于个人爱好而编写的,当时他觉得教学用的迷你版 UNIX 操作系统 Minix 太难用了,于是决定自己开发一个操作系统。第 1 版本于1991 年 9 月发布,当时仅有 10000 行代码。

​ 李纳斯•托瓦兹没有保留 Linux 源代码的版权,公开了代码,并邀请他人一起完善 Linux。与 Windows 及其他有专利权的操作系统不同,Linux 开放源代码,任何人都可以免费使用它。

​ 据估计,现在只有 2% 的 Linux 核心代码是由李纳斯•托瓦兹自己编写的,虽然他仍然拥有 Linux 内核(操作系统的核心部分),并且保留了选择新代码和需要合并的新方法的最终裁定权。现在大家所使用的 Linux,我更倾向于说是由李纳斯•托瓦兹和后来陆续加入的众多 Linux 好者共同开发完成的。

​ 李纳斯•托瓦兹无疑是这个世界上最伟大的程序员之一,何况,他还搞出了全世界最大的程序员交友社区 GitHub (开源代码库及版本控制系统)。

1.1.2.3 unix与linux的区别

​ 二者的关系,不是大哥和小弟,"UNIX 是 Linux 的父亲"这个说法更怡当。之所以要介绍它们的关系,是因为要告诉读者,在学习的时候,其实 Linux 与 UNIX 有很多的共通之处,简单地说,如果你已经熟练掌握了 Linux,那么再上手使用 UNIX 会非常容易。

​ 二者也有两个大的区别:

  1. UNIX 系统大多是与硬件配套的,也就是说,大多数 UNIX 系统如 AIX、HP-UX 等是无法安装在 x86 服务器和个人计算机上的,而 Linux 则可以运行在多种硬件平台上;
  2. UNIX 是商业软件,而 Linux 是开源软件,是免费、公开源代码的。

Linux 受至旷大计算机爱好者的喜爱,主要原因也有两个:

  1. 它属于开源软件,用户不用支付可费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改,无偿使用,无约束地继续传播;
  2. 它具有 UNIX 的全部功能,任何使用 UNIX 操作系统或想要学习 UNIX 操作系统的人都可以从 Linux 中获益。

总结unix与linux的区别:

​ Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,所以 Linux 模仿了 UNIX(但并没有抄袭 UNIX 的源码),使得 Linux 在外观和交互上与 UNIX 非常类似。

1.2 linux的安装

​ 我们安装linux操作系统有两种方法,一种是在裸机上直接安装(你需要格式化你本机的windows操作系统),还有一种是在虚拟机上安装。我们推荐使用第二种方式来安装。

所以我们需要先安装虚拟机,然后通过虚拟机来模拟出linux操作系统。虚拟机的产品有很多,在本套课程中,我们推荐大家使用vmware虚拟机。

1.2.1 下载并安装vmware

1.2.1.2 下载vmware
  1. 登录VMware官网下载https://www.vmware/cn.html
  1. 点击资源
  1. 点击产品下载
  1. 选择产品A-Z
  1. 下划到最后找到 VMware Workstation Pro
  1. 点击下载产品

为了简化大家的使用方式,在这里,老师把下载好的资源以存入百度云网盘,大家可以自行下载。

链接:https://pan.baidu/s/1J8k0osOhfImJKO3W7L-KuQ 
提取码:mnwg 
1.2.1.3 安装vmware

具体安装步骤,大家可以操作如下博客进行安装:

https://blog.51cto/u_14289664/5133223

安装到最后,输入秘钥。这是老师给大家找的三个秘钥,大家可以拿去使用:

ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
1.2.1.4 某些电脑出现安装虚拟机失败的情况

在VMWare软件中,安装/启动虚拟机时,如果出以类似以下的错误提示:

出现该提示是由于电脑不支持虚拟化技术或是相关功能没有开启导致的。

解决方法有两种:

  1. 重启电脑,进入BIOS,开启VT虚拟化相关选项,不同品牌的电脑BIOS参数不同,认真看,多尝试。类似如下:
  1. 修改C:\ProgramData\VMware\VMware Workstation\config.ini文件,注意,您的VMWare安装目录不一定是C:\ProgramData\VMware\VMware Workstation,根据自己的实际情况来。

    在config.ini中添加以下内容:

    monitor.allowLegacyCPU = “true”

重新打开VMWare软件,问题解决。

1.2.2 安装centos7

1.2.2.1 下载centos7镜像

​ 前面我们安装了vmware,现在我们要在虚拟机vmware里面安装centos7。接下来我们需要下载centos7镜像。

​ CentOS 7.6 DVD版:https://mirrors.aliyun/centos-vault/7.6.1810/isos/x86_64/

但是在课程中我们给大家提供好了centos7的镜像,大家可以自行下载即可。

链接:https://pan.baidu/s/1q6BnzNmV9DATMkzyTTN_RQ 
提取码:0d3f 
1.2.2.2 安装centos7
  • 打开vmware,创建新的虚拟机
  • 创建虚拟机向导

点击进入下一步。

  • 选择稍后安装操作系统
  • 选择客户机操作系统

点击下一步。

  • 命名虚拟机

x

点击下一步。

  • 配置处理器数量

点击下一步。

  • 配置虚拟机的内存
  • 配置虚拟机网络

点击进入下一步选择默认选项。

  • 选择磁盘选项

点击进入下一步。

  • 分配磁盘容量

注意:磁盘容量20G,并不是真正的占用物理机的磁盘容量。而是随着后期linux系统中服务的安装,文件的增多,最大可以分配20G的磁盘空间给我们使用,当然如果空间不够用,我们还可以扩容。

点击进入下一步选择默认选项。

  • 配置硬件
  • 完成虚拟机配置向导

到这一步,我们并没有安装完成linux。我们需要进行进一步的配置。

  • 点击开启虚拟机
  • install centos7
  • 选择语言,默认是English,也可以选择中文
  • 选择时区 选择上海
  • 安装类型选择图形化桌面版(默认是迷你安装)
  • 配置磁盘分区

点击INSTALLATION DESTINATION进行磁盘分区。

linux操作系统,我们一般设置3个分区。分别是boot分区,swap分区(交换分区:如果内存不够用,交换分区可以临时充当内存)还有根分区。以总容量20G为例,一般分区大小设置如下:

boot分区 1G

swap分区 2G

根分区 17G

具体配置如下:

配置结果如下:

点击确定。

  • 接收配置
  • 配置网络

点击进入NETWORK & HOST NAME

  • 开始安装
  • 设置root用户名密码 自定义用户名密码

安装完成,点击reboot重启系统即可。

1.3 linux的基本常识

1.3.1 linux网络连接三种方式

  • 桥接模式

下面,我们用一幅图来说明什么是桥接模式:

解释:

在桥接模式下,虚拟机里面的网络地址必须和外部的网络地址保持在同一网段(也就是前三组数字必须是一样的)。这样linux操作系统才可以和外部的机器进行通信。但是如果用户人数太多,容易造成IP冲突。

  • NAT模式

解释:

在NAT模式下,虚拟机里面的网络可以不再和主机里面的网络保持在同一网段。但是主机里面会存在虚拟网卡(192.168.100.99),这个虚拟网卡的ip地址必须和linux里面的IP地址(192.168.100.88)在同一网段。这样linux就可以通过虚拟网卡和主机之间进行通信了。同时也可以通过主机的真实地址(192.168.0.50)和外部网络进行通信。这样的好处是可以避免造成IP冲突。

  • 主机模式

这个很简单,就是linux系统的ip地址和主机的ip地址必须保持一致。

1.3.2 虚拟机的克隆

如果你已经安装了一台linux操作系统,你还想要更多的linux操作系统,这里我们就没有必要再重新安装linux操作系统了,因为会非常的耗时、麻烦。你只需要在原来linux操作系统上克隆就可以实现。

注意:克隆的时候,需要先关闭linux操作系统。

下面我们介绍两种克隆虚拟机的方式:

方式1:直接拷贝一份安装好的虚拟机文件。

我们可以在已经安装的linux操作系统所在的目录上,直接复制 粘贴即可。

上面的目录就是我们安装linux操作系统的目录,我们直接复制,然后粘贴到指定的磁盘目录并重名即可。然后我们通过虚拟机打开:

然后选择指定文件打开:

方式2:使用vmware的克隆操作。

我们按照以下的图示进行操作:

点击克隆之后,在点击下一步,如下所示:

点击下一步:

点击下一步:

点击完成即可。

注意:

在选择克隆类型的时候,有两种。

第一种:创建链接克隆。这种克隆的方式占用的磁盘空间较小,克隆时间更快。本质上还是使用原来的linux操作系统,只是克隆了原linux操作系统的引用。

第二种:创建完整克隆。这种克隆的方式占用是磁盘空间较大,克隆时间比较慢,相当于把原来的linux操作系统复制了一份。一般我们选择完整克隆。

1.3.3 虚拟机的快照

如果你在使用linux操作系统的时候,你想回到原来的某一个状态(也就是可能出现在误操作上造成的系统异常),需要回到原先某个正常运行的状态,vmware提供了这样的功能,就叫快照管理。

下面我们来演示虚拟机快照:

  1. 打开linux操作系统,拍摄快照。

点击拍摄快照。

2、在桌面上创建A目录,然后我们再拍摄快照:

点击拍摄快照。

3、在桌面上创建B目录,然后我们再拍摄快照:

点击拍摄快照。

4、我们查看快照记录:

打开快照管理器:

查看快照信息:

5、跳转到指定的快照位置:

点击转到,就可以跳转到快照A。

1.3.4 虚拟机的迁移和删除

通过前面的学习我们得知,当linux操作系统安装完成之后,它的本质是以文件的形式保存在文件目录里面的。因此虚拟系统的前移也十分简单,我们只需要把安装好虚拟系统所在的文件夹直接剪切或拷贝至指定的目录即可。删除也很简单,我们可以使用vmware自带的删除功能进行删除。

首先我们关闭linux操作系统,然后右键–>管理–>从磁盘中清除即可。

1.3.5 安装vmtools

vmtools安装完成之后,可以让我们在windows下更好的管理vm虚拟机。可以设置windows和centos的共享文件夹。

具体安装步骤如下:

1、进入centos(将光驱弹出来)。

右键光驱–>Eject

2、点击vm菜单的 install vmware tools。

点击重新安装VMware Tools。会出现如下所示(如果没有的话,就重新安装):

3、centos会出现一个vm安装包, xx.tar.gz。

右键光盘–>Open。出现的内容如下所示:

4、拷贝到opt目录。

我们右键这个tar.gz文件,选择copy。将其拷贝至opt目录下面去。

Home–>Other Locations -->Computer–>opt -->右键 paste

5、使用解压命令tar,得到一个安装文件。

cd /opt(进入到opt目录的命令)。我们先打开终端:

在终端中输入命令 cd /opt

使用tar命令解压文件(tar -zxvf VMwareTools-10.0.0-2977863.tar.gz)

6、进入解压的目录

解压之后文件如下:

cd 命令进入这个目录(cd vmware-tools-distrib):

7、安装vmware-install.pl文件(./vmware-install.pl)

执行命令之后,一系列设置全部回车即可(安装需要一定的时间)。

安装成功之后的界面如下所示:

8、创建共享文件目录

比如我在本机的F:\upload目录创建共享文件夹myshare。

右键虚拟机,点击设置:

选择选项:

点击添加:

点击下一步,选择目标文件目录。

点击下一步:

点击完成。此时共享文件夹创建完毕。

9、使用共享文件夹

在windows系统中的myshare目录下面创建文件hello.txt,并在文件里面输入hello。

进入linux操作系统,查看共享文件夹:

/mnt/hgfs/myshare:

打开hello.txt,我们发现里面有我们之前输入的内容hello。我们在linux系统中的hello.txt里面追加内容,保存文件之后,在windows环境下面也可以查看到文件发生的变化。

到这里,使用vmtools搭建共享文件目录就完成了。

1.4 linux的目录结构

1.4.1 linux目录结构简介

linux的文件系统和windows的文件不一样。windows文件系统中会有很多盘符,在盘符下面又有很多的文件目录。但是linux文件目录不是这样的。linux文件系统采用的是层级式的树状目录结构,其中最上层的根目录是"/",然后在此目录下面再创建其他的目录。linux的树状目录结构非常重要,它的树状图如下所示:

这里简单介绍一下:

比如/boot目录。这个是linux系统启动所需要的引导文件的目录。如果这个目录里面的文件损毁,linux操作系统就无法启动。

/dev目录。设备管理器目录,linux把任何硬件都映射成了对应的文件来描述,这些文件就存放在dev目录里面。

总之一句话:在linux世界里,一切皆为文件!

1.4.2 linux目录结构详解

  • /bin目录

是Binary的缩写, 这个目录存放着最经常使用的命令。比如我们常用的cd命令 cp命令都是存放在bin目录里面。

  • /sbin目录

s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

  • /home目录

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

此时我们可以再验证一下,我们使用命令的方式创建一个用户:

[root@xq100 ~]# useradd tom  #创建一个tom用户
[root@xq100 ~]# userdel -r tom  # 删除指定的用户及其对应的文件夹

此时我们发现,在home目录也会生成一个tom目录

当我们执行userdel -r命令,这个用户所属的文件目录也就被删除了。

  • /root

该目录为系统管理员(root),也称作超级权限者的用户主目录。如果我们使用root账户登录,默认所处的目录位置就是在/root下面。

  • /lib

系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。如果这个目录里面的文件被删除了,linux操作系统也就不能正常运行了。

  • /etc

所有的系统管理所需要的配置文件和子目录。linux系统本身所需要用到的配置文件也是存放在etc目录。如果我们自己安装一些系统服务,比如mysql数据库服务,那么和数据库相关的配置文件(myf)也是存放在/etc目录里面。

  • /usr

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

  • /boot

存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。如果这个目录里面的文件被删除了,linux操作系统也就不能正常运行了。

  • /dev

类似于windows的设备管理器,把所有的硬件用文件的形式存储。

  • /proc

这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统的信息。这个目录我们不要动,否则可能造成系统的崩溃。

  • /srv

service的缩写,该目录存放的一些服务服务启动之后需要提取的数据。这个目录我们不要动,否则可能造成系统的崩溃。

  • /sys

这个目录存放了linux内核相关的文件信息。这个目录我们不要动,否则可能造成系统的崩溃。

  • /tmp

这个目录是用来存放一下临时文件的。

  • /media

linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。比如我们插入的U盘 光驱都会被映射成对应的文件存放在media目录。

  • /mnt

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

  • /opt

这是主机给安装软件所存放的目录,如果安装JDK可放到改目录下默认为空。上节内容我们安装VMwareTools-10.0.0-2977863.tar.gz。这个压缩文件就存放在opt目录的。

  • /usr/local

简单的说就是应用程序安装之后,安装程序所存放的目录。一般是通过编译源码方式安装的程序。

  • /var

这个目录中存放着在不断变化,扩充着的东西,最常用的就是包括各种日志文件。

1.5 linux基本实操

1.5.1 linux远程登录

在实际工作中,linux服务器是开发小组共享的,并不是存放在每个用户的本地电脑上,linux服务器一般会存在在一台独立的电脑上(独立的机房里)。所以我们需要远程的登录到linux进行相关的操作。

在这里我们介绍两个远程操作工具。一个是远程登录linux操作系统的工具,一个是进行远程文件传输 下载的工具。

第一个工具:远程连接 登录linux服务器的工具 Xshell7

下载地址:

链接:https://pan.baidu/s/1q_3huHdXNUcrTiwdtKtGNw 
提取码:il3r 
  • 安装:
  1. 直接解压文件得到问了目录Xshell。
  2. 进入Xshell目录:点击!绿化.bat,桌面会自动化生成Xshell程序。
  1. 打开Xshell-帮助-关于Xshell,查看破解情况。

如果出现以上信息说明破解成功。

  • 通过Xshell7远程连接linux
  1. 首先我们需要获取远程连接linux操作系统的ip地址。
[root@xq100 ~]# ip addr

我们可以本地windows系统下面ping一下ip,看能否ping成功:

Microsoft Windows [版本 10.0.17763.1577]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\kriss>ping 192.168.10.137

正在 Ping 192.168.10.137 具有 32 字节的数据:
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64

192.168.10.137 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\kriss>

我们发现,可以ping成功。

  1. 建立连接

打开Xshell,点击文件–>新建:

点击确定,再输入登录用户名和密码即可即可。

第二个工具:进行文件远程传输和下载的工具 FileZilla

  • 下载FileZilla
链接:https://pan.baidu/s/1_gGQZuzyehHwZrXWuPatMA 
提取码:k1xo 
  • 安装

傻瓜式安装,直接点击下一步即可。

  • 使用FileZilla连接linux操作系统

注意:

主机的连接地址必须是sftp协议。也就是必须输入: sftp://192.168.10.137

用户名和密码是连接linux操作系统的用户名和密码。

端口号可以不写,默认就是22。

  • 上传文件

上传文件:在windows操作系统(左边)选择指定文件,右键–>上传 即可。

下载文件:在linux操作系统(右边)选择指定文件,右键–>下载 即可。

1.5.2 linux vi/vim编辑器

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

1.5.2.1 vi/vim的三种模式
  • 正常模式:
    以vim打开一个档案就是直接进入了一般默认(这是正常的模式),在这个模式中,可以通过上下左右来移动光标,你也可以使用【删除字符】【删除整行】来编辑档案中的内容,也可以使用【复制】【贴上】来处理你的文件数据。

  • 插入模式:
    按下i,l,o,O,a等任意一个字母之后才会进入编辑模式,一般情况按下i即可。

  • 命令行模式:
    在这个模式当中,可以提供你相关指令,完成读取,存盘,替换vim,显示行号等操作是在此模式下完成的。

1.5.2.2 使用vim工具

现在我们完成一个简单的需求,使用vim编辑器,编辑一个Hello.java文件。我们就在Xshell中完成。

[root@xq100 ~]# vim Hello.java

我们输入 vim Hello.java命令,然后回车,此时进入到正常模式。

此时我们直接在里面写内容是没有反应的,因为正常模式下,不能进行内容的编辑,我们需要容正常模式切换到插入模式。如何切换?

我们一般按下i键即可。此时,屏幕左下角会显示成INSERT字样:

这个时候我们可以在插入模式下面进行内容的编辑:

接下来我们需要保存文件,我们需要切换到命令行模式:

首先按ESC键,然后输入:wq 然后回车 就是保存并退出。

1.5.2.3 vim编辑器快捷键的使用

:wq 保存并退出

:q 直接退出

:q! 不保存并退出(强制退出)

接下来我们简单使用vim编辑器的快捷键。

1. 拷贝当前行 (yy ),并粘贴(p)

yyp

注意:必须在正常模式下面进行操作。

此时我们查看效果:

2. 拷贝当前向下的2行(2yy ) 并粘贴(p)

2yyp

完成之后的效果:

3.删除当前行(dd) 删除当前向下的2行 (2dd)

  • 删除当前行

dd

删除之后的效果:

  • 删除向下的2行

2dd

删除之后的效果:

4.在文件中查找某个单词{命令行下/关键字} 回车查找,输入n就能查找下一个

比如查找Hello关键字。/Hello 然后按n就能查找到内容

5.设置文件的行号(: set nu)。取消文件的行号(: set nonu)

  • 设置行号 : set nu
  • 取消行号 : set nonu

6.使用快捷键回到文件内容的最起始处和最末尾处

切换到正常模式。

G : 回到文件的末尾处(光标回到文件的末尾处)

gg:回到文件的最开始处(光标回到文件的最开始处)

7.快速的定位到某个位置

切换到正常模式。

5 shift + g (快速到定位到第5行)。

8.在文件中输入内容,执行撤销操作

切换到正常模式。按快捷键u

  • 要搜索当前行中字符串“World”的首次出现,并将其替换为“shijie”

😒/World/shijie/

  • 要替换当前行中搜索到的所有内容,可以添加g标志:

😒/World/shijie/g

  • 想搜索和替换整个文件中的匹配内容,使用百分比字符%作为范围。此字符指示从文件第一行到最后一行的范围

:%s/World/shijie/g

1.5.3 linux关机重启

  • shutdown

    shutdown -h now 表示立即关机

    shutdown -h 1:表示一分钟后关机

    shutdown -r now :立即重启

  • halt

    就是直接使用,效果等同于关机

  • sync

    把内存的数据同步到磁盘

  • reboot

    就是重启系统

注意细节:

  1. 不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写入到磁盘中。
  2. 目前的shutdown、reboot、halt命令在关机前都进行了sync。

1.5.4 用户登录和注销

  • 切换用户 su root 切换到root用户
  • exit 退出 注销

注意:在切换用户的时候,如果从低级别的用户切换到高级别的用户,需要输入密码的(wen --> root)。如果从高级别的用户切换到低级别的用户(root --> wen),那么是不需要输入密码的。

1.6 linux用户管理

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

1.6.1 添加用户

在root用户下,我们可以创建很多其它的用户,并且这些用户都会生成对应的目录,这些目录位于/home/用户名的目录下面。如果我们使用自己创建的用户登录,默认的情况下,用户所在的目录就是/home/用户目录所在的位置。

如何创建用户? useradd [选项] 用户名

[root@xq100 ~]# useradd kobe   #创建用户名为kobe的用户
[root@xq100 ~]# cd /home # 切换到home目录
[root@xq100 home]# ll  # 查看home目录所在的文件夹
total 0
drwx------. 3 kobe kobe  78 Aug 27 17:49 kobe
drwx------. 5 xq   xq   147 Aug 27 16:02 xq

细节:

  • 当用户创建成功后,会自动的创建和用户同名的目录。这个目录位于/home下面。
  • 也可以通过 useradd -d来指定目录新的用户名,给新的用户名指定目录
[root@xq100 home]# useradd -d /home/test king # 创建一个用户名为king的用户 用户目录位于/home/test
[root@xq100 home]# cd /home
[root@xq100 home]# ll
total 0
drwx------. 3 kobe kobe  78 Aug 27 17:49 kobe
drwx------. 3 king king  78 Aug 27 17:52 test
drwx------. 5 xq   xq   147 Aug 27 16:02 xq

1.6.2 给用户添加密码

创建密码的命令: passwd 用户名

[root@xq100 home]# passwd kobe # 给kobe这个用户设置密码
Changing password for user kobe.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

我们执行logout指令,然后使用kobe进行登录,发现可以成功登录。

1.6.3 删除用户

删除用户有两种情况,一种是删除用户,保存用户对应的目录。还有一种是删除用户,连用户对应的目录也删除掉。

  • 删除用户,保存用户对应的目录

userdel 用户名

注意,我们切换到root用户下面,执行用户的删除操作。

[root@xq100 home]# userdel kobe
[root@xq100 ~]# cd /home
[root@xq100 home]# ll
total 0
drwx------. 5 1001 1001 147 Aug 27 18:03 kobe  # 我们发现用户所属的目录还在
drwx------. 3 king king  78 Aug 27 17:52 test
drwx------. 5 xq   xq   147 Aug 27 16:02 xq
  • 删除用户,对应的用户目录也删除掉

userdel -r 用户名

[root@xq100 home]# useradd lisi  #创建用户lisi
[root@xq100 home]# ll
total 0
drwx------. 5 lisi lisi 147 Aug 27 18:03 kobe
drwx------. 3 lisi lisi  78 Aug 27 18:09 lisi
drwx------. 5 xq   xq   147 Aug 27 16:02 xq
[root@xq100 home]# userdel -r lisi  # 删除用户的同时也删除lisi对应的目录
[root@xq100 home]# ll
total 0
drwx------. 5 1001 1001 147 Aug 27 18:03 kobe
drwx------. 5 xq   xq   147 Aug 27 16:02 xq

1.6.4 查询用户信息

  • 查询用户的详细信息

id 用户名

[root@xq100 home]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@xq100 home]# id kobe
uid=1001(kobe) gid=1001(kobe) groups=1001(kobe)

uid: 用户id gid:用户组id groups:组名

  • 查看当前的用户的信息

who am i / whoami

[root@xq100 home]# who am i
root     pts/1        2022-08-27 18:06 (192.168.10.1)
  • 切换用户

su 用户名

注意:从高级别的用户切换到低级别的用户不需要输入密码。比如从root切换到kobe用户。

从低级别的用户输入到高级别的用户,需要输入密码。必须从kobe用户切换到root用户。

[root@xq100 home]# su kobe  #从root切换到kobe 不需要输入密码
[kobe@xq100 home]$ whoami
kobe
[kobe@xq100 home]$ su root   #从kobe切换到root 需要输入密码
Password: 
[root@xq100 home]#

1.6.5 用户组

用户组类似于角色,系统可以对有共性(权限)的多个用户进行统一管理。我们可以通过下面一幅图来理解组的概念。

  • 创建、删除用户组

groupadd 组名

[root@xq100 ~]# groupadd gaibang  #创建一个组

groupdel 组名

[root@xq100 ~]# groupdel gaibang  #删除一个组
  • 增加用户的时候,直接指定组名称

之前我们创建用户的时候,没有指定组,其实系统会自动给用户分配一个组,这个组的名称和用户名称是一样的。

现在我们创建用户的时候直接指定组名称。

基本语法: useradd -g 用户组 用户名

[root@xq100 ~]# useradd -g gaibang guojing #创建用户指定组名称
[root@xq100 ~]# id guojing
uid=1002(guojing) gid=1002(gaibang) groups=1002(gaibang)
  • 修改用户所在组

比如我们之前有一个用户guojing,所在组为gaibang。现在我们想将guojing这个用户放在taohuadao这个组里面去(前提是这个组必须存在)。

基本语法: usermod -g 用户组 用户名

[root@xq100 ~]# groupadd taohuadao   #创建组 名称为taohuadao
[root@xq100 ~]# usermod -g taohuadao guojing  #将用户guojing移动到taohuadao这个组里面去
[root@xq100 ~]# id guojing
uid=1002(guojing) gid=1003(taohuadao) groups=1003(taohuadao)
  • 用户和组相关的文件

(1)/etc/passwd文件

用户的配置文件,记录用户的各种信息。

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

使用cat命令浏览这个文件: cat /etc/passwd

xq:x:1000:1000:xq:/home/xq:/bin/bash
kobe:x:1001:1001::/home/kobe:/bin/bash
guojing:x:1002:1003::/home/guojing:/bin/bash

(2)/etc/shadow文件

口令的配置文件,用户登录的时候需要口令(密码)。口令的验证都是通过这个shadow文件去验证的。

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

xq:$6$O2FlTZ6TIC6rD2dZ$xQb7mhEuE10P4lodcj5OaGhU5FqrdO7FifH2VjSvwPouqzGLrtTdZLtG8L3l2AvnFQi47x0uRLYMt6LMGWHfc0::0:99999:7:::
kobe:$6$Ij/jhx8A$CYTNMbK0N0DQOIh6A6qQ0Ucnst6GcNTHeS1X4pca3MwXI1ntM0NWsA0/HfUZTrgZKzUPC5m0ZBhpiLG9ZZlrw.:19231:0:99999:7:::
guojing:!!:19231:0:99999:7:::

我们发现guojing这个用户没有加密口令,所以没有显示。我们给guojing这个用户设置密码就可以看到加密口令了。

guojing:$6$.AdhAmZA$gbKCNrwqHBZAot8DxqxrtA7a0uCtc07iKnQltVWdLAk20wLg/58eHF5Ude81Zoo8P.onVZbS0wh/acETjipEv1:19231:0:99999:7:::

(3)/etc/group文件

组的配置信息,记录linux包含的组的信息

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

1.7 linux运行级别

  • linux操作系统运行的7种级别

关于linux的运行级别,一共有7种,我们给大家分别介绍一下:

0:关机

1:单用户(找回用户丢失的密码,可以使用单用户模式)

2:多用户状态但没有网络服务(一般很少用)

3:多用户状态但有网络服务(没有图形化界面,但是有网络,这种用的最多)

4:系统未使用,保留给用户(很少用)

5:图形界面

6:系统重启

常用的运行级别是3和5,我们也可以指定系统默认的运行级别。

切换运行级别的口令: init[0 1 2 3 4 5 6]

我们在linux操作系统(带有图形化界面的操作系统)输入init 3。此时linux操作系统就会以纯命令行模式启动

  • 如何修改linux操作系统默认的运行级别

在centos7中,有一个文件/etc/inittab文件中,描述了运行级别的相关信息

现在我们就来演示linux操作系统的运行级别:

[root@xq100 ~]# systemctl get-default  #获取linux操作系统默认的运行级别
graphical.target   # 图形化的运行级别
[root@xq100 ~]# systemctl set-default multi-user.target  # 设置linux操作系统默认的运行级别为纯命令行级别
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
[root@xq100 ~]# reboot

建议:同学们在初学的时候,还是使用带有图形化界面的运行级别。

1.8 如何找回root密码

这是一道经典的面试题。希望大家要能够掌握,如果以后自己忘记了root账户的密码,我们也可以按照下面的方法自己去找到root用户的密码。

  • 进入到linux开机界面,然后按e键
  • 按下e键然后进入另一个界面,找到以linux16开头的行数。在行的最后面输入:init=/bin/sh。
  • 接着输入完成之后,直接按快捷键Ctrl + X 进入单用户模式
  • 接着在光标闪烁的位置输入: mount -o remount,rw / 然后按回车键。
  • 在新的一行最后面输入:passwd,然后按回车键。输入密码,然后再次输入确认密码(密码长度最好是8位以上,但不是必须的)。密码修改成功之后,会显示passwd …的字样,说明密码修改成功。
  • 接着在光标闪烁的位置输入: touch /.autorelabel(注意touch 与后面的/之间有空格)。完成后按回车。
  • 接着在光标闪烁的位置继续输入:exec /sbin/init(注意exec 与后面的/之间有空格)。然后按回车键,等待系统自动修改密码(这个时间可能会有点长,请耐心等待)。完成后系统会自动重启,新的密码生效了。

1.9 linux帮助指令

  • man 获得帮助信息

基本语法: man 命令名称(功能描述:获得指定命令的帮助信息)。

案例:查看 ls命令的帮助信息 man ls

比如-a参数: 列出当前目录下面的隐藏文件(注意:linux操作系统下面的隐藏文件都是以.开头的)。

ls -a

[root@xq100 ~]# ls -a
.   anaconda-ks.cfg  .bash_logout   .bashrc  .config  .dbus    Documents  .esd_auth   .ICEauthority         .local    Music     Public   Templates  .viminfo
..  .bash_history    .bash_profile  .cache   .cshrc   Desktop  Downloads  Hello.java  initial-setup-ks.cfg  .mozilla  Pictures  .tcshrc  Videos     .Xauthority

比如-l参数:以列表的形式展示指定目录下面的文件。

ls -l(简写ll)

[root@xq100 ~]# ls -l
total 12
-rw-------. 1 root root 1877 Aug 18 14:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Desktop
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Documents
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Downloads
-rw-r--r--. 1 root root  242 Aug 27 15:58 Hello.java
-rw-r--r--. 1 root root 1908 Aug 18 15:04 initial-setup-ks.cfg
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Music
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Pictures
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Public
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Templates
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Videos

我们还可以将参数组合起来使用

ls -la

[root@xq100 ~]# ls -al  #以列表的形式展示所有的显式文件和隐藏文件
total 64
dr-xr-x---. 15 root root 4096 Aug 27 21:05 .
dr-xr-xr-x. 17 root root  245 Aug 27 21:03 ..
-rw-------.  1 root root 1877 Aug 18 14:57 anaconda-ks.cfg
-rw-------.  1 root root 1481 Aug 27 20:35 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
drwx------. 17 root root 4096 Aug 27 21:05 .cache
drwx------. 16 root root 4096 Aug 25 23:08 .config
-rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
drwx------.  3 root root   25 Aug 18 15:04 .dbus
drwxr-xr-x.  2 root root    6 Aug 18 15:05 Desktop
drwxr-xr-x.  2 root root    6 Aug 18 15:05 Documents
drwxr-xr-x.  2 root root    6 Aug 18 15:05 Downloads
......
  • help 获得shell内置命令的帮助信息

1.10 linux常用命令

1.10.1 linux文件(目录)相关的指令

1.10.1.1 文件(目录)操作

在linux操作系统里面,获取文件的方式有两种,一种是通过绝对路径的方式获取文件,一种是相对路径获取文件。

假设我们在当前指定的目录下面,想要获取指定的文件,我们可以通过相对路径和绝对路径的方式来获取。

  • pwd指令 显示当前目录的绝对路径
[root@xq100 home]# pwd  #获取当前目录所在的绝对路径
/home
[root@xq100 home]# cd kobe
[root@xq100 kobe]# pwd
/home/kobe
  • ls指令 显示当前目录下面的所有文件(目录)

常用选项:

-a: 显示当前目录下面的所有文件和目录 包括隐藏的。

-l: 以列表的方式显示文件(目录)信息。

  • cd命令 切换到指定目录

常用选项:

~: cd ~ 回到当前用户的home目录(如果是root用户,那么回到的就是root目录下面,如果是非root用户,那么就回到home/用户目录 下面)

[root@xq100 kobe]# cd ~
[root@xq100 ~]# pwd
/root

/: cd / 回到系统根目录

[root@xq100 ~]# cd / # 回到系统根目录
[root@xq100 /]# pwd
/

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

[root@xq100 /]# cd /home/kobe   # 直接切换到kobe目录
[root@xq100 kobe]# cd ..  # 回到上一级目录
[root@xq100 home]# pwd
/home

例子: 比如我们现在所在的目录是/home/kobe目录。现在我们要使用回到/root目录下面去。

cd …/…/root

[root@xq100 home]# cd /home/kobe
[root@xq100 kobe]# cd ../../root
[root@xq100 ~]# pwd
/root

-: cd -回到上一条命令所在的目录

[root@xq100 home]# cd /home/kobe
[root@xq100 kobe]# cd ../../root
[root@xq100 ~]# pwd
/root
[root@xq100 ~]# cd -  # 回到上一条命令所在的目录
/home/kobe
[root@xq100 kobe]# pwd
/home/kobe

直接切换到指定目录:

比如我们现在所在的目录是/home/kobe目录。现在我们要使用回到/root目录下面去。

[root@xq100 ~]# cd /home/kobe
[root@xq100 kobe]# pwd
/home/kobe
[root@xq100 kobe]# cd /root
[root@xq100 ~]# pwd
/root
  • mkdir :用于创建目录

需求:在kobe目录下面创建dog目录

[root@xq100 ~]# cd /home/kobe  
[root@xq100 kobe]# mkdir dog  # 创建dog目录
[root@xq100 kobe]# ll
total 4
drwxr-xr-x. 2 root root 6 Aug 28 14:06 dog
-rw-r--r--. 1 root root 6 Aug 28 13:50 Hello.txt

我们也可以一次性创建多级目录。 比如在kobe目录下面创建/animal/cat目录

[root@xq100 kobe]# mkdir animal/cat
mkdir: cannot create directory ‘animal/cat’: No such file or directory
[root@xq100 kobe]#

此时报错,因为我们创建多级目录的时候,需要携带一个-p参数。

-p 创建多级目录。我们可以这样创建多级目录。

[root@xq100 kobe]# mkdir -p animal/cat   # 创建多级目录
[root@xq100 kobe]# ll
total 4
drwxr-xr-x. 3 root root 17 Aug 28 14:09 animal
drwxr-xr-x. 2 root root  6 Aug 28 14:06 dog
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.txt
  • rmdir:指令删除目录

需求:我们删除dog目录。

[root@xq100 kobe]# rmdir dog
[root@xq100 kobe]# ll
total 4
drwxr-xr-x. 3 root root 17 Aug 28 14:09 animal
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.txt

接下来我们删除animal目录。(由于animal目录是非空目录,所以使用rmdir命令删除失败)

[root@xq100 kobe]# rmdir animal
rmdir: failed to remove ‘animal’: Directory not empty  #报错 删除失败
[root@xq100 kobe]#

如果我们要删除非空目录或者文件,我们使用rm -rf命令实现(r 递归删除 f不询问删除)。

[root@xq100 kobe]# rm -rf animal  #递归不询问的方式删除animal目录
[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root 6 Aug 28 13:50 Hello.txt
  • touch: 创建空文件

需求:在kobe目录下面,创建一个空文件Demo1.txt

[root@xq100 kobe]# touch Demo1.txt  # 创建一个空文件Demo1.txt
[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root 0 Aug 28 14:14 Demo1.txt
-rw-r--r--. 1 root root 6 Aug 28 13:50 Hello.txt
  • cp:拷贝文件到指定目录

需求1:将/home/kobe下面的Hello.txt拷贝至/home/guojing目录下面。

[root@xq100 kobe]# cp Hello.txt /home/guojing/ # 拷贝文件到home/guojing目录下面
[root@xq100 kobe]# cd /home/guojing/
[root@xq100 guojing]# ll
total 4
-rw-r--r--. 1 root root 6 Aug 28 14:18 Hello.txt

-r 递归复制整个文件。

需求:在kobe目录下面,创建test文件夹,再在test文件夹里面创建test.txt。最后将整个test文件目录拷贝至home/guojing目录。

[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root  0 Aug 28 14:14 Demo1.txt
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.txt
drwxr-xr-x. 2 root root 22 Aug 28 14:19 test
[root@xq100 kobe]# cp -r test /home/guojing   # 递归拷贝整个文件目录
[root@xq100 kobe]# cd /home/guojing
[root@xq100 guojing]# ll
total 4
-rw-r--r--. 1 root root  6 Aug 28 14:18 Hello.txt
drwxr-xr-x. 2 root root 22 Aug 28 14:21 test
  • rm:移除文件或者目录

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

-f:强制删除不提示

  • mv:移动文件(剪切)或重命名

在同一个目录下面操作: mv oldName newName (重命名)

需求:将kobe目录下面的Hello.txt重命名为Hello.java

[root@xq100 kobe]# mv Hello.txt Hello.java  # 重命名
[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root  0 Aug 28 14:14 Demo1.txt
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.java
drwxr-xr-x. 2 root root 22 Aug 28 14:19 test

在不同目录下面操作:

将home/kobe目录下面的Demo1.txt文件剪切到/home/guojing目录下面,并将文件命名为Demo1.java

[root@xq100 kobe]# mv Demo1.txt /home/guojing/Demo1.java  # 剪切并重命名文件
[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.java
drwxr-xr-x. 2 root root 22 Aug 28 14:19 test
[root@xq100 kobe]# cd /home/guojing
[root@xq100 guojing]# ll
total 4
-rw-r--r--. 1 root root  0 Aug 28 14:14 Demo1.java
-rw-r--r--. 1 root root  6 Aug 28 14:18 Hello.txt
drwxr-xr-x. 2 root root 22 Aug 28 14:21 test
1.10.1.2 查看操作
  • cat 查看文件内容 cat [选项] 要查看的文件

需求:查看/etc/profile文件,并显示行号

-n 显示行号 cat -n /etc/profile

[root@xq100 guojing]# cat -n /etc/profile  #浏览文件 并显示行号

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

[root@xq100 guojing]# cat -n /etc/profile | more  #浏览文件 并显示行号 分屏幕显示  使用空格键可以翻页显示
  • more more指令是一个基于vi编辑器的文本过滤器,他以全屏的方式显示文本文件的内容,more指令内置了若干快捷键。
[root@xq100 guojing]# more /etc/profile
操作功能说明
空格键向下翻页
Enter向下翻一行
q代表立刻more,不再显示文件内容
Ctrl + F向下滚动一屏幕
Ctrl + B返回上一屏
=输出当前行号
:f输出文件名和当前行号
  • less

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

语法: less 文件名称

[root@xq100 guojing]# less /etc/profile
操作功能说明
空格键向下翻动一页
上箭头键向上翻动一页
下箭头键向下翻动一页
/字符串内容搜索字符串 n:向下搜索 N:向上搜索
q立刻less,不再显示文件内容
  • echo:将输入内容到控制台

需求1:使用echo指令输出环境变量。

[root@xq100 guojing]# echo $PATH  # 输出环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xq100 guojing]# echo $HOSTNAME  # 输出主机名称
xq100

需求2:输出hello world

[root@xq100 guojing]# echo "hello,world"
hello,world
  • head: head用于显示文件开头部分内容,默认情况下head希纳是文件前10行的内容

基本语法: head 文件

head -n 5 文件 显示前五行的内容 5可以是任意数

[root@xq100 guojing]# head  /etc/profile  # 默认显示前10条内容
[root@xq100 guojing]# head -n 5 /etc/profile  # 默认显示前5行内容
  • tail指令 用于输出文件中尾部的内容,默认情况下tail指令显示文件的前10行内容

tail 文件 (查看文件最后10行的内容)

tail -n 5 文件 (查看文件最后5行的内容,5可以是任意数)

tail -f 文件 (实时监控文件发生的变化)

[root@xq100 guojing]# tail /etc/profile   # 显示最后10行的数据
[root@xq100 guojing]# tail -n 5 /etc/profile  #显示最后5行的数据

需求:创建一个空文件test.txt。实时监控这个文件的变化

[root@xq100 guojing]# touch test.txt
[root@xq100 guojing]# tail -f test.txt

在另一个终端,我们向test.txt文档追加内容:

我们再观察控制台的变化情况:

  • >指令和>>指令: >输出重定向 ,>>追加

echo ‘hello’ > /home/guojing/test.txt (将hello输入到guojing文件夹下的test.txt中 之前内容覆盖)。

echo ‘hello’ >> /home/guojing/test.txt (将hello追加到guojing文件夹下的test.txt文件的末尾处 之前内容不会覆盖)。

cat /etc/profile > /home/guojing/myprofile (将etc/profile 重定向到home目录下的myprofile 没有会自动创建)

cal > /home/guojing/test.txt (将日历信息重定向输出到opt下的test文件)覆盖

cal >> /home/guojing/test.txt(将日历信息追加到opt目录下的test文件)追加

  • 软连接

软连接也称为符号链接,类似中windows里面的快捷方式,主要是存放了链接文件的路径。

ln -s [源文件或目录] [软连接名称]

我们在/home目录下创建一个软连接linkToRoot 链接到/root目录

需求:在kobe目录下面创建软连接linkToRoot。这个软连接指向root目录。

[root@xq100 guojing]# ln -s /root  /home/kobe/linkToRoot  #创建一个软连接
[root@xq100 guojing]# cd /home/kobe
[root@xq100 kobe]# ll
total 4
-rw-r--r--. 1 root root  6 Aug 28 13:50 Hello.java
lrwxrwxrwx. 1 root root  5 Aug 28 15:34 linkToRoot -> /root
drwxr-xr-x. 2 root root 22 Aug 28 14:19 test
[root@xq100 kobe]# cd linkToRoot/  # 实际上是切换到了linkRoot目录
[root@xq100 linkToRoot]# ll
total 12
-rw-------. 1 root root 1877 Aug 18 14:57 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Desktop
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Documents
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Downloads
-rw-r--r--. 1 root root  242 Aug 27 15:58 Hello.java
-rw-r--r--. 1 root root 1908 Aug 18 15:04 initial-setup-ks.cfg
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Music
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Pictures
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Public
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Templates
drwxr-xr-x. 2 root root    6 Aug 18 15:05 Videos

删除软连接 rm -f /linkToRoot

  • history指令 查看用户已经执行过的历史指令
[root@xq100 linkToRoot]# history  # 查看当前用户的历史指令
[root@xq100 linkToRoot]# history 10  # 查看当前用户的最近10条历史指令

1.10.2 linux时间指令

  • date指令:

基本语法:

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

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

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

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

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

[root@xq100 ~]# date
Sun Aug 28 15:41:39 CST 2022
[root@xq100 ~]# date +%Y
2022
[root@xq100 ~]# date +%m
08
[root@xq100 ~]# date +%d
28
[root@xq100 ~]# date "+%Y-%m-%d %H:%M:%S"
2022-08-28 15:43:59

date指令也可以设置日期

基本语法:date -s 字符串时间

[root@xq100 ~]# date -s "2022-8-28 15:48:50"
  • cal 日历指令
[root@xq100 ~]# cal  # 显示当前月份的日历
     August 2022    
Su Mo Tu We Th Fr Sa
    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@xq100 ~]# cal 2022  #显示整年的日历
                               2022                               

       January               February                 March       
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5          1  2  3  4  5
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    6  7  8  9 10 11 12
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   13 14 15 16 17 18 19
16 17 18 19 20 21 22   20 21 22 23 24 25 26   20 21 22 23 24 25 26
23 24 25 26 27 28 29   27 28                  27 28 29 30 31
30 31
        April                   May                   June        
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2    1  2  3  4  5  6  7             1  2  3  4
 3  4  5  6  7  8  9    8  9 10 11 12 13 14    5  6  7  8  9 10 11
10 11 12 13 14 15 16   15 16 17 18 19 20 21   12 13 14 15 16 17 18
17 18 19 20 21 22 23   22 23 24 25 26 27 28   19 20 21 22 23 24 25
24 25 26 27 28 29 30   29 30 31               26 27 28 29 30

        July                  August                September     
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6                1  2  3
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    4  5  6  7  8  9 10
10 11 12 13 14 15 16   14 15 16 17 18 19 20   11 12 13 14 15 16 17
17 18 19 20 21 22 23   21 22 23 24 25 26 27   18 19 20 21 22 23 24
24 25 26 27 28 29 30   28 29 30 31            25 26 27 28 29 30
31
       October               November               December      
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5                1  2  3
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    4  5  6  7  8  9 10
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   11 12 13 14 15 16 17
16 17 18 19 20 21 22   20 21 22 23 24 25 26   18 19 20 21 22 23 24
23 24 25 26 27 28 29   27 28 29 30            25 26 27 28 29 30 31
30 31

1.10.3 搜索查找

  • find 将从指定目录下递归地遍历各个目录,将所有满足条件的目录显示在控制台。

语法格式:

find [搜索范围] [选项]

选项功能
-name按照文件的名称查找文件
-user查找指定用户所属的文件
-size按照指定的大小查找文件

实例1:按照文件名称查询文件

[root@xq100 kobe]# find /home/kobe -name 'Hello.java'  # 查询/home/kobe目录下面 名称为Hello.java的文件
/home/kobe/Hello.java
[root@xq100 kobe]# find /home/kobe -name '*.java'  # 查询所有java文件
/home/kobe/Hello.java
/home/kobe/Demo1.java

实例2:在/opt目录下,查询root用户创建的文件

[root@xq100 kobe]#  find /opt -user 'root'

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

[root@xq100 kobe]# find / -size +200M #查询大于200M的文件
/run/media/root/CentOS 7 x86_64/LiveOS/squashfs.img
[root@xq100 kobe]# cd /run/media/root/CentOS\ 7\ x86_64/LiveOS/
[root@xq100 LiveOS]# ls -lh  # 以友好的形式显示文件信息(很容易查看文件大小)
total 476M
-rw-r--r--. 1 root root 476M Sep  6  2019 squashfs.img
-r--r--r--. 1 root root  224 Sep 12  2019 TRANS.TBL
  • locate指令 locate指令可以快速定位文件路径。locate指令利用事先建立好的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。

特别说明:

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

需求:用locate指令快速定位 Hello.java 文件所在目录 locate Hello.java

[root@xq100 ~]# updatedb  # 一定要先执行这个指令
[root@xq100 ~]# locate Hello.java  # 快速定位Hello.java文件所在的目录并输出
/home/kobe/Hello.java
/root/Hello.java
  • which指令 可以查看某个指令在哪个目录下,

查看ls指令在那个目录 which ls

查看reboot指令在那个目录下 which reboot

[root@xq100 ~]# which ls  # 查看ls指令所在的目录
alias ls='ls --color=auto'
	/usr/bin/ls
[root@xq100 ~]# which reboot  # 查看reboot指令所在的目录
/usr/sbin/reboot
  • grep指令

grep过滤查找,管道符,”|“,表示前一个指令的处理结果输出传递给后面的指令处理。一般我们将 | 和 grep一起结合起来使用。

基本语法:grep [选项] 查找内容 源文件

选项功能
-n显示行号
-i忽略自动大小写

案例:查找在/home/kobe目录下的Hello.java文件中,查找hello所在行,并显示行号。

[root@xq100 kobe]# cat Hello.java |grep -ni 'Hello'

效果如下:

1.10.4 压缩和解压

  • gzip/gunzip指令 gzip用于压缩文件 gunzip用于解压缩文件

gzip 压缩文件(将文件压缩为*.gz的文件,原文件被压缩后不存在。)

需求: 将kobe目录下面的Demo1.java进行压缩

[root@xq100 kobe]# gzip Demo1.java # 将Demo1.java 压缩成Demo1.java.gz文件
[root@xq100 kobe]# ll
total 8
-rw-r--r--. 1 root root  31 Aug 28 15:59 Demo1.java.gz
-rw-r--r--. 1 root root 122 Aug 28 16:23 Hello.java
lrwxrwxrwx. 1 root root   5 Aug 28 15:34 linkToRoot -> /root
drwxr-xr-x. 2 root root  22 Aug 28 14:19 test

gunzip 文件.gz (解压缩文件命令)

[root@xq100 kobe]# gunzip Demo1.java.gz # 解压之后 当前压缩文件会不存在
  • zip/unzip指令

zip用于压缩文件,unzip用于解压的,这个功能打包发布中很有用。

zip [选项] XXX.zip 将要压缩的内容 (压缩文件和目录的命令)

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

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

需求:将kobe目录及其下面的所有文件进行压缩,压缩成myFile.zip

[root@xq100 home]# zip -r myFile.zip kobe/

需求:将home目录下面的zip文件解压到home/tmp文件目录中去

[root@xq100 home]# mkdir tmp  # 创建tmp目录
[root@xq100 home]# unzip -d /home/tmp myFile.zip # 将zip文件解压到tmp目录下面
  • tar指令

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

语法格式:tar [选项] XXX.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar,gz)

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

需求1:将home目录下面的kobe目录压缩成myFile.tar.gz

[root@xq100 home]# tar -zcvf  MyFile.tar.gz /kobe/
[root@xq100 home]# ll
total 4
drwx------. 4 guojing taohuadao  158 Aug 28 15:26 guojing
drwx------. 6 kobe    kobe       194 Aug 28 16:36 kobe
-rw-r--r--. 1 root    root      1001 Aug 28 16:57 MyFile.tar.gz
drwxr-xr-x. 3 root    root        18 Aug 28 16:48 tmp
drwx------. 5 xq      xq         147 Aug 27 16:02 xq

需求2:将myFile.tar.gz文件解压到当前目录

[root@xq100 home]# tar -zxvf  MyFile.tar.gz

需求3:将myFile.tar.gz文件解压到/home/tmp目录下面

需要使用-C参数指定解压的位置。

[root@xq100 home]# tar -zxvf myFile.tar.gz -C /home/tmp
[root@xq100 home]# cd tmp
[root@xq100 tmp]# ll
total 0
drwx------. 7 kobe kobe 194 Aug 28 16:36 kobe

1.11 linux组管理和权限管理

1.11.1 linux组介绍

在linux中每个用户都必须属于一个组,不能独立于组外,在linux中每个文件有所有者,所在组,其他组的概念。下面我们用一幅图来解释用户、组、其他组的概念。

默认情况下,谁创建了改文件,谁就是文件的所有者。

我们切换到/home目录下。以列表的形式查看文件:

  • 修改文件所属的用户

当然,我们也可以修改文件所属的用户。我们可以使用chown名令实现修改。

[root@xq100 home]# touch apple.txt
[root@xq100 home]# ll
[root@xq100 home]# chown kobe apple.txt # 将当前文件的所属用户变成kobe
[root@xq100 home]# ll

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

创建一个组 groupadd monster

创建一个用户 fox并放入到monster组中 useradd -g monster fox

给fox设置密码 passwd fox

[root@xq100 home]# clear
[root@xq100 home]# groupadd monster
[root@xq100 home]# useradd -g monster fox
[root@xq100 home]# passwd fox
Changing password for user fox.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

注销当前root用户,使用fox用户登录。然后我们使用fox用户创建一个fox.txt的文件。

[fox@xq100 ~]$ pwd
/home/fox
[fox@xq100 ~]$ touch fox.txt
[fox@xq100 ~]$ ll
total 0
-rw-r--r--. 1 fox monster 0 Aug 28 17:39 fox.txt
  • 修改文件所在的组

我们切换到root用户,修改fox.txt所在的组。将组monster变更到taohuadao这个组。

我们使用命令chgrp命令就可以实现。

[root@xq100 home]# cd fox
[root@xq100 fox]# ll
total 0
-rw-r--r--. 1 fox monster 0 Aug 28 17:39 fox.txt
[root@xq100 fox]# chgrp taohuadao fox.txt
[root@xq100 fox]# ll
total 0
-rw-r--r--. 1 fox taohuadao 0 Aug 28 17:39 fox.txt
  • 修改用户所在的组

在root用户下面,我们也可以修改用户所在的组。前提是新的组一定是存在的。

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

需求:将fox所属的组(monster)修改到taohuadao。

usermod -g taohuadao fox

[root@xq100 home]# id fox
uid=1003(fox) gid=1004(monster) groups=1004(monster)
[root@xq100 home]# usermod -g taohuadao fox
[root@xq100 home]# id fox
uid=1003(fox) gid=1003(taohuadao) groups=1003(taohuadao)

1.11.2 Linux权限的介绍

1.11.2.1 linux权限的基本概述

当我们使用ll命令查询文件信息的时候,我们发现是这样的:

总共10位,我们使用0-9来描述。

第0-9位说明

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

    • l是软连接,相当于windows的快捷方式

    • d是目录,相当于windows的文件夹

    • c是字符设别,鼠标,键盘(/dev 目录里面查看)

    • b是块设备,比如说硬盘(/dev 目录里面查看)

  • 第1-3位确定所有者(该文件的所有者)拥有该文件的权限 --User

  • 第4-6位确定所属组,(同用户组的)又有该文件的权限 --Group

  • 第7-9位确定其他用户拥有改文件的权限 --Other

rwx权限详解(难点)

  • rwx作用到文件
    • r 代表可读 read 可以读取,查看
    • w 代表可写 write 可以修改,但是不代表可以删除改文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除文件
    • x 代表可执行 execute 可被执行
  • rwx作用到目录
    • r 代表可读 可以读取 ls查看目录的内容
    • w 代表可写 对目录内进行创建+删除+重命名该目录
    • x 代表可执行 可以进入该目录
1.11.2.2 文件及目录的案例
-rw-r--r--. 1 root root   0 Aug 28 15:59 Demo1.java
  • 第一个字符表示文件类型 - 指的是文件。

  • rw- 文件所有者对当前文件是可读可写不可执行的权限。

  • r-- 与文件拥有者同一组的用户的权限是可读不可写不可执行。

  • r-- 当前文件的其他用户的权限是可读不可写不可执行。

  • 1:文件:硬连接数或 目录:子目录数

  • root:当前文件所属的用户

  • root:当前用户所属的组

  • 0: 文件大小单位是字节

  • Aug 28 15:59:文件最后修改时间

  • Demo1.java:文件的名称

1.11.2.3 权限的修改

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

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

u:所有者,g:所属组,o,其他人,a:所有人(u,g,o的总和)

案例演示:

  1. 给/home/Hello.java所有者读写执行的权限,给所在组执行读执行的权限,给其他组读执行的权限
[root@xq100 kobe]# chmod u=rwx,g=rx,o=rx Hello.java 
  1. 给/home/Hello.java文件的所有者去除执行的权限,增加组写的权限
[root@xq100 kobe]# chmod u-x,g+w Hello.java 
  1. 给/home/Hello.java文件的所有用户添加读的权限
[root@xq100 kobe]# chmod a+r Hello.java 
  • 第二种方式:通过数字变更权限

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

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

1.11.2.4 权限管理的最佳实践

我们先完成1 2步骤的操作:

[root@xq100 ~]# groupadd police  # 创建组police
[root@xq100 ~]# groupadd bandit   # 创建组bandit
[root@xq100 ~]# useradd -g police jack  # 创建用户jack,并将其设置在police组里面
[root@xq100 ~]# useradd -g police jerry  # 创建用户jerry,并将其设置在police组里面
[root@xq100 ~]# useradd -g bandit xh  # 创建用户xh,并将其设置在bandit组里面
[root@xq100 ~]# useradd -g bandit xm # 创建用户xm,并将其设置在bandit组里面

我们再完成第3步操作:

先设置4个用户的密码

[root@xq100 ~]# passwd jack
Changing password for user jack.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@xq100 ~]# passwd jerry
Changing password for user jerry.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@xq100 ~]# passwd xh
Changing password for user xh.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@xq100 ~]# passwd xm
Changing password for user xm.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

再使用jack登录,然后创建文件jack.txt,并设置对应的权限。

[jack@xq100 ~]$ vim jack.txt  # 创建jack.txt文件 并在里面编辑内容Hello
[jack@xq100 ~]$ cat jack.txt
Hello
[jack@xq100 ~]$ ll
total 4
-rw-r--r--. 1 jack police 6 Aug 28 19:06 jack.txt
[jack@xq100 ~]$ chmod 640 jack.txt # 修改权限
[jack@xq100 ~]$ ll
total 4
-rw-r-----. 1 jack police 6 Aug 28 19:06 jack.txt

我们再完成第4步操作:

[jack@xq100 ~]$ chmod 664 jack.txt 
[jack@xq100 ~]$ ll
total 4
-rw-r--r--. 1 jack police 6 Aug 28 19:06 jack.txt

我们再完成第5步操作:

此时我们需要root用户的权限执行这条命令

[root@xq100 jack]# usermod -g police xh

测试:xh xm是否可以对jack.txt进行读写操作。

分别使用xh xm登录。然后在当前xh xm目录下面执行命令:

[xh@xq100 ~]$ cd /home/jack/  # 因为jack.txt在jack目录下面
-bash: cd: /home/jack/: Permission denied

我们发现:在jack用户下,对jack目录的权限是:

结论:如果我们要对目录内的文件进行操作,就必须具备对该目录相应的权限。

如果我们想让xh能够进入这个目录,我们需要在jack用户下面,修改对jack目录的操作权限。

[jack@xq100 home]$ chmod 770 jack  # 在jack目录下面 修改文件权限770
[jack@xq100 home]$ ll
drwxrwx---. 5 jack    police    158 Aug 28 19:15 jack

我们再在xh用户下面进入jack目录:

[xh@xq100 ~]$ cd /home/jack/
[xh@xq100 jack]$ ll
total 4
-rw-r--r--. 1 jack police 6 Aug 28 19:06 jack.txt

我们发现可以进入。由于jack和xh都是属于police组。所以xh可以对文件进行读操作,但是不能进行写操作。

我们需要在jack用户下面,给jack.txt文件添加当前组的写操作权限。

[jack@xq100 home]$ cd jack/
[jack@xq100 ~]$ chmod g+w jack.txt 
[jack@xq100 ~]$ ll
total 4
-rw-rw-r--. 1 jack police 6 Aug 28 19:06 jack.txt

这样xh用户就可以对jack.txt进行写操作了。我们切入到xh目录下面:

[xh@xq100 jack]$ ll
total 4
-rw-rw-r--. 1 jack police 6 Aug 28 19:06 jack.txt

我们发现,xh对当前jack.txt文件也可以进行写操作了。

1.12 linux定时任务调度

1.12.1 crond任务调度快速入门

我可以使用crontab命令进行定时任务调度的设置。何为任务调度?

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

任务调度的分类:

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

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

基本语法:crontab [选项]

常用选项:

-e: 编辑定时任务

-l:查询定时任务

-r:删除当前用户的所有定时任务

需求:创建一个定时任务,将etc目录下面的文件列表查询出来,追加到/tmp/etc.txt文件中,并每分钟执行1次。

[root@xq100 tmp]# crontab -e

输入任务调度内容:

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

然后按esc键,保存并退出。

我们在/tmp下面查看,是否存在etc.txt。我们发现存在的。

如果我们把这个文件删除,一分钟之后。这个文件又会被创建出来。

[root@xq100 tmp]# rm -f etc.txt 
[root@xq100 tmp]# date
Mon Aug 29 21:46:52 CST 2022
[root@xq100 tmp]# date
Mon Aug 29 21:47:01 CST 2022  #过去了1分钟
[root@xq100 tmp]# ll
total 1188
-rw-r--r--. 1 root root  16802 Aug 29 21:47 etc.txt  # 删除的文件又出现了 因为1分钟之后,任务调度又出现了

1.12.2 crond任务调度的时间规则

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

1.12.3 crond任务调度实例

案例1:每隔1分钟,将当前的日期信息追加到/tmp/mydate.txt文件中。

[root@xq100 tmp]# */1 * * * * date >> /tmp/mydate.txt

案例2:每隔1分钟,将将当前的日期和日历都追加到/home/mycal.txt文件中。

分析:由于现在有获取当前的日期和日期两个指令,所以我们可以将这两条命令定义在脚本里面。然后再通过定时任务调度去执行脚本即可。

[root@xq100 home]# cd /home
[root@xq100 home]# vim my.sh

在my.sh里面编辑:

date >> /home/mycal.txt
cal >> /home/mycal.txt

按ESC,保存并退出。但是我们发现这个脚本,root没有执行权限。

我们需要修改脚本的权限,使当前用户root能够对脚本进行执行。

[root@xq100 home]# chmod u+x my.sh

接下来我们需要动态执行脚本。

[root@xq100 tmp]# crontab -e

保存并退出即可。我们查看效果:

案例3:每天凌晨2点,将mysql数据库testdb,备份到文件中。(提示:备份数据库的指令为 mysqldump -u root -p密码 数据库名称 > /home/文件名称)

第一步: crontab -e

第二步:0 2 * * * mysqldump -u root -proot testdb > /home/db.bak

还有其他几个任务调度指令,大家了解一下:

  • crontab -r :终止任务调度
  • contab -l :列出当前有哪些任务调度

  • service crond restart [重启任务调度]

1.12.4 at任务调度机制的简单介绍

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

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

  3. at命令是一次性定制的计划任务,执行完一个任务后就不再执行此任务了。

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

    ps -ef | grep atd

下面我们用一幅图来说明at任务调度机制:

  • at时间定义:
格式含义举例
HH:MM当天 HH:MM 执行,若当天时间已过,则在明天 HH:MM 执行当天 4:00 (若超时则为明天 4:00):
4:00
英文粗略时间单次midnight(午夜,00:00)、noon(中午,12:00)、teatime(下午茶时间,16:00) tomorrow(明天)midnight、noon、teatime
英文月名A 日期B [年份C]C年A月B日执行在 2018 年 1 月 15 日执行:
January 15 2018
日期时间戳形式绝对计时法
时间+日期
时间:HH:MM
日期:MMDDYYMM/DD/YYMM.DD.YY
在 2018 年 1 月 15 日执行:
01151801/15/1801.15.18
now + 数量 单位相对计时法
以 minutes、hours、days 或 weeks 为单位
5 天后的此时此刻执行:
now + 5 days

1.12.5 at任务调度实例

  • 常用选项

语法格式:

at [选项] [时间]

at > 命令(输入两次 Ctrl + D)

释义:

第一行:at 指令输入结束后,回车到下一行输入指令
第二行:开头的 at> 无需输入,是系统自动添加的
命令输入结束后:Ctrl + D 结束命令的输入,要输入两次

  • 两天后的下午6点执行ll命令
  • 使用atq命令,查看系统中有没有执行工作任务
[root@xq100 home]# atq
1	Wed Aug 31 17:00:00 2022 a root
2	Wed Aug 31 18:00:00 2022 a root
  • 明天17点钟,输出时间都指定文件内,比如/home/date100.log
[root@xq100 home]# at 5pm tomorrow
at> date > /home/date100.log<EOT>
job 4 at Tue Aug 30 17:00:00 2022
  • 2分钟后,输出时间到指定文件内,比如/home/dat200.log
[root@xq100 home]# at now + 2 minutes
at> date > /home/date200.log<EOT>
job 5 at Mon Aug 29 23:24:00 2022

使用atq查看队列任务:

2分钟之后,我们再次查看队列任务:

我们发现5号任务没有了,因为5号任务被执行了。所以被移出队列了。

  • 删除已经设置好的任务
[root@xq100 home]# atq
1	Wed Aug 31 17:00:00 2022 a root
2	Wed Aug 31 18:00:00 2022 a root
4	Tue Aug 30 17:00:00 2022 a root
[root@xq100 home]# atrm 1  # 删除1号任务
[root@xq100 home]# atq
2	Wed Aug 31 18:00:00 2022 a root
4	Tue Aug 30 17:00:00 2022 a root

1.13 linux磁盘分区

1.13.1 linux磁盘分区机制

1.13.1.1 磁盘分区和linux文件系统的关系
  1. Linux 系统中的文件系统的总体结构是一定的:只有一个根目录,根目录下的目录结构独立且唯一(如 /boot、/dev、/bin、/etc 目录等都是唯一的),Linux 中的磁盘分区都是文件系统中的一部分。
  2. 计算机的硬盘可以有多个、磁盘上的分区也可以有多个。
    但每个磁盘要想连接到 Linux 系统中,需要将分区“映射”到文件系统的某一个目录下,这样访问目录即可访问对应硬盘分区,这种映射称为“挂载”。
  3. 任何目录或其父目录都要挂载到硬盘的某个分区下。如需要将某一分区挂载到根目录下,Linux 系统才能正常工作。
  4. 某个分区所挂载的目录,称为此分区的挂载点。
  5. 磁盘的不同分区可以挂载到 Linux 文件系统的不同分区下,但不能同时挂载到一个相同的目录。

我们可以去查看一下具体的磁盘分区信息吗?我们可以使用lsblk命令来查看详细的磁盘分区信息:

[root@xq100 home]# lsblk
1.13.1.2 linux硬盘标识

Linux 硬盘有两种:IDE 硬盘SCSI 硬盘

  • 对于 IDE 硬盘:驱动器标识为:hdx~
    • hd 表示分区所在设备的类型,这里hd= IDE 硬盘
    • x 为盘号,区分不同硬盘间的功能
标识功能
a基本盘
b基本从属盘
c辅助主盘
d辅助从属盘

​ ○ ~ 为分区号,区分同一硬盘上不同分区的功能

标识功能
1-4主分区 或 扩展分区
5逻辑分区
  • 对于 SCSI 硬盘:驱动器标识为:sdx~
    • sd 表示分区所在设备的类型,这里sd= SCSI 硬盘
    • x 为盘号,区分不同硬盘间的功能(盘号功能标识同 IDE 硬盘 a代表第一块硬盘 b代表第二块硬盘c代表第三块硬盘 d代表第四块硬盘)
    • ~ 为分区号,区分同一硬盘上不同分区的功能(分区号功能标识同 IDE 硬盘)

我们也可以查看分区的详细信息:

[root@xq100 ~]# lsblk -f
NAME   FSTYPE  LABEL           UUID                                 MOUNTPOINT
sda                                                                 
├─sda1 xfs                     72921afb-f2fa-4b12-9338-28b31d19d15a /boot
├─sda2 swap                    6b47cbdc-9db2-4e27-9309-3898c51b3d5f [SWAP]
└─sda3 xfs                     569b448b-1d35-47d6-929d-ad256d81d19d /
sr0    iso9660 CentOS 7 x86_64 2019-09-11-18-50-31-00 

NAME:驱动器标识

FSTYPE:文件系统类型

LABLE:文件系统 LABLE

UUID:分区唯一标识符,格式化磁盘后,会给分区分配一个32位的唯一的字符串

MOUNTPOINT:挂载点

1.13.2 磁盘挂载的案例

需求:下面我们以增加一块硬盘来熟悉磁盘的相关指令,深入理解磁盘分区、卸载、挂载的概念。

  • 新增硬盘

如何添加硬盘?

我们右键虚拟机,点击设置。

点击添加:

点击下一步:

点击下一步:

点击下一步,设置磁盘容量:

点击下一步,完成。此时我们可以看到我们新增加的硬盘:

点击确定,完成。然后我们重启系统。

此时我们通过lsblk指令,我们可以查看到硬盘的详细信息:

  • 给新增的硬盘分区

接下来,我们需要给这块硬盘进行分区操作(我们就分1个分区)。我们知道,linux会把设备映射成文件,并将文件保存在/dev目录下面。

我们可以查看:

接下来我们就进行分区的具体操作:

[root@xq100 ~]# fdisk /dev/sdb

接下来我们进行分区的细节设置:

接下来我们使用lsblk命令来查看分区的具体信息:

在/dev目录下面,也有对应的文件描述sdb1:

现在的分区可以挂载吗?不可以,因为我们的磁盘分区还没有格式化!

  • 格式化磁盘分区

接下来,我们使用格式化命令来对磁盘分区进行格式化:

[root@xq100 ~]# mkfs -t ext4 /dev/sdb1   #格式化分区
[root@xq100 ~]# lsblk -f  # 查看分区详细信息
  • 挂载分区

接下来,我们要将分区进行挂载,挂载到哪里去,挂载到指定的目录下面。所以我们需要先创建一个目录。我们在根目录下面创建一个目录newdisk(当前我们可以在任意地方定义需要被挂载的目录,并不一定在根目录)。

[root@xq100 ~]# cd /
[root@xq100 /]# mkdir newdisk
[root@xq100 /]# mount /dev/sdb1 /newdisk/   # 将sdb1磁盘分区挂载到newdisk目录
[root@xq100 /]# lsblk -f

此时我们在查看磁盘分区情况:

如果我们不想让当前分区sdb1和newdisk目录挂载了。我们可以卸载分区:

命令: umount /dev/sdb1或者 umount newdisk

注意:用命令行挂载的方式重启后会失效!!!,也就是说这种挂载关系是临时的。

如果我们想实现永久挂载呢?我们可以通过修改/etc/fstab文件实现永久挂载。添加完成后,执行mount -a(或者reboot)即刻生效。

[root@xq100 /]# vim /etc/fstab

编辑如下:

然后保存并退出。

1.13.3 磁盘情况查询指令

  • 查询整个磁盘占用情况
[root@xq100 ~]# df -h
  • 查询指定目录的磁盘占用情况

比如我们想查看/opt/目录情况。

语法: du -h [目录]

-s指定目录大小汇总
-h带计量单位
-a含文件
–max-depth=1子目录深度
-c列出明细的同时,增加汇总值
[root@xq100 opt]# du -h --max-depth=1 /opt
0	/opt/rh
208M	/opt/vmware-tools-distrib
277M	/opt  # 汇总opt目录下面的磁盘占用情况

汇总和含文件查询:

[root@xq100 opt]# du -hac --max-depth=1 /opt
0	/opt/rh
69M	/opt/VMwareTools-10.0.0-2977863.tar.gz
208M	/opt/vmware-tools-distrib
277M	/opt
277M	total

1.13.4 磁盘操作实用指令

  • 统计/opt文件夹下文件的个数
[root@xq100 opt]# ll
total 69852
drwxr-xr-x. 2 root root        6 Oct 31  2018 rh
-rw-r--r--. 1 root root 71524872 Aug 12  2015 VMwareTools-10.0.0-2977863.tar.gz
drwxr-xr-x. 9 root root      175 Aug 12  2015 vmware-tools-distrib
[root@xq100 opt]# ls -l /opt | grep "^-" | wc -l  # "^-" 以文件开头  wc -l 统计个数
1
  • 统计/opt文件夹下目录的个数
[root@xq100 opt]# ls -l /opt | grep "^d" | wc -l   # "^d" 以文件目录开头  wc -l 统计个数
2
  • 统计/opt文件下的文件的个数,包括子文件夹下的
[root@xq100 opt]# ls -lR /opt | grep "^-" | wc -l  # R 代表递归
3148
  • 统计/opt文件夹下的目录的个数,包括子文件夹下的
[root@xq100 opt]# ls -lR /opt | grep "^d" | wc -l
853
  • 以树状结构显示目录结构(如果没有tree,则使用 yum install tree 安装)
[root@xq100 opt]# tree /home
bash: tree: command not found...  # 需要安装tree指令
[root@xq100 opt]# yum install tree
[root@xq100 opt]# tree /home  # 以树状的形式展示目录结构

1.14 Linux NAT网络配置

1.14.1 linux NAT网络原理

前面我们在安装linux的时候,我们指定网络的连接方式是NAT模式,那么这一节,我们就来研究NAT网络模式的原理。现在大家思考一个问题,为什么我们可以在linux操作系统里面访问外网(比如访问百度)?接下来我们通过一幅图来理解:

解读:

首先我们查看虚拟机上linux操作系统的地址:

接下来我们再看看我们vmnet8的ip地址和以太网的ip地址:

在windows操作系统里面使用ipconfig命令:

vmnet8的ip:

以太网的ip:

接下来我们来互相ping一下,看能否ping通。

在windows操作系统里面ping linux的ip地址:

C:\Users\kriss>ping 192.168.10.137

正在 Ping 192.168.10.137 具有 32 字节的数据:
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.137 的回复: 字节=32 时间<1ms TTL=64

192.168.10.137 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

我们发现可以ping通过,接下来我们在linux操作系统里面ping wmnet8的ip地址:

[root@xq100 ~]# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.188 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.162 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=0.141 ms
64 bytes from 192.168.10.1: icmp_seq=5 ttl=64 time=0.175 ms

如果ping不同,就是windows防火墙的问题,我们关闭防火墙即可。

我们在linux操作系统里面也可以直接ping通以太网,说明linux和vmnet8之间是可以互通的。

我们可以在linux里面ping通以太网的地址:

[root@xq100 ~]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=128 time=0.479 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=128 time=0.439 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=128 time=0.292 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=128 time=0.386 ms

由于以太网可以通过网关连接外部的互联网,所以我们通过linux操作系统可以连接外部的网络了。

1.14.2 linux网络配置的指令

  • ipaddr 在linux查看ip地址
  • ifconfig 在linux查看ip地址
  • ping 是否ping通指定的ip地址
  • ipconfig 在windows操作系统里面查看网络的ip地址

1.14.3 linux网络环境配置(固定ip的方式)

默认情况下,我们linux操作系统ip获取的方式是自动获取的方式,我们可以查看自己linux操作系统,看看ip的获取方式:

这种自动获取ip的方式不需要任何设置就可以实现,但是非常容易造成ip冲突,而且在公司里面,我们一般都会将linux操作系统的ip地址固定下来,所以接下来我们需要手动固定linux操作系统的ip地址。

  • 第一步 编辑我们linux的网卡文件

这个网卡文件在/etc/sysconfig/network-scripts/ifcfg-ens33

打开这个文件,进行编辑

  • 编辑网卡文件ifcfg-enss33
  • 重启网络服务(systemctl restart network)或者重启系统(reboot)

1.14.4 设置主机名和host映射

为了方便记忆,我们可以给linux系统设置主机名,也可以根据需要修改主机名。

我们可以通过hostname查看主机名的名称。

也可以修改/etc/hostname指定主机名名称。注意,修改完成之后,需要重启linux系统才能生效。

思考:前面我们可以通过ping linux的ip地址能ping通linux。那么我们可不可以通过ping linux的主机名 来ping通linux呢,答案是不可以的。

所以我们需要将主机名称和ip地址进行映射,如何映射?我们需要修改windows的hosts文件。找到C:\Windows\System32\drivers\etc下面的hosts文件,进行相关的编辑:

192.168.10.130 xq100  # ip地址是linux的ip地址

我们如何在linux里面通过本机的主机名来ping通主机呢?我们需要编辑/etc/hosts文件:

192.168.10.1  DESKTOP-EKI0P48   # ip是vmnet8的ip地址  后面的是windows的主机名称
[root@xq100 ~]# vim /etc/hosts
[root@xq100 ~]# ping DESKTOP-EKI0P48

注意:如果ping不通,需要关闭windows的防火墙。

思考:为什么通过主机名(域名)就能找到对应的ip地址呢,接下来我们就分析一下主机名(域名)解析机制:

应用实例:用户在浏览器输入www.baidu 如何找到百度服务器地址的?

1、浏览器先检查浏览器缓存中有没有该域名解析ip地址,有就先调用这个ip完成域名解析。如果没有就检查DNS解析器缓存,如果有就直接返回ip完成解析。这两个缓存可以理解为本地解析器缓存。

2、如果本地解析器缓存没有找到对应的映射,再去检查系统中的hosts文件中有没有配置对应的域名ip映射,如果有,就完成域名解析。

3、如果本地DNS缓存和hosts文件中均没有找到对应的ip,则到DNS域名服务器完成域名解析。

4、如果公网的DNS域名解析器也没有完成域名解析,就返回资源找不到的信息。

1.15 linux进程管理

1.15.1 进程的基本介绍

在linux中,每个执行的程序都为一个进程,每个进程都分配了一个id号(pid,进程号)。

每个进程都可能以两种形式存在,前台后台,所谓前台进程就是及用户在目录上可以进行操作的(占用屏幕 比如我们的top指令),后台是无法在屏幕上操作的进程。
一般系统的服务进程都是以后台进程的方式存在,而且会常驻在系统中直到关机才结束。

1.15.2 查看系统运行的进程

ps命令是用来查看系统中哪些正在运行,以及他们的运行的状况,可以不加任何参数。

[root@xq100 ~]# ps
   PID TTY          TIME CMD
  2137 pts/0    00:00:00 bash
  4166 pts/0    00:00:00 ps
字段说明
PID进程识别号
TTV终端机号
TIME此进程所消耗cpu时间
CMD正在执行命令或进程名

我们也可以加上下面几个参数,来查看进程信息

ps -a:显示终端所用的进程信息

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

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

[root@xq100 ~]# ps -aux | more

我们对上面查询的信息进行详细解释:

USER: 进程所属的用户名称。

PID:进程号。

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

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

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

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

STAT:进程状态,S-代表睡眠 R-正在运行 D-短期等待 Z-僵死进程 T-被停止的线程。

START:进程启动的时间。

TIME:进程使用CPU的时间。

COMMAND:进程启动所需要的命令和参数。

1.15.3 进程的应用实例

需求:以全格式显示当前的所有进程,查看进行的父进程。查看sshd的父进程信息。

  • ps -ef 以全格式查看所有进程信息。
  • -e 显示所有进程 -f 全格式显示。
  • 查看指定进程信息 ps -ef | grep sshd

也就是说sshd进程的进程id是1328.其父进程id是1。1928的进程的父进程是进程id为1328的进程。那么id为1的进程是什么样的呢,我们可以使用ps -ef | more的命令查看:

1.15.4 终止进程

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

基本语法:

kill [选项] 进程号 :通过进程号杀死/终止进程。

killall:会杀死当前进程和其子进程。

常用选项:

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

  • 需求1:强制让登陆用户kobe下线

我们首先在xshell终端使用kobe登陆。然后在另外一个终端使用root用户登录,并在root用户下面执行指令:ps -aux | grep sshd。

此时我们发现kobe用户的进程id是6940.我们在root用户下面使用kill命令来终止这个进程。

[root@xq100 ~]# kill 6940

回到Xshell,我们发现kobe这个用户已经被注销了。

  • 需求2:终止远程登录服务sshd。不允许远程登录。然后重启sshd服务,允许远程登录。

我们发现,sshd的进程id是1328.我们kill掉这个进程。

[root@xq100 ~]# kill 1328

我们使用Xshell远程登录,发现不起作用了。此时我们可以使用/bin/systemctl start sshd.service重启ssd服务,这样就可以再次远程登录了。

[root@xq100 ~]# /bin/systemctl start sshd.service
[root@xq100 ~]# ps -aux | grep sshd
root       7395  0.3  0.2 112920  4316 ?        Ss   21:48   0:00 /usr/sbin/sshd -D
root       7403  0.0  0.0 112712   960 pts/1    R+   21:48   0:00 grep --color=auto sshd
  • 需求3:终止多个gedit(记事本打开文件的进程),演示killall。

我们在linux图形化界面里面打开多个记事本。然后在Xshell里面使用killall 命令:

[root@xq100 ~]# killall gedit

此时记事本打开的文件就会自动被关闭。

  • 需求4:强制杀掉一个终端

比如我们在linux图形化界面里面开启两个命令 终端:

现在我们使用ps命令来查看两个终端的进程信息:

[root@xq100 ~]# ps -aux | grep bash

比如我们现在想杀死id为7946的进程,我们使用kill 7946。发现没有任何反应,因为linux认为这个命令终端是正常运行的,不允许我们杀掉。此时我们需要加上-9参数来强制杀掉。

[root@xq100 ~]# kill -9 7946  #可以强制杀掉另一个命令终端

1.15.5 查看进程树

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

-p:显示进程的PID。

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

  • 案例1:以树状的形式显示进程的pid
[root@xq100 ~]# pstree  # 显示进程树
[root@xq100 ~]# pstree -p  # 显示进程树(携带进程号)
  • 案例2:以树状的形式展示进程的用户信息
[root@xq100 ~]# pstree -u

1.16 linux服务管理

service(本质)就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如说(mysql3306,sshd22,redis6379),因为我们又称为守护进程,在Linux中是重要的知识点。

下面我们用一幅图来解释什么是守护进程:

1.16.1 service管理指令

  • service 服务名 [start|stop,reload,status]
  • 在CentOs7.0后,很多服务不再使用Service,而是systemctl
  • service 指令管理的服务在/etc/init.d查看

我们可以简单使用一下,比如查看network服务的状态:

[root@xq100 init.d]# service network status
Configured devices:
lo ens33
Currently active devices:
lo ens33 virbr0

案例:使用service指令,查看,关闭启动network**[注意在虚拟系统演示时:因为网络连接会关闭]**

[root@xq100 ~]# service network stop  # 此时Xshell连接linux会连接不上
[root@xq100 ~]# service network start  #重启网络服务  此时Xshell会连接上linux
  • 更多的系统服务,我们可以通过setup指令去查看
[root@xq100 init.d]# setup

选择系统服务,回车,我们可以看到系统服务的详细信息:

注意:

  1. [*] 代表这些系统服务会随着开机自启动而启动
  2. 如果我们想去掉星号或者加上星号,上下按键切换到对应的服务按空格键即可。
  3. 使用Tab键选择OK或Cancel.

1.16.2 chkconfig指令

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

chkconfig指令管理的服务在 /etc/init.d查看。

注意:在Centos 7.0以后,很多服务使用systemctl管理。

基本用法

  • 查看服务 chkconfig --list[|grep “”]
  • 设置服务在指定级别启动/关闭 chkconfig --level network on/off

我们现在罗列出使用chkconfig指令管理的服务信息:

[root@xq100 ~]# chkconfig --list
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
vmware-tools   	0:off	1:off	2:on	3:on	4:on	5:on	6:off
vmware-tools-thinprint	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@xq100 ~]# chkconfig --list | grep network  #查看指定服务在运行级别是否开启关闭
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

注意: 上面的数字代表linux的运行级别。

案例:对于network服务,进行各种操作,把network在3运行级别,关闭自启动。

[root@xq100 ~]# chkconfig --level 3 network off 关闭
[root@xq100 ~]# chkconfig --level 5 network on 打开

注意:chkconfig重新设置服务自启动或者关闭,需要重启机器reboot生效。

1.16.3 systemctl服务管理指令

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

  • 服务启动/停止/重启/重载/查看状态: systemctl [start | stop | restart | status] 服务名

  • 查看所有服务的自启动状态

[root@xq100 system]# systemctl list-unit-files | grep firewall
firewalld.service enabled 
[root@xq100 system]# systemctl status firewalld.service  # 查看防火墙状态
[root@xq100 system]# systemctl stop firewalld.service  # 停止防火墙状态
[root@xq100 system]# systemctl restart firewalld.service  # 重启防火墙

服务的状态如下:

masked 此服务禁止自启动
static 该服务无法自启动,只能作为其他文件的依赖
enabled 已配置为自启动
disabled 未配置为自启动

  • 查看某一服务是否自启动
[root@xq100 system]# systemctl is-enabled firewalld.service # 知道完整服务名
enabled
  • 设置服务自启动 (服务运行级别 3、5)
[root@xq100 system]# systemctl enable firewalld.service
  • 设置服务禁用自启动 (服务运行级别 3、5)
[root@xq100 system]# systemctl disable firewalld.service

1.16.4 firewall防火墙指令

防火墙的核心功能:打开或关闭对应端口。关闭端口,则外部的数据请求不能通过对应的端口,与服务器上的程序进行通信
在真正的生产环境,为保证安全,需要启动防火墙并配置打开和关闭的端口。

基本语法:

  • 打开端口/允许协议
    firewall-cmd --permanent --add-port=端口号/协议
  • 关闭端口/禁用协议
    firewall-cmd --permanent --remove-port=端口号/协议
  • 查询端口/协议是否开启
    firewall-cmd --query-port=端口/协议
  • 查询防火墙所有开放的端口/协议配置
    firewall-cmd --list-ports
  • 重载防火墙
    firewall-cmd --reload
[root@xq100 system]# firewall-cmd --query-port=3306/tcp  # 查询防火墙是否开启3306端口
no
[root@xq100 system]# firewall-cmd --list-ports  # 查看防火墙开放的端口有哪些

[root@xq100 system]# firewall-cmd --permanent --add-port=3306/tcp  # 开放防火墙对3306端口的访问权限
success
[root@xq100 system]# firewall-cmd --reload  # 重载防火墙
success
[root@xq100 system]# firewall-cmd --list-ports
3306/tcp

1.17 动态监控

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

基本语法:

top [选项]

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

1.17.1 top指令详解

我们执行top指令:

[root@xq100 ~]# top

我们发现进程信息会每3秒钟就刷新1次。

下面我们对这些重要的指标信息进行讲解:

top -21:34:06: top命令刷新进程的时间

up:系统运行的时长

user:当前linux系统上面的用户数

load average: 负载值(三个数字相加(0.04+0.07+0.18)除以3 的值>0.7说明负载值很大)

Tasks:总进程数

ruuning: 正在运行的进程数

sleeping:休眠的进程数

stopped:停止的进程数

zombie:僵死的进程数

%(CPU): CPU负载百分比 us:用户占用cpu百分比 sy:系统占用cpu百分比 id:空闲cpu百分比

Mem:描述内存占用情况 total:总共内存 free 空余内存 used:使用了的内存 buff/cache:缓存

Swap:描述交换区内存占用情况

1.17.2 top指令的交互操作

当我们输入top命令之后,我们可以按下面的字符来进行对应的交互操作。

交互操作说明:

操作功能
P以CPU使用率来排序,默认就是此项
M以内存使用来排序
N以PID排序
q退出top

应用实例:

1.监控特定用户,比如我们监控jack用户(前提是jack登录了)

先输入top指令,然后按小写的u,最后输入jack然后回车,查看执行的进程。

最后查看效果:

2.终止指定的进程,比如我们要结束jack登录

top:输入此命令,然后回车,查看执行的进程

k:然后输入要结束的进程ID号 回车之后输入9 强制删除。

接下来还要输入信号量:

此时我们发现jack没强制下线。

3.指定系统状态更新的时间(没隔10秒自动更新),默认是3秒

[root@xq100 ~]# top -d 10  # 每10秒刷新1次

1.17.3 监控网络状态

基本语法: netstat [选项]

选项说明 -an 按照一定的属性排列输出 -p 显示哪个进程在调用

[root@xq100 ~]# netstat -anp | more

Local Address:本机linux的ip地址

Foreign Address:外部的网络地址

tcp:网络协议

127.0.0.1 / 0.0.0.0: 当前linux机器的本地地址

631/25/6060…:应用程序监听的端口号

State: LISTEN 监听状态 ESTABLISHED:建立连接的状态

PID:应用程序的进程号 Program name: 应用程序的名称

如何理解Foreign Address呢?

我们可以通过一幅图来理解:

应用案例:

查看服务名称为sshd的服务信息。

[root@xq100 ~]# netstat -anp | grep sshd

1.18 rpm与yum

1.18.1 rpm

rpm是互联网下载包和打包和安装工具,他包含在某些linux分版中,他具有生产.rpm扩展名的文件,RPM是redhat package manage(软件包管理工具的缩写),类似于setup.exe

我们看看rpm相关的指令:

  • 查询所有安装的rpm列表
[root@xq100 ~]# rpm -qa
[root@xq100 ~]# rpm -qa | more # 分页展示所有的rpm列表
  • 查询当前系统中是否安装了指定的软件
[root@xq100 ~]# rpm -qa | grep firefox # 查询linux系统中是否已经安装了火狐浏览器
firefox-60.8.0-1.el7.centos.x86_64

一个rpm包的名称命名规则:

firefox:rpm包名

60.8.0-1.el7:rpm包的版本号

centos:rpm包适用于的操作系统

x86_64:适用于64位的操作系统。(如果是i686或者i386说明适用于32位操作系统,noarch表示通用。)

  • 查看软件包是否安装
[root@xq100 opt]# rpm -q firefox  # 查看火狐浏览器是否存在rpm包(安装)
firefox-60.8.0-1.el7.centos.x86_64
  • 查询软件安装的详细信息
[root@xq100 opt]# rpm -qi firefox   # 查询火狐浏览器的详细安装信息
Name        : firefox
Version     : 60.8.0
Release     : 1.el7.centos
Architecture: x86_64
Install Date: Thu 18 Aug 2022 02:50:39 PM CST
Group       : Unspecified
Size        : 218777805
License     : MPLv1.1 or GPLv2+ or LGPLv2+
Signature   : RSA/SHA256, Fri 12 Jul 2019 11:01:23 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : firefox-60.8.0-1.el7.centos.src.rpm
Build Date  : Fri 12 Jul 2019 02:04:42 AM CST
Build Host  : x86-01.bsys.centos
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos>
Vendor      : CentOS
URL         : https://www.mozilla/firefox/
Summary     : Mozilla Firefox Web browser
Description :
Mozilla Firefox is an open-source web browser, designed for standards
compliance, performance and portability.
  • 查看rpm包安装之后的文件
[root@xq100 opt]# rpm -ql mariadb-libs-5.5.64-1.el7.x86_64
  • 查看指定的文件所属的rpm包
[root@xq100 opt]# rpm -qf /etc/myf  # 查询/etc目录下面的myf文件所属的rpm包
mariadb-libs-5.5.64-1.el7.x86_64

如果某一个rpm包我们不想要了,我们也可以卸载。

[root@xq100 opt]# rpm -e firefox  #删除firefox

注意:如果其它的软件包依赖于要删除的软件包,卸载时则会产生错误。此时如果我们想强制删除,可以添加另外的参数–nodeps。

[root@xq100 opt]# rpm -e --nodeps firefox  #删除firefox
  • 安装rpm包

基本语法: rpm -ivh RPM包全路径名称

几个参数:

i=install 安装

v=verbose 提示

h=hash 进度条

案例:使用rpm命令安装firefox

[root@xq100 ~]# rpm -e firefox  # 删除firefox
[root@xq100 ~]# rpm -q firefox  # 查询firefox是否删除成功
package firefox is not installed

接下来我们需要去下载rpm包,其实linux操作系统内置了firefox的安装包,我们打开光驱:

然后找到Packages目录:

然后打开Packages目录,找到firefox的rpm包:

将其拷贝至/opt目录下面:

最后我们安装rpm包:

[root@xq100 ~]# rpm -ivh /opt/firefox-60.8.0-1.el7.centos.x86_64.rpm 

最后我们发现firefox又安装成功了。

1.18.2 yum

Yum是一个Shell前端软件包管理器,基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,并且可以自动处理依赖性关系,并且一次安装所有的依赖软件包。下面我们用一副图来理解yum命令:

基本指令

查询yum服务器上是否有需要安装的软件:

yum install | grep xxx软件列表

下载并安转指定的yum包:

yum install xxx 的rpm包名

案例:使用yum命令安装firefox

[root@xq100 opt]# rpm -e firefox  #删除firefox  此时我们发现linux服务器里面的火狐浏览器不存在了
[root@xq100 opt]# rpm list | grep firefox # 查看服务器上是否存在指定的rpm包
firefox.x86_64                            60.8.0-1.el7.centos          @anaconda
firefox.i686                              91.12.0-2.el7.centos         updates  
firefox.x86_64                            91.12.0-2.el7.centos         updates 
[root@xq100 opt]# yum install firefox.x86_64  # 下载并安装firefox,我们再查看linux服务器里面的火狐浏览器,发现又有了

1.19 常用软件的安装

1.19.1 安装JDK8

  • 第一步:在/opt目录下面创建jdk文件夹
[root@xq100 ~]# mkdir /opt/jdk
  • 第二步:使用ftp上传工具上传jdk的安装压缩包,上传成功之后如下:
[root@xq100 ~]# cd /opt/jdk
[root@xq100 jdk]# ll
total 185312
-rw-r--r--. 1 root root 189756259 Sep  3 16:38 jdk-8u161-linux-x64.tar.gz  # 这就是上传之后的jdk的压缩文件
  • 第三步:解压压缩文件
[root@xq100 jdk]# tar -zxvf jdk-8u161-linux-x64.tar.gz

解压之后效果如下:

jdk的下载地址是:

链接:https://pan.baidu/s/1u3misQGlL9JHqpXnqdLtzw 
提取码:42gk 
  • 第四步:在/usr/local目录下面创建java文件夹
[root@xq100 java]# mv /opt/jdk/jdk1.8.0_161/ /usr/local/java  # 拷贝解压的文件至java文件夹
[root@xq100 java]# ll
total 0
drwxr-xr-x. 8 10 143 255 Dec 20  2017 jdk1.8.0_161
  • 第五步:配置环境变量

编辑配置文件/etc/profile

[root@xq100 java]# vim /etc/profile

在文件的最后追加:

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

保存并退出,然后让编辑之后的profile文件生效:

[root@xq100 java]# source /etc/profile  # 让编辑之后的profile文件生效
[root@xq100 java]# java -version  # 查看jdk的版本号
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
  • 第六步: 编写一个java文件测试是否正常运行
[root@xq100 kobe]# javac Hello.java # 编译java文件
[root@xq100 kobe]# java Hello  # 执行class字节码文件
Hello World

1.19.2 安装mysql5.7

1.19.2.1 mysql的安装

第一步: 切换到opt目录,下载mysql的rpm包

[root@java2201 opt]# cd /opt
[root@java2201 opt]# wget https://dev.mysql/get/mysql57-community-release-el7-11.noarch.rpm

注意: 如果wget命令不可用,我们需要安装wget命令

[root@java2201 opt]# yum -y install wget

下载成功之后,我们会发现:

第二步:安装mysql的yum源

[root@java2201 opt]# yum -y localinstall mysql57-community-release-el7-11.noarch.rpm 

第三步:在线安装mysql

[root@java2201 opt]# rpm --import https://repo.mysql/RPM-GPG-KEY-mysql-2022
[root@java2201 opt]# yum -y install mysql-community-server  # 在线安装mysql

整个安装过程需要一点时间,请耐心等待。

第四步:启动mysql服务

[root@java2201 opt]# systemctl start mysqld

我们可以查看mysql服务启动之后的状态:

第五步:设置mysql服务开机自启动

[root@java2201 opt]# systemctl enable mysqld
[root@java2201 opt]# systemctl daemon-reload

第六步,修改root登录密码

mysql安装完成之后,会在/var/log/mysqld.log文件中给root生成了一个临时的默认密码。

[root@java2201 opt]# vi /var/log/mysqld.log 

复制此密码,使用此密码登录root。(mysql -u root -p)

粘贴密码之后,回车进入到mysql服务器:

修改密码, mysql5.7默认密码策略要求密码必须是大小写字母数字特殊字母的组合,至少8位

mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin123!';  #密码自定义

第七步:运行远程登录

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Admin123!' WITH GRANT OPTION;
mysql>exit  # 退出mysql

第八步:防火墙开放3306端口

[root@java2201 opt]# firewall-cmd --permanent --add-port=3306/tcp  # 开放防火墙对3306端口的权限
[root@java2201 opt]# firewall-cmd --reload  # 重载防火墙服务
[root@java2201 opt]# firewall-cmd --list-ports  # 查看防火墙开发的端口有哪些
3306/tcp

第九步:配置mysql默认编码为utf-8

修改/etc/myf配置文件,在[mysqld]下添加编码配置:

character_set_server=utf8

init_connect=‘SET NAMES utf8’

:wq保存退出

第十步:重启MySQL

[root@java2201 opt]# systemctl restart mysqld

第十一步:登录root用户查看编码

mysql> show variables like '%character%';

第十二步,测试远程连接

0

到这里,在linux操作系统里面安装mysql就成功了。

1.19.2.2 如何修改root密码

如果我们不小心忘记了root账户的密码,那么如何重置root账户的密码呢?

第一步:修改mysql的配置文件/etc/myf。设置免密登录。然后重启mysql服务。

[mysqld]
skip-grant-tables=1   # 设置免密登录
[root@java2201 ~]# systemctl restart mysqld

第二步:无需使用密码,登录数据库。

[root@java2201 ~]# mysql -u root  # 不带密码就可以实现数据库的登录
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

第三步:重置密码。

mysql> use mysql;  # 切换到mysql数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set authentication_string=password('Admin2022!') where user='root';
Query OK, 2 rows affected, 1 warning (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 1

第四步:退出并修改myf,将免密登录的配置注释掉。

[mysqld]
# skip-grant-tables=1   # 把这行配置注释掉 

第五步:重启mysql服务,然后重新登录即可。

[root@java2201 ~]# systemctl restart mysqld
[root@java2201 ~]# mysql -u root -pAdmin2022!  # 使用新的密码登录
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

1.19.3 安装tomcat

  • 第一步:上传文件到/opt/tomcat

下载地址是:

链接:https://pan.baidu/s/1SpgByHyyZfkA3Ia836A4aw 
提取码:a251 
[root@xq100 opt]# mkdir /opt/tomcat
[root@xq100 opt]# cd tomcat/
[root@xq100 tomcat]# ll
total 10188
-rw-r--r--. 1 root root 10432020 Sep  3 17:02 apache-tomcat-8.5.59.tar.gz
  • 第二步:进入解压目录bin,使用./startup.sh启动tomcat
[root@xq100 tomcat]# tar -zxvf apache-tomcat-8.5.59.tar.gz
[root@xq100 tomcat]# ll
total 10188
drwxr-xr-x. 9 root root      220 Sep  3 17:03 apache-tomcat-8.5.59  # 解压之后的目录
-rw-r--r--. 1 root root 10432020 Sep  3 17:02 apache-tomcat-8.5.59.tar.gz
[root@xq100 tomcat]# cd apache-tomcat-8.5.59/bin  # 切换到tomcat解压目录中的bin目录
[root@xq100 bin]# ll
total 868
[root@xq100 bin]# ./startup.sh # 启动tomcat
Using CATALINA_BASE:   /opt/tomcat/apache-tomcat-8.5.59
Using CATALINA_HOME:   /opt/tomcat/apache-tomcat-8.5.59
Using CATALINA_TMPDIR: /opt/tomcat/apache-tomcat-8.5.59/temp
Using JRE_HOME:        /usr/local/java/jdk1.8.0_161
Using CLASSPATH:       /opt/tomcat/apache-tomcat-8.5.59/bin/bootstrap.jar:/opt/tomcat/apache-tomcat-8.5.59/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
  • 第三步:开放防火墙对8080端口的权限
[root@xq100 tomcat]# firewall-cmd --permanent --add-port=8080/tcp  # 开放8080端口
success
[root@xq100 tomcat]# firewall-cmd --reload  # 重新载入防火墙服务
success
[root@xq100 tomcat]# firewall-cmd --list-ports # 查看8080端口是否被开放
3306/tcp 8080/tcp
  • 第四步:测试tomcat是否安装成功

发送请求: http://192.168.10.130:8080 是否能够访问tomcat的首页。

2 linux进阶篇

2.1 shell编程

2.1.1 第一个shell程序

什么是shell:

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

为什么要学习shell:

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

shell脚本的编写执行方式:

  • 脚本格式要求
    • 脚本以#!/bin/bash 开头
    • 脚本需要有可执行权限
  • 脚本的常用执行方式
    • 给要执行的脚本文件,添加可执行权限
    • 直接用 sh 脚本文件名 命令执行,不用赋予脚本可执行权限

下面我们就编写并执行第一个shell脚本:

[root@xq100 ~]# pwd
/root
[root@xq100 ~]# mkdir shellCode  # 在root目录下面创建一个文件夹shellCode
[root@xq100 ~]# cd shellCode/
[root@xq100 shellCode]# ll
total 0
[root@xq100 shellCode]# vim hello.sh  #创建一个脚本文件

保存并退出。

此时我们发现脚本是没有执行权限的。

[root@xq100 shellCode]# ll
total 4
-rw-r--r--. 1 root root 31 Sep  5 20:51 hello.sh  # 当前脚本没有可执行的权限。
[root@xq100 shellCode]# ./hello.sh  # 执行脚本
-bash: ./hello.sh: Permission denied   # 权限不足

测试解决方案有两种,一种是修改脚本的可执行权限,第二种就是使用sh + 脚本文件名的方式执行脚本。

第一种:

[root@xq100 shellCode]# chmod u+x hello.sh # 给当前hello.sh赋予可执行权限
[root@xq100 shellCode]# ll
total 4
-rwxr--r--. 1 root root 31 Sep  5 20:51 hello.sh  # 当前脚本具备可执行权限
[root@xq100 shellCode]# ./hello.sh  # 可以使用相对路径的方式执行shell脚本
Hello world
[root@xq100 shellCode]# /root/shellCode/hello.sh # 也可以使用绝对路径的方式执行shell脚本
Hello world

第二种:

我们先恢复脚本不可执行的权限。

[root@xq100 shellCode]# chmod u-x hello.sh # 让hello.sh脚本不具备可执行的权限
[root@xq100 shellCode]# ll
total 4
-rw-r--r--. 1 root root 31 Sep  5 20:51 hello.sh
[root@xq100 shellCode]# sh hello.sh # 执行脚本
Hello world

2.1.2 shell的变量

Linux 中 Shell 的变量分为系统变量和用户自定义变量。系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER 等等,比如:echo $HOME 等等。我们可以使用set命令显示当前 Shell 中所有变量。

查询指定的系统变量:

[root@xq100 shellCode]# echo $HOME
/root
[root@xq100 shellCode]# echo $PWD
/root/shellCode
[root@xq100 shellCode]# echo $SHELL
/bin/bash
[root@xq100 shellCode]# echo $USER
root

查询所有的系统变量:

[root@xq100 shellCode]# set | more  # 分页查看所有的变量信息
2.1.2.1 定义用户变量

我们在开发中,绝大多数使用的是用户自定义的变量。那么自定义变量该如何定义呢?

  • 定义变量:变量=值 (注意等号两侧没有空格)
  • 撤销变量:unset 变量
  • 声明静态变量:readonly 变量。注意:该变量不能 unset

变量的快速入门:

案例1:定义变量A

[root@xq100 shellCode]# vim vr.sh
[root@xq100 shellCode]# chmod u+x vr.sh  # 设置脚本权限
[root@xq100 shellCode]# ./vr.sh   # 执行脚本
100

还可以这么输出:

[root@xq100 shellCode]# ./vr.sh 
A=100
A=100

案例2:撤销变量A

[root@xq100 shellCode]# ./vr.sh 
A=100
A=100
A=    # 变量A被销毁了,所以值不存在了

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

[root@xq100 shellCode]# ./vr.sh 
A=100
A=100
A=
B=2  # 输出了静态变量

现在我们unset静态变量B。我们在执行脚本的时候就会报错。

[root@xq100 shellCode]# ./vr.sh 
A=100
A=100
A=
B=2
./vr.sh: line 18: unset: B: cannot unset: readonly variable   # 执行脚本的时候报错

在上面的shell脚本里面,我们的变量都是大写,那么在shell编程里面,变量定义的规则是什么呢?

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
  • 等号两侧不能有空格。
  • 变量名称一般习惯为大写,这是一个规范,大家遵守即可。

案例4:将指令返回的结果赋给变量

[root@xq100 shellCode]# ./vr.sh 
A=100
A=100
A=
B=2
C=Mon Sep 5 21:44:57 CST 2022
D=Mon Sep 5 21:44:57 CST 2022
2.1.2.2 设置环境变量
  • 基本语法
    • export 变量名=变量值:将 Shell 变量输出为环境变量/全局变量。我们通过一幅图来解释什么是环境变量/全局变量。
  • source 配置文件:让修改后的配置文件立即生效
  • echo $变量名:查询环境变量的值

案例: 定义JAVA_HOME的环境变量,并在var.sh脚本里面使用这个环境变量

[root@xq100 java]# source /etc/profile  # 让编辑之后的profile文件生效
[root@xq100 shellCode]# echo $JAVA_HOME  # 输出环境变量
/usr/local/java/jdk1.8.0_161

我们在vr.sh脚本里面测试一下:

[root@xq100 shellCode]# ./vr.sh 
java_home=/usr/local/java/jdk1.8.0_161

注意:在shell脚本里面,单行注释是#开头的。多行注释是什么样的?

:<<!
需要注释的第一行内容
需要注释的第二行内容
!

现在我们演示一下:

打开vr.sh

2.1.2.3 设置位置参数变量

当我们执行一个 Shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息。

  • 基本语法
    • $n:n 为数字,$0 代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 , 如 9 代表第一到第九个参数,十以上的参数需要用大括号,如 9{10}
    • ∗ : 代 表 命 令 行 中 所 有 的 参 数 , * :代表命令行中所有的参数, *把所有的参数看成一个整体
    • $@:代表命令行中所有的参数,不过该命令是把每个参数区分对待
    • $#:代表命令行中所有参数的个数
  • 快速入门

需求:编写一个shell脚本position.sh,在脚本中获取各个命令行的参数信息。

[root@xq100 shellCode]# vim position.sh
[root@xq100 shellCode]# chmod u+x position.sh 
[root@xq100 shellCode]# ./position.sh 100 200
0=./position.sh 1=100 2=200
命令行所有传入的参数=100 200
100 200
参数的个数=2
2.1.2.4 预定义变量

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

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

需求:在一个shell脚本里面简单使用预定义变量。

[root@xq100 shellCode]# vim preVar.sh
[root@xq100 shellCode]# chmod u+x preVar.sh 
[root@xq100 shellCode]# ./preVar.sh 
当前进程号=5682
最后的的进程号=5683
执行的值=0
[root@xq100 shellCode]# A=
B=2
C=Mon Sep 5 22:34:41 CST 2022
D=Mon Sep 5 22:34:41 CST 2022
java_home=/usr/local/java/jdk1.8.0_161

2.1.3 shell中的运算符

运算符的功能:在脚本中实现各种运算操作

基本语法:

cd /
[root@xq100 shellCode]# vim oper.sh
[root@xq100 shellCode]# chmod u+x oper.sh 

案例1:计算表达式的值

[root@xq100 shellCode]# ./oper.sh 
TOTAL=18

还有第二种写法(推荐):

[root@xq100 shellCode]# ./oper.sh 
TOTAL=18
SUM=18

还有第三种写法:

`expr m 运算符 n`
expr与运算式之间要有空格
m n必须是一个数字,并且数字和运算符之间必须要有空格。
expr 做计算,只能实现两个操作数的计算
[root@xq100 shellCode]# vim oper.sh
[root@xq100 shellCode]# ./oper.sh 
TOTAL=18
SUM=18
TEMP=2

注意:在linux中加减乘除的运算符: + 加 - 减 \*乘 / 除 % 取余数

这里我们重点演示乘以的使用:

[root@xq100 shellCode]# ./oper.sh 
TOTAL=18
SUM=18
TEMP=2
TEMP2=25

案例2:请求出命令行的两个参数的和 20 50

[root@xq100 shellCode]# ./oper.sh 20 50
TOTAL=18
SUM=18
TEMP=2
TEMP2=25
NUM=70

2.1.4 shell中的条件判断

2.1.4.1 if判断

基本语法:[ condition ] 注意:condition前后要有空格。

if [ condition ] then
   满足if语句执行的代码
fi

常用的判断条件:

(1) 字符串比较 =

(2)两个整数比较 -lt(小于) -gt(大于) -le(小于等于) -ge(大于等于) -nt(不等于)

(3)按照文件权限进行判断

​ -r 有读的权限

​ -w 有写的权限

​ -x 有可执行的权限

(4)按照文件的类型进行判断

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

​ -e 文件存在

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

应用案例:

案例1:“hello”是否等于“hello”

案例2:23是否大于等于22

案例3:/root/shellCode/a.txt是否存在

[root@xq100 shellCode]# vim ifDemo.sh
[root@xq100 shellCode]# chmod u+x ifDemo.sh 
[root@xq100 shellCode]# ./ifDemo.sh 
两个字符串的值相等
[root@xq100 shellCode]# vim ifDemo.sh
[root@xq100 shellCode]# ./ifDemo.sh 
两个字符串的值相等
23大于22
[root@xq100 shellCode]# vim ifDemo.sh
[root@xq100 shellCode]# ./ifDemo.sh 
两个字符串的值相等
23大于22
[root@xq100 shellCode]# touch a.txt
[root@xq100 shellCode]# ./ifDemo.sh 
两个字符串的值相等
23大于22
文件存在

注意几个特殊写法:

if [ abc ]  表示条件为true
if [ ] 表示条件为false
[root@xq100 shellCode]# ./ifDemo.sh 
条件为真
2.1.4.2 if - else判断

基本语法:

if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
......
else
fi

应用案例:

输入分数(数字),判断是否及格。

[root@xq100 shellCode]# vim ifCase.sh
[root@xq100 shellCode]# chmod u+x ifCase.sh 
[root@xq100 shellCode]# ./ifCase.sh 89
及格了

也可以写多重if elseif 语句:

[root@xq100 shellCode]# ./ifCase.sh 88
优秀
[root@xq100 shellCode]# ./ifCase.sh 77
良好
[root@xq100 shellCode]# ./ifCase.sh 66
及格
[root@xq100 shellCode]# ./ifCase.sh 55
不及格
2.1.4.3 case语句

基本语法:

case $变量名 in
    "值1")
    如果变量名等于值1,执行的代码;;
    "值2")
    如果变量名等于值2,执行的代码;;
    ... ...
    *)
    如果都不满足以上的条件,则执行此代码;;
 esac

基本案例:

[root@xq100 shellCode]# vim caseDemo.sh
[root@xq100 shellCode]# chmod u+x caseDemo.sh 
[root@xq100 shellCode]# ./caseDemo.sh 2
Tuesday

2.1.5 shell中的循环

2.1.5.1 for循环

基本语法1:

for 变量 in 值1 值2 值3…
do
	满足循环条件需要执行的代码
done

案例:循环打印命令行输入的参数

[root@xq100 shellCode]# vim testFor1.sh
[root@xq100 shellCode]# chmod u+x testFor1.sh 
[root@xq100 shellCode]# ./testFor1.sh 100 200 300
number is 100
number is 200
number is 300

基本语法2:

for((初始值;循环控制条件;变量变化))
do
	满足循环条件需要执行的代码
done

案例:输出1-100的数字

[root@xq100 shellCode]# vim testFor2.sh
[root@xq100 shellCode]# chmod u+x testFor2.sh 
[root@xq100 shellCode]# ./testFor2.sh 
值是:1
   *** ***
值是:100

案例:求1-100之间的和

[root@xq100 shellCode]# ./testFor2.sh 
总和是:5050
2.1.5.2 while循环

基本语法:

while [ 条件判断式 ]
do
	代码
done
[root@xq100 shellCode]# vim whileDemo.sh
[root@xq100 shellCode]# chmod u+x whileDemo.sh 
[root@xq100 shellCode]# ./whileDemo.sh 100
SUM=5050

2.1.6 read读取控制台输入

基本语法:read 选项 参数

选项功能
-p指定读取值时的提示符
-t指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了(放弃输入)
[root@xq100 shellCode]# vim testRead.sh
[root@xq100 shellCode]# chmod u+x testRead.sh
[root@xq100 shellCode]# ./testRead.sh 
请输入一个参数:12
NUM1=12
[root@xq100 shellCode]# ./testRead.sh   # 如果用户10s内不输入,则放弃等待。
请输入一个参数:NUM2=

2.1.7 shell函数

2.1.7.1 系统函数

shell编程和其他编程一样,有系统函数,也可以自定义函数。系统函数我们主要介绍两个。

  • basename 获取文件名

去掉文件完整路径的多级路径 (和后缀名),返回文件名 。

基本语法:basename 文件的完整路径 [文件后缀]

应用实例:请返回/home/shellCode/a.txt的文件名(a.txt)

[root@xq100 shellCode]# basename /home/shellCode/a.txt
a.txt
  • dirname 返回完整路径最前面部分
[root@xq100 shellCode]# dirname /home/shellCode/a.txt
/home/shellCode
2.1.7.2 自定义函数

需求:计算两个输入参数的和

[root@xq100 shellCode]# vim testFun.sh
[root@xq100 shellCode]# chmod u+x testFun.sh
[root@xq100 shellCode]# ./testFun.sh 
input a number:10
input a number again:20
30

2.1.8 shell编程综合案例

需求:

  • 每天凌晨2:30备份数据库day01到/data/backup/db;

  • 备份开始和备份结束的时候,要给出相应的提示信息;

  • 备份后的文件要以备份时间为文件名,并打包成tar.gz的格式,比如:2021-09-15_230201.tar.gz;

  • 在备份的同时,要检查是否有10天前备份的数据库文件,如果有就将其删除。

思路分析:

[root@xq100 ~]# cd /usr/sbin  # 为什么要放在sbin目录,因为这个目录是root用户具备执行的权限。
[root@xq100 sbin]# pwd
/usr/sbin
[root@xq100 sbin]# vim mysql_db_backup.sh

在shell脚本里面输入以下内容:

#!/bin/bash
# 定义备份目录
BACKUP=/data/backup/db
# 获取当前的时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
# 验证日期是否定义正确
echo $DATETIME

我们输出一下时间,看看脚本编写是否有误:

[root@xq100 sbin]# chmod u+x mysql_db_backup.sh 
[root@xq100 sbin]# ./mysql_db_backup.sh 
2022-09-07_230715

接下来我们继续编写脚本:

# 数据库主机地址
HOST=localhost
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PW=Admin2022!
# 备份的数据库
DATABASE=day01
# 创建备份目录,如果目录不存在,则创建
# 只有[]里面的表达式为true 才会执行 && 右边的内容
# ${} 用来取文件名或文件路径
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

此时我们可以继续测试脚本是否正确,看看有没有为我们创建备份目录

[root@xq100 sbin]# ./mysql_db_backup.sh 

我们在根目录去查看备份目录是否存在:

[root@xq100 2022-09-07_232210]# pwd
/data/backup/db/2022-09-07_232210   # 我们发现备份目录以及自动创建完成

我们继续编写shell脚本:

# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz

现在我们执行脚本,来测试一下:

[root@xq100 sbin]# rm -rf /data  # 先把之前创建的data目录删除掉
[root@xq100 sbin]# ./mysql_db_backup.sh 
2022-09-07_234027
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@java2201 sbin]# cd /
[root@xq100 /]# cd /data/backup/db/2022-09-07_234027/
[root@xq100 2022-09-07_234027]# ll
总用量 4
-rw-r--r--. 1 root root 1272 97 23:40 2022-09-07_234027.sql.gz  # 这就是我们打的压缩文件
[root@xq100 2022-09-07_234027]# gunzip 2022-09-07_234027.sql.gz # 解压文件
[root@xq100 2022-09-07_234027]# ll
总用量 4
-rw-r--r--. 1 root root 3549 97 23:40 2022-09-07_234027.sql
[root@xq100 2022-09-07_234027]# cat 2022-09-07_234027.sql  # 浏览文件 发现没问题

我们继续编写shell脚本:

# 将文件打包成tar.gz
# 切换到备份目录
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
# 删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}

我们现在测试一下脚本,看看是否写正确:

[root@xq100 sbin]# rm -rf /data/  # 把原来的data目录删除
[root@xq100 sbin]# ./mysql_db_backup.sh 
2022-09-07_235239
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2022-09-07_235239/
2022-09-07_235239/2022-09-07_235239.sql.gz
[root@xq100 sbin]# cd /data/backup/db/
[root@xq100 db]# ll
总用量 4
-rw-r--r--. 1 root root 1520 97 23:52 2022-09-07_235239.tar.gz  # 我们发现没有问题

我们继续编写shell脚本:

# 删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "数据库${DATABASE}成功...."

接下来我们使用crontab -e指令编写定时任务:

[root@xq100 sbin]# crontab -e

编写定时任务

30 2 * * * /usr/bin/mysql_db_backup.sh

这样我们编写备份数据库的脚本就完成了。

最后脚本代码如下:

2.2 linux日志管理

2.2.1 linux日志的基本介绍

日志的基本介绍:

日志文件是重要的系统信息文件,其中记录了很多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。

日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。

一句话理解日志:日志是用来记录重大事件的工具。

那么linux系统中的日志信息保存在哪里呢?绝大多数的日志文件保存在/var/log目录中。

下面我们看看系统中的常用日志:

下面我们就来看看重要的日志文件:

我们使用lastlog来查看/var/log/lastlog。

[root@xq100  log]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/0    desktop-eki0p48  五 99 15:52:56 +0800 2022
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
lp                                         **从未登录过**
... ...
pulse                                      **从未登录过**
gdm              :0                        五 99 15:33:38 +0800 2022
saned                                      **从未登录过**
sshd                                       **从未登录过**
wen              pts/1    192.168.10.1     二 830 10:00:34 +0800 2022
tom                                        **从未登录过**
kobe                                       **从未登录过**
zhangsan         pts/1                     三 831 10:50:11 +0800 2022
chengkun                                   **从未登录过**
fox              pts/2                     三 831 11:03:26 +0800 2022
jack             pts/1    desktop-eki0p48  一 95 17:06:10 +0800 2022
jerry                                      **从未登录过**
xh               pts/2                     三 831 11:44:50 +0800 2022
xm               pts/3                     三 831 11:45:24 +0800 2022
mysql                                      **从未登录过**
[root@xq100  log]# who
root     pts/0        2022-09-09 15:52 (desktop-eki0p48)

应用案例:使用root用户通过xshell7登录,第一次使用错误的密码,第二次使用正确的密码登录成功,查看日志文件/var/log/secure里面有没有记录相关信息。

[root@xq100 log]# cat secure
[root@xq100 log]# echo '' > secure   # 情况secure文件中的内容
[root@xq100 log]# cat secure  # 发现没有任何文件
      
[root@xq100 log]#

接下来我们连续两次输入错误密码,然后第三次输入正确的密码。

2.2.2 linux日志管理服务

centos7日志服务是rsyslogd,centos6日志服务是syslogd。rsyslogd日志服务功能更加强大。rsyslogd的使用、日志文件的格式和syslogd是兼容的。

现在,我们思考一个问题,就是在linux系统中是谁帮助我们将日志信息记录在不同的日志文件里面去的?我们通过一幅图就能理解linux进行日志管理的原理。

所以linux日志服务帮助我们进行日志管理,是借助了/etc/rsyslog.conf配置文件来实现的。

我们可以去查看这个日志文件

[root@xq100 log]# more /etc/rsyslog.conf
  • 查询linux的rsyslogd服务是否启动 ps aux | grep “rsyslog” | grep -v “grep”
[root@xq100 log]#  ps aux | grep "rsyslog" -- 查看rsyslogd服务是否启动
root       1336  0.0  0.3 222760  5816 ?        Ssl  15:29   0:00 /usr/sbin/rsyslogd -n
root       4002  0.0  0.0 112716   960 pts/0    R+   16:28   0:00 grep --color=auto rsyslog
[root@xq100 log]#  ps aux | grep "rsyslog" | grep -v "grep" -- 反向过滤,将包含grep的指令去掉
root       1336  0.0  0.3 222760  5808 ?        Ssl  15:29   0:00 /usr/sbin/rsyslogd -n
  • 查询rsyslogd服务的启动状态 systemctl list-unit-files | grep rsyslog
[root@xq100 log]# systemctl  list-unit-files | grep rsyslog
rsyslog.service 

2.2.3 日志服务管理的配置文件

管理日志的配置文件/etc/rsyslog.conf。那么我们应该怎么去理解这个配置文件里面的内容?

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

我们可以查看这个日志的大致内容:

那么这两个*是什么意思呢?

第一个*: 代表日志类型

日志类型可以分为:

日志类型日志描述
authpam产生的日志
authprivssh ftp等登陆信息的验证信息
corn时间任务相关的信息
kern内核相关
lpr打印相关的信息
mail邮件相关的信息
mark(syslog)-rsyslog服务内部信息
news新闻组
user用户程序产生的相关信息
local 1-7自定义日志设备

第二个*:代表日志级别

日志级别日志级别的描述信息
debug有调试信息的,记录的日志信息最多
info一般日志信息,最常用
notice提醒信息,需要检查一下程序了,不理会可能会出现错误。
warning警告信息,当出现警告时,你的程序可能已经出现了问题,但不影响程序正常运行,尽快进行处理,以免导致服务宕掉。
err错误信息,出现这一项时,已经挑明服务出现了问题,服务都无法确认是否能正常运行。
crit严重级别,阻止整个系统或程序不能正常工作的信息
alert需要立即修改的信息
emerg记录内核崩溃等信息
none什么都不记录

注意:从上到下,日志级别从低到高,记录的信息也越来越少。

由日志服务rsyslogd记录的日志文件,日志文件的格式包含以下4列:

  1. 事件产生的时间

  2. 产生事件的服务器(主机名)

  3. 产生事件的服务名和程序名

  4. 事件的具体信息

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

2.2.4 自定义日志服务

自定义日志服务管理实例:

在/etc/rsyslog.conf中添加一个日志文件/var/log/xq.log,当有事件发生时(比如sshd相关服务的事件)。该文件会接收到信息并保存。比如我们登录 重启linux系统的时候,看看对应的日志信息是否成功保存。

[root@xq100 log]# vim /etc/rsyslog.conf 

我们编辑/etc/rsyslog.conf文件,添加自定义日志信息:

接下来,我们创建xq.log日志文件

[root@xq100 ~]# cd /var/log
[root@xq100 log]# vim xq.log
[root@xq100 log]# cat xq.log 
[root@xq100 log]# reboot 

我们查看日志xq.log文件:

[root@xq100 log]# cat xq.log | grep sshd
Sep  9 17:25:24 xq100 sshd[1292]: Server listening on 0.0.0.0 port 22.
Sep  9 17:25:24 xq100 sshd[1292]: Server listening on :: port 22.
Sep  9 17:25:33 xq100 sshd[1682]: Accepted password for root from 192.168.10.1 port 49929 ssh2
Sep  9 17:25:33 xq100 sshd[1682]: pam_unix(sshd:session): session opened for user root by (uid=0)

我们发现,日志信息成功被记录了。

2.2.5 日志轮替

日志轮替就是按照一定的规则,将一些不需要的旧的文件删掉。

日志轮替,我们使用了/etc/logrotate.conf这个配置文件进行管理的。

[root@xq100 logrotate.d]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
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

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
	minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

这里有几个重要的默认参数:

  • weekly:表示每周轮替一次
  • rotate 4:表示同一个日志文件最多保存四个版本 多了会删除
  • create:产生轮替之后生成一个新的空白的文件放在其后
  • dateext:日志轮替文件名字的命名方式
    • 如果配置文件中有dateext参数:日志会用日期作为日志文件的后缀,例如“message-20220801”。
    • 如果没用dateext:日志需要进行改名,当第一次日志轮替时,当前的“secure”改名为“secure.1”,然后新建“secure”日志用来保存新的日志。第二次日志轮替时,当前的“secure.1”会自动更名为“secure.2”,“secure”更名为“secure.1”,新建“secure”以保存新的日志。以此类推。
    • include /etc/logrotate.d:可以将自定义的日志轮替规则写到这个文件里去。

我们也可以自定义日志轮替规则。

日志文件地址 {
	参数
}

参数:

daily:轮替周期 每天
weekly:轮替周期 每周
monthly:轮替周期 每月
rotate [num]:保存日志文件的个数
compress:轮替时对旧日志进行压缩
create mode owner group:建立新日志的同时指定权限 所有者 所属组
mail address:日志轮替时输出内容通过邮件发送到指定的邮件地址
missingok:如果日志不存在则忽略日志的警告信息
notifempty:如果日志为空文件则不进行日志轮替
minsize [size]:日志轮替的最小值 即超过该大小才会轮替 否则到达轮替周期也不会轮替
size [size[:日志达到指定大小进行轮替 而不是按照轮替的时间周期
dateext:使用日期作为日志轮替文件的后缀
sharedscripts:在此关键字之后的脚本只执行一次
prerotate/endscripts:在日志轮替之前执行脚本命令
postrotate/endscripts:在日志轮替之后执行脚本命令

我们查看可以自定义的日志轮替文件:

[root@xq100 logrotate.d]# cd /etc/logrotate.d
[root@xq100 logrotate.d]# ll
total 60
-rw-r--r--. 1 root root  91 Aug  6  2019 bootlog
-rw-r--r--. 1 root root 160 Sep 19  2018 chrony
-rw-r--r--. 1 root root  71 Aug  6  2019 cups
-rw-r--r--. 1 root root 758 Aug  8  2019 glusterfs
-rw-r--r--. 1 root root 172 Sep 30  2016 iscsiuiolog
-rw-r--r--. 1 root root 165 Aug  9  2019 libvirtd
-rw-r--r--. 1 root root 142 Aug  9  2019 libvirtd.qemu
-rw-r--r--. 1 root root 106 Apr 11  2018 numad
-rw-r--r--. 1 root root 136 Jun 10  2014 ppp
-rw-r--r--. 1 root root 408 Aug  3  2017 psacct
-rw-r--r--. 1 root root 115 Aug  9  2019 samba
-rw-r--r--. 1 root root 237 Aug 13  2019 sssd
-rw-r--r--. 1 root root 224 Aug  6  2019 syslog
-rw-r--r--. 1 root root 100 Oct 31  2018 wpa_supplicant
-rw-r--r--. 1 root root 103 Aug  8  2019 yum
[root@xq100 logrotate.d]# cat bootlog 
/var/log/boot.log
{
    missingok   # 如果日志不存在则忽略该日志的警告信息
    daily  # 每天轮替一次
    copytruncate  # 先把原始文件拷贝一份重命名,然后把原始文件清空
    rotate 7  # 仅保留7个日志备份
    notifempty  # 如果日志为空文件则不进行日志轮替
}
[root@xq100 logrotate.d]#

应用实例:将我们自定义的日志文件加入日志轮替。

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

第二种方法:在/etc/logrotate.d目录下新建该日志的轮替文件。在该轮替文件中定义轮替策略,因为该目录中的文件都会被包含到主配置文件logrotate.conf中。

我们推荐使用第二种方法,因为系统中需要轮替的日志文件非常多,为了可读性方便,建立单独定义轮替规则。

[root@xq100 logrotate.d]# cd /etc/logrotate.d
[root@xq100 logrotate.d]# vim xqlog

定义轮替规则:

注意:logrotate.conf只是定义了日志轮替的规则,那么日志轮替(在指定的时间备份日志)的这个动作,依赖于系统定时任务。可以在 /etc/cron.daily/ 中发现一个可执行文件logrotate。

[root@xq100 logrotate.d]# cd /etc/cron.daily/
[root@xq100 cron.daily]# ll
total 12
-rwx------. 1 root root 219 Oct 31  2018 logrotate  --  依赖于这个文件帮助我们执行日志备份操作
-rwxr-xr-x. 1 root root 618 Oct 30  2018 man-db.cron
-rwx------. 1 root root 208 Apr 11  2018 mlocate

2.2.6 内存日志

在linux中,有一部分日志信息是没有写到日志文件里面去的,而是写在内存中的。这些日志的特点是日志信息都在随时发生变化。比如linux内核的日志信息。内存日志还有一个特点是linux系统在重新启动的时候,内存日志就会被清空。

操作内存日志的常用指令如下:

  • journalctl查看所有的内存日志
  • journalctl -n 3查看最新3条
  • journalctl --since 15:00 --until 15:10查看区间时间内的日志 可加日期
  • journalctl -p err查看报错日志
  • journalctl -o verbose日志详细内容

更多推荐

Linux操作系统(详解及配置操作)