新装完 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-rolling,Kali 是滚动发行版,没有固定版本号,写错了 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::Retries=3提示:换源之后如果
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 2>&1 | 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 | 官方认为的基础工具集 | 数 GB |
| kali-linux-large | 在 default 基础上扩充 | 十几 GB |
| kali-linux-everything | 仓库里几乎全部工具 | 数十 GB |
| kali-tools-top10 | 最常用的一小撮工具 | 较小 |
| kali-tools-web | Web 相关的工具集合 | 中等 |
| 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 来装本地 deb:
sudo 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 '$2=="install"{print $1}' | \ apt-mark showmanual | sort > ~/my-tools.txtapt-mark showmanual会列出"被手动安装过、而不是作为依赖被自动带进来"的包,这个结果更接近你真正想要的那份清单。我一般拿它当长期维护的"环境配方",配合前面 3.1 的方案使用。
4. 把批量安装做扎实的几个参数细节
4.1 非交互安装:让脚本自己跑完不卡住
批量装包如果中途弹出一个配置对话框,等着你按回车,整个流程就卡死了。这在脚本里是致命的,尤其是无人值守的场景。解决办法是提前告诉系统"别问,用默认值":
sudo DEBIAN_FRONTEND=noninteractive apt install -y $(cat ~/pkglist.txt)DEBIAN_FRONTEND=noninteractive这个环境变量会让 debconf 走非交互模式,所有提问都取默认答案。-y则是回答 apt 自己的"是否继续"确认。两个参数负责的是不同层的东西,缺一个都可能卡住,所以通常一起用。
有时候默认答案不是你想要的,比如某个服务装完后默认不启动,而你想让它启动。这种需要在安装前把答案预置进去,用的是debconf-set-selections:
echo "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::Timeout=30 \ -o Acquire::https::Timeout=30 \ -o Acquire::Retries=5 \ $(cat ~/pkglist.txt)Acquire::http::Timeout和https::Timeout单位是秒,默认值在部分网络下偏短,调到 30 秒比较稳妥。Acquire::Retries是重试次数,调到 5 次,遇到偶发的连接重置能自己缓过来。
并发下载数也可以控制。apt 默认会同时开几个连接下载不同的包,网络好的时候这样更快,网络差的时候反而容易互相抢带宽导致全部超时:
sudo apt install -y -o Acquire::Queue-Mode=access $(cat ~/pkglist.txt)Queue-Mode=access是串行下载模式,一次只下一个,速度可能慢一点,但成功率高。我在网络环境不稳定的机器上会固定用这个参数。
这些参数如果每次都要敲太麻烦,可以写进 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"。
前者通常出现在上一次操作中途被 Ctrl+C、断网或者关机打断之后。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 packages"
held broken packages这个提示看起来吓人,其实拆开看就两层意思:有包处于 hold 状态,或者有依赖关系无法满足。查起来分三步走。
先看是不是有包被锁了:
apt-mark showhold如果输出里有跟你要装的包相关的条目,那就是锁造成的,unhold 再试。
再看具体是哪个依赖断了。apt 的报错有时候比较含糊,让它说得更详细一点:
sudo apt install -y 包名 -o Debug::pkgProblemResolver=yes这个调试开关会打印依赖解析的详细过程,能看到它尝试了哪些候选版本、因为什么放弃。输出很长,重点找"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 -h,apt 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 集中起来,其他机器从它那里取包。这样带宽只用一份,批量安装的速度会明显提升,离线机器也能蹭到缓存。这个方向后续可以单独展开写,涉及的服务端配置比本文的批量安装要多好几步。