OpenSSL、OpenSSH一键升级脚本

  • A+
所属分类:命令脚本 安全整改

上周六早上被最近发售的PS4《黑暗之魂重制版》里的各种杂鱼虐到怀疑人生,为调节心态情绪,静心写下OpenSSL、OpenSSH一键升级脚本,方便日后VPS批量升级。脚本代码没什么技术含量,各种判断和命令堆叠,有需要的朋友可以参考。使用前请务必在虚拟机进行测试,确保没问题后再考虑在承载业务的服务器上升级。

初次上传代码到GitHub,觉得挺新鲜的:https://github.com/wanghualang/update-openssl-openssh

 使用说明

1.一键升级脚本仅适用于RHEL/CentOS操作系统,支持4.x、5.x、6.x、7.x各系统版本;

2.下载Zlib、OpenSSL、OpenSSH、DropBear源码包并添加一个压缩包命名为update_openssh_openssl.tar.gz;

3.当各软件的源码包发布新版后,可以根据当前各源码包的软件版本,修改一键升级脚本中的脚本变量中的相关数字;

4.将一键升级脚本和update_openssh_openssl.tar.gz放在同一目录下,执行一键升级脚本,按数字1开始升级。

 参考代码

  1. #!/bin/bash  
  2. clear  
  3. ####### 通用代码 #######  
  4. #脚本变量  
  5. date=`date "+%Y%m%d"`  
  6. zlib_version="zlib-1.2.11"  
  7. openssl_version="openssl-1.0.2o"  
  8. openssh_version="openssh-7.7p1"  
  9. dropbear_version="dropbear-2018.76"  
  10. system_version=`cat /etc/redhat-release`  
  11. rhel4_version=`cat /etc/redhat-release |grep "release 4"|wc -l`  
  12. rhel5_version=`cat /etc/redhat-release |grep "release 5"|wc -l`  
  13. rhel6_version=`cat /etc/redhat-release |grep "release 6"|wc -l`  
  14. rhel7_version=`cat /etc/redhat-release |grep "release 7"|wc -l`  
  15. gcc_intall_status==`rpm -qa | grep gcc | wc -l`  
  16. gcc_c_intall_status==`rpm -qa | grep gcc-c++ | wc -l`  
  17. pam_devel_intall_status==`rpm -qa | grep pam-devel | wc -l`  
  18. openssl_rpm_status=`rpm -qa | grep openssl | wc -l`  
  19. openssh_rpm_status=`rpm -qa | grep openssh | wc -l`  
  20. telnet_rpm_status=`rpm -qa | grep telnet-server | wc -l`  
  21. openssh_running_status=`ps aux | grep sshd | grep -v grep |wc -l`  
  22. dropbear_running_status=`netstat -tunlp | egrep "0:6666" | wc -l`  
  23. telnet_running_status=`netstat -tunlp | egrep "0:23" | wc -l`  
  24. #使用说明  
  25. echo -e "\033[33m《一键升级OpenSSL、OpenSSH脚本》使用说明\033[0m"  
  26. echo ""  
  27. echo "1.一键升级脚本仅适用于RHEL/CentOS操作系统,支持4.x、5.x、6.x、7.x各系统版本;"  
  28. echo "2.必须切换为Root管理员用户运行脚本,并且确保本地或者网络yum软件源可以正常使用;"  
  29. echo "3.RHEL4.x-5.x操作系统会临时安装Telnet,通信端口为23,升级结束后会引导卸载;"  
  30. echo "4.RHEL6.x-7.x操作系统会临时安装DropBear,通信端口为6666,升级结束后会引导卸载;"  
  31. echo "5.本机旧版本的OpenSSL、OpenSSH、Lib库文件全部备份在/tmp/backup_$date文件夹。"  
  32. echo ""  
  33. #判断操作系统  
  34. echo "当前本机操作系统版本:"$system_version  
  35. echo ""  
  36. #最新软件版本  
  37. echo "当前官网最新软件版本:"$openssl_version、$openssh_version  
  38. echo ""  
  39. #检查当前用户是否为root  
  40. if [ $(id -u) != "0" ]; then  
  41. echo "当前用户为普通用户,必须使用root用户运行脚本,五秒后自动退出。"  
  42. echo ""  
  43. sleep 5  
  44. exit  
  45. fi  
  46. #禁用SElinux  
  47. setenforce 0 > /dev/null 2>&1  
  48. #禁用防火墙  
  49. service iptables stop > /dev/null 2>&1  
  50. service ip6tables stop > /dev/null 2>&1  
  51. ####### 通用代码 #######  
  52.   
  53. ####### 软件升级 #######  
  54. function update() {  
  55. echo -e "\033[33m开始升级OpenSSL、OpenSSH\033[0m"  
  56. echo ""  
  57. #解压软件源码包  
  58. mv ./update_openssh_openssl.tar.gz /tmp  
  59. cd /tmp && tar xzf update_openssh_openssl.tar.gz  
  60. if [ -e /tmp/update_openssh_openssl ];then  
  61. echo -e "解压软件源码包成功" "\033[32m Success\033[0m"  
  62. else  
  63. echo -e "解压软件源码包失败,五秒后自动退出脚本" "\033[31m Failure\033[0m"  
  64. echo ""  
  65. sleep 5  
  66. exit  
  67. fi  
  68. echo ""  
  69. #安装软件依赖包  
  70. yum -y install gcc gcc-c++ pam-devel > /dev/null 2>&1  
  71. cd /tmp/update_openssh_openssl/  
  72. tar xzf $zlib_version.tar.gz  
  73. cd /tmp/update_openssh_openssl/$zlib_version  
  74. ./configure --shared > /dev/null 2>&1  
  75. make > /dev/null 2>&1  
  76. make install > /dev/null 2>&1  
  77. if [ $gcc_intall_status != 0 ] && [ $gcc_c_intall_status != 0 ] && [ $pam_devel_intall_status != 0 ] && [ -e /usr/local/lib/libz.so ];then  
  78. echo -e "安装软件依赖包成功" "\033[32m Success\033[0m"  
  79. else  
  80. echo -e "安装软件依赖包失败,五秒后自动退出脚本" "\033[31m Failure\033[0m"  
  81. echo ""  
  82. sleep 5  
  83. exit  
  84. fi  
  85. echo ""  
  86. #临时安装远程软件  
  87. if [ $rhel4_version == 1 ] || [ $rhel5_version == 1 ];then  
  88. yum -y install telnet-server xinetd > /dev/null 2>&1  
  89. sed -i '/disable/d' /etc/xinetd.d/telnet  
  90. sed -i '/log_on_failure/a disable  = no' /etc/xinetd.d/telnet  
  91. sed -i '/disable/d' /etc/xinetd.d/telnet  
  92. sed -i '/log_on_failure/a disable  = no' /etc/xinetd.d/krb5-telnet  
  93. mv /etc/securetty /etc/securetty.bak  
  94. service xinetd restart > /dev/null 2>&1  
  95. echo -e "启动Telnet服务成功" "\033[32m Success\033[0m"  
  96. echo ""  
  97. fi  
  98. if [ $rhel6_version == 1 ] || [ $rhel7_version == 1 ];then  
  99. cd /tmp/update_openssh_openssl/  
  100. tar xjf $dropbear_version.tar.bz2  
  101. cd $dropbear_version  
  102. ./configure > /dev/null 2>&1  
  103. make > /dev/null 2>&1  
  104. make install > /dev/null 2>&1  
  105. mkdir /etc/dropbear  
  106. /usr/local/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key > /dev/null 2>&1  
  107. /usr/local/bin/dropbearkey -t rsa -s 4096 -f /etc/dropbear/dropbear_rsa_host_key > /dev/null 2>&1  
  108. /usr/local/sbin/dropbear -p 6666 > /dev/null 2>&1  
  109. echo -e "启动DropBear服务成功" "\033[32m Success\033[0m"  
  110. echo ""  
  111. fi  
  112. #备份旧版本lib  
  113. service sshd stop > /dev/null 2>&1  
  114. mkdir /tmp/backup_$date  
  115. if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ] ; then  
  116. ls /lib > /tmp/backup_$date/old_lib_list.txt  
  117. ls /lib64 > /tmp/backup_$date/old_lib64_list.txt  
  118. tar czf /tmp/backup_$date/lib_backup.tar.gz /lib > /dev/null 2>&1  
  119. tar czf /tmp/backup_$date/lib64_backup.tar.gz /lib64 > /dev/null 2>&1  
  120. else  
  121. ls /lib > /tmp/backup_$date/old_lib_list.txt  
  122. tar czf /tmp/backup_$date/lib_backup.tar.gz /lib > /dev/null 2>&1  
  123. fi  
  124. #备份旧版本openssl  
  125. if  [ $openssl_rpm_status != 0 ];then  
  126. rpm -ql `rpm -qa | egrep openssl` > /tmp/backup_$date/old_openssl_list.txt  
  127. tar czf /tmp/backup_$date/openssl_backup.tar.gz -T /tmp/backup_$date/old_openssl_list.txt > /dev/null 2>&1  
  128. else  
  129. find / -name *ssl* > /tmp/backup_$date/old_openssl_list.txt  
  130. tar czf /tmp/backup_$date/openssl_backup.tar.gz -T /tmp/backup_$date/old_openssl_list.txt > /dev/null 2>&1  
  131. fi  
  132. #备份旧版本openssh  
  133. if [ $openssh_rpm_status != 0 ];then  
  134. rpm -ql `rpm -qa | egrep openssh` > /tmp/backup_$date/old_openssh_list.txt  
  135. tar czf /tmp/backup_$date/openssh_backup.tar.gz -T /tmp/backup_$date/old_openssh_list.txt > /dev/null 2>&1  
  136. else  
  137. find / -name *ssh* > /tmp/backup_$date/old_openssh_list.txt  
  138. tar czf /tmp/backup_$date/openssh_backup.tar.gz -T /tmp/backup_$date/old_openssh_list.txt > /dev/null 2>&1  
  139. fi  
  140. #检查备份结果  
  141. if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ] && [ -e /tmp/backup_$date/lib_backup.tar.gz ] && [ -e /tmp/backup_$date/lib64_backup.tar.gz ] && [ -e /tmp/backup_$date/openssl_backup.tar.gz ] && [ -e /tmp/backup_$date/openssh_backup.tar.gz ];then  
  142. echo -e "备份旧版本OpenSSH、OpenSSL、Lib成功" "\033[32m Success\033[0m"  
  143. fi  
  144. if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '32' ] && [ -e /tmp/backup_$date/lib_backup.tar.gz ] && [ -e /tmp/backup_$date/openssl_backup.tar.gz ] && [ -e /tmp/backup_$date/openssh_backup.tar.gz ];then  
  145. echo -e "备份旧版本OpenSSH、OpenSSL、Lib成功" "\033[32m Success\033[0m"  
  146. fi  
  147. echo ""  
  148. #卸载旧版本openssl  
  149. if [ -e /usr/bin/openssl ];then  
  150. mv /usr/bin/openssl /usr/bin/openssl.bak_$date  
  151. fi  
  152. if [ -e /usr/lib/openssl ];then  
  153. mv /usr/lib/openssl /usr/lib/openssl.bak_$date  
  154. fi  
  155. if [ -e /usr/lib64/openssl ];then  
  156. mv /usr/lib64/openssl /usr/lib64/openssl.bak_$date  
  157. fi  
  158. #卸载旧版本openssh  
  159. if  [ $openssh_rpm_status -ne 0 ];then  
  160. rpm -e `rpm -qa | grep openssh` --nodeps  --allmatches > /dev/null 2>&1  
  161. else  
  162. mv /usr/bin/scp /usr/bin/scp.bak_$date > /dev/null 2>&1  
  163. mv /usr/bin/sftp /usr/bin/sftp.bak_$date > /dev/null 2>&1  
  164. mv /usr/bin/ssh /usr/bin/ssh.bak_$date > /dev/null 2>&1  
  165. mv /usr/bin/ssh-keyscan /usr/bin/ssh-keyscan.bak_$date > /dev/null 2>&1  
  166. mv /usr/bin/ssh-add /usr/bin/ssh-add.bak_$date > /dev/null 2>&1  
  167. mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak_$date > /dev/null 2>&1  
  168. mv /usr/bin/ssh-agent /usr/bin/ssh-agent.bak_$date > /dev/null 2>&1  
  169. mv /usr/libexec/ssh-pkcs11-helper /usr/libexec/ssh-pkcs11-helper.bak_$date > /dev/null 2>&1  
  170. mv /usr/libexec/ssh-keysign /usr/libexec/ssh-keysign.bak_$date > /dev/null 2>&1  
  171. mv /usr/libexec/sftp-server /usr/libexec/sftp-server.bak_$date > /dev/null 2>&1  
  172. mv /usr/sbin/sshd /usr/sbin/sshd.bak_$date > /dev/null 2>&1  
  173. mv /etc/ssh /etc/ssh.bak_$date > /dev/null 2>&1  
  174. mv /etc/init.d/sshd /etc/init.d/sshd.bak_$date > /dev/null 2>&1  
  175. fi  
  176. #检查卸载结果  
  177. if [ $openssh_rpm_status -ne 0 ] && [ -e /usr/bin/openssl.bak ];then  
  178. echo -e "卸载旧版本OpenSSH、OpenSSL、Lib失败" "\033[31m Failure\033[0m"  
  179. else  
  180. echo -e "卸载旧版本OpenSSH、OpenSSL、Lib成功" "\033[32m Success\033[0m"  
  181. fi  
  182. echo ""  
  183. #编译安装OpenSSL  
  184. cd /tmp/update_openssh_openssl  
  185. tar xzf $openssl_version.tar.gz  
  186. cd $openssl_version  
  187. ./config -fPIC --prefix=/usr enable-shared > /dev/null 2>&1  
  188. if [ $? -eq 0 ];then  
  189. make > /dev/null 2>&1  
  190. make install > /dev/null 2>&1  
  191. else  
  192. echo -e "编译安装OpenSSL失败,五秒后自动退出脚本" "\033[31m Failure\033[0m"  
  193. echo ""  
  194. sleep 5  
  195. exit  
  196. fi  
  197. if [ -e /usr/bin/openssl ];then  
  198. echo -e "编译安装OpenSSL成功" "\033[32m Success\033[0m"  
  199. fi  
  200. echo ""  
  201. #编译安装OpenSSH  
  202. cd /tmp/update_openssh_openssl  
  203. tar xzf $openssh_version.tar.gz    
  204. cd $openssh_version  
  205. ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords --with-ssl-engine --disable-etc-default-login > /dev/null 2>&1  
  206. if [ $? -eq 0 ];then  
  207. make > /dev/null 2>&1  
  208. make install > /dev/null 2>&1  
  209. else  
  210. echo -e "编译安装OpenSSH失败,五秒后自动退出脚本" "\033[31m Failure\033[0m"  
  211. echo ""  
  212. sleep 5  
  213. exit  
  214. fi  
  215. if [ -e /usr/sbin/sshd ];then  
  216. echo -e "编译安装OpenSSH成功" "\033[32m Success\033[0m"  
  217. fi  
  218. echo ""  
  219. #启动OpenSSH  
  220. cp -rf /tmp/update_openssh_openssl/$openssh_version/contrib/redhat/sshd.init /etc/init.d/sshd  
  221. cp -rf /tmp/update_openssh_openssl/$openssh_version/contrib/redhat/sshd.pam /etc/pam.d/sshd  
  222. chmod +x /etc/init.d/sshd  
  223. chkconfig --add sshd  
  224. sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config  
  225. if [ $rhel7_version == 1 ];then  
  226. chmod 600 /etc/ssh/ssh_host_rsa_key  
  227. chmod 600 /etc/ssh/ssh_host_ecdsa_key  
  228. chmod 600 /etc/ssh/ssh_host_ed25519_key  
  229. fi  
  230. service sshd start > /dev/null 2>&1  
  231. if [ $openssh_running_status -ne 0 ];then  
  232. echo -e "启动OpenSSH服务成功" "\033[32m Success\033[0m"  
  233. else  
  234. echo -e "启动OpenSSH服务失败,五秒后自动退出脚本" "\033[31m Failure\033[0m"  
  235. sleep 5  
  236. exit  
  237. fi  
  238. echo ""  
  239. #删除软件源码包  
  240. rm -rf /tmp/update_openssh_openssl/  
  241. rm -rf /tmp/update_openssh_openssl.tar.gz  
  242. if [ -e /tmp/update_openssh_openssl ] && [ -e /tmp/update_openssh_openssl.tar.gz ];then  
  243. echo -e "删除软件源码包失败" "\033[31m Failure\033[0m"  
  244. else  
  245. echo -e "删除软件源码包成功" "\033[32m Success\033[0m"  
  246. fi  
  247. echo ""  
  248. #升级完成  
  249. echo -e "\033[33mOpenSSH、OpenSSL升级成功,软件版本如下:\033[0m"  
  250. echo ""  
  251. openssl version  
  252. echo ""  
  253. ssh -V  
  254. echo ""  
  255. #引导卸载telnet  
  256. if [ $rhel4_version == 1 ] || [ $rhel5_version == 1 ];then  
  257. echo -e "\033[33m为防止OpenSSH升级失败导致无法远程登录,脚本已临时安装Telnet\033[0m"  
  258. echo ""  
  259. echo -e "\033[33mOpenSSH升级完成后,建议登录测试,确保没有问题后可卸载Telnet\033[0m"  
  260. echo ""  
  261. echo "1: 卸载Telnet"  
  262. echo ""  
  263. echo "2: 退出脚本"  
  264. echo ""  
  265. read -p  "请输入对应数字后按回车键: " uninstall  
  266. if [ "$uninstall" == "1" ];then  
  267. clear  
  268. echo -e "\033[33m开始卸载Telnet\033[0m"  
  269. echo ""  
  270. yum -y remove telnet-server > /dev/null 2>&1  
  271. service xinetd stop > /dev/null 2>&1  
  272. mv /etc/securetty.bak /etc/securetty  
  273. echo -e "卸载Telnet成功" "\033[32m Success\033[0m"  
  274. else  
  275. exit  
  276. fi  
  277. fi  
  278. #引导卸载dropbear  
  279. if [ $rhel6_version == 1 ] || [ $rhel7_version == 1 ];then  
  280. echo -e "\033[33m为防止OpenSSH升级失败导致无法远程登录,脚本已临时安装DropBear\033[0m"  
  281. echo ""  
  282. echo -e "\033[33mOpenSSH升级完成后,建议登录测试,确保没有问题后可卸载DropBear\033[0m"  
  283. echo ""  
  284. echo "1: 卸载DropBear"  
  285. echo ""  
  286. echo "2: 退出脚本"  
  287. echo ""  
  288. read -p  "请输入对应数字后按回车键: " uninstall  
  289. if [ "$uninstall" == "1" ];then  
  290. clear  
  291. echo -e "\033[33m开始卸载DropBear\033[0m"  
  292. echo ""  
  293. ps aux | grep dropbear | grep -v grep | awk '{print $2}' | xargs kill -9  
  294. find /usr/local/ -name dropbear* | xargs rm -rf  
  295. rm -rf /etc/dropbear  
  296. rm -rf /var/run/dropbear.pid  
  297. echo -e "卸载DropBear成功" "\033[32m Success\033[0m"  
  298. fi  
  299. fi  
  300. echo ""  
  301. }  
  302. ####### 软件升级 #######  
  303.   
  304. ####### 脚本菜单 #######  
  305. echo -e "\033[36m1: 升级软件\033[0m"  
  306. echo ""  
  307. echo -e "\033[36m2: 退出脚本\033[0m"  
  308. echo ""  
  309. read -p  "请输入对应数字后按回车开始执行脚本: " install  
  310. if [ "$install" == "1" ];then  
  311. clear  
  312. update  
  313. else  
  314. echo ""  
  315. exit  
  316. fi  
  317. ####### 脚本菜单 #######  
  • 微信赞助网站
  • weinxin
  • 支付宝赞助网站
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: