每12小时备份并压缩/etc/目录至/backup目录中
[root@localhost ~]# crontab -e ——>打开一个文本编辑器
0 */12 * * * tar -zcf /backup/etc-$(date +"%Y-%m-%d-%H-%M").tar.gz /etc
[root@localhost ~]# crontab -u hu -l ——>查看用户任务(当前在hu用户下)
0 */12 * * * tar -zcf /backup/etc-$(date +"%Y-%m-%d-%H-%M").tar.gz /etc
rpm包管理功能总结以及实例应用演示
简介:rpm包管理工具包含以下功能
- 安装:
-i | - -install
- 升级:
-U | - -update ; -f | --freshen
- 卸载:
-e | - -erase
- 查询:
-q | - -query
- 校验:
-V | - -verify
- 数据库维护:
- -builddb | - -initdb
rpm命令格式
rpm [options] [packages_FILE]
注意:查询和卸载时只需要packagename ,安装需要package_FILE
1、安装
- 格式:
rpm {-i | --install} [install-options] PACKAGE_FILE
公共options
-v
:输出安装的详细信息-vv
:输处安装时更为详细的信息
[install-options]
-h
:hash marks 安装时输出的进度条,每个#表示2%的进度
例:
真正安装时使用:rpm -ivh PACKAGE_FILE
[root@localhost mnt]# rpm -ivh /mnt/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm
Preparing... ################################# [100%]
package yum-3.4.3-132.el7.centos.0.1.noarch is already installed
--test
:仅仅是测试安装并不会真正安装,检查并报告是否有冲突
例:
[root@localhost mnt]# rpm -ivh --test /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
package zip-3.0-10.el7.x86_64 is already installed
--nodeps
:忽略依赖关系直接安装(安装后不一定能用)
例:
[root@localhost mnt]# rpm -ivh --nodeps /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
package zip-3.0-10.el7.x86_64 is already installed
--replacepkgs
:重新安装
例:
[root@localhost mnt]# rpm -ivh --replacepkgs /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zip-3.0-10.el7 ################################# [100%]
注意:
1、rpm包可自带运行脚本,分为以下四类
1)、preinstall:安装过程开始之前运行的脚本,%pre标记
2)、postinstall:安装完成后运行的脚本,%post标记
3)、preuninstall:卸载过程真正开始执行之前运行的脚本,%preun标记
4)、postuninstall:卸载完成后执行的脚本,%postun标记
2、rpm也可以选择不执行脚本
--nopre:表示不执行preinstall脚本
--nopost:表示不执行postinstall脚本
--nopreun:表示不执行preuninstall脚本
--nopostun:表示不执行postuninstall脚本
--noscripts:表示以上四个脚本都不执行
--nosignature:不检查包签名信息,不检查来源合法性
--nodigest:不检查包完整性信息
2、升级
- 格式:
rpm {-U | --update} [install-options] PACKAGE_FILE...
升级或安装(当有老版本程序包时升级,当没有时安装)
rpm {-F | --freshen} [install-options] PACKAGE_FILE...
只能用于升级,不能安装新软件
- 升级格式为
rpm -Uvh PACKAGE_FILE
rpm -Fvh PACKAGE_FILE
安装过程的options也同样适用于升级操作
options
- –oldpackage:降级安装(升级后若出现各种不兼容时可回滚)
- –force:强制升级
注意:
1、不要对内核做升级操作,因为升级后可能出现不兼容导致内核无法运行启动。Linux支持多内核版本并存,因此可以安装新版本内核
2、若某源程序包的配置文件安装后被修改过,升级时新版本程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本重新命名(FILENAME.rpmnew)后提供。
3、卸载
-格式:rpm {-e | --erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME
options
- –allmatches:卸载所有匹配指定名称的程序包的各版本
例:
[root@localhost /]# rpm -evh --allmatches zsh
Preparing... ################################# [100%]
Cleaning up / removing...
1:zsh-5.0.2-14.el7 ################################# [100%]
- –nodeps:忽略依赖关系进行卸载
例
[root@localhost /]# rpm -evh --nodeps zip
Preparing... ################################# [100%]
Cleaning up / removing...
1:zip-3.0-10.el7 ################################# [100%]
- –test:测试卸载,并不是真正的卸载
4、查询
- 格式:
rpm {-q | --query} [select-options] [query-options]
1)、[select-options] - PACKAGENAME:查询执指定程序包是否已安装,及其版本
-a | --all
:查询所有已安装包
例:
[root@localhost /]# rpm -qa yum
yum-3.4.3-132.el7.centos.0.1.noarch
-f FILE
:查询指定文件由那个安装生成
例:
[root@localhost /]# rpm -qf /usr/share/zsh/5.0.2/scripts/newuser
zsh-5.0.2-14.el7.x86_64
-g
:查询包组中有哪些包-p PACKAGE_FILE
:用于实现未安装程序包执行查询操作
2)、[query-options]
--changelog
:查询rpm包的changelog(修改日志)-l | --list
:程序包安装生成的所有文件列表
例:
[root@localhost /]# 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
/usr/lib64/zsh/5.0.2/zsh
/usr/lib64/zsh/5.0.2/zsh/attr.so
-i | --info
:程序包相关信息——版本号,大小,所属包组等
例:
[root@localhost /]# rpm -qi zsh
Name : zsh
Version : 5.0.2
Release : 14.el7
Architecture: x86_64
Install Date: Sun 23 Dec 2018 12:51:12 PM CST
Group : System Environment/Shells
Size : 5834871
License : MIT
Signature : RSA/SHA256, Thu 26 Nov 2015 12:07:38 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : zsh-5.0.2-14.el7.src.rpm
Build Date : Fri 20 Nov 2015 09:11:36 PM CST
Build Host : worker1.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.
-c
:查询指定程序包提供的配置文件-d
:查询指定的程序包提供的帮助文档--prowides
:列出指定的程序包提供的所有的CAPABILITY(功能)-R, --requires
:查询指定的程序包的依赖关系--scripts
:查看程序包自带脚本片段
例:
[root@localhost /]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
echo "/bin/zsh" > /etc/shells
else
grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi
if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
--entry="* zsh: (zsh). An enhanced bourne shell."
fi
:
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \
--entry="* zsh: (zsh). An enhanced bourne shell."
fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
if [ -f /etc/shells ] ; then
TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
grep -v '^/bin/zsh$' /etc/shells > $TmpFile
cp -f $TmpFile /etc/shells
rm -f $TmpFile
fi
fi
5、校验
- 格式:
rpm {-V | verify} [select-option] [verify-option]
例:
[root@localhost /]# vim /usr/share/zsh/site-functions
[root@localhost /]# vim /usr/share/zsh/5.0.2/scripts/newuser
[root@localhost /]# rpm -V zsh
S.5....T. /usr/share/zsh/5.0.2/scripts/newuser
各个位符号代表什么意思:S.5....T.
S file Size differs ——文件大小发生改变
M Mode differs (includes permissions and file type) ——权限发生改变
5 digest (formerly MD5 sum) differs ——文件内容发生改变
D Device major/minor number mismatch ——主/次设备号发生改变
L readLink(2) path mismatch ——read路径不匹配
U User ownership differs ——属主更改了
G Group ownership differs ——属组更改了
T mTime differs ——时间戳改变了
P caPabilities differ ——capabilities更改了
- 包的来源合法性验证和完整性验证
1)、数字签证——使用自己的私钥去加密单向加密出的数据特征码
第一步:包制作好后使用单向加密提取特征码
第二步:用自己的私钥加密特征码,附加在文件后(前两步属于包制作者操作)
第三部:使用公钥解密特征码,若能解码则得到特征码1,在对包进行单向加密得到特征码2,对比特征码1和特征码2 ,若完全吻合则包文件没有被改动过,否则已经被改动。
2)、验证过程
a、获取并导入信任的包制作的公钥
对于centos发行版:rpm --import /etc/pki/rpm-gpg/RPM-GPA-KEY-Centos-7
b、验证
自动验证:rpm --import /etc/pki/rpm-gpg/RPM-GPA-KEY-Centos-7导入包后校验时自动验证)
手动验证:rpm -k PACKAGE-NAME
如:rpm -k zsh-5.0.2-7.el7_1.2X86_64.rpm
6、数据库重建
1、rpm管理器数据库路径:/var/lib/rpm(查询等操作都是通过此处数据库进行)
2、获取重建数据库的命令
- centos 6:man rpm
- centos 7:man rpmdb
3、命令使用
- 格式:
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb
:初始化数据库,当前无任何数据库可实现创建一个新的,当前不执行任何操作
--rebuilddb
:重新构建数据库,通过读取当前系统上所有已安装过的程序进行重新创建
例:
创建新数据库到指定文件夹
[root@localhost recover]# rpm --initdb --dbpath=/recover/database
[root@localhost recover]# ll database
total 440
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Basenames
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Conflictname
-rw-r--r--. 1 root root 311296 Dec 23 14:05 __db.001
-rw-r--r--. 1 root root 90112 Dec 23 14:05 __db.002
-rw-r--r--. 1 root root 107048 Dec 23 14:05 __db.003
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Dirnames
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Group
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Installtid
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Name
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Obsoletename
-rw-r--r--. 1 root root 12288 Dec 23 14:05 Packages
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Providename
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Requirename
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Sha1header
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Sigmd5
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Triggername
重新构建数据库到指定目录
[root@localhost recover]# rpm --rebuilddb --dbpath=/recover/database
[root@localhost recover]# ll database
total 104
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Basenames
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Conflictname
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Dirnames
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Group
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Installtid
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Name
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Obsoletename
-rw-r--r--. 1 root root 12288 Dec 23 14:11 Packages
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Providename
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Requirename
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Sha1header
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Sigmd5
-rw-r--r--. 1 root root 8192 Dec 23 14:05 Triggername
yum的配置和使用总结以及yum私有仓库的创建。
1、yum用法:yum [options] [command] [package ...]
yum子命令:
install:安装指定的(多个)包或包组。
update:更新。如果不指定任何包,会升级所有已经安装的包。
update-to:类似update命令,但是升级到指定的版本。
update-minimal:类似update命令,但只升级到比当前版本高的最低版本。
check-update:检查是否有更新。命令状态码返回100表明有更新,0没有更新,1表示出错。
upgrade:同update --obsoletes,会删除被淘汰的包。
upgrade-to:类似upgrade,但只升级到指定版本。
remove/erase:卸载指定包及依赖此包的其他包。有一些配置可以想必卸载的行为。
remove_leaf_only:只卸载不被依赖的包。
clean_requirements_on_remove:卸载的同时,卸载只依赖此包的其他包。
autoremove:清除非显式安装的,不再被其他包依赖的包。
list OPTIONS:列出指定类型的包。
all:所有,默认。
available:仓库中有,可以安装。
updates:可以升级。
installed:已经安装。
extras:已安装,但仓库中没有。
obsoletes:已经安装且被淘汰的。
recent:最近添加到仓库中的。
provides/whatprovides:查询指定的文件或特性是由哪个包生成的。
search:根据包名和描述查找相关的包。
info:查看指定包的描述信息,可用的opion同list命令。
clean:清除yum缓存目录下的文件。
expire-cache:过期的元数据和镜像列表。
packages:rpm包。
headers:头文件。
metadata:元数据文件。
dbcache:本地元数据库。
rpmdb:rpm缓存。
plugins:扩展插件缓存。
all:以上所有。
makecache:构建元数据的缓存。
localinstall:安装指定的本地rpm文件包,自动解决依赖问题。
localupdate:用指定的rpm文件包升级,自动解决依赖问题。
reinstall:重新安装。
downgrade:降级。
swap foo bar:卸载foo,安装bar。
deplist:显示包的依赖,和提供这些依赖的包。
repolist:列出仓库信息。
enabled:列出启用的仓库,默认。
disabled:列出禁用的仓库。
all:列出所有仓库。
history:列出历史事务。
groupinstall:安装指定组。
groupupdate:更新指定组。
grouplist:查看所有组。
groupremove:卸载组。
groupninfo:查看组信息。
2、yum选项:
-y:对所有互动回答为yes。
-c:指定yum配置文件位置。
-q:静默模式。
-v:显示调试信息。
--disablerepo:临时禁用repo。
--enablerepo:临时启用repo。
--nogpgcheck:不检查来源合法性。
3、创建yum仓库:createrepo [options] DIRECTORY
-u URL:指定baseurl,访问仓库的url。
--basedir:指向rpm文件目录的路径,默认是当前目录
-x:排除的文件,可用glob指定。
4、仓库元数据:在仓库的repodate目录中
primary.xml.gz:指明了仓库中所有rpm包,依赖关系,每个包安装后会生成的文件。
filelists.xml.gz:当前仓库中所有rpm包的所有文件列表。
other.xml.gz:额外信息,比如修改日志。
repomd.xml:上述三个文件的时间戳和检验和。
comps*.xml:分组信息。
5、yum相关配置
配置文件:/etc/yum.conf,为所有仓库提供公共配置。
特性配置文件:/etc/yum.repos.d/*.repo,为指定的仓库提供配置。
配置文件中的变量:
$releaseserver:当前发行版的主版本号
$arch:CPU平台体系
$basearch:基础CPU平台体系。
$YUM0-$YUM9:自定义变量。
配置文件格式:
[repoid] # 仓库的唯一标识
name=NAME # 仓库的名称
baseurl=URL # 访问仓库的路径,可用ftp://、http://、file:/// 协议指定,可指定多个,一行一个
mirrorlist=URL # 指向一个包含多个baseurl的文件的url
enabled=[1|0] # 启用/禁用仓库
gpgcheck=[1|0] # 是/否验证文件来源的合法性。
gpgkey=URL # 指向gpg key文件的url
enabledgroups=[1|0] # 是否支持组
failovermethod=[roundrobin|priority] # 访问baseurl失败时,查找下一个baseurl的策略,roundrobin:随机选择,priority:顺序选择下一个。
keepalive=[1|0] # 使用HTTP/1.1时,是否支持keepalive
cost=num # 仓库开销,用来衡量仓库的性能,默认1000,越小说明性能越好。
写一个脚本实现以下菜单给用户
(1) disk:show disk info 信息
(2) mem:show memory info 信息
(3) cpu:show cpu info 信息
(*) quit
#! /bin/bash
showmenu {
echo '(1) disk: show disk info'
echo '(2) mem: show memory info'
echo '(3) cpu: show cpu info'
echo '(*) quit'
}
function showdisk {
fdisk -l | grep '^Disk /dev'
}
function showmem {
free -h
}
function showcpu {
cat /proc/cpuinfo
}
while :
do
showmenu
read -p 'select an option: ' option
case $option in
1)
showdisk
;;
2)
showmem
;;
3)
showcpu
;;
*)
exit 0
;;
esac
done
sed用法总结并结合实例演示
1、sed用法:sed [OPTIONS] "AddressCommand" file...
Adress:
不写Address默认是所有行。
n:指定特定的一行。
n~step:从第n行开始,每隔step取一行。
$:最后一行
/regexp/:被模式匹配的行(/可用任何符号代替)。
addr1,addr2:从addr1行到第addr2行。
addr1,+N:从addr1行开始,最多选取N行。
addr1,~N:从addr1行开始,直到行号为N的行。
COMMAND
=:打印当前行号。
a\text:在指定行后面增加内容为text的行。
i\text:在指定行前面增加内容为text的行。
q[exit_code]:当使用脚本方式运行时,用q指定立即退出。
r filename:从指定文件中读取文件内容并追加到新行。
{commands}:命令块,可指定多个命令。
b label:跳到指定label,若label未指定,跳到脚本末尾。
c\text:用指定的文本替换匹配的行。
d:删除匹配的行。
D:删除多行模式空间中的所有行。
h:用模式空间的内容覆盖保持空间的内容。
H:将模式空间中的内容追加到保持空间。
g:用保持空间的内容覆盖模式空间的内容。
G:将保持空间中的内容追加到模式空间
x:交换模式空间和保持空间的内容。
l width:显示非打印字符,每隔width个字符插入一个换行符。不指定width,不插入换行符。
n:读取匹配到的下一行,覆盖到模式空间。
N:读取匹配到的下一行,追加到模式空间。
p:打印当前行。
s/regexp/replacement/{g,i,w,p}:替换指定的内容,默认只替换第一次被匹配的内容。分隔符/可以用任何字符代替,如#、@等,只要前后一致即可。
g:全局替换。
i:忽略大小写。
w:将替换成功的结果保存到文件中。
p:打印替换成功的行。
w filename:将匹配到的内容写入指定文件中。
y/source/dest/:将source中的字符替换为dest中的字符。
options:
-n:静默模式,不显示模式空间中的内容。
-i:直接修改文件内容。
-e script[ -e script..]:可以同时执行多个命令。
-f script-file:从脚本中读取命令。
-r:使用扩展的正则表达式。
实例:
删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符:sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf
删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符:sed 's@^#[[:space:]]*@@' /etc/fstab
输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname:echo '/etc/passwd/ppp/'|sed -r 's@[^/]+/?$@@'
显示偶数行:sed -n 'n;p',sed从第一行读取,读取一行遇到n命令,就会读取下一行,接着p命令打印;显示奇数行,可用sed -n 'p;n'
逆序显示文件的内容:sed '1!G;h;$!d',当读取到第一行的时候,直接覆盖到保持空间,读取后续行的时候,每次先把保持空间的内容追加到模式空间,再覆盖保持空间并且清空模式空间(最后一行的时候不用清空,要是清空了,就没有内容了)。
取出最后一行:sed '$!d',只要不是最后一行,就删除。
取出文件后两行:sed '$!N;$!D',当前不是最后一行,就追加读取到的下一行到模式空间(这时候模式空间有两行),然后清空模式空间,当到达最后一行的时候,模式空间中正好是最后两行。
删除原有的所有空白行,而后为所有的非空白行后添加一个空白行:sed '/^$/d;G',删除空白行,并追加保持空间的内容到模式空间(保持空间没有内容,所以追加了空行)。
显示奇数行:sed 'n;d'
在原有的每行后方添加一个空白行:sed 'G'
用bash实现统计访问日志文件中状态码大于等于400的IP数量并排序
sed -n -r '/\<40[0-9]\>/p' /var/log/httpd/access_log|cut -d" " -f1 |sort|uniq -c
使用自制的yum源安装ftp、openssh、wget、tcpdump等软件包
root目录下,新建目录myrepo/Packages。
从光盘中复制相应的rpm包到Pacakges目录。
执行命令createrepo -u /root/myrepo/Packages /root/myrepo
编辑文件/etc/yum.repos.d/myrepo.repo,添加如下内容:
[myrepo]
name=my custom repo
baseurl=file:///root/myrepo
enabled=1
gpgcheck=0
yum install ftp...等