GNU/Linux >> Belajar Linux >  >> Linux

Buka kembali deskriptor file dengan akses lain?

Ya! Caranya adalah dengan mengakses file yang terhapus melalui /proc/self/fd/n . Ini adalah trik khusus linux, sejauh yang saya tahu.

Jalankan program ini:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    FILE* out_file;
    FILE* in_file;
    char* dev_fd_path;
    char buffer[128];

    /* Write “hi!” to test.txt */
    out_file = fopen("test.txt", "w");
    fputs("hi!\n", out_file);
    fflush(out_file);

    /* Delete the file */
    unlink("test.txt");

    /* Verify that the file is gone */
    system("ls test.txt");

    /* Reopen the filehandle in read-mode from /proc */
    asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file));
    in_file = fopen(dev_fd_path, "r");
    if (!in_file) {
        perror("in_file is NULL");
        exit(1);
    }
    printf("%s", fgets(buffer, sizeof(buffer), in_file));

    return 0;
}

Itu menulis beberapa teks ke file, menghapusnya, tetapi membiarkan deskriptor file tetap terbuka dan kemudian membukanya kembali melalui rute yang berbeda. File tidak benar-benar dihapus hingga proses terakhir yang menahan deskriptor file terakhir menutupnya, dan hingga saat itu, Anda dapat memperoleh konten file melalui /proc .

Terima kasih kepada bos lama saya Anatoly karena mengajari saya trik ini ketika saya menghapus beberapa file penting yang untungnya masih ditambahkan oleh proses lain!


Tidak, panggilan fcntl tidak akan membiarkan Anda menyetel bit baca/tulis pada deskriptor file terbuka dan satu-satunya cara untuk mendapatkan deskriptor file baru dari yang sudah ada adalah dengan menggunakan fungsi duplikat. Panggilan ke dup/dup2/dup3 (dan fcntl ) tidak mengizinkan Anda mengubah mode akses file.

CATATAN:ini berlaku untuk Linux, tetapi tidak berlaku untuk Unix lain secara umum. Di HP-UX, misalnya, [lihat (1) dan (2)] Anda dapat mengubah bit baca/tulis dengan fcntl menggunakan F_SETFL pada deskriptor file terbuka. Karena deskriptor file dibuat oleh dup berbagi bendera status yang sama, namun, mengubah mode akses untuk satu tanda akan selalu mengubahnya untuk yang lain.


Linux
  1. Pemantauan Akses File Linux?

  2. Ganti Garis yang Mencocokkan Pola Dengan Garis Dari File Lain Secara Berurutan?

  3. Ganti Baris Baru Dengan Nul?

  1. Cara Mengaudit Akses File di Linux

  2. akses bersamaan ke file linux

  3. Menemukan konten dari satu file di file lain

  1. Plot file .gnu dengan gnuplot

  2. ganti baris dalam satu file dengan baris lain dengan nomor baris

  3. Apakah mv dengan wildcard masih atomik