Из 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
будет означать только «помощь», является опасным предположением.)
На самом деле почти все файлы профиля Firefox lz4 являются файлами mozlz4 . Это означает, что у них одинаковый «заголовок формата файла». Кроме одного файла. Я говорю о файле webext.sc.lz4 . Он имеет заголовок файла mozJSSCLz40v001\0
и, возможно, некоторую упаковку sc
для упаковки группы файлов в поток байтов.
Существует дополнение Firefox для чтения или сжатия .mozlz4 текстовых файлов mozlz4 -редактирования
Сохраните этот скрипт в файл, например,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)
Достаточно настойчивый гуглинг для этого выдает много решений, но большинство из них кажутся либо (а )сломанными последующими изменениями базовых библиотек, либо (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>
Решение 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()
Сейчас существуют более простые решения как для 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 . Исполняемые файлы доступны на странице релизов .