Linux基础
一、Linux 介绍
1.1 Linux 的应用领域
- 个人桌面应用领域
- 服务器应用领域
- Linux 在 应用领域是最强的,Linux 免费、稳定、高效
- 很多公司都会把项目部署到Linux上。
- 嵌入式应用领域
2.2 Linux 基本介绍
- linux是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到 业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上。
- Linux 的主要发行版本:Ubuntu(乌班图)、RedHat(红帽)、CentOS、Debain[蝶变]、Fedora、SuSE、 OpenSUSE
二、Linux 基础
1、安装 VM 【virtual machine 】
1.1 VM 和 Linux 的关系
官方下载地址: Windows 虚拟机 | Workstation Pro | VMware | CN
2、 安装 CentOS
CentOS7镜像文件下载地址: Index of /centos-vault/7.6.1810/isos/x86_64/ (kernel.org)
2.1 文件 --> 创建虚拟机
2.2 安装 ISO 镜像文件
2.3 配置 CentOS 虚拟机系统
第一步:
第二步:当安装源和软件选择是灰色时,千万不要乱点,等等!!!!
选择图形化界面:
安装位置 --》 选择 我要配置分区
自定义配置分区情况:
KDUMP :
如果部署项目时打开,如果不是就关闭。因为会占用一些内存
网络和主机名:
配置好以上配置,点击安装,设置用户和密码:
在工作时,一定要将密码设置成复杂的,不然会被破解~~~~!!!!!!
安装好后,出现以下图标,表示连接上网络了,安装成功!!!
如果没有此标志,按以下流程操作:
3、 网络连接的三种模式
- 桥接模式
- NAT 模式
- 仅主机模式
桥接模式:
-
桥接模式会自动与主机生成同一网段的 IP 地址,虚拟机可以和局域网内的主机可以互相通讯,但是容易造成 IP 地址冲突。
-
比如:有几百个学生,几百个学生都开启桥接模式,会生成 几百个同一网段 的IP 地址。 同一网段的地址最多有 255 个,其中还包括 网关,广播地址… 因此会造成 IP 冲突
NAT 模式:
网络地址转换模式
- NAT 模式 会自动在主机里生成一个模拟网卡,会有一个 IP 地址,这俩个之间会生成一个独立的网络,可以互相通信。
- 并且 Linux 里面的虚拟机可以通过 这个虚拟网卡和外界进行通信,而且不会造成 IP 冲突
- 但是有一点, 虚拟机 可以利用虚拟网卡 和主机 通讯,但是 主机 不能和 虚拟机通讯。
仅主机模式:
就是一个 独立的系统。
4、虚拟机克隆
当已经有了一个 Linux 之后,无需在重新创建虚拟机,只需要克隆就 OK 了。
方法一:
直接拷贝一份安装好的 虚拟机文件
方法二:
通过 VM 的克隆操作,克隆时需要关闭虚拟机
5、虚拟机快照
回到快照时的状态…可以拍摄多个快照。
6、安装 vmtools
安装 vmtools 后,Windows 可以更好的管理 Linux
-
可以直接粘贴命令在windows 和 centos系统之间
-
可以设置windows和centos的共享文件夹
安装步骤:
1、将镜像光盘弹出
2、安装 vmtools
3、安装后,Linux 界面会出现一个 vmtools 光盘,如果没有就取消重新装一下。
4、拷贝这个文件到 opt 目录下
5、依次输入以下命令
6、启用共享文件
7、在以下位置就可以共享文件夹了,文件夹内的任何修改都是实时更新的
三、目录结构
linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此 目录下再创建其他的目录。
在Linux世界里,一切皆文件,Linux 会将所有硬件都当做一个文件来处理。
-
/bin【/user/bin、/user/local/bin】
- 这个目录存放着最经常使用的命令
-
/sbin (/usr/sbin 、 /usr/local/sbin)
- s 就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
-
/home【重点】
- 存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般 该目录名是以用户的账号命名的。
-
/root 【重点】
- 该目录为系统管理员,也称作超级权限者的用户主目录。
-
/lib
- 系统开机所需要最基本的动态连接共享库,其作用类似Windows里的DLL文件。几 乎所有的应用程序都需要用到这些共享库。
-
/lost+found
- 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
-
/etc 【重点】
- 所有的系统管理所需要的配置文件和子目录 my.conf
-
/usr 【重点】
- 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows下的program files目录。
-
/boot
-
存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件
-
/proc【不能动】
- 这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。
-
/srv 【不能动】
- service缩写,该目录存放一些服务启动之后需要提取的数据。
-
/sys 【不能动】
-
这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统
-
/tmp
- 这个目录是用来存放一些临时文件的。
-
/dev 【重点】
- 类似于windows的设备管理器,把所有的硬件用文件的形式存储。
-
/media 【重点】
- linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下。
-
/mnt【重点】
- 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂 载在/mnt/上,然后进入该目录就可以查看里的内容了。 c:/myshare
-
/opt
- 这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下。 默认为空。
-
/usr/local 【重点】
- 这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序。
-
/var [重点]
-
这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。
包括各种日志文件。
-
-
/selinux [security-enhanced linux] 360
- SELinux是一种安全子系统,它能控制程序只能访问特定文件。
四、远程登录以及文件上传下载
XShell, Xftp下载: 家庭/学校免费 - NetSarang Website (xshell.com)
在公司中开发中的流程是这样的:
-
linux服务器是开发小组共享的.
-
正式上线的项目是运行在公网的.
-
因此程序员需要远程登录到centos进行项目管理或者开发.
-
远程登录客户端有 Xshell, Xftp, 我们学习使用 Xshell 和 Xftp , 其它的 远程工具大同小异.
XShell : 远程登录
Xftp : 远程上传下载文件
XShell 使用:
1、先在 Linux 中查询 IP 地址
2、XShell 中 新建会话
3、输入 IP 地址 以及端口号,名称随意、IP 地址要对
4、一次性接受:每次登录都输入用户名密码
接受并保存:只需要输入一次用户名和密码
Xftp 使用:
和 XShell 一样,创建会话
图左边是Windows 右边是 Linux 。直接在左边双击就会将文件上传到 Linux 中。
解决 xftp 乱码问题:
五、Vi 和 Vim
所有的 Linux 系统都会内建 vi 文本编辑器。
Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别 语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别 丰富,在程序员中被广泛使用。
1、Vi 和 Vim 的三种模式
-
正常模式
- 以 vim 打开一个档案后直接进入 正常模式
-
插入模式
- 按下i, I, o, O, a, A, r, R等任何一个字母之后才会进入编辑模式, 一般来说按i即可
-
命令行模式
- 在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的 动作则是在此模式中达成的!
三种模式之间的互换:
2、Vim 的常用命令
-
拷贝当前行
yy
, 拷贝当前行向下的5行 5yy,并粘贴(p键)。 -
删除当前行
dd
, 删除当前行向下的5行 5dd -
在文件中查找某个单词 [命令行下 /关键字 , 回车 查找 , 输入 n 就是查找下一个 ]
-
设置文件的行号,取消文件的行号. [命令行下 : set nu 和 :set nonu]
-
编辑 /etc/profile 文件,使用快捷键到底文档的最末行[G]和最首行[gg]
6)撤销前一个个动作 u
- 编辑 /etc/profile 文件,并将光标移动到 20行 ,先输入 :20,在按shift+g 。或者 在一般模式下,nG ,n 代表移动到第几行。
8)替换命名:
:%s/abc/def 将文件中的所有abc 替换成 def
六、关机、重启、用户登录和注销命令
1、关机重启命令
作用 | |
---|---|
shutdown –h now | 立该进行关机 |
shutdown -h 1 | “hello, 1 分钟后会关机了” |
shutdown –r now | 现在重新启动计算机 |
halt | 关机,作用和上面一样. |
reboot | 现在重新启动计算机 |
sync | 把内存的数据同步到磁盘. |
shutdown 默认表示:shutdown -h 1
注意:
不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中
虽然现在的 shutdown /halt/reboot 命令执行之前,自动指定了sync 命令。但建议还是手动执行一遍
2、用户登录、注销
-
登录时尽量少用root帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可 以利用普通用户登录,登录后再用“su - 用户名”命令来切换成系统管理员身份.
-
在提示符下输入 logout 即可注销用户
注意: logout 只在运行级别 3 下 有效。
root --》普通用户 无需输入登录密码
普通用户 --》 root 需要输入登录密码
七、用户管理
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向 系统管理员申请一个账号,然后以这个账号的身份进入系统。
1、增加用户
useradd 用户名
- 当创建成功用户后,会自动创建和用户同名的 家目录
- 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
2、指定密码
passwd 用户名
如果不指定用户名,默认为当前登录的用户名设置密码
3、删除用户
userdel 用户名
-
删除用户xiaoming,但是要保留家目录 userdel 用户名
-
删除用户以及用户主目录 userdel -r 用户名
对于正在登录的用户是无法删除的。
4、查询用户信息
id 用户名
显示当前正在登录的用户:
who am i
显示第一次登录的用户。
5、用户组
类似于角色,系统可以对有共性/权限的多个用户进行统一的管理
增加组:
groupadd 组名
删除组:
groupdel 组名
增加用户时直接增加到组:
useradd -g 组名 用户名
修改用户的组:
usermod -g 组名 用户名
6、用户和组相关的文件
- /etc/passwd
- 用户(user)的配置文件,记录用户的各种信息
- 每行的含义:用户名 : 口令 : 用户标识号[uid] : 组标识号[gid] : 注释性描述 : 主目录 : 登录Shell
- 登录 Shell 是 命令 与 Linux 内核之间一种转机器语言,负责解析命令。
-
/etc/shadow
- 口令的配置文件
- 每行的含义: 登录名 : 加密口令[对密码进行加密] : 最后一次修改的时间 : 最小时间间隔 : 最大时间间隔 : 警告时间 :不活动时间 : 失效时间 :标志
-
/etc/group
- 组(group)的配置文件,记录Linux包含的组的信息
- 每行含义:组名 : 口令 : 组标识号 : 组内用户列表
八、常用的命令
1、运行级别
0 :关机
1 :单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务 【命令行模式】
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用运行级别是3和5 ,要修改默认的运行级别可改文件
使用命令:init 命令级别 ,修改运行级别
在 CentOS7 以后对 inittab 文件进行了简化:
# multi-user.target: analogous to runlevel 3 // 表示 运行级别 3 # graphical.target: analogous to runlevel 5 //运行级别 5 # # To view current default target, run: # systemctl get-default //通过这行命令 ,获取运行级别 # # To set a default target, run: # systemctl set-default TARGET.target //设置运行级别
设置运行级别 3:
设置运行级别 5:
2、找回 root 密码
第一步:在启动界面按 :“e”
第二步:找到 UTF-8 的位置,输入: init=/bin/sh 进入单用户模式
第三步:输入完后,按 Ctrl + X
第四步:进入单用户模式,输入:mount -o remount,rw /
第五步:输入 passwd --》回车 --》输入重置的密码 --》回车 --》再次输入密码 --》最终输入:
touch /.autorelabel --》回车 --》 exec /sbin/init
过程会有一点慢,耐心等待!!!!!
3、帮助命令
man [命令或配置文件] 获取帮助信息
help 命令 获取shell 内置命令的帮助信息
4、文件目录命令
ls [选项] 文件名
h :人性化显示
(1)cd [参数] 切换到指定目录
cd ~ 或者 cd :回到自己的家目录,比如:你是 root, cd ~ 到 /root
cd … 回到当前目录的上一级目录
相对路径与绝地路径:
比如当前在 home 目录切换到 root 目录:
绝对路径 : cd /root
相对路径 : cd …/root
绝对路径是从 / 根路径开始
相对路径是从当前路径开始, cd … 返回上一级目录 / ,在到 /root 目录。
(2)mkdir [选项] 目录名
常用选项:
-p : 递归创建目录
(3)rmdir [选项] 要删除的空目录
只能删除一个空目录。
如果删除当前目录中的某一个目录,只需要 : rmdir 目录名 不需要加 /
rm -rf 可以删除有内容的目录。
(4)touch 创建空文件
创建一个空的文件,没有内容
(5)cp [选项] source dest
拷贝文件到指定的目录
常用选项:
-r : 递归复制整个文件夹
实战: 将 /tom/test.text 拷贝到 /home/aaa 目录下
实战二: 将 /tom/bbb 目录 拷贝到 /home/aaa 的目录下
强制覆盖不提示:\cp
(6)rm 指令
移除文件或目录
rm [选项] 要删除的文件或目录
常用选项:
-r : 递归删除整个文件夹
-f : 强制删除不提示
rm -rf 删除整个目录,不提示,一定要小心!!!!!!
(7)mv 指令
mv oldNameFile newNameFile
mv 移动文件与目录 或重命名!
实例一: 将 /home/tom 目录下的 test.text 文件重命名为 newTest.text
实例二:将 /home/tom 目录下的 newTest.text 文件移动到 /home 目录下
实例三:将 /home 下的 newTest.text 的文件移动到 /root 目录 并且重命名:newTest2.text
(8)cat 指令
cat [选项] 查看的内容
查看文件内容
常用选项:
-n : 显示行号
cat 指令只能浏览文件,不能修改文件,为了浏览方便,一般会带上 管道命令 | more
管道命令 | :类似于 将前面的结果交给后面的指令执行
(9)more 指令
more 查看的文件
more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。 more指令中内置了若干快捷键,详见操作说明
more 可以和 cat 进行交互使用,也可以单独使用
(10) less 命令
less 查看的文件
less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支 持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是 根据显示需要加载内容,对于显示大型文件具有较高的效率。
(11)echo 指令
向控制器中输出内容
输出主机名:
输出 hello :
(12)head 指令
head [选项] 文件名
head -n 5 显示文件前5行的内容
用于显示文件的开头部分内容,默认情况下显示文件的前 10 行内容
(13)tail 指令
tail [选项] 文件名
tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的前10行内容。
1) tail 文件 (功能描述:查看文件头10行内容)
2) tail -n 5 文件 (功能描述:查看文件头5行内容,5可以是任意行数)
3) tail -f 文件 (功能描述:实时追踪该文档的所有更新)
(14)> 指令 和 >> 指令
> 输出重定向 和 >> 追加
如果追加的文件不存在,会自动创建
ls -l > 文件名 将显示列表的内容写入文件中【覆盖文件中的所有内容】
ls -l >> 文件名 将显示列表的内容追加到文件中【不会覆盖之前的内容】
cat 文件1 > 文件2
将文件1的内容覆盖到文件2
echo "内容" >> 文件
将 “内容” 追加到文件当中
(1 5)ln 软链接
软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径
ln -s [源文件或目录] [软链接名]
给源文件创建一个软链接
为 /root 目录创建一个软链接:
(16)history
查看历史命令
history 5 查看前5条命令
!5 执行历史命令中的第五条命令
5、时间日期类指令
-
date (功能描述:显示当前时间)
-
date +%Y (功能描述:显示当前年份)
-
date +%m (功能描述:显示当前月份)
-
date +%d (功能描述:显示当前是哪一天)
-
date “+%Y-%m-%d %H:%M:%S” (功能描述:显示年月日时分秒)
设置日期:
date -s 字符串时间
cal 日历指令
cal [选项]
不加选项显示本月日历,加具体的年份显示一年的月份
6、搜索查找类指令
(1)find 指令
find [搜索范围] [选项]
find 将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端
**实例一:**找到 home 目录下name为 hello.text 的文件
find /home -name test.text
精确查找,如果 *.text 找到所有以 .text 结尾的文件。
**实例二:**找到 home 目录下 user 为 tom 的文件
find /home -user tom
实例三:查找整个 Linux 系统下大于 200M 的文件(+n 大于,-n 小于,n 等于,单位有:k,M,G)
find / -size +200M
(2)locate 指令.
locate 搜索文件名
locate 指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径 的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。 为了保证查询结果的准确度,管理员必须定期更新locate时刻。
在使用 locate 前,需要更新查询库 updatedb .
实例一:快速查找 test.text 文件
updatedb
locate test.text
(3)which 指令
which 指令
查找 指令在哪个目录
(4)grep 指令 和 管道符号 |
grep 过滤查找 ,文本搜索工具, 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。
grep [选项] 查找内容 源文件
常用选项:
实例一:查找 test.text 文件中 “yes” 字符串,并显示行号,忽略大小写
方法一:cat /home/test.text | grep -in "yes"
方法二:grep -in "yes" /home/test.text
7、压缩、解压缩类指令
(1)gzip / gunzip 指令
gzip : 压缩文件 gunzip:解压缩
gzip 文件名
将文件压缩成 *.gz 文件
gunzip 文件.gz
将文件解压缩
gzip / gunzip 是对文件进行压缩/解压缩,对目录无法压缩/解压缩
(2)zip/unzip 指令
zip/unzip : 压缩/解压缩 文件或者目录为:xx.zip。
zip [选项] xxx.zip 将要压缩的内容
unzip [选项] 文件.zip
常用的选项:
-r:递归压缩,即压缩目录
unzip的常用选项 :
-d <目录> :指定解压后文件的存放目录
实例一:将 /home 以及 /home 下的文件进行压缩,压缩名:myhome.zip
zip -r myhome.zip /home/
实例二:将 压缩后的 myhome.zip 解压到 /opt 目录下
unzip -d /opt/ myhome.zip
(3)tar 指令
tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件。
tar [选项] XXX.tar.gz 打包的内容
打包目录,压缩后的文件格式.tar.gz
常用选项:
-C <目录> 指定解包之后的目录
**实例一:**将 /home 目录下的 test1.text 和 test.text 文件打包 成 pc.tar.gz
tar -czvf pc.tar.gz /home/test1.text /home/test.text
多个文件使用空格分开就行。
实例二: 将 /home 目录打包到 /opt 目录下
tar -czvf myhome.tar.gz /home/
实例三: 将 myhome.tar.gz 解压到 /opt/ 目录下.
tar -xzvf myhome.tar.gz -C /opt/home
九、组管理和权限管理
在 Linux 中的每个用户必须属于一个组,不能独立于组外。
在 Linux 中每个文件 有所有者、所在组、其它组的概念。
- 所有者:文件的创建者,可以更改
- 所在组:所有者所在的组
- 其他组:除所在组和所有者之外,都是其他组。
-
修改文件/目录所有者:
chown 用户名 文件名/目录名
-
修改目录下所有文件的所有者 :
chown -R 用户名 文件名/目录名
-
修改文件所在组:
chgrp 组名 文件名
-
修改所在组下的所有文件的所在组:
chgrp -R 组名 文件名
-
增加用户时修改用户所在组:
useradd -g 组名 用户名
-
直接修改用户所在组:
usermod -g 组名 用户名
1、权限基本介绍
使用 ls -l 显示的内容都是什么意思:
0-9位说明
- 第0位确定文件类型(d, - , l , c , b)
- l : 表示软链接,类似于 Windows 中的快捷方式
- -:表示普通文件
- d : 表示目录
- c : 表示字符设备文件,鼠标键盘
- b:是块设备,比如硬盘
- 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。—User
- 第4-6位确定所属组(同用户组的)拥有该文件的权限,—Group
- 第7-9位确定其他用户拥有该文件的权限 —Other
- 1 : 文件:硬链接数 目录:子目录数
- root/fox/zwj/tom : 用户
- root /master/tom/wudnag: 文件所在组
- 4096 : 文件大小
- 4月 4 19:35 :最后修改日期
- a.text : 文件名
2、rwx 权限详解
rwx 作用到文件:
-
r : read ,可读,可以查看,阅读
-
w:write,可写,可以修改,但是不代表可以删除该文件,删除该文件的前提是该文件所在的目录拥有 w 写权限。
-
x :execute,执行,可以被执行。
rwx 作用到目录:
- r : read ,可读,可以使用 ls 查看目录内容
- w:write,可写,可以修改,可以对目录内创建+删除+重命名目录/文件【touch,rm,cp,mv】
- x :execute,执行,可以进入该目录,执行 cd 命令
3、修改文件或者目录权限
通过 chmod 指令,可以修改文件或者目录的权限。
第一种方式: 通过 +、-、= 号来变更权限
u = 所有者 g=所在组 o=其他人 a=所有人【u、g、o总和】
例一:
chmod u=rwx,g=rw,o=r 文件名/目录名
给文件所有者 rwx 权限,所在组 rw 权限,其他人 r 权限
例二:
chmod g+x 文件名/目录名
为文件/目录 的所在组增加 x 权限
例三:
chmod u-w 文件名/目录名
为文件/目录 所有者减少 w 权限
例四:
chmod a=rwx 文件名/目录名
为文件/目录 的所有者,所在组,其他人设置 rwx 权限
文件变为绿色,代表该文件可执行。
**第二种方式:**通过数字设置权限
r=4,w=2,x=1
例一:
chmod 741 文件名/目录名
将文件/目录 的所有者权限设置为:rwx,所在组:r,其他人:x
三位数字可随意组合:1~7之内的数
注意:
如果相对目录内的文件进行操作,需要有对该目录相对应的权限。
十、任务调度
1、crond 任务调用
crontab 进行 定时任务的设置。---- 循环执行
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:
1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等
2.个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。
crontab [选项]
常用选项:
实例一:
设置定时任务,每隔1分钟执行 该任务 :ls -l /root > /home/b.txt
crontab -e
设置定时任务
增加: */1 * * * * ls -l /root/ > /home/b.txt
案例说明:
实例二:
每隔一分钟将 日期和 日历 都追加到 /home/mycal 中。
第一步:设计执行俩条命的脚本 my.sh
vim my.sh
输入以下内容:
cal >> /home/mycal date >> /home/mycal
第二步:为所有者增加 x 权限,不然是无法执行脚本的
第三步:设置定时任务 crontab -e 里面增加:*/1 * * * * /home/my.sh
实例三:
每天凌晨 2:00 将 mysql 数据库 test ,备份到文件中
crontab -e
增加:0 2 * * * mysqldump -u root -proot test > /home/mysql.bak
2、at 定时任务
1、at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。
2、默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
3、at 命令试一次性定时计划任务,执行完一个任务后不再执行此任务了。
4、在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看。
使用 ps -ef | grep atd
基本语法:
at [选项] [时间]
输入完按:俩次 Ctrl + D
常用选项:
atq:查看当前没有执行的任务
指定时间的方法:
1、接受当天的 hh:mm (小时,分钟) 的时间指定,假如改时间已过去,那么就会 放在第二天执行。例如:4:12 会在凌晨 4点12 执行
2、采用 midnight(深夜),noon(中午),teatime(饮茶时间),等比较模糊的词语来指定时间。
3、采用12小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午,例如:12PM
4、指定命令执行的具体日期,指定格式为 month day(月 日) 或 mm/dd/yy 或 dd.mm.yy (日.月.年) , 指定的日期必须跟在指定时间的后面。例如:4:00 2021-03-01
5、直接使用 today(今天)、tomorrow(明天)来指定完成指令的时间
6、使用相对计时法,指定格式为:now + count time-units ,now 就是当前时间,time-units 是时间单位,这里能够是 minutes,hours,days,weeks。count是时间的数量,几天,几小时。例如:now + 5 minutes ,现在开始 5 分钟后
实例一:
2天后的下午 5 点执行 : /bin/ls /home === ls /home
明天 17:00 ,输出时间到指定文件内: /home/date.txt
实例三:
俩分钟后,输入时间到:/home/date.txt 中
按住:Ctrl +删除键,可删除内容。
十一、硬盘
1、硬盘分区机制
-
Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独 立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。
-
Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目 录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一 录下获得。
-
通过 mount 挂载,来指明 硬盘 与 目录之间的关系,进入到该目录时就相当于访问了该分区。
2、硬盘说明
-
Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘
-
对于IDE硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指 IDE硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属 盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就 是逻辑分区。例,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为 第二个IDE硬盘上的第二个主分区或扩展分区。
-
对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其余 则和IDE硬盘的表示方法一样。
lsblk -f 或者 lsblk 查看硬盘分区情况
3、挂载硬盘实例
第一步:增加硬盘
虚拟机右键 --》 设置 --》 增加 --》 硬盘 --》 SCSI(S) --》下一步 --》分配硬盘大小 --》 下一步 --》完成 --》 重启虚拟机
第二步:硬盘分区
(1)fdisk /dev/sdb
进行分区
(2)n 键: 创建分区 – 》 p : 创建主分区 – 》 设置分区号 --》回车 --》设置分区大小 --》回车 --》w 保存退出
• m 显示命令列表
• p 显示磁盘分区 同 fdisk –l
• n 新增分区
• d 删除分区
• w 写入并退出
第三步:格式化分区
虽然我们增加了硬盘,但是并没有分配 UUID ,也就是说该硬盘并没法用,需要进行格式化
格式化: mkfs -t ext4 /dev/sdb1
第四步:挂载 到目录
(1)创建挂载的目录 mkdir newDisk
(2)挂载 mount /dev/sdb1 /home/newDisk/
这时候在 newDisk 创建的文件就会保存在 sdb1 分区里边了。
卸载挂载点:
umount 目录名/分区名
注意:
使用命令行的挂载方式,重启之后挂载会失效的。
第五步:实现永久挂载
修改 /etc/fstab 配置文件实现挂载
可以增加 UUID,也可以直接增加 分区名字
添加完成后,执行 mount -a 即可生效。
如果移除硬盘后, /etc/fstab 中的配置没有删除该硬盘的内容,是会报错的。
4、查看硬盘分区情况
查看系统整体磁盘使用情况:
df -h
查看指定目录的磁盘占用情况:
du -h 目录名
查询指定目录的磁盘占用情况,默认为当前目录
- -s 指定目录占用大小汇总
- -h 带计量单位
- -a 含文件
- –max-depth=1 子目录深度
- -c 列出明细的同时,增加汇总值
关于磁盘实用的命令:
**实例一:**统计 /opt 目录下文件的个数
ls -l /opt | grep "^-" | wc -l
**实例二:**统计 /opt 目录下 目录的个数
ls -l /opt | grep "^d" | wc -l
实例三:统计 /opt 目录下的文件数,包括子文件
ls -lR /opt | grep "^-" | wc -l
实例四:树状显示目录结构:
tree 目录
默认是没有安装这个命令的使用 yum install tree
安装指令。
十二、 网络配置
NAT 网络配置原理图:
VMnet8 : 这是Host 用于与NAT 虚拟网络进行通信的虚拟网卡。
1、查看网络IP网络和网关
编辑 --》虚拟网络编辑器
Windows 中查看 VMnet8 的指令:ipconfig
Linux 中查看 IP 的地址:ifconfig
2、Linux 网络配置
- 第一种方式:自动获取IP
- ip 地址不会冲突,但是每次重启都可能生成一个不同的 ip 地址
- 🔺 第二种方式:手动设置 IP
设备名称:
第一步:
修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33
,ens33 为虚拟机的网卡,每块网卡都不一样,使用 ifconfig 查看
修改以下内容:
BOOTPROTO=static
#IP地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNS1=192.168.200.2
第二步:
重启网络服务或者重启服务器生效
service network restart
、reboot
修改的IP 已经生效了:
3、设置主机名 和 hosts 映射
🔴 修改主机名:
- 查看 主机名: hostname
- 设置主机名:
- 修改 /etc/hostname
- 重启
🔴 设置 hosts 映射关系:
如果实现 ping 主机名 就能够ping通
💛 windows:
修改 :C:\Windows\System32\drivers\etc\hosts
文件 ,增加 Linux IP 与主机映射关系
192.168.200.130 yangzhaoguang
这时候 从 cmd 命令行 通过主机名:yangzhaogunag
就能ping 通 Linux 了。
💛Linux :
通过 电脑–》右键属性查看计算机的 主机名
修改:vim /etc/hosts
文件,增加:192.168.200.1 yangzhaoguang-PC
ping 之前需要关闭 windows 防火墙。
🔴 主机名解析过程分析(DNS,Hosts)
- Hosts 是什么?
- 一个文本文件,用来记录 IP 和 Hostname(主机名)的映射关系
- DNS 是什么?
- 域名系统,是互联网上作为域名和 IP 地址 相互映射的一个分布式数据库。
假设在地址栏上输入:www.baidu.com 他的流程如下:
十三、进程
1、进程基本介绍
(1)在 Linux 中,每个执行的**程序(代码)**都称为一个进程。每一个进程都分配一 个ID号(pid,进程号)。
(2)每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目 前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法 看到的进程,通常使用后台方式执行。
(3) 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到 关机才才结束。
2、ps 指令
(1)ps -aux
ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。 可以不加任何参数.
可以组合使用 ps -aux
• USER:用户名称
• PID:进程号
• %CPU:进程占用CPU的百分比
• %MEM:进程占用物理内存的百分比
• VSZ:进程占用的虚拟内存大小(单位:KB)
• RSS:进程占用的物理内存大小(单位:KB)
• TT:终端名称,缩写
• STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通 优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
• STARTED:进程的启动时间
• TIME:CPU时间,即进程使用CPU的总时间
• COMMAND:启动进程所用的命令和参数**,如果过长会被截断显示**
(2)ps -ef
-e 显示所有进程。-f 全格式。
实例一: 要求以全格式显示进程当前所有进程,并显示进程的父进程
- UID:用户ID
- PID:进程ID
- PPID:父进程ID
- C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,
- 执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
- STIME:进程启动的时间
- TTY:完整的终端名称
- TIME:CPU时间
- CMD:启动进程所用的命令和参数
他们之间的关系
3、终止进程 kill 和 killall
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该 进程。使用kill命令来完成此项任务。
kill [选项] 进程号
通过进程号杀死进程
killall 进程名称
通过进程名称杀死进程,也会杀死所有子进程。支持通配符
常用选项:
-9 : 表示强制终止这个进程杀死
对于正在工作的进程,需要加上 -9 强制杀死。
4、pstree 指令
pstree [选项]
可以更加直观的来看进程信息
-p :显示进程的PID
-u :显示进程的所属用户
十四、 service 管理
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程 序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程
原理图:
1、service 管理命令
service 服务名 [start | stop | restart | reload | status]
比如: service network restart
在CentOS7.0后 不再使用service ,而是 systemctl , 现在还使用 service 命令管理的服务:
2、查看服务名
-
第一种方式:
setup
命令查看所有服务- .
- 使用 空格 来开启/关闭 自动启动服务
-
第二种方式:
- 使用
ls -l /etc/init.d/
查看 支持 service 的服务
- 使用
3、服务的运行级别
Linux系统有7种运行级别(runlevel):常用的是级别 3和5
• ❌ 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
• 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
• 运行级别2:多用户状态(没有NFS),不支持网络
• 🔴 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
• 运行级别4:系统未使用,保留
• 🔴 运行级别5:X11控制台,登陆后进入图形GUI模式
• ❌ 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
CentOS 7 以后对运行级别进行了简化:
# inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To view current default target, run: # systemctl get-default # # To set a default target, run: # systemctl set-default TARGET.target
4、chkconfig 指令
通过 chkconfig 命令可以给每个服务的各个运行级别设置自启动/关闭
查看运行级别的设置情况:
chkconfig --list
查看所有服务在各个运行级别的启动情况
chkconfig --list | grep network
chkconfig network --list
以上俩个都是 查看 network 服务的启动情况
设置 运行级别的设置情况:
chkconfig --level 5 服务名 on/off
设置好后,需要重启后才会生效。
🔴 5、 systemctl 指令
systemctl [start | stop | restart | reload | status] 服务名
[开启 | 关闭 | 重启 | 重载 | 状态]
systemctl 指令管理的服务在 /usr/lib/systemd/system
查看
systemctl = service + chkconfig
**实例一:**查看防火墙服务启动状态
systemctl list-unit-files | grep fire
enable : 开启自启动 disable: 关闭自启动
**实例二:**关闭开机自启动防火墙服务
systemctl disable firewalld
**实例三:**开启开机自启动防火墙服务
systemctl enable firewalld
实例四: 查询防火墙的自启动状态
systemctl is-enabled firewalld
防火墙:
用于开启端口的访问,保护系统。如果关闭防火墙,任意客户端都能访问所有的端口。
6、firewall 指令
在真正的生产环境下,往往需要防火墙打开,但是问题来了,把防火墙打开,那么外部请求数据包就不能和服务监听端口通讯,这时就需要打开某个端口。
开启端口:firewall-cmd --permanent --add-port=端口号/协议
关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
重新载入:firewall-cmd --reload
开启/关闭 后必须重新载入才会生效。
查询端口是否开放:firewall-cmd --permanent --query-port=111/tcp
查询所有已开放的端口 :firewall-cmd --zone=public --list-ports
十五、动态监控进程
1、 top 指令
top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处,在于top 在执行一段时间可以更新正在运行的的进程。
top [选项]
- 14:06:27 系统当前时间
- user : 目前用户数量
- load average : 负载均衡,如果三个的平均值 大于 0.7 说明该提升性能了
- Tasks : 任务数量
- 1 running : 一个正在运行
- 212 sleeping : 212 个正在睡眠
- 1 stopped : 1 一个停止了
- zombie: 僵死进程,表示进程已经结束了,但是内存还没有释放掉。
- us : 用户占用的 CPU
- sy : 系统占用的 CPU
- id : 空闲的 CPU
- KiB Mem : 内存占用情况
- KiB Swap : 交换分区
交互操作:
**实例一:**监控指定的用户进程
top 中 ,输入 u ,输入用户名即可
**实例二:**终止指定的进程
输入 top 查看所有进程,输入 k ,输入终止进程的 pid ,回车,出现以下提示,是否给一个信号
输入数字 9 回车强制终止 即可。
2、监控网络状态
netstat [选项]
常用选项:
-an 按一定顺序排列输出
-p 显示哪个进程在调用
- Proto : 协议
- LocalADdress : 本地地址。也就是 Linux 中的地址。
- ForeignAddress :外部地址
- state : 状态。 LISTEN : 监听,ESTABLISHED : 连接
**实例一:**检查sshd 服务的状态信息:
netstat -anp | grep shhd
十六、RPM 和 YUM
1、 rpm 包的管理
一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成 具有.RPM
扩展名的文件。RPM是 RedHat Package Manager
(RedHat软件包管理工 具)的缩写,类似 Windows 的setup.exe,这一文件格式名称虽然打上了RedHat的 标志,但理念是通用的。
rpm 包的简单查询指令:
rpm -qa
查询Firefox 安装包:rpm -qa | grep firefox
firefox-60.2.2-1.el7.centos.x86_64
-
名称firefox
-
版本号:60.2.2-1
-
使用操作系统:el7.centos.x86_64
- 表示 CentOS 7 .X 的64 位系统。
- 如果是 i 686,i386 表示 32位系统,noarch : 表示通用。
-
查询软件包是否安装:
rpm -q 软件包名
-
查询软件包信息:
rpm -qi 软件包名
-
查询软件包的文件:
rpm -ql 软件包名
-
查询某个文件归属于哪一个软件包:
rpm -qf 软件包名
-
安装 rpm 包
rpm -ivh RPM包全路径名称
- i = install 安装 v=verbose 提示 h=hash 进度条
查询 RPM 包的全路径:
- 卸载 rpm 包
rpm -e 包名
- 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
如: rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
表示我们要删除的软件包被某个包锁依赖。
- 如果我们就是要删除 foo这个rpm 包,可以增加参数 --nodeps ,就可以强制删除,但是一 般不推荐这样做,因为依赖于该软件包的程序可能无法运行
如:rpm -e --nodeps foo
2、 yum
Yum 是一个Shell前端软件包管理器。基于RPM包管理,能够从指定 的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并 且一次安装所有依赖的软件包。
yum 基本命令:
- 查询 yum 服务器是否有需要安装的软件
yum -list | grep xx软件名
- 下载安装
yum install xxx
十七、配置 javaEE 环境
1、安装 JDK
第一步:
先到Oracle 官网下载 Linux 需要的Jdk 压缩包: Java Downloads | Oracle
下载需要注册账号~~~
第二步:
在 /usr/local/ 目录下创建 java 目录,用于存放 jdk
mkdir /user/local/java
第三步:
使用 xftp 工具,将下载好的压缩包传到 /usr/local/java 目录下,并解压缩
tar -xzvf jdk-8u321-linux-x64.tar.gz
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A7s2Ojr-1661223286618)(https://images-1313160403.cos.ap-beijing.myqcloud.com/MarkDown/202208231052647.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCUeSfu1-1661223286619)(https://images-1313160403.cos.ap-beijing.myqcloud.com/MarkDown/202208231052648.png)]
第四步:配置环境变量,打开 /etc/profile 文件,在文件的末尾配置环境变量:
export JAVA_HOME=/usr/local/java/jdk1.8.0_321
export PATH=$JAVA_HOME/bin:$PATH
第五步:让 刚才配置的 /etc/profile 文件生效 source /etc/profile
第六步:测试,编写一个 hello,world 是否安装成功。
vim Hello.java
--> javac Hello.java
--> java Hello
echo $PATH 展示 Linux系统中的环境变量
/usr/local 目录相当于 Windows 中的 C:\Program Files 默认存放软件的地方。
/opt 目录相当于 D:/ 盘
2、安装 Tomcat
第一步:
官方下载 Tomcat 压缩包:
第二步:
使用 xftp 将 tomcat 压缩包 传输到 /opt/tomcat 目录下
第三步:
解压,并启动tomcat
解压: tar -xzvf apache-tomcat-8.5.78.tar.gz
执行 tomcat/bin/目录下的 startup.sh 脚本 。
第四步:
由于开启了防火墙,所以不需手动开启 8080 端口
开启8080端口:firewall-cmd --permanent --add-port=8080/tcp
重新加载: firewall-cmd --reload
开启/关闭后必须重新加载,不然不会生效。
只需要将 html 放在
/opt/tomcat/apache-tomcat-8.5.78/webapps/ROOT
目录下即可访问页面。
3、安装 MySQL
Windows 安装
详情查看文档。
C:\05_Linux\资料
1、安装在/usr/local/mysql 目录下
# 在线安装 8.0 版本
2. wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
3. rpm -ivh mysql80-community-release-el7-5.noarch.rpm
4、yum -y install mysql-community-server
==============================此时就已经安装完 mysql了
10、systemctl start mysqld.service
#查询数据库的初始密码
11、grep "password" /var/log/mysqld.log
#A temporary password is generated for root@localhost: 后面的就是初始密码
12、mysql -u root -p # 登录mysql
==================================================
13、# 如果此时输入密码正确,但是报错 28000
#Access denied for user 'root'@'localhost' (using password: YES)
# 在这个配置文件中加入 skip-grant-tables
14、vim /etc/my.cnf
# 不用输入密码,直接回车即可
15、mysql -u root -p
登录之后设置密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
但是会报错:
密码过于简单,不符合规则,那么好,咱就修改一下密码规则:
# 版本5.7 之前
set global validate_password_policy=0;
set global validate_password_length=1;
# 8.0 之后
set global validate_password.policy=0; # 密码安全级别
set global validate_password.length=6; # 密码长度
又报错了:
意思是:只有重置完密码之后才能进行别的操作。
因此只能将密码先设置成复杂的,然后再设置密码规则:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ucih-jjkx0aG';
设置密码规则:
set global validate_password.policy=0;
set global validate_password.length=6;
设置密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
十八、Shell 编程
Shell是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的 界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
简单来说我们在Linux终端敲的命令,并不会直接被Linux 内核执行,而是通过 Shell 命令解析器 将我们敲的命令转化成 Linux 内核 能够执行的 命令。
这有点类似有我们学的高级语言,最终都会通过编译器编译成 机器语言。
1、Shell 脚本的执行方式
脚本格式要求
-
脚本以
#!/bin/bash
开头 -
脚本需要有可执行权限 。
实例一:输出一个 hello , world
#!/bin/bash 指明脚本类型
echo "hello,world" 输出 hello world
脚本的执行方式:
- 创建的 脚本默认是没有 x 权限,想要执行需要赋给 x 权限。
chmod u+x 文件名
- ./hello.sh ---- 相对路径
- /root/shcode/hello.sh ----绝对路径
- 使用
sh 文件名
的方式
2、Shell 中的变量
引用任何变量都需要使用: $变量名
的格式
(1)系统变量
1)Linux Shell中的变量分为,系统变量和用户自定义变量。
2)系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等等
比如: echo $HOME 等等…
3)显示当前shell中所有变量:set
(2)自定义变量
1)定义变量:变量名=值
2)撤销变量:unset 变量
- 声明静态变量:
readonly 变量
,注意:不能unset
案例1:定义变量A
案例2:撤销变量A
案例3:声明静态的变量B=2,不能unset
#!/bin/bash
#案例一:定义变量A
A=1000
#输出变量需要加上$
echo A=$A
#也可以通过这种方式进行输出变量
echo "A=$A"
#案例二:撤销变量A
unset A
echo A=$A
#案例三:声明静态变量B=2,,不能unset
readonly B=2
#静态变量不能 unset
unset B
echo B=$B
定义变量的规则
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
-
等号两侧不能有空格
-
变量名称一般习惯为大写 (规范)
将命令的返回值赋给变量
1)
A=`date` 反引号,运行里面的命令,并把结果返回给变量A
2)A=$(date) 等价于反引号
#将命令执行的结果赋值给变量
C=`date`
D=$(date)
echo C=$C
echo D=$D
#运行结果:
C=2022年 04月 08日 星期五 14:32:22 CST
D=2022年 04月 08日 星期五 14:32:22 CST
(3)设置环境变量
export 变量名=变量值
(功能描述:将shell变量输出为环境变量/全局变量)- 比如说:如果多个 shell 文件都会用到一个 变量那么就可以将该变量设置为 环境变量
source 配置文件
(功能描述:让修改后的配置信息立即生效)- 设置为环境变量后,必须 source 以下,使配置的环境变量生效
echo $变量名
(功能描述:查询环境变量的值)
**实例一:**在/etc/profile
文件中定义TOMCAT_HOME环境变量
#/etc/profile中增加:
export TOMCAT_HOME=/opt/tomcat
#保存退出
#终端输入,务必 source 以下 :
source /etc/profile
**实例二:**查看环境变量TOMCAT_HOME的值
echo $TOMCAT_HOME
实例三: 在另外一个shell程序中使用 TOMCAT_HOME
#使用TOMCAT_HOME 环境变量
echo TOMCAT_HOME=$TOMCAT_HOME
shell 中的 多行注释:
:<<!
多行注释
!
(4)位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如 : ./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息
$n: (功能描述:n为数字,$0代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参 数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10})
$ ∗ :(功能描述:这个变量代表命令行中所有的参数, * :(功能描述:这个变量代表命令行中所有的参数, ∗:(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
$ @ : (功能描述:这个变量也代表命令行中所有的参数,不过 @:(功能描述:这个变量也代表命令行中所有的参数,不过 @:(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
$#:(功能描述:这个变量代表命令行中所有参数的个数)
在 for 循环中 会体验出 $@ $* 的不同
(5)预定义变量
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正 确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正 确了。)
3、运算符
-
$((运算式))
或$[运算式 ]
-
expr m + n
注意expr运算符间要有空格 ,如果希望将运算结果作为返回值需要使用 ``
-
expr m - n
-
expr *, /, % 乘,除,取余 注意 乘法 前面有一个 \
案例1:计算(2+3)✖️ 4的值
案例2:请求出命令行的两个参数[整数]的和
#!/bin/bash
#案例1:计算(2+3)* 4的值
#第一种方式
res1=$(((2+3)*4))
echo res1=$res1
#第二种方式,推荐使用
res2=$[(2+3)*4]
echo res1=$res2
#第三种方式
res3=`expr 2 + 3 `
res4=`expr $res3 \* 4`
echo res3=$res4
#案例2:请求出命令行的两个参数[整数]的和
SUM=$[$1+$2]
echo SUM=$SUM
4、if 条件判断
[ condition ]
(注意condition前后要有空格, 后面所有的条件判断均有空格)
[ atguigu ]
返回 true
[]
返回 false
[ condition ] && echo OK || echo notok
条件满足,执行 && 后面的语句,条件不满足执行 || 后面的语句非空返回true,可使用$?验证(0为true,>1为false)
if [ 条件判断式 ]
then 条件为真执行下面的程序
程序
fi . 代表结束
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
常用判断条件
1)俩个字符串比较使用 =
1) 两个整数的比较
-lt 小于 less than
-le 小于等于 less equal
-eq 等于 eq
-gt 大于
-ge 大于等于
-ne 不等于
2) 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
3) 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
应用实例
案例1:“ok"是否等于"ok” 使用 = 判断
案例2:23是否大于等于22 使用 -ge
案例3:/root/shcode/aaa.txt 目录中的文件是否存在 ,使用 -f
#!/bin/bash
#案例1:"ok"是否等于"ok" 使用 = 判断
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例2:23是否大于等于22 使用 -ge
if [ 23 -ge 22 ]
then
echo "大于等于"
fi
#案例3:/root/shell/aaa.txt 目录中的文件是否存在 ,使用 -f
if [ -f /root/shcode/aaa.txt ]
then
echo "文件存在"
fi
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出 “及格了”,如果小于
60,则输出 “不及格”
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "成绩及格"
elif [ $1 -le 60 ]
then
echo "成绩不合格"
fi
5、case 语句
基本语法:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
**案例1 :**当命令行参数是 1 时,输出 “周一”, 是2 时,就输出"周二", 其它情况输出 “other”
#!/bin/bas
#当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other"h
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "Other"
;;
esac
6、for 循环
基本语法一:
for 变量 in 值1 值2 值3…
do
程序
done
**案例1 :*打印命令行输入的参数 [分析 $ 和 $@ 的不同]
#!/bin/bash
#案例1 :打印命令行输入的参数 分析 $* $@ 的区别
for i in "$*"
do
echo i=$i
done
echo "==================="
for i in "$@"
do
echo i=$i
done
输出结果:
$* : 所有的参数都会获取到,但是会拼接成一个整体
$@ : 所有的参数都会获取到,不会拼接成一个整体,每一个参数都会分隔开
基本语法二:
for (( 初始值;循环控制条件;变量变化 )) # 注意 初始值 和 变量变化 与括号之前是由空格的
do
程序
done
案例1 :从1加到100的值输出显示
案例2 :获取位置参数,并进行循环加和
#!/bin/bash
#案例1 :从1加到100的值输出显示
SUM=0
for (( i=1; i<=100; i++ )) # 注意 里面括号内 俩边有空格。
do
# 这里进行求和
SUM=$[ $SUM+$i ]
done
echo "总和 SUM=$SUM"
#案例2 :获取位置参数,并进行循环加和
echo "============================"
SUM2=0
for (( i=1; i<=$1; i++ ))
do
# 这里进行求和
SUM2=$[ $SUM2+$i ]
done
echo "总和 SUM2=$SUM2"
7、while 循环
基本语法:
while [ 条件判断式 ] # 注意空格!注意空格!注意空格!
do
程序
done
**案例1 :**从命令行输入一个数n,统计从 1+…+ n 的值是多少?
#!/bin/bash
#案例1 :从命令行输入一个数n,统计从 1+..+ n 的值是多少?
i=0
SUM=0
while [ $i -le $1 ]
do
SUM=$[ $SUM+$i ]
# 变量 i+1, 不支持 i++
i=$[ $i+1 ]
done
echo "1~$1 的加和=$SUM"
8、read 控制台输入
read 选项 参数
选项:
-p: 指定读取值时的提示符;
-t: 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
参数
变量:指定读取值的变量名
**案例1:**读取控制台输入一个num值
**案例2:**读取控制台输入一个num值,在10秒内输入。
#!/bin/bash
#案例1:读取控制台输入一个num值
read -p "请输入一个数" NUM1
echo "NUM1=$NUM1"
#案例2:读取控制台输入一个num值,在10秒内输入。
read -p "请输入一个数" -t 10 NUM2
echo "NUM2=$NUM2
9、函数
(1)系统函数
shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中, 我们这里就介绍两个。
第一个系统函数: basename
**功能:**返回完整路径最后 / 的部分,常用于获取文件名
基本语法: basename [pathname] [suffix]
pathname : 为文件路径。如果不指定 suffix 会将最后一个 / 后边的内容获取到。比如:
basename /home/aaa/a.text ---> 结果为: a.txt
suffix : 指定截取的后缀
basename /home/aaa/a.text .text ---> 结果为: a
第二个系统函数: dirname
**功能:**与 basename 正好相反 ,会获取到 最后一个 / 前面的路径,常用于获取文件路径
基本语法: dirname 文件绝对路径
dirname /home/aaa/a.text .text ---> 结果为: /home/aaa
(2)自定义函数
基本语法:
function funname(){
方法体
[return int;]
}
调用直接写函数名:funname 值
**实例一:**计算输入两个参数的和【要求动态的获取俩个参数】, getSum
#!/bin/bash
#3、编写方法
function getSum(){
SUM=$[ $n1+$n2 ]
echo "和是$SUM"
}
#1、动态获取 n1 和 n2 的值
read -p "请输入n1=" n1
read -p "请输入n2=" n2
#2、调用方法
getSum $n1 $n2
10、Shell 变成综合案例—备份数据库
-
每天凌晨 2:10 备份 数据库 test 到 /data/backup/db/
-
备份开始和备份结束能够给出相应的提示信息
-
备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:
2018-03-12_230201.tar.gz
- 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
cround -e --》 设置 任务调度 ---》执行 shell 脚本
shell脚本里完成 备份,提示信息,打包,删除操作
目录关系: /data/backup/db/2018-03-12_230201/2018-03-12_230201.sql.gz
应该是将 2018-03-12_230201 以及目录下的 2018-03-12_230201.sql.gz 文件打包成:2018-03-12_230201.tar.gz
第一步:
在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本。
之所以是在 /usr/sbin 目录下创建脚本,是因为在该目录下的文件是 root 管理才能执行的 。
#!/bin/bash
#备份目录的位置
BACKUP=/data/backup/db
#获取当前时间 2018-03-12_230201.tar.gz
DATETIME=$(date +%Y-%m-%d_%H%M%S)
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=yangzhaoguang
#备份数的据库名
DATABASE=test
#创建备份目录,如果不存在就创建,存在就不创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#打包成 tar.gz
cd ${BACKUP}
tar -zcvf ${DATETIME}.tar.gz ${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的 *.tar.gz
find ${BACKUP} -atime +10 -name "*.tar.gz" | rm -rf
#提示信息
echo "备份数据库${DATABASE}信息成功"
第二步:
设置定时任务 crontab -e
30 2 * * * /usr/sbin/mysql_db_backup.sh # 这里注意一个问题,编写完命令,将光标回退一格。再按ESC保存退出。
十九、安装 CenTOS8.1
在生产环境下可直接选择最小安装
其余步骤和CentOS 7 安装步骤一模一样。
二十、日志文件
1、日志介绍
- 日志文件是重要的系统信息文件,其中记录了许多重要的系统时间,包括用户的登录信息,系统的启动信息,系统的安全信息,邮件的相关信息,各种服务相关信息。
- 日志对于安全来说也很重要,他记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者收到攻击时攻击者留下的痕迹
- 日志是用来记录重大事件的。
所有的日志文件都在:/var/log
目录下
日志名字 | 作用 |
---|---|
/var/log/boot.log | 记录系统在引导过程中发生的事件,即linux系统开机自检过程显示的信息 |
var/log/cron | 记录与系统定时任务相关的日志 |
var/log/cups | 记录打印信息的日志 |
var/log/dmesg | 记录了系统在开机时内核自检的信总,也可以使用 dmesg 命令直接查看内核信息 |
/var/log/btmp | 记录linux登陆失败的用户,时间和远程IP,二进制文件,需要使用 lastb 命令查看 |
/var/log/lastlog | 记录最后一次用户成功登陆的时间,IP等信息,使用命令 lastlog 查看 |
/var/log/mailog | 记录邮件信息的日志 |
/var/log/messages | 包括整体系统普通信息,其中也包含系统启动期间的日志。此外,还包括mail,cron,daemon,kern,auth等内容. |
/var/log/secure | linux系统安全日志,记录用户和工作组变坏情况,用户登陆认证情况 |
/var/log/wtmp | 此日志文件永久记录每个用户登录,注销及系统的启动,停机的事件,用last查看 |
/var/log/utmp | 记录有关当前登录的每个用户的信息。使用 who,w,users,finger 访问此文件 |
2、日志管理服务
CentOS7 .6 的日志服务是 rsyslogd ,CentOS 6 的日志服务是 syslogd ,rsyslogd 的日志服务功能更强大。
rsyslogd 和 rsyslogd 是兼容的。
通过 rsyslog 的服务对 所有配置文件进行管理 。
实例一: 查看 Linux 的中rsyslogd 服务是否启动
systemctl status rsyslog.service
**实例二:**查看 rsyslog 服务的自启动状态
systemctl is-enabled rsyslog.service
🔴 3、日志配置文件
/etc/rsyslog.conf:配置文件路径
该配置文件指明了 什么级别的日志信息保存到 哪个日志当中。
文件的格式: *.* 存放日志文件
其中第一个 * 代表日志类型,第二个 * 代表日志级别
日志类型分为:
服务名称 | 服务说明 |
---|---|
auth(LOG_AUTH) | 安全和认证相关消息(不推荐使用 authpriv 替代) |
authpriv(LOG_AUTHPRIV) | ssh、ftp安全和认证相关消息(私有的) |
cron(LOG_CRON) | 系统定时任务 cront 和 at 产生的日志 |
kern(LOG_KERN) | 内核产生的日志(不是用户进程产生的) |
lpr(LOG_LPR) | 打印产生的日志 |
mail(LOG_MAIL) | 邮件收发信息 |
news(LOG_NEWS) | 与新闻服务器相关的日志 |
user(LOG_USER) | 用户等级类别的日志信息 |
uucp(LOG_UUCP) | uucp 子系统的日志信息,uucp 是早期 linux 系统进行数 据传递的协议,后来也常用在新闻组服务中。 |
local0-local7(LOG_LOCAL0-7) | 为本地使用预留的服务 |
syslog(LOG_SYSLOG) | 有 syslogd 服务产生的日志信息虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了 syslogd 的,这里 并没有修改服务名。 |
日志级别:
等级名称 | 等级说明 |
---|---|
debug(LOG_DEBUG) | 一般的调试信息说明 |
info(LOG_INFO) | 基本的通知信息 |
notice(LOG_NOTICE) | 普通信息,但是有一定的重要性 |
warning(LOG_WARNING) | 警告信息,但是还不回影响到服务或系统的运行 |
err(LOG_ERR) | 错误信息,一般达到 err 等级的信息以及可以影响到服务或系 统的运行了 |
crit(LOG_CRIT) | 临界状况信息,比 err 等级还要严重 |
alert(LOG_ALERT) | 警告状态信息,比 crit 还要严重。必须立即采取行动 |
emerg(LOG_EMERG) | 疼痛等级信息,系统已经无法使用了 |
none | 忽略这个日志服务,该服务的 所有日志都不再记录。 |
从上到下、级别从低到高,记录的信息越来越少 |
由日志服务 rsyslog 服务记录的信息一般由以下四部分组成:
- 事件产生的时间;
- 发生事件的服务器的主机名;
- 产生事件的服务名或程序名;
- 事件的具体信息。
实例:自定义日志功能, 将 登录,重启 等信息保存到自定义的日志中。
在 /etc/rsyslog.conf 配置文件中增加规则:*.* /var/log/customer.log
将所有级别的信息都保存在 customer.log 这个日志当中。
4、日志轮替
日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名
之后,如何命名呢?主要依靠 /etc/logrotate.conf
配置文件中“dateext”参数:
-
如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure–20180605”。这样的话日志文件名不会重叠,所以也就不需要日志文件的改名, 只需要保存指定的日志个数,删除多余的日志文件即可。
-
如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。**当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,**用来保存新的日志,以此类推。
在 /etc/logrotate.conf 中可以配置 全局日志轮替规则:
# see "man logrotate" for details
# rotate log files weekly -- 每周对日志文件进行一次轮替
weekly
# keep 4 weeks worth of backlogs -- 共保存 4 份日志文件
rotate 4
# create new (empty) log files after rotating old ones -- 创建新的空的日志文件,在日志轮替之后
create
# use date as a suffix of the rotated file -- 使用日期作为日志轮替文件的后缀
dateext
# uncomment this if you want your log files compressed -- 日志文件是否压缩
#compress
# RPM packages drop log rotation information into this directory
# 会将 /etc/logrotate.d 这个目录下的文件读取进来。
include /etc/logrotate.d
# system-specific logs may be also be configured here.
#下面是单独设置某个日志文件轮替规则,优先级更高
也可以把某个日志轮替规则文件写到 /etc/logrotate.d 目录下 :
# 为 /var/log/boot.log 日志 设置轮替规则
/var/log/boot.log
{
missingok # 如果日志不存在,忽略该日志的警告信息
daily # 每日对文件进行一次轮替
copytruncate #
rotate 7 # 共备份 7 次
notifempty #如果日志为空,则不进行轮替
}
轮替命令 | 作用 |
---|---|
daily | 日志的轮替周期是每天 |
weekly | 日志的轮替周期是每周 |
monthly | 日志的轮替周期是每月 |
rotate 数字 | 保留的日志文件的个数;0 表示没有备份 |
compress | 日志轮替时,旧的日志进行压缩 |
create mode owner group | 建立新日志,同时指定新日志的权限与所有者和所属组 |
mail address | 当日志轮替时,输出内容通过邮件发送到指定的邮件地址 |
missingok | 如果日志不存在,则忽略该日志的警告信息 |
notifempty | 如果日志为空文件,则不进行日志轮替 |
minsize 大小 | 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮 替,否则就算时间达到也不轮替 |
size 大小 | 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。 如 size 100k |
dateext | 使用日期作为日志轮替文件的后缀 |
sharedscripts | 在此关键字之后的脚本只执行一次 |
prerotate/endscript | 在日志轮替之前执行脚本命令。endscript 标示 prerotate 脚本结束 |
postrotate/endscript | 在日志轮替之后执行脚本命令。endscript 标示 postrotate 脚本结束 |
实例一:将刚刚创建的日志 /var/log/customer.log
设置轮替规则:
方法一: 直接在 /etc/logrotate.conf 文件中为日志设置轮替规则
方法二:在 /etc/logrotate.d / 目录下创建一个新的文件,为 日志设置轮替规则
建议使用方法二,如果都在 /etc/logrotate.conf 中设置,不利于维护。
/var/log/customer.log
{
missingok
daily
copytruncate
rotate 7
notifempty
}
5、logrotate 命令
我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务;/etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件,通过logrotate 这个文件依赖定时任务执行的
命令格式:logrotate [选项] 配置文件名
选项:
- -v: 显示日志轮替过程。加了-v 选项,会显示日志的轮替的过程
- -f: 强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有 的日志进行轮替
6、内存日志
journalctl 可以查看内存日志。
journalctl
查看全部
journalctl -n 3
查看最新的三条
journalctl --since 19:00 --until 19:10:10
查看起始时间到结束时间的日志,可以加日期
journalctl -p err
报错日志
journalctl -o verbose
日志详细内容
journalctl _PID=123 _COMM=sshd
查看包含这些参数的日志
或者 journalctl | grep sshd
内存日志 重启就会被清空
二十一、定制自己的 Linux
通过对Linux中一些用不到的功能进行裁剪,创建属于自己的 Linux 系统。
Linux 启动流程:
实现自定义 Linux 系统的步骤 :
第一步:
在原始 Linux 中创建 sdb 硬盘,大小 20G ,创建完重启虚拟机,并进行分区
在为新硬盘取名字时。要和其他硬盘区分开。方便后面容易找到
分区结果:
初始化分区:
mkfis -t ext4 /dev/sdb1
mkfis -t ext4 /dev/sdb2
**创建目录: **
mkdir -p /mnt/boot /mnt/sysroot
进行挂载:
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
使用 lsblk 命令检查一下:
第二步:
安装grub, 内核文件拷贝至目标磁盘
grub2-install --root-directory=/mnt /dev/sdb
检查是否安装:
hexdump -C -n 512 /dev/sdb
拷贝 /boot/ * 下的文件 到 新创建的目录: /mnt/boot/ 下
cp -rf /boot/* /mnt/boot/
第三步:
修改 /mnt/boot/grub2/ grub.cfg 文件
- 在 grub.cfg 描述了 boot 分区 和 / 分区对应的 UUID ,修改成 sdb 对应的 UUID 即可。
- /mnt/boot/grub2/ grub.cfg 文件,这个文件是我们刚从 sda1 分区上拷贝过来的,所以我们需要修改 该文件中对应的 UUID 号,改成 sdb 硬盘对应 UUID 。
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-27828a5d-7d2a-4474-a32f-a0cfb3bffc7f' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 979615d7-4331-4bc6-a279-f0392e235b57 # 这里是修改的,改成 sdb1的UUID
else
search --no-floppy --fs-uuid --set=root 979615d7-4331-4bc6-a279-f0392e235b57 # 这里是修改的,改成 sdb1的UUID
fi # 下面的 UUID 是修改的,改成 sdb2 的UUID
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=UUID=77635142-6f03-4792-ae64-bade574023b9 ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8selinux=0 init=/bin/bash # 在这里加上 init=/bin/bash
initrd16 /initramfs-3.10.0-957.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-f65638842c9840178fe3de73f92d7d11) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-f65638842c9840178fe3de73f92d7d11-advanced-27828a5d-7d2a-4474-a32f-a0cfb3bffc7f' {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 979615d7-4331-4bc6-a279-f0392e235b57 # 这里是修改的,改成 sdb1的UUID
else
search --no-floppy --fs-uuid --set=root 979615d7-4331-4bc6-a279-f0392e235b57 # 这里是修改的,改成 sdb1的UUID
fi # 下面的 UUID 是修改的,改成 sdb2 的UUID
linux16 /vmlinuz-0-rescue-f65638842c9840178fe3de73f92d7d11 root=UUID=77635142-6f03-4792-ae64-bade574023b9 ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet selinux=0 init=/bin/bash # 在这里加上 init=/bin/bash
initrd16 /initramfs-0-rescue-f65638842c9840178fe3de73f92d7d11.img
}
第四步:
创建目标主机根目录系统
mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
第五步:
拷贝 sda 中的 命令库 到 sdb 中
cp /lib64/*.* /mnt/sysroot/lib64/
cp /bin/bash /mnt/sysroot/bin/
第六步:
创建新的虚拟机,将原有硬盘移除掉,指向 sdb
这时候很多指令都无法使用,只需要从原来的 Linux 系统中拷贝到 sdb 硬盘上就行了
root@hspedu100 ~]# mount /dev/sdb2 /mnt/sysroot/
[root@hspedu100 ~]# cp /bin/ls /mnt/sysroot/bin/
[root@hspedu100 ~]# cp /bin/systemctl /mnt/sysroot/bin/
[root@hspedu100 ~]# cp /sbin/reboot /mnt/sysroot/sbin/
二十二、备份与恢复
实体机无法进行快照,如果系统出现异常或数据损坏,后果严重,要重做系统,还会造成数据丢失。所以可以使用备份和恢复技术
Linux 的备份和恢复有俩种方式:
1、把需要的文件(或者分区) 用 tar 打包就行,下次需要恢复时,在解压覆盖即可
2、使用 dump 和 restore 命令。
安装 dump 和 restore
yum -y install dump
yum -y install restore
1、dump
dump 命令使用“备份级别”来实现增量备份,它支持 0~9 共 10 个备份级别。其中,0 级别指的就是完全备份,1~9 级别都是增量备份级别。
举个列子,当我们备份一份数据时,第一次备份应该使用 0 级别,会把所有数据完全备份一次;
第二次备份就可以使用 1 级别了,它会和 0 级别进行比较,把 0 级别备份之后变化的数据进行备份;
第三次备份使用 2 级别,2 级别会和 1 级别进行比较,把 1 级别备份之后变化的数据进行备份,以此类推。
需要注意的是,只有在备份整个分区或整块硬盘时,才能支持 1~9 的增量备份级别;如果只是备份某个文件或不是分区的目录,则只能使用 0 级别进行完全备份
基本语法:
dump [选项] 备份之后的文件名 原文件或目录
常用的选项:
**-level:**level 就是我们说的 0~9 共 10 个备份级别;
-f 文件名:指定备份之后的文件名;
**-u:**备份成功之后,把备份时间、备份级别以及实施备份的文件系统等信息,都记录在 /etc/dumpdates 文件中;
-v:显示备份过程中更多的输出信息;
**-j:**调用 bzlib 库压缩备份文件,其实就是把备份文件压缩为 .bz2 格式,默认压缩等级是 2;
-W:显示允许被 dump 的分区的备份等级及备份时间;
查看备份时间文件:
cat /etc/dumpdates
**实例一:**将 /boot 分区 下的所有内容备份到 /opt/boo.bak0.bz2 文件中,备份层级为0
dump -0uj -f /opt/boo.bak0.bz2 /boot/
实例二: 在 /boot 目录下增加一个文件test.txt,随便写点内容,备份层级为1 , /opt/boo.bak1.bz2
dump -1uj -f /opt/boo.bak1.bz2 /boot/
查看俩次备份的文件有什么不同:
可以看到第一次与第二次备份的大小相差还是很大的,这是因为,第二次备份只会备份相对于第一次备份中多的内容,也就是 增量备份!
注意:
dump 命令也可以文件或目录,不过,只要不是备份分区,就只能使用 0 级别进行完全备份,而不再支持增量备份。同时,不能使用“-u”选项更新分区的备份时间,当然也不能使用“dump -W”命令查询到文件或目录的备份。
如果对文件或者目录使用其他级别的备份,就会报错:
#!/bin/bash
#设置备份的位置
BACKUP=/opt/dump
#设置备份的级别
LEVEL=0
#判断该目录是否存在,如果不存在就进行创建
[ ! -d "${BACKUP}"] && mkdir -p "${BACKUP}"
dump
2、restore
restore 命令是 dump 命令的配套命令,dump 命令是用来备份分区和数据的,而 restore 命令是用来恢复数据的。
基本语法:
restore [模式选项] [-f] 指定备份的文件名
此命令中,-f 选项用于指定备份文件的文件名;restore 命令常用的模式有以下 4 种,这 4 种模式不能混用:
- -C:比较备份数据和实际数据的变化。如果实际数据中的现有数据发生了变化,那么这个选项能够检测到这个变化。但是如果实际数据中新增了数据,那么这个选项是不能检测到变化的。举个例子:别人给我了 100 万元投资(实际数据),但是他有一个投资的账本(备份数据),他要时不时地比对账本和实际的 100 万元投资,如果 100 万元减少则马上就能发现改变;但是如果投资增加,则不会报警;
- -i:进入交互模式,手工选择需要恢复的文件;
- -t:查看模式,用于查看备份文件中拥有哪些数据;
- -r:还原模式,用于数据还原
**实例一:**删除 /boot/test.txt 文件,使用 比较模式,测试有什么提示
会出现一个比较错误,找不到 test.txt 文件
也就是说,如果与备份的内容不一样他会报错的,但是如果增加文件/目录 ,他是不报错的。
还原模式:
restore 命令的还原模式既可以用于还原整个分区,也可以用于还原文件或目录。命令格式是一样的,不过要注意,如果要还原增量备份的数据,则一定要先还原完全备份的数据 ,其次按顺序恢复所有增量备份
restore -r -f boo.bak0.bz2
restore -r -f boo.bak1.bz2
千万注意、顺序不能错~~~~!!!!!
二十三、WebMin 工具的使用
下载: Index of /download/yum (webmin.com)
什么是 webmin ? 官方是这样描述的:
Webmin是一个基于Web的Unix系统管理界面。使用任何现代Web浏览器,您可以设置用户帐户,Apache,DNS,文件共享等等。Webmin消除了手动编辑Unix配置文件(如/etc/passwd)的需要,并允许您从控制台或远程管理系统。
安装步骤:
第一步:
下载好后,使用 xftp 工具传输到 /opt/webmin 下
第二步:
使用 rpm -ivh webmin-1.990-1.noarch.rpm --force --nodeps
命令安装
第三步:
修改root用户的密码。该 root 用户不是 Linux 系统的 root 管理员,而是 属于 webmin 中的 root
/usr/libexec/webmin/changepass.pl /etc/webmin/ root root
第一个root是root 用户,第二个root 是用户密码 。修改 为 root 密码
第四步:
修改端口号。默认是 10000 。
vim /etc/webmin/miniserv.conf
第五步:
webmin 相关的命令:
- 启动:service webmin start
- 停止:service webmin stop
- 重启:service webmin restart
重启 webmin
第六步:
由于防火墙是开启的,所以需要开启我们配置好的端口号:8888
firewall-cmd --permanent --add-port=8888/tcp
打开 8888端口
firewall-cmd --reload
重载
firewall-cmd --zone=public --list-ports
查询所有已开放的端口
访问: 192.168.200.130:8888 【ip:端口号】
如果访问不成功,重启,重启不行换一个端口。
二十四、bt 宝塔
官网介绍“提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能。”还有他是免费的,收费功能针对技术支持等业务。所以直接用bt面板来建网站和管理网站了
安装步骤:
安装 wget 指令并且安装 bt :
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
&& 的作用就是 : 连接的俩条指令都会执行,类似于 |
安装成功后:
外网面板地址: http://123.182.163.244:8888/93313bbf
内网面板地址: http://192.168.200.130:8888/93313bbf
username: lzkj4fgy
password: e5de63d4
宝塔账号:
15511513972
Qq1209694409
输入 bt
可查看 bt 工具箱:
bt default
查看密码和用户名、网址
通过浏览器访问 提供的内网地址即可。~!
二十五、Linux 面试题
介绍常使用的指令:
1、cut 指令
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
基本语法:
cat [选项] [参数]
选项:
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -c :以字符为单位进行分割。
- -d :自定义分隔符,默认为制表符。
- -f :与-d一起使用,指定显示哪个区域。
- -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
2、sort 命令
对文件进行排序 ,并输出排序结果
基本语法:
sort [选项] 文件名
-r | 以相反的顺序来排序 |
---|---|
-n | 依照数值的大小排序 |
3、uniq 命令
uniq命令全称是“unique”,中文释义是“独特的,唯一的”。该命令的作用是用来去除文本文件中连续的重复行,中间不能夹杂其他文本行。去除了重复的,保留的都是唯一的,也就是独特的,唯一的了。
我们应当注意的是,它和sort的区别,sort只要有重复行,它就去除,而uniq重复行必须要连续,也可以用它忽略文件中的重复行
基本语法:
uniq [参数] [文件]
-c | 打印每行在文本中重复出现的次数 |
---|---|
-d | 只显示有重复的纪录,每个重复纪录只出现一次 |
-u | 只显示没有重复的纪录 |
4、awk 命令
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
他的作用有点类似 cut 但是他比 cut 命令更加强大,就是他支持 脚本命令
基本语法:
awk [选项] '脚本命令' 文件名
F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。 |
---|---|
awk 的强大之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执行命令,如下所示:
'匹配规则{执行命令}'
注意是单引号
awk 使用数据字段变量
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
- $0 代表整个文本行;
- $1 代表文本行中的第 1 个数据字段;
- $2 代表文本行中的第 2 个数据字段;
- $n 代表文本行中的第 n 个数据字段。
5、面试题1
获取中间的 ip 地址,并进行排序
思路: 使用 cut 命令 对 “/” 进行截取,指定显示 第三个 / 的区域,使用 sort 进行排序,最后使用 uniq 统计
cut -d "/" -f 3 1.txt | sort -r | uniq -c
6、面试题2
思路分析:
1、首先明白使用什么指令可以查看到图中的信息。没错就是 nestat --监控网络状态
2、明白在什么状态下表示 连接, 就是 ESTABLISHED 状态
3、Foreign Address 为远程连接的地址。也就是统计该列的 IP 地址
4、使用 awk 命令对数据字段进行分割。并使用 cut 命令 对 : 进行分割,获取前面的 id 地址。
5、sort排序,uniq统计
netstat -an | grep ESTABLISHED | awk '{print $5}'| cut -d ":" -f 1 |sort -r | uniq -c
7、面试题3
如果忘掉了 mysql 的密码。如何找回
第一步:
在 vim /etc/my.cnf
配置文件中增加 以下代码 :
表示 跳过权限检查,不用输入密码可直接进入 mysql。
修改完记得重启服务 : service mysqld restart
第二步:
登录到 mysql 后,有一个mysql数据库,里面有一张 user 表 。user 表中的 authentication_string 字段就是 mysql 的原生密码。只需要修改这个字段的密码即可。
use mysql ; #使用 mysql 数据库
desc user ; # user 表
update user set authentication_string=password("想要修改的密码") where user='root'; #重置密码
flush privileges; # 刷新
exit ;
修改完密码,将 /etc/my.cnf 中增加的那个代码注释掉。就 OK 了。
8、面试题4
192.168.13.20 aaa.html
192.168.13.20 aaa.html
192.168.13.20 aaa.html
192.168.13.10 aaa.html
192.168.13.50 aaa.html
192.168.13.40 aaa.html
192.168.13.30 aaa.html
192.168.13.30 aaa.html
192.168.13.20 aaa.html
192.168.13.10 aaa.html
思路:
1、使用 cut 或者 awk 进行分割,取到前面的 IP
2、使用 sort 进行排序
3、使用 uniq 统计每个IP 出现的次数
4、统计完,对次数进行排序,降序
5、head 输出前俩条
cut -d " " -f 1 2.txt | sort | uniq -c | sort -r | head -2
9、面试题5
如果你是系统管理员,在进行 Linux 系统权限划分时,应该考虑哪些因素?
1、首先阐述 Linux 权限的主要对象
10、面试题6
(1)yes、no、yes
文件只读,当然是不能修改。文件是否能删除,取决于它所属的目录是否有 w 权限
(2)no,no,no
cd 目录都进不去,更别说其他操作 了
(3)yes ,no,no
文件的修改取决于文件是否有 w 权限,文件的删除取决于 所属目录是否有 w 权限。
(4)yes,no,yes
11、面试题 7
列举 Linux 高级命令,至少 6 个
- nestat 网络状态监控
- top 系统运行状态监控
- lsblk 查看硬盘分区情况
- find
- ps -aux 查看系统运行进程
- chkconfig 查看服务启动状态
- systemctl 管理系统服务
- awk 文本编辑命令