Предположим, что файл журнала apache удален, но apache остается открытым; тогда это то, что я делаю:
pid=$(lsof | grep text.txt | awk '/deleted/ {print $2}')
fd=$(lsof | grep text.txt | awk '/deleted/ {print $4}' | grep -oE "[[:digit:]]{1,}")
cp /proc/$pid/fd/$fd directorytobecopied/testfile.txt
Это то, что я делаю, чтобы восстановить файл и вернуть его туда, где он был. Есть ли более простой способ сделать это, потому что приведенный выше код не выглядит хорошо. Кроме того, как мне узнать, откуда был удален файл ( каталог, скопированный), чтобы мне не приходилось вручную спрашивать кого-то, где файл был изначально найден, и помещать его туда.
linux
shell
logs
data-recovery
apache-httpd
Munish
источник
источник
lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'
Ответы:
Если файл был удален, но все еще открыт, это означает, что файл все еще существует в файловой системе (он имеет индекс ), но имеет жесткое число ссылок, равное 0. Поскольку ссылки на файл нет, вы не можете открыть его по имени , Также нет возможности открыть файл по inode.
Нет способа обнаружить файл через его файловую систему, и особенно нет способа найти файл в каталоге, где он был в последний раз. Запись каталога исчезла. Осталось только сам файл. Вы можете получить доступ к файлу с помощью отладчика файловой системы, но для этого требуются права суперпользователя, он сложен в использовании и подвержен ошибкам.
Linux предоставляет открытые файлы через специальные символические ссылки в разделе
/proc
. Эти ссылки называются,/proc/12345/fd/42
где 12345 - это PID процесса, а 42 - номер дескриптора файла в этом процессе. Программа, работающая от имени того же пользователя, что и этот процесс, может получить доступ к файлу (права на чтение / запись / выполнение такие же, как и у вас при удалении файла).Имя, под которым был открыт файл, по-прежнему отображается в целевом символической ссылке: если файл был
/var/log/apache/foo.log
, то целевой ссылкой является/var/log/apache/foo.log (deleted)
. (Если файл был переименован после его открытия, цель символической ссылки может отражать переименование.)Таким образом, вы можете восстановить содержимое открытого удаленного файла, учитывая PID процесса, в котором он открыт, и дескриптор, в котором он открыт, следующим образом:
Если вы знаете только идентификатор процесса, но не дескриптор, вы можете восстановить все файлы с помощью
Если вы не знаете идентификатор процесса, вы можете искать среди всех процессов:
Вы также можете получить этот список, проанализировав вывод
lsof
, но он не является ни более простым, ни более надежным, ни более переносимым (так или иначе, это зависит от Linux).источник