编辑
2025-08-08
脚本备份
00
请注意,本文编写于 281 天前,最后修改于 281 天前,其中某些信息可能已经过时。

rocky9.3升级openssh10

SHELL
#!/bin/bash set -e OPENSSH_VERSION="10.0p1" OPENSSH_TAR="openssh-${OPENSSH_VERSION}.tar.gz" OPENSSH_URL="https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/${OPENSSH_TAR}" SRC_DIR="/usr/local/src" BACKUP_DIR="/usr/local/openssh_backup" setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config echo "[1/9] 检测系统并安装依赖..." if [ -f /etc/os-release ]; then . /etc/os-release else echo "无法识别系统类型,退出" exit 1 fi case "$ID" in ubuntu|debian) apt update apt install -y build-essential zlib1g-dev libssl-dev libpam0g-dev wget ;; centos|rocky|rhel) yum groupinstall -y "Development Tools" yum install -y gcc make zlib-devel openssl-devel pam-devel wget ;; *) echo "暂不支持该系统: $ID" exit 1 ;; esac echo "[2/9] 下载并解压源码..." mkdir -p "$SRC_DIR" cd "$SRC_DIR" rm -rf "openssh-${OPENSSH_VERSION}" wget -c "$OPENSSH_URL" tar -xf "$OPENSSH_TAR" cd "openssh-${OPENSSH_VERSION}" echo "[3/9] 备份旧版本ssh相关文件..." mkdir -p "$BACKUP_DIR" cp /usr/sbin/sshd "$BACKUP_DIR/sshd.bak.$(date +%s)" 2>/dev/null || true cp /usr/bin/ssh "$BACKUP_DIR/ssh.bak.$(date +%s)" 2>/dev/null || true cp -r /etc/ssh "$BACKUP_DIR/etc_ssh.bak.$(date +%s)" 2>/dev/null || true echo "[3.5/9] 设置 OpenSSL 编译环境..." export CPPFLAGS="-I/usr/include" export LDFLAGS="-L/usr/lib64" echo "[4/9] 编译安装OpenSSH..." ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-privsep-path=/var/lib/sshd make -j"$(nproc)" make install echo "[5/9] 修复主机密钥权限..." chmod 600 /etc/ssh/ssh_host_*_key 2>/dev/null || true echo "[6/9] 清理不兼容配置..." for file in /etc/ssh/sshd_config.d/*.conf; do [ -f "$file" ] || continue sed -i '/GSSAPIAuthentication/d;/GSSAPICleanupCredentials/d;/GSSAPIKexAlgorithms/d' "$file" done if [ -d /etc/sysconfig ]; then echo 'CRYPTO_POLICY=""' | tee /etc/sysconfig/sshd fi echo "[6.1] 设置加密策略为 LEGACY,防止不兼容配置..." update-crypto-policies --set LEGACY echo "[6.2] 移除 sshd_config 中对 crypto-policies 的引用(如果有)..." sed -i '/crypto-policies.*opensshserver.config/s/^/#/' /etc/ssh/sshd_config # 移除 /etc/crypto-policies/back-ends/opensshserver.config 中不兼容配置(如升级失败又被引用) if [ -f /etc/crypto-policies/back-ends/opensshserver.config ]; then sed -i '/GSSAPIKexAlgorithms/d' /etc/crypto-policies/back-ends/opensshserver.config fi #修正sftp位置 sed -i 's|^Subsystem\s\+sftp\s\+/usr/libexec/openssh/sftp-server|Subsystem sftp /usr/libexec/sftp-server|' /etc/ssh/sshd_config echo "[7/9] 检查配置文件语法..." if ! /usr/sbin/sshd -t -f /etc/ssh/sshd_config; then echo "sshd 配置语法错误,请检查 /etc/ssh/sshd_config" exit 1 fi echo "[8/9] 重启ssh服务..." if systemctl list-units --type=service | grep -q sshd.service; then systemctl restart sshd elif systemctl list-units --type=service | grep -q ssh.service; then systemctl restart ssh else echo "未检测到 ssh 服务,请手动启动" fi echo "[9/9] 校验systemd运行的sshd版本..." SSHD_BIN="/usr/sbin/sshd" RUNNING_SSHD=$(readlink -f /proc/$(pgrep -x sshd | head -n 1)/exe) BIN_HASH=$(sha256sum "$SSHD_BIN" | awk '{print $1}') RUN_HASH=$(sha256sum "$RUNNING_SSHD" | awk '{print $1}') VERSION=$($SSHD_BIN -V 2>&1 | head -n 1) echo "当前sshd版本: $VERSION" echo "systemd运行的sshd路径: $RUNNING_SSHD" if [ "$BIN_HASH" = "$RUN_HASH" ]; then echo "sshd已成功替换为新版并正在运行" else echo "警告:systemd仍在运行旧版sshd,可能需要重启或手动修改服务" fi echo "脚本执行完成。"