Восстановление данных из файла LevelDB .ldb

Я пытаюсь извлечь данные из файла .ldb. Расширение OneTab для Chrome дало мне сбой, и я пытаюсь восстановить сохраненные им ссылки. Я считаю, что нашел решение из старого сообщения в блоге, но я недостаточно знаю о кодировании, чтобы понять, как следовать.

Вот ссылка на сообщение в блоге: https://antimatter15.com/2015/12/recovering-deleted-data-from-leveldb/

Я считаю, что сделал все правильно, чтобы создать приложение Go, как он предлагает. Он создал файл с именем «ldbdump» без расширения. Следующий шаг, где у меня есть проблемы. Я попытался запустить его код Python в Jupyter Notebook (это единственное программное обеспечение, с которым у меня есть опыт работы с Python, и в этом ограниченный опыт), но получил только ошибки.

Исходный код, с которым я работаю, можно найти по приведенной выше ссылке под заголовком «Восстановление». Я изменил определение «база» с «копия тестового материала», чтобы указать на папку с файлами .ldb, которые я пытаюсь прочитать, а также с файлом «ldbdump». Я также изменил синтаксис команды печати внизу после получения ошибок. Все остальное осталось в покое.

base = "D:\\Downloads\\ldb archive"

import os
from subprocess import Popen, PIPE
import json
import ast

for f in os.listdir(base):
  if f.endswith(".ldb"):
    process = Popen(["ldbdump", os.path.join(base, f)], stdout=PIPE)
    (output, err) = process.communicate()
    exit_code = process.wait()
    for line in (output.split("\n")[1:]):
      if line.strip() == "": continue
      parsed = ast.literal_eval("{" + line + "}")
      key = parsed.keys()[0]
      print(json.dumps({ "key": key.encode('string-escape'), "value": parsed[key] }))

Если я правильно понимаю сообщение в блоге, это должно распечатать содержимое файла .ldb после преобразования его содержимого в файл JSON (хотя я не уверен, где будет сохранен этот файл JSON). После этого я могу перейти к следующему шагу, который очистит результаты, чтобы они были более читаемыми. Вместо этого я получаю сообщение об ошибке. Я не могу сказать, что я делаю неправильно, так как я едва знаю, что я делаю в первую очередь. Все, что я действительно понимаю, это «файл не найден» вверху. Это выглядит так:

FileNotFoundError                         Traceback (most recent call last)
<ipython-input-2-26ff29e32d63> in <module>
      1 for f in os.listdir(base):
      2   if f.endswith(".ldb"):
----> 3     process = Popen(["ldbdump", os.path.join(base, f)], stdout=PIPE)
      4     (output, err) = process.communicate()
      5     exit_code = process.wait()

~\Anaconda3\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
    767                                 c2pread, c2pwrite,
    768                                 errread, errwrite,
--> 769                                 restore_signals, start_new_session)
    770         except:
    771             # Cleanup if the child failed starting.

~\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
   1170                                          env,
   1171                                          os.fspath(cwd) if cwd is not None else None,
-> 1172                                          startupinfo)
   1173             finally:
   1174                 # Child is launched. Close the parent's copy of those pipe

FileNotFoundError: [WinError 2] The system cannot find the file specified

Как я уже сказал, я не уверен, что я делаю неправильно. Мои лучшие предположения заключаются в том, что я либо неправильно изменяю код сообщения в блоге, чтобы указать его на файлы на моем ПК, либо что исходный код неправильно предполагает что-то о моей машине (это означает, что у меня неправильная ОС, я не должен запускать это в блокноте, мне не хватает некоторых зависимостей и т. д.)

Для справки, я использую настольный ПК под управлением Windows 10, я пытаюсь запустить этот код с Jupyter Notebook 5.7.4, у меня нет других импортированных пакетов, кроме тех, которые перечислены в разделе кода выше, и я едва знаю, что я делаю. Мне жаль. Пожалуйста помоги.


person ff03    schedule 19.07.2019    source источник


Ответы (2)


в моем исследовании я добавил некоторые исправления

import os
import subprocess
import json
import ast
for f in os.listdir(base):
  if f.endswith(".ldb"):
    process = subprocess.Popen(["ldbdump", os.path.join(base, f)], stdout=subprocess.PIPE, shell = True)
    (output, err) = process.communicate()
    exit_code = process.wait()
    for line in (output.split("\n")[1:]):
      if line.strip() == "": continue
      parsed = ast.literal_eval("{" + line + "}")
      key = parsed.keys()[0]
      print json.dumps({ "key": key.encode('string-escape'), "value": parsed[key] })
person Vjatcheslav Tkachev    schedule 09.09.2019
comment
Не могли бы вы объяснить, какие исправления вы внедрили для решения проблемы? - person Teh; 09.09.2019
comment
Я четко указал библиотеку для таких процессов, как subprocess.Popen и subprocess.PIPE. Также я добавил shell = True в объявлении функции. Подробнее об этом можно прочитать здесь: stackoverflow.com/questions/43143743/ - person Vjatcheslav Tkachev; 10.09.2019
comment
Привет @VjatcheslavTkachev, не могли бы вы написать объяснение полной настройки для запуска этого скрипта для тех, кто не знает Python? Я действительно борюсь и отчаянно нуждаюсь в помощи в этом. Я продолжаю получать ldbdump: команда не найдена, спасибо! - person JimmyBob; 30.01.2021

Немного поздно, но я столкнулся с той же проблемой. Решение на самом деле тривиально: файл ldbdump (без расширения), созданный Go под Windows, является надлежащим исполняемым файлом Windows. Просто добавьте расширение .exe, и вы сможете запустить его прямо в командной строке Windows, например. ldbdump 000005.ldb (файл ldbdump должен иметь расширение .exe, иначе это неизвестная команда). Он выведет дамп ldb в виде списка пар ключ-значение, разделенных запятыми (обычный текст). Вы можете просто скопировать и вставить вывод в текстовый файл или передать вывод в файл, отформатировать его по своему усмотрению и т. д.

Суть в следующем: это обычный исполняемый файл Windows, и вам не нужен для него python — используйте любой инструмент, который вам нравится, для обработки вывода или просто сделайте это вручную.

person Novgorod    schedule 11.10.2020