web-dev-qa-db-fra.com

Comment décompresser des fichiers JSONLZ4 (Sauvegardes Firefox Bookmark) à l'aide de la ligne de commande?

Il semble y avoir diverses méthodes spécifiques à la décompression de JavaScript + de navigateur, mais il n'y a pas de moyen de transformer les fichiers JSONLZ4 vers quelque chose unlz4 Je vais le lire?

24
l0b0

J'ai pu décompresser le Jsonlz4 en utilisant lz4json :

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

Enregistrez ce script dans un fichier, par exemple, 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)
19

Une googling suffisante pour cela provient beaucoup de solutions, mais la plupart d'entre eux semblent être soit (a) cassés par des modifications ultérieures des bibliothèques sous-jacentes, ou (b) inutilement complexes (du moins à mon goût personnel), ce qui les rend heureux à abandonner le code existant.

Ce qui suit semble fonctionner au moins sur Python 2.7 et 3.6 en utilisant une version récente des Python LZ4 Bindingings :

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

Bien sûr, cela n'essaie pas de valider les entrées (ou les sorties), n'est pas destiné à être sécurisé, etc., mais si l'on veut simplement pouvoir analyser ses propres données FF, il reçoit le travail de base effectué.

Version de ligne de commande ICI , qui pourrait être enregistrée dans le répertoire correspondant et appelé à partir de la ligne de commande comme suit:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
6
Samuel Henderson

La solution acceptée ne fonctionne pas sur des systèmes non linux; J'ai fourchu à - https://github.com/cnst/lz4json Pour que cela soit compilé proprement sur tous les autres systèmes UNIX®, y compris les BSD; Voici un échantillon pour Mac OS X:

Mac OS X UNIX® W/MACPORTS

Sudo port install lz4
git clone https://github.com/cnst/lz4json.git
cd lz4json
make
./lz4jsoncat ~/Library/Application\ Support/Firefox/Profiles/CHANGE\
THIS.default/sessionstore-backups/recovery.jsonlz4 \
| python -m json.tool | fgrep :textarea | more

J'ai également corrigé des problèmes de compilation sur FreeBSD et NetBSD w/ pkgsrc AT HTTPS: //github.com/cnst/lz4json ; Ajout de support pour d'autres systèmes tels que Fink ou Homebrew serait trivial dans ma version aussi; Je souhaite la bienvenue à des demandes de traction pour tout autre système UNIX (l'auteur de l'outil d'origine n'est intéressé que par la prise en charge de GNU/Linux, en refusant une requête de traction pour ajouter un support non linux).


En outre, voici la solution qui utilise Firefox directement: https://superuser.com/a/1363748/18057 .

1
cnst