Assista / tmp para criação de arquivos e impeça a exclusão de arquivos? [duplicado]

8

Eu tenho um binário que cria alguns arquivos em /tmp/*some folder* e os executa. Este mesmo binário exclui esses arquivos logo após executá-los. Existe alguma maneira de interceptar esses arquivos?

Não consigo tornar a pasta somente leitura, porque o binário precisa de permissões de gravação. Eu só preciso de uma maneira de copiar os arquivos quando eles são executados ou parar o binário original de excluí-los.

    
por dragostis 26.02.2016 / 15:35

3 respostas

8

Você pode usar o comando inotifywait de inotify-tools em um script para criar links físicos de arquivos criados em %código%. Por exemplo, vincule todos os arquivos criados de /tmp/some_folder a /tmp/some_folder :

#!/bin/sh

ORIG_DIR=/tmp/some_folder
CLONE_DIR=/tmp/some_folder_bak

mkdir -p $CLONE_DIR

inotifywait -mr --format='%w%f' -e create $ORIG_DIR | while read file; do
  echo $file
  DIR='dirname "$file"'
  mkdir -p "${CLONE_DIR}/${DIR#$ORIG_DIR/}"
  cp -rl "$file" "${CLONE_DIR}/${file#$ORIG_DIR/}"
done

Como são links físicos, eles devem ser atualizados quando o programa os modifica, mas não são excluídos quando o programa os remove. Você pode excluir normalmente os clones vinculados.

Note que esta abordagem está longe de ser atômica, então você confia neste script para criar os hard links antes que o programa possa deletar o arquivo recém-criado.

Se você quiser clonar todas alterações em /tmp/some_folder_bak , você pode usar uma versão mais distribuída do script:

#!/bin/sh

TMP_DIR=/tmp
CLONE_DIR=/tmp/clone
mkdir -p $CLONE_DIR

wait_dir() {
  inotifywait -mr --format='%w%f' -e create "$1" 2>/dev/null | while read file; do
    echo $file
    DIR='dirname "$file"'
    mkdir -p "${CLONE_DIR}/${DIR#$TMP_DIR/}"
    cp -rl "$file" "${CLONE_DIR}/${file#$TMP_DIR/}"
  done
}

trap "trap - TERM && kill -- -$$" INT TERM EXIT

inotifywait -m --format='%w%f' -e create "$TMP_DIR" | while read file; do
  if ! [ -d "$file" ]; then
    continue
  fi

  echo "setting up wait for $file"
  wait_dir "$file" &
done
    
por 26.02.2016 / 15:58
8

chattr +a /tmp/*some folder* definirá a pasta como somente anexada. Os arquivos podem ser criados e gravados, mas não excluídos. Use chattr -a /tmp/*some folder* quando terminar.

    
por 26.02.2016 / 17:34
1

Se os programas executados a partir de / tmp ainda estiverem em execução, você normalmente ainda pode recuperar o binário original, mesmo que seja "excluído" do sistema de arquivos, porque o inode ainda existe com os dados; a remoção é apenas desvincular o nome do diretório.

No Linux, você pode acessar o conteúdo do inode através do link / proc / PID / exe. Ferramentas como ls mostrarão o caminho original e marcarão o link como quebrado (colorwise) e a listagem indicará algo como "(excluído)" no nome. No entanto, você ainda pode recuperá-lo lendo o arquivo.

Um exemplo que mostra esse conceito (usando o sono como uma ferramenta ilustrativa):

$ cp /bin/sleep /tmp/otherprog
$ /tmp/otherprog 300 &
[1] 3572
$ rm /tmp/otherprog
$ ls -l /proc/3572/exe
lrwxrwxrwx 1 john john 0 Feb 27 08:54 /proc/3572/exe -> /tmp/otherprog (deleted)
$ cp /proc/3572/exe /tmp/saved
$ diff /tmp/saved /bin/sleep
$ echo $?
0

Eu criei um programa "novo" copiando o conteúdo do programa sleep para um novo programa chamado "otherprog" e o executei de tal forma que ele continuaria funcionando por um tempo. Então eu apaguei o programa de / tmp. Usando o PID que eu obtive do shell (você pode encontrar os PIDs dos programas que você se interessa via ps ) Eu olhei no link exe em / proc, então copiei o conteúdo do arquivo (mesmo que o nome do arquivo de destino tenha desaparecido) ) e verificou se o conteúdo corresponde ao original.

Isso obviamente não funcionará se os programas de / tmp tiverem vida curta, porque assim que eles saírem, a contagem de links do inode cairá para onde os dados são realmente liberados do disco.

Evita competir para copiar o arquivo antes de ser desvinculado do diretório / tmp.

    
por 27.02.2016 / 15:11