Descobri que o comando bsdtar
do pacote libarchive
(no Arch Linux, pelo menos) joga fora bits executáveis de arquivos em .zip
-archives ao ler de stdin
, mas não ao trabalhar diretamente no arquivo.
Em .tar
-archives, ele preserva o bit executável também ao ler de stdin.
Caso de teste:
Crie os arquivos:
Crie os arquivos:
touch a.txt
chmod 644 a.txt
touch a.out
chmod 755 a.out
As permissões do arquivo:
ls -ln a.out a.txt
mostra
-rwxr-xr-x 1 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 1 1001 1001 0 Dec 12 11:01 a.txt
Empacote os arquivos em arquivos:
bsdtar --format=zip -cf a.zip a.out a.txt
bsdtar -cf a.tar a.out a.txt
(Criar os arquivos com zip
e tar
em vez de bsdtar
produz o mesmo resultado.)
Extraindo/mostrando o conteúdo do arquivo diretamente:
bsdtar -tvf a.zip
ou
bsdtar -tvf - < a.zip
mostra
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
O bit executável de a.out
está presente aqui. As permissões de a.out
são 755 e de a.txt
644.
Leitura de stdin
:
cat a.zip | bsdtar -tvf -
mostra
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.out
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.txt
O bit executável para a.out
é jogado fora aqui. Além disso, ambos os arquivos são graváveis em grupo, eles não foram compactados dessa maneira. As permissões de a.out
e a.txt
são 664.
.tar
-arquivo:
Como comparação, para um .tar
-archive, as permissões no arquivo também são respeitadas ao ler de um pipe de stdin
:
bsdtar --numeric-owner -tvf a.tar
e
cat a.tar | bsdtar --numeric-owner -tvf -
ambos mostram
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
(observe que, ao mostrar o conteúdo de um arquivo ZIP, bsdtar
mostra o proprietário numérico por padrão; para um arquivo TAR, mostra o nome do proprietário.)
A questão é:
O que é especial stdin
em relação a bsdtar
? E por que apenas ao ler de um cachimbo, e não na moda bsdtar -tvf - < a.zip
? E por que especial para um .zip
-archive, mas não para um .tar
-archive?
[isso não é realmente uma resposta ainda, mas vou postar como tal, pois é impossível formatar qualquer coisa nos comentários]
zip
não é o único formato que cria problemas quando extraído de um arquivo não pesquisável. Aqui está um exemplo com imagens iso de várias sessões, mas pelo menosbsdtar
está imprimindo uma mensagem de erro e está saindo com um status diferente de zero. Provavelmente deve fazer o mesmo com arquivos zip; silenciosamente bagunçar as permissões não é aceitável IMHO.Aqui no bugtracker de
libarchive
está a resposta: