Angenommen, eine Apache-Protokolldatei wird gelöscht, aber von Apache offen gehalten. dann mache ich folgendes:
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
Dies ist, was ich tue, um die Datei wiederherzustellen und wieder dort abzulegen, wo sie war. Gibt es eine einfachere Möglichkeit, dies zu tun, da der obige Code nicht gut aussieht? Außerdem, woher weiß ich, woher die Datei gelöscht wurde ( Verzeichnis , das kopiert wurde), damit ich niemanden manuell fragen muss, wo sich die Datei ursprünglich befindet, und sie dort ablegen muss.
linux
shell
logs
data-recovery
apache-httpd
Munish
quelle
quelle
lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'
Antworten:
Wenn eine Datei gelöscht wurde, aber noch geöffnet ist, bedeutet dies, dass die Datei noch im Dateisystem vorhanden ist (sie hat einen Inode ), aber eine feste Linkanzahl von 0. Da kein Link zur Datei vorhanden ist, können Sie sie nicht namentlich öffnen . Es gibt auch keine Möglichkeit, eine Datei per Inode zu öffnen.
Es gibt keine Möglichkeit, die Datei über das Dateisystem zu ermitteln, und insbesondere keine Möglichkeit, die Datei in dem Verzeichnis zu suchen, in dem sie sich zuletzt befand. Der Verzeichniseintrag ist weg. Alles was bleibt ist die Datei selbst. Sie können mit einem Dateisystem-Debugger auf die Datei zugreifen, dies erfordert jedoch Root-Berechtigungen und ist schwer zu verwenden und fehleranfällig.
Linux macht offene Dateien durch spezielle symbolische Links unter verfügbar
/proc
. Diese Links werden aufgerufen,/proc/12345/fd/42
wobei 12345 die PID eines Prozesses und 42 die Nummer eines Dateideskriptors in diesem Prozess ist. Ein Programm, das als derselbe Benutzer wie dieser Prozess ausgeführt wird, kann auf die Datei zugreifen (die Lese- / Schreib- / Ausführungsberechtigungen entsprechen denen, die Sie beim Löschen der Datei hatten).Der Name, unter dem die Datei geöffnet wurde, ist im Ziel des symbolischen Links noch sichtbar: Wenn die Datei war
/var/log/apache/foo.log
, ist das Ziel des Links/var/log/apache/foo.log (deleted)
. (Wenn die Datei nach dem Öffnen umbenannt wurde, spiegelt das Ziel des Symlinks möglicherweise die Umbenennung wider.)Auf diese Weise können Sie den Inhalt einer geöffneten gelöschten Datei anhand der PID eines Prozesses, in dem sie geöffnet ist, und des Deskriptors, auf dem sie geöffnet ist, wie folgt wiederherstellen:
Wenn Sie nur die Prozess-ID kennen, aber nicht den Deskriptor, können Sie alle Dateien mit wiederherstellen
Wenn Sie auch die Prozess-ID nicht kennen, können Sie zwischen allen Prozessen suchen:
Sie können diese Liste auch erhalten, indem Sie die Ausgabe von analysieren
lsof
, sie ist jedoch weder einfacher noch zuverlässiger noch portabler (dies ist ohnehin Linux-spezifisch).quelle