7.4 Linux rpm查询软件包命令(-q、-qa、-i、-p、-l、-f、-R)
7.4.1 rpm -q:查询软件包是否安装
[root@CncLucZK ~]# rpm -q 包名 #-q 表示查询,是 query 的首字母。
注意这里使用的是包名,而不是包全名。因为已安装的软件包只需给出包名,系统就可以成功识别(使用包全名反而无法识别)。
7.4.2 rpm -qa:查询系统中所有安装的软件包
- 使用 rpm 查询 Linux 系统中所有已安装软件包的命令为:
[root@CncLucZK ~]# rpm -qa
[root@CncLucZK mnt]# rpm -qa
mtr-0.92-1.el8.x86_64
trousers-lib-0.3.14-2.el8.x86_64
geolite2-country-20180605-1.el8.noarch
。。。
- 此外,这里还可以使用管道符查找出需要的内容,相比
rpm -q 包名
命令,采用这种方式可以找到含有包名的所有软件包。比如:
[root@CncLucZK ~]# rpm -qa | grep httpd
httpd-devel-2.2.15-15.el6.centos.1.i686
httpd-tools-2.2.15-15.el6.centos.1.i686
...
7.4.3 rpm -qi:查询软件包的详细信息
- 通过 rpm 命令可以查询软件包的详细信息,命令格式如下:
[root@CncLucZK ~]# rpm -qi 包名 #-i 选项表示查询软件信息,是 information 的首字母。
- 想查看 apache 包的详细信息,可以使用如下命令:
[root@CncLucZK mnt]# rpm -qi httpd
Name : httpd
Version : 2.4.37
Release : 30.module_el8.3.0+561+97fdbbcc
Architecture: x86_64
Install Date: Fri 11 Dec 2020 04:19:47 PM CST
Group : System Environment/Daemons
Size : 5118331
License : ASL 2.0
Signature : RSA/SHA256, Wed 04 Nov 2020 12:00:44 PM CST, Key ID 05b555b38483c65d
Source RPM : httpd-2.4.37-30.module_el8.3.0+561+97fdbbcc.src.rpm
Build Date : Wed 04 Nov 2020 11:21:28 AM CST
Build Host : x86-02.mbox.centos.org
Relocations : (not relocatable)
Packager : CentOS Buildsys <bugs@centos.org>
Vendor : CentOS
URL : https://httpd.apache.org/
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
[root@CncLucZK ~]# rpm -qip 包全名 #-p 选项表示查询未安装的软件包,是 package 的首字母。
- 注意,这里用的是包全名,且未安装的软件包需使用“绝对路径+包全名”的方式才能确定包。
7.4.4 rpm -ql:命令查询软件包的文件列表
- rpm 软件包通常采用默认路径安装,各安装文件会分门别类安放在适当的目录文件下。使用 rpm 命令可以查询到已安装软件包中包含的所有文件及各自安装路径,命令格式为:
[root@CncLucZK ~]# rpm -ql 包名
[root@CncLucZK mnt]# rpm -ql httpd
/etc/httpd/conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
....
-同时,rpm 命令还可以查询未安装软件包中包含的所有文件以及打算安装的路径,命令格式如下:
[root@CncLucZK ~]# rpm -qlp 包全名 #-p 选项表示查询未安装的软件包信息,是 package 的首字母。
注意,由于软件包还未安装,因此需要使用“绝对路径+包全名”的方式才能确定包。
- 比如,我们想查看 bing 软件包(未安装,绝对路径为:/mnt/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm)中的所有文件及各自打算安装的位置,可以执行如下命令:
[root@CncLucZK ~]# rpm -qlp /mnt/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm
7.4.5 rpm -qf:命令查询系统文件属于哪个RPM包
- rpm -ql 命令是通过软件包查询所含文件的安装路径,rpm 还支持反向查询,即查询某系统文件所属哪个 RPM 软件包。其命令格式如下:
[root@CncLucZK ~]# rpm -qf 系统文件名 #-f 选项的含义是查询系统文件所属哪个软件包,是 file 的首字母。
注意,只有使用 RPM 包安装的文件才能使用该命令,手动方式建立的文件无法使用此命令。
- 例如,查询 ls 命令所属的软件包,可以执行如下命令:
[root@CncLucZK mnt]# rpm -qf /bin/ls
coreutils-8.30-6.el8.x86_64
7.4.6 rpm -qR:查询软件包的依赖关系
- 使用 rpm 命令安装 RPM 包,需考虑与其他 RPM 包的依赖关系。rpm -qR 命令就用来查询某已安装软件包依赖的其他包,该命令的格式为:
[root@CncLucZK ~]# rpm -qR 包名 #-R(大写)选项的含义是查询软件包的依赖性,是 requires 的首字母。
- 例如,查询 apache 软件包的依赖性,可执行以下命令:
[root@CncLucZK mnt]# rpm -qR httpd
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/etc/mime.types
config(httpd) = 2.4.37-30.module_el8.3.0+561+97fdbbcc
httpd-filesystem
httpd-filesystem = 2.4.37-30.module_el8.3.0+561+97fdbbcc
[root@CncLucZK ~]# rpm -qRp /mnt/Packages/XXX-9.8.2-0.10.rc1.el6.i686.rpm
/bin/bash
/bin/sh
XXX-libs = 32:9.8.2-0.10.rc1.el6
注意,这里使用的也是“绝对路径+包全名”的方式。
7.5 Linux RPM包验证和数字证书(数字签名)
- 执行
rpm -qa
命令可以看到,Linux 系统中装有大量的 RPM 包,且每个包都含有大量的安装文件。因此,为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题,Linux 提供了以下两种监控(检测)方式:
- RPM 包校验:其实就是将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改。
- RPM 包数字证书校验:用来校验 RPM 包本身是否被修改。
7.5.1 Linux RPM 包校验
- RPM 包校验可用来判断已安装的软件包(或文件)是否被修改,此方式可使用的命令格式分为以下 3 种。
[root@CncLucZK ~]# rpm -Va #-Va 选项表示校验系统中已安装的所有软件包。
[root@CncLucZK ~]# rpm -V 已安装的包名 #-V 选项表示校验指定 RPM 包中的文件,是 verity 的首字母。
[root@CncLucZK ~]# rpm -Vf 系统文件名 #-Vf 选项表示校验某个系统文件是否被修改。
- 例如我们校验 apache 软件包中所有的安装文件是否被修改,可执行如下命令:
[root@CncLucZK -]# rpm -V httpd
- 可以看到,执行后无任何提示信息,表明所有用 apache 软件包安装的文件均未改动过,还和从原软件包安装的文件一样。
- 接下来尝试对 apache 的配置文件 /etc/httpd/conf/httpd.conf 做适当修改,修改格式如下:
[root@CncLucZK ~]#vim /etc/httpd/conf/httpd.conf
...省略部分内容...
Directorylndex index.html index.html.var index.php
#这句话是定义apache可以识别的默认网页文件名。在后面加入了index.php
#这句话大概有400行左右
…省略部分内容...
- 由于我们还未学习如何配置 apache,为防止其崩溃,这里仅尝试修改 apache 的默认网页文件。按照以上格式对文件进行修改后保存退出,再次使用
rpm -V
命令对 apache 软件包进行验证:
[root@CncLucZK ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
注意,并非所有对文件做修改的行为都是恶意的。通常情况下,对配置文件做修改是正常的,比如说配置 apache 就要修改其配置文件,而如果验证信息提示对二进制文件做了修改,这就需要小心,除非是自己故意修改的。
7.5.2 Linux RPM数字证书验证
- RPM 包校验方法只能用来校验已安装的 RPM 包及其安装文件,如果 RPM 包本身就被动过手脚,此方法将无法解决问题,需要使用 RPM 数字证书验证方法。
简单的理解,RPM 包校验其实就是将现有安装文件与最初使用 RPM 包安装时的初始文件进行对比,如果有改动则提示给用户,因此这种方式无法验证 RPM 包本身被修改的情况。
数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 RPM 包做了修改,此包携带的数字证书也会改变,将无法与系统成功匹配,软件无法安装。
可以将数字证书想象成自己的签名,是不能被模仿的(厂商的数字证书是唯一的),只有我认可的文件才会签名(只要是厂商发布的软件,都符合数字证书验证);如果我的文件被人修改了,那么我的签名就会变得不同(如果软件改变,数字证书就会改变,从而通不过验证。当然,现实中人的手工签名不会直接改变,所以数字证书比手工签名还要可靠)。
#系统中的数字证书位置
[root@CncLucZK /]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-8
-r--r--r-- 1 root root 1683 Dec 11 2020 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-8
[root@CncLucZK ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
--import表示导入数字证书
[root@CncLucZK ~]# rpm -qa|grep gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3
[root@CncLucZK ~]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
#查询数字证书包的详细信息
Name : gpg-pubkey
Relocations: (not relocatable)
Version : c105b9de Vendor: (none)
Architecture: (none)
Install Date: Tue 10 Dec 2019 11:21:09 AM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Wed 05 Jun 2019 10:17:31 PM CST
Build Host : localhost
Relocations : (not relocatable)
…省略部分输出…
-----END PGP PUBLIC KEY BLOCK----
[root@CncLucZK ~]# rpm -e gpg-pubkey-c105b9de-4ead3a3
参考文献:
Linux rpm命令查询软件包
下一篇:Linux学习-18-提取RPM包文件(cpio命令)