Linux查看系統(tǒng)已安裝軟件的多種方法
在 Linux 系統(tǒng)中,查看已安裝的軟件包是一項基礎但極其重要的技能。無論是系統(tǒng)管理員、開發(fā)人員,還是普通用戶,掌握如何查詢當前系統(tǒng)上已安裝的軟件,都能幫助我們更好地管理環(huán)境、排查依賴沖突、進行安全審計或遷移配置。本文將從多個維度深入探討 Linux 下查看已安裝軟件的方法,涵蓋主流發(fā)行版(如 Ubuntu/Debian、CentOS/RHEL、Fedora、Arch Linux 等)的命令行工具、圖形界面方式、編程接口調(diào)用(含 Java 示例)、自動化腳本編寫、輸出格式處理等內(nèi)容,并輔以 mermaid 圖表和實用外鏈,助你全面掌握這一核心技能。
一、為什么需要查看已安裝軟件?
在深入技術細節(jié)之前,我們先明確“為什么要查看已安裝軟件”。
- ? 系統(tǒng)維護:定期檢查已安裝軟件可避免冗余包堆積,釋放磁盤空間。
- ?? 安全審計:確認是否存在過時或存在漏洞的軟件包。
- ?? 環(huán)境遷移:備份當前軟件列表,便于在新機器上快速重建相同環(huán)境。
- ?? 依賴管理:了解某個軟件是否已安裝,避免重復安裝或解決依賴缺失問題。
- ?? 合規(guī)性檢查:企業(yè)環(huán)境中需確保只安裝授權或合規(guī)軟件。
小貼士:在生產(chǎn)環(huán)境中,建議將軟件清單納入版本控制或配置管理系統(tǒng)(如 Ansible、Puppet),實現(xiàn)自動化追蹤。
二、不同 Linux 發(fā)行版的包管理器概覽
Linux 世界百花齊放,不同發(fā)行版采用不同的包管理系統(tǒng)。以下是主流發(fā)行版及其對應的包管理器:
| 發(fā)行版系列 | 包管理器命令 | 軟件包格式 |
|---|---|---|
| Debian / Ubuntu | apt, dpkg | .deb |
| Red Hat / CentOS | yum, dnf, rpm | .rpm |
| Fedora | dnf, rpm | .rpm |
| openSUSE | zypper, rpm | .rpm |
| Arch Linux | pacman | .pkg.tar.zst |
| Gentoo | emerge | 源碼編譯 |
我們將分別介紹它們?nèi)绾尾榭匆寻惭b軟件。
三、Debian / Ubuntu 系統(tǒng):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表示“已安裝且配置完成”- 第二列為包名
- 第三列為版本號
- 第四列為架構(gòu)
- 第五列為簡要描述
2. 使用apt list --installed
更現(xiàn)代的方式是使用 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. 導出軟件列表
備份當前環(huán)境非常有用:
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
可結(jié)合 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
輸出更結(jié)構(gòu)化:
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
除了系統(tǒng)原生包管理器,現(xiàn)代 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,無統(tǒng)一管理命令,需手動管理。
八、可視化 mermaid 圖表:Linux 包管理器生態(tài)關系圖
下面是一個展示不同發(fā)行版與其包管理器之間關系的圖表:


此圖展示了主流發(fā)行版與其對應的包管理器及包格式之間的層級關系,有助于理解整個 Linux 軟件分發(fā)生態(tài)。
九、Java 代碼示例:通過 Runtime 執(zhí)行命令獲取已安裝軟件列表
有時我們需要在 Java 應用中動態(tài)獲取系統(tǒng)已安裝的軟件信息,比如用于環(huán)境檢測、日志記錄或配置同步。以下是一個完整的 Java 示例程序,它會根據(jù)當前操作系統(tǒng)類型執(zhí)行相應的 shell 命令,并輸出結(jié)果。
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("?? 正在檢測當前系統(tǒng)并獲取已安裝軟件列表...");
String os = System.getProperty("os.name").toLowerCase();
if (!os.contains("linux")) {
System.err.println("? 當前系統(tǒng)不是 Linux,無法執(zhí)行包管理命令。");
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("?? 已安裝軟件數(shù)量:" + installedPackages.size());
System.out.println("?? 前 10 個軟件包:");
installedPackages.stream().limit(10).forEach(System.out::println);
}
}
private static String detectPackageManager() {
// 嘗試執(zhí)行各包管理器命令,看哪個存在
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) {
// 忽略異常,繼續(xù)嘗試下一個
}
}
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("?? 命令執(zhí)行失敗,退出碼:" + exitCode);
}
} catch (Exception e) {
System.err.println("? 執(zhí)行命令時發(fā)生異常:" + e.getMessage());
e.printStackTrace();
}
return output;
}
}運行說明:
- 確保在 Linux 系統(tǒng)下運行。
- 編譯:
javac LinuxPackageChecker.java - 運行:
java LinuxPackageChecker
輸出示例:
?? 正在檢測當前系統(tǒng)并獲取已安裝軟件列表... ? 檢測到包管理器命令:dpkg -l ?? 已安裝軟件數(shù)量: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 ...
進階建議:
- 可封裝為工具類供其他模塊調(diào)用。
- 支持異步執(zhí)行,避免阻塞主線程。
- 增加超時機制防止命令卡死。
- 結(jié)果可序列化為 JSON 供 API 返回。
十、進階技巧:過濾、排序、統(tǒng)計與導出
1. 按名稱排序
dpkg -l | sort -k2 rpm -qa | sort
2. 統(tǒng)計安裝數(shù)量
dpkg -l | wc -l # 注意包含標題行 dpkg -l | grep ^ii | wc -l # 僅統(tǒng)計已安裝的 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'
十一、自動化腳本:一鍵導出 & 對比環(huán)境差異
以下是一個 Bash 腳本,用于自動檢測系統(tǒng)類型并導出軟件列表:
#!/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 系統(tǒng)"
dpkg -l > "$OUTPUT_FILE"
elif command -v rpm &> /dev/null; then
echo "?? 檢測到 RHEL/CentOS/Fedora 系統(tǒng)"
rpm -qa > "$OUTPUT_FILE"
elif command -v pacman &> /dev/null; then
echo "?? 檢測到 Arch Linux 系統(tǒng)"
pacman -Q > "$OUTPUT_FILE"
elif command -v zypper &> /null; then
echo "?? 檢測到 openSUSE 系統(tǒng)"
zypper search -i > "$OUTPUT_FILE"
else
echo "? 未識別系統(tǒng)類型"
exit 1
fi
echo "? 已保存至 $OUTPUT_FILE"
ls -lh "$OUTPUT_FILE"
保存為 export_packages.sh,賦予執(zhí)行權限:
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
十三、構(gòu)建自己的軟件清單管理系統(tǒng)(思路)
如果你管理多臺服務器,可以考慮構(gòu)建一個集中式的“軟件資產(chǎn)清單系統(tǒng)”,基本架構(gòu)如下:
功能包括:

- 自動采集每臺機器的軟件列表
- 版本對比(高亮過期包)
- 安全漏洞關聯(lián)(對接 CVE 數(shù)據(jù)庫)
- 變更歷史追蹤
- 導出與導入功能
可用 Python + Flask + SQLite 快速搭建原型,或集成到現(xiàn)有監(jiān)控系統(tǒng)(如 Zabbix、Prometheus + Grafana)。
十四、最佳實踐建議
- 定期導出清單:建議每月或每次重大更新后導出一次。
- 版本控制:將導出文件納入 Git,便于回溯變更。
- 自動化比對:寫腳本比對兩份清單差異,發(fā)現(xiàn)新增/移除的包。
- 權限最小化:非必要不使用 root 權限執(zhí)行查詢命令。
- 日志記錄:重要操作應記錄到系統(tǒng)日志(如
/var/log/)。
十五、擴展閱讀:容器環(huán)境中的軟件查看
在 Docker 或 Podman 容器中,查看已安裝軟件的方法類似,但需先進入容器:
docker exec -it <container_name> /bin/bash # 然后執(zhí)行 dpkg -l 或 rpm -qa
或者直接執(zhí)行:
docker exec <container_name> dpkg -l
對于基于 Alpine 的鏡像,使用 apk:
docker exec <container_name> apk info
十六、結(jié)語
查看 Linux 系統(tǒng)中已安裝的軟件看似簡單,實則涉及眾多命令、工具和最佳實踐。無論是日常維護、故障排查,還是自動化運維、安全加固,掌握這些技能都至關重要。希望本文提供的命令示例、Java 代碼、腳本模板和架構(gòu)思路能為你帶來實質(zhì)性的幫助。
記住,Linux 的強大在于其靈活性和可組合性——你可以將簡單的命令通過管道、腳本、程序組合成強大的自動化工具。不斷實踐、積累經(jīng)驗,你會越來越得心應手!
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查看系統(tǒng)已安裝軟件的多種方法的詳細內(nèi)容,更多關于Linux查看已安裝軟件的資料請關注腳本之家其它相關文章!
相關文章
Ubuntu部署python3.5的開發(fā)和運行環(huán)境
這篇文章主要介紹了Ubuntu部署python3.5的開發(fā)和運行環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01
在pycharm上配置遠程linux環(huán)境的實現(xiàn)步驟
大家好,本篇文章主要分享的是在pycharm上配置遠程linux環(huán)境的實現(xiàn)步驟,感興趣的小伙伴趕快來看一看吧,對你有幫助的話記得收藏哦2021-11-11
用rsync對網(wǎng)站進行鏡像備份實現(xiàn)步驟
對系統(tǒng)管理員來說,平時的工作重心應該集中在維護系統(tǒng)正常運轉(zhuǎn),能夠正常提供服務上,這里往往牽涉到一個數(shù)據(jù)備份的問題2009-03-03

