侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux rpmquery命令教程:查询 RPM 包的信息(附实例详解和注意事项)

Linux rpmquery 命令介绍

rpmquery(Query RPM Package Manager)是一个用来查询 RPM 数据库的命令,它可以显示已安装或未安装的 RPM 包的信息,如名称、版本、描述、依赖关系、文件列表等。rpmquery 命令是 rpm 命令的一个别名,它相当于 rpm -q 命令。

Linux rpmquery 命令适用的 Linux 版本

rpmquery 命令适用于基于 RPM 的 Linux 发行版,如 RedHat/CentOS、Fedora、openSUSE、Mandriva、Mageia 等。如果您使用的是其他类型的 Linux 发行版,您可能需要安装 RPM 包管理器或使用其他的查询命令,如 dpkg-query、pacman -Q 等。您可以参考下面的安装命令:

# 对于基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
sudo apt-get install rpm

# 对于基于 yum 的发行版(如 RedHat,CentOS 7 等):
sudo yum install rpm

# 对于基于 dnf 的发行版(如 Fedora,CentOS 8 等):
sudo dnf install rpm

# 对于基于 apk 的发行版(如 Alpine Linux):
sudo apk add --update rpm

# 对于基于 pacman 的发行版(如 Arch Linux):
sudo pacman -S rpm-tools

# 对于基于 zypper 的发行版(如 openSUSE):
sudo zypper in rpm

# 对于基于 pkg 的 FreeBSD 发行版
sudo pkg install rpm4

# 对于基于 pkg 的 OS X/macOS 发行版:
brew install rpm

Linux rpmquery 命令的基本语法

rpmquery 命令的基本语法格式如下:

rpmquery [选项] [参数]

其中,选项可以用来指定查询的模式、格式、条件等,参数可以是一个或多个 RPM 包的名称、文件名、触发器、提供者等。

Linux rpmquery 命令的常用选项或参数说明

rpmquery 命令的常用选项或参数说明如下表所示,选项列举要全面,按照字母顺序排序,如果大于 20 个选项,则选择 20 个最常用的:

选项说明
-a查询所有已安装的 RPM 包
-c查询 RPM 包的配置文件
-d查询 RPM 包的文档文件
-f查询指定文件属于哪个 RPM 包
-i查询 RPM 包的基本信息
-l查询 RPM 包的文件列表
-p查询未安装的 RPM 包
-q指定查询模式,可以省略
-R查询 RPM 包的依赖关系
-s查询 RPM 包的文件状态
--changelog查询 RPM 包的变更日志
--dbpath指定 RPM 数据库的路径
--queryformat指定查询的输出格式
--scripts查询 RPM 包的脚本
--triggers查询 RPM 包的触发器
--whatprovides查询提供指定功能的 RPM 包
--whatrequires查询需要指定功能的 RPM 包

Linux rpmquery 命令实例详解

实例 1:查询所有已安装的 RPM 包

使用 -a 选项可以查询所有已安装的 RPM 包,输出结果按照名称、版本、发行版的顺序排列,每行显示一个 RPM 包的信息。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -a
acl-2.2.53-1.el8.x86_64
audit-libs-3.0-0.17.20191104git1c2f876.el8.x86_64
basesystem-11-5.el8.noarch
bash-4.4.19-12.el8.x86_64
...
zlib-1.2.11-17.el8.x86_64
zstd-1.4.9-1.el8.x86_64

实例 2:查询 RPM 包的基本信息

使用 -i 选项可以查询 RPM 包的基本信息,如名称、版本、大小、描述、许可证、签名等。如果不指定参数,则查询所有已安装的 RPM 包的信息,如果指定参数,则查询指定的 RPM 包的信息,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -i bash
Name        : bash
Version     : 4.4.19
Release     : 12.el8
Architecture: x86_64
Install Date: Mon 25 Jan 2021 10:23:15 AM CST
Group       : Unspecified
Size        : 6628416
License     : GPLv3+

...

interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

实例 3:查询 RPM 包的文件列表

使用 -l 选项可以查询 RPM 包的文件列表,即 RPM 包中包含的所有文件和目录的路径。如果不指定参数,则查询所有已安装的 RPM 包的文件列表,如果指定参数,则查询指定的 RPM 包的文件列表,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -l bash
/bin/bash
/bin/sh
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
...

实例 4:查询 RPM 包的依赖关系

使用 -R 选项可以查询 RPM 包的依赖关系,即 RPM 包需要的其他 RPM 包或功能。如果不指定参数,则查询所有已安装的 RPM 包的依赖关系,如果指定参数,则查询指定的 RPM 包的依赖关系,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -R bash
/bin/sh
config(bash) = 4.4.19-12.el8
glibc >= 2.15-103
...
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

实例 5:查询指定文件属于哪个 RPM 包

使用 -f 选项可以查询指定文件属于哪个 RPM 包,即反向查询文件的来源。参数可以是一个或多个文件的路径,如果文件不存在或不属于任何 RPM 包,则会显示错误信息。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -f /bin/bash
bash-4.4.19-12.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery -f /bin/ls
coreutils-8.30-8.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery -f /bin/foo
file /bin/foo is not owned by any package

实例 6:查询未安装的 RPM 包

使用 -p 选项可以查询未安装的 RPM 包,即从 RPM 包文件中获取信息,而不是从 RPM 数据库中获取。参数必须是一个或多个 RPM 包文件的路径,如果文件不存在或不是有效的 RPM 包,则会显示错误信息。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -p /tmp/nginx-1.20.1-1.el8.ngx.x86_64.rpm
nginx-1.20.1-1.el8.ngx.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery -p /tmp/nginx-1.20.1-1.el8.ngx.x86_64.rpm -i
Name        : nginx
Version     : 1.20.1
Release     : 1.el8.ngx
Architecture: x86_64
...
Summary     : High performance web server
Description :
nginx [engine x] is an HTTP and reverse proxy server, as well as
a mail proxy server.

实例 7:查询 RPM 包的配置文件

使用 -c 选项可以查询 RPM 包的配置文件,即 RPM 包中标记为配置文件的文件,这些文件通常是可以被用户修改的。如果不指定参数,则查询所有已安装的 RPM 包的配置文件,如果指定参数,则查询指定的 RPM 包的配置文件,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -c bash
/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

实例 8:查询 RPM 包的文档文件

使用 -d 选项可以查询 RPM 包的文档文件,即 RPM 包中标记为文档文件的文件,这些文件通常是 README、LICENSE、MANUAL 等。如果不指定参数,则查询所有已安装的 RPM 包的文档文件,如果指定参数,则查询指定的 RPM 包的文档文件,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -d bash
/usr/share/doc/bash/CHANGES
/usr/share/doc/bash/COMPAT
/usr/share/doc/bash/FAQ
...
/usr/share/man/man1/bash.1.gz
/usr/share/man/man1/bashbug.1.gz

实例 9:查询 RPM 包的文件状态

使用 -s 选项可以查询 RPM 包的文件状态,即 RPM 包中的文件是否被修改过,以及修改的类型。如果不指定参数,则查询所有已安装的 RPM 包的文件状态,如果指定参数,则查询指定的 RPM 包的文件状态,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery -s bash
normal        /bin/bash
normal        /bin/sh
normal        /etc/skel/.bash_logout
...
normal        /usr/share/man/man1/bash.1.gz
normal        /usr/share/man/man1/bashbug.1.gz

实例 10:查询 RPM 包的变更日志

使用 --changelog 选项可以查询 RPM 包的变更日志,即 RPM 包的更新历史和修复记录。如果不指定参数,则查询所有已安装的 RPM 包的变更日志,如果指定参数,则查询指定的 RPM 包的变更日志,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --changelog bash
* Tue Nov 03 2020 Ondrej Oprala <ooprala@redhat.com> - 4.4.19-12
- Fix CVE-2019-18276

* Wed Oct 28 2020 Ondrej Oprala <ooprala@redhat.com> - 4.4.19-11
- Fix CVE-2019-18276

...

实例 11:查询 RPM 包的脚本

使用 --scripts 选项可以查询 RPM 包的脚本,即 RPM 包中包含的在安装、升级或卸载时执行的脚本。如果不指定参数,则查询所有已安装的 RPM 包的脚本,如果指定参数,则查询指定的 RPM 包的脚本,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --scripts bash
preinstall scriptlet (using /bin/sh):
# Add the 'bash' group to /etc/group, if it doesn't already exist:
if ! grep -q '^bash:' /etc/group 2>/dev/null; then
  groupadd -g 12 -r bash 2>/dev/null || \
  groupadd -r bash 2>/dev/null
fi

postinstall scriptlet (using /bin/sh):
# Add /bin/bash as a valid shell to /etc/shells, if it doesn't already exist:
if ! grep -q '^/bin/bash$' /etc/shells 2>/dev/null; then
  echo '/bin/bash' >> /etc/shells
fi

preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
  # Remove /bin/bash as a valid shell from /etc/shells, if it exists:
  if grep -q '^/bin/bash$' /etc/shells 2>/dev/null; then
    sed -i '/^\/bin\/bash$/d' /etc/shells
  fi
fi

实例 12:查询 RPM 包的触发器

使用 --triggers 选项可以查询 RPM 包的触发器,即 RPM 包中包含的在其他 RPM 包被安装、升级或卸载时触发的脚本。如果不指定参数,则查询所有已安装的 RPM 包的触发器,如果指定参数,则查询指定的 RPM 包的触发器,参数可以是已安装或未安装的 RPM 包的名称或文件名。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --triggers glibc
triggerin scriptlet (using /bin/sh) -- ldconfig < 2.17-55
/sbin/ldconfig
/sbin/ldconfig -X

triggerun scriptlet (using /bin/sh) -- ldconfig < 2.17-55
/sbin/ldconfig
/sbin/ldconfig -X

实例 13:查询提供指定功能的 RPM 包

使用 --whatprovides 选项可以查询提供指定功能的 RPM 包,即反向查询功能的来源。参数可以是一个或多个功能的名称,如果功能不存在或不属于任何 RPM 包,则会显示错误信息。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --whatprovides /bin/bash
bash-4.4.19-12.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery --whatprovides /bin/ls
coreutils-8.30-8.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery --whatprovides /bin/foo
no package provides /bin/foo

实例 14:查询需要指定功能的 RPM 包

使用 --whatrequires 选项可以查询需要指定功能的 RPM 包,即正向查询功能的依赖。参数可以是一个或多个功能的名称,如果功能不存在或不被任何 RPM 包需要,则会显示错误信息。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --whatrequires /bin/bash
/bin/sh
bash-completion-2.7-5.el8.noarch
coreutils-8.30-8.el8.x86_64
...
util-linux-2.32.1-24.el8.x86_64
vim-minimal-8.0.1763-15.el8.x86_64
yum-4.2.23-4.el8.noarch
[linux@bashcommandnotfound.cn ~]$ rpmquery --whatrequires /bin/ls
coreutils-8.30-8.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery --whatrequires /bin/foo
no package requires /bin/foo

实例 15:指定查询的输出格式

使用 --queryformat 选项可以指定查询的输出格式,即自定义查询的结果的显示方式。参数可以是一个或多个格式字符串,格式字符串可以包含 RPM 包的属性的标签,如 %{NAME}、%{VERSION}、%{SIZE} 等,也可以包含一些转义字符,如 \n、\t、\x 等。例如:

[linux@bashcommandnotfound.cn ~]$ rpmquery --queryformat "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" bash
bash-4.4.19-12.el8.x86_64
[linux@bashcommandnotfound.cn ~]$ rpmquery --queryformat "%{NAME}\t%{SIZE}\n" -a | sort -k2 -n -r | head
kernel-core	 68960256
kernel-modules	 27901696
kernel	 1536000
glibc	 1496064
java-11-openjdk-headless	 1454080
libreoffice-core	 1177600
glibc-common	 1155072
libreoffice-calc	 1024000
libreoffice-writer	 921600
libreoffice-impress	 819200

Linux rpmquery 命令的注意事项

Linux rpmquery 命令的注意事项如下:

  • rpmquery 命令只能查询 RPM 包的信息,不能对 RPM 包进行安装、升级、卸载等操作,如果需要这些功能,可以使用 rpm 命令或 yum 命令。
  • rpmquery 命令的查询结果可能会受到 RPM 数据库的影响,如果 RPM 数据库损坏或不一致,可能会导致查询结果不准确或出现错误,如果遇到这种情况,可以使用 rpm --rebuilddb 命令来重建 RPM 数据库。
  • rpmquery 命令的查询结果可能会受到 RPM 包的签名的影响,如果 RPM 包的签名不被信任或无效,可能会导致查询结果不完整或出现警告,如果遇到这种情况,可以使用 rpm --import 命令来导入 RPM 包的签名或使用 --nosignature 选项来忽略 RPM 包的签名。
  • rpmquery 命令的查询结果可能会受到 RPM 包的版本的影响,如果 RPM 包的版本与系统的版本不匹配,可能会导致查询结果不兼容或出现错误,如果遇到这种情况,可以使用 --force 选项来强制查询 RPM 包的信息,但不建议这样做,因为可能会导致系统的不稳定或损坏。
  • 如果在查询 RPM 包的信息时出现 bash: rpmquery: command not found 的错误,说明 rpmquery 命令没有安装或没有在 PATH 环境变量中,可以按照上面的安装命令来安装 rpmquery 命令,或者使用 rpm -q 命令来代替 rpmquery 命令。
0

评论区