1、每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,"etc-年-月-日-时-分.tar.gz"
#crontab -e 0 */12 * * * /bin/tar -zvcf /backup/etc-$(date +%Y-%m-%d-%H-%M).tar.gz /etc
2、rpm包管理功能总结以及实例应用演示。
一、程序包管理概述
1.程序包语言
(1)系统级开发:一般直接调用硬件
C/C++:httpd, vsftpd, nginx
go语言
(2)应用级开发:java/Python/perl/ruby/php:
java: hadoop, hbase, (基于jvm虚拟机)
Python:openstack, (基于pvm虚拟机)
perl: (perl解释器)
ruby: (ruby解释器)
php: (php解释器)
2.程序语言格式
(1)C/C++程序格式:
源代码:文本格式的程序代码;
编译开发环境:编译器、头文件、开发库
二进制格式:文本格式的程序代码 --> 编译器 --> 二进制格式(二进制程序、库文件、配置文件、帮助文件)
(2)java/python程序格式:
源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
开发环境:编译器、开发库
二进制
3.项目构建工具:
c/c++: make
java: maven
4.程序包管理器:要完成安装、升级、卸载、查询、校验(校验为Linux所有)功能
(1)功能
将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;
(2)组成方式
1)程序包的组成清单(每个程序包都单独实现):文件清单、 安装或卸载时运行的脚本
2)数据库(公共):/var/lib/rpm/
程序包的名称和版本、依赖关系、 功能说明、安装生成的各文件的文件路径及校验码信息...
(3)不同系列Linux所用程序包管理器:
debian:dpt, dpkg, ".deb"
redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;
S.u.S.E:rpm, ".rpm",
Gentoo:ports
ArchLinux:
5.包的命名格式
(1)源代码:name-VERSION.tar.*z
VERSION:major.minor.release 主版本号.次版本号.发行号
(2)RPM包:name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的发行号,arch 平台号
6.RHEL制作RPM包时会拆包:主包和支包,方便安装所需要组件而非全部
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function(功能):devel, utils, libs, ...
7.程序包管理器前端工具:自动解决依赖关系;
yum:rhel系列系统上rpm包管理器的前端工具;
apt-get (apt-cache):deb包管理器的前端工具;
zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系统上rpm包管理器的前端工具,yum的升级版;
8.获取程序包的途径:
(1)系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com
(2)各个项目自己的官方站点
(3)第三方组织:
1) EPEL等可靠地开源社区组织
2) 搜索引擎:http://pkgs.org、 http://rpmfind.net 、http://rpm.pbone.net
(4)自动编译二进制代码、制作
二、RPM包管理
rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
1.安装:
(1)rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm -ivh PACKAGE_FILE ...
GENERAL OPTIONS(通用选项):
-v:verbose,详细信息
-vv:更详细的输出
[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
注意:rpm可以自带脚本;
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,%pre , --nopre
postinstall:安装过程完成之后运行的脚本,%post , --nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun
(2)实例演示
1)[root@localhost Packages]#rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm #安装zsh程序,显示过程
[root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:zsh-5.0.2-28.el7 ################################# [100%]
2.升级:
(1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升级或安装 -Uvh; rpm -Uvh PACKAGE_FILE ...
-F:纯粹升级,必须存在老版本,不支持安装操作 -Fvh rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force:强制升级;
注意:
1) 不要对内核做升级操作;Linux支持多内核版本并存,可直接安装新版本内核;
2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件 不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
(2)实例演示
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm 准备中... ################################# [100%] 软件包 zsh-5.0.2-28.el7.x86_64 已经安装 3.卸载:
(1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式
(2)实例演示
1)[root@localhost Packages]#rpm -e --test zsh #测试卸载zsh
[root@localhost Packages]#rpm -ql zsh #查看zsh程序安装所生成的所有文件列表
结论:--test不会真的卸载程序
[root@localhost Packages]# rpm -e --test zsh [root@localhost Packages]# rpm -ql zsh /bin/zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile 2)[root@localhost Packages] rpm -e zsh
#卸载程序
[root@localhost Packages]# rpm -e zsh [root@localhost Packages]# rpm -ql zsh 未安装软件包 zsh [root@localhost Packages]# 4.查询:
(1)rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]
--changelog:查询rpm包的changlog;
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
用法总结:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d
(2)实例演示
1)[root@localhost Packages]# rpm -ql sed
#查询程序安装所以生成的所有文件列表
[root@localhost Packages]# rpm -ql sed
2)[root@localhost Packages]# rpm -qi sed
#显示程序的相关信息
[root@localhost Packages]# rpm -qi sed Name : sed Version : 4.2.2 Release : 5.el7 Architecture: x86_64 Install Date: 2018年12月10日 星期一 05时28分49秒 Group : Applications/Text Size : 601208 License : GPLv3+ Signature : RSA/SHA256, 2014年07月04日 星期五 12时58分02秒, Key ID 24c6a8a7f4a80eb5 Source RPM : sed-4.2.2-5.el7.src.rpm Build Date : 2014年06月10日 星期二 09时01分55秒 Build Host : worker1.bsys.centos.org Relocations : (not relocatable) Packager : CentOS BuildSystem http://bugs.centos.org Vendor : CentOS URL : http://sed.sourceforge.net/ Summary : A GNU stream text editor Description : The sed (Stream EDitor) editor is a stream or batch (non-interactive) 3)[root@localhost Packages]# rpm -qd sed #查看包所提供文档位置
[root@localhost Packages]# rpm -qd sed /usr/share/doc/sed-4.2.2/AUTHORS /usr/share/doc/sed-4.2.2/BUGS /usr/share/doc/sed-4.2.2/COPYING /usr/share/doc/sed-4.2.2/COPYING.DOC /usr/share/doc/sed-4.2.2/NEWS /usr/share/doc/sed-4.2.2/README /usr/share/doc/sed-4.2.2/THANKS /usr/share/doc/sed-4.2.2/sedfaq.txt.gz /usr/share/info/sed.info.gz /usr/share/man/man1/sed.1.gz 4)[root@localhost Packages]# rpm -qc zsh #显示zsh相关的配置文件的位置
[root@localhost Packages]# rpm -qc zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout /etc/zprofile /etc/zshenv /etc/zshrc 5)[root@localhost Packages]# rpm -q --changelog zsh #查询zsh的改变日志
从近到远显示出该程序每次改版更新的相关信息
[root@localhost Packages]# rpm -q --changelog zsh * 四 2月 16 2017 Kamil Dudka kdudka@redhat.com - 5.0.2-28
- zero new space allocated in prompt buffer (#1408619)
- 一 11月 28 2016 Kamil Dudka kdudka@redhat.com - 5.0.2-27
- fix parsing of parameter subscript expression with NOEXEC (#1398740)
- 一 10月 17 2016 Kamil Dudka kdudka@redhat.com - 5.0.2-26
- fix crash while parsing the here-document syntax (#1374752)
- 四 7月 14 2016 Kamil Dudka kdudka@redhat.com - 5.0.2-25
- improve use of new command substitution in completion (#1356388)
- 五 6月 10 2016 Kamil Dudka kdudka@redhat.com - 5.0.2-24
- fix off-by-one error in completion utility cache code (#1344599)
5.校验:
(1)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 # readlink路径是否错配
U User ownership differs #用户本身关系
G Group ownership differs # 用户组本身关系
T mTime differs # 修改时间modify time
P caPabilities differ
(2)实例演示
测试安装的程序的校验信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -V php
忽略依赖关系安装php程序,此处为了测试使用
#测试程序的校验信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:php-5.4.16-45.el7 ################################# [100%] [root@localhost Packages]# rpm -V php 未满足的依赖关系 php-5.4.16-45.el7.x86_64: php-common(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要 php-cli(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要 6.包来源合法性验正和完整性验证:
(1) 检验方式
数字签名:用私钥加密对应程序的特征码
(2) 获取并导入信任的包制作者的密钥:
[root@localhost rpm-gpg]# cd /etc/pki/rpm-gpg/ [root@localhost rpm-gpg]# rpm --import RPM-GPG-KEY-CentOS-7 (3)验证:
-
安装此组织签名的程序时,会自动执行验证;
-
手动验正:rpm -K PACKAGE_FILE
在导入秘钥的CentOS7.1上验证
[root@localhost Packages]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定 7.数据库重建:
(1)rpm管理器数据库路径:/var/lib/rpm/
查询操作:通过此处的数据库进行;
(2)获取帮助:CentOS命令查询位置不同
CentOS 6:man rpm
CentOS 7:man rpmdb
(3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
[--dbpath DIRECTORY] :指明建立位置
(4)实例演示
1)在指定目录下/rpmdb下初始化一个rpm的数据库
注意:此时的库是没用的,所以大小和原来的库不同
[root@localhost Packages]# rpm -initdb --dbpath /rpmdb/ [root@localhost Packages]# ll /rpmdb/ 总用量 440 -rw-r--r--. 1 root root 8192 12月 16 16:05 Basenames -rw-r--r--. 1 root root 8192 12月 16 16:05 Conflictname -rw-r--r--. 1 root root 311296 12月 16 16:05 __db.001 -rw-r--r--. 1 root root 90112 12月 16 16:05 __db.002 -rw-r--r--. 1 root root 107048 12月 16 16:05 __db.003 -rw-r--r--. 1 root root 8192 12月 16 16:05 Dirnames -rw-r--r--. 1 root root 8192 12月 16 16:05 Group -rw-r--r--. 1 root root 8192 12月 16 16:05 Installtid -rw-r--r--. 1 root root 8192 12月 16 16:05 Name -rw-r--r--. 1 root root 8192 12月 16 16:05 Obsoletename -rw-r--r--. 1 root root 12288 12月 16 16:05 Packages -rw-r--r--. 1 root root 8192 12月 16 16:05 Providename -rw-r--r--. 1 root root 8192 12月 16 16:05 Requirename -rw-r--r--. 1 root root 8192 12月 16 16:05 Sha1header -rw-r--r--. 1 root root 8192 12月 16 16:05 Sigmd5 -rw-r--r--. 1 root root 8192 12月 16 16:05 Triggername 2)查看/var/lib/rpm
[root@localhost Packages]# cd /var/lib/rpm [root@localhost rpm]# ll 总用量 101428 -rw-r--r--. 1 root root 5173248 12月 16 15:55 Basenames -rw-r--r--. 1 root root 16384 12月 13 21:25 Conflictname -rw-r--r--. 1 root root 311296 12月 16 16:02 __db.001 -rw-r--r--. 1 root root 90112 12月 16 16:02 __db.002 -rw-r--r--. 1 root root 1318912 12月 16 16:02 __db.003 -rw-r--r--. 1 root root 1376256 12月 16 15:55 Dirnames -rw-r--r--. 1 root root 32768 12月 16 15:55 Group -rw-r--r--. 1 root root 24576 12月 16 15:55 Installtid -rw-r--r--. 1 root root 81920 12月 16 15:55 Name -rw-r--r--. 1 root root 36864 12月 16 15:55 Obsoletename -rw-r--r--. 1 root root 92139520 12月 16 15:55 Packages -rw-r--r--. 1 root root 2527232 12月 16 15:55 Providename -rw-r--r--. 1 root root 614400 12月 16 15:55 Requirename -rw-r--r--. 1 root root 147456 12月 16 15:55 Sha1header -rw-r--r--. 1 root root 86016 12月 16 15:55 Sigmd5 -rw-r--r--. 1 root root 8192 12月 13 22:33 Triggername
3、yum的配置和使用总结以及yum私有仓库的创建。
一、YUM简介
1. YUM: Yellowdog Update Modifier
完成RHEL系列前端自动解决依赖关系安装工具,依赖rpm存在
2.工作模式:C/S 架构
Server端(yum仓库):依赖关系库、原文件、校验码文件
Client端:yum客户端程序、配置文件(连接Server路径信息)
3.设计缺陷:
某一次安装过程中半途终止,再次重启后将无法解决程序间的依赖关系
yum升级版dnf就是为了解决此类问题
2.yum repository: yum repo,yum仓库
存储rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)
二、YUM客户端配置
1.yum配置文件路径
/etc/yum.conf:为所有yum仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
2./etc/yum.conf主配置定义
[root@localhost ~]# man 5 yum.conf #可获得yum.conf的详解
[root@localhost ~]# cat /etc/yum.conf
[main] #通用主配置段
cachedir=/var/cache/yum/$basearch/$releasever # 缓存文件路径
keepcache=0 # 缓存到本地的文件是否保存
debuglevel=2 # 调试级别
logfile=/var/log/yum.log # 安装的日志文件
exactarch=1 # 精确严格的平台release匹配
obsoletes=1
gpgcheck=1 #检测来源合法性和完整性
plugins=1 #支持插件机制
installonly_limit=5 #同时安装多少程序包
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bu # 追踪bug路径
distroverpkg=centos-release # 当前发行版版本号从哪儿获取
3.仓库(*.repo)配置文件定义:
[repositoryID] #仓库ID,唯一标识别,不能重复
name=Some name for this repository # 完整的仓库名称
baseurl=url://path/to/repository/ # yum仓库指明的访问路径
enabled={1|0} #是否启用此yum仓库,默认启用
gpgcheck={1|0} #是否检查完整性和来源合法性
gpgkey=URL #秘钥文件位置,可能是对方仓库提供
enablegroups={1|0} #是否基于组来批量管理程序包
failovermethod={roundrobin|priority} #故障转移方法:轮询、根据优先级选择; 默认roundrobin随机
cost=# #设置开销,默认为1000
… ...
说明:
1)*.repo可以将多个[repositoryID]的配置信息放在一个而文件内,也可以切成多个方便管理
2)baseurl可以使用:ftp:// 、http:// 、nfs:// 、file:/// 指明URL路径
3)baseurl等号两边不能有空格,其后可以填写多个镜像访问路径,每行一个,不能顶行写
多个访问路径间联系是镜像相同,目的是为了做备用访问
4)更多选项使用man 5 yum.conf查看,基本配置只需前三行就可以
5)发行版光盘镜像安装可能会自动配置网络镜像URL地址
三、yum命令的用法
yum [options] [command] [package ...]
1.OPTIONS
--nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q: 静默模式,不输出显示信息;
--disablerepo=repoidglob:临时禁用此处指定的repo;
--enablerepo=repoidglob:临时启用此处指定的repo;
--noplugins:禁用所有插件;
2.常用COMMAND
(1)显示仓库列表:repolist
# yum repolist [all|enabled|disabled] [所有|可用的|不可用]
(2)显示程序包:list
# yum list [all | glob_exp1] [glob_exp2] [...] [所有的|符合glob通配条件的]
# yum list {available|installed|updates} [glob_exp1] [...] 可用尚未安装的,已经安装的,可升级的
(3)安装程序包:install
# yum install package1 [package2] [...]
# yum reinstall package1 [package2] [...] (重新安装)
(4)卸载程序包:此时依赖于此安装包也会被卸载
# yum remove | erase package1 [package2] [...]
(5)升、降级安装程序包:update、downgrade
# yum update [package1] [package2] [...] 升级操作
# yum downgrade package1 [package2] [...] 降级操作
(6)检查可用升级:check-uodate
# yum check-update
(7)查看程序包简要信息:info
# yum info [package1] [package2] [...]
(8)查看指定的特性(可以是某文件)是由哪个程序包所提供:provides
yum provides | whatprovides feature1 [feature2] [...]
(9)清理本地缓存:clean
# yum clean <packages | metadata | expire-cache | rpmdb | plugins | all >
包、源数据、过期缓存、rpmdb、插件、所有
包安装完了会自动清除、而元数据(依赖关系等)不会自动,但下次yum安装会自动重新校验
3.COMMAND:安装及升级本地程序包
指定安装本地的*.rpm,但是会根据yum源现有依赖关系,解决此安装可能出现的依赖关系
# yum localinstall rpmfile1 [rpmfile2] [...]
# yum localupdate rpmfile1 [rpmfile2] [...]
4.COMMAND:包组管理的相关命令:
包组:一堆程序的一个集合,用于一起安装,因为某些程序安装需要依赖包组内容
# yum groupinstall group1 [group2] [...] 安装包组
# yum groupupdate group1 [group2] [...] 升级包组
# yum grouplist [hidden] [groupwildcard] [...] 显示包组列表
# yum groupremove group1 [group2] [...] 移除包组
# yum groupinfo group1 [...] 显示包组信息
四、创建yum仓库
1.使用光盘当作本地yum仓库:
光盘的镜像本身就是一个yum源,自己安装系统时候选择安装工具时就是借助yum自动安装
(1)挂载光盘至某目录,例如/media/cdrom # mount -r [-t iso9660] /dev/cdrom /media/cdrom
(2)创建配置文件
[ID]
name=
baseurl=file:///… …
gpgcheck=
2.yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号;
$arch: 平台;
$basearch:基础平台,同一系列最基本的架构,如32、64;
$YUM0-$YUM9 可做自定义
3.手动创建yum仓库:
(1)安装工具:createrepo,已安装
[root@localhost yum.repos.d]# yum info createrepo 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile
- base: mirrors.cn99.com
- epel: mirror01.idc.hinet.net
- extras: mirrors.huaweicloud.com
- updates: mirrors.cn99.com 已安装的软件包 名称 :createrepo 架构 :noarch 版本 :0.9.9 发布 :28.el7 大小 :302 k 源 :installed 来自源:anaconda 简介 : Creates a common metadata repository 网址 :http://createrepo.baseurl.org/ 协议 : GPLv2 描述 : This utility will generate a common metadata repository from a : directory of rpm packages. (2)下载所需要的所有文件到本地某个路径:
[root@localhost yum.repos.d]# mkdir -p /yumtest/Packages [root@localhost yum.repos.d]# cp /media/cdrom/Packages/* /yumtest/Packages/ (3)创建关联关系: createrepo - Create repomd (xml-rpm-metadata) repository
命令:createrepo [options] <directory>
当完成后生成repodata即可
[root@localhost yum.repos.d]# createrepo /yumtest/ Spawning worker 0 with 2478 pkgs Spawning worker 1 with 2478 pkgs Spawning worker 2 with 2478 pkgs Spawning worker 3 with 2477 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@localhost yum.repos.d]# (4)配置yum源文件,创建*.rope写入信息即可
root@localhost yum.repos.d]# cat Local.repo [Local] name=Local Yum baseurl=file:///yumtest/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
[root@localhost yum.repos.d]# yum repolist 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile epel/x86_64/metalink | 7.5 kB 00:00
- base: mirrors.huaweicloud.com
- epel: ftp.cuhk.edu.hk
- extras: mirrors.huaweicloud.com
- updates: mirrors.163.com Local | 2.9 kB 00:00 base | 3.6 kB 00:00 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 Local/primary_db | 5.9 MB 00:00 源标识 源名称 状态 Local Local Yum 9,911 base/7/x86_64 CentOS-7 - Base 10,019 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 12,744 extras/7/x86_64 CentOS-7 - Extras 321 updates/7/x86_64 CentOS-7 - Updates 599 repolist: 33,594
4、写一个脚本实现列出以下菜单给用户:
(1)disk:show disk info信息 (2)mem: show memory info信息 (3)cpu: show cpu info信息 (*)quit
#!/bin/bash
cat << EOF 1)disk: show disk info 2)mem:show memory info 3) cpu:show cpu info *) quit EOF
read -p 'Please input your choice:' option if [[ $option == 'disk' ]];then fdisk -l elif [[ $option == 'mem' ]];then free -h elif [[ $option == 'cpu' ]];then lscpu else exit 0 fi
5、sed用法总结并结合实例演示
sed:流编辑器 1.sed:Stream Editor 行处理工具,流编辑器
对文件内容逐行进行处理调用操作并显示到STDOUT
工作流程:
(1)sed默认不编辑原文件,而是逐行操作,复制一份到指定内存(pattern space,模式空间)
(2)pattern space内进行模式匹配,即和指定条件做匹配
不满足模式:输出到标准输出STDOUT
满足模式:进行指定的模式操作,再输出到STDOUT
(3)第二个特殊的内存空间 hold space:保持空间,临时保存操作在另一处内存
(4)当执行pattern space和 hold space相关选项时候回进行之间的数据流编辑操作
(5)最后根据操作执行hold space空间操作,选择性显示到STDOUT
2.格式:sed [OPTION]… {script-only-if-no-other-script} [input-file]…
其中{script-only-if-no-other-script}:指的是AddressCommands,地址界定执行命令
AddressCommands中间无空格,直接连接为一个选项操作
============ sed [OPTION]… AddressCommands [input-file]…==============
(1)OPTION常用选项
-n:不输出模式空间中的内容至屏幕;
-e script, --expression=script:多点编辑;
-f /PATH/TO/SED_SCRIPT_FILE : 每行一个编辑命令;
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;
(2)地址定界
1)空地址:什么都不填写时,表示对全文进行处理
2)单地址
#:表示对指定的行
/pattern/:被此模式所匹配到的每一行,其中模式两边的/不能省略
3)地址范围 (#表示任意数字)
#,#:从某行到某行,第二个#大于第一个#
#,+#:从某行开始加多商行
#,/pattern1/:从某行开始到第一次配到模式的行
/pattern1/,/pattern2/:从第一次匹配到的模式1到第二次匹配到哦的模式2
4)步进:~,#~# 从第几行
1~2:所有奇数行。从第一行开始,每次加两行读取
2~2:所有偶数行。从第二行开始,每次加两行读取
(3)编辑命令
d:删除;
p:显示模式空间中的内容;
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
地址定界!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
替换标记:
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' /etc/fstab
练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
3.pattern space和hold space编辑命令操作
(1)常用选项
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
(2)实例演示
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数量并排序
#!/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等软件包
mkdir -p /yumrepo/Packages ###创建本地packages目录 ###将需要的Packages拷贝到本地目录 cp /media/cdrom/Packages/ftp-0.17-67.el7.x86_64.rpm /yumrepo/Packages/ cp /media/cdrom/Packages/openssh-* /yumrepo/Packages/ cp /media/cdrom/Packages/curl-7.29.0-35.el7.centos.x86_64.rpm /yumrepo/Packages/ cp /media/cdrom/Packages/wget-1.14-13.el7.x86_64.rpm /yumrepo/Packages/ cp /media/cdrom/Packages/tcpdump-4.5.1-3.el7.x86_64.rpm /yumrepo/Packages/ ###使用createrepo命令创建本地yum源(如果没有此命令可以使用yum -y install createrepo安装)
[root@www yumrepo]# createrepo /yumrepo/ Spawning worker 0 with 15 pkgs Workers Finished Gathering worker results ++++++++++++++++++++++++++++++ Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete 修改yum配置文件,将仓库指向本地源 ++++++++++++++++++++++++++++++ [root@www ~]# cd /etc/yum.repos.d/ [root@www yum.repos.d]# vim local.repo [yumrepo] name=yumrepo baseurl=file:///yumrepo enabled=1 gpgcheck=0 ++++++++++++++++++++++++++++++ [root@www yum.repos.d]# yum repolist #######查看yum仓库 已加载插件:fastestmirror, security Loading mirror speeds from cached hostfile
base: mirror.lzu.edu.cn extras: mirror.lzu.edu.cn updates: mirrors.cqu.edu.cn 仓库标识 仓库名称 状态 base CentOS-6 - Base 6,713 extras CentOS-6 - Extras 35 updates CentOS-6 - Updates 251 yumrepo yumrepo 15 repolist: 7,014 ++++++++++++++++++++++++++++++ 安装ftp、openssh、curl、wget、tcpdump等软件包
yum install -y ftp openssh curl wget tcpdump