- PVSM.RU - https://www.pvsm.ru -

Как за одну минуту восстановить текст после неудачной отправки веб-формы

Бывало ли когда-нибудь так, что вы набирали в браузере длинный и интересный текст, внимательно вычитывали его, и тут, буквально через мгновение, понимали, что при обращении к сайту произошла ошибка, а ваш текст в форме был стёрт?

В основном такое бывает из-за невнимательности разработчиков сайтов (под разработчиками я в данном случае подразумеваю не только программиста, который мог не знать о нужном способе, но и, например, менеджера, который посчитал, что тратить на это время слишком нецелесообразно): современные веб-технологии (например, Web Storage [1]) позволяют сохранять и восстанавливать данные (в том числе данные форм) при почти любых обстоятельствах — вплоть до случайного закрытия браузера.

И, тем не менее, вы писали длинный текст именно там, где ничего для сохранения данных формы не сделано.

Можно ли теперь как-то восстановить данные, если вы не можете скопировать текст из формы и не можете отправить POST-запрос повторно?

Не закрывайте браузер!

Решение есть

Если дело происходит в Linux, то вы можете воспользоваться потрясающе удобным способом сделать дамп области памяти, которую использует браузер. Впервые я прочитал о применении этого метода для восстановления данных, потерянных в браузере, на superuser.com [2] — одном из сайтов StackExchange. Это был ответ пользователя с именем Joey Adams [3] на вопрос «How do I recover a form in Firefox *without* installing a plugin?» [4].

Шаг 1

Убедитесь, что у вас установлен gdb [5] (GNU Debugger). Вам понадобится утилита gcore, которая может делать дамп оперативной памяти, которую использует запущенный процесс с определённым PID.

Шаг 2

Вы ведь не закрывали браузер? В таком случае выясните номер процесса:

ps -e | grep firefox

Теперь запустите gcore, чтобы создать дамп памяти для этого процесса:

gcore номер_процесса

Если ptrace при попытке использовать gcore выдаёт ошибку (Operation not permitted) — это означает, что в вашей системе процессы не могут обращаться к памяти других процессов, не являясь их дочерними процессами (даже при совпадении UID). Например, такую ошибку вы увидите в последних версиях Ubuntu [6], если вы не меняли соответствующее значение в файле /proc/sys/kernel/yama/ptrace_scope. Вообще говоря, в данном случае совершенно необязательно что-то перенастраивать — вы можете просто запустить gcore от имени суперпользователя.

Шаг 3

В текущем каталоге при запуске gcore появляется файл core.номер_процесса (например, core.20727). Кстати, учитывайте, что размер файла может быть очень большим. Например, у меня он сейчас получился 934 MiB.

Теперь попробуйте с помощью grep проверить, есть ли в дампе нужные данные. Например, если в тексте вы упоминали браузер Safari, то вы можете искать по слову «Safari»:

grep 'Safari' core.20727

Если вы видите сообщение о том, что в файле есть совпадение (Binary file core.20727 matches) — это очень хорошая новость, переходите к четвёртому шагу. Если совпадения не нашлось — вспомните, что ещё было в тексте, и попробуйте указать что-нибудь другое.

Шаг 4

Теперь остаётся извлечь из двоичного файла нужные вам куски с текстом.

Сделать это можно вот так:

grep -B 20 -A 20 -a 'Safari' core.20727 > /tmp/out

В данном случае вы сообщаете grep, что с данным двоичным файлом требуется работать как с текстом, а также что для каждого совпадения требуется вывести 20 предшествующих и 20 последующих строк.

Шаг 5

Теперь откройте получившийся файл и найдите в нём свой текст. Например, с помощью less /tmp/out:

Как за одну минуту восстановить текст после неудачной отправки веб формы

Всем приятного вечера. И не забывайте про Ctrl + S. :)

Автор: MaGIc2laNTern

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/27006

Ссылки в тексте:

[1] Web Storage: http://www.w3.org/TR/webstorage/

[2] superuser.com: http://superuser.com/

[3] Joey Adams: http://superuser.com/users/17424/joey-adams

[4] «How do I recover a form in Firefox *without* installing a plugin?»: http://superuser.com/questions/236390/how-do-i-recover-a-form-in-firefox-without-installing-a-plugin

[5] gdb: http://www.gnu.org/software/gdb/

[6] увидите в последних версиях Ubuntu: http://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process

[7] Источник: http://habrahabr.ru/post/169193/