Linux笔记
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 |
/sbin | s 就是 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 | 常用 | 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件 |
/selinux | security-enhanced linux | SELinux 是一种安全子系统,它能控制程序只能访问特定文件, 有三种工作模式,可以自行设置. 类似于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 | 立即关机,同上 |
shutdown | 1分钟后关机 |
shutdown -h 1 | 同上,给每一个登录到Linux系统的用户发一条消息:1分钟后关机 |
shutdown -h 2 | 2分钟后关机 |
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、添加用户
语法:
useradd 用户名
useradd milan
注意:当创建用户成功后,会自动创建和用户同名的家目录,该用户的家目录默认在home目录下
也可以给新用户指定家目录:useradd -d 指定目录 新用户名
比如:useradd -d /home/test king
-> 创建一个新用户king,其家目录test
7.3、指定、修改密码
语法:passwd 用户名
表示给某个用户设置/更改密码
注意:要写用户名。不写用户名默认设置当前用户,如果当前用户是root就麻烦了。
比如:给milan设置密码,输入:passwd milan
后再按Enter键输入milan的密码。
命令:pwd --->显示当前用户所在目录(pwd, Print Working Directory)
7.4、删除用户
语法:userdel 用户名
普通用户不能删除别的用户,只有root用户可以;并且不能自己删除自己
-
删掉用户,但是保留其家目录:
userdel 用户名
-
将用户和其家目录一起删除(这个操作要谨慎):
user -r 用户名
-
一般情况,建议保留家目录(不删除)
注意:如果使用user1用户登录系统,然后使用su - root
方式切换登录到root用户,去删除user1用户会操作失败(因为user1的用户系统还在运行,无法删除自己)。
7.5、查询用户信息
语法:id 用户名
[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命令
-
语法:
man 命令/配置文件
是manual的简写,manual是手册的意思,获得帮助信息
-
例子:查看ls命令的帮助信息
输入:man ls 之后,会看到ls的具体信息(要回到前一个页面,输入q)
注意:可能不止一页,使用空格或下键,可以往下看
==在Linux系统下,隐藏文件是以
.
开头的
- ls命令:列出目录内容
-
格式:
ls [选项] [文件名...]
ls -a --->列出所有文件,包括隐藏文件(隐藏文件以 . 开头)
ls -l --->单列输出
-
选项以 - 开始
选项可以组合使用,没有顺序:
比如:ls -al
也可以ls -a -l
表示列出所有的文件 并 单列输出,ls -l
和ll
等价 -
ls默认是对当前目录下的文件
也可以指定某个目录:
如:ls -al /root
表示把root目录下的所有文件单列输出
- 语法:
help 命令
- 功能:获得 shell 内置命令的帮助信息
- 例子:查看 cd 命令的帮助信息:
help cd
8.4、关于文件目录的指令
-
pwd
指令:显示当前工作目录的绝对路径 -
ls [选项] [目录|文件]
指令:常用选项:
-a
:显示当前目录所有的文件和目录,包括隐藏的-l
:以列表的方式显示信息-R
:递归列出遇到的子目录
-
cd [绝对路径|相对路径]
指令:切换到指定目录cd ~
或者cd
回到自己的家目录cd ..
:回到当前目录的上一级目录。如果已经在根目录,则保持不变 -
mkdir [选项] 要创建的目录
:理解:mkdir指令用于创建目录(默认只能创建一级目录)
选项
-p
:创建多级目录。如:mkdir -p /home/test/linux -
rmdir [选项] 要删除的空目录
:rmdir删除的是空目录,如果欲删除的目录下有内容则无法删除
如果需要删除非空目录,需要使用
rm -rf 要删除的目录
比如:删除animal目录:
rm -rf /home/animal
-
touch 要创建的文件名称
:如:touch /home/a.txt 表示在home目录下创建一个a.txt空文件
-
cp [选项] source dest
指令:拷贝文件到指定目录常用选项:
-r
递归复制整个文件夹应用实例:将 /home/hello.txt 拷贝到 /home/bbb 目录下
cp /home/hello.txt /home/bbb
递归复制整个文件夹,将/home/aaa 目录下的文件全部拷贝到/home/bbb下
cp -r /home/aaa /hom/bbb
(是将整个目录和目录本身拷贝进来),使用强制覆盖不提示的方法:\cp。如:
\cp -r /home/aaa /home/bbb
-
rm
指令:移除文件或目录基本语法:
rm [选项] 要删除的文件或目录
常用选项:
-r:递归删除整个文件夹
-f:强制删除不提示
案例1:将 /home/hello.txt 删除
rm /home/hello.txt
案例2:递归删除整个文件夹 /home/bbb ,并不提示
rm -rf /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 下
mv /opt/bbb /home/
-
cat
指令:查看文件内容vi和vim指令能查看文件内容,但是容易误操作编辑文件内容。相比于vi|vim指令,cat也可以查看,cat只能查看不能修改,cat更安全。
基本语法:
cat [选项] 要查看的文件
常用选项:
-n
(显示行号)案例1:查看 /etc/profile 文件内容,并显示行号。
cat -n /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 行代码
head -n 5 /etc/profile
-
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 文件中
cal >> /home/mycal
-
ln
指令:给原文件创建一个软链接,软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径(ln:link)基本语法:
ln -s [原文件或目录] [软链接名] (功能描述:给原文件创建一个软链接)
案例1:在/home 目录下创建一个软连接 myroot,连接到 /root 目录(这样 切换到myroot 其实就是切换到root)
ln -s /root /home/myroot
案例2: 删除软连接 myroot
rm /home/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"
- 设置日期
date -s 字符串时间
案例 1: 设置系统当前时间:
date -s "2020-11-03 20:02:10"
-
cal
指令:查看日历cal [选项] (功能描述:不加选项,默认显示本年本月日历)
案例 1: 显示当前日历:
cal
案例 2: 显示 2020 年日历:cal 2020
8.6、关于搜索查找的指令
-
find
指令:从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法:find [搜索范围] [选项]
选项 功能 -name<查询方式> 按照指定的文件名查找模式查找文件 -user<用户名> 查找属于指定用户名所有文件 -size<文件大小> 按照指定的文件大小查找文件,文件大小单位:k,M,G 案例 1: 按文件名:根据名称查找 /home 目录下的 hello.txt 文件
find /home -name hello.txt
案例 2:按拥有者:查找 /opt 目录下,用户名称为 nobody 的文件
find /opt -user 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 文件所在目录
updatedb locate hello.txt
-
which
指令:可以查看某个指令在哪个目录下案例:ls 指令在哪个目录:which ls
-
grep
指令和管道符号|
:grep指令往往和管道符号 | 结合使用
grep:过滤查找,管道符:| -> 表示将前一个命令的处理结果输出传递给后面的命令处理。
比如:先cat a.txt,然后又想看a.txt文件中有没有hello这个词,那么就
cat a.txt | grep "hello"
--->先找到a.txt,然后再在a.txt中找hello。基本语法:
grep [选项] 查找内容 源文件
常用选项:
- -n:显示匹配行及行号
- -i:忽略字母大小写
案例 1: 请在 hello.txt 文件中,查找"yes"所在行,并且显示行号
写法 1: 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 文件进行压缩
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
- 如果是普通文件,直接就是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
- 修改悟空的家目录权限(给同组用户增加rwx权限):
-
八戒修改 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
- 普通用户没有修改用户组的权限,切换至root权限:
-
让沙僧修改该文件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
- 切换mycentos登录:
-
在 t1 中建立一个文本文件 aa,用 vi 编辑其内容为 ls –ahl
vi /home/mycentos/test/t11/t1/aa
-> 输入内容ls -ahl
-
改变 aa 的权限为可执行文件[可以将当前日期追加到一个文件],运行该文件./aa
- 在aa文件中追加日期:
vim test/t11/t1/aa
-> [i]键进入编辑模式 -> 输入date "+%F %T"
- 修改aa的权限:
chmod u+x test/t11/t1/aa
- 运行文件:
. /文件
- 在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 | 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出 |
-I | atq的别名 |
-d | atrm的别名 |
-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在
同一网段上,要能够通信
,也要修改相应的vmnet8vmware ---> 编辑 ---> 虚拟网络编辑器
打开虚拟编辑器,点击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-1foo软件包被 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
- :wq(保存退出)
-
(⭐)为了更新环境变量,使用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
- :wq保存退出
-
更新环境变量:
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
保存退出注意:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
必须加上,否则会出现中文乱码问题 -
主机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
- 查找mysql相关文件:
-
卸载完成。
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脚本的注释
单行注释:
# 这是shell脚本的单行注释
多行注释:
:<<! 多行注释1 多行注释2... !
注意:多行注释起始符和终止符都必须独占一行
16.4、位置参数变量
-
介绍:当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh 100 200
这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息 -
基本语法
$n
: n 为数字,$0 代表命令本身(如./myshell.sh),$1-$9
: 代表第一到第九个参数(如:$1 就是100 $2 就是200),十以上的参数需要用大括号包含,如${10})$*
: 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)$@
: 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)$#
: 这个变量代表命令行中所有参数的个数)
-
案例:
vim myshell.sh
#!/bin/bash echo "命令本身=$0 第一个参数=$1 第二个参数=$2" echo "所有的参数=$*" echo "$@" echo "参数个数=$#"
16.5、预定义变量
- 基本介绍:预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
- 基本语法
$$
:当前进程的进程号(PID)$!
:后台运行的最后一个进程的进程号(PID)$?
:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
- 应用实例:
vim preVar.sh
#!/bin/bash
echo "当前执行的进程ID=$$"
# 以后台方式运行一个脚本,并获取它的进程号
sh /root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程ID=$!"
echo "执行的结果是=$?"
16.6、运算符
-
基本介绍:适用运算符在 shell 中进行各种运算操作。
-
基本语法(三种写法)
-
$((运算式))$
-
$[运算式]$
---> 推荐使用 -
expr m + n
(expression表达式,注意expr表达式中运算符两边要有空格,否则会把整个表达式当成字符串处理)expr \*, /, %
----> 表示乘,除,取余注意:要将expr的返回值赋给变量,需要使用``将整个expr表达式括起来
-
-
应用实例
#!/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"
16.7、条件判断
-
基本语法:
if [ condition ]
-> 注意:condition前后都必须要有空格if [ condition ] then 语句 fi
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
#!/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
16.8、流程控制
16.8.1、if elif语句
-
基本语法(相当于Java中的else if语句)
if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] then 代码 fi
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
-
应用实例:
vim ifCase.sh
#!/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
16.8.2、case语句
-
基本语法(相当于Java中的switch-case语句)
case $变量名 in "值 1") 如果变量的值等于值 1,则执行程序 1 ;; "值 2") 如果变量的值等于值 2,则执行程序 2 ;; ...省略其他分支... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
每个case分支都以
;;
结尾,这两个;;
不能分开 -
应用实例
#!/bin/bash # 案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",是3时,就输出"周三",其它情况输出"other" case $1 in "1") echo "周一";; "2") echo "周二";; "3") echo "周三" ;; *) echo "other...";; esac
16.8.3、for循环
-
基本语法
# 语法格式1 for 变量 in 值 1 值 2 值 3... do 程序/代码 done # 语法格式2 for (( 初始值;循环控制条件;变量变化 )) do 程序/代码 done
-
应用实例
vim testFor1.sh
#!/bin/bash # for语法格式1 # 案例:打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别] # 注意:$* 是把输入的参数当作一个整体,所以只会输出一句话 for i in "$*" do echo "num is $*" done # 使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句 echo "======================================" for j in "$@" do echo "num is $@" done
[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
vim testFor2.sh
#!/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"
[root@luminescent shcode]# sh testFor2.sh 1000 1-100的总和:5050 1-1000的总和:500500
16.8.4、while循环
-
基本语法
while [ 条件判断式 ] do 循环体 done
注意:
- while和[]中间有空格
- 条件判断式两边也必须有空格
- while循环体内必须有循环变量自增
-
应用实例:
vim testWhile.sh
#!/bin/bash SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo "执行结果=$SUM"
[root@luminescent shcode]# sh testWhile.sh 10 执行结果=55
16.9、read读取控制台输入
-
基本语法:
read 选项 参数
选项:
-p
:指定读取值时的提示符-t
:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了参数:指定读取值的变量名
-
应用实例:
vim testRead.sh
#!/bin/bash #案例 1:读取控制台输入一个 NUM1 值 read -p "请输入一个数 NUM1=" NUM1 echo "你输入的 NUM1=$NUM1" #案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。 read -t 10 -p "请输入一个数 NUM2=" NUM2 echo "你输入的 NUM2=$NUM2"
[root@luminescent shcode]# sh testRead.sh 请输入一个数NUM1=10 输入的NUM1=10 请输入一个数NUM2=520 输入的NUM2=520
16.10、函数
shell编程和其它编程语言一样,有系统函数,也可以自定义函数。
16.10.1、系统函数
-
basename函数:返回完整路径最后 / 的部分,常用于获取文件名
basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
基本语法:
basename [pathname] [suffix] basename [string] [suffix]
选项:suffix为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分 basename /home/aaa/test.txt test.txt basename /home/aaa/test.txt .txt test
-
dirname函数:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
基本语法:
dirname 文件绝对路径
案例 1:请返回 /home/aaa/test.txt 的 /home/aaa dirname /home/aaa/test.txt /home/aaa
16.10.2、自定义函数
-
基本语法
基本语法: [ function ] funname[()] { Action; [return int;] }
调用直接写函数名:funname [值]
-
案例:计算输入两个参数的和(动态的获取)
testFun.sh
#!bin/bash
#案例 1:计算输入两个参数的和(动态的获取)
#定义函数 getSum
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
#输入两个值
read -p "请输入一个数 n1=" n1
read -p "请输入一个数 n2=" n2
#调用自定义函数
getSum $n1 $n2
[root@luminescent shcode]# sh testFun.sh
请输入一个整数n1=520
请输入一个整数n2=1314
两数之和=1834
Shell编程综合案例-定时数据库备份
需求分析:
- 每天凌晨2:30备份数据库 girls 到/data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成
.tar.gz
的形式,比如:2023-04-17_164041.tar.gz - 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
思路分析示意图:
前提:切换到/usr/sbin/目录下(该目录为root用户执行权限,使用root执行)
-
脚本代码实现:
mysql_db_backup.sh
->vim /usr/sbin/mysql_db_backup.sh
#!/bin/bash # 备份目录 BACKUP=/data/backup/db # 获取当前时间 DATETIME=$(date +%Y-%m-%d_%H%M%S) echo $DATETIME # 数据库地址 HOST=localhost # 数据库的用户名 DB_USER=root # 数据库的密码 DB_PW=数据库的密码 # 备份的数据库名 DATABASE=girls # 创建备份目录,如果不存在就创建 [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" # 备份数据库 mysqldump -u${DB_USER} -p${DB_PW} --host${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz # 将文件处理成tar.gz cd ${BACKUP} tar -zcvf $DATETIME.tar.gz ${DATETIME} # 删除对应的备份目录 rm -rf ${BACKUP}/${DATETIME} # 删除十天前的备份文件 find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "备份数据库${DATABASE}成功~"
-
设置定时调度任务
30 2 * * * /usr/sbin/mysql_db_backup.sh
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
-> 该配置文件中记录了日志和日志存放在哪个文件关于日志:*.* -> 其中第一个*代表日志类型,第二个*代表日志级别
日志类型 说明 auth pam 产生的日志 authpriv ssh、ftp 等登录信息的验证信息 corn 时间任务相关 kern 内核 lpr 打印 mail 邮件 mark(syslog)-rsyslog 服务内部的信息,时间标识 news 新闻组 user 用户程序产生的相关信息 uucp unix 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 ~]# more /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
# --->可以把一些单独的轮替规则写在/etc/logrotate.d下(在本文件中include调用一下就行),也可以写在本文件中(如下面写的)
#下面是单独设置,优先级更高。
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly # 每月对日志文件进行一次轮替
create 0664 root utmp # 建立的新日志文件,权限是 0664 ,所有者是 root ,所属组是 utmp 组
minsize 1M # 日志文件最小轮替大小是 1MB 。也就是日志一定要超过 1MB 才会轮替,否则就算时间达到一个月,也不进行日志转储
rotate 1 # 仅保留一个日志备份。也就是只有 wtmp 和 wtmp.1 日志保留而已
}
/var/log/btmp {
missingok # 如果日志不存在,则忽略该日志的警告信息
monthly
create 0600 root utmp rotate 1
}
# system-specific logs may be also be configured here.
单独指定某个日志文件的轮替规则的参数说明:
轮替规则的参数 | 说明 |
---|---|
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
-
写入内容:
/var/log/yxz.log { missingok daily copytruncate rotate 1 notifempty }
-
这样就好了,因为/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 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)
-
语法说明:
dump [-cu] [-0123456789] [-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统] dump [] -wW
选项说明:
-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内容:
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
解决步骤
-
读取文件t.log内容
cat t.log
-
将读取到的内容以
/
截断cat t.log | cut -d '/'
所以 以/截断后
第一段内容:http:
第二段内容为空(//之间为空)
第三段内容为ip地址
第四段内容为网页xxx.html
-
查找第三段的内容(ip地址)
cat t.log | cut -d '/' -f 3
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
-
将获取到的ip地址排序
cat t.log | cut -d '/' -f 3 | sort
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
-
统计每个ip地址出现的次数
cat t.log | cut -d '/' -f 3 | sort | uniq -c
3 192.168.218.10 3 192.168.218.20 1 192.168.218.30
-
按出现的次数从大到小排序(sort默认以从小到大排序)
cat t.log | cut -d '/' -f 3 | sort | uniq -c | sort -nr
3 192.168.218.20 3 192.168.218.10 1 192.168.218.30
注意:如果第四步不排序直接统计次数后再排序,会导致不在一起的相同的ip地址出现两个记录的情况
[root@luminescent interview]# cat t.log | cut -d '/' -f 3 | uniq -c | sort -nr
2 192.168.218.10
1 192.168.218.30
1 192.168.218.20
1 192.168.218.20
1 192.168.218.20
1 192.168.218.10
第二题
题目:统计连接到服务器的各个ip情况,并按连接数从大到小排序(腾讯)
解决步骤
-
找出建立连接的服务
netstat -an | grep ESTABLISHED
tcp 0 36 192.168.218.130:22 192.168.218.1:64958 ESTABLISHED 2526/sshd: root@pts tcp6 0 0 192.168.218.130:3306 192.168.218.1:53640 ESTABLISHED 15843/mysqld
-
以空格分割第一步获取到的服务信息并打印第5段内容(多个空格 看作 1个空格)
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'
192.168.218.1:64958 192.168.218.1:53640
-
继续以
:
分割第二步获取到的信息并打印第一段内容netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}'
或者
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | cut -d ':' -f 1
192.168.218.1 192.168.218.1
-
对第三步获取到的ip地址进行排序
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort
192.168.218.1 192.168.218.1
-
统计ip地址出现的次数
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c
2 192.168.218.1
-
根据 ip地址出现的次数多少 从大到小排序
netstat -an | grep ESTABLISHED | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr
2 192.168.218.1
第三题
题目:如何重置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内容:
张三 60
李四 40
王五 80
答案:cat t2.txt | awk " " '{sum+=$2} END {print sum}'
第十一题
题目:Shell脚本里如何检查一个文件是否存在?并给出提示(百度)
答案:if [ -f 文件名 ] then echo "存在" else echo "不存在" fi
第十二题
题目:用Shell写一个脚本,对文本t3.txt中无序的一列数字排序,并将总和输出(百度)。t3.txt内容:
6
4
8
3
2
1
5
10
答案:
-
排序:
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}'
[root@luminescent interview]# sort -nr t3.txt | awk '{sum+=$0; print $0} END {print "和="sum}' 10 8 6 5 4 3 2 1 和=39
第十三题
题目:使用指令写出查找当前文件夹(/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
#!/bin/bash cd /var/spool/ && /bin/tar zcf /home/mail-`date +%Y-%m-%d_%H%M%S`.tar.gz mail/
-
设置crond任务调度:
crontab -e
30 22 * * * /bin/sh /root/shcode/mail.sh
第十七题
题目:如何优化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