如何使用命令行解压缩jsonlz4文件(Firefox书签备份)?


Answers:


18

我能够使用lz4json以下命令解压缩jsonlz4 :

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4

1
andikleen解决方案也适用于.json.mozlz4文件,例如,如github.com/andikleen/lz4json/issues/1#issuecomment-336729026所示(自我说明:记住,记住,gmake在FreeBSD上……)。
格雷厄姆·佩林

3
另外:Mozilla错误1209390下的bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4(2016-05-13)- 使用标准的lz4文件格式而不是非标准的jsonlz4 / mozlz4引起了对avih / dejsonlz4的
Graham Perrin

1
FWIW,andikleen的工具编译失败,并显示错误“未定义对LZ4_decompress_safe_partial的引用”(liblz4-dev在构建它之前,我确实已安装了该错误)。avih的工具OTOH非常适合我。
waldyrious

1
讽刺的是,开放式Web组织正在使用专有的压缩格式来存储用户数据,这使得检查您自己的数据变得不那么容易了吗?
cnst

@ Graham-Perrin:dejsonlz4对我来说很好。它不会按照要求“ 将jsonlz4文件转换为unlz4将读取的内容 ”,而是直接将其解压缩。使其成为一个真正的答案以使其更加可见将是很好的。
mivk

17

将此脚本保存在文件中,例如mozlz4

#!/usr/bin/env python
from sys import stdin, stdout, argv, stderr
import os
try:
    import lz4.block as lz4
except ImportError:
    import lz4

stdin = os.fdopen(stdin.fileno(), 'rb')
stdout = os.fdopen(stdout.fileno(), 'wb')

if argv[1:] == ['-c']:
    stdout.write(b'mozLz40\0' + lz4.compress(stdin.read()))
elif argv[1:] == ['-d']:
    assert stdin.read(8) == b'mozLz40\0'
    stdout.write(lz4.decompress(stdin.read()))
else:
    stderr.write('Usage: %s -c|-d < infile > outfile\n' % argv[0])
    stderr.write('Compress or decompress Mozilla-flavor LZ4 files.\n\n')
    stderr.write('Examples:\n')
    stderr.write('\t%s -d < infile.json.mozlz4 > outfile.json\n' % argv[0])
    stderr.write('\t%s -c < infile.json > outfile.json.mozlz4\n' % argv[0])
    exit(1)

我不得不更改import lz4import lz4.block as lz4,但仍然无法正常工作。一些字节与字符串相关的错误。OTOH这个脚本可以处理导入更改:gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389 '18

1
@ user31389:我更新了脚本。现在可以用吗?
哈康A. Hjortland

直到我才为我工作$ pip install lz4
丹尼尔·

5

实际上,几乎所有的Firefox配置文件lz4文件都是mozlz4文件。这意味着它们具有相同的“文件格式标题”。除了一个文件。我说说webext.sc.lz4文件。它具有mozJSSCLz40v001\0文件头,并且可能具有一些sc打包功能,可以将文件组打包到字节流上。

有一个Firefox插件可以读取或压缩.mozlz4文本文件mozlz4-edit


4

对此进行足够持久的Google搜索会带来很多解决方案,但大多数解决方案要么(a)被基础库的后续更改所破坏,要么(b)不必要的复杂(至少以我个人的口味),使它们笨拙放入现有代码。

使用最新版本的Python LZ4绑定,以下内容似乎至少在Python 2.7和3.6上有效:

def mozlz4_to_text(filepath):
    # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file, 
    # return the uncompressed text.
    import lz4.block
    bytestream = open(filepath, "rb")
    bytestream.read(8)  # skip past the b"mozLz40\0" header
    valid_bytes = bytestream.read()
    text = lz4.block.decompress(valid_bytes)
    return text

当然,这并不是试图验证输入(或输出),也不是为了确保安全性,等等,但是如果一个人只想能够解析自己的FF数据,那么它就可以完成基本工作。

此处的命令行版本,可以保存在相关目录中,并从命令行以以下方式调用:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.