Kann eine Datei aus einem Inode erstellt werden?

360
Matthew Franglen

Es gibt einen Apache-Prozess, der ein Zugriffs- und Fehlerprotokoll protokolliert. Die beiden Protokolldateien wurden gelöscht, der Apache-Prozess wurde jedoch nicht neu gestartet oder neu geladen, sodass noch offene Dateihandles für diese Protokolldateien vorhanden sind.

Ich kann auf den Dateiinhalt zugreifen, indem ich das Dateihandle aus dem /procVerzeichnis lese :

$ sudo lsof +p 30304 ... rotatelog 30304 root 4w REG 251,0 22480405 265346 /var/log/httpd/error_log-2014-09-11 (deleted) 

Wenn ich dann die Dateihandles für diesen Vorgang inspiziere, kann ich die Datei sehen:

$ ls -l /proc/30304/fd ... l-wx------ 1 root root 64 2014-09-11 10:18 4 -> /var/log/httpd/error_log-2014-09-11 (deleted) 

Ich kann auch den Inode für diese Datei sehen:

$ ls -i /proc/30304/fd/4 1936760177 /proc/30304/fd/4 

Ich kann diese Datei kopieren, um den aktuellen Inhalt abzurufen, aber zukünftige Protokollnachrichten werden in der kopierten Datei nicht angezeigt. Gibt es eine Möglichkeit, eine Datei mit dieser Inode-Nummer zu erstellen?

Dies ist vergleichbar mit lndem Erstellen einer festen Verknüpfung zu einer Datei, jedoch ohne dass eine vorhandene Datei vorhanden ist.

0

1 Antwort auf die Frage

1
grawity

Sie haben bereits eine vorhandene Referenzdatei - die in /proc/30304/fd. Es ist nur ein bisschen schwierig, es zu benutzen, da reguläres link () es ablehnt. Sie müssen linkat () verwenden .

Schreibe ein kleines C-Programm. Setze dies in foo.c:

#include <fcntl.h> #include <err.h>  int main(int argc, char *argv[]) { char *src, *dstdir, *dstname; int dirfd, r;  if (argc < 4) errx(2, "not enough parameters");  src = argv[1]; dstdir = argv[2]; dstname = argv[3];  dirfd = open(dstdir, O_DIRECTORY); if (dirfd < 0) err(1, "open(%s) failed", dstdir);  r = linkat(AT_FDCWD, src, dirfd, dstname, AT_SYMLINK_FOLLOW); if (r < 0) err(1, "linkat(%s, %s/%s) failed", src, dstdir, dstname);  return 0; } 

Führen Sie es aus als:

make foo ./foo '/proc/30304/fd/4' '/var/log' 'recovered.log' 
Danke für die schnelle Antwort. Ich habe ein Problem mit dem Befehl "make": `link.c: 13: error: 'O_DIRECTORY' nicht deklariert (erste Verwendung in dieser Funktion)`. Gibt es einen fehlenden Import oder muss ich eine gewisse Abhängigkeit vom System befriedigen? Matthew Franglen vor 9 Jahren 0
@MatthewFranglen: Ah, versuche es mit ``oder``oder``(Ich habe keine Ahnung welche, möglicherweise alle drei, obwohl * es * in * gewesen sein sollte)nach Angaben von Dokumenten. grawity vor 9 Jahren 0
Könnte ein OS-Problem sein. Wenn ich das Programm auf einem anderen System kompiliere, ist das Flag O_DIRECTORY verfügbar. Matthew Franglen vor 9 Jahren 0
Nun, das Flag ist ab Linux 2.1.126 verfügbar und sollte daher überall funktionieren. Vielleicht war es vorher nur in einer anderen Header-Datei. (Sie können versuchen, es durch den direkten Wert "0200000" zu ersetzen.) grawity vor 9 Jahren 0
Ihr Programm arbeitet auf dem System, auf dem ich es kompilieren kann, also akzeptiere ich die Antwort. Ich werde weiter damit spielen. Vielen Dank! Matthew Franglen vor 9 Jahren 0