Как стать автором
Обновить

Восстановление открытых файлов но удаленных c файловой системы linux

Время на прочтение 2 мин
Количество просмотров 32K
Всех с прошедшим новым годом!
В этой заметке я бы хотел поделиться как можно восстановить открытый файл в linux.

Предыстория


Зашел человек на канал посвященный debian в jabber и сказал что взломали его jabber-bot и выполнили команду:
$ rm -rf /*

так как это было выполнено не под рутом, особых проблем быть не должно, но конфигурационные файлы бота удалены. Бот остался запущен и задача была восстановить открытые им файлы и попробовать максимально быстро поднять всё с теми же настройками.

Восстанавливаем файл


Первым делом нам нужно убедиться что у нас стоит приложение lsof и примонтирован procfs в /proc.
В этой заметке я буду считать что в системе где будут восстанавливаться открытые файлы все нужные приложения стоят, root доступ есть, всё примонтировано как нужно.

Первым делом нам нужно найти открытый файл с помощью программы lsof:
$ sudo lsof | grep filename

Пример:
$ sudo lsof | grep /home/anton/.xsession-errors
kwin 2031 4002 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

Нас интересуют вот эти значения:
  • Номер процесса (pid)
  • Файловый дескриптор (file descriptor)

Здесь я выделю жирным то что нужно:
kwin 2031 4002 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

Дальше восстанавливаем его (вы можете также его сохранить в другом месте):
$ sudo cp /proc/2031/fd/2 /home/anton/.xsession-error

На этом всё, так можно восстановить открытый файл, но который по какой-то причине был удален.

UPD1: Меня спросили как найти и восстановить все открытые файлы конкретным приложением.
Предположим мы знаем 1 файл который нужно восстановить, мы его нашли с помощью
$ sudo lsof | grep /home/anton/.xsession-errors
kwin 2031 anton 2w REG 253,3 4486557 1835028 /home/anton/.xsession-errors

Мы знаем что 2031 — это pid процесса который держит ваш файл. Нам нужно найти все файлы которые держать открытыми данный процесс:
$ sudo lsof -p 2031

Мы видим все открытые приложения этим процессом, нам осталось только отобрать удаленные:
$ sudo lsof -p 2031 | grep deleted

После чего просто восстанавливаем все файлы как описано выше.

UPD2: Почему я использую grep для поиска файлов вместо параметра, который работает быстрей?
Я использую grep так как там видно удален файл или нет, я считаю это более удобным (ИМХО)

UPD3: Также можно посмотреть все открытые файлы процесса через комманду ls, пометки deleted будут, пример:
$ ls -lia /proc/2031/fd/
Теги:
Хабы:
+50
Комментарии 32
Комментарии Комментарии 32

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн