centos6升级SSH centos6升级openSSH centos6升级openSSHD centos6升级SSHD

centos6升级SSH    centos6升级openSSH    centos6升级openSSHD    centos6升级SSHD

 

脚本内容(建议用 root 用户执行)

保存为:upgrade_openssh.sh

 

#!/bin/bash
set -e

# ==== 变量定义 ====
OPENSSH_VERSION="9.6p1"
OPENSSL_VERSION="1.1.1u"
INSTALL_PREFIX="/usr/local/openssh"
TMPDIR="/usr/local/src/openssh_upgrade"

# ==== 创建临时目录 ====
mkdir -p "$TMPDIR"
cd "$TMPDIR"

# ==== 安装依赖 ====
yum install -y gcc make zlib-devel pam-devel openssl-devel wget tar

# ==== 升级 OpenSSL(可选) ====
wget https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz
tar zxvf openssl-$OPENSSL_VERSION.tar.gz
cd openssl-$OPENSSL_VERSION
./config --prefix=/usr/local/openssl shared zlib
make -j$(nproc) && make install
cd ..

export LD_LIBRARY_PATH=/usr/local/openssl/lib
export PATH=/usr/local/openssl/bin:$PATH

# ==== 下载并编译 OpenSSH ====
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-$OPENSSH_VERSION.tar.gz
tar zxvf openssh-$OPENSSH_VERSION.tar.gz
cd openssh-$OPENSSH_VERSION

# 备份原 sshd_config
cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%T)

./configure --prefix=$INSTALL_PREFIX --sysconfdir=/etc/ssh \
    --with-ssl-dir=/usr/local/openssl \
    --with-md5-passwords --with-pam --with-zlib
make -j$(nproc) && make install

# ==== 创建 symlink ====
mv /usr/sbin/sshd /usr/sbin/sshd.old
ln -sf $INSTALL_PREFIX/sbin/sshd /usr/sbin/sshd
ln -sf $INSTALL_PREFIX/bin/ssh /usr/bin/ssh
ln -sf $INSTALL_PREFIX/bin/scp /usr/bin/scp
ln -sf $INSTALL_PREFIX/bin/sftp /usr/bin/sftp
ln -sf $INSTALL_PREFIX/bin/ssh-keygen /usr/bin/ssh-keygen

# ==== 临时启用另一个 sshd 测试端口(防止升级失败锁死) ====
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.new
sed -i 's/#Port 22/Port 22/' /etc/ssh/sshd_config.new
echo "Port 2222" >> /etc/ssh/sshd_config.new

$INSTALL_PREFIX/sbin/sshd -f /etc/ssh/sshd_config.new
echo "[✓] 测试 sshd 启动成功在端口 2222。请用 ssh -p 2222 登录确认无误后,继续。"

read -p "请确认你可以通过新 sshd 登录后回车继续(否则 Ctrl+C 退出)..."

# ==== 启用正式 sshd ====
pkill sshd || true
$INSTALL_PREFIX/sbin/sshd

# ==== 设置自动启动 ====
cat > /etc/init.d/sshd_new <<EOF
#!/bin/bash
# chkconfig: 2345 55 25
# description: OpenSSH

case "\$1" in
  start)
    echo "Starting sshd..."
    $INSTALL_PREFIX/sbin/sshd
    ;;
  stop)
    echo "Stopping sshd..."
    pkill sshd
    ;;
  restart)
    \$0 stop
    sleep 1
    \$0 start
    ;;
  *)
    echo "Usage: \$0 {start|stop|restart}"
    exit 1
esac
exit 0
EOF

chmod +x /etc/init.d/sshd_new
chkconfig --add sshd_new

echo -e "\n[✔] OpenSSH 升级完成,当前版本:"
/usr/sbin/sshd -V 2>&1 | head -n1

  

 报错分析:

vbnet
/usr/sbin/sshd: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such
 
 

这个错误说明:

新版 OpenSSH 依赖了 OpenSSL 1.1.1u 中的 libcrypto.so.1.1,但系统运行环境找不到这个库文件。

也就是说,虽然你在 /usr/local/openssl 安装了新版本的 OpenSSL,但默认系统找不到这个库。

 

解决方案:让系统知道新 OpenSSL 库位置

方案 1:添加库路径到系统配置(推荐)

  1. 编辑动态链接器配置:

bash
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl11.conf
 
 
  1. 重新加载库路径:

bash
ldconfig
  1. 再次测试:

bash
ldd /usr/sbin/sshd

确认输出中看到:

bash
libcrypto.so.1.1 => /usr/local/openssl/lib/libcrypto.so.1.1

然后重启 sshd:

bash
/etc/init.d/sshd_new restart
 
 

方案 2:临时设置 LD_LIBRARY_PATH(重启后失效)

bash
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH /usr/sbin/sshd

适合调试用,不建议长期依赖。

 

 

 

 

生成新版 OpenSSH 的启动脚本 /etc/init.d/sshd_new

请执行以下步骤创建它:

① 创建启动脚本

 

cat > /etc/init.d/sshd_new << 'EOF'
#!/bin/bash
# chkconfig: 2345 55 25
# description: OpenSSH 9.x manual control script

### BEGIN INIT INFO
# Provides:          sshd_new
# Required-Start:    $network $syslog
# Required-Stop:     $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop OpenSSH server (manual install)
### END INIT INFO

SSHD=/usr/sbin/sshd
SSHD_CONFIG=/etc/ssh/sshd_config
PID_FILE=/var/run/sshd.pid

start() {
    echo -n "Starting sshd (OpenSSH 9.x): "
    if [ -f "$PID_FILE" ]; then
        echo "Already running."
        exit 1
    fi
    $SSHD -f $SSHD_CONFIG
    sleep 1
    pgrep -f "$SSHD" > /dev/null && echo "[OK]" || echo "[FAILED]"
}

stop() {
    echo -n "Stopping sshd: "
    if [ -f "$PID_FILE" ]; then
        kill `cat $PID_FILE`
        rm -f $PID_FILE
        echo "[OK]"
    else
        pkill -f "$SSHD"
        echo "[OK]"
    fi
}

status() {
    pgrep -f "$SSHD" > /dev/null
    if [ $? -eq 0 ]; then
        echo "OpenSSH 9.x is running."
    else
        echo "OpenSSH 9.x is stopped."
    fi
}

restart() {
    stop
    sleep 1
    start
}

case "$1" in
    start)
        start ;;
    stop)
        stop ;;
    restart)
        restart ;;
    status)
        status ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1 ;;
esac
EOF

 

赋予执行权限

bash
chmod +x /etc/init.d/sshd_new

③ 测试启动状态

bash
/etc/init.d/sshd_new start /etc/init.d/sshd_new status
 
 

可选:替代系统原有 sshd 脚本

如果你希望以后直接用 /etc/init.d/sshd

bash
mv /etc/init.d/sshd /etc/init.d/sshd.bak ln -s /etc/init.d/sshd_new /etc/init.d/sshd
 

之后你就可以继续使用老命令:

bash
/etc/init.d/sshd start
 

注册进 chkconfig 管理:

bash
chkconfig --add sshd_new
 

设置为开机自动启动:

bash
chkconfig sshd_new on
 

验证是否已添加成功:

bash
chkconfig --list sshd_new
 
 

注意

如果你已经将 /etc/init.d/sshd 替换为指向 sshd_new 的软链接(即你执行了):

bash
mv /etc/init.d/sshd /etc/init.d/sshd.bak
ln -s /etc/init.d/sshd_new /etc/init.d/sshd

你也可以直接对 sshd 启动项做 chkconfig 设置,它等价于 sshd_new

 
posted @ 2025-05-30 17:10  闻道者  阅读(66)  评论(0)    收藏  举报