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 ManagerRPM包的命名格式为:{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:查看指定包的描述信息,可用的opionlist命令。
    • 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实现统计访问日志文件中状态码大于等于400IP数量并排序

sed -n -r '/\<40[0-9]\>/p' /var/log/httpd/access_log|cut -d" " -f1 |sort|uniq -c

Q7:使用自制的yum源安装ftpopensshwgettcpdump等软件包。

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