设为首页 加入收藏

TOP

从nginx日志原始二进制数据还原文件(二)
2017-12-18 12:37:25 】 浏览:336
Tags:nginx 日志 原始 二进制数据 还原 文件
',data) >>> data "\\xFF\\xD8\\xFF\\xE0\\x00\\x10JFIF\\x00\\x01\\x01\\x00\\x00\\x01\\x00 ... \\xBC'\\xF1\\x8C\\xCC\\x83,\\xFAo\\xD2_\\xA0\\x1A\\x7F\\xFF\\xD9\\x0D\\x0A--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9--\\x0D\\x0A | 42097 | - | - | - | 1.1.1.1 | d1fkkbcd02eb | 127.0.0.1:8888 | 0.034 | 0.123" >>> data = re.sub(pb,'',data) >>> data "\\xFF\\xD8\\xFF\\xE0\\x00\\x10JFIF\\x00\\x01\\x01\\x00\\x00\\x01\\x00 ... \\xBC'\\xF1\\x8C\\xCC\\x83,\\xFAo\\xD2_\\xA0\\x1A\\x7F\\xFF\\xD9"

这样的匹配处理并不严谨,假设原始数据中本来就含有\\x0D\\x0A--的话,就会丢失原始数据,但目前为止还没遇到这种情况有效。更麻烦的做法是先匹配出表单分割字符串,然后以此为界分割出数据后,再删除两边多余的字符和回车换行。

成功提取出原始数据后,对数据进行解码,并写入.jpg文件。如果没有解码这一步,所有的数据都会被当做字符串写入文件,而不会被当成转义字符。简单做个测试:

把"\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01"保存到文件test.log。

>>> f = open('test.log', 'rb')
>>> data = f.read()
>>> data
'\\xFF\\xD8\\xFF\\xE0\\x00\\x10JFIF\\x00\\x01\n'
>>> print data
\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01

>>> import codecs as c
>>> c.decode(data, 'string_escape')
'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\n'
>>> print c.decode(data, 'string_escape')
????JFIF

>>>

读取的原始数据是两根反斜杠,print时因为反斜杠被转义成字符,所以变成一根。解码后的数据本身只有一根斜杠,print时打印出转义字符本身,也就是乱码。

接下来就可以分割文件,然后还原图片了。

#!/usr/bin/env python

import codecs, re


ifile = 'access.log'
suffix = 'jpg'

pf = re.compile('^.*Content-Transfer-Encoding: binary\\\\x0D\\\\x0A\\\\x0D\\\\x0A')
pb = re.compile('\\\\x0D\\\\x0A--.*$')

try:
    with open(ifile, 'rb') as f:
        number = 1 #第一张图片序号为1
        while True:
            l = f.readline().strip() #读取一行并去掉末尾的换行符\n
            if not l: #文件读完返回''时退出循环
                break
            l = re.sub(pf, '', l) #将数据前的字符替换为空
            l = re.sub(pb, '', l) #将数据后的字符替换为空
            img_file = '.'.join([str(number), suffix]) #图片文件名称
            print img_file #打印名字方便看进度
            with open(img_file, 'wb') as i: #解码并写入文件
                i.write(codecs.decode(l, 'string_escape'))
            number += 1 #下一张图片序号加1
except IOError:
    pass

access.log含有多条日志,每条日志都包含图片数据。日志较大,所以不使用readlines(),本来使用list也很占内存,且这样处理比较慢,要等程序把整个文件读完。按行读取日志后提取出图片数据后解码写入文件即可。

在这里放一个demo日志,方便以后改进和调试。
https://files.cnblogs.com/files/nampp/demo.tar.gz

EOF

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据开源 - Boss直聘岗位和招聘信.. 下一篇快速实现增删改查组件(起步阶段!..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目