背景
由于某疑似计划删库跑路的同学的骚操作,导致测试服务器上 Nginx 配置文件(/etc/nginx/conf.d) 被直接删除……一番骚操作试图恢复无果后,日子就在“只要我不重启服务,尴尬的就不是我”的平静中安详的度过,直到……我需要重启服务器……
目标
-
前提条件:
- Nginx 的配置文件内容已被破坏或覆盖,文件无法恢复
- Nginx 服务并未重启或重新读取新的配置内容
-
设法在不停止当前 Nginx 服务的前提下,提取运行中的 Nginx 正在使用的配置内容并恢复到文本文件
基本原理
参考资料
思路描述
- 在服务器确认 nginx 相关的进程并获取 pid
- 根据 pid 定位进程内存映射
- nginx 配置内容通常存储在进程的堆栈中([heap]),使用 gdb dump 从内存中提取该部分数据到文件
- 打印配置内容,并通过正则进行提取
代码实现(基于 Shell)
#! /bin/bash
### 用于扫描 Nginx 进程并从中反向分析配置
BASE_WORK_DIR=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
SCAN_DIR=${BASE_WORK_DIR}/analysisdir
SCAN_RESULT_FILE=${SCAN_DIR}/scanresult.txt
RESULT_DIR=${BASE_WORK_DIR}/resultdir
if [[ -d ${SCAN_DIR} ]]; then
rm -rf ${SCAN_DIR}
fi
if [[ -d ${RESULT_DIR} ]]; then
rm -rf ${RESULT_DIR}
fi
mkdir ${RESULT_DIR} && mkdir ${SCAN_DIR} && cd ${SCAN_DIR}
ps -ef | grep nginx | grep master | awk -F" " '{print $2}' | while read pid; do
workdir=${SCAN_DIR}/${pid}
mkdir ${workdir} && cd ${workdir}
# 生成 gdb 指令文件: dump memory
cat /proc/${pid}/maps | awk '$6 == "[heap]" {split ($1,mem_address,"-"); print "dump memory " $1 ".memo 0x" mem_address[1] " 0x" mem_address[2] ;}END{print "quit"}'> gdb-commands
gdb -p ${pid} -x gdb-commands
done
后续分析处理
获取文件后,可以做如下分析:
-
用 NotePad++ 打开并搜索 /etc/nginx/conf.d ,如果有记录则复制完整内容,到新的NotePad++空白页粘贴
-
将粘贴后的内容复制到 Sublime 中开始处理;
-
用正则替换:
- 搜索:
(/etc/nginx/conf.d/[^\.]+\.conf) \1.+?server {
- 替换为:
\n\n--> \1\nserver {
- 搜索:
-
对结果文档进行人工判断,删除无用部分即可
网友评论