Ubuntu20.04版本升级openssh9.9p1方法(含脚本)
本文最后更新于16 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

1.安装编译依赖包

apt install gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev -y

2.先升级openssl,再升级openssh

ubuntu20.04 默认openssl版本:OpenSSL 1.1.1f

(我这是22.04)

image.png

3.下载OpenSSL

访问openssl官网:https://www.openssl.org/source/
找到最新版本通过wget下载

wget https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz

注意:由于OpenSSL 1.1.x版本已停止维护,ubuntu20.04.x系统建议都使用目前长期支持版

下载最新版ssl和sshd

image.png
cd /usr/local/src/
tar xf openssl-3.3.1.tar.gz
cd openssl-3.3.1/
./config shared --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
image.png

编译安装

make&&make install

运行一段时间等编译安装完成,完成后执行echo \$?显示是否执行成功。

image.png

备份原来的openssl

mv /usr/bin/openssl  /usr/bin/openssl.bak
ln -s /usr/local/openssl/bin/openssl  /usr/bin/openssl

将openssl 的lib 库添加到系统(‘/usr/local/openssl/lib64’ 单引号)

#openssl 1.x.x版本是: /usr/local/openssl/lib/ 路径
#echo '/usr/local/openssl/lib' > /etc/ld.so.conf.d/openssl.conf
echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl.conf 

然后加载lib库

ldconfig -v

检查openssl版本

image.png

4.下载OpenSSH包

访问链接:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/通过wget下载OpenSSH_9.9p1

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p1.tar.gz

备份文件

mkdir /usr/bin/bak
cp -arpf /usr/bin/scp /usr/bin/bak/scp.bak
cp -arpf /usr/bin/sftp /usr/bin/bak/sftp.bak
cp -arpf /usr/bin/ssh /usr/bin/bak/ssh.bak
cp -arpf /usr/bin/ssh-add /usr/bin/bak/ssh-add.bak
cp -arpf /usr/bin/ssh-agent /usr/bin/bak/ssh-agent.bak
cp -arpf /usr/bin/ssh-keygen /usr/bin/bak/ssh-keygen.bak
cp -arpf /usr/bin/ssh-keyscan /usr/bin/bak/ssh-keyscan.bak
mkdir /usr/sbin/bak
cp -arpf /usr/sbin/sshd /usr/sbin/bak/sshd.bak

进入openssh-9.9p1目录,执行编译安装命令

cd /usr/local/src/
tar -zxf openssh-9.9p1.tar.gz
cd  /usr/local/src/openssh-9.9p1
./configure --prefix=/usr/local/openssh-9.9p1 --sysconfdir=/etc/ssh --with-kerberos5 --with-libedit --with-pam --with-gssapi --with-zlib --with-ssl-dir=/usr/local/openssl --with-privsep-path=/var/lib/sshd
make && make install

替换新版openssh命令

cp -arpf /usr/local/openssh-9.9p1/bin/* /usr/bin/
cp -arpf /usr/local/openssh-9.9p1/sbin/*   /usr/sbin/

修改配置文件

sed -i 's@#PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config

允许root远程登录,并重启ssh

systemctl daemon-reload
systemctl restart ssh
ssh -V  查看版本

注:遇到如下编译问题

解决方法:

安装依赖包

apt install gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev -y

5,脚本一键升级

#!/bin/bash
# 自动升级 OpenSSL 和 OpenSSH 脚本
# 适用于 Ubuntu 20.04/22.04
# 基于实际操作流程编写

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 版本配置
OPENSSL_VERSION="3.3.1"
OPENSSH_VERSION="9.9p1"
OPENSSL_URL="https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz"
OPENSSH_URL="https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${OPENSSH_VERSION}.tar.gz"

# 工作目录
WORK_DIR="/usr/local/src"

# 检查是否为 root 用户
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误:请使用 root 用户运行此脚本!${NC}"
        exit 1
    fi
}

# 检查上一步命令是否成功
check_result() {
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ 成功${NC}"
    else
        echo -e "${RED}✗ 失败${NC}"
        exit 1
    fi
}

# 安装编译依赖包
install_dependencies() {
    echo -e "${YELLOW}[1/8] 安装编译依赖包...${NC}"
    apt update
    apt install -y gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev wget
    check_result
    echo -e "${GREEN}依赖包安装完成${NC}\n"
}

# 升级 OpenSSL
upgrade_openssl() {
    echo -e "${YELLOW}[2/8] 开始升级 OpenSSL...${NC}"
    
    cd "$WORK_DIR"
    
    # 下载 OpenSSL
    if [ ! -f "openssl-${OPENSSL_VERSION}.tar.gz" ]; then
        echo -e "${BLUE}下载 OpenSSL ${OPENSSL_VERSION}...${NC}"
        wget "$OPENSSL_URL"
        check_result
    else
        echo -e "${GREEN}OpenSSL 安装包已存在,跳过下载${NC}"
    fi
    
    # 解压
    echo -e "${BLUE}解压 OpenSSL...${NC}"
    rm -rf "openssl-${OPENSSL_VERSION}"
    tar xf "openssl-${OPENSSL_VERSION}.tar.gz"
    check_result
    
    # 进入目录
    cd "openssl-${OPENSSL_VERSION}"
    
    # 配置
    echo -e "${BLUE}配置 OpenSSL 编译选项...${NC}"
    ./config shared --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
    check_result
    
    # 编译安装
    echo -e "${BLUE}编译安装 OpenSSL (可能需要几分钟)...${NC}"
    make && make install
    check_result
    
    # 验证编译是否成功
    echo -e "${BLUE}验证编译结果...${NC}"
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}OpenSSL 编译安装成功${NC}"
    else
        echo -e "${RED}OpenSSL 编译安装失败${NC}"
        exit 1
    fi
    
    # 备份原 openssl
    echo -e "${BLUE}备份原 OpenSSL...${NC}"
    if [ -f "/usr/bin/openssl" ]; then
        mv /usr/bin/openssl /usr/bin/openssl.bak
        echo -e "${GREEN}已备份到 /usr/bin/openssl.bak${NC}"
    fi
    
    # 创建软链接
    ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
    check_result
    
    # 根据系统架构确定 lib 路径
    if [ -d "/usr/local/openssl/lib64" ]; then
        LIB_PATH="/usr/local/openssl/lib64"
    else
        LIB_PATH="/usr/local/openssl/lib"
    fi
    
    # 添加库路径
    echo -e "${BLUE}添加 OpenSSL 库路径...${NC}"
    echo "$LIB_PATH" > /etc/ld.so.conf.d/openssl.conf
    check_result
    
    # 加载库
    ldconfig -v > /dev/null 2>&1
    check_result
    
    # 验证版本
    echo -e "${GREEN}OpenSSL 新版本:${NC}"
    openssl version
    echo -e "${GREEN}OpenSSL 升级完成${NC}\n"
}

# 升级 OpenSSH
upgrade_openssh() {
    echo -e "${YELLOW}[3/8] 开始升级 OpenSSH...${NC}"
    
    cd "$WORK_DIR"
    
    # 下载 OpenSSH
    if [ ! -f "openssh-${OPENSSH_VERSION}.tar.gz" ]; then
        echo -e "${BLUE}下载 OpenSSH ${OPENSSH_VERSION}...${NC}"
        wget "$OPENSSH_URL"
        check_result
    else
        echo -e "${GREEN}OpenSSH 安装包已存在,跳过下载${NC}"
    fi
    
    # 解压
    echo -e "${BLUE}解压 OpenSSH...${NC}"
    rm -rf "openssh-${OPENSSH_VERSION}"
    tar -zxf "openssh-${OPENSSH_VERSION}.tar.gz"
    check_result
    
    # 进入目录
    cd "openssh-${OPENSSH_VERSION}"
    
    # 备份原有命令
    echo -e "${BLUE}[4/8] 备份原有 OpenSSH 命令...${NC}"
    
    mkdir -p /usr/bin/bak
    mkdir -p /usr/sbin/bak
    
    # 备份 /usr/bin 下的命令
    for cmd in scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan; do
        if [ -f "/usr/bin/$cmd" ]; then
            cp -arpf "/usr/bin/$cmd" "/usr/bin/bak/${cmd}.bak"
            echo -e "${GREEN}已备份 /usr/bin/$cmd${NC}"
        fi
    done
    
    # 备份 sshd
    if [ -f "/usr/sbin/sshd" ]; then
        cp -arpf /usr/sbin/sshd /usr/sbin/bak/sshd.bak
        echo -e "${GREEN}已备份 /usr/sbin/sshd${NC}"
    fi
    
    # 备份 ssh 配置目录
    if [ -d "/etc/ssh" ]; then
        cp -arpf /etc/ssh /etc/ssh.bak
        echo -e "${GREEN}已备份 /etc/ssh 到 /etc/ssh.bak${NC}"
    fi
    
    check_result
    
    # 创建 privsep 目录
    echo -e "${BLUE}创建 privsep 目录...${NC}"
    mkdir -p /var/lib/sshd
    chmod 700 /var/lib/sshd
    
    # 配置编译选项
    echo -e "${BLUE}[5/8] 配置 OpenSSH 编译选项...${NC}"
    ./configure --prefix=/usr/local/openssh-${OPENSSH_VERSION} \
                --sysconfdir=/etc/ssh \
                --with-kerberos5 \
                --with-libedit \
                --with-pam \
                --with-gssapi \
                --with-zlib \
                --with-ssl-dir=/usr/local/openssl \
                --with-privsep-path=/var/lib/sshd
    check_result
    
    # 编译安装
    echo -e "${BLUE}[6/8] 编译安装 OpenSSH (可能需要几分钟)...${NC}"
    make && make install
    check_result
    
    # 替换新版命令
    echo -e "${BLUE}[7/8] 替换新版 OpenSSH 命令...${NC}"
    cp -arpf /usr/local/openssh-${OPENSSH_VERSION}/bin/* /usr/bin/
    cp -arpf /usr/local/openssh-${OPENSSH_VERSION}/sbin/* /usr/sbin/
    check_result
    
    # 修改配置文件
    echo -e "${BLUE}配置 SSH 允许 root 登录...${NC}"
    sed -i 's@#PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config
    sed -i 's@#PermitRootLogin yes@PermitRootLogin yes@g' /etc/ssh/sshd_config
    sed -i 's@PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config
    
    # 重启 SSH 服务
    echo -e "${BLUE}[8/8] 重启 SSH 服务...${NC}"
    systemctl daemon-reload
    systemctl restart ssh
    check_result
    
    # 验证版本
    echo -e "\n${GREEN}========== 升级结果 ==========${NC}"
    echo -e "${GREEN}OpenSSL 版本:${NC}"
    openssl version
    echo -e "\n${GREEN}OpenSSH 版本:${NC}"
    ssh -V
    
    # 检查服务状态
    echo -e "\n${BLUE}SSH 服务状态:${NC}"
    systemctl status ssh --no-pager -l
    
    echo -e "\n${GREEN}================================${NC}"
    echo -e "${GREEN}OpenSSL 和 OpenSSH 升级完成!${NC}"
    echo -e "${GREEN}================================${NC}"
    
    # 显示备份位置
    echo -e "\n${YELLOW}备份文件位置:${NC}"
    echo -e "  OpenSSL: /usr/bin/openssl.bak"
    echo -e "  OpenSSH 命令: /usr/bin/bak/"
    echo -e "  OpenSSH 服务: /usr/sbin/bak/sshd.bak"
    echo -e "  SSH 配置: /etc/ssh.bak/"
    
    echo -e "\n${YELLOW}注意事项:${NC}"
    echo -e "  1. 请保持当前 SSH 连接不要断开"
    echo -e "  2. 建议另开一个终端测试新 SSH 连接"
    echo -e "  3. 测试成功后再关闭当前连接"
    echo -e "  4. 如需回滚请联系管理员"
}

# 主函数
main() {
    echo -e "${GREEN}================================${NC}"
    echo -e "${GREEN}OpenSSL + OpenSSH 自动升级脚本${NC}"
    echo -e "${GREEN}版本: OpenSSL ${OPENSSL_VERSION} + OpenSSH ${OPENSSH_VERSION}${NC}"
    echo -e "${GREEN}适用于: Ubuntu 20.04/22.04${NC}"
    echo -e "${GREEN}================================${NC}\n"
    
    # 检查 root
    check_root
    
    # 创建工作目录
    mkdir -p "$WORK_DIR"
    
    # 显示当前版本
    echo -e "${BLUE}当前系统版本:${NC}"
    cat /etc/os-release | grep -E "NAME|VERSION" | head -2
    echo -e "\n${BLUE}当前 OpenSSL 版本:${NC}"
    openssl version 2>/dev/null || echo "未安装"
    echo -e "\n${BLUE}当前 OpenSSH 版本:${NC}"
    ssh -V 2>&1
    echo ""
    
    # 确认升级
    read -p "是否继续升级?(y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${YELLOW}升级已取消${NC}"
        exit 0
    fi
    
    # 执行升级步骤
    install_dependencies
    upgrade_openssl
    upgrade_openssh
    
    echo -e "\n${GREEN}脚本执行完毕!${NC}"
}

# 执行主函数
main

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇