普通网友 2025-11-25 16:30 采纳率: 98.6%
浏览 0
已采纳

如何查看Ubuntu系统中已安装的软件?

如何在Ubuntu系统中查看已安装的软件包?使用`dpkg -l`命令可列出所有通过APT安装的软件包,但输出信息较多,如何筛选出特定软件或理解各列含义?此外,`apt list --installed`和`snap list`分别适用于APT和Snap包管理器,但用户常混淆二者适用场景。如何整合不同包管理工具的结果,准确获取系统中全部已安装软件?
  • 写回答

1条回答 默认 最新

  • 蔡恩泽 2025-11-25 16:33
    关注

    如何在Ubuntu系统中查看已安装的软件包

    在现代Linux系统管理中,掌握软件包的安装状态是系统维护、安全审计和自动化部署的基础。Ubuntu作为最广泛使用的Debian系发行版之一,支持多种包管理机制,包括传统的APT/dpkg体系以及新兴的Snap包管理系统。本文将从基础命令出发,逐步深入分析不同工具的输出结构、筛选技巧,并最终整合多源信息以获得完整的已安装软件视图。

    1. 使用 dpkg -l 查看通过 APT 安装的软件包

    dpkg 是底层Debian包管理系统,用于直接操作.deb文件。执行以下命令可列出所有已安装的软件包:

    dpkg -l

    该命令输出包含四列关键信息:

    列序名称含义
    1期望状态(Desired)期望的操作(如 i=install, r=remove)
    2当前状态(Status)实际状态(如 i=installed, n=not-installed)
    3错误标志(Error Flag)异常标记(通常为空)
    4包名软件包全名
    5版本号当前安装的版本
    6架构编译目标平台(amd64/arm64等)
    7简要描述功能说明

    例如,ii bash 5.1-2ubuntu2 amd64 GNU Bourne Again SHell 表示bash已正确安装。

    为筛选特定软件,可结合grep使用:

    dpkg -l | grep nginx

    2. 使用 apt list --installed 获取更结构化的APT包列表

    apt 是高级包管理器,提供更友好的接口。查询已安装包:

    apt list --installed

    输出格式为:package-name/version arch [installed],更适合脚本解析。

    支持正则匹配:

    apt list --installed 2>/dev/null | grep -i python

    注意:部分旧版本apt需重定向stderr以避免警告干扰。

    3. Snap 包管理器及其 list 命令

    Snap是由Canonical推出的通用Linux打包格式,具备跨发行版特性。查看Snap安装的软件:

    snap list

    输出包括Name、Version、Rev、Publisher、Notes等字段。与dpkg独立运行,不共享数据库。

    常见输出示例:

    Name       Version    Rev   Publisher   Notes
    firefox    128.0      5090  mozilla     -
    code       1.90.0     123   vscode      classic
        

    Note列中的"classic"表示经典模式权限,安全性较低但兼容性好。

    4. 整合不同包管理工具结果的综合策略

    单一命令无法覆盖全部软件来源。完整清单应合并以下三类数据:

    • APT/dpkg管理的传统.deb包
    • Snap包
    • Flatpak(如有启用)
    • 手动编译安装或AppImage等非注册程序

    推荐整合脚本如下:

    #!/bin/bash
    echo "=== APT Installed Packages ==="
    apt list --installed 2>/dev/null | tail -n +2 | cut -d'/' -f1 | sort
    
    echo ""
    echo "=== Snap Packages ==="
    snap list | awk 'NR>1 {print $1}'
    
    echo ""
    echo "=== Flatpak Applications (if any) ==="
    flatpak list --app --columns=application 2>/dev/null || echo "No Flatpak installed"

    5. 进阶分析:构建统一软件清单流程图

    为实现自动化审计,建议采用标准化流程收集信息。以下是基于Shell的决策流程:

    graph TD A[开始] --> B{检查是否root} B -- 否 --> C[提示权限不足] B -- 是 --> D[执行 dpkg -l] D --> E[过滤有效行] E --> F[调用 snap list] F --> G{是否存在 flatpak?} G -- 是 --> H[运行 flatpak list] G -- 否 --> I[跳过] H --> J[合并输出到总列表] I --> J J --> K[去重并排序] K --> L[生成JSON/CSV报告] L --> M[结束]

    6. 实际运维中的挑战与应对

    在企业环境中,常遇到以下问题:

    1. 重复条目:同一软件可能通过APT和Snap同时存在(如VSCode),需人工判断主版本。
    2. 命名差异:内核模块如linux-image-genericlinux-modules-5.15.0-xx分散显示。
    3. 隐藏包:依赖库默认列出,可用apt-mark showmanual仅显示用户显式安装的包。
    4. 性能瓶颈:大型服务器上dpkg -l耗时较长,建议配合pgrep缓存机制。
    5. 安全审计需求:需记录安装时间戳,可查询/var/log/dpkg.log获取历史记录。
    6. 容器环境干扰:Docker镜像内执行时,需区分宿主机与容器内的包状态。
    7. 第三方源污染:PPA或外部repo引入的包难以追溯,建议定期审查/etc/apt/sources.list.d/
    8. 版本漂移检测:通过定时任务对比前后两次输出,识别未经授权的变更。
    9. 国际化支持缺失:中文环境下描述字段可能出现乱码,建议设置LC_ALL=C输出标准ASCII。
    10. 自动化集成难度:CI/CD流水线中需封装为可复用模块,支持JSON输出便于下游处理。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月26日
  • 创建了问题 11月25日