You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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脚本高得多。

使用步骤:

  1. 安装工具:
    sudo apt install deborphan
    
  2. 查询某个包的已安装反向依赖:
    deborphan --reverse <package_name>
    
  3. 列出所有没有反向依赖的已安装包(这些通常是可以安全移除的):
    deborphan -a
    

它直接读取dpkg数据库,处理速度非常快,完全能满足你减少攻击面的需求。

总结

如果需要自定义输出格式,用优化后的bash脚本;如果只是想快速排查冗余包,deborphan是最优解——两种方案都能解决你当前脚本耗时过长的问题。

备注:内容来源于stack exchange,提问作者Thomas Grusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 16:29:31