Como posso listar o conteúdo de um arquivo Maestro sem executá-lo?

3

Eu tenho um arquivo de mains, e quero ver o que tem dentro, ou seja. quais arquivos seriam extraídos, em vez de executar a parte do script. Como eu faço isso?

Eu prefiro não extrair nada disso, mas se essa é a única maneira, então eu estou disposto a fazer a extração - desde que nenhum código (ba) sh realmente seja executado.

    
por einpoklum 10.09.2016 / 16:05

2 respostas

4

O arquivo gerado tem uma opção --list , que você pode usar para listar seu conteúdo.

Para referência, estou falando sobre esta versão no Debian:

ii  makeself       2.2.0-1      all          utility to generate self-extractables

que gera este fragmento no script:

MS_Help()
{   
    cat << EOH >&2 
Makeself version 2.2.0 
 1) Getting help or info about $0 : 
  $0 --help   Print this message 
  $0 --info   Print embedded info : title, default target directory, embedded script ... 
  $0 --lsm    Print embedded lsm entry (or no LSM) 
  $0 --list   Print the list of files in the archive 
  $0 --check  Checks integrity of the archive 

 2) Running $0 : 
  $0 [options] [--] [additional arguments to embedded script] 
  with following options (in that order) 
  --confirm             Ask before running embedded script 
  --quiet               Do not print anything except error messages 
  --noexec              Do not run embedded script 
  --keep                Do not erase target directory after running 
                        the embedded script 
  --noprogress          Do not show the progress during the decompression 
  --nox11               Do not spawn an xterm 
  --nochown             Do not give the extracted files to the current user 
  --target dir          Extract directly to a target directory 
                        directory path can be either absolute or relative 
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command 
  --                    Following arguments will be passed to the embedded script 
EOH
}

Sua página de manual precisa de algum trabalho, mas o script é fácil de ler - veja repositório git

Outras leituras: self-made - Faça arquivos auto-extraíveis no Unix

    
por 10.09.2016 / 16:19
0

Um arquivo makeself consiste em três partes:

  1. Um script de shell.
  2. Um arquivo tar comprimido em gzip.
  3. Opcionalmente, mais dados no final.

Normalmente, quando você executa o arquivo, ele executa o shell script, que extrairá o arquivo incorporado em um diretório temporário e, em seguida, executará um arquivo específico extraído do arquivo. O script contém informações sobre seu próprio tamanho e o tamanho do arquivo tar, o que permite extrair o arquivo tar incorporado no meio.

(Os "mais dados no final" podem ser qualquer coisa. Para instaladores do GoG, por exemplo, ele contém um arquivo zip com o conteúdo real do jogo. Esses arquivos podem ser extraídos com unzip , ignorando-se completamente. porque os arquivos zip usam deslocamentos em relação ao final do arquivo.)

Se você abrir o arquivo com less no Linux, poderá ver o conteúdo do script, que informa tudo o que você precisa saber. Perto do topo, deve haver uma linha como:

filesizes="1245"

Isso informa que o arquivo tar incorporado tem 12345 bytes de comprimento. (Em teoria, filesizes poderia listar o tamanho de mais de um arquivo, mas na prática, parece ser raro um arquivo conter mais de um arquivo.)

Se você pesquisar por head , deverá encontrar uma linha como:

offset='head -n 519 "$1" | wc -c | tr -d " "'

Esta é a lógica usada pelo script para descobrir seu próprio tamanho. Como você pode ver, o script sabe que tem 519 linhas.

Agora você sabe o tamanho do script (em linhas) e o tamanho do arquivo tar incorporado (em bytes), você pode listar o conteúdo do arquivo incorporado da seguinte forma:

tail +520 ~/Downloads/gog_huniepop_2.0.0.3.sh | head -c 12345 | tar tz

tail +N listará o conteúdo de um arquivo a partir da linha N . Usamos 520, que é 1 mais do que 519, porque queremos começar apenas após o final do script (excluindo assim a última linha).

Algumas notas:

  • Se você deseja extrair os arquivos (em vez de apenas listá-los), use tar xz em vez de tar tz . Você provavelmente quer fazer isso em um diretório vazio!
  • No BSD, o tar lê de um dispositivo de fita em vez de stdin por padrão. Use tar tzf - nesse caso.
por 08.10.2017 / 00:22