CentOS 7 升级 OpenSSH 版本脚本
-
如果服务器不能联网需要将 安装包复制到 /opt/
安装包下载地址:
https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p1.tar.gz https://www.openssl.org/source/openssl-1.1.1q.tar.gz https://www.zlib.net/zlib-1.3.1.tar.gz
千万不要关闭SHELL窗口!
千万不要关闭SHELL窗口!
千万不要关闭SHELL窗口!#!/bin/bash clear echo -e "\033[1m\033[33m 本脚本目前实测在CentOS 7可用,会自动升级openssl 1.1.1版本 和 zlib 1.3.1 版本 \033[0m" echo " " echo -e "\033[1m\033[33m 如服务器不能联网请将安装包复制到目录 /opt/ 中,因为要安装依赖,需添加本地安装源 参考:51.ruyo.net/18728.html \033[0m" echo " " echo -e "\033[1m\033[31m重要提示:升级组件是高风险操作,很容易出现系统无法启动无法SSH远程或业务崩溃等问题。\033[0m" echo " " echo -e "\033[1m\033[33m若是生产环境,请务必做好快照或数据备份后操作。\033[0m" echo " " echo -e "\033[1m\033[34m若已做好了备份,请输入y回车继续安装,若不升级,输入n离开。\033[0m" echo " " echo -e "\033[1m\033[33m因安装过程中需要卸载openssh,所以安装过程中务必【不要关闭终端】,不然无法连接SSH\033[0m" echo " " read -p "三思而后行,上面提示有查看吗?继续执行升级操作吗? (y/n): " choice echo " " if [[ "$choice" != "y" && "$choice" != "Y" ]]; then echo "操作已取消。" exit 0 fi # 版本定义 zlib_version="zlib-1.3.1" openssl_version="openssl-1.1.1q" openssh_version="openssh-9.9p1" # 路径定义 install_dir="/usr/local" work_dir="/opt" install_log="/opt/install.log" # 安装包路径 zlib_package="$work_dir/$zlib_version.tar.gz" openssl_package="$work_dir/$openssl_version.tar.gz" openssh_package="$work_dir/$openssh_version.tar.gz" # 安装依赖 echo -e "\033[33m 正在安装必要依赖包... \033[0m" yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel zlib-devel wget tar >/dev/null 2>&1 if [[ $? -ne 0 ]]; then echo -e "\033[31m 依赖包安装失败,请检查网络连接或本地软件源配置。 \033[0m" exit 1 fi # 下载必要文件 download_package() { local url=$1 local target=$2 if [[ ! -e $target ]]; then echo -e "\033[33m 下载 $target... \033[0m" wget --no-check-certificate -O $target $url if [[ $? -ne 0 ]]; then echo -e "\033[31m 下载 $target 失败,请检查网络连接。 \033[0m" exit 1 fi else echo -e "\033[32m 检测到 $target 已存在,跳过下载。 \033[0m" fi } download_package "https://www.zlib.net/$zlib_version.tar.gz" $zlib_package download_package "https://www.openssl.org/source/$openssl_version.tar.gz" $openssl_package download_package "https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/$openssh_version.tar.gz" $openssh_package # 安装 zlib install_zlib() { echo -e "\033[33m 开始安装 zlib... \033[0m" tar -xzf $zlib_package -C $work_dir cd $work_dir/$zlib_version ./configure --prefix=$install_dir/$zlib_version && make && make install echo "$install_dir/$zlib_version/lib" > /etc/ld.so.conf.d/zlib.conf ldconfig } # 安装 OpenSSL install_openssl() { echo -e "\033[33m 开始安装 OpenSSL... \033[0m" tar -xzf $openssl_package -C $work_dir cd $work_dir/$openssl_version ./config shared zlib --prefix=$install_dir/$openssl_version && make && make install ln -sf $install_dir/$openssl_version/bin/openssl /usr/bin/openssl ln -sf $install_dir/$openssl_version/lib/libssl.so.1.1 /usr/lib64/ ln -sf $install_dir/$openssl_version/lib/libcrypto.so.1.1 /usr/lib64/ ldconfig } # 安装 OpenSSH install_openssh() { echo -e "\033[33m 开始安装 OpenSSH... \033[0m" tar -xzf $openssh_package -C $work_dir cd $work_dir/$openssh_version ./configure --prefix=$install_dir/$openssh_version \ --sysconfdir=/etc/ssh \ --with-zlib=$install_dir/$zlib_version \ --with-ssl-dir=$install_dir/$openssl_version \ --without-openssl-header-check make && make install cp $work_dir/$openssh_version/sshd_config /etc/ssh/ } # 修复 sshd_config 配置 fix_sshd_config() { echo -e "\033[33m 修复 sshd_config 文件... \033[0m" sed -i 's/^GSSAPIAuthentication/#GSSAPIAuthentication/' /etc/ssh/sshd_config sed -i 's/^GSSAPICleanupCredentials/#GSSAPICleanupCredentials/' /etc/ssh/sshd_config sed -i 's/^UsePAM/#UsePAM/' /etc/ssh/sshd_config } # 生成主机密钥 generate_host_keys() { echo -e "\033[33m 生成缺失的主机密钥... \033[0m" ssh-keygen -A if [[ $? -ne 0 ]]; then echo -e "\033[31m 主机密钥生成失败,请检查日志。 \033[0m" exit 1 fi } # 修复密钥权限 fix_key_permissions() { echo -e "\033[33m 修复主机密钥权限... \033[0m" for key_file in /etc/ssh/ssh_host_*.key; do if [[ -e $key_file ]]; then chmod 600 $key_file else echo -e "\033[31m 主机密钥 $key_file 不存在,重新生成... \033[0m" ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" chmod 600 /etc/ssh/ssh_host_*.key fi done } replace_old_binaries() { echo -e "\033[33m 替换旧版本的 OpenSSH 二进制文件... \033[0m" cp $install_dir/$openssh_version/sbin/sshd /usr/sbin/sshd cp $install_dir/$openssh_version/bin/ssh /usr/bin/ssh cp $install_dir/$openssh_version/bin/scp /usr/bin/scp cp $install_dir/$openssh_version/bin/sftp /usr/bin/sftp echo -e "\033[32m 替换完成。 \033[0m" } # 重启 sshd 服务 restart_sshd() { echo -e "\033[33m 重启 sshd 服务... \033[0m" systemctl restart sshd if [[ $? -ne 0 ]]; then echo -e "\033[31m sshd 服务启动失败,请检查日志。 \033[0m" journalctl -xe | tail -n 20 exit 1 else echo -e "\033[32m sshd 服务已成功启动。 \033[0m" fi } # 执行安装步骤 install_zlib install_openssl install_openssh fix_sshd_config #generate_host_keys #fix_key_permissions replace_old_binaries restart_sshd # 验证安装 echo -e "\033[32m 安装完成,版本信息如下: \033[0m" openssl version ssh -V