重点:linux的安装 linux的常用指令 linux的网络配置 shell编程
难点:linux的磁盘分区 linux的shell编程 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发行版,常见的主流发行版如下图所示:
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 等。
Linux 内核最初是由李纳斯•托瓦兹(Linus Torvalds)在赫尔辛基大学读书时出于个人爱好而编写的,当时他觉得教学用的迷你版 UNIX 操作系统 Minix 太难用了,于是决定自己开发一个操作系统。第 1 版本于1991 年 9 月发布,当时仅有 10000 行代码。
李纳斯•托瓦兹没有保留 Linux 源代码的版权,公开了代码,并邀请他人一起完善 Linux。与 Windows 及其他有专利权的操作系统不同,Linux 开放源代码,任何人都可以免费使用它。
据估计,现在只有 2% 的 Linux 核心代码是由李纳斯•托瓦兹自己编写的,虽然他仍然拥有 Linux 内核(操作系统的核心部分),并且保留了选择新代码和需要合并的新方法的最终裁定权。现在大家所使用的 Linux,我更倾向于说是由李纳斯•托瓦兹和后来陆续加入的众多 Linux 好者共同开发完成的。
李纳斯•托瓦兹无疑是这个世界上最伟大的程序员之一,何况,他还搞出了全世界最大的程序员交友社区 GitHub (开源代码库及版本控制系统)。
二者的关系,不是大哥和小弟,"UNIX 是 Linux 的父亲"这个说法更怡当。之所以要介绍它们的关系,是因为要告诉读者,在学习的时候,其实 Linux 与 UNIX 有很多的共通之处,简单地说,如果你已经熟练掌握了 Linux,那么再上手使用 UNIX 会非常容易。
二者也有两个大的区别:
Linux 受至旷大计算机爱好者的喜爱,主要原因也有两个:
总结unix与linux的区别:
Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,所以 Linux 模仿了 UNIX(但并没有抄袭 UNIX 的源码),使得 Linux 在外观和交互上与 UNIX 非常类似。
我们安装linux操作系统有两种方法,一种是在裸机上直接安装(你需要格式化你本机的windows操作系统),还有一种是在虚拟机上安装。我们推荐使用第二种方式来安装。
所以我们需要先安装虚拟机,然后通过虚拟机来模拟出linux操作系统。虚拟机的产品有很多,在本套课程中,我们推荐大家使用vmware虚拟机。
为了简化大家的使用方式,在这里,老师把下载好的资源以存入百度云网盘,大家可以自行下载。
链接:https://pan.baidu.com/s/1J8k0osOhfImJKO3W7L-KuQ
提取码:mnwg
具体安装步骤,大家可以操作如下博客进行安装:
https://blog.51cto.com/u_14289664/5133223
安装到最后,输入秘钥。这是老师给大家找的三个秘钥,大家可以拿去使用:
ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
在VMWare软件中,安装/启动虚拟机时,如果出以类似以下的错误提示:
出现该提示是由于电脑不支持虚拟化技术或是相关功能没有开启导致的。
解决方法有两种:
修改C:\ProgramData\VMware\VMware Workstation\config.ini文件,注意,您的VMWare安装目录不一定是C:\ProgramData\VMware\VMware Workstation,根据自己的实际情况来。
在config.ini中添加以下内容:
monitor.allowLegacyCPU = “true”
重新打开VMWare软件,问题解决。
前面我们安装了vmware,现在我们要在虚拟机vmware里面安装centos7。接下来我们需要下载centos7镜像。
CentOS 7.6 DVD版:https://mirrors.aliyun.com/centos-vault/7.6.1810/isos/x86_64/
但是在课程中我们给大家提供好了centos7的镜像,大家可以自行下载即可。
链接:https://pan.baidu.com/s/1q6BnzNmV9DATMkzyTTN_RQ
提取码:0d3f
点击进入下一步。
点击下一步。
x
点击下一步。
点击下一步。
点击进入下一步选择默认选项。
点击进入下一步。
注意:磁盘容量20G,并不是真正的占用物理机的磁盘容量。而是随着后期linux系统中服务的安装,文件的增多,最大可以分配20G的磁盘空间给我们使用,当然如果空间不够用,我们还可以扩容。
点击进入下一步选择默认选项。
到这一步,我们并没有安装完成linux。我们需要进行进一步的配置。
点击INSTALLATION DESTINATION进行磁盘分区。
linux操作系统,我们一般设置3个分区。分别是boot分区,swap分区(交换分区:如果内存不够用,交换分区可以临时充当内存)还有根分区。以总容量20G为例,一般分区大小设置如下:
boot分区 1G
swap分区 2G
根分区 17G
具体配置如下:
配置结果如下:
点击确定。
点击进入NETWORK & HOST NAME
安装完成,点击reboot重启系统即可。
下面,我们用一幅图来说明什么是桥接模式:
解释:
在桥接模式下,虚拟机里面的网络地址必须和外部的网络地址保持在同一网段(也就是前三组数字必须是一样的)。这样linux操作系统才可以和外部的机器进行通信。但是如果用户人数太多,容易造成IP冲突。
解释:
在NAT模式下,虚拟机里面的网络可以不再和主机里面的网络保持在同一网段。但是主机里面会存在虚拟网卡(192.168.100.99),这个虚拟网卡的ip地址必须和linux里面的IP地址(192.168.100.88)在同一网段。这样linux就可以通过虚拟网卡和主机之间进行通信了。同时也可以通过主机的真实地址(192.168.0.50)和外部网络进行通信。这样的好处是可以避免造成IP冲突。
这个很简单,就是linux系统的ip地址和主机的ip地址必须保持一致。
如果你已经安装了一台linux操作系统,你还想要更多的linux操作系统,这里我们就没有必要再重新安装linux操作系统了,因为会非常的耗时、麻烦。你只需要在原来linux操作系统上克隆就可以实现。
注意:克隆的时候,需要先关闭linux操作系统。
下面我们介绍两种克隆虚拟机的方式:
方式1:直接拷贝一份安装好的虚拟机文件。
我们可以在已经安装的linux操作系统所在的目录上,直接复制 粘贴即可。
上面的目录就是我们安装linux操作系统的目录,我们直接复制,然后粘贴到指定的磁盘目录并重名即可。然后我们通过虚拟机打开:
然后选择指定文件打开:
方式2:使用vmware的克隆操作。
我们按照以下的图示进行操作:
点击克隆之后,在点击下一步,如下所示:
点击下一步:
点击下一步:
点击完成即可。
注意:
在选择克隆类型的时候,有两种。
第一种:创建链接克隆。这种克隆的方式占用的磁盘空间较小,克隆时间更快。本质上还是使用原来的linux操作系统,只是克隆了原linux操作系统的引用。
第二种:创建完整克隆。这种克隆的方式占用是磁盘空间较大,克隆时间比较慢,相当于把原来的linux操作系统复制了一份。一般我们选择完整克隆。
如果你在使用linux操作系统的时候,你想回到原来的某一个状态(也就是可能出现在误操作上造成的系统异常),需要回到原先某个正常运行的状态,vmware提供了这样的功能,就叫快照管理。
下面我们来演示虚拟机快照:
点击拍摄快照。
2、在桌面上创建A目录,然后我们再拍摄快照:
点击拍摄快照。
3、在桌面上创建B目录,然后我们再拍摄快照:
点击拍摄快照。
4、我们查看快照记录:
打开快照管理器:
查看快照信息:
5、跳转到指定的快照位置:
点击转到,就可以跳转到快照A。
通过前面的学习我们得知,当linux操作系统安装完成之后,它的本质是以文件的形式保存在文件目录里面的。因此虚拟系统的前移也十分简单,我们只需要把安装好虚拟系统所在的文件夹直接剪切或拷贝至指定的目录即可。删除也很简单,我们可以使用vmware自带的删除功能进行删除。
首先我们关闭linux操作系统,然后右键–>管理–>从磁盘中清除即可。
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搭建共享文件目录就完成了。
linux的文件系统和windows的文件不一样。windows文件系统中会有很多盘符,在盘符下面又有很多的文件目录。但是linux文件目录不是这样的。linux文件系统采用的是层级式的树状目录结构,其中最上层的根目录是"/",然后在此目录下面再创建其他的目录。linux的树状目录结构非常重要,它的树状图如下所示:
这里简单介绍一下:
比如/boot目录。这个是linux系统启动所需要的引导文件的目录。如果这个目录里面的文件损毁,linux操作系统就无法启动。
/dev目录。设备管理器目录,linux把任何硬件都映射成了对应的文件来描述,这些文件就存放在dev目录里面。
总之一句话:在linux世界里,一切皆为文件!
是Binary的缩写, 这个目录存放着最经常使用的命令。比如我们常用的cd命令 cp命令都是存放在bin目录里面。
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
此时我们可以再验证一下,我们使用命令的方式创建一个用户:
[root@xq100 ~]# useradd tom #创建一个tom用户
[root@xq100 ~]# userdel -r tom # 删除指定的用户及其对应的文件夹
此时我们发现,在home目录也会生成一个tom目录
当我们执行userdel -r命令,这个用户所属的文件目录也就被删除了。
该目录为系统管理员(root),也称作超级权限者的用户主目录。如果我们使用root账户登录,默认所处的目录位置就是在/root下面。
系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。如果这个目录里面的文件被删除了,linux操作系统也就不能正常运行了。
所有的系统管理所需要的配置文件和子目录。linux系统本身所需要用到的配置文件也是存放在etc目录。如果我们自己安装一些系统服务,比如mysql数据库服务,那么和数据库相关的配置文件(my.cnf)也是存放在/etc目录里面。
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。
存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。如果这个目录里面的文件被删除了,linux操作系统也就不能正常运行了。
类似于windows的设备管理器,把所有的硬件用文件的形式存储。
这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统的信息。这个目录我们不要动,否则可能造成系统的崩溃。
service的缩写,该目录存放的一些服务服务启动之后需要提取的数据。这个目录我们不要动,否则可能造成系统的崩溃。
这个目录存放了linux内核相关的文件信息。这个目录我们不要动,否则可能造成系统的崩溃。
这个目录是用来存放一下临时文件的。
linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。比如我们插入的U盘 光驱都会被映射成对应的文件存放在media目录。
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。比如我们上节内容设置的共享目录myshare。
这是主机给安装软件所存放的目录,如果安装JDK可放到改目录下默认为空。上节内容我们安装VMwareTools-10.0.0-2977863.tar.gz。这个压缩文件就存放在opt目录的。
简单的说就是应用程序安装之后,安装程序所存放的目录。一般是通过编译源码方式安装的程序。
这个目录中存放着在不断变化,扩充着的东西,最常用的就是包括各种日志文件。
在实际工作中,linux服务器是开发小组共享的,并不是存放在每个用户的本地电脑上,linux服务器一般会存在在一台独立的电脑上(独立的机房里)。所以我们需要远程的登录到linux进行相关的操作。
在这里我们介绍两个远程操作工具。一个是远程登录linux操作系统的工具,一个是进行远程文件传输 下载的工具。
第一个工具:远程连接 登录linux服务器的工具 Xshell7
下载地址:
链接:https://pan.baidu.com/s/1q_3huHdXNUcrTiwdtKtGNw
提取码:il3r
!绿化.bat
,桌面会自动化生成Xshell程序。如果出现以上信息说明破解成功。
[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成功。
打开Xshell,点击文件–>新建:
点击确定,再输入登录用户名和密码即可即可。
第二个工具:进行文件远程传输和下载的工具 FileZilla
链接:https://pan.baidu.com/s/1_gGQZuzyehHwZrXWuPatMA
提取码:k1xo
傻瓜式安装,直接点击下一步即可。
注意:
主机的连接地址必须是sftp协议。也就是必须输入: sftp://192.168.10.137
用户名和密码是连接linux操作系统的用户名和密码。
端口号可以不写,默认就是22。
上传文件:在windows操作系统(左边)选择指定文件,右键–>上传 即可。
下载文件:在linux操作系统(右边)选择指定文件,右键–>下载 即可。
所有的 Linux 系统都会内置 vi 文本编辑器。Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
正常模式:
以vim打开一个档案就是直接进入了一般默认(这是正常的模式),在这个模式中,可以通过上下左右来移动光标,你也可以使用【删除字符】【删除整行】来编辑档案中的内容,也可以使用【复制】【贴上】来处理你的文件数据。
插入模式:
按下i,l,o,O,a等任意一个字母之后才会进入编辑模式,一般情况按下i即可。
命令行模式:
在这个模式当中,可以提供你相关指令,完成读取,存盘,替换vim,显示行号等操作是在此模式下完成的。
现在我们完成一个简单的需求,使用vim编辑器,编辑一个Hello.java文件。我们就在Xshell中完成。
[root@xq100 ~]# vim Hello.java
我们输入 vim Hello.java
命令,然后回车,此时进入到正常模式。
此时我们直接在里面写内容是没有反应的,因为正常模式下,不能进行内容的编辑,我们需要容正常模式切换到插入模式。如何切换?
我们一般按下i键即可。此时,屏幕左下角会显示成INSERT字样:
这个时候我们可以在插入模式下面进行内容的编辑:
接下来我们需要保存文件,我们需要切换到命令行模式:
首先按ESC键,然后输入:wq 然后回车 就是保存并退出。
:wq 保存并退出
:q 直接退出
:q! 不保存并退出(强制退出)
接下来我们简单使用vim编辑器的快捷键。
1. 拷贝当前行 (yy ),并粘贴(p)
yyp
注意:必须在正常模式下面进行操作。
此时我们查看效果:
2. 拷贝当前向下的2行(2yy ) 并粘贴(p)
2yyp
完成之后的效果:
3.删除当前行(dd) 删除当前向下的2行 (2dd)
dd
删除之后的效果:
2dd
删除之后的效果:
4.在文件中查找某个单词{命令行下/关键字} 回车查找,输入n就能查找下一个
比如查找Hello关键字。/Hello 然后按n就能查找到内容
5.设置文件的行号(: set nu)。取消文件的行号(: set nonu)
6.使用快捷键回到文件内容的最起始处和最末尾处
切换到正常模式。
G : 回到文件的末尾处(光标回到文件的末尾处)
gg:回到文件的最开始处(光标回到文件的最开始处)
7.快速的定位到某个位置
切换到正常模式。
5 shift + g (快速到定位到第5行)。
8.在文件中输入内容,执行撤销操作
切换到正常模式。按快捷键u
/World/shijie/
g
标志:/World/shijie/g
%
作为范围。此字符指示从文件第一行到最后一行的范围:%s/World/shijie/g
shutdown
shutdown -h now 表示立即关机
shutdown -h 1:表示一分钟后关机
shutdown -r now :立即重启
halt
就是直接使用,效果等同于关机
sync
把内存的数据同步到磁盘
reboot
就是重启系统
注意细节:
注意:在切换用户的时候,如果从低级别的用户切换到高级别的用户,需要输入密码的(wen --> root)。如果从高级别的用户切换到低级别的用户(root --> wen),那么是不需要输入密码的。
linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
在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
细节:
[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
创建密码的命令: 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进行登录,发现可以成功登录。
删除用户有两种情况,一种是删除用户,保存用户对应的目录。还有一种是删除用户,连用户对应的目录也删除掉。
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
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]#
用户组类似于角色,系统可以对有共性(权限)的多个用户进行统一管理。我们可以通过下面一幅图来理解组的概念。
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包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
关于linux的运行级别,一共有7种,我们给大家分别介绍一下:
0:关机
1:单用户(找回用户丢失的密码,可以使用单用户模式)
2:多用户状态但没有网络服务(一般很少用)
3:多用户状态但有网络服务(没有图形化界面,但是有网络,这种用的最多)
4:系统未使用,保留给用户(很少用)
5:图形界面
6:系统重启
常用的运行级别是3和5,我们也可以指定系统默认的运行级别。
切换运行级别的口令: init[0 1 2 3 4 5 6]
我们在linux操作系统(带有图形化界面的操作系统)输入init 3。此时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
建议:同学们在初学的时候,还是使用带有图形化界面的运行级别。
这是一道经典的面试题。希望大家要能够掌握,如果以后自己忘记了root账户的密码,我们也可以按照下面的方法自己去找到root用户的密码。
基本语法: 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
......
在linux操作系统里面,获取文件的方式有两种,一种是通过绝对路径的方式获取文件,一种是相对路径获取文件。
假设我们在当前指定的目录下面,想要获取指定的文件,我们可以通过相对路径和绝对路径的方式来获取。
[root@xq100 home]# pwd #获取当前目录所在的绝对路径
/home
[root@xq100 home]# cd kobe
[root@xq100 kobe]# pwd
/home/kobe
常用选项:
-a: 显示当前目录下面的所有文件和目录 包括隐藏的。
-l: 以列表的方式显示文件(目录)信息。
常用选项:
~: 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
需求:在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
需求:我们删除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
需求:在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
需求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
-r:递归删除整个文件夹
-f:强制删除不提示
在同一个目录下面操作: 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
需求:查看/etc/profile文件,并显示行号
-n 显示行号 cat -n /etc/profile
[root@xq100 guojing]# cat -n /etc/profile #浏览文件 并显示行号
cat只能浏览文件,并不能修改文件,为了浏览方便,一般会用上管道命令 |more。
[root@xq100 guojing]# cat -n /etc/profile | more #浏览文件 并显示行号 分屏幕显示 使用空格键可以翻页显示
[root@xq100 guojing]# more /etc/profile
操作 | 功能说明 |
---|---|
空格键 | 向下翻页 |
Enter | 向下翻一行 |
q | 代表立刻more,不再显示文件内容 |
Ctrl + F | 向下滚动一屏幕 |
Ctrl + B | 返回上一屏 |
= | 输出当前行号 |
:f | 输出文件名和当前行号 |
less指令用于来分屏查看文件内容,他的功能与more类似,但是比more更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载后才显示的,而是根据要加载的内容,对显示大型文件具有高效率。
语法: less 文件名称
[root@xq100 guojing]# less /etc/profile
操作 | 功能说明 |
---|---|
空格键 | 向下翻动一页 |
上箭头键 | 向上翻动一页 |
下箭头键 | 向下翻动一页 |
/字符串内容 | 搜索字符串 n:向下搜索 N:向上搜索 |
q | 立刻less,不再显示文件内容 |
需求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 -n 5 文件 显示前五行的内容 5可以是任意数
[root@xq100 guojing]# head /etc/profile # 默认显示前10条内容
[root@xq100 guojing]# head -n 5 /etc/profile # 默认显示前5行内容
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
[root@xq100 linkToRoot]# history # 查看当前用户的历史指令
[root@xq100 linkToRoot]# history 10 # 查看当前用户的最近10条历史指令
基本语法:
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"
[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
语法格式:
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指令基于数据库进行查询。所以第一次查询运行前,必须使用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
查看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 [选项] 查找内容 源文件
选项 | 功能 |
---|---|
-n | 显示行号 |
-i | 忽略自动大小写 |
案例:查找在/home/kobe目录下的Hello.java文件中,查找hello所在行,并显示行号。
[root@xq100 kobe]# cat Hello.java |grep -ni 'Hello'
效果如下:
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 [选项] 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.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
在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)
当我们使用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权限详解(难点)
-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:文件的名称
通过chmod指令,可以修改文件或者目录的权限。
u:所有者,g:所属组,o,其他人,a:所有人(u,g,o的总和)
案例演示:
[root@xq100 kobe]# chmod u=rwx,g=rx,o=rx Hello.java
[root@xq100 kobe]# chmod u-x,g+w 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 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文件也可以进行写操作了。
我可以使用crontab命令进行定时任务调度的设置。何为任务调度?
任务调度:指在某个时间执行特定的命令或者程序。
任务调度的分类:
系统任务:有些重要的工作必须周而复始的执行 比如病毒扫描 。
个别用户工作: 个别用户希望执行某些程序,比如对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分钟之后,任务调度又出现了
项目 | 含义 | 范围 |
---|---|---|
第一个 “*” | 一个小时当中的第几分钟 | 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:每隔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
还有其他几个任务调度指令,大家了解一下:
contab -l :列出当前有哪些任务调度
service crond restart [重启任务调度]
at命令是一次性定时执行任务计划,at的守护线程atd以后台的模式运行,检查作业队列来运行。
默认情况下,atd守护线程每60秒检查作业队列,有作业时会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
at命令是一次性定制的计划任务,执行完一个任务后就不再执行此任务了。
在使用at命令的时候,一定要保证atd进程的启动,可以用相关指令来查看
ps -ef | grep atd
下面我们用一幅图来说明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 日期: MMDDYY 或MM/DD/YY 或MM.DD.YY |
在 2018 年 1 月 15 日执行:011518 或01/15/18 或01.15.18 |
now + 数量 单位 | 相对计时法 以 minutes、hours、days 或 weeks 为单位 |
5 天后的此时此刻执行:now + 5 days |
语法格式:
at [选项] [时间]
at > 命令(输入两次 Ctrl + D)
释义:
第一行:at 指令输入结束后,回车到下一行输入指令
第二行:开头的 at> 无需输入,是系统自动添加的
命令输入结束后:Ctrl + D 结束命令的输入,要输入两次
[root@xq100 home]# atq
1 Wed Aug 31 17:00:00 2022 a root
2 Wed Aug 31 18:00:00 2022 a root
[root@xq100 home]# at 5pm tomorrow
at> date > /home/date100.log<EOT>
job 4 at Tue Aug 30 17:00:00 2022
[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
我们可以去查看一下具体的磁盘分区信息吗?我们可以使用lsblk命令来查看详细的磁盘分区信息:
[root@xq100 home]# lsblk
Linux 硬盘有两种:IDE 硬盘 和 SCSI 硬盘
hdx~
hd
表示分区所在设备的类型,这里hd
= IDE 硬盘x
为盘号,区分不同硬盘间的功能标识 | 功能 |
---|---|
a | 基本盘 |
b | 基本从属盘 |
c | 辅助主盘 |
d | 辅助从属盘 |
○ ~
为分区号,区分同一硬盘上不同分区的功能
标识 | 功能 |
---|---|
1-4 | 主分区 或 扩展分区 |
5 | 逻辑分区 |
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
:挂载点
需求:下面我们以增加一块硬盘来熟悉磁盘的相关指令,深入理解磁盘分区、卸载、挂载的概念。
如何添加硬盘?
我们右键虚拟机,点击设置。
点击添加:
点击下一步:
点击下一步:
点击下一步,设置磁盘容量:
点击下一步,完成。此时我们可以看到我们新增加的硬盘:
点击确定,完成。然后我们重启系统。
此时我们通过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
编辑如下:
然后保存并退出。
[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
[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
[root@xq100 opt]# ls -l /opt | grep "^d" | wc -l # "^d" 以文件目录开头 wc -l 统计个数
2
[root@xq100 opt]# ls -lR /opt | grep "^-" | wc -l # R 代表递归
3148
[root@xq100 opt]# ls -lR /opt | grep "^d" | wc -l
853
[root@xq100 opt]# tree /home
bash: tree: command not found... # 需要安装tree指令
[root@xq100 opt]# yum install tree
[root@xq100 opt]# tree /home # 以树状的形式展示目录结构
前面我们在安装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操作系统可以连接外部的网络了。
默认情况下,我们linux操作系统ip获取的方式是自动获取的方式,我们可以查看自己linux操作系统,看看ip的获取方式:
这种自动获取ip的方式不需要任何设置就可以实现,但是非常容易造成ip冲突,而且在公司里面,我们一般都会将linux操作系统的ip地址固定下来,所以接下来我们需要手动固定linux操作系统的ip地址。
这个网卡文件在/etc/sysconfig/network-scripts/ifcfg-ens33
打开这个文件,进行编辑
为了方便记忆,我们可以给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.com 如何找到百度服务器地址的?
1、浏览器先检查浏览器缓存中有没有该域名解析ip地址,有就先调用这个ip完成域名解析。如果没有就检查DNS解析器缓存,如果有就直接返回ip完成解析。这两个缓存可以理解为本地解析器缓存。
2、如果本地解析器缓存没有找到对应的映射,再去检查系统中的hosts文件中有没有配置对应的域名ip映射,如果有,就完成域名解析。
3、如果本地DNS缓存和hosts文件中均没有找到对应的ip,则到DNS域名服务器完成域名解析。
4、如果公网的DNS域名解析器也没有完成域名解析,就返回资源找不到的信息。
在linux中,每个执行的程序都为一个进程,每个进程都分配了一个id号(pid,进程号)。
每个进程都可能以两种形式存在,前台和后台,所谓前台进程就是及用户在目录上可以进行操作的(占用屏幕 比如我们的top指令),后台是无法在屏幕上操作的进程。
一般系统的服务进程都是以后台进程的方式存在,而且会常驻在系统中直到关机才结束。
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:进程启动所需要的命令和参数。
需求:以全格式显示当前的所有进程,查看进行的父进程。查看sshd的父进程信息。
也就是说sshd进程的进程id是1328.其父进程id是1。1928的进程的父进程是进程id为1328的进程。那么id为1的进程是什么样的呢,我们可以使用ps -ef | more的命令查看:
若是某个进程执行一半需要停止时候,或是已经消耗了很大的系统资源时候,可以考虑停止该线程。
基本语法:
kill [选项] 进程号 :通过进程号杀死/终止进程。
killall:会杀死当前进程和其子进程。
常用选项:
-9 表示强迫进程立即停止
我们首先在xshell终端使用kobe登陆。然后在另外一个终端使用root用户登录,并在root用户下面执行指令:ps -aux | grep sshd。
此时我们发现kobe用户的进程id是6940.我们在root用户下面使用kill命令来终止这个进程。
[root@xq100 ~]# kill 6940
回到Xshell,我们发现kobe这个用户已经被注销了。
我们发现,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
我们在linux图形化界面里面打开多个记事本。然后在Xshell里面使用killall 命令:
[root@xq100 ~]# killall gedit
此时记事本打开的文件就会自动被关闭。
比如我们在linux图形化界面里面开启两个命令 终端:
现在我们使用ps命令来查看两个终端的进程信息:
[root@xq100 ~]# ps -aux | grep bash
比如我们现在想杀死id为7946的进程,我们使用kill 7946。发现没有任何反应,因为linux认为这个命令终端是正常运行的,不允许我们杀掉。此时我们需要加上-9参数来强制杀掉。
[root@xq100 ~]# kill -9 7946 #可以强制杀掉另一个命令终端
pstree [选项],可以更加直观的来查看进程信息。
-p:显示进程的PID。
-u:显示进程的所属用户。
[root@xq100 ~]# pstree # 显示进程树
[root@xq100 ~]# pstree -p # 显示进程树(携带进程号)
[root@xq100 ~]# pstree -u
service(本质)就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如说(mysql3306,sshd22,redis6379),因为我们又称为守护进程,在Linux中是重要的知识点。
下面我们用一幅图来解释什么是守护进程:
我们可以简单使用一下,比如查看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
[root@xq100 init.d]# setup
选择系统服务,回车,我们可以看到系统服务的详细信息:
注意:
通过chkconfig可以给服务的各个运行级别设置自启动/关闭。
chkconfig指令管理的服务在 /etc/init.d查看。
注意:在Centos 7.0以后,很多服务使用systemctl管理。
基本用法
我们现在罗列出使用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生效。
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
[root@xq100 system]# systemctl enable firewalld.service
[root@xq100 system]# systemctl disable firewalld.service
防火墙的核心功能:打开或关闭对应端口。关闭端口,则外部的数据请求不能通过对应的端口,与服务器上的程序进行通信
在真正的生产环境,为保证安全,需要启动防火墙并配置打开和关闭的端口。
基本语法:
[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
top与ps命令一样,它们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的进程。
基本语法:
top [选项]
选项 | 功能 |
---|---|
-d秒数 | 指定top命令每隔几秒刷新,默认3秒 |
-i | 使用top不显示任何闲置或者僵死的进程 |
-p | 通过指定监控ID来仅仅监控某个进程的状态 |
我们执行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:描述交换区内存占用情况
当我们输入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次
基本语法: 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
rpm是互联网下载包和打包和安装工具,他包含在某些linux分版中,他具有生产.rpm扩展名的文件,RPM是redhat package manage(软件包管理工具的缩写),类似于setup.exe。
我们看看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.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://www.mozilla.org/firefox/
Summary : Mozilla Firefox Web browser
Description :
Mozilla Firefox is an open-source web browser, designed for standards
compliance, performance and portability.
[root@xq100 opt]# rpm -ql mariadb-libs-5.5.64-1.el7.x86_64
[root@xq100 opt]# rpm -qf /etc/my.cnf # 查询/etc目录下面的my.cnf文件所属的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 -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又安装成功了。
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服务器里面的火狐浏览器,发现又有了
[root@xq100 ~]# mkdir /opt/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.com/s/1u3misQGlL9JHqpXnqdLtzw
提取码:42gk
[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)
[root@xq100 kobe]# javac Hello.java # 编译java文件
[root@xq100 kobe]# java Hello # 执行class字节码文件
Hello World
第一步: 切换到opt目录,下载mysql的rpm包
[root@java2201 opt]# cd /opt
[root@java2201 opt]# wget https://dev.mysql.com/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.com/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/my.cnf配置文件,在[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就成功了。
如果我们不小心忘记了root账户的密码,那么如何重置root账户的密码呢?
第一步:修改mysql的配置文件/etc/my.cnf。设置免密登录。然后重启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
第四步:退出并修改my.cnf,将免密登录的配置注释掉。
[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>
下载地址是:
链接:https://pan.baidu.com/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
[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.
[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
发送请求: http://192.168.10.130:8080 是否能够访问tomcat的首页。
什么是shell:
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。下面我们用一幅图来解释什么是shell。
为什么要学习shell:
shell脚本的编写执行方式:
下面我们就编写并执行第一个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
Linux 中 Shell 的变量分为系统变量和用户自定义变量。系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等等,比如: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 # 分页查看所有的变量信息
我们在开发中,绝大多数使用的是用户自定义的变量。那么自定义变量该如何定义呢?
变量的快速入门:
案例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
案例: 定义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
当我们执行一个 Shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息。
需求:编写一个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
Shell 设计者事先已经定义好的变量,可以直接在 Shell 脚本中使用。
需求:在一个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
运算符的功能:在脚本中实现各种运算操作
基本语法:
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
基本语法:[ 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
条件为真
基本语法:
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
不及格
基本语法:
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
基本语法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
基本语法:
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
基本语法: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=
shell编程和其他编程一样,有系统函数,也可以自定义函数。系统函数我们主要介绍两个。
去掉文件完整路径的多级路径 (和后缀名),返回文件名 。
基本语法:basename 文件的完整路径 [文件后缀]
应用实例:请返回/home/shellCode/a.txt的文件名(a.txt)
[root@xq100 shellCode]# basename /home/shellCode/a.txt
a.txt
[root@xq100 shellCode]# dirname /home/shellCode/a.txt
/home/shellCode
需求:计算两个输入参数的和
[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: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 9月 7 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 9月 7 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 9月 7 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
这样我们编写备份数据库的脚本就完成了。
最后脚本代码如下:
日志的基本介绍:
日志文件是重要的系统信息文件,其中记录了很多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
一句话理解日志:日志是用来记录重大事件的工具。
那么linux系统中的日志信息保存在哪里呢?绝大多数的日志文件保存在/var/log目录中。
下面我们看看系统中的常用日志:
下面我们就来看看重要的日志文件:
我们使用lastlog来查看/var/log/lastlog。
[root@xq100 log]# lastlog
用户名 端口 来自 最后登陆时间
root pts/0 desktop-eki0p48 五 9月 9 15:52:56 +0800 2022
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
... ...
pulse **从未登录过**
gdm :0 五 9月 9 15:33:38 +0800 2022
saned **从未登录过**
sshd **从未登录过**
wen pts/1 192.168.10.1 二 8月 30 10:00:34 +0800 2022
tom **从未登录过**
kobe **从未登录过**
zhangsan pts/1 三 8月 31 10:50:11 +0800 2022
chengkun **从未登录过**
fox pts/2 三 8月 31 11:03:26 +0800 2022
jack pts/1 desktop-eki0p48 一 9月 5 17:06:10 +0800 2022
jerry **从未登录过**
xh pts/2 三 8月 31 11:44:50 +0800 2022
xm pts/3 三 8月 31 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]#
接下来我们连续两次输入错误密码,然后第三次输入正确的密码。
centos7日志服务是rsyslogd,centos6日志服务是syslogd。rsyslogd日志服务功能更加强大。rsyslogd的使用、日志文件的格式和syslogd是兼容的。
现在,我们思考一个问题,就是在linux系统中是谁帮助我们将日志信息记录在不同的日志文件里面去的?我们通过一幅图就能理解linux进行日志管理的原理。
所以linux日志服务帮助我们进行日志管理,是借助了/etc/rsyslog.conf配置文件来实现的。
我们可以去查看这个日志文件
[root@xq100 log]# more /etc/rsyslog.conf
[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
[root@xq100 log]# systemctl list-unit-files | grep rsyslog
rsyslog.service
管理日志的配置文件/etc/rsyslog.conf。那么我们应该怎么去理解这个配置文件里面的内容?
日志文件的格式是*.*
存放的日志文件
我们可以查看这个日志的大致内容:
那么这两个*
是什么意思呢?
第一个*
: 代表日志类型
日志类型可以分为:
日志类型 | 日志描述 |
---|---|
auth | pam产生的日志 |
authpriv | ssh ftp等登陆信息的验证信息 |
corn | 时间任务相关的信息 |
kern | 内核相关 |
lpr | 打印相关的信息 |
邮件相关的信息 | |
mark(syslog)-rsyslog | 服务内部信息 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
local 1-7 | 自定义日志设备 |
第二个*
:代表日志级别
日志级别 | 日志级别的描述信息 |
---|---|
debug | 有调试信息的,记录的日志信息最多 |
info | 一般日志信息,最常用 |
notice | 提醒信息,需要检查一下程序了,不理会可能会出现错误。 |
warning | 警告信息,当出现警告时,你的程序可能已经出现了问题,但不影响程序正常运行,尽快进行处理,以免导致服务宕掉。 |
err | 错误信息,出现这一项时,已经挑明服务出现了问题,服务都无法确认是否能正常运行。 |
crit | 严重级别,阻止整个系统或程序不能正常工作的信息 |
alert | 需要立即修改的信息 |
emerg | 记录内核崩溃等信息 |
none | 什么都不记录 |
注意:从上到下,日志级别从低到高,记录的信息也越来越少。
由日志服务rsyslogd记录的日志文件,日志文件的格式包含以下4列:
事件产生的时间
产生事件的服务器(主机名)
产生事件的服务名和程序名
事件的具体信息
日志查看实例:查看一下/var/log/secure日志,这个日志记录的是用户验证和授权方面的信息,来分析如何查看:
自定义日志服务管理实例:
在/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)
我们发现,日志信息成功被记录了。
日志轮替就是按照一定的规则,将一些不需要的旧的文件删掉。
日志轮替,我们使用了/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.
这里有几个重要的默认参数:
我们也可以自定义日志轮替规则。
日志文件地址 {
参数
}
参数:
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
在linux中,有一部分日志信息是没有写到日志文件里面去的,而是写在内存中的。这些日志的特点是日志信息都在随时发生变化。比如linux内核的日志信息。内存日志还有一个特点是linux系统在重新启动的时候,内存日志就会被清空。
操作内存日志的常用指令如下: