Как распаковать файлы jsonlz4 (резервные копии закладок Firefox) с помощью командной строки?

Из help command :

$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

    Options:
      -p    use a default value for PATH that is guaranteed to find all of
      the standard utilities
      -v    print a description of COMMAND similar to the `type' builtin
      -V    print a more verbose description of each COMMAND

    Exit Status:
    Returns exit status of COMMAND, or failure if COMMAND is not found.

В качестве более общего примечания, вместо того, чтобы просто использовать -h , когда вы не знаете, что делает команда, вам следует попробовать:

type -a command

Который в этом случае сказал бы вам, что это встроенная оболочка.

help command

подходит для встроенных команд оболочки. Для других команд (и также для встроенных команд оболочки, на самом деле) попробуйте

man somecommand

Кроме того, -h не обязательно параметр «справка». Если вы не знаете, что делает команда, это предположение может быть небезопасным. Безопаснее - справка .

somecommand --help

(Общие команды, где -h является допустимым параметром, но не означает «помощь», ls , бесплатно , df , du . Все это носит исключительно информационный характер, но предположение, что -h будет означать только «помощь», является опасным предположением.)

24
29.11.2016, 22:15
6 ответов

Я смог распаковать jsonlz4 с помощью lz4json:

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

На самом деле почти все файлы профиля Firefox lz4 являются файлами mozlz4 . Это означает, что у них одинаковый «заголовок формата файла». Кроме одного файла. Я говорю о файле webext.sc.lz4 . Он имеет заголовок файла mozJSSCLz40v001\0и, возможно, некоторую упаковку scдля упаковки группы файлов в поток байтов.

Существует дополнение Firefox для чтения или сжатия .mozlz4 текстовых файлов mozlz4 -редактирования

5
27.01.2020, 19:40

Сохраните этот скрипт в файл, например,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)
23
27.01.2020, 19:40

Достаточно настойчивый гуглинг для этого выдает много решений, но большинство из них кажутся либо (а )сломанными последующими изменениями базовых библиотек, либо (b )излишне сложными (по крайней мере, на мой личный вкус ), что делает их неуклюжими для вставки в существующий код.

Следующее, по-видимому, работает по крайней мере на Python 2.7 и 3.6 с использованием последней версии привязок Python LZ4:

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>
8
27.01.2020, 19:40

Решение Python 3.
Нужен lz4:pip install lz4

Сохраните код как файл.py. Затем вы можете перетаскивать файлы на него или использовать командную строку для доступа к нему.

Он принимает только один путь к файлу. Если этот файл имеет расширение Mozilla LZ4 (.lz4,.mozlz4,.jsonlz4,.baklz4 ), он будет декодировать, в противном случае он попытается закодировать файл (всегда в ту же папку, в которой находился исходный файл. ). Вы получите предупреждение/вопрос о перезаписи, если выходной файл уже существует.

from sys import argv, exit
import os

try:
    import lz4.block as lz4
except ImportError:
    print("Please install lz4 via   'pip install lz4'.")


EXTENSIONS = {"1": ".lz4", "2": ".mozlz4", "3": ".jsonlz4", "4": ".baklz4"}



def check_overwrite(path):
    if os.path.exists(path):
        i = input(f"File {path} already exists. Overwrite? y/n\n")
        if i.lower() == "y":
            print("Overwriting file.")
            return True
        else:
            print("Exiting.")
            exit(1)
    else:
        return True


def print_info():
    print(f"Usage: {argv[0]} <infile>")
    print("Decompress Mozilla-LZ4 encoded <infile> or compress <infile> to Mozilla-LZ4.")
    print("Output file will be put in same folder as input file.")
    exit(1)


def choose_ext():
    print(f"Please choose file extension:")
    for k, v in EXTENSIONS.items():
        print(f"{k}: {v}")
    if (i := input()) in EXTENSIONS.keys():
        return EXTENSIONS[i]
    else:
        print("Invalid extension.\nExiting")
        exit(1)


def main():
    if len(argv) != 2:
        print_info()

    else:
        if not os.path.exists(argv[1]):
            print_info()
        else:
            in_full_name = os.path.basename(argv[1])
            in_folder_path = os.path.dirname(argv[1])
            in_name, in_ext = os.path.splitext(argv[1])  # "search.json", ".mozlz4"
            in_file_handle = open(argv[1], "rb")

            if in_ext.lower() in EXTENSIONS.values():
                ''' Decompress '''
                print(f"Trying to decompress {in_full_name}")
                out_file = os.path.join(in_folder_path, f"{in_name}")
                if check_overwrite(out_file):
                    with open(out_file, "wb") as f:
                        assert in_file_handle.read(8) == b"mozLz40\0"
                        f.write(lz4.decompress(in_file_handle.read()))

            else:
                ''' Compress '''
                print(f"Trying to compress {in_full_name}")
                ext = choose_ext()
                out_file = os.path.join(in_folder_path, f"{in_full_name}{ext}")
                if check_overwrite(out_file):
                    with open(out_file, "wb") as f:
                        f.write(b"mozLz40\0" + lz4.compress(in_file_handle.read()))


if __name__ == '__main__':
    main()
1
15.02.2020, 17:09

Сейчас существуют более простые решения как для Linux, так и для Windows, с программами командной строки -для распаковки этих надоедливых файлов .jsonlz4или .mozlz4.

Для Debian/Ubuntu теперь доступен пакетlz4json:

sudo apt install lz4 lz4json

Он обеспечиваетlz4jsoncat:

NAME

lz4jsoncat - decompress tool for mozilla lz4json format

SYNOPSIS

lz4jsoncat somefile.mozlz4 > somefile.json

DESCRIPTION

lz4jsoncat can unpack lz4json files as generated by Firefox's bookmark backups and session restore. The data is dumped to stdout.

Для Windows(или Linux )также есть mozlz4 . Исполняемые файлы доступны на странице релизов .

1
24.08.2021, 16:01

Теги

Похожие вопросы