|
目录
1、Linux入门
1.1、Linux介绍
Linux的应用领域:
- 个人桌面领域的应用:Linux应用的薄弱环节。
- 服务器领域:最专业的领域,liunx免费、稳定、高效等特点得到很好的体现。
- 嵌入式领域:linux运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百kb等特点。
主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等,以后在物联网中应用会更广泛。
1.2、概述
- Linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级项目(C/C++/PHP/Python/Java/Go)都会部署到Linux/Unix系统上。
- 常见的操作系统:Windows、IOS、Android、MacOS、Linux、Unix。
- Linux吉祥物:Tux
- Linux之父:Linus Torvads(Git创作者)
- Linux主要的发行版:Ubuntu(乌班图)、RedHat(红帽)、CentOS、Debain、Fedora、SuSE、OpenSUSE,都是基于Linux内核开发的版本。
1.3、Unix和Linux
Unix是由Ken Tompson 和Dennis richres开发的适用于大型服务器的系统
Linux是由Linus Torvads在Unix基础上开发的适用于x86个人计算机的系统,全称:GNU/Linux
2、VM和Linux的安装
需要环境:安装一个虚拟机,在虚拟机上安装一个CentOS系统。
2.1、安装VM和CentOS
安装步骤:
- 安装virtual Machine ware Workstation16
激活密钥(批量激活):
ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
- 安装Linux(CentOS 7.6/CentOS 8.5)
- VM和Linux的关系:
- Linux磁盘的手动分区:
- boot分区
- swap分区(交换分区):用来交换的分区,充当临时内存的角色,需要加载到内存的程序在内存已满的情况下暂时加载到交换分区上,等内存释放资源后再将程序加载到内存中。(交换分区只是虚拟内存,速度比内存慢)
- 根分区
2.2、VMware网络连接的三种模式
桥接模式:
VMWare会虚拟一块网卡和真正的物理网卡就行桥接,这样,发到物理网卡的所有数据包就到了VMWare虚拟机,而由VMWare发出的数据包也会通过桥从物理网卡的那端发出。桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接。相当于在一个局域网内创立了一个单独的主机,他可以访问这个局域网内的所有的主机。该模式下主机网卡和虚拟机网卡的IP地址处于同一个网段,子网掩码、网关、DNS等参数都相同。但是同一网段下最多有255种ip地址,超过数量就会造成ip冲突。
桥接模式下虚拟机和主机在网络上地位相等,可以理解为一台新的电脑。
NAT模式:
nat地址转换 虚拟系统通过本主机与外部系统通信,不造成ip冲突,而且外部系统无法进入到虚拟系统与虚拟系统通信。
主机系统:
主机模式:独立的系统,不和外部发生联系。
2.3、虚拟机的克隆
如果已经安装了一台 linux 操作系统,你还想再更多的,没有必要再重新安装,只需要克隆就可以。
- 方式1:直接拷贝一份安装好的虚拟机文件
在我的电脑中找到要克隆的虚拟机的文件,赋值后粘贴到另一个位置,在 vmware 中打开就好了。
- 方式2:使用 vmware 的克隆操作(注意:克隆时,需要先关闭 linux 系统 先关机)
在 vmware 中鼠标右击要克隆的虚拟机---->管理---->克隆---->克隆方法
- 克隆方法:
- 链接克隆:对原系统的引用(本质上没有克隆,就一个系统)
- 完整克隆:一般选这个,克隆出来的系统与原系统完全一样
2.4、虚拟机的快照
如果在使用虚拟机系统的时候(比如 linux),想回到原先的某一个状态,担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态,vmware 也提供了这样的功能,就叫快照管理。
方法:对左栏虚拟机鼠标右击--->快照--->拍摄快照,查看快照管理器,点击要回到的快照图标,转到快照记录的虚拟机状态。
注意:每次拍摄一个快照都是对当前状态进行保存,会占用硬盘空间,做有意义的快照。
2.5、安装vmtools
- vmtools 安装后,可以让我们在 windows 下更好的管理 vm 虚拟机
- 可以设置 windows 和 centos 的共享文件夹 (主机和虚拟系统都可以操作共享文件夹,更加方便)
2.6、设置共享文件夹
在主机上找到一个位置创建一个文件夹作为共享文件夹
然后在vm上操作:鼠标右击虚拟系统--->设置--->选项--->共享文件夹--->添加(将上述文件夹路径填上就好了)
点击主文件夹--->其他位置--->计算机---->mnt---->hgfs--->共享的文件夹
注意:在实际开发中,文件的上传下载是需要使用远程方式完成的。因为是主机A与主机B上的虚拟系统通信。
3、Linux的目录结构(⭐)
3.1、目录结构的基本介绍
linux 的文件系统是采用级层式的树状目录结构, 在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。
经典名言:在 Linux 世界里,一切皆文件(!!!)
注意:Linux操作系统中,每个目录叫什么名字,以及每个目录下存放什么东西都是规定好的。
常用目录说明:
- /root:存放root用户的文件
- /bin:存放linux常用指令
- /boot:linux启动时需要的文件
- /home:每创建一个用户,在home目录下都会有一个对应用户名的文件夹
- /dev:设备管理器(linux会把所有硬件映射成文件来管理 ——> Linux下一切皆文件!)
Linux目录结构都是规定好的,需要会背!(实际开发环境中都是使用小黑窗口操作linux系统)
3.2、具体的目录结构
目录注解介绍/bin常用是 Binary 的缩写, 这个目录存放着最经常使用的命令;子目录:/usr/bin 和 /usr/local/bin/sbins 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序;子目录:/usr/sbin 和 /usr/local/sbin/home常用存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名/root常用该目录为系统管理员,也称作超级权限者的用户主目录/lib系统开机所需要最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库/lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件(该目录隐藏起来了,使用命令可以看到)/etc常用所有的系统管理所需要的配置文件和子目录, 比如安装 mysql 数据库 my.conf/user常用这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows 下的 program files 目录/boot常用存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件/proc不能动这个文件,可能造成系统崩溃 这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息/srv不能动service 缩写,该目录存放一些服务启动之后需要提取的数据/sys不能动这是 linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs/tmp这个目录是用来存放一些临时文件的/dev类似于 windows 的设备管理器,把所有的硬件用文件的形式存储/media常用linux 系统会自动识别一些设备,例如 U 盘、光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下/mnt常用系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。 (比如共享文件)/opt这是给主机额外安装软件所存放的目录(想要安装某个软件,把它的安装软件放在这个目录下)。如想要在虚拟系统上安装 ORACLE 数据库就可以先把其安装文件放在该目录下。默认为空/user/local常用这是另一个给主机额外安装软件所安装的目录(软件安装后的目标目录)。一般是通过编译源码方式安装的程序/var常用这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件/selinuxsecurity-enhanced linuxSELinux 是一种安全子系统,它能控制程序只能访问特定文件, 有三种工作模式,可以自行设置. 类似于360,保证系统安全。这个目录看不到,因为没有被启用4、远程登陆Linux服务器
4.1、为什么需要远程登录linux
说明: 公司开发时候,具体的应用场景:
- linux 服务器是开发小组共享
- 正式上线的项目是运行在公网
- 因此程序员需要远程登录到 Linux 进行项目管理或者开发
4.2、远程登录工具Xshell
- Xshell 是目前最好的远程登录到 Linux 操作的软件,流畅的速度并且完美解决了中文乱码的问题,是目前程序员首选的软件。
- Xshell 是一个强大的安全终端模拟软件,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。
- Xshell 可以在 Windows 界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。
注意:
- 使用Xshell之前,需要知道Linux的ip地址
在Linux中,鼠标右击桌面打开终端,输入ifconfig指令,ens33中,就可以知道ip地址了。
- 要保证本机可以ping通虚拟主机:在本机DOS命令窗口中输入命令:ping 虚拟主机ip地址
登录Xshell:
- 打开Xshell--->添加会话--->主机(虚拟主机ip地址)--->确定
- 双击密钥--->选择接受并保存主机密钥(就不用重复接受了)
- 远程登陆成功
说明:在Linux终端或Xshell页面中,输入指令clear,可以“清空”当前页面内容(实际上是另开了一页,原有信息仍保存)。
4.3、远程传输文件工具Xftp
- 是一个基于 windows 平台的功能强大的 SFTP、FTP 文件传输软件。
- 使用了 Xftp 以后,windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件
注意:xftp打开时乱码:属性--->选项--->UTF-8编码
5、Vi 和 Vim编辑器
5.1、vi和vim基本介绍
Linux 系统会内置 vi 文本编辑器。
Vim可以看作是Vi的增强版本,Vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富。
5.2、vi和vim常用三种模式
- 正常模式(默认模式,一般模式)
以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。
在这个模式中,可以使用『上下左右』按键来移动光标,
可以使用『删除字符』或『删除整行』来处理档案内容,
也可以使用『复制、粘贴』来处理你的文件数据。
- 插入模式
一般模式下,按『i』键进入编辑模式(按下 i, I, o, O, a, A, r, R 中任何一个字母之后都会进入编辑模式,一般按『i』键,表示insert插入)后,可以在当前文件中执行写入操作
- 命令模式
一般模式下,按『:』键 或 『/』键 进入命令模式(注意:如果是按冒号,必须是英文状态下的冒号)
在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开 vim,显示行号等动作,输入指令后需要按『Enter』键执行指令。
5.3、vim三种模式的切换
5.4、vim常用快捷键
快捷键模式介绍wq命令模式保存写入并退出vim(wq, write quit)q命令模式退出vim(不保存)q!命令模式强制退出vim(不保存)yy一般模式复制光标所在的当前行p一般模式在当前行的下一行粘贴复制的内容5yy一般模式复制光标所在行开始的5行(yy前的数字任意)dd一般模式删除光标所在行的当前行5dd一般模式删除光标所在行开始的5行(dd前的数字任意)在文件中查找某个单词
- 初始在正常模式,输入/,进入命令行模式,然后输入要查找的单词,回车查找
- 输入n查找到下一个
- 想查找另一个单词:输入/,重复上述即可
给文件每行设置行号
- 先按『:』键
- 然后输入set nu (set number)
- 按『Enter』键
取消行号
- 先按『:』键
- 然后输入set nonu (set none number)
- 按『Enter』键
修改主机名
指令:hostnamectl set-hostname 新主机名
其他快捷键
- 快捷键到该文档的最首行(正常模式下):gg
- 快捷键到该文档的最末行(正常模式下):G
- 撤销动作(比如删除某一行,发现删错了,然后恢复这一行)(正常模式):u
- 在某个文件中,想让光标移动到第n行(正常模式):输入n,然后再按『shift+g』
5.5、vim键位图
6、开机/重启/用户登录注销
6.1、关机和重启命令
命令介绍shutdown -h now立即关机(h—>halt停止)halt立即关机,同上shutdown1分钟后关机shutdown -h 1同上,给每一个登录到Linux系统的用户发一条消息:1分钟后关机shutdown -h 22分钟后关机shutdonw -r now现在重新启动(r—>rboot重启)reboot现在重新启动,同上sync把内存的数据同步到磁盘注意不管是重启还是关机,首先要运行 sync 命令,把内存中的数据写到磁盘中;目前的 shutdown/reboot/halt 等命令均已经在关机前进行了sync,但还是手动执行一下sync保险既可以在Xshell,也可以在Linux执行上述指令
6.2、用户登录和注销
用户登录:
登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。
而且以后也用不到root,除非你是系统管理员。
可以利用普通用户登录,登录后再用 su - 用户名 命令来切换成系统管理员身份.
注销:在提示符下输入 logout 即可注销用户
注意:logout 注销指令在图形运行级别无效,在运行级别 3 下有效.
7、用户管理
7.1、基本介绍
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
一个Linux系统中只有一个root用户,但是由root用户可以创建多个其他用户,可以给这些用户分配权限,
其中每个用户会对应一个目录,这个目录称为家目录。
7.2、添加用户
语法:注意:当创建用户成功后,会自动创建和用户同名的家目录,该用户的家目录默认在home目录下
也可以给新用户指定家目录:useradd -d 指定目录 新用户名
比如:useradd -d /home/test king -> 创建一个新用户king,其家目录test
7.3、指定、修改密码
语法:passwd 用户名 表示给某个用户设置/更改密码
注意:要写用户名。不写用户名默认设置当前用户,如果当前用户是root就麻烦了。
比如:给milan设置密码,输入:passwd milan 后再按Enter键输入milan的密码。
命令:pwd --->显示当前用户所在目录(pwd, Print Working Directory)
7.4、删除用户
语法:userdel 用户名
普通用户不能删除别的用户,只有root用户可以;并且不能自己删除自己
- 删掉用户,但是保留其家目录:userdel 用户名
- 将用户和其家目录一起删除(这个操作要谨慎):user -r 用户名
- 一般情况,建议保留家目录(不删除)
注意:如果使用user1用户登录系统,然后使用su - root方式切换登录到root用户,去删除user1用户会操作失败(因为user1的用户系统还在运行,无法删除自己)。
7.5、查询用户信息
语法:id 用户名- [root@luminescent home]# id root
- uid=0(root) gid=0(root) 组=0(root)
复制代码 userid是0 gruopid组id是0 所在组0
当用户不存在:返回无此用户 no such user- [root@luminescent home]# id milan
- id: milan: no such user
复制代码 7.6、切换用户
在操作Linux中,如果当前用户的权限不够,可以通过su - 指令,切换到高权限用户(需要输入高权限用户的密码)(比如 root)
语法:su - username
注意:
- 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
- 当需要返回到原来用户时,使用exit/logout指令。
su username和su - username的区别:
- su username:只切换执行权限,并没有切换Shell环境,使用pwd指令查看工作空间还是上一次su - username后的工作空间(如果没有su - username操作则显示第一次登录系统时)的username工作目录。使用su切换执行权限后只能使用exit指令返回原用户。注意:su后面如果不跟username,则默认切换到root执行权限
- su - username:切换到用户的变量。su - username操作连用户和环境变量一起切换到username,使用pwd查看工作空间会发现已经切换到工作空间。使用su - username切换后会有username上一次的登录信息提示。使用su-切换执行权限和环境变量后可以使用logout或exit指令返回原用户。注意:su-默认切换到root并获得root环境变量和执行权限。
- 总结:su默认切换到root,su-默认切换到root并获得root的环境变量及执行权限
7.7、查看当前用户/登录用户
- 指令who am i/I -> 查看第一次登录系统的用户,如:who am I 或 who am i
- 指令whoami -> 查看当前登陆系统的用户(如果使用su指令切换了用户,则显示切换后的用户名)。
注意:连写后i只能小写。错误指令×:whoamI
假设A用户登录系统,切换到B用户,B输入命令who am i,输出的还是A用户的信息。
7.8、用户组
介绍:类似于角色,系统可以对有共性/有相同的权限的多个用户进行统一的管理
新增组:groupadd 组名
需求:假如A用户和B用户有相同的权限,给每个用户赋权。
解决方案:可以把A用户和B用户放在一个组里,然后给这个组赋权限,组里的用户有相同的权限。
说明:新增一个用户,其实会默认生成一个跟用户名相同的组,然后把用户放到该组里。
就像是 id root:uid=0(root) gid=0(root) 组=0(root)--->root组
案例1:增加一个用户zwj,把他直接放到组wudang中- groupadd wudang
- useradd -g wudang zwj
- id zwj:uid=1001(zwj) gid=1001(wudang) 组=1001(wudang)
复制代码 修改用户的组:usermod -g 用户组 用户名
案例2:把zwj 放到组 mojiao 中- groupadd mojiao
- usermod -g mojiao zwj
- id zwj:uid=1001(zwj) gid=1002(mojiao) 组=1002(mojiao)
复制代码 说明:当新增一个用户user时,user默认在以自己的名字命名的组user中,想要将新增的用户user放进其他组中,使用usermod命令- 新增一个用户john,怎么把john放进组mojiao中?
- useradd jhon
- usermod -g mojiao jhon
- 新增一个用户john,john在以自己的名字命名的组john中,从john组到mojiao组
复制代码 删除组:groupdel 组名
7.9、用户和组相关文件
注意:用户和组相关文件需要root权限
(1)/etc/passwd 文件
每增加一个用户,就会把用户的信息保存到该文件。用户(user)的配置文件,记录用户的各种信息
每行都是一个用户,每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
说明:
- 主目录:用户所在的家目录
- Shell:命令解释程序。shell是连接用户和Linux内核的桥梁
将发布的指令通过shell解析,再传给Linux内核,Linux是看不懂发布的指令的,shell有很多种,中国一般用的是bash
- 使用命令:vim /etc/passwd 可以查看该文件(还有其他命令也可以查看,如cat指令)
(2)/etc/shadow 文件
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
(3)/etc/group 文件
组(group)的配置文件,记录 Linux 包含的组的信息每行含义:组名:口令:组标识号:组内用户列表
7.10、拓展-Shell
Shell是什么?
图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。
然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。
Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。
Shell如何连接用户和内核?
Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!
其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。
接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。
比如,我们都知道在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。
Shell连接其他程序
在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。
Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。
大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。
可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。
Shell是一种脚本语言
任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。
有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。
这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。
这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。
8、实用指令
8.1、指定运行级别
Linux系统运行级别:
- 0:关机 -> 类似于shutdown -h now指令
- 1:单用户【可以找回丢失密码】
- 2:多用户状态没有网络服务(一般不用,没网络)
- 3:多用户状态有网络服务(实际开发中,linux系统都是以级别3运行的 -> 没有图形化界面,只有窗口)
- 4:系统未使用保留给用户
- 5:图形界面
- 6:系统重启
切换运行级别命令:init 0-6
指定默认运行级别:
- CentOS7之前是在文件/etc/inittab文件中设置
- CentOS7之后对设置进行了简化:
- 用 multi-user.target 代表3运行级别
- 用 graphical.target 代表5运行级别
命令:systemctl get-default 查看当前系统运行级别
命令:systemctl set-default multi-user.target|graphical.target 设置默认运行级别
注意:设置默认运行级别后需要重启系统才能生效。
8.2、重置root用户密码
- 启动虚拟机时 按【ESC】键
- 在linux启动页面选择Linux内核后,按【e】键
- 找到以“linux16”开头的行,【→】方向键移动光标至改行的“UTF-8”之后,添加以下红框中的内容即:rw single init=/bin/bash,再按【Ctrl】+【x】键执行
- 在如下图所示位置,输入passwd指令设置新的root密码(输入的root密码是隐藏的,所以切记谨慎输入并记住新的root密码)
- 输入新的root密码后,再输入指令exec /sbin/init重新初始化,正常启动系统
- 输入刚刚新设置的root密码(输入内容是隐藏的),如下图所示
- 进入系统后,输入reboot指令,重启系统即可使用新的root密码登录
- Linux系统root用户密码重置完成。
8.3、帮助指令
- 语法:man 命令/配置文件
是manual的简写,manual是手册的意思,获得帮助信息
- 例子:查看ls命令的帮助信息
输入:man ls 之后,会看到ls的具体信息(要回到前一个页面,输入q)
注意:可能不止一页,使用空格或下键,可以往下看
==在Linux系统下,隐藏文件是以.开头的
- 格式:ls [选项] [文件名...]
ls -a --->列出所有文件,包括隐藏文件(隐藏文件以 . 开头)
ls -l --->单列输出
- 选项以 - 开始
选项可以组合使用,没有顺序:
比如:ls -al也可以ls -a -l表示列出所有的文件 并 单列输出,ls -l和ll等价
- ls默认是对当前目录下的文件
也可以指定某个目录:
如:ls -al /root 表示把root目录下的所有文件单列输出
- 功能:获得 shell 内置命令的帮助信息
- 例子:查看 cd 命令的帮助信息:help cd
8.4、关于文件目录的指令
- pwd指令:显示当前工作目录的绝对路径
- ls [选项] [目录|文件]指令:
常用选项:
- -a:显示当前目录所有的文件和目录,包括隐藏的
- -l:以列表的方式显示信息
- -R:递归列出遇到的子目录
- cd [绝对路径|相对路径]指令:切换到指定目录
cd ~或者cd回到自己的家目录
cd ..:回到当前目录的上一级目录。如果已经在根目录,则保持不变
- mkdir [选项] 要创建的目录:
理解:mkdir指令用于创建目录(默认只能创建一级目录)
选项-p:创建多级目录。如:mkdir -p /home/test/linux
- rmdir [选项] 要删除的空目录:
rmdir删除的是空目录,如果欲删除的目录下有内容则无法删除
如果需要删除非空目录,需要使用rm -rf 要删除的目录
比如:删除animal目录:rm -rf /home/animal
- touch 要创建的文件名称:
如:touch /home/a.txt 表示在home目录下创建一个a.txt空文件
- cp [选项] source dest指令:拷贝文件到指定目录
常用选项:-r 递归复制整个文件夹
应用实例:将 /home/hello.txt 拷贝到 /home/bbb 目录下- cp /home/hello.txt /home/bbb
复制代码 递归复制整个文件夹,将/home/aaa 目录下的文件全部拷贝到/home/bbb下(是将整个目录和目录本身拷贝进来),使用强制覆盖不提示的方法:\cp。如:\cp -r /home/aaa /home/bbb
- rm指令:移除文件或目录
基本语法:rm [选项] 要删除的文件或目录
常用选项:
-r:递归删除整个文件夹
-f:强制删除不提示
案例1:将 /home/hello.txt 删除案例2:递归删除整个文件夹 /home/bbb ,并不提示注意:强制删除不提示的方法:带上 -f 参数即可
- mv指令:移动文件与目录或重命名
基本语法:- mv 原文件名 新文件名 (如果两个文件在同一个目录下,mv指令功能:重命名)
- mv 被移动的文件 移动到哪 (如果两个文件不在同一个目录下,mv指令功能:移动文件)
复制代码 案例 1: 将 /home/cat.txt 文件 重新命名为 pig.txt- [root@luminescent ~]# cd /home
- [root@luminescent home]# touch cat.txt
- [root@luminescent home]# ls
- cat.txt jack king milan zwj
- [root@luminescent home]# mv cat.txt pig.txt
- [root@luminescent home]# ls
- jack king milan pig.txt zwj
复制代码 案例 2:将 /home/pig.txt 文件 移动到 /root 目录下- [root@luminescent home]# mv pig.txt /root
- [root@luminescent home]# ls
- jack king milan zwj
- [root@luminescent home]# cd /root
- [root@luminescent ~]# ls
- Hello.java pig.txt
复制代码 移动并重名:mv pig.txt /root/cow.txt
案例 3: 移动整个目录,比如将 /opt/bbb 移动到 /home 下 - cat指令:查看文件内容
vi和vim指令能查看文件内容,但是容易误操作编辑文件内容。相比于vi|vim指令,cat也可以查看,cat只能查看不能修改,cat更安全。
基本语法:cat [选项] 要查看的文件
常用选项:-n(显示行号)
案例1:查看 /etc/profile 文件内容,并显示行号。注意:
cat 只能浏览文件,而不能修改文件;为了浏览方便再加上管道命令 | more
管道命令:把前面的结果再交给下一个指令进行处理。语法:| 其他指令- cat -n /etc/profile | more
- 意思:先执行cat -n /etc/profile 然后,按回车键输出一行,按空格翻页等。
复制代码 - more指令:管道命令
基本语法:more 要查看的文件 功能: more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。 more 指令中内置了若干快捷键(交互的指令),详见操作说明:
操作功能说明空格键代表向下翻一页Enter(回车)代表向下翻一行q代表立刻离开more,不再显示该文件内容Ctrl+F向下滚动一屏Ctrl+B返回上一屏=输出当前行的行号:f输出当前文件名号和当前行的行号
- less指令:查看文件内容
基本语法:less 要查看的文件
功能:
less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。
less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
有一个文件是100M,用vim查看会将其全部加载再显示出来,这样会很慢。使用less,会先加载一部分显示出来,再根据指令显示剩下的,这样更快。
所以要查找一些大的文件,建议用less。
案例: 采用 less 查看一个大文件文件 /root/武炼巅峰.txt
首先使用Xftp将 武炼巅峰.txt 传输到root目录下,然后输入指令:less /root/武炼巅峰.txt
下面操作中:
- 想要找某个字或词
- 输入:/要找的字或词 然后按n向下找 按N向上找
- 操作说明:
操作功能说明空格键向下翻一页[pagedown]向下翻动一页[pageup]向上翻动一页/字串向下搜寻[字串]的功能,[n]键向下查找,[N]键向上查找?字串向上搜寻[字串]的功能,[n]键向上查找,[N]键向下查找q离开less命令
- echo指令:输出内容到控制台
基本语法:echo [选项] [输出内容]
案例: 使用 echo 指令输出环境变量输出$PATH $HOSTNAME- echo $HOSTNAME (环境变量一般加$)
复制代码 案例: 使用 echo 指令输出 hello,world- echo "hello,world" (加不加引号都可以)
复制代码 - head指令:用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容。
基本语法:- head 文件 (功能描述:查看文件头 10 行内容)
- head -n 5 文件 (功能描述:查看文件头 5 行内容,5 可以是任意行数)
复制代码 案例: 查看/etc/profile 的前面 5 行代码 - tail指令:tail 用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前 10 行内容。
基本语法:- tail 文件 (功能描述:查看文件尾 10 行内容)
- tail -n 5 文件 (功能描述:查看文件尾 5 行内容,5 可以是任意行数)
- tail -f 文件 (功能描述:实时追踪该文档的所有更新,只要该文件改动了什么内容就可实时看到,常用于监控用户操作)
复制代码 - >指令和>>指令:
>指令:输出重定向(覆盖)
>>指令:文件末尾追加
基本语法:- ls -l > 文件1 (功能描述:将列表的内容写入文件1中(覆盖写))
- ls -al >> 文件1 (功能描述:将列表的内容追加到文件1的末尾)
- cat 文件1 > 文件2 (功能描述:将文件1的内容覆盖到文件2)
- echo "内容" >> 文件1 (将内容追加到文件1的末尾)
复制代码 案例 1: 将 /home 目录下的文件列表 写入到 /home/info.txt 中,覆盖写入。- ls -l /home > /home/info.txt [如果 info.txt 没有,则会自动创建]
复制代码 案例 2: 将当前日历信息追加到 /home/mycal 文件中 - ln指令:给原文件创建一个软链接,软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径(ln:link)
基本语法:- ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)
复制代码 案例1:在/home 目录下创建一个软连接 myroot,连接到 /root 目录(这样 切换到myroot 其实就是切换到root)案例2: 删除软连接 myroot当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录。
- history指令
功能:查看已经执行过历史命令,也可以执行历史指令
基本语法:- history (功能描述:查看已经执行过历史命令)
- 可以看其他登录的用户做了什么操作。
复制代码 案例 1: 显示所有的历史命令:history
案例 2: 显示最近使用过的 10 个指令:history 10
案例 3:执行历史编号为 5 的指令:!5
8.5、关于时间日期的指令
- date指令:显示当前日期
- date (功能描述:显示当前时间)
- date +%Y (功能描述:显示当前年份)
- date +%m (功能描述:显示当前月份)
- date +%d (功能描述:显示当前是哪一天)
- date "+%Y-%m-%d %H:%M:%S"(功能描述:显示年月日时分秒)
- 案例 1: 显示当前时间信息
- date
- 案例 2: 显示当前时间年月日
- date "+%Y-%m-%d"
- 案例 3: 显示当前时间年月日时分秒
- date "+%Y-%m-%d %H:%M:%S"
复制代码 案例 1: 设置系统当前时间:date -s "2020-11-03 20:02:10"
- cal指令:查看日历
- cal [选项] (功能描述:不加选项,默认显示本年本月日历)
复制代码 案例 1: 显示当前日历:cal
案例 2: 显示 2020 年日历:cal 2020
8.6、关于搜索查找的指令
- find指令:从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法:选项功能-name按照指定的文件名查找模式查找文件-user查找属于指定用户名所有文件-size按照指定的文件大小查找文件,文件大小单位:k,M,G案例 1: 按文件名:根据名称查找 /home 目录下的 hello.txt 文件
- find /home -name hello.txt
复制代码 案例 2:按拥有者:查找 /opt 目录下,用户名称为 nobody 的文件案例 3:查找整个 linux 系统下大于200M的文件(+n 大于,-n 小于,n 等于)- find / -size +200M
- ls -l /home/yxz/novel
- 总用量 57504
- -rw-r--r--. 1 root root 58882838 4月 3 11:59 武炼巅峰.txt
- ls -lh /home/yxz/novel (上面的总用量大小看不懂,加上h->human表示能看懂的内容)
- 总用量 57M
- -rw-r--r--. 1 root root 57M 4月 3 11:59 武炼巅峰.txt
复制代码 - locate指令:
可以快速定位文件路径。利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。
基本语法:locate 搜索文件
注意:由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
案例 1: 请使用 locate 指令快速定位 hello.txt 文件所在目录 - which指令:可以查看某个指令在哪个目录下
案例:ls 指令在哪个目录:which ls
- grep指令和管道符号|:
grep指令往往和管道符号 | 结合使用
grep:过滤查找,管道符:| -> 表示将前一个命令的处理结果输出传递给后面的命令处理。
比如:先cat a.txt,然后又想看a.txt文件中有没有hello这个词,那么就 cat a.txt | grep "hello" --->先找到a.txt,然后再在a.txt中找hello。
基本语法:grep [选项] 查找内容 源文件
常用选项:
案例 1: 请在 hello.txt 文件中,查找"yes"所在行,并且显示行号- 写法 1: cat /home/hello.txt | grep "yes" 引号写不写都行
- cat /home/hello.txt | grep -n "yes" 显示行号
- 写法 2: grep -n "yes" /home/hello.txt
复制代码 案例 2:在武炼巅峰.txt 文件中,查找"扇轻罗"所在行,并显示行号- cat /home/yxz/novel/武炼巅峰.txt | grep -n "扇轻罗" | more
- grep -n "扇轻罗" /home/yxz/novel/武炼巅峰.txt | more
复制代码 8.7、关于压缩和解压的指令
- gzip/gunzip指令
gzip:用于压缩文件
gunzip:用于解压的
基本语法:
- gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz 文件)
- gunzip 文件.gz (功能描述:解压缩文件命令)
复制代码 案例 1: gzip 压缩,将 /home 下的 hello.txt 文件进行压缩案例 2: gunzip 解缩,将 /home 下的 hello.txt.gz 文件进行解压- gunzip /home/hello.txt.gz
复制代码
- zip/unzip 指令
zip 用于压缩文件
unzip 用于解压的 (这个在项目打包发布中很有用)
基本语法
- zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
- unzip [选项] XXX.zip (功能描述:解压文件)
复制代码 zip 常用选项-r:递归压缩,即压缩目录
unzip 的常用选项-d:指定解压后文件的存放目录
案例 1:将 /home 下的所有文件/文件夹压缩成 myhome.zip- zip -r myhome.zip /home/ [将 home 目录及其包含的文件和子文件夹都压缩]
复制代码 案例 2:将 myhome.zip 解压到 /opt/tmp 目录下- mkdir /opt/tmp
- unzip -d /opt/tmp /home/myhome.zip
复制代码
- tar 指令:打包指令,最后打包后的文件是 .tar.gz 的文件。把一个或者多个文件(夹)用压缩软件进行压缩的过程,一般可称之为打包。
tar指令可以压缩也可以解压。根据选项来 压缩还是解压。基本语法:
- tar [选项] XXX.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
复制代码 选项功能-c产生.tar打包文件-v显示详细信息-f指定压缩后的文件名-z打包同时压缩-x解包.tar文件案例 1:压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz- tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
复制代码 案例 2:将 /home 的文件夹压缩成 myhome.tar.gz:tar -zcvf myhome.tar.gz /home/
案例 3:将 pc.tar.gz 解压到当前目录:tar -zxvf pc.tar.gz
案例 4:将 myhome.tar.gz 解压到 /opt/tmp2 目录下- (1) mkdir /opt/tmp2
- (2) tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
复制代码 注意:-C 后写要解压到的位置
9、组管理和权限管理
9.1、Linux组基本介绍
在 linux 中的每个用户必须属于一个组,不能独立于组外。
在 linux 中每个文件都有所有者、所在组、其它组的概念。
9.2、文件/目录的所有者
一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。但是所有者也可以更改。
- 查看文件/目录的所有者(在/home下才能看到)
指令:ls –ahl
- drwxr-xr-x. 6 root root 4.0K 2月 23 13:59 .
- dr-xr-xr-x. 18 root root 4.0K 2月 20 16:45 ..
- -rw-r--r--. 1 root root 24 2月 22 21:59 hello.txt
- ...
复制代码 第三列就是文件/目录的所有者,第四列是文件/目录所在组(创建该文件/目录的所有者所在的组,也可以后期修改所在组)
- 修改文件/目录所有者指令:chown 新所有者 文件名
案例:使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom
chown tom apple.txt
9.3、组的创建
基本指令:groupadd 组名
案例:创建一个用户 fox ,并放入到 monster 组中:useradd -g monster fox
9.4、文件/目录所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
查看文件/目录所在组,指令:ls –ahl或者ll
注意:ll并不是linux下一个基本的命令,它实际上是ls -l的一个别名。Ubuntu默认不支持命令ll,必须用 ls -l,这样使用起来不是很方便。
注意:/etc/group下存放着所有的组
使用指令:cat /etc/group可以查看所有的组
比如查看有没有mojiao这个组,可以使用管道命令和grep过滤:cat /etc/group | grep mojiao
9.5、其他组
除文件的所有者和所在组的用户外,系统的其它用户都是该文件的其它组。
9.6、改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组。
改变用户所在组- usermod –g 新组名 用户名
- usermod –d 目录名 用户名 (改变该用户登陆的初始目录)
复制代码 特别说明:用户需要有进入到新目录的权限。
如何查看用户所在的组?id 用户名 --->显示用户信息
案例:将 zwj 这个用户从原来所在组,修改到 wudang 组- 先查看zwj在哪个组:id zwj
- 然后查看有没有wudang这个组:cat /etc/group | grep wudang
- 修改:usermod -g wudang zwj
复制代码 9.7、权限基本介绍
ls -l中显示的内容如下:- [root@luminescent home]# ll
- 总用量 8
- -rw-r--r--. 1 root root 0 4月 4 15:19 a.txt
- drwxr-xr-x. 2 root root 4096 4月 4 15:21 file
- lrwxrwxrwx. 1 root root 5 4月 4 15:18 myroot -> /root
- drwx------. 16 yxz yxz 4096 4月 4 14:45 yxz
复制代码 第一列共10位,以drwxr-xr-x为例:
0-9 位说明:
- 第 0 位确定文件类型(d, - , l , c , b)
- d 是目录,相当于 windows 的文件夹
- - 代表是普通文件(.txt)
- l 是链接(link),相当于 windows 的快捷方式
- c 是字符(char)设备文件,比如鼠标,键盘 ---> /dev/目录下可以看到
- b 是块(block)设备,比如硬盘 ---> /dev/目录下可以看到
- 第 1-3 位确定该文件的所有者对该文件的权限。---User
- 第 4-6 位确定该文件所属的组和该组中的用户对该文件的权限。---Group
- 第 7-9 位确定其他用户(不是所有者,也不是同一组的其他用户)对该文件的权限 ---Other
9.8、rwx权限详解
权限有三种:
- r 代表可读(read)
- w 代表可写(write)
- x 代表可执行(execute)
rwx作用到文件:
- r: 可以读取,查看
- w: 可以修改,但是不代表可以删除该文件
注意:删除一个文件的前提条件是 对该文件所在的目录 有 写(w)权限,才能删除该文件.
- x: 可以被执行,前提是可执行文件
rwx作用到目录:
- r: 可以读取,可以使用ls指令查看目录内容
- w: 可以修改,可以对目录进行 创建+删除(删除该目录的前提是:对父目录拥有w权限)+重命名目录
- x: 可以使用cd指令进入该目录
9.9、文件/目录权限实际案例
以-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc为例,进行分析:
- 第一列中 10 个字符:-rwxrw-r--
确定不同用户能对文件干什么(权限):
第一个字符代表文件类型:- l d c b
其余字符每 3 个一组(rwx):读(r) 写(w) 执行(x)
第一组 rwx:文件所有者的权限是 可读、写和执行
第二组 rw-:与文件所有者同一组的用户的权限是 可读、写但不能执行
第三组 r--:不与文件拥所有者同组的其他用户 的权限是 可读但不能写和执行
也可以用数字表示对应的权限:r=4,w=2,x=1 -> 7种组合情况:rwx=4+2+1=7, rw-=4+2=6, r-x=4+1=5, r--=4, -wx=2+1=3, -w-=2, --x=1
- 如果是普通文件,直接就是1;
- 如果是目录,代表该目录下有多少内容(即子目录数+文件数),目录最少是2 -> 每个目录至少包含两个隐藏目录(子目录. 和 父目录..)
- 第三列:root 该文件/目录的所有者
- 第四列:root 该文件/目录的所在组
- 第五列:1213 文件大小(这里是字节)
- 第六列:Feb 2 09:39 最后修改日期
- 第七列:abc 文件名
9.10、chmod修改权限
基本说明:
通过 chmod 指令,可以修改文件或者目录的权限。
第一种方式:通过 + 、-、= 变更权限
- u:所有者
- g:所在组(同一个组的其他用户)
- o:其他人(不同一个组的其他用户)
- a:所有人(所有用户)(u、g、o 的总和)
语法格式:- chmod u=rwx,g=rx,o=x 文件/目录名 (该文件/目录的u的权限是rwx,g的权限是rx,o的权限是x)
- chmod o+w 文件/目录名 (该文件/目录的o的权限加上w)
- chmod a-x 文件/目录名 (取消该文件/目录的所有人的x权限)
复制代码 案例演示:
1.给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rwx,g=rx,o=rx abc
2.给 abc 文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
3.给 abc 文件的所有用户添加读的权限
chmod a+r abc
注意:文件名的颜色表示该文件类型
- 可执行文件 ——> 文件名 绿色
- 普通文件 ——> 文件名 白色
- 目录/文件夹 ——> 文件名 蓝色
- 压缩文件 ——> 文件名 红色
第二种方式:通过数字变更权限
权限可以用数字代替:r=4 w=2 x=1- chmod u=rwx,g=rx,o=x 文件/目录名
- 相当于
- chmod 751 文件/目录名
复制代码 案例演示:将/home/abc.txt文件的权限修改成rwxr-xr-x,使用给数字的方式实现- rwxr-xr-x:u-rwx g=r-x o=r-x
- chmod 755 /home/abc.txt
复制代码 9.11、chown修改文件/目录所有者
语法格式:- chown newowner 文件/目录 (修改所有者)
- chown newowner newgroup 文件/目录 (同时修改所有者和所在组)
复制代码 选项:-R:如果是目录 则使其下所有子文件或目录递归生效(R:Recursive递归)
案例演示
1.请将 /home/abc.txt 文件的所有者修改成 tom
chown tom /home/abc.txt
2.请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom
chown -R tom /home/test
9.12、chgrp修改文件/目录的所在组
语法格式:chgrp newgroup 文件/目录
案例演示:
- 将 /home/abc.txt 文件的所在组修改成shaolin(少林)
groupadd shaolin
chgrp shaolin /home/abc.txt
- 将 /home/test 目录下所有的文件和目录的所在组都修改成shaolin(少林)
chgrp -R shaolin /home/test
9.13、实操-警察土匪游戏
有两个组:police组,bandit组
有四个用户:jack,jerry,xh,xq
jack,jerry:警察 xh,xq:土匪
- 创建组
groupadd police,groupadd bandit
- 创建用户(直接放到对应组)
useradd -g police jack
useradd -g police jerry
useradd -g bandit xh
useradd -g bandit xq
- jack创建一个文件,自己可以读 r 写 w,本组人可以读,其它组没人任何权限
- 首先jackie登录,可以使用切换用户:su jackie ----> 这样不行,无法创建文件,权限不够
- 先设置jack登陆密码:passwd jack,密码为:jack
- su - jack,切换到jack的环境变量和执行权限
- 创建文件:touch jackie.txt
- 原文件权限:-rw-r--r--,设置文件权限:chmod o-r jack.txt 或者使用数字修改权限:chmod 640 jack.txt
- jack修改jack.txt文件,让其它组人可以读,本组人可以读写
chmod o+r jack.txt 或者 chmod 664 jack.txt
改后的权限:rw-rw-r--
- xh投靠警察:usermod -g police xh(需要root权限)
- 测试xh和xq能不能对jackie.txt文件进行读写,分别使用xh和xq登录(首先对其设置密码123)
- 要想对jack.txt文件进行操作,首先需要进入jack目录,但是jack目录权限是:rwx------,所以xh连jackie目录都进不去
- 登录jack,对jack目录权限进行修改(也可以登录root进行修改)(必须都在home下才能执行这个修改权限命令)
结论:如果要对目录内的文件进行操作,首先要有对该目录有相应权限
9.14、练习
练习一:西游记的角色管理
- 建立两个组(神仙(sx),妖怪(yg))
groupadd sx, groupadd yg
- 建立四个用户(唐僧ts,悟空wk,八戒bj,沙僧ss),妖怪组yg:悟空,八戒;神仙组sx:唐僧,沙僧
神仙组用户:useradd -g sx ts, useradd -g sx ss, 妖怪组用户: useradd -g yg wk, useradd -g yg bj
- 设置密码(都为123):passwd 用户名
- 用悟空建立一个文件 monkey.txt ,该文件要输出 i am a monkey
- 切换至悟空登录:su - wk
- 修改文件内容:vim monkey.txt -> 输入内容:i am a monkey
- 保存并退出到命令行:[ESC]键 -> :wq
- 给八戒一个可以 rw 的权限
- 修改悟空的家目录权限(给同组用户增加rwx权限):cd /home -> chmod g+r+w+x wk
- 修改monkey.txt的权限(添加rw权限):chmod g+r+w /home/wk/monkey.txt
- 八戒修改 monkey.txt 加入一句话(i am a pig)
- 切换至八戒登录:su - bj
- 修改文件内容:vim /home/wk/monkey.txt -> i am a pig
- 唐僧 沙僧 对该文件没有权限,把 沙僧 放入妖怪组:
- 普通用户没有修改用户组的权限,切换至root权限:su - root,输入root密码
- 将沙僧放入妖怪组:usermod -g yg ss
- 让沙僧修改该文件monkey.txt, 加入一句话 ("我是沙僧,我是妖怪!")
- 切换至沙僧登录:su - ss
- 修改文件:vim /home/wk/monkey.txt -> 输入一句话:我是沙僧,我是妖怪!
- 保存并退出到命令行:[ESC]键,:wq
注意:rwx权限对于文件夹(目录)的细节讨论和测试
x: 表示可以进入到该目录,比如 cd
r: 表示可以 ls ,将目录的内容显示
w: 表示可以在该目录下删除或者创建文件
练习二:
- 用 root 登录,建立用户mycentos,自己设定密码:useradd mycentos -> passwd mycentos
- 用 mycentos 登录,在主目录下建立目录 test/t11/t1
- 切换mycentos登录:su - mycentos
- 主目录下创建目录:mkdir -p test/t11/t1
- 在 t1 中建立一个文本文件 aa,用 vi 编辑其内容为 ls –ahl
vi /home/mycentos/test/t11/t1/aa -> 输入内容ls -ahl
- 改变 aa 的权限为可执行文件[可以将当前日期追加到一个文件],运行该文件./aa
- 在aa文件中追加日期:vim test/t11/t1/aa -> 键进入编辑模式 -> 输入date "+%F %T"
- 修改aa的权限:chmod u+x test/t11/t1/aa
- 运行文件:. /文件
- 删除新建立的目录 test/t11/t1:rm -rf test
- 删除用户 mycentos 及其主目录中的内容:userdel -r mycentos
- 将 linux 设置成进入到图形界面:init 5
- 重新启动 linux 或关机:reboot 或者 init 0
10、定时任务调度
10.1、crond任务调度
- 概述
任务调度:是指系统在某个时间执行特定的命令或程序。crond--->周期任务
任务调度分类:
- 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等\
- 个别用户工作:个别用户可能希望执行某些程序,比如对 mysql 数据库的备份。
示意图:
- 基本语法:crontab [选项]
功能:进行定时任务的设置
- 常用选项:
-e编辑crontab定时任务-l查询crontab定时任务-r删除当前用户所有的crontab任务
- 快速入门
- crontab -e (进入/etc/crontab文件,所有的定时任务都在该文件中)
- 在文件中输入定时任务的命令,语法格式:* * * * * user command
- */1**** date > /home/my
- */1**** cal >> /home/my
- 保存并退出
- 参数说明
参数含义范围第一个*一小时当中的第几分钟0-59第二个*一天当中的第几小时0-23第三个*一个月中的第几天1-31第四个*一年中的第几个月1-12第五个*一周的星期几0-7(0和7都代表星期日)特殊符号说明:
特殊符号说明*代表任何时间,比如第一个*就代表一小时中每分钟都执行一次的意思,代表不连续时间,比如“0 8,12,16 * * * 命令”,代表每天的8点0分,12点0分,16点0分都执行一次命令-代表连续时间,比如“0 5 ** 1-6 命令”,代表周一到周六凌晨5点0分执行命令*/n代表每隔多久执行一次,比如“*/10 * * * * 命令”,代表每隔十分钟就执行一次命令案例:
- 45 22 * * *命令 -> 在每天22点45分执行命令
- 0 17 * * 1 命令 -> 每周一的17点0分执行命令
- 0 5 1,15 * * 命令 -> 每月1号和15号的凌晨5点0分执行命令
- 40 4 * * 1-5 命令 -> 每周一到周五的凌晨4点40分执行命令
- */10 4 * * * 命令 -> 每天的凌晨4点,每隔10分钟执行一次命令,4点0分、4点10分、4点20分..依次类推
- 0 0 1,15 * 1 命令 -> 每月1号和15号,每周一的0点0分都会执行命令 -> 1号和15号哪一天是周一就执行命令,没有则不执行。建议星期几和几号不要同时出现,容易产生混乱。
- 应用实例
- 案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
- crontab -e
- */1 * * * * date >> /tmp/mydate
- 案例 2:每隔 1 分钟,将当前日期和日历都追加到 /home/mycal 文件中
- 第一种方法:
- crontab -e
- 在crontab文件中输入:
- */1 * * * * date >> /home/mycal
- */1 * * * * cal >> /home/mycal
- 保存退出
- 第二种方法:
- 将 date >> /home/mycal 和 cal >> /home/mycal 命令写在文件 /home/my.sh中
- 就是将命令都写在shell脚本中,直接调用shell脚本
- 步骤:
- vim /home/my.sh
- 在my.sh中写入:
- date >> /home/mycal
- cal >> /home/mycal
- :wq
- 给 my.sh 增加执行权限:chmod u+x /home/my.sh (否则无法使用crontab命令)
- crontab -e
- 在crontab中写入:*/1 * * * * /home/my.sh
- 注意:可以写脚本也可以不写脚本
- 案例 3: 每天凌晨 2:00 将 mysql 数据库 testdb 备份到文件中。
- 提示: 指令为 mysqldump -u root -p密码 数据库 > /home/db.bak
- 步骤(1) crontab -e
- 步骤(2) 0 2 * * * mysqldump -u root -proot testdb > /home/db.bak
复制代码 - crond相关指令
- crontab –r:终止任务调度。
- crontab –l:列出当前有哪些任务调度
- service crond restart:重启任务调度
10.2、at定时任务
- 基本介绍
- at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行;
- 每个作业队列(任务队列)中都有作业(作业里是指令/脚本);
- 默认情况下,atd守护进程每60秒检查作业队列;
有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业;
运行完这个作业(任务)之后,这个作业就不会再被执行了;
- at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了;
- 在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看
ps -ef ---> 查看所有的进程
ps -ef | grep atd -> 可以检测 atd 是否在运行- root 1284 1 0 08:14 ? 00:00:00 /usr/sbin/atd -f -> 表示atd守护线程正在执行
- root 3922 1964 0 10:16 pts/0 00:00:00 grep --color=auto atd
复制代码 总结:at命令就是对某个定时任务只执行一次
- at 命令格式
语法:at [选项] [时间]
然后输入两次:Ctrl + D(结束 at 命令的输入)
如果在at命令中要删除光标前的内容:Ctrl+[Backspace]键
- at 命令选项:
选项含义-m当指定的任务被完成后,将给用户发送邮件,即使没有标准输出-Iatq的别名-datrm的别名-v显示任务将被执行的时间-c打印人物的内容到标准输出-V显示版本信息-q使用指定的队列-f从指定文件读入任务而不是从标准输入读入-t以时间参数的形式提交要运行的任务
- at 指定时间的方法
- 接受在当天的hh:mm(小时:分钟)式的时间指定。如果指定的时间已经过去,则在第二天执行。如:04:00
- 使用 midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
- 采用 12小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午。例如:12pm
- 指定命令执行的具体日期,指定格式为 month day(月 日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-03-1 (小的时间写前面,大的时间写后面)
- 使用相对计时法。指定格式为:now + count time-units
now 就是当前时间,time-units 是时间单位,这里能够是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。
count 是时间的数量,几天,几小时。 例如:now + 5 minutes
- 直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。
- 应用实例
- 案例 1:2 天后的下午 5 点执行 /bin/ls /home
- at 5pm + 2 days
- /bin/ls /home
- 两次ctrl+D
-
- 案例 2:atq 命令来查看系统中没有执行的工作任务
- 直接输入atq 查询
- 案例 3:明天17点钟,输出时间到指定文件内 比如 /root/date100.log
- at 5pm tomorrow
- date > /root/date100.log
- 两次ctrl+D
-
- 案例 4:2分钟后,输出时间到指定文件内 比如 /root/date200.log
- at now + 2 minutes
- date > /root/date200.log
- 两次ctrl+D
-
- 案例 5:删除已经设置的任务
- atrm 任务编号
- atrm 4 //表示将 job 队列,编号为 4 的 job 删除.
- atq:
- 2 Thu Feb 24 09:53:00 2022 a root
- 1 Fri Feb 25 17:00:00 2022 a root
- 第一列就是编号
- 注意:也可以执行脚本
- 比如:
- at now + 2 minutes
- /root/my.sh
- 但要有这个脚本,并且有执行权限x
复制代码 11、Linux磁盘分区挂载
11.1、Linux分区
- 原理介绍
Linux无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录/,一个独立且唯一的文件结构
Linux中每个分区都是用来组成整个文件系统的一部分。
Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。
这时要载入的一个分区将使它的存储空间在一个目录下获得。
图解:硬盘上的一个分区 通过挂载mount机制 与文件系统中的某个目录联系起来,即分区挂载到目录,访问这个目录即访问这个分区
可以通过指令lsblk查看挂载情况:(lsblk:list block devices)
说明:sda1分区挂载到/boot目录,sda2分区挂载到/根目录,sda3分区挂载到swap交换分区
- lsblk -f指令:查看更详细的磁盘分区挂载情况
说明:
- 第一列可以看到设备/硬盘分区情况:sda硬盘下有三个分区sda1、sda2、sda3
- FSTYPE:文件系统类型(File System TYPE)
- UUID:格式化之后,会给每一个分区分配一个 唯一的 不重复的 40位 的 字符串
- MOUNTPOINT:挂载点
- 硬盘说明:
- (1) Linux 硬盘主要分为:
- IDE 硬盘和 SCSI 硬盘
- 目前基本上是 SCSI 硬盘
- (2) 对于 IDE 硬盘,驱动器标识符为“hdx~”
- 其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘
-
- “x”为盘号
- a 为基本盘 第一个硬盘
- b 为基本从属盘 第二个硬盘
- c 为辅助主盘 第三个硬盘
- d 为辅助从属盘 第四个硬盘
-
- “~”代表分区
- 前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区
-
- 例:hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区
- hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区
-
- (3) 对于 SCSI 硬盘则标识为“sdx~”
- SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样
复制代码 11.2、挂载的经典案例
为虚拟机添加一块硬盘的步骤:
- 虚拟机添加硬盘
- 分区
- 格式化
- 挂载
- 设置可以自动挂载(永久挂载)
11.2.1、虚拟机添加硬盘
- 选中【虚拟机】,右键菜单中选择【设置】
- 点击【添加】,选择添加【硬盘】
- 然后一路【下一步】,磁盘类型选择【SCSI】,后面只有选择磁盘大小的地方需要修改,直到完成
使用命令lsblk发现没有新增的硬盘? -> 需要重启系统(才能识别)- [root@luminescent ~]# lsblk -f
- NAME FSTYPE LABEL UUID MOUNTPOINT
- sda
- ├─sda1 ext4 13781296-efb8-4f86-8810-834f301cab2a /boot
- ├─sda2 ext4 b219b5da-e417-4ab2-9bf1-c506930a68b0 /
- └─sda3 swap 5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
- sdb
- sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码 新增硬盘sdb,还未分区。
11.2.2、硬盘分区
对新增磁盘sdb进行分区步骤:
- 分区命令:fdisk /dev/sdb -> dev目录下都是对硬件映射的文件
- 开始分区后输入命令:n(add a new partition)
常用命令:
- a toggle a bootable flag
- b edit bsd disklabel
- c toggle the dos compatibility flag
- d delete a partition
- g create a new empty GPT partition table
- G create an IRIX (SGI) partition table
- l list known partition types
- m print this menu
- n add a new partition(新增分区)
- o create a new empty DOS partition table
- p print the partition table
- q quit without saving changes(退出不保存)
- s create a new empty Sun disklabel
- t change a partition's system id
- u change display/entry units
- v verify the partition table
- w write table to disk and exit(写入分区设置并退出)
- x extra functionality (experts only)
- 输入选择:p(primary主分区 默认选择, extended扩展分区)
- 分区号(1-4,默认1):1(输入2,磁盘就有2个分区)
- 两次回车,设置扇区默认值
- 起始 扇区 (2048-2097151,默认为 2048):
- 将使用默认值 2048
- Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
- 将使用默认值 2097151
- 分区 1 已设置为 Linux 类型,大小设为 1023 MiB
复制代码 - 最后输入:w -> 写入分区并退出(若不保存并退出输入 q,即上面步骤出错了想重来就可以输入q)
- [root@luminescent ~]# lsblk
- NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
- sda 8:0 0 20G 0 disk
- ├─sda1 8:1 0 1G 0 part /boot
- ├─sda2 8:2 0 17G 0 part /
- └─sda3 8:3 0 2G 0 part [SWAP]
- sdb 8:16 0 1G 0 disk
- └─sdb1 8:17 0 1023M 0 part
- sr0 11:0 1 4.4G 0 rom
复制代码 分区成功,磁盘sdb中只有一个分区sdb1
11.2.3、格式化分区
格式化分区目的:给这个分区指定它的文件类型- [root@luminescent ~]# lsblk -f
- NAME FSTYPE LABEL UUID MOUNTPOINT
- sda
- ├─sda1 ext4 13781296-efb8-4f86-8810-834f301cab2a /boot
- ├─sda2 ext4 b219b5da-e417-4ab2-9bf1-c506930a68b0 /
- └─sda3 swap 5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
- sdb
- └─sdb1
- sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码 sdb1的UUID为空,说明该分区尚未格式化
格式化命令:mkfs -t ext4 /dev/sdb1 -> 其中 ext4 是分区类型- [root@luminescent ~]# mkfs -t ext4 /dev/sdb1
- mke2fs 1.42.9 (28-Dec-2013)
- 文件系统标签=
- OS type: Linux
- 块大小=4096 (log=2)
- 分块大小=4096 (log=2)
- Stride=0 blocks, Stripe width=0 blocks
- 65536 inodes, 261888 blocks
- 13094 blocks (5.00%) reserved for the super user
- 第一个数据块=0
- Maximum filesystem blocks=268435456
- 8 block groups
- 32768 blocks per group, 32768 fragments per group
- 8192 inodes per group
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376
- Allocating group tables: 完成
- 正在写入inode表: 完成
- Creating journal (4096 blocks): 完成
- Writing superblocks and filesystem accounting information: 完成
复制代码 查看格式化后的分区详细信息:- [root@luminescent ~]# lsblk -f
- NAME FSTYPE LABEL UUID MOUNTPOINT
- sda
- ├─sda1 ext4 13781296-efb8-4f86-8810-834f301cab2a /boot
- ├─sda2 ext4 b219b5da-e417-4ab2-9bf1-c506930a68b0 /
- └─sda3 swap 5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
- sdb
- └─sdb1 ext4 68dedbb9-310d-4fb3-94c0-33947729c395
- sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码 可以看到sdb1分区有UUID唯一标识符 -> sdb1分区格式化完成,但是MOUNTPOINT(挂载点)尚未指定
11.2.4、分区挂载
挂载的目的:将一个分区与一个目录联系起来
挂载命令:mount 设备名称 挂载目录
挂载步骤:
- 首先创建一个目录newdisk (目录位置随便) 假如在根目录下创建:mkdir newdisk
- 进行挂载:mount /dev/sdb1 /newdisk
查看分区挂载信息:- [root@luminescent /]# lsblk -f
- NAME FSTYPE LABEL UUID MOUNTPOINT
- sda
- ├─sda1 ext4 13781296-efb8-4f86-8810-834f301cab2a /boot
- ├─sda2 ext4 b219b5da-e417-4ab2-9bf1-c506930a68b0 /
- └─sda3 swap 5e43ae36-a647-46aa-aea1-542ee2afcb63 [SWAP]
- sdb
- └─sdb1 ext4 68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk
- sr0 iso9660 CentOS 7 x86_64 2020-11-04-11-36-43-00
复制代码 挂载点有了,挂载成功。
- 卸载(去除分区与目录的联系):仅仅删除联系,不会删除已经写入到分区中的文件
命令:umount [设备名称|挂载的目录]
例如:umount /dev/sdb1 或者 umount /newdisk
注意: 用命令行挂载,重启后会失效。
11.2.5、设置自动挂载
设置自动挂载目的:解决命令行设置挂载重启后失效问题
自动挂载(永久挂载)步骤:
- 通过修改文件/etc/fstab实现挂载
新增一行:UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk ext4 defaults 0 0- #
- # /etc/fstab
- # Created by anaconda on Fri Mar 31 15:15:26 2023
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
- #
- # 或者写成以下方式:
- # /dev/sdb1 /newdisk ext4 defaults 0 0
- UUID=68dedbb9-310d-4fb3-94c0-33947729c395 /newdisk ext4 defaults 0 0
- UUID=b219b5da-e417-4ab2-9bf1-c506930a68b0 / ext4 defaults 1 1
- UUID=13781296-efb8-4f86-8810-834f301cab2a /boot ext4 defaults 1 2
- UUID=5e43ae36-a647-46aa-aea1-542ee2afcb63 swap swap defaults 0 0
复制代码 注意:要挂在的设备可以是上一步生成的sdb1的UUID(建议此种方式设置),也可以是磁盘分区映射到Linux系统的文件/dev/sdb1- 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项 转储频率 自检次序
- UUID=上面sdb1的UUID /newdisk ext4 defaults 0 0
复制代码 说明:
- 要挂载的设备或伪文件系统:设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
- 挂载点:指定的文件夹
- 文件系统类型:一般是ext4,交换分区是swap
- 挂载选项:defaults
- 转储频率:0:不做备份 1:每天转储 2:每隔一天转储
- 自检次序:0:不自检 1:首先自检;一般只有rootfs才用1;
- 添加完成后,执行mount –a即刻生效 或者 重启系统reboot
11.3、磁盘情况查询
- 查询系统整体磁盘使用情况
基本语法:df -h (disk free)- [root@luminescent ~]# df -h
- 文件系统 容量 已用 可用 已用% 挂载点
- devtmpfs 975M 0 975M 0% /dev
- tmpfs 991M 0 991M 0% /dev/shm
- tmpfs 991M 11M 980M 2% /run
- tmpfs 991M 0 991M 0% /sys/fs/cgroup
- /dev/sda2 17G 5.4G 11G 34% /
- /dev/sdb1 991M 2.6M 922M 1% /newdisk
- /dev/sda1 976M 178M 732M 20% /boot
- vmhgfs-fuse 254G 194G 61G 77% /mnt/hgfs
- tmpfs 199M 12K 199M 1% /run/user/42
- tmpfs 199M 0 199M 0% /run/user/0
复制代码 - 查询指定磁盘的占用情况
基本语法:du -h 指定目录 (disk usage)
功能:查询指定目录的磁盘占用情况,默认为当前目录
- -s:指定目录占用大小汇总
- -h:带计量单位
- -a:含文件
- -c:列出明细的同时,增加汇总值
- --max-depth=1:子目录深度
- 应用实例:查询 /opt 目录的磁盘占用情况,深度为 1
du -hac --max-depth=1 /opt
11.4、磁盘情况-工作实用指令
- 统计/opt 文件夹下文件的个数:ls -l /opt | grep "^-" | wc -l
说明:
- grep "^-" ---> 筛选出以-开头的,因为以-开头的都是文件
- wc(word count): 统计数量
wc -l: 统计行数l(lines)
- 统计grep筛选后的行数即文件个数
- 统计/opt 文件夹下目录的个数:ls -l /opt | grep "^d" | wc -l
- 统计/opt 文件夹下文件的个数,包括子文件夹里的:ls -lR /opt | grep "^-" | wc -l
-R选项: 递归列出遇到的子目录
- 统计/opt 文件夹下目录的个数,包括子文件夹里的:ls -lR /opt | grep "^d" | wc -l
- tree 目录指令:以树状显示目录结构
默认情况下没有tree指令,需要使用yum install tree指令安装,一直选择y选项即可完成安装。
12、网络配置
12.1、Linux网络配置原理
- 通过ifconfig指令查看Linux虚拟机的ip地址:192.168.218.129
- 然后在本机DOS命令窗口输入指令ipconfig,查看vmnet8的ip地址:192.168.218.1
Linux虚拟机和vmnet8在同一网段(192.168.218),所以可以互相通信
- 得到本机的无线网络适配器(无线网卡)的ip地址
为什么Linux虚拟机可以连外网(比如打开百度)?Linux虚拟机 ---> 本机vmnet8 ---> 本机无线网卡 ---> 教室局域网网关 ---> 外网
每次开机linux虚拟机的ip地址不一定相同(动态ip),linux虚拟机的ip地址可以设置成为静态ip -> 确保每次开机后linux虚拟机的ip不会变化
12.2、查看网络ip和网关
修改Linux虚拟机ip地址:vmware--->编辑--->虚拟网络编辑器
通过本机DOS命令窗口,输入指令:ipconfig -> 查看vmnet8的网络配置
在xshell或linux终端输入命令:ifconfig -> 查看 linux 的网络配置
ping命令:测试主机之间网络连通性
基本语法:ping 目的主机ip地址
功能描述:测试当前服务器是否可以连接目的主机
如:ping www.baidu.com
12.3、Linux网络环境配置
自动获取IP
登陆图形化界面后,通过界面设置自动获取ip
特点:linux 启动后会自动获取 IP,可以避免IP冲突
缺点:每次自动获取的 IP 地址可能不一样,但是作为服务器的Linux系统,Linux的IP地址不能变。
开发环境中,一般将Linux的IP地址手动设定,IP地址固定不能改变。
手动获取IP
手动指定linux的ip地址,使其不变化。
直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
关于网络的配置文件在:/etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置为静态的(不变的),比如: ip 地址为 192.168.200.130
- 输入指令:vim /etc/sysconfig/network-scripts/ifcfg-ens33
- 修改文件内容:
- # BOOTPROTO="DHCP"
- BOOTPROTO="static"
- IPADDR=192.168.200.130 # (IP地址,自己设定的)
- GATEWAY=192.168.200.2 # (网关,自己设定的)
- DNS1=192.168.200.2 # (域名解析器,自己设定的)
复制代码
- vmnet8和Linux在同一网段上,要能够通信,也要修改相应的vmnet8
vmware ---> 编辑 ---> 虚拟网络编辑器
打开虚拟编辑器,点击vmnet8,修改下面的子网ip为:192.168.200.0
然后点击NAT设置,将网关改为192.168.200.2
- 应用确定
- 输入指令:service network restart或reboot使上述修改生效
12.4、设置Linux主机名和hosts映射
12.4.1、设置主机名
Linux系统的主机名相当于其ip地址的别名,起一个主机名是因为ip地址不好记忆,不方便 -> 修改主机名。
查看当前主机的主机名指令:hostname
主机名放在/etc/hostname文件中,要修改主机名即修改文件内容:
- vim /etc/hostname
- 修改内容 -> 保存退出
- reboot重启系统
12.4.2、设置hosts映射
在Windows系统中,如何通过主机名找到(比如 ping)某个linux系统:
- 修改ip地址与主机名的映射关系
在windows C:\Windows\System32\drivers\etc\hosts 文件中,指定Linux系统的ip地址与主机名的映射关系
格式:linux系统ip地址 linux系统主机名
如指定为:192.168.218.129 luminescent (这行代码添加到文件中就行了)
- ping luminescent ---->就会去该文件中找相应的ip地址
在Linux系统中,使用主机名 来 ping 某个Windows系统,怎么做
- 在 linux 系统的 /etc/hosts 文件中指定ip和hostname映射关系:vim /etc/hosts
- 输入要添加的文件内容:192.168.218.1 Windows主机名
注意:使用Ctrl + C快捷键终止ping命令
12.5、主机名解析过程分析
12.5.1、hosts
hosts是一个文本文件,用来记录 IP 和 Hostname(主机名)的映射关系
12.5.2、DNS
DNS(Domain Name System)域名系统:是互联网上作为域名和 IP 地址相互映射的一个分布式数据库
为什么可以通过主机名访问?通过DNS域名解析系统,将主机名解析为ip地址,实际上还是用的ip地址。
12.5.3、DNS解析机制
用户在浏览器输入了www.baidu.com
- 浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,有就先调用这个 IP 完成解析;
如果没有,就检查 DNS 解析器缓存,如果有直接返回 IP 完成解析。
这两个缓存,可以理解为本地解析器缓存
- 如果本地解析器缓存没有找到对应映射,检查系统中 hosts 文件中有没有配置对应的域名 IP 映射,如果有,则完成解析并返回。
- 如果本地DNS解析器缓存 和 hosts文件 中均没有找到对应的IP,则到域名服务器找
- 还找不到,就没有了。
说明:DNS解析器缓存
一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的 IP 地址(DNS解析记录)
如在cmd窗口中输入:
ipconfig /displaydns //DNS域名解析缓存
ipconfig /flushdns //手动清理dns缓存
示意图:
13、进程管理(⭐)
13.1、基本介绍
- 在 LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。
程序执行之后加载到内存中成为进程。程序是静态的,进程是动态的。
- 每个进程都可能以两种方式存在:前台与后台
前台进程:是用户目前的屏幕上可以进行操作的。
后台进程:是实际在操作的,但屏幕上无法看到,通常使用后台方式执行。
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。
13.2、ps指令:查看系统正在执行进程
- 基本介绍
ps命令是用来查看目前系统中,有哪些进程正在执行,以及它们执行的状况。可以不加任何参数。
- 语法格式:ps [选项] -> 线程状态(Process Status)
常用选项:
- -a:显示当前终端的所有进程信息
- -u:以用户的格式显示进程信息
- -x:显示后台程序运行的参数
一般是三个选项一起用:ps -aux
说明:
- USER: 执行进程用户名称
- PID: 进程号
- %CPU: 进程占用CPU百分比
- %MEM: 进程占用物理内存的百分比
- VSZ: 进程占用的虚拟内存大小(单位:KB)
- RSS: 进程占用的物理内存大小(单位:KB)
- TTY: 终端名称(有时缩写)
- STAT: 进程状态:
- S-睡眠
- s-表示该进程是会话的先导进程
- N-表示进程拥有比普通优先级更低的优先级
- R-正在运行
- D-短期等待
- Z-僵死进程
- T-被跟踪或者被停止等等
- START: 进程执行的开始时间
- TIME: CPU 时间,即进程使用 CPU 的总时间
- COMMAND: 启动进程所用的命令和参数,如果过长会被截断显示
- ps -axu是将所有进程状态信息显示出来,若只想查找某个进程信息,使用grep指令过滤:ps -axu | grep 进程名
- 应用实例:以全格式显示当前所有的进程,查看进程的父进程。(父进程:一个进程可以生成多个子进程,该进程称为父进程)
指令:ps -ef -> 以全格式显示当前所有的进程。-e 显示所有进程。-f 全格式。
- UID: 用户ID
- PID: 进程ID
- PPID: 父进程ID
- C: CPU 用于计算执行优先级的因子。
- 数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;
- 数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
- STIME: 进程启动的时间
- TTY: 完整的终端名称
- TIME: CPU 使用时间
- CMD: 启动进程所用的命令和参数
ps -ef | grep sshd指令显示内容如下:- [root@luminescent ~]# ps -ef | grep sshd
- root 1294 1 0 08:31 ? 00:00:00 /usr/sbin/sshd -D
- root 1443 1294 0 08:31 ? 00:00:00 sshd: root@pts/0
- root 6916 1858 0 15:16 pts/0 00:00:00 grep --color=auto sshd
复制代码 得到第三列为1,即父进程ID=1
13.3、kill指令:终止进程
- 介绍:
若是某个进程执行一半需要停止时,或是已经消耗了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。
- 基本语法:
kill [选项] 进程号 -> 通过进程号杀死/终止进程
killall 进程名称 -> 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
使用killall,会将该进程的所有子进程也都终止。
常用选项:-9 -> 表示强制终止进程,系统觉得某个程序重要,可能会屏蔽kill指令,这时使用选项-9强制终止进程
- 案例:
- 案例 1:踢掉某个非法登录用户
kill 进程号
假如使用tom登录,然后在图形界面打开终端写代码。假设认为tom是个非法用户,要踢掉它
先在图形界面写代码:ps -aux | grep sshd,sshd 是记载远程连接服务的配置文件
上述指令显示出了,远程登录的进程信息,从中看到了tom登录的进程的进程号11421,以 kill 11421 这样tom就下线了!
- 案例 2:终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务
sshd ---> secure shell
- 首先查看 sshd 对应的进程号:
使用命令:ps -aux | grep sshd,有 /user/sbin/sshd 的那个进程就是sshd服务进程,进程号10748
终止 sshd 之后,就无法在xshell远程登陆了!
- 重启 sshd 服务指令:/bin/systemctl start 服务名称
/bin/systemctl start sshd.service
- 案例 3:终止多个gedit(文本编辑器) -> killall 进程名
在Linux桌面,主文件夹中,打开多个文本,然后使用killall 可以同时关闭所有打开的文本
killall gedit
- 案例 4:强制杀掉一个终端
在Linux系统桌面打开两个终端,bash即代表终端进程
在一个终端中输入指令强制关闭另一个终端
- 首先:查看终端进程的进程号:ps -aux | grep bash -> 得到对应的进程号
- 输入:kill -9 对应的进程号
也可以终端自己终止自己
13.4、pstree指令:查看进程树
- 基本语法:pstree [选项]
功能:可以更加直观的来看进程信息(树的形式)
- 常用选项:
-p :显示进程的 PID (父进程ID)
-u :显示进程的所属用户
- 应用实例:
案例 1:用树状的形式显示进程的pid(进程号) -> pstree -p
案例 2:用树状的形式显示进程的用户 -> pstree -u
13.5、服务管理
13.5.1、基本介绍
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd防火墙等),
因此后台程序也称为 服务/守护进程,是 Linux 中非常重要的知识点。
13.5.2、service管理指令
- 指令:service 服务名 [start | stop | restart | reload | status]
start:开启服务
stop:终止服务
restart:重启服务
reload:重载服务
status:查看服务的状态
- 在 CentOS7.0 后很多服务不再使用service指令管理,而是使用systemctl
- 还有一些在 /etc/init.d 下的服务仍使用 service 指令管理
案例:使用 service 指令,查看,关闭,启动 network。[注意:在虚拟系统打开终端演示,因为网络连接会关闭]
- service network status -> 查看网络连接状态
- service network stop -> 关闭网络连接
- service network start -> 开启网络连接
13.5.3、查看服务名
方式 1:直接输入setup即可看到所有服务,其中前面带*的服务会随着Linux系统的启动而自动启动。
方式 2:ls -l /etc/init.d 只能看到部分服务,还有一些在/etc/rc.d/init.d下的服务仍使用service指令管理
13.5.4、服务的运行级别
Linux 系统有 7 种运行级别(runlevel):常用的是级别 3 和 5
- 运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
- 运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
- 运行级别 2:多用户状态(没有 NFS),不支持网络
- 运行级别 3:完全的多用户状态(有 NFS),无界面但支持网络,登陆后进入控制台命令行模式
- 运行级别 4:系统未使用,保留
- 运行级别 5:X11 控制台,登陆后进入图形 GUI 模式
- 运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
开机的流程说明:开机 ——> BIOS ——> /boot ——> systemd进程1 ——> 运行级别 ——> 运行 级别对应的服务
CentOS7 后运行级别说明:在/etc/initab进行了简化,如下:
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
查看当前运行级别:systemctl get-default
更改开机默认运行级别:systemctl set-default multi-user.target/graphical.target -> 重启reboot
13.5.5、chkconfig指令
通过chkconfig命令可以给服务在 各个运行级别 设置开启自启动/关闭自启动
chkconfig指令管理的服务在/etc/init.d查看
注意:Centos7.0 后,很多服务使用 systemctl 管理
chkconfig 基本语法:
- 查看服务和服务在各个级别是开启/关闭自启动 (有限,只能查看chkconfig管理下的服务)
- chkconfig --list [| grep xxx] (若查找某一个服务使用grep过滤)
复制代码 - chkconfig 服务名 --list
- chkconfig --level 3 服务名 on 给该服务在3运行级别开启自启动
- chkconfig --level 5 服务名 off 给该服务在5运行级别关闭自启动
复制代码 案例演示: 对network服务进行各种操作,把 network 在 3 运行级别 关闭自启动
chkconfig --level 3 network off
注意:chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 生效.
13.5.6、systemctl指令管理服务
基本语法:systemctl [start | stop | restart | status] 服务名
systemctl 指令管理的服务在/usr/lib/systemd/system查看: ls -l /usr/lib/systemd/system
- systemctl list-unit-files [| grep 服务名]:查看服务开机启动状态, grep 可以进行过滤
- systemctl enable 服务名:设置服务开机自启动
- systemctl disable 服务名:关闭服务开机自启动
- systemctl is-enabled 服务名:查询某个服务是否是自启动的
centos7之后运行级别只有3和5,所以以上指令对3和5运行级别同时适用
应用案例:查看当前防火墙的状况,关闭防火墙和重启防火墙 firewalld.service
- 查看当前防火墙情况:systemctl status firewalld
Active: active (running) -> 表示防火墙已经打开- [root@luminescent ~]# systemctl status firewalld
- ● firewalld.service - firewalld - dynamic firewall daemon
- Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
- Active: active (running) since 五 2023-04-14 08:24:06 CST; 1h 20min ago
- Docs: man:firewalld(1)
- Main PID: 863 (firewalld)
- Tasks: 2
- CGroup: /system.slice/firewalld.service
- └─863 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
- 4月 14 08:24:06 luminescent systemd[1]: Starting firewalld - dynamic firewall daemon...
- 4月 14 08:24:06 luminescent systemd[1]: Started firewalld - dynamic firewall daemon.
- 4月 14 08:24:07 luminescent firewalld[863]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure confi...t now.
- Hint: Some lines were ellipsized, use -l to show in full.
复制代码 - 关闭防火墙:systemctl stop firewalld
- 重启防火墙:systemctl start firewalld
.service写不写都行
注意:关闭或者启用防火墙后,立即生效。但是这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
如果希望设置某个服务自启动或关闭永久生效要使用systemctl [enable|disable] 服务名
13.5.7、防火墙firewall指令
在真正的生产环境,往往需要将防火墙打开。但问题来了,如果把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。比如 80、22、8080 等。
- 打开端口: firewall-cmd --permanent --add-port=端口号/协议
通过netstat -anp | more指令查看端口号的协议 (more 分页显示),部分显示内容如下- [root@luminescent ~]# netstat -anp | more
- Active Internet connections (servers and established)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 710/rpcbind (监听客户端cmd的服务)
- tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1650/dnsmasq
- tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1290/sshd (监听Xshell的服务)
- tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1293/cupsd
- tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1450/master
- tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 1324/sshd: root@pts
- tcp 0 0 192.168.218.129:22 192.168.218.1:60660 ESTABLISHED 1324/sshd: root@pts
- tcp6 0 0 :::111 :::* LISTEN 710/rpcbind
- tcp6 0 0 :::22 :::* LISTEN 1290/sshd
复制代码 该指令输出的信息中:
Local Address表示 ip地址:端口号,Proto 是协议(protocol 协议)
- 关闭端口: firewall-cmd --permanent --remove-port=端口号/协议
注意:无论是打开端口还是关闭端口,要重新载入才能生效
重新载入:firewall-cmd --reload
- 查询端口是否开放: firewall-cmd --query-port=端口/协议
应用案例:
Windows使用telnet指令提示不是内部命令或可执行程序的解决方案:
- 方案一:以管理员身份运行cmd后,输入:dism /Online /Enable-Feature /FeatureName:TelnetClient
- 方案二:打开 控制面板 -> 程序和功能 -> 启用或关闭Windows功能,在这里就可以看到“Telnet客户端”。打勾安装即可
- 启用防火墙,测试 111 端口是否能 telnet (远程登录) 不行
- 在Linux系统查看防火墙的111端口的监听状态:
- [root@luminescent ~]# firewall-cmd --query-port=111/tcp
- no
复制代码 在本地主机DOS命令窗口输入:telnet Linux虚拟机ip地址 端口号
测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 失败
总结:防火墙打开+端口关闭--->不可以访问端口
- 防火墙开放 111 端口:firewall-cmd --permanent --add-port=111/tcp
开放端口后,需要重载:firewall-cmd --reload- [root@luminescent ~]# firewall-cmd --permanent --add-port=111/tcp
- success
- [root@luminescent ~]# firewall-cmd --reload
- success
复制代码 测试本地主机能否访问虚拟机的111端口:telnet 192.168.218.129 111 -> 成功
防火墙打开+端口打开--->可以访问端口
- 再次关闭 111 端口:firewall-cmd --permanent --remove-port=111/tcp
关闭端口后,需要重载:firewall-cmd --reload
13.6、top指令:动态监控进程
- 基本介绍:top 与 ps 命令很相似,都用来显示正在执行的进程。
top与ps最大的不同之处在于: top 在执行一段时间可以更新正在运行的的进程。
- 基本语法:top [选项]
常用选项:
- -d 秒数:指定top指令每隔几秒更新,默认是3秒。如:top -d 5
- -i:使top不显示任何闲置或僵死进程
- -p:通过指定监控进程ID来仅仅监控某个进程的状态
top指令显示内容说明:
- 输入top指令后,每一条都是一个进程
- 显示内容:
- 第一行:
第一个时间 -> 当前时间
第二个时间 -> 系统已经运行的时长
3 users -> 有3个用户
load average -> 负载值(三个值相加除以3>0.7 说明系统负载过大,要提高性能)
- 第二行:
Tasks -> 系统任务数
1 running -> 1个正在运行进程
257 sleeping -> 184个休眠进程
0 stopped -> 0个终止进程
0 zombie -> 0个僵死进程(要清除僵死进程,因为僵死进程无用且占内存空间)
- 第三行:占用的CPU百分比
us -> 用户(user)占用的CPU
sy -> 系统(system)占用的CPU
ni -> 优先级调用
id -> 空闲(idle)的CPU
wa -> I/O等待占用比
- 第四行:Mem 内存占用情况
total -> 总共内存
free -> 空闲内存
user -> 已使用内存
- 第五行:Swap 分区
total -> 总共大小
free -> 未使用大小
used -> 已用大小
avail Mem -> 可获取的内存大小
- 交互操作说明:输入top然后输入以下命令,得以下功能对进程进行排序
- P:以CPU使用率排序,默认此选项
- M:以内存的使用率排序
- N:以PID排序
- q:退出top指令
- u:监控指定用户的进程
- k:终止进程,终止指定进程ID后,需要输入信号量9表示强制删除
- e:切换进程占用内存的显示单位,KB/MB/GB/TB/PB
- 应用实例
- 案例 1:监视特定用户, 比如监控 yxz 用户
- 输入top -> 回车 -> 输入u -> 回车 -> 输入要监控用户名 (该用户要登录才能看到他的进程信息)
- 案例 2:终止指定的进程, 比如我们要结束 yxz 登录
- 输入top -> 回车 -> 输入k -> 回车 -> 输入要结束的进程 ID 号(bash那个进程的PID) -> 回车 -> 输入信号量 9 强制删除 -> yxz掉线
复制代码
13.7、netstat指令:监控网络状态
- netstat指令:查看系统网络情况
基本语法:netstat [选项]
选项说明:
- -an:按一定顺序排列输出
- -p:显示哪个进程在调用
netstat指令显示内容说明:
- Proto:协议
- Recv-Q:接收信息队列
- Send-Q:发送信息队列
- Local Address:本地地址 Linux地址
- Foreign Address:外部地址
- State:
- LISTEN 监听
- ESTABLISHED 已建立连接
- TIME_WAIT 超时等待 ---> 某个连接断了之后(如用户退出登录),连接不会立刻消失,而是State变为TIME_WAIT
系统认为可能是网络状态不好,过一段时间仍无法连接,则连接消失。
案例:查看服务名为 sshd 的服务的信息。- [root@luminescent ~]# netstat -anp | grep sshd
- tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1290/sshd
- tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 1324/sshd: root@pts
- tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 7206/sshd: yxz@pts/
- tcp 0 36 192.168.218.129:22 192.168.218.1:60660 ESTABLISHED 1324/sshd: root@pts
- tcp 0 0 192.168.218.129:22 192.168.218.1:56341 ESTABLISHED 7201/sshd: yxz [pri
- tcp6 0 0 :::22 :::* LISTEN 1290/sshd
- tcp6 0 0 ::1:6010 :::* LISTEN 1324/sshd: root@pts
- tcp6 0 0 ::1:6011 :::* LISTEN 7206/sshd: yxz@pts/
- unix 3 [ ] STREAM CONNECTED 25985 1290/sshd
- unix 2 [ ] DGRAM 32095 1324/sshd: root@pts
- unix 3 [ ] STREAM CONNECTED 95392 7201/sshd: yxz [pri
- unix 3 [ ] STREAM CONNECTED 95391 7206/sshd: yxz@pts/
- unix 2 [ ] DGRAM 95388 7201/sshd: yxz [pri
复制代码 记录详解:- Proto Recv-Q Send-Q Local Address Foreign Address State
- tcp 0 36 192.168.218.129:22 192.168.218.1:60660 ESTABLISHED 1324/sshd: root@pts
- tcp 0 0 192.168.218.129:22 192.168.218.1:56341 ESTABLISHED 7201/sshd: yxz [pri
复制代码 要建立连接双方都要有一个端口:22端口在Linux,60660端口和56341端口在Windows。
示意图如下:
- 检测连接主机命令ping:是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。
语法格式:ping 远程主机的ip地址 -> ping www.baidu.com
14、RPM与YUM
14.1、RPM
14.1.1、介绍
RPM(Red-Hat Package Manager, 红帽软件包管理器),这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准。是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。类似于Windows的setup.exe。
14.1.2、RMP的简单查询指令
查询已安装的 rpm软件包 列表:rpm –qa | grep xx
查询结果返回一个软件包的包名
举例:查看当前系统是否安装了 firefox:rpm -qa | grep firefox
查询结果:firefox-102.9.0-3.el7.centos.x86_64
结果说明:
- 软件名:firefox
- 版本号:102.9.0-3
- 适用操作系统: el7.centos.x86_64 (表示centos7.x的64位系统)
如果是i686、i386表示32位系统,noarch表示通用(32/64位系统都适用)
14.1.3、RMP的其他指令
- rpm -qa:查询所安装的所有 rpm 软件包
- rpm -qa | grep X:过滤,比如 rpm -qa | grep firefox
- rpm -q 软件包名:查询某个软件包是否安装
案例:rpm -q firefox
- rpm -qi 软件包名:查询软件包的详细信息
案例: rpm -qi firefox
- rpm -ql 软件包名:查询软件包中的文件和该软件包在哪个文件下
案例: rpm -ql firefox
- rpm -qf 文件全路径名:查询某个文件所属在哪个软件包
案例:rpm -qf /etc/passwd
案例:rpm -qf /root/install.log
14.1.4、删除RPM的软件包
基本语法:rpm -e RPM 软件包的名称
-e erase擦去
案例:删除firefox软件包:rpm -e firefox
注意:
- 如果其它软件包依赖于您要删除的软件包,删除时则会产生错误信息。
如:rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
foo软件包被 bar-1.0-1需要,删除foo对barr-1.0-1有影响
- 如果我们就是要删除 foo 这个 rpm 包,可以增加参数--nodeps,就可以强制删除。但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
如:rpm -e --nodeps foo(nodeps 不检查依赖关系 no dependencies)
14.1.5、安装RPM软件包
基本语法:rpm -ivh RPM软件包全路径名称
rpm软件包其实是一个软件的安装包
点击Linux系统桌面的光盘,里面有一个Packages文件夹,这个文件夹里有很多rpm软件安装包在/run/media/root/CentOS 7 x86_64/Packages目录下
选项:
- i=install 安装
- v=verbose 提示
- h=hash 进度条
应用实例:演示卸载和安装 firefox 浏览器
- 卸载:rpm -e firefox
- 安装:rpm -ivh /run/media/root/CentOS 7 x86_64/Packages/firefox-102.9.0-3.el7.centos.x86_64.rpm
也可以在Packages中找到firefox安装包,复制到某一个目录下,这样写路径简单
14.2、YUM
- 基本介绍
Yum(Yellow dog Updater, Modified)是一个Shell前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,
可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
使用yum list | grep 软件名向yum服务器查询有没有该软件(类似于手机的应用商城)。有的话,使用yum install 软件名下载安装该软件
- yum基本指令
查询 yum 服务器是否有 需要安装的软件:yum list | grep 软件名
安装指定的软件:yum install 软件名
案例:请使用 yum 的方式来安装 firefox
- rpm -e firefox
- yum list | grep firefox
- yum install firefox
- 总结:rpm 是从本地安装包下载,yum 是从yum服务器下载安装软件
15、Linux配置开发环境
15.1、安装JDK8
安装jdk8的步骤:
- 官网下载Linux版本的jdk8
- Linux系统创建目录/opt/jdk:mkdir /opt/jdk
- 使用Xftp7传输到Linux系统下的/opt/jdk
建议:将下载的压缩包都放在/opt目录下
- 进入/opt/jdk目录,使用tar命令解压jdk的压缩包:tar -zxvf jdk-8u361-linux-x64.tar.gz
解压完成后,得到目录:jdk1.8.0_361- [root@luminescent jdk]# ll
- 总用量 135516
- drwxr-xr-x. 8 root root 4096 4月 14 17:14 jdk1.8.0_361
- -rw-r--r--. 1 root root 138762230 4月 14 17:10 jdk-8u361-linux-x64.tar.gz
复制代码 - 创建目录/usr/local/java:mkdir /usr/local/java
建议:将安装的软件放在 /usr/local 目录下
- 将第三步解压得到的文件夹整个移动到/usr/local/java目录下:mv /opt/jdk/jdk1.8.0_361/ /usr/local/java/
- 为了能够在任意目录下使用java指令,需要配置环境变量
配置环境变量的配置文件在/etc/profile文件中
- 配置java的环境变量JAVA_HOME
- 配置类路径CLASSPATH,注意:一定要在类路径的开头加上.:
- 将JAVA_HOME引入到PATH环境变量中,一定要在PATH的最后加上$PATH
在/etc/profile文件最后,输入以下内容- export JAVA_HOME=/usr/local/java/jdk1.8.0_361
- export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
- export PATH=$JAVA_HOME/bin:$PATH
复制代码
- (⭐)为了更新环境变量,使用source命令:source /etc/profile
- Java环境配置完成。在任意目录使用java -version查看jdk版本
Linux系统下编写第一个Java程序
- 创建Hello.java文件:vim Hello.java
- public class Hello {
- public static void main(String[] args) {
- System.out.println("Hello,java!");
- }
- }
复制代码 :wq保存退出
- 编译:javac Hello.java
- 运行:java Hello
15.2、安装tomcat9
15.2.1、安装Tomcat 9
- 在Tomcat镜像网站下载对应版本的tar.gz文件
- 在linux系统创建tomcat目录:mkdir /opt/tomcat
- 使用Xftp7将tomcat的压缩包传输到Linux虚拟机的/opt/tomcat目录
- 进入/opt/tomcat目录,解压文件:tar -zxvf apache-tomcat-9.0.73.tar.gz
- 进入解压后的tomcat的bin目录,bin目录结构如下
- 在/usr/local目录下创建文件夹tomcat:mkdir /usr/local/tomcat
- 将第四步解压得到的文件夹整个移动到/usr/local/tomcat目录下:mv /opt/tomcat/apache-tomcat-9.0.73/ /usr/local/tomcat/
- 配置tomcat环境变量
- 添加tomcat环境变量CATALINA_HOME
- 将CATALINA_HOME/bin引入到PATH变量中
- export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.73
- export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
复制代码
- 更新环境变量:source /etc/profile
15.2.2、启动/关闭Tomcat
- 任意目录下启动tomcat服务:startup.sh
- 查看8080端口的状态信息:netstat -anp | grep 8080
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp6 0 0 :::8080 :::* LISTEN 58900/java
复制代码 - 在本机windows访问虚拟机的tomcat:虚拟机的ip地址:8080 -> 失败 -> 原因:虽然开启了tomcat服务,但是防火墙的8080端口任是关闭状态所以无法访问 -> 查看防火墙关于8080端口的状态:firewall-cmd --query-port=8080/tcp
- [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
- no
复制代码 - 永久开启防火墙的8080端口:firewall-cmd --permanent --add-port=8080/tcp
- 每一次防火墙的更改都需要重载:firewall-cmd --reload
- 再次查看关于防火墙的8080端口的状态:firewall-cmd --query-port=8080/tcp
- [root@luminescent ~]# firewall-cmd --query-port=8080/tcp
- yes
复制代码 - 再次在主机Windows系统上访问虚拟机的tomcat服务:192.168.218.130:8080 -> 成功
- 在任意目录下关闭tomcat服务:shutdown.sh
15.2.3、编写第一个网页
- 启动tomcat服务:startup.sh
- 进入tomcat的目录webapps下的默认访问目录ROOT:cd /usr/local/tomcat/apache-tomcat-9.0.73/webapps/ROOT
- 编写一个页面:vim yxz.html,内容如下:
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <h1> 这是我的第一个Linux系统下的页面 </h1>
复制代码 :wq保存退出
注意: 必须加上,否则会出现中文乱码问题
- 主机windows访问yxz.html页面:192.168.218.130:8080/yxz.html -> 成功显示
15.3、安装MySQL8.0
15.3.1、CentOS7卸载已经安装好的MySQL
- 关闭MySQL服务:systemctl stop mysqld.service
- 查看当前mysql的安装情况:rpm -qa | grep -i mysql 或 yum list installed | grep mysql
- 卸载第二步查找到的所有文件:yum remove mysql-xxx
务必卸载干净,反复执行rpm -qa | grep -i mysql确认是否有卸载残留
- 删除mysql相关文件
- 查找mysql相关文件:find / -name mysql
- 删除上述命令查找出的相关文件:rm -rf xxx
- 删除Linux系统下mysql的配置文件my.cnf:rm -rf /etc/my.cnf
- 卸载完成。
15.3.2、安装MySQL
- 新建文件夹mysql:mkdir /opt/mysql -> 并进入mysql文件夹:cd /opt/mysql
- 查看Linux系统下是否有自带的数据库:rpm -qa | grep mari
- [root@luminescent mysql]# rpm -qa | grep mari
- marisa-0.2.4-4.el7.x86_64
- mariadb-libs-5.5.68-1.el7.x86_64
复制代码 - 删除安装Linux时自带的类mysql数据库mariadb相关文件
- rpm -e --nodeps marisa
- rpm -e --nodeps mariadb-libs
- 下载Linux版本的mysql安装包:下载地址
- 得到压缩包,使用Xftp7将第4步下载好的压缩包传输到Linux系统的 /opt/mysql 目录下
- 进入/opt/mysql目录,解压文件:tar -xvf mysql-8.0.25-1.el7.x86_64.rpm-bundle.tar
- CentOS7下检查MySQL依赖
- 由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,需要给/tmp较大的权限。
执行指令:chmod -R 777 /tmp
- 安装前检查依赖(如果安装Linux时带图形化界面,则以下依赖都是自带的,可以跳过此步)
- rpm -qa|grep libaio
- rpm -qa|grep net-tools
- [root@luminescent mysql]# rpm -qa|grep libaio
- libaio-0.3.109-13.el7.x86_64
- [root@luminescent mysql]# rpm -qa|grep net-tools
- net-tools-2.0-0.25.20131004git.el7.x86_64
复制代码
- 在mysql的安装目录(/opt/mysql)下依次执行以下命令(必须按照顺序执行)
- rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
- rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
- rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
- rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
- rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
复制代码
注意: 如果没有检查mysql依赖环境,在安装mysql-community-server会报错
rpm(Redhat Package Manage):通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。
- -i --install 安装软件包
- -v --verbose 提供更多的详细信息输出
- -h --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条
- 在mysql的安装目录(/opt/mysql)下查看mysql版本信息:mysql --version 或 mysqladmin --verison
- 执行命令:rpm -qa | grep -i mysql,查看mysql是否安装成功,-i忽略mysql的大小写,可加可不加
- [root@luminescent mysql]# rpm -qa | grep -i mysql
- mysql-community-client-8.0.25-1.el7.x86_64
- mysql-community-common-8.0.25-1.el7.x86_64
- mysql-community-libs-8.0.25-1.el7.x86_64
- mysql-community-server-8.0.25-1.el7.x86_64
- mysql-community-client-plugins-8.0.25-1.el7.x86_64
复制代码 - 为了保证数据库目录与文件的所有者为 mysql 登录用户,如果你是以 root 身份运行 mysql 服务,需要执行下面的命令初始化
mysqld --initialize --user=mysql
说明:--initialize选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将 该密码标记为过期,登录后需要设置一个新的密码。生成的 临时密码 会往日志中记录一份。
使用命令:cat /var/log/mysqld.log 查看日志中记录的密码,root@localhost: 后面就是初始化的密码
- 启动mysql服务:systemctl start mysqld 或者 systemctl start mysqld.service -> 下同,.service可加可不加
查看mysql服务状态:systemctl status mysqld
关闭mysql服务:systemctl stop mysqld
重启mysql服务:systemctl restart mysqld
说明:mysqld 这个可执行文件就代表着 MySQL 服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。
- 查看mysql进程:ps -ef | grep mysql
- 查看mysql服务监听端口的网络信息:netstat -anp | grep mysql
- 查看mysql服务是否自启动:systemctl list-unit-files | grep mysqld.service
- [root@luminescent mysql]# systemctl list-unit-files|grep mysqld.service
- mysqld.service enabled
复制代码 - 查看防火墙关于3306端口的开放状态:firewall-cmd --query-port=3306/tcp
- [root@luminescent mysql]# firewall-cmd --query-port=3306/tcp
- no
复制代码 - 将防火墙的3306端口设置永久开放:
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --add-service=http --permanent
重启防火墙:firewall-cmd --reload
15.3.3、远程登录MySQL
- Linux下首次登录mysql需要重新设置密码
- Linux下,输入mysql -h localhost -P 3306 -u root -p 回车 -> 输入初始密码
- 因为初始化密码已经过期,所以查看数据库会报错,在mysql中修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
注意:5.7版本之后(不含5.7),mysql加入了全新的密码安全机制。设置新密码太简单会报错。
- 执行flush privileges; 刷新权限
- Linux下修改远程连接配置
- 登录mysql
- 使用mysql数据库:use mysql;
- 查看user表的信息:select Host,User from user;
可以看到root用户的当前主机配置信息为localhost。
- 修改Host为通配符%
Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.218.1。这里的意思就是说root用户只能通过192.168.218.1的客户端去访问。 user=root Host=localhost,表示只能通过本机客户端去访问。而%是个通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。如果 Host=% ,表示所有IP都有连接权限(存在安全问题)。
注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。
update user set host = '%' where user ='root';
- 刷新权限:flush privileges; -> 使对数据库的修改立即生效
- 如果在远程主机上使用图形化界面工具配置新连接到linux下的mysql8.0出现错误码2058(高版本的图形化界面不会出现该问题)
原因:分析是mysql8.0密码的加密方法变了。
解决方案:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Linux上MySQL的密码';
- Linux系统下MySQL的安装、配置、登录完成。
- 测试远程主机的图形化界面工具Navicat Premium 16连接mysql8.0.25
16、Shell编程
16.1、为什么用Shell
- Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
- 对于JavaEE和Python程序员来说,工作的需要编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
- 对于大数据程序员来说,需要编写Shell程序来管理集群
16.2、Shell入门
- 脚本格式要求:
脚本以#!/bin/bash开头 ---> 确定shell的类型
脚本需要有可执行权限(x),shell脚本文件以.sh结尾(建议shell脚本文件以.sh结尾),也可以不以.sh结尾
- 编写第一个Shell 脚本
需求说明:创建一个 Shell 脚本,输出:hello world!
- 创建目录:mkdir /root/shcode
- 进入目录并编辑文件:cd /root/shcode -> vim hello.sh
- 写入文件内容:
- #!/bin/bash
- echo "hello,world!"
复制代码
- shell脚本的常用执行方式
- 首先要给shell脚本加x执行权限:chomod u+x hello.sh
再输入该脚本的相对路径或绝对路径来执行该脚本
使用相对路径:./hello.sh
使用绝对路径:/root/shcode/hello.sh
- 不用赋予脚本+x 权限,直接执行即可。(使用以下指令,即使没有执行权限也可以执行)
使用指令:sh shell脚本 或者 sh shell脚本的绝对路径
比如:sh /root/shcode/hello.sh
16.3、Shell变量
- Linux Shell中的变量分为:系统变量和用户自定义变量
- 系统变量:系统自带的变量,如PATH(环境变量)、HOME(当前用户的家目录)
- 用户自定义变量
可以通过set指令显示出shell中的所有系统变量
使用变量:$变量名 -> $PATH $HOME
- 基本语法
定义变量:变量名=值(注意:=两边不能有空格 -> Shell编程中定义变量时,=号两边不能有空格)
撤销变量:unset 变量名(相当于销毁变量)
声明静态变量:readonly 变量名=值,静态变量只能读,不能修改,也不能撤销unset
案例:编写脚本var.sh,测试变量:vim var.sh- #!/bin/bash
- # 案例1:定义变量 A=520 (#为注释符)
- A=520
- # 输出变量需要加上$ ($ -> 引用变量)
- echo $A
- # 输出A = 520
- echo A = $A
- echo "A = $A"
- # 案例2:撤销变量A
- unset A
- echo A=$A
- # 案例 3:声明静态的变量 B=1314.520,不能 unset
- readonly B=1314.520
- echo B = $B
- # unset B -> 报错信息 var.sh: 第 15 行:unset: B: 无法反设定: 只读 variable
复制代码 - Shell编程中变量名的定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
- 等号两侧不能有空格
- 变量名称一般习惯为大写(规范)
- 将 命令的返回值 赋给变量
方式1:变量名=`指令` -------> 反引号``,运行里面的命令,并把结果返回给变量A
方式2:变量名=$(指令) 等价于反引号- # 将命令的返回值赋给变量
- C=`date`
- echo "当前日期时间$C"
- D=$(cal)
- echo "当前月的月历$D"
复制代码 - 设置环境变量
基本语法:
- export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
- source 配置文件 (功能描述:让修改后的配置信息立即生效)
source /etc/profile
- echo $变量名 (功能描述:查询环境变量的值)
- # 使用环境变量CATALINA_HOME
- echo "CATLINA_HOME=$CATALINA_HOME"
复制代码
- shell脚本的注释
单行注释:多行注释: 16.5、预定义变量
- 基本介绍:预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
- 基本语法
- $$:当前进程的进程号(PID)
- $!:后台运行的最后一个进程的进程号(PID)
- $?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
- 应用实例:vim preVar.sh
- #!/bin/bash
- echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
- echo "所有的参数=$*"
- echo "$@"
- echo "参数个数=$#"
复制代码 16.6、运算符
- 基本介绍:适用运算符在 shell 中进行各种运算操作。
- 基本语法(三种写法)
- $((运算式))$
- $[运算式]$ ---> 推荐使用
- expr m + n (expression表达式,注意expr表达式中运算符两边要有空格,否则会把整个表达式当成字符串处理)
expr \*, /, % ----> 表示乘,除,取余
注意:要将expr的返回值赋给变量,需要使用``将整个expr表达式括起来
- 应用实例
- #!/bin/bash
- echo "当前执行的进程ID=$$"
- # 以后台方式运行一个脚本,并获取它的进程号
- sh /root/shcode/myshell.sh &
- echo "最后一个后台方式运行的进程ID=$!"
- echo "执行的结果是=$?"
复制代码 16.7、条件判断
- 基本语法:if [ condition ] -> 注意:condition前后都必须要有空格
- #!/bin/bash
- # 案例 1:计算(2+3)X4 的值
- # 方式1
- RES1=$(((2+3)*4))
- echo "res1=$RES1"
- # 方式2(推荐使用)
- RES2=$[(2+3)*4]
- echo "res2=$RES2"
- # 方式3
- TEMP=`expr 2 + 3`
- echo "temp=$TEMP"
- RES4=`expr $TEMP \* 4`
- echo "res4=$RES4"
- # 案例 2:求出命令行的两个参数[整数]的和
- SUM=$[$1+$2]
- echo "sum=$SUM"
复制代码 condition非空返回true,可以使用$?验证(0为true,>1 为false)
[ shell ] -> 返回 true
[ ] -> 返回 false
[ condition ] && echo OK || echo notok -> 条件满足,执行后面的语句
- 常用判断条件
- =:字符串比较
- 两个整数比较
- -lt 小于(less than)
- -le 小于等于(less equal)
- -eq 等于(equal)
- -gt 大于(greater)
- -ge 大于等于(greater equal)
- -ne 不等于(not equal)
- 按照文件权限进行判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- 按照文件类型进行判断
- -f 文件存在并且是一个常规的文件
- -e 文件存在
- -d 文件存在并是一个目录
- 应用实例:vim ifdemo.sh
- if [ condition ]
- then
- 语句
- fi
复制代码 16.8、流程控制
16.8.1、if elif语句
- 基本语法(相当于Java中的else if语句)
- #!/bin/bash
- if [ "ok" = "ok" ]
- then
- echo "相等"
- fi
- # 案例2:整数比较
- if [ 12 -gt 2 ]
- then
- echo "大于"
- fi
- # 案例3:/root/shcode/var.sh 文件是否存在
- if [ -f /root/shcode/var.sh ]
- then
- echo "文件存在"
- fi
- # condition非空返回true
- if [ ] # condition为假
- then
- echo "false"
- fi
- if [ studyShell ] # condition为真
- then
- echo "true"
- fi
- 输出结果:
- 相等
- 大于
- 文件存在
- true
复制代码 注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
- 应用实例:vim ifCase.sh
- if [ 条件判断式 ]
- then
- 代码
- elif [ 条件判断式 ]
- then
- 代码
- fi
复制代码 16.8.2、case语句
- 基本语法(相当于Java中的switch-case语句)
- #!/bin/bash
- # 案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
- if [ $1 -ge 60 ]
- then
- echo "及格了"
- else
- echo "不及格"
- fi
- if [ $1 -ge 60 ]
- then
- echo "及格了"
- elif [ $1 -lt 60 ]
- then
- echo "不及格"
- fi
复制代码 每个case分支都以;;结尾,这两个;;不能分开
- 应用实例
- case $变量名 in
- "值 1")
- 如果变量的值等于值 1,则执行程序 1
- ;;
- "值 2")
- 如果变量的值等于值 2,则执行程序 2
- ;;
- ...省略其他分支...
- *)
- 如果变量的值都不是以上的值,则执行此程序
- ;;
- esac
复制代码 16.8.3、for循环
- 基本语法
- #!/bin/bash
- # 案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",是3时,就输出"周三",其它情况输出"other"
- case $1 in
- "1") echo "周一";;
- "2") echo "周二";;
- "3") echo "周三"
- ;;
- *) echo "other...";;
- esac
复制代码 - 应用实例
vim testFor1.sh- # 语法格式1
- for 变量 in 值 1 值 2 值 3...
- do
- 程序/代码
- done
- # 语法格式2
- for (( 初始值;循环控制条件;变量变化 ))
- do
- 程序/代码
- done
复制代码- #!/bin/bash
- # for语法格式1
- # 案例:打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
- # 注意:$* 是把输入的参数当作一个整体,所以只会输出一句话
- for i in "$*"
- do
- echo "num is $*"
- done
- # 使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句
- echo "======================================"
- for j in "$@"
- do
- echo "num is $@"
- done
复制代码 vim testFor2.sh- [root@luminescent shcode]# sh testFor1.sh 100 200 300 400
- num is 100 200 300 400
- ======================================
- num is 100 200 300 400
- num is 100 200 300 400
- num is 100 200 300 400
- num is 100 200 300 400
复制代码 - 设置定时调度任务
- #!/bin/bash
- # 案例1:从 1 加到 100 的值输出显示
- SUM=0
- for((i=1;i<=100;i++))
- do
- SUM=$[$SUM+$i]
- done
- echo "1-100的总和:$SUM"
- # 案例2:根据命令行的参数传入的x值,计算1-x的和
- SUMX=0
- for(( i=1; i <= $1; i++ ))
- do
- SUMX=$[$SUMX + $i]
- done
- echo "1-$1的总和:$SUMX"
复制代码 17、日志管理
17.1、基本介绍
- 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
- 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
- 日志是用来记录重大事件的工具
17.2、系统常用日志
系统日志文件的保存位置:/var/log/目录下
应用案例:使用root用户通过Xshell7登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure里有没有记录相关信息。
系统常用日志:
日志文件说明/var/log/boot.log系统启动日志/var/log/cron记录与系统定时任务相关的日志/var/log/cups/记录打印信息的日志/var/log/dmesg记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息/var/log/btmp记录错误登录的日志。这是一个二进制文件,不能直接使用vi/vim/cat查看,而要使用lastb命令查看。/var/log/lastlog记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,要使用lastlog命令查看/var/log/maillog记录邮件信息的日志/var/log/message记录系统重要信息的日志,这个日志文件中会记录Linux系统的绝大多数重要信息。如果系统出现问题,首先要检查的应该就是这个日志文件/var/log/secure记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户、sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。是二进制文件,使用last命令查看/var/log/ulmp记录当前已经登陆的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。这个文件不能用vi/vim/cat命令查看,要使用w、who、users等命令查看17.3、日志管理服务rsyslogd
CentOS7.6 日志服务是 rsyslogd(rocket-fast system for log),CentOS6.x日志服务是syslogd。rsyslogd 功能更强大,rsyslogd 的使用、日志文件的格式,和 syslogd 服务是兼容的。rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。将日志记录到对应的文件中。/etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。
原理示意图:
- 在进行日志管理时,要保证rsyslogd服务是启动的!
- 查询 Linux 中的 rsyslogd 服务是否启动:
ps aux | grep "rsyslog"
ps aux | grep "rsyslog" | grep -v "grep" -> -v选项:表示过滤出不包含的内容(相当于补集)
- 查询 rsyslogd 服务的自启动状态(是否是自启动状态enable):systemctl list-unit-files | grep rsyslog
- 配置文件:/etc/rsyslog.conf -> 该配置文件中记录了日志和日志存放在哪个文件
关于日志:*.* -> 其中第一个*代表日志类型,第二个*代表日志级别
日志类型说明authpam 产生的日志authprivssh、ftp 等登录信息的验证信息corn时间任务相关kern内核lpr打印mail邮件mark(syslog)-rsyslog服务内部的信息,时间标识news新闻组user用户程序产生的相关信息uucpunix to nuix copy主机之间相关的通信local 1-7自定义的日志设备日志级别级别说明debug有调试信息的,日志通信最多info一般信息日志,最常用notice最具有重要性的普通条件的信息warning警告级别err错误级别,阻止某个功能或者模块不能正常工作的信息crit严重级别,阻止整个系统或者整个软件不能正常工作的信息alert需要立刻修改的信息emerg内核崩溃等重要信息none什么都不记录注意:从上到下,级别从低到高,记录信息越来越少
- 由日志服务 rsyslogd 记录的日志文件,日志文件的内容:每一行都代表一个事件,每一行有以下四个内容
- 事件产生的时间
- 产生事件的服务器的主机名
- 产生事件的服务名或程序名
- 事件的具体信息
- 查看日志:查看一下 /var/log/secure 日志,这个日志中记录的是用户验证和授权方面的信息 来分析如何查看
- 日志管理服务应用实例(增加自定义的日志)
在/etc/rsyslog.conf 中添加一个日志文件/var/log/yxz.log,当有事件发送时(比如sshd服务相关事件),该文件会接收到信息并保存.
- vim /etc/rsyslog.conf
- 写入:*.*/var/log/yxz.log
- 保存退出
- >/var/log/yxz.log(创建空的日志文件)
然后重启,重启事件会被记录到/var/log/yxz.log中
17.4、日志轮替
日志轮替(logrotate)就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后(旧日志文件数量达到某个值的时候),就会进行删除清除日志中旧的信息。
17.4.1、日志轮替时文件命名
- centos7 使用 logrotate 进行日志轮替管理
要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数
- 如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20201010”。
这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件即可。
- 如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。
当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。
当第二次进行日志轮替时,“secure.1” 会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来
保存新的日志,以此类推。
17.4.2、logrotate配置文件
/etc/logrotate.conf为logrotate 的全局配置文件(写了日志文件轮替规则)
/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)
可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则
也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用
/etc/logrotate.conf文件内容- [root@luminescent shcode]# sh testFor2.sh 1000
- 1-100的总和:5050
- 1-1000的总和:500500
复制代码 单独指定某个日志文件的轮替规则的参数说明:
轮替规则的参数说明daily日志的轮替周期是每天weekly日志的轮替周期是每周monthly日志的轮替周期是每月rotate 数字保留的日志文件的个数。0 指没有备份compress日志轮替时,旧的日志进行压缩create mode owner group建立新日志,同时指定新日志的权限与所有者和所属组。mail address当日志轮替时,输出内容通过邮件发送到指定的邮件地址。missingok如果日志不存在,则忽略该日志的警告信息notifempty如果日志为空文件,则不进行日志轮替minsize 大小日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替size 大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。dateext使用日期作为日志轮替文件的后缀。sharedscripts在此关键字之后的脚本只执行一次。prerotate/endscript在日志轮替之前执行脚本命令。postrotate/endscript在日志轮替之后执行脚本命令。17.4.3、自定义的日志加入日志轮替
- 第一种方法:直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
- 第二种方法:在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。
推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。
- 练习
- 在/etc/logrotate.d/下创建文件yxz.log:vim yxzlog
- 写入内容:
- while [ 条件判断式 ]
- do
- 循环体
- done
复制代码 - 这样就好了,因为/etc/logrotate.conf 中有:include /etc/logrotate.d
17.5、日志轮替机制原理
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。
在 /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的。crond定时后台程序会定时执行cron.daily内的文件。logrotate 文件在cron.daily下所以也会定时执行文件中的轮替规则 -> 写日志是rsyslogd,日志轮替是logrotate
17.6、查看内存日志
有一些日志是写到内存里的,还没有写到文件里,因为这些日志是实时变化的
重启之后内存日志会被清空
查看内存日志指令:journalctl
journalctl:查看全部
journalctl -n 3:查看最新 3 条
journalctl --since 19:00 --until 19:10:10:查看起始时间到结束时间的日志可加日期
journalctl -p err:报错日志
journalctl -o verbose:日志详细内容
journalctl _PID=1245 _COMM=sshd:查看包含这些参数的日志(在详细日志查看) 或者 journalctl | grep sshd
注意: journalctl查看的是内存日志, 重启清空
演示案例:使用 journalctl | grep sshd 来看看用户登录清空, 重启系统,再次查询,看看日志有什么变化没有
18、Linux系统备份与恢复
18.1、基本介绍
虚拟机可以做快照。实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。所以可以使用备份和恢复技术
linux的备份和恢复两种方式:
- 把需要的文件(或者分区)用tar命令打包就行,下次需要恢复的时候,再解压开覆盖即可
- 使用 dump 和 restore 命令
18.2、安装dump和restore
如果 linux 上没有 dump 和 restore 指令,要先安装
yum -y install dump -> 会安装依赖restore
yum -y install restore
18.3、使用dump完成备份
- 基本介绍:dump 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)
- 语法说明:
- #!/bin/bash
- SUM=0
- i=0
- while [ $i -le $1 ]
- do
- SUM=$[$SUM+$i]
- i=$[$i+1]
- done
- echo "执行结果=$SUM"
复制代码 选项说明:
-c:创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。
-0123456789:备份的层级。0为最完整备份,会备份所有文件。若指定0以上的层级,则备份至上一次备份以来修改或新增的文件,到9后,可以再次轮替。
-f :指定备份后文件名
-j:调用 bzlib 库压缩备份文件,也就是将备份后的文件压缩成 bz2 格式,让文件更小
-T :指定开始备份的时间与日期
-u:备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。
-t:指定文件名,若该文件已存在备份文件中,则列出名称
-W:显示需要备份的文件及其最后一次备份的层级,时间,日期。
-w:与-W 类似,但仅显示需要备份的文件。
进行增量备份/备份层级要加-u,因为-u可以记录层级
- 案例 1:将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0”
dump -0uj -f /opt/boot.bak0.bz2 /boot -----> /boot 要备份的分区
案例 2:在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看这次生成的备份文件 boot1.bak 有多大
dump -1uj -f /opt/boot.bak1.bz2 /boot
注意:通过 dump 命令在配合 crontab 可以实现无人值守备份 -> 写一个脚本
- 显示需要备份的文件及其最后一次备份的层级,时间,日期:dump -W
- 查看备份时间文件:cat /etc/dumpdates
- dump 备份文件或者目录
前面在备份分区时,是可以支持增量备份的,如果备份文件或者目录,不再支持增量备份, 即只能使用 0 级别备份(-u不能写)
案例:使用 dump 备份 /etc 整个目录:dump -0j -f /opt/etc.bak.bz2 /etc/
注意:如果要备份重要的文件,比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子。
19、Linux面试题
第一题
题目:分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯)
t.log内容:- [root@luminescent shcode]# sh testWhile.sh 10
- 执行结果=55
复制代码 解决步骤
- 读取文件t.log内容
cat t.log
- 将读取到的内容以/截断
cat t.log | cut -d '/'
所以 以/截断后
第一段内容:http:
第二段内容为空(//之间为空)
第三段内容为ip地址
第四段内容为网页xxx.html
- 查找第三段的内容(ip地址)
cat t.log | cut -d '/' -f 3- #!/bin/bash
- #案例 1:读取控制台输入一个 NUM1 值
- read -p "请输入一个数 NUM1=" NUM1
- echo "你输入的 NUM1=$NUM1"
- #案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
- read -t 10 -p "请输入一个数 NUM2=" NUM2
- echo "你输入的 NUM2=$NUM2"
复制代码 - 将获取到的ip地址排序
cat t.log | cut -d '/' -f 3 | sort- [root@luminescent shcode]# sh testRead.sh
- 请输入一个数NUM1=10
- 输入的NUM1=10
- 请输入一个数NUM2=520
- 输入的NUM2=520
复制代码 - 统计每个ip地址出现的次数
cat t.log | cut -d '/' -f 3 | sort | uniq -c- basename [pathname] [suffix]
- basename [string] [suffix]
复制代码 - 按出现的次数从大到小排序(sort默认以从小到大排序)
cat t.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr- 案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
- basename /home/aaa/test.txt
- test.txt
- basename /home/aaa/test.txt .txt
- test
复制代码 注意:如果第四步不排序直接统计次数后再排序,会导致不在一起的相同的ip地址出现两个记录的情况- 案例 1:请返回 /home/aaa/test.txt 的 /home/aaa
- dirname /home/aaa/test.txt
- /home/aaa
复制代码 第二题
题目:统计连接到服务器的各个ip情况,并按连接数从大到小排序(腾讯)
解决步骤
- 找出建立连接的服务
netstat -an | grep ESTABLISHED- 基本语法:
- [ function ] funname[()]
- {
- Action;
- [return int;]
- }
复制代码 - 以空格分割第一步获取到的服务信息并打印第5段内容(多个空格 看作 1个空格)
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'- #!bin/bash
- #案例 1:计算输入两个参数的和(动态的获取)
- #定义函数 getSum
- function getSum() {
- SUM=$[$n1+$n2]
- echo "和是=$SUM"
- }
- #输入两个值
- read -p "请输入一个数 n1=" n1
- read -p "请输入一个数 n2=" n2
- #调用自定义函数
- getSum $n1 $n2
复制代码 - 继续以:分割第二步获取到的信息并打印第一段内容
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}'
或者
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | cut -d ':' -f 1- [root@luminescent shcode]# sh testFun.sh
- 请输入一个整数n1=520
- 请输入一个整数n2=1314
- 两数之和=1834
复制代码 - 对第三步获取到的ip地址进行排序
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort- [root@luminescent shcode]# sh testFun.sh
- 请输入一个整数n1=520
- 请输入一个整数n2=1314
- 两数之和=1834
复制代码 - 统计ip地址出现的次数
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c- 30 2 * * * /usr/sbin/mysql_db_backup.sh
复制代码 - 根据 ip地址出现的次数多少 从大到小排序
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr- 30 2 * * * /usr/sbin/mysql_db_backup.sh
复制代码 第三题
题目:如何重置mysql5.7数据库的ROOT用户的密码?(滴滴)
解决步骤:
- 编辑mysql的配置文件:vim /etc/my.cnf
在文件中的[mysqld]标签下添加一行内容:skip-grant-tables
表示忽略检查权限(不需要输入密码)
- 重启mysql服务,使修改后的配置文件内容立即生效:service mysqld restart
- 登录mysql数据库:mysql -u root -p,输入密码的地方直接回车
- 使用数据库mysql:use mysql;
- 修改表user的列authentication_string值为数据库的新密码
update user set authentication_string=password('新密码') where user='root';
- 刷新权限:flush privileges;
- 退出数据库:exit;
- 再次编辑mysql的配置文件,注释掉第一步写入的内容:vim /etc/my.cnf
#skip-grant-tables
- 重启mysql服务(使修改的配置文件立即生效):service restart mysqld
- 重置密码工作已完成。可以使用新密码登录mysql数据库
第四题
题目:统计ip访问情况,要求分析nginx访问日志(access.log),找出访问页面数量在前两位的ip地址(美团)
解决步骤:(原理和第二题一样)
指令:cat access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2'
head -2 -> 表示只获取前两个信息
第五题
常用的Nginx模块,用来做什么?
- rewrite模块:实现重写功能
- access模块:来源控制
- ssl模块:安全加密
- ngx_http_gzip_module:网络传输压缩模块
- ngx_http_proxy_module:网络代理模块
- ngx_http_upstream_module:模块实现定义后端服务器列表
- ngx_cache_purge:实现缓存清除功能
第六题
如果你是系统管理员,在进行Linux系统权限划分时,应考虑哪些因素?
回答方向:
- 首先阐述Linux权限的主要对象
比如rwx权限作用在文件上的含义,作用在目录上的含义
rwx权限如何修改,-R权限递归修改选项
- 根据自己的实际经验考虑因素
- 注意权限分离,比如Linux系统权限和数据库权限不要再同一个部门
- 权限最小原则 -> 权限够用就行
- 减少使用root用户,尽量用普通用户+sudo提权进行操作
- 重要的系统文件,比如/etc/passwd,/etc/shadow等,日常建议使用chattr(change attribute)锁定,需要操作时再打开
- 使用SUID,SGID,Sticky设置特殊权限
- 可以利用工具,比如chkrootkit hunter检测rootkit脚本(rootkit是入侵者使用工具,在不察觉的情况下建立了入侵系统途径)
- 利用工具Tripwire检测文件系统完整性
第七题(⭐)
题目:Linux的CentOS 7的启动流程?和CentOS 6的相同点和不同点?
CentOS 7的启动流程
CentOS 6的启动流程
第八题
题目:列举Linux高级命令,至少6个(百度)
回答:
- netstat -> 网络状态监控
- top -> 动态监控系统运行状态
- lsblk -> 查看硬盘分区
- find
- ps -aux -> 查看运行进程
- chkconfig -> 查看服务启动状态
- systemctl -> 管理系统服务
第九题
题目:Linux 查看内存、io读写、磁盘存储、端口占用、进程查看 的命令是什么?(瓜子)
回答:
- 查看内存 -> top指令
- io读写 -> iotop指令(需要手动安装:yum install iotop)
- 磁盘存储:df -lh指令
- 端口占用:netstat -tunlp
- 进程查看:ps -aux指令 配合管道指令可以查看目标进程
第十题
题目:用linux命令计算t2.txt第二列的和并输出(美团)
t2.txt内容:- /var/log/yxz.log
- {
- missingok
- daily
- copytruncate
- rotate 1
- notifempty
- }
复制代码 答案:cat t2.txt | awk " " '{sum+=$2} END {print sum}'
第十一题
题目:Shell脚本里如何检查一个文件是否存在?并给出提示(百度)
答案:if [ -f 文件名 ] then echo "存在" else echo "不存在" fi
第十二题
题目:用Shell写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出(百度)。t3.txt内容:- dump [-cu] [-0123456789] [-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统]
- dump [] -wW
复制代码 答案:
- 排序:sort -n t3.txt -> 从小到大排序,sort -nr t3.txt -> 从大到小排序
- 统计综合
sort -nr t3.txt | awk '{sum+=$0; print $0} END'
- 输出提示信息
sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}'- http://192.168.218.20/index1.html
- http://192.168.218.30/index2.html
- http://192.168.218.20/index1.html
- http://192.168.218.10/index1.html
- http://192.168.218.10/index1.html
- http://192.168.218.20/order.html
- http://192.168.218.10/order.html
复制代码 第十三题
题目:使用指令写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符“cat”的文件名称(金山)
答案:grep -r "cat" /home | cut -d ":" -f 1
第十四题
题目:统计/home目录下所有文件个数和所有文件总行数的指令(金山面试题拓展)
答案:
- 统计所有文件个数:find /home -name "*.*" | wc -l
- 统计所有文件的总行数:find /home -name "*.*" | xargs wc -l
第十五题
题目:列出你了解的web服务器负载架构(滴滴)
Nginx、Haproxy、Keepalived、LVS
第十六题
题目:每天晚上10点30分,打包站点目录/var/spool/mail 备份到/home目录下(每次备份按事件生成不同的备份包 比如按照 年月日时分秒)(滴滴)
- 编写shell脚本:vim /root/shcode/mail.sh
- 192.168.218.20
- 192.168.218.30
- 192.168.218.20
- 192.168.218.10
- 192.168.218.10
- 192.168.218.20
- 192.168.218.10
复制代码 - 设置crond任务调度:crontab -e
- 192.168.218.10
- 192.168.218.10
- 192.168.218.10
- 192.168.218.20
- 192.168.218.20
- 192.168.218.20
- 192.168.218.30
复制代码 第十七题
题目:如何优化Linux系统?
- 对Linux架构的优化
部署集群 -> 访问一个linux服务器优化成访问多个Linux服务器 -> LVS实现负载均衡
- 网络优化 -> 每个客户访问LVS,带宽大小优化
- 磁盘IO优化 -> 提升访问文件系统的速度
- 文件连接数 -> 读写分离
- 安全性
- 防火墙 -> 内部的服务不对外部开放
- 内存优化,比如关闭不必要的服务
- 对Linux系统本身的优化----规则
- 不使用root,使用sudo提示权限
- 定时的自动更新服务时间,使用nptdate npt1.aliyun.com,让crond定时更新
- 配置yum源,指向国内镜像
- 配置合理的防火墙策略,打开必要的端口,关闭不必要的端口
- 打开最大文件数(调整文件的描述的数量):vim /etc/profile ulimit-SHn 65535
- 配置合理的监控策略
- 配置合理的系统重要文件的备份策略
- 对安装的软件进行优化,如Nginx,apache
- 内核参数进行优化:/etc/sysctl.conf
- 锁定一些重要的系统文件
- 禁用不必要的服务,setup指令,ntsysv
来源:https://www.cnblogs.com/Yxz-smile/p/17334298.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|