尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Kali Linux 批量安装软件包:apt、dpkg、元包与离线复刻

发布时间:2026/9/29 8:00:26

资讯中心
01
ARTICLE

Kali Linux 批量安装软件包:apt、dpkg、元包与离线复刻

Kali Linux 批量安装软件包:apt、dpkg、元包与离线复刻
新装完 Kali真正花时间的往往不是分区也不是驱动而是对着清单一个个敲包名。apt install敲一两次还行敲到第三十个的时候手就开始烦了。这篇写的就是把Linux 安装软件包这件事一次做完怎么把一长串包名塞进一条命令怎么用元包一次铺一整类工具怎么在没有网络的机器上批量吃下本地 deb 包以及怎么把当前 Kali 上装过的包导出成一份清单下次换机器几分钟复刻回来。内容偏向系统运维和包管理的实操不涉及具体的工具使用方法适合刚上手 kali linux 的新手、需要批量重装环境的运维、以及要给团队统一复刻一套环境的同学。看完你应该能自己搭出一套一条命令装完的流程也能在出问题的时候知道去哪儿找原因。1. 先想清楚为什么要一次性以及三条路线的取舍1.1 三种真实场景决定了完全不同的做法我这些年折腾 kali linux遇到的批量安装需求基本落在三类场景里很多人上来就问有没有一条命令全装完其实得先看自己属于哪一类。第一类是全新系统铺装。系统刚装好源是新的网络是通的目标就是把常用工具一次性补齐。这类场景自由度最高直接用 apt 联网装就行缺点是 Kali 官方源在部分网络环境下速度一般装几百个包可能要等很久。第二类是重装或换机复刻。老机器上有套自己用顺手的工具集换了新机器或者重装系统后想原样搬过去。这时候你不该凭记忆一个个敲包名而是应该先把老机器的包清单导出来带着这份清单去新机器上还原。漏掉一两个包往往要等到某天用到才发现很耽误事。第三类是离线或受限网络环境。目标机器没有外网或者干脆不允许联网。这时候 apt 联网那条路走不通只能在有网的机器上把 deb 包连同依赖一起抓下来打包拷过去再用 dpkg 批量安装。这三类场景对应三套不同打法混着用会很难受。比如你在离线环境里直接apt install它只会告诉你找不到包不会自动帮你解决——因为它的信息源软件源缓存是空的。1.2 三条技术路线什么时候用哪条把选择逻辑摊开成一张表会更清楚。这里说的路线指的是批量动作发生的那一层不是互斥的关系实际做的时候经常是组合拳。路线核心命令适用场景关键优势主要坑点apt 批量apt install -y 包1 包2 ...联网环境包数量中等自动解决依赖一条命令搞定包太多会超出命令行长度限制元包铺装apt install -y kali-tools-xxx需要成类工具不在乎体积一次装一整类省去列清单体积巨大依赖冲突概率上升dpkg 批量dpkg -i *.deb配合apt -f install离线环境已有 deb 包不依赖网络粒度可控依赖要自己补齐顺序敏感我个人的习惯是能联网就用 apt需要成类铺装就用元包离线才动 dpkg。dpkg 我一般放在最后作为兜底手段因为它本身不算依赖管理器它只负责把包解压铺开缺什么依赖它只会报错不会自己去找。还有一点值得提前说清楚网上的kali linux 安装教程里经常能看到把 kali-linux-everything 当成默认选项的写法。这个元包会把官方仓库里几乎所有工具都拖下来占用空间以几十 GB 计依赖冲突的概率也明显变高。除非你确实需要一个全都有的靶场环境否则我更建议按类别挑元包具体在第 3 章会展开。2. 动手前的准备源、空间和一份预演2.1 软件源配置与更新节奏先解决装的到装不到批量安装失败十次里有七八次问题出在源上而不是命令写错。Kali 的软件源配置有两代写法老的是/etc/apt/sources.list这种单行格式新版本更推荐用 deb822 格式放在/etc/apt/sources.list.d/下面的.sources文件里。两种都认你可以先看一眼现有配置cat /etc/apt/sources.list ls /etc/apt/sources.list.d/单行格式长得像这样字段依次是类型、地址、发行版代号、组件deb https://http.kali.org/kali kali-rolling main contrib non-free non-free-firmware这里有两个细节容易被忽略。第一个是发行版代号必须是kali-rollingKali 是滚动发行版没有固定版本号写错了 apt 会找不到对应的索引。第二个是组件列表很多工具在non-free或non-free-firmware里如果你只写main装某些包的时候会提示无法定位软件包不是网络问题是组件没开。如果官方地址在你的网络下速度不理想换成就近的公共镜像站是很常规的做法写法就是把地址换掉其余字段保持不变deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free non-free-firmware改完源之后必须执行sudo apt update这一步是把远端仓库的包索引拉到本地/var/lib/apt/lists/。很多人跳过了这步直接装结果要么是 404要么是找不到候选版本。批量安装前我建议顺手加一个健壮性参数避免个别索引文件拉取失败就整个中断sudo apt update -o Acquire::Retries3提示换源之后如果apt update报 GPG 签名错误八成是镜像站的密钥还没同步到位或者本地 keyring 版本偏旧。这种情况不要急着手动删 keyring先换回官方源试一次确认是镜像站的问题再换别的站。2.2 磁盘空间与依赖账本装之前先做一次预演批量安装最容易翻车的第二个原因是空间不够。Kali 默认装完也就十几 GB如果你再铺几个大元包根分区很快见底。装之前先看一眼df -h / du -sh /var/cache/apt/archives/var/cache/apt/archives是 apt 下载 deb 包时的缓存目录。批量装大包的时候它会迅速膨胀装完可以用sudo apt clean清掉能回收不少空间。注意 Kali 的滚动特性老版本的 deb 缓存留着也没用定期清是安全的。比空间更值得做的是预演。apt 支持模拟运行把-s加上它会告诉你如果真装会装哪些包、动多少依赖、占用多少空间但不实际执行apt install -s nmap sqlmap hydra 21 | tail -20这个习惯救过我很多次。有一次我想装一个包预演输出里显示它会连带卸载掉三个已经装好的包原因是版本冲突。如果直接装下去环境就被破坏了而且事后很难查是哪一步引起的。预演输出的最后几行通常会给出一句将被升级、新安装、卸载的统计看这一句就够判断风险了。另外一个实用技巧是估算下载量。apt install -s的输出里会提到需要下载多少 MB、额外占用多少磁盘空间。批量装之前把这两个数字当预算看心里有数就不会装到一半因为根分区满了而被迫中断——这种半途中断最容易留下 dpkg 的破损状态处理起来比重来一次麻烦得多。3. 四套批量安装方案从联网到离线全覆盖3.1 方案一清单文件 一条 apt 命令最通用这是我最常用的方式。把所有包名写进一个文本文件一行一个或者空格分隔都行然后让 apt 一次读完。先建清单cat ~/pkglist.txt EOF nmap sqlmap hydra john hashcat gobuster ffuf python3-pip git vim tmux htop EOF最简单的读法是用命令替换直接把文件内容展开成参数sudo apt install -y $(cat ~/pkglist.txt)包少的时候这样写很清爽。但包一多就会撞上命令行参数长度上限报错信息是Argument list too long。这个上限不是 apt 的限制是 Linux 内核对单个进程参数总长度的限制通常在 2MB 数量级。包名平均 15 个字符的话大概一两万个包才会撞上听起来很远但如果你是从另一个系统导出的完整清单很容易就超了。更稳的写法是交给xargs分批投喂。-a从文件读-n控制每次传多少个参数给后面的命令xargs -a ~/pkglist.txt -n 20 sudo apt install -y-n 20的意思是每次给 apt 传 20 个包名执行完再传下一批。这样既避开了长度上限也让出错的时候更容易定位是哪一批的问题。唯一的代价是 apt 会跑很多次每次都要重新计算依赖关系速度稍慢但换来的是稳定性我觉得值。清单文件里可以写注释吗默认xargs会把#开头的内容也当成包名传给 apt然后报无法定位软件包。所以要么别写注释要么在读取前先过滤掉grep -v ^\s*# ~/pkglist.txt | grep -v ^\s*$ | xargs -n 20 sudo apt install -y这一行做了两件事去掉以#开头的注释行去掉空行。别小看空行它也会被当成一个参数apt 收到空字符串同样会报错。清单文件我建议长期维护加注释说明每个包是干什么用的两个月后回来看才知道当初为什么装它。3.2 方案二元包铺装一次装一整类工具Kali 官方把工具按用途打包成了若干元包metapackage元包本身几乎不占空间它的作用是拉一串依赖。所以装一个元包等于一次性把这一类工具全装上了。常见的几个元包名大致覆盖范围体积量级kali-linux-default官方认为的基础工具集数 GBkali-linux-large在 default 基础上扩充十几 GBkali-linux-everything仓库里几乎全部工具数十 GBkali-tools-top10最常用的一小撮工具较小kali-tools-webWeb 相关的工具集合中等kali-tools-wireless无线相关的工具集合中等装的时候和普通包没区别sudo apt install -y kali-tools-top10想看看有哪些分类可以选直接搜元包名字就行apt search ^kali-tools- | head -40 apt search ^kali-linux- | head -20元包的好处是省心坏处是粒度粗。装 kali-linux-large 的时候你其实并不需要里面每一个工具但 apt 会把它们全拖下来。而且元包的依赖树很深跟已经装好的东西撞版本的概率比单个包高不少。我的经验是先用-s预演看一遍会新装多少包、卸不卸已有的东西确认没问题再真装。还有一个细节元包装完之后如果你后来单独卸载了其中某个工具下次再对这个元包执行apt install时apt 会认为元包的依赖不完整重新把这个工具装回来。想让元包装完就散不留依赖关系可以在安装时加--no-install-recommends并且事后用apt-mark处理但说实话这个操作性价比不高不如一开始就按需选元包。提示如果你只是想要一套够用但不臃肿的环境我的建议组合是kali-linux-default打底再按自己的方向叠加一到两个kali-tools-*分类包这样体积可控依赖冲突也少。3.3 方案三离线 deb 包批量安装先解决依赖再谈批量没有外网的场景思路是在有网的机器上把包连同依赖一起抓下来拷到目标机器上装。抓包这一步用apt download或者更好用的apt-get install --download-only# 在联网机器上只下载不安装deb 会落在 /var/cache/apt/archives/ sudo apt-get install --download-only -y nmap sqlmap hydra注意这里已经把依赖一起抓下来了这是关键。如果你只用apt download nmap它只给你 nmap 一个 deb依赖还是缺的。抓完把整个 archives 目录打包cd /var/cache/apt/archives tar czf pkgs.tar.gz *.deb拷到目标机器后解压然后用 apt 而不是 dpkg 来装本地 debsudo apt install -y ./*.deb这条写法很多人不知道。apt 从 1.1 版本起就支持直接吃本地 deb 文件而且它会读取文件名里的依赖信息把本地这一堆 deb 当成一个小仓库来解析依赖顺序缺什么会从已配置的源里补。相比之下dpkg -i *.deb是盲装它按字母顺序一个个铺先装的如果依赖后装的包直接就报依赖错误。如果目标机器确实只能离线、源完全不可用那就只能 dpkg 硬上了但要接受先装一遍、再补一遍的过程sudo dpkg -i ./*.deb sudo apt --fix-broken install第一遍 dpkg 会把能装的都装上报一堆依赖错误很正常第二遍--fix-broken让 apt 去补那些断裂的依赖。如果本地 deb 已经覆盖了所有依赖第二遍就能修复干净如果还缺它会明确告诉你还缺哪些包名你回到有网的机器上把缺的抓来再跑一遍即可。有个顺序上的坑要提醒离线批量装的时候不要把不同架构的 deb 混在同一个目录里。apt 和 dpkg 都会用文件名里的架构字段去匹配混着放容易出现包找到了但架构不匹配装不上的迷惑报错。抓包时就按架构分目录省得事后排查。3.4 方案四导出清单把一台机器的包状态复刻到另一台这条路线其实是批量安装的终极形态——不列包名直接把系统当前的安装状态导出来。Kali 基于 Debian用 dpkg 的 selections 机制就能做到。在老机器上导出dpkg --get-selections ~/pkglist-full.txt这个文件会包含系统上所有包的安装状态一行一个包后面跟着install或deinstall。文件通常有几千行别直接拿来当 apt 的参数用会撞长度上限。在新机器上还原dpkg --set-selections ~/pkglist-full.txt sudo apt-get dselect-upgrade--set-selections只是把应该装什么写进 dpkg 的数据库并不真的下载dselect-upgrade才是真正根据这份状态去拉包、装包的那一步。这个组合的优点是精准——新机器的包状态会和导出时完全一致。但它有个明显的前提新机器的软件源必须能访问到同样版本的包。Kali 是滚动发行版包版本天天在变如果你导出清单后隔了两个月才还原某些包可能已经从仓库里下架了dselect-upgrade会提示找不到。所以这份清单的保鲜期并不长跨版本还原要打折扣。如果你想做的是只要工具不要系统包的轻量复刻可以把导出结果过滤一下只留你自己后装的第三方工具dpkg --get-selections | awk $2install{print $1} | \ apt-mark showmanual | sort ~/my-tools.txtapt-mark showmanual会列出被手动安装过、而不是作为依赖被自动带进来的包这个结果更接近你真正想要的那份清单。我一般拿它当长期维护的环境配方配合前面 3.1 的方案使用。4. 把批量安装做扎实的几个参数细节4.1 非交互安装让脚本自己跑完不卡住批量装包如果中途弹出一个配置对话框等着你按回车整个流程就卡死了。这在脚本里是致命的尤其是无人值守的场景。解决办法是提前告诉系统别问用默认值sudo DEBIAN_FRONTENDnoninteractive apt install -y $(cat ~/pkglist.txt)DEBIAN_FRONTENDnoninteractive这个环境变量会让 debconf 走非交互模式所有提问都取默认答案。-y则是回答 apt 自己的是否继续确认。两个参数负责的是不同层的东西缺一个都可能卡住所以通常一起用。有时候默认答案不是你想要的比如某个服务装完后默认不启动而你想让它启动。这种需要在安装前把答案预置进去用的是debconf-set-selectionsecho package-name package-name/some-question boolean true | sudo debconf-set-selections sudo apt install -y package-name具体的问题键名怎么找可以先交互式装一遍看它问了什么或者用debconf-show 包名查看当前包已经记录的配置项。这个技巧在批量部署服务类软件的时候特别有用能让同一套脚本在不同机器上跑出一致的结果。4.2 超时、重试和下载并发网络不稳时的救命参数Kali 的包体积普遍不小批量下载几百 MB 是常态。网络稍微抖一下apt 就可能报连接超时然后整个中断前面的下载进度白费。有几个参数可以调sudo apt install -y \ -o Acquire::http::Timeout30 \ -o Acquire::https::Timeout30 \ -o Acquire::Retries5 \ $(cat ~/pkglist.txt)Acquire::http::Timeout和https::Timeout单位是秒默认值在部分网络下偏短调到 30 秒比较稳妥。Acquire::Retries是重试次数调到 5 次遇到偶发的连接重置能自己缓过来。并发下载数也可以控制。apt 默认会同时开几个连接下载不同的包网络好的时候这样更快网络差的时候反而容易互相抢带宽导致全部超时sudo apt install -y -o Acquire::Queue-Modeaccess $(cat ~/pkglist.txt)Queue-Modeaccess是串行下载模式一次只下一个速度可能慢一点但成功率高。我在网络环境不稳定的机器上会固定用这个参数。这些参数如果每次都要敲太麻烦可以写进 apt 的配置文件/etc/apt/apt.conf.d/下面建一个自定义文件echo Acquire::Retries 5; | sudo tee /etc/apt/apt.conf.d/99custom echo Acquire::http::Timeout 30; | sudo tee -a /etc/apt/apt.conf.d/99custom文件名以数字开头是为了控制加载顺序数字越大越靠后加载、优先级越高。用 99 开头基本能覆盖前面的默认设置。4.3 版本锁定别让批量升级把环境搞崩Kali 是滚动发行版apt upgrade会持续把包推到最新。这在日常使用里是好事但如果你有一套跑得好好的环境某次批量操作顺手升级了核心组件可能就崩了。这时候需要的是锁版本。把一个包锁定在当前版本禁止升级sudo apt-mark hold nmap查看已经锁定的包apt-mark showhold需要放开的时候sudo apt-mark unhold nmap我通常会把内核相关、显卡驱动、以及自己编译过的那几个包锁住。内核尤其重要——Kali 升级内核之后如果外部的驱动模块还没跟上重启可能直接进不了图形界面。批量安装的时候如果这条命令顺带触发了内核升级风险就来了。锁定内核最简单sudo apt-mark hold linux-image-amd64 linux-headers-amd64注意hold 只是禁止自动升级不禁止显式安装指定版本。如果你后来手动指定了另一个版本它照样会装。所以 hold 不是万能的关键系统的升级节奏还是要自己看着。另一个相关参数是--no-upgrade它可以只装不升级sudo apt install -y --no-upgrade $(cat ~/pkglist.txt)这条命令的意思是如果包已装就跳过不要动它如果没装才装。批量补装环境的时候很实用能避免一个补装动作意外把一堆包升级掉。反过来如果你确实想顺手升级就用--only-upgrade逻辑正好相反。5. 常见故障排查从锁文件到依赖断裂5.1 dpkg interrupted 和锁文件被占批量安装最常撞见的两类报错一类是dpkg 被中断必须手动运行 dpkg --configure -a 修复另一类是无法获得锁 /var/lib/dpkg/lock-frontend。前者通常出现在上一次操作中途被 CtrlC、断网或者关机打断之后。dpkg 有个状态机包可能停在已解压但未配置的中间态apt 检测到这种状态就拒绝继续。修复命令 apt 自己会告诉你sudo dpkg --configure -a这条会遍历所有处于未配置状态的包重新走一遍配置流程。跑完之后再执行sudo apt --fix-broken install收尾一般就恢复正常了。锁的问题有两种情况。一种是真的有另一个 apt 或 dpkg 进程在跑比如你开了两个终端。先确认ps aux | grep -E apt|dpkg | grep -v grep另一种是进程已经死了但锁文件没释放属于假锁。这时候可以查一下是谁占着sudo fuser -v /var/lib/dpkg/lock-frontend如果确认没有任何进程在用删除锁文件是安全的sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/dpkg/lock sudo rm /var/cache/apt/archives/lock三个锁文件对应不同层面dpkg 自己一个、frontend 一个、apt 的下载缓存一个。删之前一定确认进程真的不在否则两个 dpkg 同时操作数据库后果比等一会儿严重得多。5.2 依赖断裂与held broken packagesheld broken packages这个提示看起来吓人其实拆开看就两层意思有包处于 hold 状态或者有依赖关系无法满足。查起来分三步走。先看是不是有包被锁了apt-mark showhold如果输出里有跟你要装的包相关的条目那就是锁造成的unhold 再试。再看具体是哪个依赖断了。apt 的报错有时候比较含糊让它说得更详细一点sudo apt install -y 包名 -o Debug::pkgProblemResolveryes这个调试开关会打印依赖解析的详细过程能看到它尝试了哪些候选版本、因为什么放弃。输出很长重点找Broken和Conflicts这两个关键词。最后看是不是源里的版本太旧。Kali 滚动更新你本地索引可能还是几天前的而依赖要求的是新版本sudo apt update sudo apt full-upgrade先刷新索引再装很多依赖无法满足就这么消失了。注意full-upgrade和upgrade的区别前者允许为满足依赖而卸载包后者不允许。批量修依赖的时候用 full-upgrade 更有效但要先看清楚它打算卸什么。一个容易忽略的坑是混装第三方源。如果你往 sources.list 里加过非 Kali 官方的仓库同一个包可能有两个来源、两个版本apt 会陷入选哪个都不对的状态。排查方法是把这些源临时注释掉apt update后再试。如果问题消失就是这个源导致的。5.3 源不一致、架构不匹配与空间不足有些报错不属于上面任何一类但特征很明显见到就能对上号。报错特征大概率原因处理方向无法定位软件包 / 404索引过期或源里没有apt update检查组件字段是否含 non-free包架构不匹配deb 架构与系统不符dpkg --print-architecture核对分类存放空间不足 / No space left根分区满df -hapt clean清缓存GPG 签名错误镜像站密钥未同步换回官方源验证版本冲突要求降级本地版本比源里新确认后再决定是否降级架构这一项值得单说。Kali 默认是 amd64但如果你要装一些 32 位的工具得先声明支持 i386 架构sudo dpkg --add-architecture i386 sudo apt update加完之后系统才能识别 i386 的包。反过来如果你下载的 deb 是 arm64 的而系统是 amd64无论怎么装都装不上报错里会明确提到架构。批量离线安装前用dpkg -I 包名.deb看一眼架构字段能省掉很多返工。空间不足出现的时机很有意思往往是在已经下载了一堆 deb、正在解压安装的阶段。这个阶段中断很容易留下前面说的 dpkg 半配置状态。所以批量装大包之前那次df -h检查真的不是多此一举。我自己的习惯是留出比预演估算值多 30% 的余量因为解压时的临时占用通常比 apt 报的额外磁盘空间要大一些。6. 装完之后验证、收尾和几条个人习惯6.1 怎么确认真的装好了批量安装跑完不等于万事大吉中间可能有包装失败但 apt 整体返回成功的情况尤其是用了 xargs 分批投喂的时候某一批失败不影响后面的批次。所以装完一定要验证。最简单的是看包状态。dpkg 的状态字段里ii表示期望安装且已正确安装看到iU、iF之类的就要注意了dpkg -l | grep -v ^ii | grep -E ^i[^i]这条会筛出所有状态不正常的包。如果输出只有一行标题说明全装好了。想看总数dpkg -l | grep -c ^ii另一个验证方式是直接调用命令。包装了不代表可执行文件在 PATH 里也不代表服务能起来。对关键工具挨个跑一下版本查询是最踏实的for c in nmap sqlmap hydra john; do command -v $c /dev/null echo $c OK || echo $c MISSING donecommand -v只查命令是否存在不执行它所以很安全适合放进批量验证脚本里。哪一行打印 MISSING就回去单独查那个包。6.2 我自己踩过之后固定下来的几条做法第一条批量安装前永远先跑一次-s预演。多花十秒能避免环境被意外破坏。预演输出里我只看两件事会不会卸载已有包以及额外占用多少空间。第二条清单文件跟你走。我维护一个~/pkglist.txt用一个 git 仓库管起来换机器的时候 clone 下来直接跑。加注释、分区块、按用途分组比如基础工具开发环境网络排查各一段。这份文件比任何环境快照都耐用因为它只记录意图不依赖具体版本。第三条不要在apt update没跑的情况下批量装。这个坑我踩过不止一次在刚换完源的机器上直接apt install报了一屏无法定位软件包查了十分钟才发现是索引没刷新。第四条大元包和小清单分开装。先把 kali-linux-default 这类打底元包装完再跑自己的小清单出错时边界清楚——元包区间出的问题通常是源或空间小清单出的问题通常是包名拼错或依赖冲突两者不要混在一次操作里。第五条装完立刻清缓存。sudo apt clean一条命令能回收几 GB。Kali 滚动更新频繁老 deb 留着没用还占地方。我一般把这条直接接在批量安装命令后面用串起来一次跑完省心。最后说一个我觉得挺实用的小扩展如果你的机器不止一台可以在有网的机器上搭一个局域网内的软件源缓存服务把下载过的 deb 集中起来其他机器从它那里取包。这样带宽只用一份批量安装的速度会明显提升离线机器也能蹭到缓存。这个方向后续可以单独展开写涉及的服务端配置比本文的批量安装要多好几步。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。