#!/bin/bash
set -e
CONFIG_FILE="/etc/ssh/sshd_config"
# 备份原文件
cp -p "$CONFIG_FILE" "${CONFIG_FILE}.bak.$(date +%F_%T)"
# 批量注释指定行(无论是否已有注释都注释)
sed -i -r '
s/^[[:space:]]*(GSSAPIAuthentication[[:space:]]+yes)/# \1/i
s/^[[:space:]]*(GSSAPICleanupCredentials[[:space:]]+no)/# \1/i
s/^[[:space:]]*(UsePAM[[:space:]]+yes)/# \1/i
' "$CONFIG_FILE"
# 设置版本
OPENSSL_VER="3.5.1"
OPENSSH_VER="10.0p2"
OPENSSL_TAR="openssl-${OPENSSL_VER}.tar.gz"
OPENSSH_TAR="openssh-${OPENSSH_VER}.tar.gz"
TARGET_DIR="/usr/local/src" # 目标目录(编译目录)
OPENSSL_INSTALL_DIR="/usr/local/openssl" # OpenSSL安装目录
# 切换yum源为阿里云
cd /etc/yum.repos.d/
# 仅在bak文件夹不存在时创建
if [ ! -d "bak" ]; then
mkdir bak
fi
# 仅在aliyun.repo不存在时执行替换操作
if [ ! -f aliyun.repo ]; then
mv *.repo /etc/yum.repos.d/bak 2>/dev/null || true
wget -O /etc/yum.repos.d/aliyun.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache
fi
# 安装依赖
yum install -y gcc make zlib-devel pam-devel wget tar \
perl-core autoconf automake libtool \
libedit-devel openssl-devel
# 定义文件检查和复制/下载函数
get_tar_file() {
local tar_name=$1
local source_url=$2
local target_dir=$3
# 1. 检查当前目录是否有目标tar包
if [ -f "./${tar_name}" ]; then
echo "当前目录存在${tar_name},复制到${target_dir}..."
cp "./${tar_name}" "${target_dir}/"
return 0
fi
# 2. 检查目标目录是否已有tar包(避免重复操作)
if [ -f "${target_dir}/${tar_name}" ]; then
echo "${target_dir}已存在${tar_name},跳过处理..."
return 0
fi
# 3. 上述情况都不满足,从网络下载
echo "开始下载${tar_name}..."
cd "${target_dir}" || exit 1
# 尝试直接下载
if wget --timeout=10 --tries=2 "${source_url}"; then
return 0
fi
# 下载失败时尝试代理
echo "直接下载失败,尝试代理下载..."
local proxy_url="https://ghproxy.com/${source_url}"
if wget --timeout=10 --tries=2 "${proxy_url}"; then
return 0
fi
echo "错误:无法获取${tar_name}"
return 1
}
# 处理OpenSSL tar包
openssl_url="https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VER}/${OPENSSL_TAR}"
get_tar_file "${OPENSSL_TAR}" "${openssl_url}" "${TARGET_DIR}"
# 编译OpenSSL
cd "${TARGET_DIR}" || exit 1
if [ ! -d "openssl-${OPENSSL_VER}" ]; then
tar -xzf "${OPENSSL_TAR}"
fi
cd "openssl-${OPENSSL_VER}" || exit 1
# 清理之前可能的错误安装
if [ -d "${OPENSSL_INSTALL_DIR}" ]; then
echo "清理之前的OpenSSL安装..."
rm -rf "${OPENSSL_INSTALL_DIR}"
fi
./config --prefix="${OPENSSL_INSTALL_DIR}" shared zlib
make -j$(nproc)
make install
# 确保关键目录存在并正确
echo "验证OpenSSL安装目录结构..."
# 检查并创建lib目录(解决核心错误)
if [ ! -d "${OPENSSL_INSTALL_DIR}/lib" ]; then
echo "创建${OPENSSL_INSTALL_DIR}/lib目录..."
mkdir -p "${OPENSSL_INSTALL_DIR}/lib"
chmod 755 "${OPENSSL_INSTALL_DIR}/lib"
fi
# 检查并创建include目录
if [ ! -d "${OPENSSL_INSTALL_DIR}/include" ]; then
echo "创建${OPENSSL_INSTALL_DIR}/include目录..."
mkdir -p "${OPENSSL_INSTALL_DIR}/include"
chmod 755 "${OPENSSL_INSTALL_DIR}/include"
fi
# 设置环境变量
export PATH="${OPENSSL_INSTALL_DIR}/bin:$PATH"
export CPPFLAGS="-I${OPENSSL_INSTALL_DIR}/include"
export LDFLAGS="-L${OPENSSL_INSTALL_DIR}/lib"
export LD_LIBRARY_PATH="${OPENSSL_INSTALL_DIR}/lib:$LD_LIBRARY_PATH"
echo "${OPENSSL_INSTALL_DIR}/lib" > /etc/ld.so.conf.d/openssl.conf
ldconfig
# 验证OpenSSL二进制文件
echo "验证OpenSSL安装..."
ldd "${OPENSSL_INSTALL_DIR}/bin/openssl"
# 添加库路径
echo "${OPENSSL_INSTALL_DIR}/lib" >> /etc/ld.so.conf
echo "${OPENSSL_INSTALL_DIR}/lib64" >> /etc/ld.so.conf
echo "${OPENSSL_INSTALL_DIR}-${OPENSSL_VER}" >> /etc/ld.so.conf
ldconfig -v
ldd "${OPENSSL_INSTALL_DIR}/bin/openssl"
# 替换系统openssl
if [ -f "/usr/bin/openssl" ]; then
mv /usr/bin/openssl /usr/bin/openssl.old
fi
ln -sf "${OPENSSL_INSTALL_DIR}/bin/openssl" /usr/bin/openssl
# 手动复制so.3动态库(增加安全检查)
echo "复制OpenSSL动态库..."
SSL_SO3_PATH="${TARGET_DIR}/openssl-${OPENSSL_VER}/libssl.so.3"
CRYPTO_SO3_PATH="${TARGET_DIR}/openssl-${OPENSSL_VER}/libcrypto.so.3"
# 检查源文件是否存在
if [ ! -f "${SSL_SO3_PATH}" ]; then
echo "错误:未找到${SSL_SO3_PATH},请检查OpenSSL编译是否成功"
exit 1
fi
if [ ! -f "${CRYPTO_SO3_PATH}" ]; then
echo "错误:未找到${CRYPTO_SO3_PATH},请检查OpenSSL编译是否成功"
exit 1
fi
# 确保目标目录是目录
if [ ! -d "${OPENSSL_INSTALL_DIR}/lib" ]; then
echo "错误:${OPENSSL_INSTALL_DIR}/lib不是目录,无法继续"
exit 1
fi
# 复制文件
cp "${SSL_SO3_PATH}" "${OPENSSL_INSTALL_DIR}/lib/"
cp "${CRYPTO_SO3_PATH}" "${OPENSSL_INSTALL_DIR}/lib/"
# 重新建立链接 强制覆盖原来的软链接
cd "${OPENSSL_INSTALL_DIR}/lib" || exit 1
ln -sf libssl.so.3 libssl.so
ln -sf libcrypto.so.3 libcrypto.so
# 验证链接
echo "验证OpenSSL库链接..."
readlink -f "${OPENSSL_INSTALL_DIR}/lib/libssl.so"
readlink -f "${OPENSSL_INSTALL_DIR}/lib/libcrypto.so"
ldconfig
which openssl
ldd $(which openssl) | grep ssl
# 处理OpenSSH tar包
openssh_url="https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/${OPENSSH_TAR}"
get_tar_file "${OPENSSH_TAR}" "${openssh_url}" "${TARGET_DIR}"
# 编译OpenSSH
cd "${TARGET_DIR}" || exit 1
# 注意:10.0p2解包后目录名为10.0p1
if [ ! -d "openssh-10.0p1" ]; then
tar -xzf "${OPENSSH_TAR}"
fi
cd "openssh-10.0p1" || exit 1
./configure --prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-pam \
--with-zlib \
--with-ssl-dir="${OPENSSL_INSTALL_DIR}" \
--without-openssl-header-check
make -j$(nproc)
make install
# 替换系统ssh/sshd可执行文件
mv /usr/bin/ssh /usr/bin/ssh.bak 2>/dev/null || true
mv /usr/sbin/sshd /usr/sbin/sshd.bak 2>/dev/null || true
ln -sf /usr/local/openssh/bin/ssh /usr/bin/ssh
ln -sf /usr/local/openssh/sbin/sshd /usr/sbin/sshd
# 创建systemd服务文件
cat > /etc/systemd/system/sshd.service <<EOF
[Unit]
Description=OpenSSH ${OPENSSH_VER} server daemon
After=network.target auditd.service
ConditionPathExists=/etc/ssh/sshd_config
[Service]
ExecStart=/usr/local/openssh/sbin/sshd -D
ExecReload=/bin/kill -HUP \$MAINPID
KillMode=process
Restart=on-failure
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF
# 修改配置
grep -q "^X11Forwarding" /etc/ssh/sshd_config || echo 'X11Forwarding yes' >> /etc/ssh/sshd_config
grep -q "^PasswordAuthentication" /etc/ssh/sshd_config || echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
grep -q "^PermitRootLogin" /etc/ssh/sshd_config || echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
# 重启服务
systemctl disable sshd
rm -f /etc/systemd/system/multi-user.target.wants/sshd.service
systemctl daemon-reexec
systemctl daemon-reload
systemctl enable --now sshd
systemctl restart sshd
# 显示版本
/usr/local/openssh/sbin/sshd -v
ssh -V
sshd -V
openssl version
# 增强SSH密钥文件安全性
echo "设置SSH密钥文件权限和归属..."
chmod 600 /etc/ssh/ssh_host_*_key
chown root:root /etc/ssh/ssh_host_*_key
echo "✅ OpenSSH ${OPENSSH_VER} 安装完成并启动成功,密钥权限已配置"
升级openssh解压出来直接执行就行
需积分: 0 46 浏览量
更新于2025-07-30
收藏 52.56MB ZIP 举报
标题所指的内容涉及到了在计算机操作系统中升级OpenSSH服务的过程。OpenSSH是一个开源的软件包,它为SSH协议提供了一个完整的实现。SSH协议广泛用于安全的远程登录和其他网络服务。OpenSSH包括客户端和服务器端程序,用于远程登录、执行远程命令、安全文件传输等。
从给定的文件信息来看,提供的压缩包包含了OpenSSL库的源代码以及OpenSSH的源代码包。OpenSSL是一个强大的加密库,支持SSL、TLS等安全协议,OpenSSH在实现安全通讯时依赖于OpenSSL提供的加密功能。版本号分别为openssl-3.5.1.tar.gz和openssh-10.0p2.tar.gz。
标题中提到的“直接执行就行”指的是通过执行一个名为install.sh的脚本来完成安装升级的步骤。这个脚本很可能是预编译好的OpenSSH的安装程序,或者是自动化了编译和安装过程的脚本。在大多数情况下,执行这样的脚本之前,用户可能需要根据自己的操作系统环境配置必要的编译环境,例如安装编译工具、依赖库等。而一旦脚本开始执行,它将负责解压源码包、编译源代码、安装执行文件等一系列操作。
在实际的升级过程中,用户需要确保他们的操作符合系统的安全策略。需要从OpenSSH的官方网站或者可信的开源软件库下载相应的源码包,以防止植入恶意代码。在执行安装脚本之前,应该检查脚本内容,确认其安全性,特别是在执行任意的脚本或命令时要格外小心,避免潜在的安全风险。对于熟悉Linux/Unix系统命令行操作的用户而言,通常可以快速地完成这一过程。
升级OpenSSH服务前,还需要考虑系统的兼容性问题。新版本的OpenSSH可能会带来新的特性或者对旧特性进行修改,这可能会对依赖于特定SSH版本的应用程序产生影响。因此,在升级之前,做好充分的测试是非常有必要的。同时,升级过程中应确保有完整的系统备份,以防在升级过程中出现任何问题可以及时恢复到原始状态。
在升级完成后,建议检查OpenSSH的配置文件,确保所有的配置选项都符合预期,并且没有因为版本升级而需要调整的地方。还需要检查系统的日志文件,确认服务启动无误,用户能够正常通过SSH进行远程连接。整个升级过程中,最好在测试环境中先行验证升级步骤的正确性,然后再在生产环境中进行。
升级OpenSSH是一个相对复杂但又十分必要的过程,尤其是在保障网络安全方面具有极其重要的意义。随着网络攻击手段的不断进步,使用最新版本的OpenSSH能够更好地保障远程服务的安全性。

zzzzbbbby
- 粉丝: 3
最新资源
- 成果转化智能体:重塑技术经理人工作流的新引擎.docx
- 成果转化智能体:重构技术价值实现的生态体系.docx
- 成果转化智能体:重塑技术价值实现路径.docx
- 成果转化智能体:重塑技术经理人价值链.docx
- 打通成果转化堵点,激发区域创新活力.docx
- 打通科技成果转化堵点,激活区域创新引擎.docx
- 高校成果转化困局与数智破局之道.docx
- 高校科技成果转化困局与数智破局之道.docx
- 高校科技成果转化生态:从困局到双赢的数智路径.docx
- protobuf-java-3.22.2.jar中文-英文对照文档.zip
- protobuf-java-3.22.3.jar中文-英文对照文档.zip
- protobuf-java-3.22.4.jar中文-英文对照文档.zip
- 高校院所科技成果转化生态的数智化重构.docx
- 高校院所科技成果转化数智服务平台,赋能科技创新新生态.docx
- 高校科技成果转化数智服务生态构建.docx
- 高校科技成果转化数智化新范式.docx