news 2026/10/13 3:37:26

Ubuntu 20.04离线安装sshd:依赖处理与本地apt源搭建全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 20.04离线安装sshd:依赖处理与本地apt源搭建全攻略

简介:Ubuntu 20.04桌面版默认未安装SSH服务,对于需要在离线环境中启用远程管理和自动化运维的用户来说,这份离线安装包正好补上这一缺口。资源面向系统管理员、运维工程师及有内网部署需求的开发者,可在无外网连接的机器上快速完成sshd服务的安装与配置。

包体共4个文件,包括3个deb格式软件包和1个sh安装脚本。deb包覆盖openssh-server、openssh-client及sftp-server等核心组件,脚本则用于自动执行安装和依赖处理,整体压缩包仅1.05MB,轻量便携,便于通过U盘等方式拷贝到目标主机。目前已吸引1253人学习下载,说明该场景需求较为常见。

借助这份资源,用户无需联网即可获得完整的SSH服务安装方案。配套脚本还简化了dpkg安装与依赖修复流程,降低手动操作出错概率;同时资源中包含客户端组件,便于在服务器与本地机器之间建立安全连接。对于管理离线机房、无外网实验环境或希望快速开通SSH远程入口的读者,是一份实用且省时的工具包。

1. 离线装sshd翻车点不只在装包:先看清依赖再动手

搜“ubuntu20.04 sshd离线安装包”的人,多半已经翻过车。断网的内网机器、无法访问外网的测试环境、或者云主机上 apt 源根本连不通时,apt install ssh一行命令解决不了问题,装到一半往往卡在依赖上。这个标题真正要解决的,是“把 openssh-server 连同它的依赖 deb 包一起准备好,拷进目标机,用 dpkg 装起来并把服务拉起来”这件事,背后涉及 libssl、libpam、zlib 这一串底库的匹配问题。适合的人很明确:内网运维、做离线环境部署的测试工程师、以及被 sshd 装不上卡住手脚的救急者。先把依赖这件事看明白,后面所有命令才不玄学。

2. 离线安装包的三种正规获取途径:有网机器、apt缓存、ISO镜像源

离线装 sshd 的前提是手里得有包。常见做法是在一台能和外部软件源连通、系统版本和目标机一致的 Ubuntu 20.04 机器上把包拉齐,然后通过 U 盘、内网共享或 scp 带走。更省事的还有两种:翻本机 apt 缓存,或者直接把 Ubuntu 20.04 的 ISO 镜像挂载成本地 apt 源。三种途径适用场景不同,第一种最通用,第二种适合“刚才还在联网环境里装过 ssh”的情况,第三种适合批量部署或之后还想装其他包。下面按顺序拆开讲。

2.1 用 apt download 在有网机器上拉全部依赖

不要只下载 openssh-server 一个 deb,离线安装最大的坑是依赖链断裂。openssh-server 依赖 openssh-client、openssh-sftp-server、libssl1.1、libpam0g、zlib1g、libc6 等一堆包,少一个 dpkg 就报错。最稳的办法是用 apt-cache 递归展开依赖,然后一次性下载。

# 在联网机器上执行,系统版本和目标机保持一致(同为 Ubuntu 20.04) sudo apt-get update # 递归列出 openssh-server 的全部依赖并下载 LC_ALL=C apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances openssh-server \ | awk '/^ [A-Za-z0-9]/ {print $1}' | sort -u \ | xargs apt-get download # openssh-client 和 sftp-server 在 20.04 默认是 Recommends,上面命令会漏掉,手动补上 apt-get download openssh-client openssh-sftp-server

这段命令的关键在apt-cache depends --recurse,它会递归展开 openssh-server 的所有依赖关系,awk把缩进项里的包名提取出来,sort -u去重,xargs apt-get download批量下载到当前目录。--no-recommends的目的是不把推荐包也拉进来,但代价是 openssh-client 这种以 Recommends 关系存在的包会被漏掉,所以第二行必须手动补。下载完成后检查一下目录里的 deb 数量,一般会在 15 个上下。

2.2 从 /var/cache/apt/archives 找回已下载的 deb 包

很多机器虽然不是纯离线,但装过 ssh,apt 会把下载的 deb 存在/var/cache/apt/archives。如果这台机器现在的系统版本、软件源配置和目标机基本一致,直接从缓存目录拷贝是最快的。这种方法连依赖递归都省了,因为当初apt install时已经把所有依赖都下齐了。

# 在联网机器上看缓存里有哪些 ssh 相关包 ls /var/cache/apt/archives/ | grep -E 'openssh|libssl1.1|libpam0g|zlib1g|libc6' # 把缓存里的 deb 全部拷出来 mkdir -p /tmp/offline-ssh cp /var/cache/apt/archives/*.deb /tmp/offline-ssh/ # 拷贝前核对版本,避免混入其他软件源的同名包 dpkg-deb -f /var/cache/apt/archives/openssh-server_*.deb Version

拷贝前一定要看版本号,因为缓存目录里可能残留着之前测试时下载的半旧包,甚至混了其他软件源的版本。dpkg-deb -f打印 deb 包的元信息,Version 字段能确认是不是目标版本。另外注意,缓存里可能有大量和历史安装无关的旧包,全拷会浪费时间,按包名过滤就够了。

2.3 挂载 Ubuntu 20.04 的 ISO 镜像当本地 apt 源

如果上面两种方式都不可行,比如手里只有 Ubuntu 20.04 的安装 ISO,仍然能救急。ISO 里带了完整的 pool 目录,openssh 的 deb 就放在pool/main/o/openssh下。把 ISO 挂载成文件系统,再把它作为 apt 源写入 sources.list,让 apt 自行解析依赖。

# 在目标机(或联网机)上挂载 ISO mkdir -p /mnt/iso sudo mount -o loop /path/to/ubuntu-20.04-live-server-amd64.iso /mnt/iso # 添加为本地 apt 源,trusted=yes 是因为本地 ISO 没有 apt 需要的 GPG 公钥 echo "deb [trusted=yes] file:///mnt/iso focal main restricted" \ | sudo tee /etc/apt/sources.list.d/iso.list # 更新源并只下载不安装 sudo apt-get update sudo apt-get install openssh-server --download-only

file:///mnt/iso这种写法让 apt 直接把 ISO 里的 Packages 索引当作软件源,focal是 20.04 的代号,main restricted对应 ISO 里的组件目录。trusted=yes是绕开 GPG 校验的开关,本地 ISO 没有官方公钥,不加这个参数 apt 会拒绝安装。--download-only只把包下载到/var/cache/apt/archives,之后统一拷走,不要在目标机上直接装,避免源切换造成混乱。

3. 离线安装sshd的完整落地流程:依赖自检、装包、起服务、设自启

包拿到手之后,安装顺序是有讲究的。直接把所有 deb 一股脑dpkg -i虽然经常能成,但一旦依赖顺序不对就会中途报错。更稳的流程是:拷到目标机 → 先做依赖自检 → 按顺序装 → 生成 host key → 起服务 → 设开机自启 → 验证端口。每一步都有对应的验证命令,别跳过。

3.1 拷到目标机后先做依赖自检

不要急着dpkg -i。先确认目标机系统确实是 20.04,再看关键依赖是否已经存在。很多离线机器上其实已经有 libc6、zlib1g,真正缺的往往是 libssl1.1 和 openssh-sftp-server。

# 确认系统版本 lsb_release -a | grep Release # 查看 openssh-server 的依赖声明 dpkg-deb -I openssh-server_*.deb | grep -E 'Depends|Recommends' # 检查关键底库是否已安装 dpkg -l | grep -E 'libssl1.1|libpam0g|zlib1g' # 如果目标机上已经装过旧版 ssh,先看当前状态 dpkg -l | grep -E 'openssh-server|openssh-client'

dpkg-deb -I查看的是 deb 包内部的 control 信息,Depends 字段会列出所有硬依赖。把这一行记下来,再对照dpkg -l的输出,就知道还缺哪个。如果目标机上已经存在旧版 openssh-server,安装前要先决定是保留旧配置还是覆盖,这会影响后面的 host key 处理。

3.2 用 dpkg -i 按顺序安装并处理失败

依赖自检做完之后,按依赖层级安装。一般顺序是:先装底库和客户端,再装 sftp-server,最后装 server。Ubuntu 20.04 官方源里的 openssh-server 是要求 openssh-sftp-server 一起装上的,两个 deb 最好放在同一个目录同时指定。

# 进入离线包目录,按依赖顺序安装 cd /tmp/offline-ssh sudo dpkg -i ./libssl1.1_*.deb ./libpam0g_*.deb 2>/dev/null || true # 核心三件套,注意 sftp-server 必须在 server 之前或者一起 sudo dpkg -i ./openssh-client_*.deb ./openssh-sftp-server_*.deb ./openssh-server_*.deb # 万一还是报缺依赖,用这个命令看还缺什么 sudo dpkg -i ./openssh-server_*.deb 2>&1 | grep 'Depends' # 缺的包补装完后再执行一遍修复 sudo apt-get -f install -y

dpkg -i遇到缺依赖会直接报错退出,但不会破坏已装好的部分。第一次失败不可怕,看报错里 Depends 后面跟的包名,去离线包目录里找对应 deb 补上,再执行一次。apt-get -f install是修复依赖的神器,但在纯离线环境下它只会检查本地已配置的源,如果离线包不在源里,它依然修不了。所以根本办法是把所有 deb 都放在同一个目录里,一次全部指定给 dpkg。

3.3 启动、验证端口与开机自启的一键流程

装完之后直接systemctl start ssh十有八九会失败,原因是新装的 openssh-server 没有生成 host key,sshd 会因为找不到密钥直接退出。这一步是新手的重灾区,必须先手动生成密钥。

# 生成所有默认格式的 host key sudo ssh-keygen -A # 启动服务并设为开机自启 sudo systemctl enable ssh --now # 验证端口监听状态 ss -tlnp | grep ':22' # 查看服务运行状态 systemctl status ssh --no-pager

ssh-keygen -A会生成 ssh_host_rsa_key、ssh_host_ecdsa_key、ssh_host_ed25519_key 三套密钥,缺一不可。systemctl enable ssh --now是 enable 和 start 的合并写法,一次搞定自启动和启动。如果端口没有监听,先看journalctl -u ssh的日志,大多数情况是 host key 问题或/etc/ssh/sshd_config里端口被改了。另外,目标机的防火墙如果开着,还要放行 22 端口,否则外面连不进来。

# 放行 22 端口 sudo ufw allow 22/tcp

注意,如果这是内网机器,只放行内网网段更安全,比如sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp。生产环境不要无条件对全网开放 22。

4. 离线安装sshd的高频坑位:现象、原因、排查与解决

离线装 sshd 的坑,大部分不是命令敲错,而是“包不对版”和“环境残留”。下面五条是我在实际处理内网机器时反复遇到的,每条都按现象、原因、解决三步写清楚,踩过其中一个就能省半小时。

4.1 从 22.04 拷贝的 deb 一路报错,ssh 服务起不来

现象:在 Ubuntu 22.04 机器上拉下来的 openssh-server deb,拷到 20.04 目标机后dpkg -i报版本冲突,强行装完后 sshd 直接无法启动,日志里全是 libcrypto.so.3 找不到。

原因:20.04 和 22.04 的 openssh 依赖链不同,20.04 默认 OpenSSL 1.1.1(libssl1.1),22.04 是 OpenSSL 3.x(libssl3),二进制链接的库路径不一样。硬装进去的 sshd 在运行时会因为找不到 libcrypto.so.3 而崩溃。

解决:严格在 20.04 软件源里拉包,不要跨版本拷贝。如果已经在目标机装坏了,先sudo dpkg -r openssh-server openssh-sftp-server openssh-client卸载,再用正确版本重装。核对版本时看 deb 包名里的+号后面的数字,20.04 的 openssh-server 是1:8.2p1-4ubuntu0.x,22.04 是1:8.9p1-3ubuntu0.x,差异非常大。

4.2 Host key 不存在,sshd 启动后立刻退出

现象:dpkg -i明明成功了,systemctl start ssh却失败,systemctl status ssh显示sshd: no hostkeys available,日志文件里没有更多细节。

原因:Ubuntu 的 openssh-server 包在安装时不会自动生成 host key,密钥生成逻辑放在openssh-server.postinst脚本里,但某些精简安装或手动 dpkg 场景下这个脚本没有正确执行。另外,如果目标机之前装过 sshd 又被彻底清掉,/etc/ssh/ssh_host_*被删干净,也会出现这个现象。

解决:执行sudo ssh-keygen -A手动生成全部 host key,再systemctl start ssh。这是离线安装里最容易踩的一脚,命令一行,但能救回一次看似“装失败”的部署。

4.3 openssh-sftp-server 缺失,sftp 用户连不上但 SSH 正常

现象:sshd 起来了,SSH 可以正常登录,但用 sftp 客户端连接时报subsystem request failed,服务端日志显示subsystem 'sftp' not found。

原因:从 OpenSSH 8.x 开始,sftp-server 被拆成独立的 openssh-sftp-server 包,sshd_config里默认的Subsystem sftp指向/usr/lib/openssh/sftp-server,这个二进制装完 openssh-server 后不一定存在,取决于依赖包是否装上。

解决:把 openssh-sftp-server 的 deb 一并拷进离线包目录安装,然后确认/usr/lib/openssh/sftp-server文件存在。如果目标机已经启动过 sshd,装完 sftp-server 后要重启 ssh 服务,Subsystem配置才会生效。

4.4 libssl1.1 在系统里被升级或没装,报缺依赖

现象:dpkg -i ./openssh-server_*.deb报Depends: libssl1.1 (>= 1.1.1) 但无法安装,即使把 libssl 相关 deb 都放进目录里也一样。

原因:Ubuntu 20.04 标准源里 openssh 依赖的是 libssl1.1,不是 libssl3。如果目标机之前被做过软件源切换,或者 apt 自动升级把 libssl1.1 换成了 libssl3,系统的 dpkg 状态里就没有 libssl1.1 的记录。

解决:从 20.04 官方源里单独拉 libssl1.1 的 deb,路径是pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.x_amd64.deb,拷到目标机先装它,再装 openssh。注意不要和 libssl3 混装,两个库可以共存,但版本要匹配,别拿 22.04 的 libssl3 来凑。

4.5 批量装到多台机器时,apt 源指向失效的 ISO 路径,后续 install 全乱

现象:用 ISO 挂载当 apt 源装完一批机器后,某台机器重启,apt-get update报file:///mnt/iso ... 404,之后任何apt install都失败,源列表也被污染。

原因:ISO 只是临时挂载,重启后/mnt/iso路径不存在,而 sources.list.d 里写的源还指向它。apt 在这个环境下返回错误,但因为还有其他源,半好的状态会让人混淆。

解决:如果目标是临时装完就走,装完 sshd 后立刻删除 iso.list 并apt-get update恢复干净状态。如果是为了后续继续用,把 ISO 挂载写进/etc/fstab,用 nofail 参数避免开机挂载失败阻断启动流程。最保险的做法是不把 ISO 直接挂到/mnt/iso,而是拷贝到磁盘路径,比如/opt/repo/iso,这样即使 ISO 文件在磁盘上也不会因为 mount 失败而丢失源。

5. 把离线安装升级成内网部署能力:一分钟起一个本地 apt 源

装一台机器可以手动 dpkg,装五台、十台就不能再靠人肉拷贝和挨个敲命令了。把手里这些离线 deb 整理成一个本地 apt 源,让内网机器直接apt-get install openssh-server,是更一劳永逸的做法。整个过程只需要两条核心命令。

5.1 用 dpkg-scanpackages 生成 Packages 索引

apt 源的本质是一个存放 deb 的目录加一个 Packages 索引文件。dpkg-scanpackages 就是生成索引的工具,它属于 dpkg-dev 包,在联网机器上装一次 dpkg-dev 就能长期使用。

# 建目录结构 mkdir -p /opt/local-apt/packages /opt/local-apt/pool # 把所有离线 deb 拷进 pool 目录 cp /tmp/offline-ssh/*.deb /opt/local-apt/pool/ # 在源根目录生成 Packages.gz 索引 cd /opt/local-apt dpkg-scanpackages pool /dev/null | gzip > packages/Packages.gz

dpkg-scanpackages的第一个参数是存放 deb 的目录,第二个参数是覆盖文件路径,通常传/dev/null表示不覆盖。输出的就是 apt 读取的 Packages 索引,gzip 压缩后体积很小。注意整个/opt/local-apt目录要拷贝到内网所有目标机,或用内网共享路径挂载过去。

5.2 内网机接入本地源并安装

# 在目标机上添加本地源,custom 是自定义版本标识,别写成 focal 以免混淆 echo "deb [trusted=yes] file:///opt/local-apt custom main" \ | sudo tee /etc/apt/sources.list.d/local-apt.list sudo apt-get update # 现在可以像在线环境一样安装 sudo apt-get install openssh-server -y

deb [trusted=yes] file:///opt/local-apt custom main这一行里,custom和main只是让 apt 接受这个源而设的标识,不需要和 Ubuntu 发行版代号一致。写成 custom 的好处是不会和已有的 focal 源混在一起,出问题时一眼能分辨。装完之后,整个内网机器都可以通过这一个源安装 sshd 以及后续放进 pool 的其他包。

我自己的习惯是,建好本地源后把原/etc/apt/sources.list先备份一份,再在源里加包、apt-get update、安装、验证端口监听,最后确认没问题才把备份删掉。这套流程走过一遍后,离线装 sshd 就不再是玄学,而是一个标准的、可复制的部署动作。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 3:37:12

开题报告写作全攻略:P平台核心功能拆解与五阶段实操流程

1. 开题报告的真正难点在哪里:为什么那么多人都卡在这一步先说一个我在实际接触中观察到的现象:很多同学写正文、写文献综述的时候效率还行,偏偏在开题报告阶段反复返工。有人是选题被导师否了两轮,有人是研究内容写得像流水账&am…

作者头像 李华
网站建设 2026/10/13 3:35:54

不拼跑分拼稳定:DELL Pro 14 Plus商用本效能实测

一个做财务分析的哥们儿,去年换了台消费级轻薄本,i7标压加独显,纸面参数很吓人。结果这周一起开项目会,他那个本子一插上扩展坞带外接屏,风扇直接起飞,Excel里跑一个百万行的透视表,鼠标转圈转了…

作者头像 李华
网站建设 2026/10/13 3:35:53

用Codex和Obsidian搭建AI第二大脑:20分钟打造自动化知识库

先问自己一个问题:你电脑里的笔记、文档、碎片想法,是不是存完就再也不打开了?我过去也是这样。笔记越积越多,但真正要用的时候,既搜不到,也串不起来。直到把 Codex 和 Obsidian 组合成一套流程&#xff0c…

作者头像 李华
网站建设 2026/10/13 3:35:35

从零搭建大模型:Transformer原理与消费级显卡实战指南

简介:这份资源面向希望系统入门并动手实践AI大模型的开发者与学习者,围绕大模型学习方法与自建流程展开,帮助读者从理论认知走向独立搭建。内容涵盖深度学习基础概念、Transformer与BERT、GPT、T5等经典论文的研读思路,以及数据预…

作者头像 李华
网站建设 2026/10/13 3:35:11

Win10部署绿色版迅雷5:从兼容设置到排障验证

简介:面向Windows 10用户的迅雷5绿色版,定位为可下载敏感内容的防识别工具,适合追求轻量、稳定下载体验的老版本用户。压缩包共435个文件,体积仅9.09MB,涵盖大量bmp界面皮肤素材、dll运行库组件、ini配置及dat数据文件…

作者头像 李华
网站建设 2026/10/13 3:34:37

SecureCRT终端中文版配置与运维实战:会话管理、编码避坑与自动化

简介:SecureCRT终端中文版.zip 是一款面向系统管理员、网络工程师和IT运维开发者的终端仿真工具,支持SSH2、SSH1、Telnet、Telnet/SSH、Serial、TAPI及RAW协议,既能安全远程管理Linux、UNIX、Windows等服务器,也能通过串口调试路由…

作者头像 李华