1、每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,"etc-年-月-日-时-分.tar.gz"
测试脚本运行
[root@bogon ~]# bash -x file2.sh
++ date +%Y-%m-%d-%k
+ tar -JPcf /tmp/backups/2019-03-18-23.tar.gz /etc
#每天的12点和0点备份一次
[root@bogon ~]# crontab -l
0 */12 * * * /bin/bash /root/file2.sh
2、rpm包管理功能总结以及实例应用演示。
对于linux而言,安装程序不像windows一样双击即可安装。它分为源码包(需要自行编译安装) 和系统安装包(RPM包,系统默认包)。 以下说明:
源码包:
顾名思义由程序员直接写好的未经编译的程序代码。
优点:
1、足够开源,有能力的话你可以在源码上任意添加你的需求
2、由于未经编译,所以编译安装时会更贴近你的操作系统,更加稳定
3、可以自定义安装路径、以及需要安装的特性等等。
缺点:
1、安装麻烦,编译安装需要花费很多时间
2、配置环境如果有问题的话,也会出现安装错误
系统安装包:
由系统直接提供的已经编译好的二进制程序包。
优点:
1、由于是编译好的二进制文件,所以安装方便快捷。
2、通过rpm命令即可实现安装、升级、卸载
缺点:
1、各个包之间存在依赖性,如果想安装某一个程序包时,需要安装有依赖关系的程序包
说一下rpm的各个命令
RPM包的命名格式:
例如:zsh-5.0.2-31.el7.x86_64.rpm
zsh | 程序包名称 |
---|---|
5 | 主版本号 |
0.2 | 次版本号 |
31 | 第几次制作 |
el7 | 适用平台 |
X86_64 | 64位 |
rpm命令格式:
rpm 【OPTIONS】 【PACKAGE_FILE】
OPTIONS:
-i | 安装程序 |
---|---|
-v | 显示详细信息 |
-e | 卸载程序 |
-U | 升级程序 |
-q | 查询程序的信息 |
-V | 校验 |
–build , --initdb | 数据库维护 |
rpm安装程序子命令:
rpm {-i|–install} [install-options] PACKAGE_FILE ….
install-options: | 选项 |
---|---|
-v | 显示详细信息 |
-vv | 显示更详细的信息 |
-h | 输出进度条,用#号表示,每个#是2% |
–nodeps | 忽略依赖关系,不建议使用 |
-replacepkgs | 重新安装,删除以前安装的程序,在安装 |
例如:
[root@bogon ~]# rpm -ivh zsh-5.0.2-31.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-31.el7 ################################# [100%]
#安装软件包时出现依赖关系的包无法安装,可以使用--nodeps,但是即便安装好也无法使用
[root@bogon ~]# rpm -ivh ImageMagick-devel-6.7.8.9-15.el7_2.i686.rpm
错误:依赖检测失败:
ImageMagick = 6.7.8.9-15.el7_2 被 ImageMagick-devel-6.7.8.9-15.el7_2.i686 需要
bzip2-devel 被 ImageMagick-devel-6.7.8.9-15.el7_2.i686 需要
freetype-devel 被 ImageMagick-devel-6.7.8.9-15.el7_2.i686 需要
ghostscript-devel 被 ImageMagick-devel-6.7.8.9-15.el7_2.i686 需要
rpm升级安装子命令:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
-U | 升级安装程序,没有老程序包时也会自动安装 |
---|
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
-F | 升级安装程序,没有老程序包不会安装 |
---|
例如:
#安装更新软件包
[root@bogon ~]# rpm -qf /bin/tcsh
tcsh-6.18.01-8.el7.x86_64 #更新前的版本
[root@bogon ~]# rpm -Fvh tcsh-6.18.01-15.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:tcsh-6.18.01-15.el7 ################################# [ 50%]
正在清理/删除...
2:tcsh-6.18.01-8.el7 ################################# [100%]
[root@bogon ~]# rpm -qf /bin/tcsh
tcsh-6.18.01-15.el7.x86_64 #更新后的版本
rpm卸载子命令:
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts][–test] PACKAGE_NAME …
–allmatches | 卸载所有匹配指定名称的程序包的版本 |
---|---|
–nodeps | 卸载时不考虑依赖关系 |
–test | 仅测试卸载,不真正卸载 |
[root@bogon ~]# rpm -evh --test zsh
准备中... ################################# [100%]
[root@bogon ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh
rpm查询子命令:!!!!非常重要!!!!
rpm {-q|–query} [select-options] [query-options]
select-options | 选项 |
---|---|
-a | 查询所有已安装过的程序包 |
-f | 查询文件是由哪个程序包安装生成 |
-p , --package PACKAGE_FILE | 查询未安装程序的信息 |
–whatprovides CAPABILITY | 根据指定包的特性查询是由哪个包生成 |
–whatequires CAPABILITY | 指定包的特性来查询被哪个包所依赖 |
例如:
[root@bogon ~]# rpm -qf /bin/zsh
zsh-5.0.2-31.el7.x86_64
#-qp
[root@bogon ~]# rpm -qp zsh-5.0.2-31.el7.x86_64.rpm
zsh-5.0.2-31.el7.x86_64
query-options | 选项 |
---|---|
–changelog | 查询已安装程序包的日志 |
-l,–list | 查询程序安装后的文件列表 |
-i,–info | 查询程序包安装后的版本号,大小,等等 |
-d,–docfiles | 查询程序安装的文档 |
-c,–configfiles | 查询指定程序包提供的文档 |
-R,–requires | 查询指定程序的依赖的关系 |
–provides | 查询指定程序的所有CAPABILITY |
–scripts | 查询指定程序的运行脚本 |
示例:
[root@bogon ~]# rpm -q --changelog zsh
* 五 5月 04 2018 Kamil Dudka <kdudka@redhat.com> - 5.0.2-31
- fix defects detected by Coverity related to CVE-2017-18206 and CVE-2018-1083
* 四 5月 03 2018 Kamil Dudka <kdudka@redhat.com> - 5.0.2-30
- fix stack-based buffer overflow in utils.c:checkmailpath() (CVE-2018-1100)
- fix stack-based buffer overflow in gen_matches_files() (CVE-2018-1083)
- fix stack-based buffer overflow in exec.c:hashcmd() (CVE-2018-1071)
- avoid crash when copying empty hash table (CVE-2018-7549)
- fix buffer overrun in xsymlinks (CVE-2017-18206)
- fix NULL dereference in cd (CVE-2017-18205)
.....
[root@bogon ~]# rpm -qi zsh
Name : zsh
Version : 5.0.2
Release : 31.el7
Architecture: x86_64
Install Date: 2019年03月18日 星期一 13时16分58秒
Group : System Environment/Shells
Size : 5854390
License : MIT
Signature : RSA/SHA256, 2018年11月12日 星期一 22时49分55秒, Key ID 24c6a8a7f4a80eb5
Source RPM : zsh-5.0.2-31.el7.src.rpm
Build Date : 2018年10月31日 星期三 00时48分17秒
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://zsh.sourceforge.net/
Summary : Powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
[root@bogon ~]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/5.0.2
....
[root@bogon ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@bogon ~]# rpm -qd zsh
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
.....
校验:
rpm {-V|–verify} [select-options] [verify-options]
当对某个程序的某一个文件进行修改时,校验程序时会出现提示。示例:
[root@bogon ~]# vim /usr/share/zsh/5.0.2/functions/zfcd #对程序的某个文件进行修改
[root@bogon ~]# rpm -V zsh
S.5....T. /usr/share/zsh/5.0.2/functions/zfcd
S.5…T. | 字段解释 |
---|---|
S | 文件大小 |
M | 权限 |
5 | md5加密算法 |
D | 主次设备号不匹配 |
L | 符号链接不匹配 |
U | 属主修改 |
G | 属组修改 |
T | 时间戳修改 |
P | 某些特性被修改 |
最后:
rpm包在安装时要去验证包来源的合法性以及完整性,已Centos7为例,密钥的位置放在/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7。使用rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 即可。
3、yum的配置和使用总结以及yum私有仓库的创建。
yum是rpm包的前端程序,它有效的解决了各个rpm包之间的依赖关系。
它的工作模式简单来说:
1、通过配置文件来确定访问仓库是本地或者互联网
2、访问仓库查询并复制一份儿rpm包到本地缓存下来。
3、对rpm包进行分析是否存在依赖包并查询自身需要的rpm包
4、安装rpm包
注意:当对rpm包进行分析时,yum只是提取了rpm包以及依赖包的元数据地址,并对其排列。安装时首先安装的是各个依赖关系的包。
yum仓库的配置文件:
/etc/yum/yum.conf | 为所有仓库提供公共配置 |
---|---|
/etc/yum.repos.d/*.repo | 为仓库的指向提供配置 |
yum仓库的服务器地址类型:
ftp:// http:// file:///(本地协议)
yum仓库的定义:
**yum的repo(仓库)配置文件中可用的变量:
$releasever:当前os的发行版的主版本号
$arch:平台
$basearch:基础平台
示例:
1 [base] # repo_id ,注意:base只能有一个,多个无效
2 name=Centos7-OS #仓库名字
3 baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/ #仓库指向的访问地址,此处就是使用的变量
4 http://mirrors.163.com/centos/$releasever/os/$basharch/
5 http://mirrors.ustc.edu.cn/centos/$releasever/os/$basharch/
6 gpgcheck=1 #执行校验
7 enabled=1 #执行此仓库
8 enablegroups={1|0} 是否指定组来批量指定程序包
yum用法:
yum [options] [command] [package …]
options | 选项 |
---|---|
–nogpgcheck | 禁止密钥检测 |
-y | 所有回答都设置成yes |
-q | 静默模式 |
–diablerepo=repoidglob | 临时禁用指定的repo仓库 |
–enablerepo=repoidglob | 临时启用指定的repo仓库 |
–noplugis | 禁止所有插件 |
command | 命令选项 |
---|---|
repolist | 显示仓库列表 |
list | 显示程序包,默认显示全部 |
list [all|glob1][glob2] | 显示出全部程序包或者匹配通配符的程序包 |
list [available|updates|installed] | 显示出可安装、升级和已安装的程序包 |
install | 安装程序包 |
reinstall | 重新安装程序包 |
update | 升级程序包 |
downgrade | 降级程序包 |
remove | 卸载程序包 |
info | 显示程序包信息 |
clean[ packages | metadata | expire-cache | rpmdb | plugins | all ] | 清理缓存 |
deplist | 显示程序包的依赖关系 |
search “string1” | 搜手指定的程序包 |
grouplist | 显示包组的程序包列表 |
groupinstall | 安装包组的程序包 |
groupupdate | 升级包组的程序包 |
groupremove | 卸载包组的程序包 |
groupinfo | 显示包组的程序包的信息 |
创建私有库:
# 将光盘挂载至/mnt/media目录下
[root@bogon ~]# mount -r /dev/sr0 /mnt/media
#将光盘的程序复制到tmp目录下
[root@bogon ~]# cp -r /mnt/media/Packages/ /tmp/centos7
#创建一个本地的仓库
[root@bogon ~]# cat /etc/yum.repos.d/local.repo
[local]
name=centos7
baseurl=file:///tmp/centos7
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
#实现本地安装:
[root@bogon yum.repos.d]# yum install ftp
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 ftp.x86_64.0.0.17-66.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
==========================================================================================================================
Package 架构 版本 源 大小
==========================================================================================================================
正在安装:
ftp x86_64 0.17-66.el7 local 61 k
事务概要
==========================================================================================================================
安装 1 软件包
总下载量:61 k
安装大小:96 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : ftp-0.17-66.el7.x86_64 1/1
验证中 : ftp-0.17-66.el7.x86_64 1/1
已安装:
ftp.x86_64 0:0.17-66.el7
完毕!
4、写一个脚本实现列出以下菜单给用户:
(1)disk:show disk info信息
(2)mem: show memory info信息
(3)cpu: show cpu info信息
(*)quit
cat <<EOF
(1)disk:show disk info
(2)mem: show memory info
(3)cpu: show cpu info
(*)quit
EOF
#
read -p "input disk or mem or cpu or quit:" option
#
if [[ $option == "disk" ]];then
fdisk -l /dev/sda
elif [[ $option == "mem" ]];then
free -hm
elif [[ $option == "cpu" ]];then
lscpu
elif [[ $option == "quit" ]];then
exit 1;
else
echo "Wrong input,try again"
exit 2;
fi
5、sed用法总结并结合实例演示
sed是一款非交互性文本流编辑器,它的工作原理:
每一个文本文件都有多行内容,sed依次将每行的内容提取出来并保存至模式空间中。随后在模式空间中匹配所指定的正则表达式。如果被sed指定的正则表达式匹配,则输出至标准输出中或进行编辑操作后输出至标准输出。
注意:所有被sed指定的正则表达式匹配的内容或者编辑后的内容,都被缓存至保存空间中。并不会对原文件造成修改
sed用法:
sed [OPTION]…‘script’[input-file]…
OPTION | 常用选项 |
---|---|
-n | 不输出至保存空间的 |
-e script , --expression=script | 多点编辑 |
-f | 每一行编辑命令组成的脚本 |
-r, --regexp-extended | 支持正则表达式 |
-i | 直接编辑原文件 |
script:地址定界以及编辑命令选项
script | 地址定界选项 |
---|---|
不给任何地址时,表示对全文进行处理 | |
# | 表示指定行 |
/pattern/ | 被指定模式匹配到的行 |
# ,# | 表示第#行和第#行 |
# ,+# | 从第#行向下数#行 例如3 +5 就是3,4,5,6,7,8总共6行 |
#, /pattern/ | 从第#行开始,第一次被模式匹配到的内容 |
$ | 表示最后一行 |
~ | 步进地址,例如:1~2:1,3,5…所有奇数行 |
编辑命令:
script | 编辑命令选项 |
---|---|
d | 直接删除整行 |
p | 显示空间的内容 |
a \text | 实现在行后面追加文本信息“text”,输入\n实现多行内容追加 |
i \text | 实现在行前面追加文本信息“text”,输入\n实现多行文本插入 |
c \text | 把匹配到的行替换为此处指定的文本“text” |
w /path/to/somefile | 将模式空间中匹配到的行保存至指定的文件中 |
r/path/from/somefile | 将指定文件中的内容至当前文件被模式匹配到的行的后面。文件合并 |
= | 为模式空间中匹配到的行打印行号 |
! | 取反条件,需要写在匹配模式的后面 |
查找替换:
s/// :与vim末行命令下的查找方式一样,可自由定义分隔符,如s@@@ s###等
g | 全文替换 |
---|---|
w /path/to/somefile | 将结果保存在指定的文件中 |
p | 显示替换成功的行 |
示例:
#地址定界
#显示第三行的内容,-n表示不输出模式空间中的内容,p是打印出来
[root@bogon ~]# sed -n '3'p /etc/fstab
# /etc/fstab
#显示第3行到第5行的内容
[root@bogon ~]# sed -n '3,5'p /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Feb 26 16:32:37 2019
#
#显示从第3行向下数2行的内容
[root@bogon ~]# sed -n '3,+2'p /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Feb 26 16:32:37 2019
#
#显示从第2行开始打印出第一个字符是#号的行
[root@bogon ~]# sed -n '2,/^#/p' /etc/fstab
#
# /etc/fstab
#打印出最后一行
[root@bogon ~]# sed -n '$p' /etc/fstab
UUID="2015-12-09-22-36-30-00" /mnt/media iso9660 defaults 0 0
编辑命令示例:
#删除含有UUID的行
[root@bogon ~]# sed '/UUID/d' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Feb 26 16:32:37 2019
#
# 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/mapper/centos_bogon-root / xfs defaults 0 0
/dev/mapper/centos_bogon-home /home xfs defaults 0 0
/dev/mapper/centos_bogon-swap swap swap defaults 0 0
#在第4行后面添加hello,newline的内容
[root@bogon ~]# sed '4a\hello\nnewline' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Feb 26 16:32:37 2019
hello
newline
#
#在第一行前加入hello、newline的信息
[root@bogon ~]# sed '1i\hello\nnewline' /etc/fstab
hello
newline
#
#将匹配到的内容输出至a.txt文件中
[root@bogon ~]# sed '/UUID/w ./a.txt' /etc/fstab
[root@bogon ~]# cat a.txt
UUID=d45e2480-ac8a-47cf-881a-0982ceb22548 /boot xfs defaults 0 0
UUID="2015-12-09-22-36-30-00" /mnt/media iso9660 defaults 0 0
查找替换练习:
练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
[root@bogon ~]# sed 's@^[[:space:]]\+@@' grub2.cfg
练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
[root@bogon ~]#sed 's@^#[[:space:]]*@@' /etc/fstab
练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirnam
[root@bogon ~]# echo '/mnt/media/Packages/' | sed 's@[^/]\+/\?$@@'
6、 用bash实现统计访问日志文件中状态码大于等于400的IP数量并排序
#!/bin/bash
nginx_log=’/usr/local/nginx/logs/mynginx.log’
code_400_num=$(grep -o ‘[4|5][0-9][0-9]’ ${nginx_log} | wc -l)
code_400_sort=$(grep ‘[4|5][0-9][0-9]’ ${nginx_log} | sort
echo $code_400_num
echo $code_400_sort
此处完全抄写
7、 使用自制的yum源安装ftp、openssh、curl、wget、tcpdump等软件包
我使用的是本地的仓库,配置文件为
[root@bogon ~]# cat /etc/yum.repos.d/local.repo
[local]
name=centos7
baseurl=file:///tmp/cetos7
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
使用yum install均可安装