コマンドラインを使用してjsonlz4ファイル(Firefoxブックマークのバックアップ)を解凍する方法は?


回答:


18

以下を使用してjsonlz4を解凍できましたlz4json

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に示されているファイルにも適しています(自己注意:gmakeFreeBSD では覚えておいてください、覚えています)。
グラハムペリン

3
また:bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 Mozillaのバグの下で(2016年5月13日)1209390 -利用標準LZ4ファイル形式の代わりに、非標準jsonlz4 / mozlz4は、に注意を引くavih / dejsonlz4:解凍Mozilla Firefoxのブックマークのバックアップファイル
グラハム・ペラン

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

1
@ user31389:スクリプトを更新しました。今は動作しますか?
ホーコンA. Hjortland

私がやるまで私のために働いていなかった$ pip install lz4
ダニエル

5

実際、ほとんどすべてのFirefoxプロファイルlz4ファイルはmozlz4ファイルです。それらは同じ「ファイル形式ヘッダー」を持っていることを意味します。1つのファイルを除きます。webext.sc.lz4ファイルについて説明します。それは持っているmozJSSCLz40v001\0ファイルヘッダと、おそらくいくつかのscバイトストリーム上にファイルのグループをパックするためにパッケージを。

.mozlz4テキストファイルmozlz4-editの読み取りまたは圧縮を行うFirefoxアドオンがあります


4

これに対する十分に永続的なグーグルは多くの解決策を見つけますが、それらのほとんどは(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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.