Tar sobrescreve arquivos somente leitura

4

Eu criei o diretório test , criei o arquivo 1.txt em test , escrevi 'Before' neste arquivo. Então eu fui

cd ..

e usou o comando:

tar -cvzf ./test.tgz ./test

Em seguida, entrei novamente no diretório de testes. Abriu o arquivo 1.txt novamente. Conteúdo alterado para "depois". Salvei o arquivo e mudei o chmod para ler somente executando:

chmod -w ./1.txt

Então, por enquanto, meu 1.txt é somente leitura. Então eu subo

cd ..

e extraia o arquivo test.tgz .

tar -xvzf ./test.tgz

Então eu vou novamente para testar dir, fazer

cat 1.txt

e receba "Antes".

Não é lógico que isso aconteça, já que o arquivo foi definido como somente leitura. Por que isso acontece?

    
por Jakub 28.02.2012 / 01:28

2 respostas

6

O Tar não substituiu o arquivo somente leitura existente, ele o removeu e criou um novo arquivo com o mesmo nome. Esta é uma conseqüência do modo -x funciona; ele substitui as versões existentes de um arquivo por design para acomodar o antigo método de backup incremental de anexar arquivos a um archive existente. Um arquivo tar pode ter várias versões de um arquivo nele; somente o último aparecerá no disco após a conclusão da extração. Um efeito colateral disso é que o tar também remove cópias existentes de arquivos, mesmo que apareçam apenas uma vez no arquivo.

    
por 28.02.2012 / 01:50
1

O fato de um arquivo não poder ser removido não depende de as permissões de um arquivo serem definidas como somente leitura, mas das permissões do diretório pai.

Quando você tiver acesso de gravação a um diretório , poderá remover arquivos somente leitura nesse diretório, mesmo que você não possua esses arquivos você mesmo (link ).

# file removal test
(
mkdir -p test
echo hello > test/file.txt
chmod -w test
chmod -w test/file.txt
sudo chown root:wheel test/file.txt
#sudo chflags uchg test/file.txt
ls -ld test test/file.txt
rm -fv test/file.txt
echo
chmod 700 test  # set write permission
ls -ld test test/file.txt
rm -fv test/file.txt
)

Se você remover o acesso de gravação ao diretório test em seu exemplo acima, gnutar (no Mac OS X) não poderá remover test/1.txt e reclamar:

# gnutar: ./test/1.txt: Cannot open: File exists
# gnutar: Exiting with failure status due to previous errors
# After

tartest() {
   dirperms="$1"
   mkdir -p test
   [[ -f test/1.txt ]] && chmod +w test/1.txt
   echo "Before" > test/1.txt
   gnutar -czf ./test.tgz ./test
   echo "After" > test/1.txt
   chmod -w test/1.txt
   chmod "${dirperms}" test
   gnutar -xzf ./test.tgz
   cat test/1.txt
   return 0
}

tartest 755
tartest 555
    
por 02.03.2012 / 19:24