É possível falsificar o caminho do diretório de destino com zip?

6

Dado um monte de arquivos no diretório atual, eu quero poder compactá-los de forma que, quando extraídos, eles sejam colocados em alguns diretórios. Por exemplo, digamos que eu tenha em $PWD :

ls
fsck
xz
chroot

E quando eu executo unzip foo.zip , cada um deles é extraído para esses diretórios:

/bin
/sbin
/usr/bin
/usr/sbin

O mais próximo que pude encontrar é que esses arquivos já devem existir em qualquer caminho de diretório para o qual eu queira que os arquivos sejam extraídos (usando $PWD como diretório raiz):

$ zip foo.zip bin/ls sbin/fsck usr/bin/xz usr/sbin/chroot

Então, em um sistema onde eu quero que essa extração aconteça, eu teria que:

$ cd /
$ sudo unzip foo.zip
    
por Tshepang 11.08.2014 / 17:22

1 resposta

4

Eu não vejo uma maneira de fazer isso usando o comando zip , mas é fácil em python.

Observe que a especificação do formato de arquivo zip , seção 4.4.17.1, informa que o nome do caminho não pode ser iniciado com um '/', então eu não posso ajudar com essa parte.

O módulo python zipfile permite substituir o nome do caminho de um arquivo quando você o adiciona ao arquivo zip ; apenas passe o nome desejado como o segundo argumento opcional para ZipFile.write :

ZipFile.write(filename[, arcname[, compress_type]])
Write the file named filename to the archive, giving it the archive name arcname (by default, this will be the same as filename, but without a drive letter and with leading path separators removed). If given, compress_type overrides the value given for the compression parameter to the constructor for the new entry.
Note: Archive names should be relative to the archive root, that is, they should not start with a path separator.

Veja um exemplo:

$ touch 1 2 3
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import zipfile
>>> with zipfile.ZipFile('bundle.zip', 'w') as bundle:
...   bundle.write('1', '/bin/1')
...   bundle.write('2', '/sbin/2')
...   bundle.write('3', '/usr/bin/3')
... 
>>> 
$ unzip -l bundle
Archive:  bundle.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2014-08-11 13:00   bin/1
        0  2014-08-11 13:00   sbin/2
        0  2014-08-11 13:00   usr/bin/3
---------                     -------
        0                     3 files

Observe que zipfile.write removerá qualquer '/' inicial do nome do caminho, para se adequar ao padrão.

    
por 11.08.2014 / 19:09

Tags