Linux查看系统已安装软件的多种方法

 更新时间:2026年03月13日 09:49:28   作者:Jinkxs  
在 Linux 系统中,查看已安装的软件包是一项基础但极其重要的技能,无论是系统管理员、开发人员,还是普通用户,掌握如何查询当前系统上已安装的软件,都能帮助我们更好地管理环境,本文将从多个维度深入探讨 Linux 下查看已安装软件的方法,需要的朋友可以参考下

在 Linux 系统中,查看已安装的软件包是一项基础但极其重要的技能。无论是系统管理员、开发人员,还是普通用户,掌握如何查询当前系统上已安装的软件,都能帮助我们更好地管理环境、排查依赖冲突、进行安全审计或迁移配置。本文将从多个维度深入探讨 Linux 下查看已安装软件的方法,涵盖主流发行版(如 Ubuntu/Debian、CentOS/RHEL、Fedora、Arch Linux 等)的命令行工具、图形界面方式、编程接口调用(含 Java 示例)、自动化脚本编写、输出格式处理等内容,并辅以 mermaid 图表和实用外链,助你全面掌握这一核心技能。

一、为什么需要查看已安装软件?

在深入技术细节之前,我们先明确“为什么要查看已安装软件”。

  • 系统维护:定期检查已安装软件可避免冗余包堆积,释放磁盘空间。
  • 🔍 安全审计:确认是否存在过时或存在漏洞的软件包。
  • 🔄 环境迁移:备份当前软件列表,便于在新机器上快速重建相同环境。
  • ⚙️ 依赖管理:了解某个软件是否已安装,避免重复安装或解决依赖缺失问题。
  • 📊 合规性检查:企业环境中需确保只安装授权或合规软件。

小贴士:在生产环境中,建议将软件清单纳入版本控制或配置管理系统(如 Ansible、Puppet),实现自动化追踪。

二、不同 Linux 发行版的包管理器概览

Linux 世界百花齐放,不同发行版采用不同的包管理系统。以下是主流发行版及其对应的包管理器:

发行版系列包管理器命令软件包格式
Debian / Ubuntuapt, dpkg.deb
Red Hat / CentOSyum, dnf, rpm.rpm
Fedoradnf, rpm.rpm
openSUSEzypper, rpm.rpm
Arch Linuxpacman.pkg.tar.zst
Gentooemerge源码编译

我们将分别介绍它们如何查看已安装软件。

三、Debian / Ubuntu 系统:APT 与 DPKG

1. 使用dpkg -l

dpkg 是底层的 Debian 包管理工具,可列出所有已安装的 .deb 包:

dpkg -l

输出示例:

ii  vim          2:8.2.3995-1ubuntu2.4  amd64  Vi IMproved - enhanced vi editor
ii  curl         7.81.0-1ubuntu1.10    amd64  command line tool for transferring data with URL syntax

其中:

  • ii 表示“已安装且配置完成”
  • 第二列为包名
  • 第三列为版本号
  • 第四列为架构
  • 第五列为简要描述

2. 使用apt list --installed

更现代的方式是使用 apt 命令:

apt list --installed

该命令输出更简洁,适合脚本处理:

vim/now 2:8.2.3995-1ubuntu2.4 amd64 [installed,local]
curl/now 7.81.0-1ubuntu1.10 amd64 [installed,local]

3. 搜索特定软件

若只想查找某个软件是否安装:

dpkg -l | grep nginx
apt list --installed | grep python3

4. 导出软件列表

备份当前环境非常有用:

dpkg --get-selections > installed_packages.txt

恢复时:

sudo dpkg --set-selections < installed_packages.txt
sudo apt-get dselect-upgrade

四、RHEL / CentOS / Fedora:YUM、DNF 与 RPM

1. 使用rpm -qa

rpm 是 Red Hat 系列的基础包管理器:

rpm -qa

输出示例:

vim-enhanced-8.0.1763-16.el7_9.x86_64
curl-7.29.0-59.el7_9.1.x86_64

可结合 grep 过滤:

rpm -qa | grep httpd

2. 使用yum list installed(旧版)

在 CentOS 7 及更早版本中:

yum list installed

3. 使用dnf list installed(新版)

Fedora 和 RHEL 8+ / CentOS Stream 推荐使用 dnf

dnf list installed

输出更结构化:

Installed Packages
Name         Version            Arch   Repository
vim-enhanced 2:8.2.3755-1.fc36  x86_64 @updates
curl         7.82.0-7.fc36      x86_64 @updates

4. 导出为文件

rpm -qa > installed_rpm_packages.txt
dnf list installed > dnf_installed_list.txt

五、openSUSE:ZYPPER

openSUSE 使用 zypper 作为主要包管理器:

zypper se --installed-only

或简写:

zypper search -i

更详细的列表:

zypper packages --installed-only

导出:

zypper packages --installed-only > suse_installed.txt

六、Arch Linux:PACMAN

Arch 用户使用 pacman

pacman -Q

仅显示包名和版本:

vim 8.2.4840-1
curl 7.83.1-1

查看详细信息:

pacman -Qi vim

导出所有包:

pacman -Qq > arch_packages.txt

七、跨平台通用方法:Snap、Flatpak、AppImage

除了系统原生包管理器,现代 Linux 也支持通用打包格式:

1. Snap

snap list

输出:

Name    Version    Rev    Tracking       Publisher   Notes
code    1.78.2     123    latest/stable  vscode✓     classic

2. Flatpak

flatpak list

3. AppImage

AppImage 无需安装,通常放在 ~/Applications~/bin,无统一管理命令,需手动管理。

八、可视化 mermaid 图表:Linux 包管理器生态关系图

下面是一个展示不同发行版与其包管理器之间关系的图表:

此图展示了主流发行版与其对应的包管理器及包格式之间的层级关系,有助于理解整个 Linux 软件分发生态。

九、Java 代码示例:通过 Runtime 执行命令获取已安装软件列表

有时我们需要在 Java 应用中动态获取系统已安装的软件信息,比如用于环境检测、日志记录或配置同步。以下是一个完整的 Java 示例程序,它会根据当前操作系统类型执行相应的 shell 命令,并输出结果。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class LinuxPackageChecker {
    public static void main(String[] args) {
        System.out.println("🔍 正在检测当前系统并获取已安装软件列表...");
        String os = System.getProperty("os.name").toLowerCase();
        if (!os.contains("linux")) {
            System.err.println("❌ 当前系统不是 Linux,无法执行包管理命令。");
            return;
        }
        String packageManagerCmd = detectPackageManager();
        if (packageManagerCmd == null) {
            System.err.println("⚠️  未识别到支持的包管理器。");
            return;
        }
        System.out.println("✅ 检测到包管理器命令:" + packageManagerCmd);
        List<String> installedPackages = executeCommand(packageManagerCmd);
        if (installedPackages.isEmpty()) {
            System.out.println("📭 未获取到任何已安装软件。");
        } else {
            System.out.println("📦 已安装软件数量:" + installedPackages.size());
            System.out.println("📋 前 10 个软件包:");
            installedPackages.stream().limit(10).forEach(System.out::println);
        }
    }
    private static String detectPackageManager() {
        // 尝试执行各包管理器命令,看哪个存在
        String[] commands = {
            "dpkg -l",           // Debian/Ubuntu
            "rpm -qa",           // RHEL/CentOS/Fedora
            "pacman -Q",         // Arch
            "zypper search -i",  // openSUSE
            "apt list --installed" // Modern Debian/Ubuntu
        };
        for (String cmd : commands) {
            try {
                ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "command -v " + cmd.split(" ")[0]);
                Process process = pb.start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = reader.readLine();
                if (line != null && !line.trim().isEmpty()) {
                    return cmd; // 返回第一个可用的命令
                }
            } catch (Exception e) {
                // 忽略异常,继续尝试下一个
            }
        }
        return null;
    }
    private static List<String> executeCommand(String command) {
        List<String> output = new ArrayList<>();
        try {
            ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", command);
            Process process = pb.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                output.add(line.trim());
            }
            int exitCode = process.waitFor();
            if (exitCode != 0) {
                System.err.println("⚠️  命令执行失败,退出码:" + exitCode);
            }
        } catch (Exception e) {
            System.err.println("❌ 执行命令时发生异常:" + e.getMessage());
            e.printStackTrace();
        }
        return output;
    }
}

运行说明:

  1. 确保在 Linux 系统下运行。
  2. 编译:javac LinuxPackageChecker.java
  3. 运行:java LinuxPackageChecker

输出示例:

🔍 正在检测当前系统并获取已安装软件列表...
✅ 检测到包管理器命令:dpkg -l
📦 已安装软件数量:1852
📋 前 10 个软件包:
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  adduser        3.118ubuntu2 all          add and remove users and groups
ii  apt            2.4.8        amd64        commandline package manager
ii  base-files     12ubuntu4.4  amd64        Debian base system miscellaneous f
...

进阶建议:

  • 可封装为工具类供其他模块调用。
  • 支持异步执行,避免阻塞主线程。
  • 增加超时机制防止命令卡死。
  • 结果可序列化为 JSON 供 API 返回。

十、进阶技巧:过滤、排序、统计与导出

1. 按名称排序

dpkg -l | sort -k2
rpm -qa | sort

2. 统计安装数量

dpkg -l | wc -l   # 注意包含标题行
dpkg -l | grep ^ii | wc -l  # 仅统计已安装的

rpm -qa | wc -l

3. 导出为 CSV 格式(适用于脚本处理)

dpkg-query -W -f='${Package},${Version},${Architecture}\n' > packages.csv

输出:

vim,2:8.2.3995-1ubuntu2.4,amd64
curl,7.81.0-1ubuntu1.10,amd64

4. 仅显示包名(无版本)

dpkg --get-selections | awk '{print $1}'
rpm -qa --queryformat '%{NAME}\n'

十一、自动化脚本:一键导出 & 对比环境差异

以下是一个 Bash 脚本,用于自动检测系统类型并导出软件列表:

#!/bin/bash

echo "🚀 开始导出已安装软件列表..."

OUTPUT_FILE="installed_packages_$(date +%Y%m%d_%H%M%S).txt"

if command -v dpkg &> /dev/null; then
    echo "📦 检测到 Debian/Ubuntu 系统"
    dpkg -l > "$OUTPUT_FILE"
elif command -v rpm &> /dev/null; then
    echo "📦 检测到 RHEL/CentOS/Fedora 系统"
    rpm -qa > "$OUTPUT_FILE"
elif command -v pacman &> /dev/null; then
    echo "📦 检测到 Arch Linux 系统"
    pacman -Q > "$OUTPUT_FILE"
elif command -v zypper &> /null; then
    echo "📦 检测到 openSUSE 系统"
    zypper search -i > "$OUTPUT_FILE"
else
    echo "❌ 未识别系统类型"
    exit 1
fi

echo "✅ 已保存至 $OUTPUT_FILE"
ls -lh "$OUTPUT_FILE"

保存为 export_packages.sh,赋予执行权限:

chmod +x export_packages.sh
./export_packages.sh

十二、常见问题与解决方案

问题1:dpkg -l输出太多,怎么找特定软件?

✅ 解决方案:使用 grep

dpkg -l | grep -i firefox

-i 表示忽略大小写。

问题2:rpm -qa显示的包名太乱,如何按字母排序?

✅ 解决方案:

rpm -qa | sort

问题3:想查看某个包是从哪个仓库安装的?

✅ 在 dnf 中:

dnf info <package_name>

apt 中:

apt show <package_name>

问题4:误删了某个包,如何找回?

✅ 使用历史记录:

# Ubuntu/Debian
cat /var/log/apt/history.log

# CentOS/Fedora
cat /var/log/dnf.log

十三、构建自己的软件清单管理系统(思路)

如果你管理多台服务器,可以考虑构建一个集中式的“软件资产清单系统”,基本架构如下:

功能包括:

  • 自动采集每台机器的软件列表
  • 版本对比(高亮过期包)
  • 安全漏洞关联(对接 CVE 数据库)
  • 变更历史追踪
  • 导出与导入功能

可用 Python + Flask + SQLite 快速搭建原型,或集成到现有监控系统(如 Zabbix、Prometheus + Grafana)。

十四、最佳实践建议

  1. 定期导出清单:建议每月或每次重大更新后导出一次。
  2. 版本控制:将导出文件纳入 Git,便于回溯变更。
  3. 自动化比对:写脚本比对两份清单差异,发现新增/移除的包。
  4. 权限最小化:非必要不使用 root 权限执行查询命令。
  5. 日志记录:重要操作应记录到系统日志(如 /var/log/)。

十五、扩展阅读:容器环境中的软件查看

在 Docker 或 Podman 容器中,查看已安装软件的方法类似,但需先进入容器:

docker exec -it <container_name> /bin/bash
# 然后执行 dpkg -l 或 rpm -qa

或者直接执行:

docker exec <container_name> dpkg -l

对于基于 Alpine 的镜像,使用 apk

docker exec <container_name> apk info

十六、结语

查看 Linux 系统中已安装的软件看似简单,实则涉及众多命令、工具和最佳实践。无论是日常维护、故障排查,还是自动化运维、安全加固,掌握这些技能都至关重要。希望本文提供的命令示例、Java 代码、脚本模板和架构思路能为你带来实质性的帮助。

记住,Linux 的强大在于其灵活性和可组合性——你可以将简单的命令通过管道、脚本、程序组合成强大的自动化工具。不断实践、积累经验,你会越来越得心应手!

Bonus Tip:在终端中设置别名,让常用命令更高效!

# 添加到 ~/.bashrc 或 ~/.zshrc
alias listpkgs='dpkg -l 2>/dev/null || rpm -qa 2>/dev/null || pacman -Q 2>/dev/null'

然后只需输入:

listpkgs | head -20

即可快速查看前 20 个包!

以上就是Linux查看系统已安装软件的多种方法的详细内容,更多关于Linux查看已安装软件的资料请关注脚本之家其它相关文章!

相关文章

  • 基于centos 6.5使用varnish实现网站动静分离

    基于centos 6.5使用varnish实现网站动静分离

    这篇文章主要介绍了基于centos6.5使用varnish实现网站动静分离,需要的朋友可以参考下
    2014-11-11
  • linux系统使用中的逻辑卷扩容详解

    linux系统使用中的逻辑卷扩容详解

    文章详细描述了如何在Linux系统中对逻辑卷(lv)进行扩容的过程,包括从扩容分区(/dev/vdb1)到扩展物理卷(pv)、卷组(vg)和逻辑卷,最后对XFS文件系统进行扩容,文章通过步骤和命令示例,为读者提供了实际操作指南
    2026-01-01
  • Linux 下sftp配置之密钥方式登录详解

    Linux 下sftp配置之密钥方式登录详解

    这篇文章主要介绍了Linux 下sftp配置之密钥方式登录详解的相关资料,为了安全性,需使用sftp,锁定目录且不允许sftp用户登到服务器,需要的朋友可以参考下
    2016-12-12
  • vscode远程开发使用SSH远程连接服务器的方法「内网穿透」

    vscode远程开发使用SSH远程连接服务器的方法「内网穿透」

    这篇文章主要介绍了vscode远程开发使用SSH远程连接服务器 「内网穿透」,通过本文学习我们将通过vscode实现远程开发,并做内网穿透实现在公网环境下的远程连接,在外任意地方也可以远程连接服务器进行开发写代码,需要的朋友可以参考下
    2023-02-02
  • 详解ubuntu安装opencv的正确方法

    详解ubuntu安装opencv的正确方法

    这篇文章主要介绍了ubuntu安装opencv的正确方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • linux服务器用centos还是ubuntu系统

    linux服务器用centos还是ubuntu系统

    两者同为目前版本中个人和小团队常用的服务级操作系统,在线提供的软件库中可以很方便的安装到很多开源的软件及库,不过问了多年维护服务器的朋友多用centos系统
    2012-12-12
  • Linux sshd_config配置手册中文版

    Linux sshd_config配置手册中文版

    sshd默认从 /etc/ssh/sshd_config 文件(或通过 -f 命令行选项指定的文件)读取配置信息。配置文件是由"指令 值"对组成的,每行一个。空行和以'#'开头的行都将被忽略。如果值中含有空白符或者其他特殊符号,那么可以通过在两边加上双引号(")进行界定
    2014-03-03
  • UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY

    UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY

    这篇文章主要介绍了UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • apache负载均衡的安装和实现方法

    apache负载均衡的安装和实现方法

    在负载均衡技术中,硬件设备是比较昂贵的,对于负载均衡的学习者如果不是在企业中应用或者是学员中学习,很少有机会能碰到实际操作的训练。所以,很多朋友都会选择软件方面的设置进行研究。现在我们就来介绍一下再Apache下的Tomcat负载均衡的一些使用问题
    2012-10-10
  • Linux服务器如何查看内存使用情况

    Linux服务器如何查看内存使用情况

    这篇文章主要介绍了Linux服务器如何查看内存使用情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06

最新评论