Um arquivo pode ser criado a partir de um inode?

0

Existe um processo apache que registra em um log de acesso e erro. Os dois arquivos de log foram excluídos, mas o processo do apache não foi reiniciado ou recarregado, portanto, ainda tem os identificadores de arquivo abertos para esses arquivos de log.

Eu posso acessar o conteúdo do arquivo lendo o identificador de arquivo do diretório /proc :

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

Se eu inspecionar as alças de arquivo para esse processo, posso ver o arquivo:

$ 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)

Eu também posso ver o inode desse arquivo:

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

Eu posso copiar este arquivo para obter o conteúdo atual, mas qualquer mensagem de log futura não aparecerá no arquivo copiado. Existe uma maneira de criar um arquivo que tenha esse número de inode?

É como usar ln para criar um link físico para um arquivo, mas sem ter um arquivo existente para fazer referência.

    
por Matthew Franglen 11.09.2014 / 11:50

1 resposta

1

Você faz tem um arquivo existente para referência - o em /proc/30304/fd . É um pouco complicado usá-lo, já que o link regular () se recusa a aceitá-lo. Você precisará usar linkat () .

Escreva um pequeno programa em C. Coloque isso em 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;
}

Execute como:

make foo
./foo '/proc/30304/fd/4' '/var/log' 'recovered.log'
    
por 11.09.2014 / 12:02