Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux查看已安装软件

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

作者: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

其中:

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
...

进阶建议:

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

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

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

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

功能包括:

可用 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查看已安装软件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文