Q1:每12
小时备份并压缩/etc/
目录到/back
目录中,保存文件名格式为,etc-年-月-日-时-分.tar.gz
* */12 * * * tar czf /back/etc-`date +"%F-%H-%M"`.tar.gz /etc
Q2:rpm包管理功能总结以及实例应用演示。
RPM
,原名Red-hat Package Manager
,成为行业标准后改名为RPM Package Manager
。RPM
包的命名格式为:{package}-{version}-{release}.{arch}.rpm
。 比较大的包可以分成主包和多个子包,主包包含主要功能,子包包含扩展功能。主包命名格式:{masterpackage}-{version}-{release}.{arch}.rpm
,子包命名格式:{masterpackage}-{subpackage}-{version}-{release}.{arch}.rpm
。
- 安装和升级相关选项:
- -i PACKAGEFILE:安装指定的包,例:
rpm -i httpd-2.4.6-67.el7.centos.x86_64.rpm
。- -U PACKAGEFILE:安装/升级指定包,例:
rpm -U ftp-0.17-51.1.el6.x86_64.rpm
。- -F PACKAGEFILE:升级指定包,前提是已经安装了老版本,否则不做任何操作,例:
rpm -F ftp-0.17-51.1.el6.x86_64.rpm
。- --reinstall PACKAGEFILE:重新安装指定包(centos7)。
- --force:强制安装,等同于
--replacepkgs, --replacefiles, --oldpackage
,可以实现重装或降级。- -h:用
#
符号显示进度,一共50
个,每个表示2%
。- --nodeps:不检查依赖关系。
- --nodigest:不检验校验和。
- --nosignature:不检验签名。
- --oldpackage:降级安装。
- --prefix:指定安装路径。
- --replacefiles:覆盖其他已安装包的文件。
- --replacepkgs:替换原有安装。
- --test:不安装,只是测试潜在的冲突。
- 卸载相关选项:
- -e PACKAGENAME:卸载指定包,例
rpm -e httpd
- --allmatches:卸载指定包的所有已安装的版本,默认情况下,如果检测到有多个版本,会报错。
- --nodeps:不检查依赖关系。
- --test:不卸载,只测试。
- 查询相关选项:查询的用法
rpm {-q|--query} [select-options] [query-options]
- select-options:
- -q PACKAGENAME:查询指定的包是否已经安装,如果已安装,显示其完整包名。
- -a:列出所有已经安装的包。
- -f FILE:查询指定文件属于哪个包。
- -g GROUP:查询指定包组中的包。
- -p PACKAGEFILE:查询指定的包文件相关信息,而不是已经安装的包名。
- --whatprovides CAPABILITY:查询提供指定CAPABILITY(功能)的包。
- --whatrequires CAPABILITY:查询依赖指定CAPABILITY的包。
- query-options:
- --changelog:显示指定包的修改日志。
- -c:显示配置文件。
- --conflicts:显示跟指定包的CAPABILITY冲突的包。
- -d:显示文档文件。
- -i:显示指定包的信息,包括名称,版本,描述。
- -L:显示授权文件。
- -l:列出指定包安装生成的所有文件。
- --provides:列出指定包提供的CAPABILITES。
- -R/--requires:列出指定包依赖的所有CAPALITIES。
- --scripts:列出包在安装和卸载过程中使用的脚本。
- -s:列出指定包生成的所有文件的状态,状态可能为
正常
、未安装
,被替换
。- 完整性检验相关选项:检验的用法
rpm {-V|--verify} [select-options] [verify-options]
- -V PACKAGENAME:
- 验证的结果一共9位(centos5是8位,少最后一位),表示9个属性被修改:
- S:文件大小(Size)。
- M:文件权限(Mode)。
- 5:MD5校验码。
- D:设备的主/次设备号不匹配(Device)。
- L:路径不匹配:(readLink)。
- U:属主不匹配(User)。
- G:属组不匹配(Gser)。
- T:最近修改时间不匹配(mTime)。
- P:CAPABILITY发生变化(caPbilities)。
- 后面会有一个字段指明文件类型:
- c:配置文件。
- d:文档文件。
- g:幽灵文件(文件不属于此包)。
- l:授权文件。
- r:readme文件。
- 例:刚安装完
openssh
,执行rpm -V openssh
没有任何输出,修改文件/usr/share/doc/openssh-4.3p2/INSTALL
(openssh安装生成的文件),随便修改一点内容,再执行rpm -V openssh
,显示S.5....T d /usr/share/doc/openssh-4.3p2/INSTALL
,表示文件大小
、MD5校验码
,最近修改时间
三项发生变化。- 合法性校验选项:用法
rpm -K options PACKAGEFILE
- -K PACKAGEFILE:验证指定包文件的合法性。
- dsa和gpg算法用来校验来源合法性,即签名校验。
- sha1和md5算法用来校验包的完整性。
- --import PUBKEY:导入验证用的公钥。导入的密钥文件位于
/etc/pki/rpm-gpg/
目录下,命名格式为:RPM-GPG-KEY-{name}-{release}
。- 数据库管理,rpm数据位于
/var/lib/rpm
。
- --initdb:初始化数据库,如果已经数据库,不做任何操作。
- --rebuilddb:重建数据库。
Q3:yum
的配置和使用总结以及yum
私有仓库的创建。
- 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:查看组信息。
- yum选项:
- -y:对所有互动回答为yes。
- -c:指定yum配置文件位置。
- -q:静默模式。
- -v:显示调试信息。
- --disablerepo:临时禁用repo。
- --enablerepo:临时启用repo。
- --nogpgcheck:不检查来源合法性。
- 创建yum仓库:
createrepo [options] DIRECTORY
- -u URL:指定
baseurl
,访问仓库的url。- --basedir:指向rpm文件目录的路径,默认是当前目录
- -x:排除的文件,可用glob指定。
- 仓库元数据:在仓库的
repodate
目录中
- primary.xml.gz:指明了仓库中所有rpm包,依赖关系,每个包安装后会生成的文件。
- filelists.xml.gz:当前仓库中所有rpm包的所有文件列表。
- other.xml.gz:额外信息,比如修改日志。
- repomd.xml:上述三个文件的时间戳和检验和。
- comps*.xml:分组信息。
- 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,越小说明性能越好。
Q4:写一个脚本实现以下菜单给用户:
(1) disk:show disk info 信息
(2) mem:show memory info 信息
(3) cpu:show cpu info 信息
(*) quit
#! /usr/bin/env bash
function 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
Q5:sed
用法总结并结合实例演示。
- 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
中的字符。- 选项:
- -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'
Q6:用bash
实现统计访问日志文件中状态码大于等于400
的IP
数量并排序
sed -n -r '/\<40[0-9]\>/p' /var/log/httpd/access_log|cut -d" " -f1 |sort|uniq -c
Q7:使用自制的yum
源安装ftp
、openssh
、wget
、tcpdump
等软件包。
1、root
目录下,新建目录myrepo/Packages
。
2、 从光盘中复制相应的rpm包到Pacakges
目录。
3、 执行命令createrepo -u /root/myrepo/Packages /root/myrepo
4、 编辑文件/etc/yum.repos.d/myrepo.repo
,添加如下内容:
[myrepo] name=my custom repo baseurl=file:///root/myrepo enabled=1 gpgcheck=0
5、yum install XXX
。