龙空技术网

你不知道的rpm别样用法

虫虫安全 5606

前言:

而今兄弟们对“nginx147rpm”大体比较关怀,朋友们都想要知道一些“nginx147rpm”的相关内容。那么小编在网摘上收集了一些关于“nginx147rpm””的相关知识,希望兄弟们能喜欢,你们快快来了解一下吧!

熟悉Linux的人都可能知道rpm,而且绝大多数人可能都用过rpm命令。RPM全称Red Hat Package Manager,是红帽Linux的包管理器,也是使用最大的三个个包管理器之一,另外两个的debian系的dbpkg和Unix、BSD用的pkg。

RPM主要用来对RedHat系Linux二进制软件包管理,包括对软件包的安装、卸载、升级、更新、查询以及校验。实际上为了软件包管理,RPM在本地维护了一个rpm包数据库(RPM Database),记录了本机所有软件包的版本信息、包变化信息等。大家都用的最多的就是查询、安装和卸载,而其他功能则鲜为人知,本文虫虫就给大家介绍这些功能。

RPM包查询

RPM查询是最常用的功能之一,大家都会会用rpm -q ,rpm -q|grep查询特定的包信息,下面是一些很有用,但是可能没有用过的功能。

-i -l -f,查询包文件信息

这几个选项用来查找某安装包和文件够成的信息。-i表示某安装包的概述信息,比如我们搜索nginx的信息用rpm -qi nginx

如上图,信息包括了软件名、Relocations,版本、发行商、发布时间、编译时间、安装时间,编译主机名,包大小、授权信息、组、源RPM、数字签名、URL、概述、描述等信息。如果我们要列出某包安装后文件列表使用-l选项:

如果我们知道某个命令,想要查找它是通过哪个安装包安装,用-f加文件绝对路径来查找,比如要找lsof的安装包:

其他查询比较常见,我们不在赘述。下面我们说几个很少用,但是很有用的popt指令

--last,查询最近安装包

该语句可以按照时间顺序列出最近安装的包,结合重定向到head可以查找到最近安装包,比如最近安装的10个包。

rpm -qa --last|head -n 10

该语句非常有用,如果你的系统发生异常,被黑或者别人修改过,可以用他来找出来别人安装什么软件,可以做为证据或者进一步排查的依据。

--scripts,查询安装包附带的脚本

该语句,可以列出程序包中附带的的脚本,比如安装脚本、卸载脚本,启动项脚本等。比如我们查找nginx包中附带的安装脚本,如下:

上图中可见,安装中先增加了nginx组和nginx用户,然后用chkconfig注册了nginx服务。

接着创建了nginx日志目录和文件。然后是卸载脚本,卸载脚本中停止nginx服务,注销nginx启动项目。该命令非常有用,善用之可以学习很多shell脚本。

--changelog,安装包的变更历史

该语句可以列出软件包的整个变更历史,尤其在更新打包后,可以让我们了解其补丁包的安装情况,比如某些安全补丁包有没有安装过没有,比如openssl曾经暴露的心脏出血漏洞Heartbleed,CVE编号:CVE-2014-0160。我们就可以利用—changelog搜索当前版本是否已经打过该漏洞的补丁包。

rpm -q --changelog openssl|grep CVE-2014-0160

可以见我们已经安装过这个补丁了。查看其详细列表,可见是在1.0.1e-23解决的。

--requires,包依赖查询

该语句可以列出软件包安装所依赖的各种包及其最小版本。比如nginx的依赖

rpm -q --requires nginx,结果如下(列出部分):

--provides,被其他包依赖的情况

该语句可以列出,本软件包被其他软件依赖的情况,比如当你计划要升级或者删除某个包时候,可以用该语句查查其他包对它的依赖项,然后再决定下一步的操作,免得影响其他软件。比如nginx包:

RPM包验证

RPM数据库还提供包验证的功能,可以用来发现原始安装包变化情况。包验证的

-V包文件变化校验

基本命令是rpm -V。比如查询验证nginx包可以用rpm -V nginx:

上面列出了nginx包安装后对default.conf文件的大小,md5哈希值,文件修改时间都有过变化。这些由列表前面的位属性表示,.表示属性正常,其他标志表示属性有变化。如果文件被删除,则会提示"missing xxxx",属性参数表示见下表:

上图中注意到中间位还有个字母c标志,该标志用来表示文件具体属性,c表示文件为配置文件。

c %config 配置文件

d %doc 说明文档

g %ghost 不应包含的文档,如果有可能有问题

l %license 授权文件

r %readme readme说明

包文件删除过的显示如下:

-aV系统变化过的包文件

-V选项增加-a就可以列出当前系统中安装后,所有变化过的包文件,可以以此来检查文件包的完整性,安全性等。比如我们检查下bin目录中变化过的文件:

-K安装包校验

对于RPM安装包,下载的同时为了保证包的完整性质,防止由于下载或者被篡改等原因导致包变化,可以使用包校验来校验其完整性,校验需要下载安装包同时也一并下载校验的哈希包(md5,sha1,sha256等)校验文件。包安装数字校验使用-K 命令或者--checksig:

OK表示校验通过。增加-v可以显示更多的信息:

显示了sha1 和md5的哈希校验值。

RPM数据库维护

前面我介绍了很多功能,这些功能都是建立在RPM数据的基础上,所以维护RPM数据的准确可信非常重要。最后我们就来介绍下RPM数据库的构成及其维护。

RPM数据库构成

RPM数据库是有文件组成的数据结构,数据库位于"/var/lib/rpm"目录,数据文件格式为Berkeley DB,使用file命令就可以列出其格式:

由上图所示,除了四个__db.00数字的可执行文件外,其他数据都是Berkeley DB 哈希表。这些数据文件对应于不同的rpm查询命令,比如Name文件就是rpm -q 包名的查询,文件保存所有包名称,其他文件也类似。如果这些文件被删除,则rpm的对应功能项就不能执行,甚至安装卸载等功能都会有问题。

数据库备份

RPM数据库备份相当简单,只需对该目录进行备份即可:

tar cvfz RPMDB-20190429.tar.gz /var/lib/rpm

可以用cron计划任务定期备份,使用rsync同步到异地存储,就可以万无一失了。

数据库恢复--rebulddb

如果数据被破话出现问题,可使用数据重建--rebulddb命令恢复。注意重建之前一定注意备份数据,备份数据,备份数据库!重要的事情说三遍!

备份RPM数据库后,可以使用下面方法重建恢复数据库:

移除 /var/lib/rpm/__db* 文件:

mkdir /tmp/rpmdb

mv /var/lib/rpm/__db* /tmp/rpmdb

然后执行rpm --rebuilddb

添加-vv可以显示具体详细过程:

如果重建出现问题,没有成功,则需要移除整个/var/lib/rpm 文件夹再试。如果还不行,则可能数据库出现大问题了,则需要重新生成RPM数据了:

新建一个目录重建数据库:

rpm --initdb --dbpath /rpm/rpmdb

在目录下,再执行重构数据库命令:

rpm --rebuilddb

结束语

RPM大家最熟悉,但是又很陌生的一个命令。熟悉的是常用的安装卸载操作,陌生的一些鲜为人知,但却十分有用的功能,尤其在安全检测和审计方面。本文我们介绍了这些鲜为人知但非常有用的命令,并且实例介绍他们的使用,最后我们介绍了RPM数据库急切备份、恢复修复的操作。

标签: #nginx147rpm #nginx依赖的rpm #rpm签名