第五周Linux 作业
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包管理功能总结以及实例应用演示。
-安装:{-i|--install} [install-options] PACKAGE_FILE...
-h:以#号来表示显示安装进度
-v,--verbose:显示安装过程中的详细信息
--test:不执行真正的安装过程,而仅报告依赖关系及冲突信息
--nodeps:或略依赖关系
--replacepkgs:覆盖安装
--force:强制安装
常用组合:-ivh , -ivvh
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE..
-U:升级或者安装
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
-F:升级
组合使用:-Uvh, -Fvh
--oldpackage: 降级:
--force:强制升级:
- 卸载:
rpm{-e|--erase}[--allmatches][--nodeps][--noscripts][--test] PACKAGE_NAME
--allmatches :卸载所有匹配指定名称的程序包的各版本
--nodeps:忽略依赖关系
--test: 测试卸载,dry run 模式
-查询:
rpm {-q|--query} [select-options] [query-options][select-options]
PACKAGE_NAME:查询指定的程序包是否安装,及其版本
-a,--all: 查询所有已经安装过的包:
rpm -qa | grep "^z" 查询以Z 开头的已经安装过的程序包
-f File:查询指定的文件由哪个程序包安装生成;
rpm -qf /etc/fstab 查询fstab 是由哪个安装包生成的。
-p, --package PACKAGE_FILE:用于实现对未安装的
--whatprovides CAPABILITY:查询指定的CAPABILITY 由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY 被哪个包所依赖;
[query-option]
--changelog:查询rpm包的change log;
rpm -q --changelog bash | less
-l,--list:查询安装生成的文件列表
rpm -ql bash | wc -l 查询bash生成的文件数量
-i,--info:程序包相关的信息,版本号,大小
rpm -qi bash :
-c,--configfigfiles:查询指定的程序包提供的配置文件
-d,--document ;查询 指定的程序包所包含的文档
--provides:列出指定的程序包提供的所有的 CAPABILITY
--R, --requires:查询指定的程序包所依赖的程序包
--scripts,查询程序包所自带的脚本片段;
rpm -ivh httpd-tools-2.4.6-80.el7.centos.x86_64.rpm
rpm -e httpd-tools-2.4.6-80.el7.centos.x86_64.rpm
3、yum的配置和使用总结以及yum私有仓库的创建。
-
yum repository: yum repo
存储了众多的rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)文件服务器: ftp:// http:// nfs:// file:/// yum 客户端: 配置文件: /etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo :为仓库的指向提供配置 仓库的定义: [repositoryID] name=Some name for this repository baseurl=url://path/to/repository/ (等号左右不要有空格) enabled={1|0} gpgcheck={1|0}: 检查是不是以gpg签名来判断这个仓库的软件是不是安全 repo_gpgcheck={1|0} 检查是不是以gpg签名来判断这个仓库是不是安全 gpgkey-URL :检查密钥文件 enablegroups:{1|0} failovermethod={roundrobin|priority}: 有多个url 的时候如何选择 ,默认是随机 cost= 开销数字,默认为1000,也就是有多个仓库时可以设定仓库的优先级 yum 命令的用法: yum [option] [command] [package...] command is one of: * install package1 [package2] [...] * update [package1] [package2] [...] * update-to [package1] [package2] [...] * update-minimal [package1] [package2] [...] * check-update * upgrade [package1] [package2] [...] * upgrade-to [package1] [package2] [...] * distribution-synchronization [package1] [package2] [...] * remove | erase package1 [package2] [...] * autoremove [package1] [...] * list [...] * info [...] * provides | whatprovides feature1 [feature2] [...] * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] * makecache [fast] * groups [...] * search string1 [string2] [...] * shell [filename] * resolvedep dep1 [dep2] [...] (maintained for legacy reasons only - use repoquery or yum provides) * localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) * localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update) * reinstall package1 [package2] [...] * downgrade package1 [package2] [...] * deplist package1 [package2] [...] * repolist [all|enabled|disabled] * repoinfo [all|enabled|disabled] * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or- distribution-synchronization> [package2] [...] * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ] * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll? back|new|sync|stats] * load-transaction [txfile] * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel] * fssnapshot [summary | list | have-space | create | delete] * fs [filters | refilter | refilter-cleanup | du] * check * help [command] 显示仓库list * repolist [all|enabled|disabled] 显示程序包 (可显示符合通配符的软件包) #yum list [all | glob_exp1] [glob_exp2] [...] List all available and installed packages. #yum list available [glob_exp1] [...] List all packages in the yum repositories available to be installed. #yum list updates [glob_exp1] [...] List all packages with updates available in the yum repositories. #yum list installed [glob_exp1] [...] List the packages specified by args. If an argument does not match the name of an available package, it is assumed to be a shell-style glob and any matches are printed. 安装程序包 * install package1 [package2] [...] 升级程序包 * update [package1] [package2] [...] 检查可用升级: check-update 卸载程序包 * remove | erase package1 [package2] [...] 查看程序包的信息 * info [...] 查看指定的特性(可以是某个文件)是由哪个程序包提供 * provides | whatprovides feature1 [feature2] [...] 清理本地缓存: * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 构建缓存: * makecache 搜索以指定的关键字搜索程序包名及summary信息: * search string1 [string2] [...] 重新安装 * reinstall package1 [package2] [...] 降级软件版本 * downgrade package1 [package2] [...] 指定包依赖的capabilities; * deplist package1 [package2] [...] 查看yum事务历史 * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll? 安装及升级本地仓库包 * localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) 包组 管理的相关命令 groupinstall group1 [ group2] [...] groupupdate group1 [ group2] [...] grouplist [hidden] [groupwildcard] [...] groupremove group1 [group2] [...] groupinfo group1 [..] search string1 [string2] [.,..]
安装以FTP 方式的私有仓库
1) yum -y install vsftp
2) mount /dev/cdrom /mnt
3) cd /mnt/Packages
cp * /var/ftp/pub
4)systemctl start vsftp
systemctl status vsftp
5)cd /var/ftp
createrepo pub
Spawning worker 0 with 3971 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
测试仓库是否可用
1)创建my.repo配置文件在/etc/yum.repos.d/
[my]
name=my
baseurl=ftp://10.0.0.128/pub
enabled=1
gpgcheck=0
priority=1
2) 清空yum 缓存
yum clean all
yum makecache
3) 查询新的Yum仓库内容
yum list all
4) 安装应用
yum install httpd
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 简介**
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。
模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。
正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!
sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
调用sed命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
**常用选项**
e command, --expression=command允许多台编辑
$ sed -e '1,5d' -e 's/test/check/' example
#(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression='s/test/check/' --expression='/love/d' example #一个比-e更好的命令是--expression。它能给sed表达式赋值。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
不输出模式空间中的内容至屏幕
-f, --filer=script-file
引导sed脚本文件名。
-r,--regexp-extended:支持使用扩展正则表达式
-i[SUFFIX],--in-place[=SUFFIX];直接编辑原文件
地址定界:
1)空地址:对全文进行处理
2)单地址:
#;指定行
/patern/:被此模式所匹配的每一行;
3)地址范围
#, #;
#,+#
#, /part1/
/part1/,/part2/
$:最后一行;
4)步进:~
1~2 所有奇数
2~2 所有偶数
编辑命令:
d: 删除命令
p:打印模式空间中的内容
a: \text: 在行后面追加文本“text",支持使用\n 实现多行追加;
I: \text :在行中间插入文本“text",支持使用\n 实现多行追加;
\# 在每一行后面添加新的行内容
c \text: 把匹配的行替换为此处指定的文本"text";
w /PATH/TO/SOMEFILE:保存模式空间中的内容到指定路径
r /PATH/TOSOMEFILE:读取指定文件的内容至当前文件被模式匹配的行后面;实现文件合并 元字符集=:为模式空间匹配到的行,打一行号;
!:条件取反:
地址定界!编辑命令
s///:查找替换,其分隔符可自行制定指定,常用的有s@@@,s###等;
替换标记;
g:全局替换;
w /PATH/TO/SOMEFILE;将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
选定行的范围:逗号
$ sed -n '/test/,/check/p' example #所有在模板test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example #打印从第五行开始到第一个包含以test开始的行之间的所有行。
$ sed '/test/,/check/s/$/sed test/' example #对于模板test和west之间的行,每行的末尾用字符串sed test替换。 编辑命令
高级命令
h:把模式空间中的内容覆盖至保持空间中
H: 把模式空间中的内容追加至保持空间中
g:把保持空间中内容覆盖至模式空间中
G:把保持空间中的内容追加至模式空间中
x: 把模式空间中的内容和保持空间中的内容互换;
n: 读取匹配到的行的下一行至模式空间中;
N:追加读取匹配好的行的下一行至模式空间中:
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例:
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' /etc/issue:在原有的每行后方添加一个空白行;
实战例子
练习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@[^/]+/?$@@'
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等软件包
yum -y install ftp opens curl wget tcpdump --enablerepo=Local Yum