今天早上收到阿里云发的报警短信,大致内容如下:

前提分析:

公司代码代码仓库使用是Gogs搭建的,版本是0.11.34,二进制方式安装的,连接的是其他主机上的MySQL数据库,因此被检测到有这个漏洞

处理方式:

  1. 先登录Gogs官网,查看Gogs的最新版本,如下图所示:

    地址:https://gogs.io/docs/installation/install_from_binary

同时看到官方提供的有这个信息:如何通过二进制升级?

但是不要被这个信息骗了,升级Gogs版本不能采用这种方式。

注意到官方页面左侧导航有从二进制升级,这个是具体的升级方式,可以参考这个进行操作:

地址:https://gogs.io/docs/upgrade/upgrade_from_binary

  1. 接下来按照官方文档提供的升级方式升级就行了

    (1) 先停止主机上的Gogs应用程序进程,直接kill就行了
  1. ps -ef | grep gogs # 查看进程pid
  2. lsof -p pid # 查看进程具体路径, 默认位置在 git 用户下的家目录
  3. kill -9 pid # 杀死进程
  4. # 这里写的有一个gogs.sh脚本,停止进程的话执行这个脚本也行
  5. # gogs.sh
  6. #!/bin/bash
  7. function starT(){
  8. nohup /home/git/gogs/gogs web &
  9. }
  10. function stoP(){
  11. kill -9 `lsof -i:3000 |awk 'NR==2{print $2}'`
  12. }
  13. case $1 in
  14. 'start')
  15. starT;
  16. ;;
  17. 'stop')
  18. stoP;
  19. ;;
  20. 'restart')
  21. stoP;
  22. starT;
  23. ;;
  24. *)
  25. echo '请输入有效的命令(start|stop|restart)'
  26. ;;
  27. esac

(2) 原有程序目录重命名,下载最新的二进制文件等

  1. # # 默认位置在 git 用户下的家目录
  2. $ sudo su - git
  3. $ cd ~
  4. $ pwd
  5. /home/git
  6. $ ls
  7. gogs gogs-repositories
  8. # gogs 目录是程序目录
  9. # gogs-repositories 存放仓库文件的目录,在配置文件中指定的
  10. # 将当前目录移动到另一个临时的位置,但不是删除!
  11. $ mv gogs gogs_old
  12. 载并解压新的二进制:
  13. # 请根据系统和类型获取相应的二进制版本
  14. $ wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz
  15. $ tar -zxvf gogs_0.12.3_linux_amd64.tar.gz
  16. $ ls
  17. gogs gogs_old gogs-repositories gogs_0.12.3_linux_amd64.tar.gz
  18. # 复制 custom、data 和 log 目录到新解压的目录中:
  19. $ cp -R gogs_old/custom gogs
  20. $ cp -R gogs_old/data gogs
  21. $ cp -R gogs_old/log gogs
  22. # 最后,运行并打开浏览器进行测试:
  23. $ cd gogs
  24. $ ./gogs web
  1. 升级中出现的问题

    (1) 启动的时候报错:"./gogs: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./gogs)"

    分析:当前系统是CentOS release 6.8 (Final),系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的

    查看当前系统支持的glibc版本:
  1. # strings /lib64/libc.so.6 |grep GLIBC_
  2. GLIBC_2.2.5
  3. GLIBC_2.2.6
  4. GLIBC_2.3
  5. GLIBC_2.3.2
  6. GLIBC_2.3.3
  7. GLIBC_2.3.4
  8. GLIBC_2.4
  9. GLIBC_2.5
  10. GLIBC_2.6
  11. GLIBC_2.7
  12. GLIBC_2.8
  13. GLIBC_2.9
  14. GLIBC_2.10
  15. GLIBC_PRIVATE

当前最高版本是GLIBC_2.10,需要升级到GLIBC_2.14才行。

使用命令:yum update glibc会报错,提示当前使用的yum仓库不可用,查看发现得知使用的是官方的yum仓库,这里更换成使用腾讯云的yum仓库

  1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos6_base.repo # 适用于6.x系统的

然后使用命令:yum update glibc进行更新,不过才更新到GLIBC_2.12版本,还不是GLIBC_2.14版本。

采用源码编译方式更新危险性太大,幸好找到了rpm更新包:

地址:https://files.cnblogs.com/files/sanduzxcvbnm/glibc-2.14.1-rpm-all.zip

  1. rpm -Uvh glibc-2.14.1-6.x86_64.rpm glibc-common-2.14.1-6.x86_64.rpm glibc-headers-2.14.1-6.x86_64.rpm glibc-devel-2.14.1-6.x86_64.rpm nscd-2.14.1-6.x86_64.rpm glibc-static-2.14.1-6.x86_64.rpm glibc-utils-2.14.1-6.x86_64.rpm

再次查看发现已经顺利升级成功

  1. t# strings /lib64/libc.so.6 |grep GLIBC_
  2. GLIBC_2.2.5
  3. GLIBC_2.2.6
  4. GLIBC_2.3
  5. GLIBC_2.3.2
  6. GLIBC_2.3.3
  7. GLIBC_2.3.4
  8. GLIBC_2.4
  9. GLIBC_2.5
  10. GLIBC_2.6
  11. GLIBC_2.7
  12. GLIBC_2.8
  13. GLIBC_2.9
  14. GLIBC_2.10
  15. GLIBC_2.11
  16. GLIBC_2.12
  17. GLIBC_2.13
  18. GLIBC_2.14
  19. GLIBC_PRIVATE

(2) 再次启动后报这个错误:[TRACE] Log Mode: File

看这个不知道啥原因,不过通过查看gogs.log文件可以知道:

  1. tail -n 30 /home/git/gogs/log/gogs.log # 日志文件路径
  2. # 最新的日志有这么一句话
  3. [FATAL] [gogs.io/gogs/internal/db/repo.go:121 NewRepoContext()] Gogs requires Git version greater or equal to 1.8.3

通过查看本机使用的git版本,发现是1.7.1的,看来还需要升级git版本

  1. # git --version
  2. git version 1.7.1

但是使用命令:yum update git进行升级,最新软件版本还是1.7.1,看来只能通过其他方式进行升级了。

这里不采用git源码的方式进行升级,而是通过下载其他的git 仓库源进行升级

  1. yum -y install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
  2. yum install git # 这一步安装比较慢

升级成功后再次查看版本,版本大于1.8.3,符合要求了

  1. t# git --version
  2. git version 2.22.0

(3) 注意:若是使用root用户启动,则会报错:

"[FATAL] [gogs.io/gogs/internal/cmd/web.go:161 runWeb()] Failed to initialize application: init configuration: user configured to run Gogs is "git", but the current user is "root""

需要切换到git用户启动才行

  1. $ sudo su - git
  2. $ cd ~
  3. $ cd gogs
  4. $ ./gogs web
  5. # 我这操作是切换到git用户后,使用gogs.sh脚本进行启动的,脚本内容见上面:bash gogs.sh start

升级总结

1.最新的软件包上没有说明一些注意事项,或者前提条件,比如gilibc和git的版本要求

2.下载软件界面上面有二进制升级方式,若真按照这种方式升级,后果不敢想象

升级Gogs版本的更多相关文章

  1. 非关系型数据库来了,CRL快速开发框架升级到版本4

    轮子?,我很任性,我要造不一样的轮子,同时支持关系型和非关系型的框架有没有 新版数据查询作了些调整,抽象了LabmdaQueryy和DBExtend,升级到版本4,非关系数据库MongoDB被支持了! ...

  2. ubuntu下升级R版本

    ubuntu下升级R版本   在测试<机器学习 实用案例解析>一书的邮件分类代码时,windows系统下rstudio中无法读取特殊字符,在ubuntu下可以.在ubuntu虚拟机下安装t ...

  3. Mac中使用port升级gcc版本

    Mac OS中的gcc版本可能不会满足实际使用要求,需要对其升级. 这里介绍使用port方式来升级gcc版本.Macports是Mac OS中的软件包管理工具. 首先,安装Macports 这里提供O ...

  4. 如何升级Ceph版本及注意事项

    升级软件版本在日常运维中是一个常见操作. 本文分享一下Ceph版本升级的一些经验. 一般升级流程和注意如下: 1.  关注社区Release notes 和 ceph-user邮件订阅列表,获取社区发 ...

  5. Windows2000安装Winform Clickonce提示升级系统版本的解决方案

    Windows2000安装Winform Clickonce提示升级系统版本.只需要把所有应用的DLL的独立性设置为false就可以了.

  6. wdcp升级php版本到5.3,5.5

    官网省级方法 wget http://down.wdlinux.cn/in/php_up53.shsh php_up53.sh 看到"php update is OK"提示表示,顺 ...

  7. PHPNow升级PHP版本为5.3.5的方法

    在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择,这篇文章主要为大家分享下如果将phpnow的php版本升级为5.3.5   在WIN上有时候需要测试一些 ...

  8. PHPNow升级PHP版本的方法

    在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好的选择. PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22,PHP5.2对于现在 ...

  9. Linux(Fedora)下NodeJs升级最新版本(制定版本)

    Linux(Fedora)下NodeJs升级最新版本(制定版本) 首先安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 升级node.js到制定版本 n ...

随机推荐

  1. android studio取消设置代理

    看标题感觉就是一个简单的设置,其实只是个大坑啊 https://www.jianshu.com/p/bb6d2bcdd5b5 android studio内虽然设置了 no proxy,但是没起作用, ...

  2. Java双重校验单例模式详解

    单例模式双重检测java实现: public class Singleton { private volatile static Singleton instance = null; //#1 pub ...

  3. shell查询prometheus数据

    #shell查询prometheus数据 shell使用curl调用HTTP API执行PromQL /api/v1/query查询某一时刻的数据 查询条件PromSQL复杂时, 传入接口/api/v ...

  4. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  5. 常用的函数式接口_Function接口练习_自定义函数模型拼接

    package com.yang.Test.FunctionStudy; import java.util.function.Function; /** * 练习:自定义函数模型拼接 * 题目: * ...

  6. 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件

    字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...

  7. 修改 hosts

    不会牛逼操作 -1. 位置.格式 所有系统都差不多,都是 啥啥/etc/hosts 这样的 . 具体去查即可 . 格式: ip + 域名 域名不能含有通配符 hosts 可以绕过 dns 解析,直接访 ...

  8. JavaWeb--Cookie与Session

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  9. 6.14 YZBOI模拟赛solution

    \(6.14\ YZBOI\)模拟赛\(solution\) 本来不想写题解来着...毕竟是自己找的题还是写一写吧 上午为了整活,就把赛制改成\(IOI\)赛制了,于是乎拯救了大家的\(70pts\) ...

  10. React报错之Cannot assign to 'current' because it is a read-only property

    正文从这开始~ 总览 当我们用一个null值初始化一个ref,但在其类型中不包括null时,就会发生"Cannot assign to 'current' because it is a r ...