本文由Codex生成
适用环境:
- 系统:UnionTech OS Server 20 / uel20 / aarch64
- 原版本:OpenSSH_8.2p1, OpenSSL 1.1.1f
- 目标版本:OpenSSH_10.3p1, OpenSSL 3.5.6, zlib 1.3.2
- 离线包目录:
/data/downloads - 新版本安装目录:
- zlib:
/usr/local/zlib-1.3.2 - OpenSSL:
/usr/local/openssl-3.5.6 - OpenSSH:
/usr/local/openssh-10.3p1
- zlib:
一、重要原则
升级 SSH 时不要关闭当前 SSH 会话。
正确操作顺序:
- 先编译安装新版 OpenSSH。
- 先启动
2222测试端口。 - 用新终端测试
ssh -p 2222 root@服务器IP。 - 测试通过后再切换生产
22端口。 - 切换生产后,再用新终端测试
ssh root@服务器IP。 - 新终端确认可以登录后,当前旧终端才可以关闭。
二、离线包准备
将以下文件放到 /data/downloads:
/data/downloads/zlib-1.3.2.tar
/data/downloads/openssl-3.5.6.tar
/data/downloads/openssh-10.3p1.tar
如果是 .tar.gz 也可以,脚本会自动识别:
zlib-1.3.2.tar.gz
openssl-3.5.6.tar.gz
openssh-10.3p1.tar.gz
三、一键脚本运行方式
脚本路径示例:
/root/upgrade_openssh_10.3p1.sh
先做语法检查:
bash -n /root/upgrade_openssh_10.3p1.sh
没有输出表示语法检查通过。
默认运行,只编译并启动 2222 测试端口,不替换生产 SSH:
bash /root/upgrade_openssh_10.3p1.sh
测试端口登录:
ssh -p 2222 root@服务器IP
测试通过后,切换生产 22 端口:
bash /root/upgrade_openssh_10.3p1.sh --switch
四、当前遇到的问题和处理方式
1. 找不到 pam-devel
现象:
rpm -qa | grep pam
只有:
pam-1.4.0-8.up5.uel20.aarch64
没有:
pam-devel
处理方式:
- 本次 OpenSSH 按无 PAM 方式编译。
- 不使用
--with-pam。 - 配置文件里不能写
UsePAM yes或UsePAM no,需要注释掉UsePAM整行。
原因:
无 PAM 编译时,新版 sshd 不认识 UsePAM 这个配置项。如果配置里存在该项,会出现:
Unsupported option UsePAM
2. OpenSSL libssl.so.3 找不到
现象:
/usr/local/openssl-3.5.6/bin/openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
原因:
OpenSSL 已安装,但系统动态链接器没有加载 /usr/local/openssl-3.5.6/lib。
处理方式:
cat > /etc/ld.so.conf.d/openssl-3.5.6-openssh-upgrade.conf <<'EOF'
/usr/local/openssl-3.5.6/lib64
/usr/local/openssl-3.5.6/lib
/usr/local/zlib-1.3.2/lib
EOF
ldconfig
验证:
/usr/local/openssl-3.5.6/bin/openssl version -a
3. RSAAuthentication 旧参数告警
现象:
Deprecated option RSAAuthentication
Deprecated option RhostsRSAAuthentication
处理方式:
注释旧参数:
sed -i \
-e 's/^[[:space:]]*RSAAuthentication[[:space:]].*/#&/' \
-e 's/^[[:space:]]*RhostsRSAAuthentication[[:space:]].*/#&/' \
/etc/ssh/sshd_config
4. GSSAPI 参数兼容问题
部分新版 OpenSSH 可能不支持旧配置里的 GSSAPI 参数。
处理方式:
sed -i \
-e 's/^[[:space:]]*GSSAPIAuthentication[[:space:]].*/#&/' \
-e 's/^[[:space:]]*GSSAPICleanupCredentials[[:space:]].*/#&/' \
/etc/ssh/sshd_config
5. 主机密钥权限问题
新版 sshd 对主机密钥权限要求较严格。
处理方式:
chown root:root /etc/ssh/ssh_host_*
chmod 600 /etc/ssh/ssh_host_*_key
chmod 644 /etc/ssh/ssh_host_*_key.pub
chmod 755 /etc/ssh
chmod 644 /etc/ssh/sshd_config
五、验证服务端版本
注意:
在服务器上执行:
ssh -V
看到的是本机 SSH 客户端版本,不是服务端 sshd 版本。
服务端是否已切换,看下面命令。
查看 systemd 状态:
systemctl status sshd --no-pager
应看到类似:
sshd: /usr/local/openssh-10.3p1/sbin/sshd -D [listener]
查看进程:
ps -ef | grep '[s]shd'
验证新版服务端二进制:
/usr/local/openssh-10.3p1/sbin/sshd -V
客户端远程确认服务端 banner:
ssh -vvv root@服务器IP
输出中应有类似:
remote software version OpenSSH_10.3
六、停止 2222 测试端口
生产 22 端口切换并验证成功后,可以停止测试端口:
kill $(cat /tmp/sshd-10.3p1-test.pid)
rm -f /tmp/sshd-10.3p1-test.pid
确认 2222 不再监听:
ss -lnt | grep ':2222' || echo "2222 test sshd stopped"
七、替换 ssh -V 客户端显示
生产 sshd 切换后,服务器上执行 ssh -V 仍可能显示旧版本:
OpenSSH_8.2p1, OpenSSL 1.1.1f
这是因为 /usr/bin/ssh 还是系统旧客户端。
如果需要让 ssh -V 显示新版,可以用软链接替换客户端命令。
1. 备份旧客户端
TS=(date +%F-%H%M%S)
cp -a /usr/bin/ssh /usr/bin/ssh.old-8.2p1-TS
cp -a /usr/bin/scp /usr/bin/scp.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/sftp /usr/bin/sftp.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-agent /usr/bin/ssh-agent.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-add /usr/bin/ssh-add.old-8.2p1-$TS 2>/dev/null || true
2. 创建新版软链接
ln -sf /usr/local/openssh-10.3p1/bin/ssh /usr/bin/ssh
ln -sf /usr/local/openssh-10.3p1/bin/scp /usr/bin/scp
ln -sf /usr/local/openssh-10.3p1/bin/sftp /usr/bin/sftp
ln -sf /usr/local/openssh-10.3p1/bin/ssh-keygen /usr/bin/ssh-keygen
ln -sf /usr/local/openssh-10.3p1/bin/ssh-agent /usr/bin/ssh-agent
ln -sf /usr/local/openssh-10.3p1/bin/ssh-add /usr/bin/ssh-add
3. 验证客户端版本
which ssh
ls -l /usr/bin/ssh
ssh -V
scp -V 2>&1 | head -1
sftp -V 2>&1 | head -1
预期:
OpenSSH_10.3p1, OpenSSL 3.5.6
4. 更保守的方式:只改 PATH
如果不想改 /usr/bin,可以只改 PATH:
echo 'export PATH=/usr/local/openssh-10.3p1/bin:$PATH' > /etc/profile.d/openssh-10.3p1.sh
source /etc/profile.d/openssh-10.3p1.sh
ssh -V
这种方式不会覆盖系统命令,但只对加载该 profile 的 shell 生效。
八、服务端回滚
如果执行 --switch 后,新终端无法登录 22 端口,但当前旧终端还在,立即执行:
systemctl revert sshd
systemctl daemon-reload
systemctl restart sshd
systemctl status sshd --no-pager
恢复 sshd 配置文件。
查看脚本自动备份:
ls -lh /etc/ssh/sshd_config.before-10.3p1-*
选择最近的备份恢复:
cp -a /etc/ssh/sshd_config.before-10.3p1-具体时间 /etc/ssh/sshd_config
systemctl restart sshd
也可以使用脚本开头生成的完整备份目录:
ls -ld /root/ssh-bak-*
恢复示例:
cp -a /root/ssh-bak-具体时间/ssh/sshd_config /etc/ssh/sshd_config
systemctl restart sshd
回滚后重新开一个终端测试:
ssh root@服务器IP
九、客户端软链接回滚
如果已经替换了 /usr/bin/ssh 等客户端命令,需要回滚:
先找到备份:
ls -lh /usr/bin/ssh.old-8.2p1-*
ls -lh /usr/bin/scp.old-8.2p1-* 2>/dev/null
ls -lh /usr/bin/sftp.old-8.2p1-* 2>/dev/null
删除软链接并恢复旧文件:
rm -f /usr/bin/ssh /usr/bin/scp /usr/bin/sftp
cp -a /usr/bin/ssh.old-8.2p1-具体时间 /usr/bin/ssh
cp -a /usr/bin/scp.old-8.2p1-具体时间 /usr/bin/scp 2>/dev/null || true
cp -a /usr/bin/sftp.old-8.2p1-具体时间 /usr/bin/sftp 2>/dev/null || true
如果也替换了管理工具:
rm -f /usr/bin/ssh-keygen /usr/bin/ssh-agent /usr/bin/ssh-add
cp -a /usr/bin/ssh-keygen.old-8.2p1-具体时间 /usr/bin/ssh-keygen 2>/dev/null || true
cp -a /usr/bin/ssh-agent.old-8.2p1-具体时间 /usr/bin/ssh-agent 2>/dev/null || true
cp -a /usr/bin/ssh-add.old-8.2p1-具体时间 /usr/bin/ssh-add 2>/dev/null || true
验证:
ssh -V
应恢复为:
OpenSSH_8.2p1, OpenSSL 1.1.1f
十、最终验收命令
服务端验收:
systemctl status sshd --no-pager
ps -ef | grep '[s]shd'
/usr/local/openssh-10.3p1/sbin/sshd -V
客户端验收:
ssh -V
which ssh
ls -l /usr/bin/ssh
远程连接验收:
ssh root@服务器IP
ssh -vvv root@服务器IP
如果 ssh -vvv 中显示:
remote software version OpenSSH_10.3
说明远端服务端已经是新版。
十一、注意事项
- 本次因为缺少
pam-devel,OpenSSH 是无 PAM 编译。 - 无 PAM 版本不要在
sshd_config中保留UsePAM。 - 生产切换前必须确认
2222测试端口可以登录。 - 生产切换后必须新开终端确认
22端口可以登录。 - 不要在未验证新连接前关闭当前 SSH 会话。
/usr/bin/ssh是客户端命令,/usr/local/openssh-10.3p1/sbin/sshd是服务端守护进程,不要混淆。
