명령 줄을 사용하여 jsonlz4 파일 (Firefox bookmark backup)의 압축을 해제하는 방법?


답변:


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 (:, 기억, 기억 자체에 대한 주석 gmake... FreeBSD의에).
Graham Perrin

3
또한 : Mozilla 버그 1209390 에서 bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) -비표준 jsonlz4 / mozlz4 대신 표준 lz4 파일 형식을 사용 하면 avih / dejsonlz4에
Graham Perrin

1
FWIW, andikleen의 도구는 "LZ4_decompress_safe_partial에 대한 정의되지 않은 참조"라는 오류와 함께 컴파일에 실패했습니다 ( liblz4-dev빌드하기 전에 설치 했습니다). avih의 도구 인 OTOH가 완벽하게 작동했습니다.
waldyrious

1
오픈 웹 조직이 사용자 데이터에 독점적 인 압축 형식을 사용하여 자신의 데이터를 검사하는 것이 쉽지 않은 것은 아이러니하지 않습니까?!
cnst

@ Graham-Perrin : dejsonlz4 는 저에게 매우 효과적이었습니다. 그것은 "하지 않습니다 읽을 뭔가 unlz4에 파일을 jsonlz4 변환 의 요청에 따라"하지만 직접 압축을 풉니 다. 더 잘 보이도록 실제 답변을 만드는 것이 좋습니다.
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 lz4해야 import lz4.block as lz4했지만 여전히 작동하지 않습니다. 일부 바이트 대 문자열 관련 오류. OTOH이 스크립트는 임포트 변경과 함께 작동했습니다 : gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389

1
@ user31389 : 스크립트를 업데이트했습니다. 지금 작동합니까?
Håkon A. Hjortland

내가 할 때까지 나를 위해 일하지 않았습니다 $ pip install lz4.
다니엘

5

사실 거의 모든 파이어 폭스 프로필 lz4의 파일은 mozlz4 파일. 이는 동일한 "파일 형식 헤더"를 가지고 있음을 의미합니다. 하나의 파일을 제외하고. webext.sc.lz4 파일 에 대해 이야기 합니다. 그것은이 mozJSSCLz40v001\0파일 헤더 어쩌면 일부 sc바이트 스트림에 파일 팩 그룹에 포장.

.mozlz4 텍스트 파일 을 읽거나 압축하는 Firefox 애드온이 있습니다. mozlz4-edit


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 데이터를 구문 분석하려는 경우 기본 작업을 수행합니다.

명령 행 버전 here . 관련 디렉토리에 저장하고 명령 행에서 다음과 같이 호출 할 수 있습니다.

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.