恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Ubuntu下源码编译升级OpenSSH 9.5p1与zlib-1.3实战指南

  • 首页
  • 资讯中心
  • /
  • Ubuntu下源码编译升级OpenSSH 9.5p1与zlib-1.3实战指南

相关资讯

Qt 类本质就是 C++ 的类,只是 Qt 框架扩展了一套【QObject 对象模型】 2026/10/20 22:17:21
基于Python+Hadoop+Spark的新闻推荐系统与热点分析实战 2026/10/20 22:17:21
MIMO非线性系统控制:预设性能+无模型自适应+分数阶快速终端滑模仿真实践 2026/10/20 22:12:21

最新资讯

WinForms DataGridViewComboBox输入自动匹配实战指南
HyperDbg内核调试器:Ring0实时调试与EPT内存监控实战指南
学生信息管理系统:SSM架构下的数据一致性与工程落地实践
WinForm登录状态机设计:事件解耦与DPAPI安全存储实战
Quartz动态设置并发数量
纯Java数据包处理实战:抓包解析过滤统计全链路

今日推荐

SAP 屏幕上的金额未必存在数据库表里,从 WB2R_SV 的 Net Amount 看懂运行时计算
具身智能中‘指哪打哪’的视觉语言动作联合建模
AI时代人工翻译技术博客的价值与实践指南

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Ubuntu下源码编译升级OpenSSH 9.5p1与zlib-1.3实战指南

发布时间:2026/10/20 22:17:21
Ubuntu下源码编译升级OpenSSH 9.5p1与zlib-1.3实战指南 简介面向Ubuntu服务器管理员与运维人员这一升级资料包含OpenSSH 9.5p1和zlib 1.3源码包及自动化脚本用于解决旧版远程管理服务的安全漏洞与压缩库兼容问题可在Ubuntu环境中一键编译、安装并完成服务切换。资源包体积小共3个文件包括两个tar.gz格式源码包与一个shell脚本整体约3.18MB适合直接拷贝到生产或测试服务器使用。脚本详细覆盖环境检查、zlib编译安装、OpenSSH编译安装、sshd配置调整、服务重启及ssh -V版本验证等关键步骤同时包含升级前备份提示帮助降低操作失误带来的回滚风险。目前已有706人学习下载适合需要快速加固OpenSSH的Linux运维人员也适合希望理解源码依赖关系的入门者参考。借助这一套资源能够将安全补丁快速落地在提升远程管理稳定性的同时减少手工编译的重复工作。1. 升级 OpenSSH被漏洞通报追着跑的一次环境改造很多开发者的 Ubuntu 服务器跑着 OpenSSH 8.x 甚至更老的版本平时没人觉得它碍事直到某天安全扫描报告把sshd列为高危漏洞并要求限期修复。Ubuntu 的 apt 仓库又不会那么快推送新版 OpenSSH于是「手动下载源码、编译、升级」这条路就成了一道绕不过去的坎。这套流程本身不难但真正做起来踩坑的点几乎都藏在依赖版本、编译参数和配置文件的细节里——一个没注意到就可能把自己锁在服务器门外。这篇文章就把我实际做过的一套升级整理出来目标版本是 OpenSSH 9.5p1 zlib-1.3适合正在 Ubuntu 上被版本兼容、编译报错、升级后断连折腾的朋友照着做能省下不少冤枉路。2. 版本与环境为什么是 9.5p1 和 zlib-1.32.1 从 apt 仓库到手动编译的路线选择先说一个很多人会问的问题为什么不直接用apt install openssh-server原因很简单——Ubuntu 20.04 的默认仓库里OpenSSH 版本停留在 8.2p122.04 也只有 8.9p1。这两个版本在安全扫描工具里往往会被标记为存在已知 CVE而且 apt 仓库更新节奏偏慢指望它快速跟上上游是不太现实的。另一个思路是添加 PPA 源比如某些维护者会提供新版 OpenSSH 的 PPA。但 PPA 的方式有两个风险第一第三方源的编译配置未必和你的系统完全匹配依赖关系可能冲突第二你无法控制它编译时带了哪些功能特性比如是否保留 PAM 支持。对于生产环境我更倾向于从官方源码自己编译这样每一步配了什么参数、装到了哪里、哪些旧文件被替换了心里都有数。版本选择上OpenSSH 9.5p1 是当时较新的稳定版本线修复了多个漏洞也在sshd的默认配置上有一些调整。zlib-1.3 则是配套的压缩库更新OpenSSH 在启用Compression功能时会链接到 zlib顺手升级能让链路都处于较新状态。这个组合在我的模拟项目X环境里跑过完整验证Debian 系的 Ubuntu 20.04/22.04 都能用。2.2 三个前置依赖的安装与验证编译 OpenSSH 之前需要先把系统基础依赖装齐。这里说的不是 zlib 本身而是编译工具链和 OpenSSL 开发头文件。sudo apt update sudo apt install -y build-essential gcc make libssl-dev libpam0g-dev libkrb5-dev这行命令里build-essential会拉取 gcc、g、make 等基础编译工具libssl-dev提供 OpenSSL 的头文件OpenSSH 编译时缺了它会直接报openssl/opensslv.h: No such file or directorylibpam0g-dev是为了让新版 sshd 保留 PAM 认证支持如果你原系统曾配置过密码登录或UsePAM相关选项这一步别跳过libkrb5-dev则对应 Kerberos 支持用不到可以不装但装上有备无患。安装完后建议顺手验证一下工具链版本gcc --version make --version openssl version我的实测环境里gcc 9.4.0、OpenSSL 1.1.1f 的组合可以顺利完成 OpenSSH 9.5p1 的编译。如果你系统里的 OpenSSL 版本是 3.x 系列编译时可能会遇到一些 API 调整导致的小警告一般不影响最终产物但要注意编译输出里有没有出现error:级别的信息。这一步做完环境准备就算打底了。3. 编译安装OpenSSH 9.5p1 与 zlib-1.3 的完整落地流程3.1 下载源码并解压源码获取走官方归档路径OpenSSH 的稳定版可以在官方镜像站找到zlib 则从 zlib.net 或 GitHub 归档下载。我这里用的是固定版本号 9.5p1 和 1.3避免拉取滚动更新导致行为不可控。cd /usr/local/src wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.5p1.tar.gz wget https://zlib.net/zlib-1.3.tar.gz tar -zxvf openssh-9.5p1.tar.gz tar -zxvf zlib-1.3.tar.gz之所以把源码统一放在/usr/local/src是为了让后续编译产物和源码保持隔离编译完的二进制在/usr/local/bin和/usr/local/sbin源码则在/usr/local/src下方便排查时对照查看。下载后建议校验一下文件的 SHA256 哈希特别是从镜像站拉文件时哈希对不上就换源重下别在损坏的压缩包上浪费时间。解压完成后目录结构应该是两个独立的文件夹先进入 zlib 的目录开始编译。有一点要提前说明zlib 是一个独立库OpenSSH 并不会自动去编译它而是通过--with-zlib参数指定路径去链接。你先把 zlib 装好OpenSSH 编译时才能找到它的头文件和静态库。3.2 先装 zlib-1.3 再编 OpenSSH 的顺序不能反zlib 的编译比较简单三步走完cd /usr/local/src/zlib-1.3 ./configure --prefix/usr/local/zlib make -j$(nproc) sudo make install--prefix/usr/local/zlib指定了安装目录这样不会污染系统的/usr目录后续卸载也方便——直接删掉这个目录就行。-j$(nproc)表示用满所有 CPU 核心并行编译如果服务器核数很多但内存不大可以改成-j2或-j4避免编译时内存被打满。zlib 编译通常一两分钟就能完成看到make install把头文件和库文件放进/usr/local/zlib就算成功。接下来是 OpenSSH 本体。这里要特别提醒一个顺序问题先编译 zlib再编译 OpenSSH绝不能反过来。OpenSSH 的configure脚本会去检查 zlib 是否存在如果找不到即便最终编译出了 sshd运行时启用压缩也会报错或者根本起不来服务。我在第一次做的时候图省事先编了 OpenSSH 再回头装 zlib结果sshd -t直接报缺库只能全部重来。cd /usr/local/src/openssh-9.5p1 ./configure --prefix/usr/local/openssh \ --with-zlib/usr/local/zlib \ --with-ssl-dir/usr/lib/ssl \ --with-pam \ --with-privsep-path/var/empty \ -sysconfdir/etc/ssh make -j$(nproc) sudo make install每个参数都值得展开说明。--prefix/usr/local/openssh把 OpenSSH 装到独立目录好处是旧版二进制还在/usr/bin/ssh和/usr/sbin/sshd万一新版有问题可以快速切回--with-zlib/usr/local/zlib就是前面提到的链接关键--with-ssl-dir/usr/lib/ssl指向系统 OpenSSL 配置目录有些环境里这个路径是/usr/lib/x86_64-linux-gnu/ssl可以用openssl version -d查一下再做对应修改--with-pam保留 PAM 认证不配的话密码登录大概率会失败--with-privsep-path/var/empty是特权分离的占位目录OpenSSH 要求这个目录存在且为空-sysconfdir/etc/ssh让新版本的配置文件继续沿用/etc/ssh/sshd_config不会额外生成一套新配置。如果你打算保持系统原有的服务管理方式这里还有一个小改动值得做make install之后OpenSSH 会默认把sshd放到/usr/local/openssh/sbin下但 systemd 的ssh.service单元文件写死的路径是/usr/sbin/sshd。最常见做法是把新编译的二进制替换过去替换前先备份。这一步我会放在后面验证章节详细说因为替换时机和回滚方案是绑在一起的。编译过程如果顺利最后会看到make install输出的安装清单。如果中间报错优先看是不是缺了libssl-dev或者zlib路径写错这两个是最高频的问题。3.3 一键升级脚本把这套流程固化成 800 行内的自动化手动编译过一次之后第二个环境再升级时我就不想重复敲命令了。整条流程完全可以脚本化做成只传一个目标版本号就能跑完的部署脚本。这类脚本在标题里叫“一键升级”实际落地时无非是把下载、解压、编译、安装、备份、替换、重启服务这几步串起来。脚本的核心骨架大致是这样#!/usr/bin/env bash set -e OPENSSH_VER9.5p1 ZLIB_VER1.3 BACKUP_DIR/root/backup_ssh_$(date %Y%m%d%H%M%S) apt update apt install -y build-essential gcc make libssl-dev libpam0g-dev mkdir -p $BACKUP_DIR cp /usr/sbin/sshd $BACKUP_DIR/sshd.old 2/dev/null || true cp /usr/bin/ssh $BACKUP_DIR/ssh.old 2/dev/null || true cp /etc/ssh/sshd_config $BACKUP_DIR/sshd_config.old cd /usr/local/src wget -c http://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-$OPENSSH_VER.tar.gz wget -c http://zlib.net/zlib-$ZLIB_VER.tar.gz tar -zxvf openssh-$OPENSSH_VER.tar.gz tar -zxvf zlib-$ZLIB_VER.tar.gz cd /usr/local/src/zlib-$ZLIB_VER ./configure --prefix/usr/local/zlib make -j$(nproc) make install cd /usr/local/src/openssh-$OPENSSH_VER ./configure --prefix/usr/local/openssh \ --with-zlib/usr/local/zlib \ --with-ssl-dir/usr/lib/ssl \ --with-pam \ --with-privsep-path/var/empty \ --sysconfdir/etc/ssh make -j$(nproc) make install install -m 0755 /usr/local/openssh/sbin/sshd /usr/sbin/sshd install -m 0755 /usr/local/openssh/bin/ssh /usr/bin/ssh systemctl restart sshd ssh -Vset -e是这脚本的保险丝——任何一个步骤返回非零状态就立刻中止不会在失败的前提下继续往下执行覆盖文件。备份环节的true是为了避免首次执行时旧版本二进制不存在导致cp报错而中断脚本。install命令替代单纯的cp好处是能明确设置权限位sshd文件的权限错乱是升级后服务起不来的隐蔽原因之一。这个脚本我没有写到绝对健壮比如没做下载文件的哈希校验、没判断网络超时重试但对于内网批量环境这个粒度已经够用。脚本执行完后sshd -V的输出会确认版本是否切换成功。如果你要在我这个基础上继续完善建议加上对旧配置的兼容性检查——sshd -t放在systemctl restart之前配置有问题时提前暴露而不是重启后才发现连不上。4. 避坑指南升级 OpenSSH 最容易翻车的 5 个瞬间4.1 升级到一半 SSH 断连回不去了现象执行完make install后当前 SSH 会话直接卡死或断开再连接时提示拒绝连接。原因OpenSSH 的make install默认会替换/usr/local/openssh下的文件但如果你的系统sshd是通过 systemd 启动的而ssh.service单元文件里的ExecStart指向/usr/sbin/sshd那么make install并没有真正让运行中的服务切换版本。更危险的是如果你之后手动把新sshd复制到了/usr/sbin/sshd但没有重启服务或者重启时配置不兼容sshd 就会直接退出当前所有 SSH 连接都会断开。解决升级前先确认自己当前会话是 SSH 进来的并且保留一个带外控制渠道比如云控制台 VNC 或者本地物理终端。然后在替换二进制之前先执行sshd -t验证新配置。更稳妥的做法是写一个所谓的“自杀脚本”——把替换、重启、回滚三步打包重启后在 30 秒内检测 SSH 端口是否还能连通连不上就自动恢复旧版本。这套逻辑我第一次升级时没做结果半夜差点跑到机房去按重启键。4.2 PAM 认证失效密码和密钥都登不进来现象新版本 sshd 能启动ssh -V也显示 9.5p1但登录时报Permission denied密码确认没错密钥也加载正常。原因编译时没带--with-pam参数导致新sshd没有链接 PAM 库。Ubuntu 默认配置里UsePAM yes而新 sshd 又没有 PAM 支持认证链路直接断裂。另一个常见诱因是系统 PAM 配置里引用了旧版本 sshd 才有的模块路径比如未安装libpam-modules导致的 missing module 报错。解决编译参数里补上--with-pam并且在make install后确认ldd /usr/sbin/sshd能看到libpam.so相关输出。另外检查/etc/pam.d/sshd是否存在缺失时可以从同版本系统复制一份或者用sudo pam-auth-update重建。我一般在替换二进制之前就跑一次sshd -t如果它输出关于 PAM 配置的fatal错误说明问题在编译参数而不是配置文件。4.3 版本号没变还在 8.x 或 9.x 旧版现象跑完整个编译安装流程执行ssh -V显示的依旧是旧版本号。原因ssh -V调用的是/usr/bin/ssh而make install默认把二进制放到了/usr/local/openssh/bin。如果你用了--prefix参数又没有手动替换/usr/bin/ssh和/usr/sbin/sshd那么 shell 找到的还是旧版。另外有些发行版会把/usr/local/bin排进 PATH但 ssh 装在/usr/local/openssh/bin并不会自动被 PATH 包含。解决手动替换两份关键二进制或者做一个软链接。我之前用的一直是install -m 0755 /usr/local/openssh/bin/ssh /usr/bin/ssh install -m 0755 /usr/local/openssh/sbin/sshd /usr/sbin/sshd替换后记得验证。4.4 sshd 启动失败但没报错信息现象systemctl restart sshd后服务显示 active但端口22没有监听。systemctl status sshd输出里也没有明显错误。原因最常见的是新编译的 sshd 依赖的库文件路径不在系统默认搜索范围内。比如你用--with-zlib/usr/local/zlib安装了 zlib但/usr/local/zlib/lib不在ldconfig配置里sshd启动时找不到libz.so.1。这类问题不会在编译时报错而是运行时的“隐性缺库”。解决执行ldd /usr/sbin/sshd | grep zlib检查依赖是否能被解析。如果显示libz.so.1 not found把/usr/local/zlib/lib加到/etc/ld.so.conf.d/下新建的配置文件中然后运行ldconfig。我的做法是echo /usr/local/zlib/lib /etc/ld.so.conf.d/zlib.conf ldconfig再重启 sshd 就能起来。这个坑很隐蔽因为make阶段根本不会提示你只有到运行阶段才爆发。4.5 新版本跑起来了但下次重启服务又变回旧版现象当前运行的新版 sshd 正常但系统重启或systemctl restart sshd后进程又变成旧版。原因systemd 单元的ExecStart/usr/sbin/sshd是静态路径而/usr/sbin/sshd如果被替换成软链接指向/usr/local/openssh/sbin/sshd在某些场景下软链接会被替换掉或者原文件被包管理器更新覆盖。Ubuntu 自动安全更新unattended-upgrades可能会覆盖/usr/bin/ssh重新装回旧版本导致 PATH 里的版本又回到原点。解决彻底一点的做法是生成自定义 systemd unit直接指向新二进制路径。我在/etc/systemd/system/ssh.service里做覆盖[Service] ExecStart/usr/local/openssh/sbin/sshd -D然后systemctl daemon-reload systemctl restart sshd。这样做会让版本切换变得显式避免被下一次 apt 升级悄悄改回去。代价是你需要保证/usr/local/openssh里的二进制和配置一直完整丢失的话 systemd 会直接起不来服务——这也是为什么备份目录不能删的原因。5. 验证与回滚升级后必须跑通的三步检查在把版本切换正式交付给业务之前我有一套固定检查流程跑完了才算升级真正结束。第一步是配置文件语法验证和环境依赖验证。新版本对旧配置文件的兼容性并不总是百分百9.5p1 对某些废弃参数会直接拒绝启动而不是警告后忽略。所以我每次都会执行/usr/local/openssh/sbin/sshd -t如果输出Bad configuration options之类的行说明配置里有已删除的指令参照报错行号逐一清理再重测。-t只测配置不启服务安全无副作用可以反复跑。第二步在替换systemctl restart sshd后检查服务状态和端口监听情况systemctl status sshd ss -ltnp | grep :22服务状态出现active (running)只是第一步端口有监听才说明 sshd 真正在服务。接着用另一台机器尝试远程登录一次而不仅是本地ssh localhost。本地连接成功但远端失败的情况很多比如防火墙、hosts.allow 规则、云安全组没有放行新监听的 IP 段。第三步验证版本和特性链路ssh -V /usr/local/openssh/sbin/sshd -V 21ssh -V输出里应该包含OpenSSH_9.5p1sshd 的版本输出会附带编译参数信息确认--with-pam、--with-zlib都已生效。再测试压缩链路是否正常启用从客户端执行ssh -C userserver echo connected如果连接建立且服务器端日志没有压缩相关报错说明 zlib 1.3 与新版 OpenSSH 的链接没有问题。最后说回滚方案。我把旧版二进制备份在/root/backup_ssh_*下回滚时只需把备份的sshd和ssh复原、重启服务。这个方案能成立的前提是旧版配置没有被新版启动过程改写——所以升级前cp一份sshd_config也是必做步骤。现在每次升级 OpenSSH我都强制自己走一遍“备份 — 编译 — 配置校验 — 重启 — 远端登录验证”的完整链路缺一步都不收工。这套流程从第一次手忙脚乱到现在稳定复现中间摔过的跤都在前面章节写进了避坑清单希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号