Ubuntu 22.04服务器加固:优化已安装包依赖查询脚本的方案咨询
Ubuntu 22.04服务器加固:优化已安装包依赖查询脚本的方案咨询
嘿,我太懂你这种在树莓派上跑半小时脚本的痛苦了!先拆解下你当前脚本慢的核心问题:你循环调用了太多次外部命令(apt-cache rdepends和dpkg --get-selections),每次启动新进程、读取磁盘数据的开销累积起来,直接拖垮了整体速度。下面给你几个亲测有效的优化方向,能大幅提速:
一、用本地数据库替代apt-cache,减少外部命令调用
apt-cache rdepends是查询远程仓库的依赖关系,但你只关心本地已安装的依赖包,完全可以用dpkg-query直接读取本地dpkg数据库,速度快得多。同时,我们可以把所有已安装包存入一个关联数组,检查包是否安装时不用每次跑dpkg --get-selections,直接数组查询(O(1)速度)就行。
优化后的脚本如下:
#!/bin/bash # 把所有已安装包存入关联数组,实现快速查询 declare -A installed_packages while read -r package _; do installed_packages["$package"]=1 done < <(dpkg --get-selections | grep -v deinstall) # 一次性获取所有包的反向依赖,批量处理 dpkg-query -W -f='${Package}\t${Reverse-Depends}\n' | while IFS=$'\t' read -r package reverse_deps; do # 跳过无反向依赖的包,减少无效处理 [[ -z "$reverse_deps" ]] && continue # 解析反向依赖字符串,提取纯包名(去掉版本、空格等冗余信息) dependents=() IFS=',' read -ra dep_parts <<< "$reverse_deps" for dep in "${dep_parts[@]}"; do dep_name=$(echo "$dep" | sed -E 's/^[[:space:]]*([^[:space:]]+).*/\1/') # 只保留已安装的依赖包 if [[ -n "${installed_packages[$dep_name]}" ]]; then dependents+=("$dep_name") fi done # 仅当有已安装依赖时,输出结果到文件 if [[ ${#dependents[@]} -gt 0 ]]; then echo "-----------------------------------------------------------------------" | tee -a packages_and_depents.txt echo "${package} has these dependents on the system (total ${#dependents[@]}):" | tee -a packages_and_depents.txt echo "-----------------------------------------------------------------------" | tee -a packages_and_depents.txt printf '%s\n' "${dependents[@]}" | tee -a packages_and_depents.txt fi done
这个脚本只调用了两次外部命令,剩下的都是bash内部处理,在树莓派上应该能把时间压缩到几分钟甚至更短。
二、用专门工具deborphan,比自定义脚本更快
如果你不想折腾脚本,推荐用deborphan——这是一个专门为清理系统冗余包设计的工具,用C编写,效率比bash脚本高得多。
使用步骤:
- 安装工具:
sudo apt install deborphan - 查询某个包的已安装反向依赖:
deborphan --reverse <package_name> - 列出所有没有反向依赖的已安装包(这些通常是可以安全移除的):
deborphan -a
它直接读取dpkg数据库,处理速度非常快,完全能满足你减少攻击面的需求。
总结
如果需要自定义输出格式,用优化后的bash脚本;如果只是想快速排查冗余包,deborphan是最优解——两种方案都能解决你当前脚本耗时过长的问题。
备注:内容来源于stack exchange,提问作者Thomas Grusz
相关产品推荐
相关产品推荐

