SHELL脚本:升级SSH到OpenSSH_7.4p1

1、脚本实现的功能

利用此脚本可以自动升级Openssh至7.4的版本,并且脚本会自动识别系统类别进行安装升级,适用RHEL7、RHEL6(64位和32位)的系统架构。

2、脚本使用前提条件

RHEL7:

能使用Yum源(外网或者内网直接搭建),RHEL7的升级是直接用yum仓库的RPM包的,因为最新的YUM源中,openssh就是7.4版本的,所以要查看你的yum源中openssh的版本号是不是7.4,不然就没有意义了。

RHEL6:

①能使用Yum源(外网或者内网直接搭建),升级过程中需要安装一些依赖包,比如gcc、pam-devel等组件

②修改openssh和openssl源码有效下载地址:这两个源码下载地址在脚本中需要修改成你可以下载的地址,我这里是用自己的局域网服务器(已经上传过的)。

下载地址修改

3、脚本使用说明

-n:升级软件的名称,如:openssh

-v:升级的版本号,如:7.4

#./update_openssh.sh -n openssh -v 7.4

关于这两个参数,其实已经在脚本中写死了,也就是说这个脚本就是升级到openssh到7.4的,为什么会画蛇添足搞这两个参数呢,其实是考虑到后期脚本的扩展和延伸,如果这个脚本可以升级多个程序或者多个版本号,那么就有意义了,所以保留了下来。

4、脚本内容

#!/bin/bash
#################################################################
######        update openssh to 7.4                     
######        Author:huangqw                            
######        Create_Date:2018/09/06                        
######        LastModified:2018/09/06                       
######        Warning:start telnet service before use the script    
#################################################################

Task="update_openssh"

DATE=`date +%F_%T`
Log="/tmp/${Task}.log"

OS_Version=`cat /etc/redhat-release|gawk '{print $(NF-1)}'|gawk -F'.' '{print $1}'`
OS_Bit=`getconf LONG_BIT`

Zlib_Version="1.2.3"
Openssl_Version="openssl-1.0.2k"
Openssh_Version="openssh-7.4p1"
Openssl_Addr="http://10.10.10.17/rhel/other/openssl-1.0.2k.tar.gz"
Openssh_Addr="http://10.10.10.17/rhel/other/openssh-7.4p1.tar.gz"

while getopts "n:v:" opt; do
  case $opt in
	n)
		Update_Name=$OPTARG
		;;
	v)
		Update_Version=$OPTARG
                ;;
	\?)
		echo "Invalid option: $OPTARG" >> ${Log} 
		exit 1
		;;
  esac
done

echo -e "---- ${DATE} ${Task} Begin ---- \n" >> ${Log}

# Must be the root user
userid=`id -u`
if [ "$userid" -ne 0 ]; then
	echo "sorry,only root can execute the script. "  >> ${Log}
	echo "---- ${DATE} ${Task} End ---- " >> ${Log}
	exit 1
fi

# SET SELINUX=disabled
Selinux=`getenforce`
if [ "$Selinux" == "Enforcing" ]; then
	setenforce 0
	sed -i '/SELINUX=enforcing/s/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
	echo "The selinux is set Permissive. "  >> ${Log}
fi

Check_Version(){
	Last_Version=`ssh -V 2>&1 |gawk -F"," '{print $1}'`
	Version_Num=`echo ${Last_Version#OpenSSH_}|grep -o ^[0-9][.0-9]\*`

	Version_diff=`expr ${Version_Num} \> ${Update_Version}`
	if [ ${Version_diff} -eq 1 -o "${Version_Num}" == "${Update_Version}" ];then
		echo -e "\nThe Version of the ${Update_Name} is ${Version_Num},It is newest!\n"  >> ${Log}
		echo -e "\n---- ${DATE} ${Task} End ---- \n" >> ${Log}
        	exit 1
	else 
		return 2
	fi
}

rhel7_update(){
	Check_Version
	yum -y update openssh >> ${Log} 2>&1
	Check_Version
	if [ $? -eq 2 ];then
		echo -e "\nThe Version of the ${Update_Name} is ${Version_Num},It is not update to ${Update_Version}!\n"  >> ${Log} 
                echo -e "\n---- ${DATE} ${Task} End ---- \n" >> ${Log}
                exit 1

	fi
}
rhel6_update(){
        Check_Version
	yum -y install gcc pam-devel zlib-devel >> ${Log} 2>&1

	#Update Zlib
        if rpm -q zlib |grep ${Zlib_Version} >/dev/null 2>&1;then
                echo -e "\nThe Version of the Zlib is ${Zlib_Version}\n"  >> ${Log}
        else
		yum -y update zlib >> ${Log} 2>&1
	fi


	#Update Openssl
	if openssl version |grep "1.0.2k" >/dev/null 2>&1;then
		echo -e "\nThe Version of the openssl is 1.0.2k\n"  >> ${Log}
	else
		find / -name openssl -print0|xargs -0 -I {} mv {} {}.old >> ${Log} 2>&1
		if [ ${OS_Bit} -eq 64 ];then 
			cp  /usr/lib64/libcrypto.so.10  /usr/lib64/libcrypto.so.10.old >> ${Log} 2>&1
			cp  /usr/lib64/libssl.so.10  /usr/lib64/libssl.so.10.old >> ${Log} 2>&1
		else
			cp  /usr/lib/libcrypto.so.10  /usr/lib/libcrypto.so.10.old >> ${Log} 2>&1
			cp  /usr/lib/libssl.so.10  /usr/lib/libssl.so.10.old >> ${Log} 2>&1
		fi
		rpm -qa |grep openssl|xargs -i rpm -e --nodeps {} >> ${Log} 2>&1

		wget -P /tmp/ ${Openssl_Addr}  >> ${Log} 2>&1
		cd /tmp/
		tar -avxf `basename ${Openssl_Addr}` >/dev/null 2>>${Log}
		cd ${Openssl_Version}
		./config --prefix=/usr --openssldir=/etc/ssl --shared zlib >> ${Log} 2>&1
		make >/dev/null 2>>${Log} && make install >/dev/null 2>>${Log}
		if openssl version |grep "1.0.2k" >/dev/null 2>&1;then
                	echo -e "\nThe Version of the openssl is update to 1.0.2k success!\n"  >> ${Log}
		else
			echo -e "\nThe Version of the openssl is update to 1.0.2k faild!\n"  >> ${Log}
			exit 1
		fi
	fi
	
        #Update Openssh
	if echo ${Openssh_Version}|grep "${Update_Version}" >/dev/null 2>&1;then 
		service sshd stop >> ${Log} 2>&1
		mv /etc/ssh /etc/ssh.old >> ${Log} 2>&1
		rpm -qa |grep openssh|xargs -i rpm -e --nodeps {} >> ${Log} 2>&1
		install -m700 -d /var/lib/sshd >> ${Log} 2>&1
		chown   root:sys /var/lib/sshd >> ${Log} 2>&1
		usermod -d /var/lib/sshd sshd >> ${Log} 2>&1

		wget -P /tmp/ ${Openssh_Addr}  >> ${Log} 2>&1
		cd /tmp/
		tar -avxf `basename ${Openssh_Addr}` >/dev/null 2>>${Log}
		cd ${Openssh_Version} 
		./configure --prefix=/usr  --sysconfdir=/etc/ssh  --with-md5-passwords  --with-pam  --with-zlib --with-openssl-includes=/usr --with-privsep-path=/var/lib/sshd >> ${Log} 2>&1
		make >/dev/null 2>>${Log} && make install >/dev/null 2>>${Log}

		install -m755    contrib/ssh-copy-id /usr/bin
		install -m644    contrib/ssh-copy-id.1 /usr/share/man/man1
		install -m755 -d /usr/share/doc/openssh-7.4p1
		install  -m644    INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-7.4p1
	
		echo 'X11Forwarding yes' >> /etc/ssh/sshd_config
		echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
		cp -p contrib/redhat/sshd.init /etc/init.d/sshd
		sed -i '/ssh_host_key.pub/s@/sbin/restorecon /etc/ssh/ssh_host_key.pub@# /sbin/restorecon /etc/ssh/ssh_host_key.pub@' /etc/init.d/sshd
		chmod +x /etc/init.d/sshd
		chkconfig  --add  sshd
		chkconfig  sshd  on
	
		service sshd start >> ${Log} 2>&1
      		Check_Version
        	if [ $? -eq 2 ];then
                	echo -e "\nThe Version of the ${Update_Name} is ${Version_Num},It is not update to ${Update_Version}!\n"  >> ${Log}
                	echo -e "\n---- ${DATE} ${Task} End ---- \n" >> ${Log}
                	exit 1
		fi
	else
		echo -e "\nThe script does not suitable the Version of the ${Update_Name},It is for ${Openssh_Version}\n"  >> ${Log}
                echo -e "\n---- ${DATE} ${Task} End ---- \n" >> ${Log}
                exit 1

        fi
}

case $OS_Version in 
	7)
		rhel7_update
		;;
	6)
		rhel6_update
		;;
	*)
		echo "The operating system is not suitable "  >> ${Log}
		echo "---- ${DATE} ${Task} End ---- " >> ${Log}
		exit 1
		;;
esac

5、脚本Tips

编写脚本的过程中,要获取openssh的版本号,如“ssh -V”,但是你会发现这个命令的输出结果没有办法直接用管道命令传给其他命令进行处理,虚无缥缈,怎么样也无法直接获取到,这个问题之前在“java -version”也遇到过,最终用一个小技巧完成:错误重定向

#ssh -V 2>&1

脚本是参考了《Redhat 6.7 x64升级SSH到OpenSSH_7.4p1完整文档》这份文档进行编写的,如果想看详细的升级过程,可以点击查看。

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/shell_update_openssh7-4.html

1 thought on “SHELL脚本:升级SSH到OpenSSH_7.4p1”

  1. songjunfei

    62行语法错误呀,博主。我会7.4升到7.9的时候遇到的。

Leave a Comment