GNU/Linux >> LINUX-Kenntnisse >  >> Linux

temporärer Dateispeicherort bei Verwendung von tmpfile() in C

Wahrscheinlich wird der Dateieintrag im Verzeichnis direkt gelöscht. Auf POSIX-Systemen bleibt die Datei selbst nach dem Löschen gültig, solange Sie einen offenen Dateideskriptor dafür haben. (In Ihrem Fall versteckt im FILE* Rückgabewert.)

Mit dieser Technik kann sich niemand einschleichen und diese Datei öffnen, sie ist nur über Ihre Variable tmp zugänglich .


Kompilieren Sie Ihren Code und führen Sie ihn durch strace gibt den Speicherort und Namen der Datei an:

$ ./a.out
execve("./main", ["./main"], [/* 31 vars */]) = 0
brk(0)                                  = 0xe0c000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c51a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=103425, ...}) = 0
mmap(NULL, 103425, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f038c500000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\357\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1603600, ...}) = 0
mmap(NULL, 3717176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f038bf71000
mprotect(0x7f038c0f3000, 2097152, PROT_NONE) = 0
mmap(0x7f038c2f3000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x182000) = 0x7f038c2f3000
mmap(0x7f038c2f8000, 18488, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f038c2f8000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4ff000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4fe000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c4fd000
arch_prctl(ARCH_SET_FS, 0x7f038c4fe700) = 0
mprotect(0x7f038c2f3000, 16384, PROT_READ) = 0
mprotect(0x7f038c51c000, 4096, PROT_READ) = 0
munmap(0x7f038c500000, 103425)          = 0
stat("/tmp", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
getpid()                                = 25957
open("/tmp/tmpfflAlKG", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
unlink("/tmp/tmpfflAlKG")               = 0
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
brk(0)                                  = 0xe0c000
brk(0xe2d000)                           = 0xe2d000
fstat(3, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c519000
lseek(3, 0, SEEK_CUR)                   = 0
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f038c518000
read(0, alk
"alk\n", 1024)                  = 4
exit_group(0)                           = ?

"/tmp/tmpfflAlKG" wird über open() erstellt

open("/tmp/tmpfflAlKG", O_RDWR|O_CREAT|O_EXCL, 0600) = 3

und erhält dann sofort unlink()

unlink("/tmp/tmpfflAlKG")               = 0

damit verschwindet der sichtbare Verzeichniseintrag.

Da sie für den Prozess noch offen ist, bleibt die Datei selbst für den Prozess bis zum Prozess close() gültig mach Sitz. Letzteres geschieht implizit über den Aufruf von exit_group() :

exit_group(0)                           = ?

Linux
  1. Wie fülle ich eine Datei mit FF mit dd auf?

  2. Konvertieren Sie die Datei mit LibreOffice unter dem Benutzer Apache (z. B. bei Verwendung von PHP) in PDF

  3. Verwenden von vim, um die Bearbeitung einer Datei zu erzwingen, wenn Sie sie ohne Berechtigungen geöffnet haben

  4. Wie kann ich den privaten Schlüssel beim Entschlüsseln einer Datei mit GnuPG angeben?

  5. Verwendung von / bei Verwendung von CD

Verwenden der SSH-Konfigurationsdatei

Gewusst wie:Eine Einführung in die Verwendung von Git

Übertragen Sie Dateien mit WinSCP

Verwenden von nc zum Übertragen großer Dateien

Kopieren einer Datei nur, wenn sie neuer als das Ziel ist

Wie entferne ich eine Datei ohne rm?