1. 每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,“etc-年-月-日-时-分.tar.gz”。
mkdir /backup/
crontab -e
* */12 * * * tar -zcvf /backup/etc-$(date +%Y-%m-%d-%H-%M).tar.gz /etc
查看效果:
[root@localhost etc]# crontab -l
* */12 * * * tar -zcvf /backup/etc-$(date +%Y-%m-%d-%H-%M).tar.gz /etc
2. rpm包管理功能总结以及实例应用演示。
CentOS系统上rpm管理命令包括:
安装、卸载、升级、查询、校验、数据库维护
rpm包安装:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose:显示安装过程中的详细信息
-h:以#显示安装进度
--test:测试安装,但不真正执行安装
--nodeps:忽略依赖关系
--replacepkgs:覆盖安装
--nosignature:不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
rpm包升级
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安装有旧版程序包,则“升级”。如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”。如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强制安装
升级注意项
注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
rpm包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY
rpm包卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--nodeps:忽略依赖关系
--allmatches:如果一个程序包同时安装多个版本,则此选项一次全部卸载之
--test:测试卸载
rpm包校验
rpm {-V|--verify} [select-options] [verify-options]
S: file Size differs 文件的容量大小是否被改变
M: Mode differs (includes permissions and file type) 文件的类型或文件的属性是否被改变?如是否可运行等参数已被改变
5: digest (formerly MD5 sum) differs MD5这一种指纹码的内容已经不同
D: Device major/minor number mismatch 装置的主/次代码已经改变
L: readLink(2) path mismatch link路径已被改变
U: User ownership differs 文件所属人已被改变
G:Group ownership differs 文件所属组已被改变
T:mTime differs 文件的创建时间已被改变
P: capabilities differ 文件的功能已被改变
包来源合法性验正及完整性验证
完整性验证:SHA256
来源合法性验证:RSA
公钥加密
对称加密:加密、解密使用同一密钥
非对称加密:密钥是成对儿的
public key:公钥,公开所有人
secret key:私钥, 不能公开
本地密钥地址:/etc/pki/rpm-gpg
导入本地密钥:rpm -import /etc/pki/rpm-gpg/keyfile
rpm包校验:rpm -K /rmpfile
rpm数据库
数据库重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb:初始化
如果事先不存在数据库,则新建之否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
实例:
rpm -qa bash #查看bash是否安装
rpm -ivh ftp-0.17-67.el7.x86_64.rpm #安装FTP
rpm -e bash #卸载bash
rpm -qf `which bash` #返回bash的安装包全名
rpm -qif `which bash` #返回安装包bash的信息
rpm -qa | grep bash #查找所有安装过的包含bash的软件包
3. yum的配置和使用总结以及yum私有仓库的创建。
yum:rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
yum repository:yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
yum配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:
[repositoryID] #仓库ID,唯一标识别,不能重复
name=Some name for this repository #当前仓库的名称
baseurl=url://path/to/repository/ #仓库的访问路径
enabled={1|0} #是否启用此仓库
gpgcheck={1|0} #是否检查完整性和来源合法性
gpgkey=URL #秘钥文件位置
enablegroups={1|0} #是否基于组来批量管理程序包
failovermethod={roundrobin|priority} #故障转移方法:轮询、根据优先级选择; 默认roundrobin随机,priority:按顺序访问
cost #设置开销,默认为1000
yum命令的用法
yum [options] [command] [package ...]
OPTIONS
--nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q: 静默模式,不输出显示信息;
--disablerepo=repoidglob:临时禁用此处指定的repo;
--enablerepo=repoidglob:临时启用此处指定的repo;
--noplugins:禁用所有插件;
常用命令
显示仓库列表:repolist
yum repolist [all|enabled|disabled] [所有|可用的|不可用]
显示程序包:list
yum list [all | glob_exp1] [glob_exp2] [...] [所有的|符合glob通配条件的]
yum list {available|installed|updates} [glob_exp1] [...] 可用尚未安装的,已经安装的,可升级的
安装程序包:install
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安装)
卸载程序包:此时依赖于此安装包也会被卸载
yum remove | erase package1 [package2] [...]
升、降级安装程序包:update、downgrade
yum update [package1] [package2] [...] 升级操作
yum downgrade package1 [package2] [...] 降级操作
检查可用升级:check-uodate
yum check-update
查看程序包简要信息:info
yum info [package1] [package2] [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供:provides
yum provides | whatprovides feature1 [feature2] [...]
清理本地缓存:clean
yum clean
包、源数据、过期缓存、rpmdb、插件、所有
包安装完了会自动清除、而元数据(依赖关系等)不会自动,但下次yum安装会自动重新校验
安装及升级本地程序包
指定安装本地的*.rpm,但是会根据yum源现有依赖关系,解决此安装可能出现的依赖关系
yum localinstall rpmfile1 [rpmfile2] [...]
yum localupdate rpmfile1 [rpmfile2] [...]
自己搭建yum私有仓库
vim /etc/yum.repos.d/base.repo
[base]
name=cdrom
baseurl=file:///mnt/cdrom/
gpgcheck=0
enabled=1
yum repolist
搭建完yum配置文件即可使用yum安装了。
4. 写一个脚本实现列出以下菜单给用户。
(1)disk:show disk info信息
(2)mem:show memory info信息
(3)cpu:show cpu info信息
(*)quit
#!/bin/bash
#while循环
cat << EOF
(1) disk:show disk info
(2) mem:show memory info
(3) cpu:show cou info
(*) quit
EOF
while true;do
read -p "your chioce:" option
if [[ "$option" == "disk" ]];then
fdisk -l /dev/sd[a-z]
exit 0
elif [[ "$option" == "mem" ]];then
free -m
exit 0
elif [[ "$option" == "cpu" ]];then
lscpu
exit 0
else
echo "unkown option."
exit 1
fi
done
5. sed用法总结并结合实例演示。
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]... 'script' inputfile...
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script:
'地址命令
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行, $: 最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/// 查找替换,支持使用其它分隔符, s@@@, s###
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
高级编辑命令
P: 打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
实例:
删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
sed 's@^#[[:space:]]*@@' /etc/fstab
输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
或者:echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
sed -n 'n;p' FILE 显示偶数行
sed '1!G;h;$!d' FILE 逆序显示文件的内容;
sed ’$!d' FILE 取出最后一行;
sed '$!N;$!D' FILE 取出文件后两行;
sed '/^$/d;G' FILE 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE 显示奇数行;
sed 'G' FILE 在原有的每行后方添加一个空白行;
6. 用bash实现统计访问日志文件中状态码大于等于400的IP数量并排序。
日志格式:
157.255.47.165 - - [23/Jul/2019:00:02:50 +0800] HEAD /favicon.ico HTTP/1.0 "404" 0 "-" "-" "-"
用文本工具实现:
[root@localhost etc]# egrep "*\"[4-9][0-9][0-9]\"*" /home/backup/log.txt | cut -d " " -f1 | sort | uniq -c | sort -r
[root@localhost etc]# egrep "*\"[4-9][0-9][0-9]\"*" /home/ouyang/log.txt | awk '{print $1}' | sort | uniq -c | sort -r
用脚本实现:
#!/bin/bash
# ip.sh sum ip list and code>=400
cat /home/ouyang/log.txt | egrep "*\"[4-9][0-9][0-9]\"*" | cut -d" " -f1 > ipnum.txt
for i in ipnum.txt;do
iptj=`cat $i | sort | uniq -c | sort -r`
echo "$iptj"
done
测试结果:
[root@localhost ouyang]# bash ./ip.sh
3 111.206.219.223
2 111.6.241.64
1 60.174.240.54
1 157.255.47.165
1 14.204.74.84
1 120.221.133.25
1 117.149.155.124
1 112.65.92.24
1 111.6.241.67
1 111.32.150.85
7. 使用自制的yum源安装ftp openssh curl wget tcpdump等软件包。
mkdir -p /backup/media
createrepo /backup/media/
yum repolist #正常获取列表需要联网才可以。把CentOS-Base.repo和CentOS-Debuginfo.repo改名即可不要联网获取列表,这样就只有本地源
yum -y install ftp openssh curl wget tcpdump