2009-06-05 4 views
60

Alcuni software (ad esempio il) spediscono i programmi di installazione di Linux nei file .sh. Curioso di come esattamente "impacchettano" un intero IDE in uno "script di shell", ho aperto il file in un editor. Ho visto un semplice codice di script di shell di testo e poi un po 'di incomprensibilità casuale, che io considero' binario 'o testo non normale.Come funzionano gli installer binario Linux (.bin, .sh)?

Mi chiedo come combinino gli script di shell semplice e quindi probabilmente chiamiamo il materiale "non leggibile", che sarebbe il binario.

Qualche idea su questo?

+0

Ho scelto la risposta di Curt perché ha spiegato il processo, piuttosto che indicare uno strumento che lo fa. Grazie, Seb, James e Nik. –

risposta

83

Fondamentalmente, è uno script di shell anteposto ad un archivio compresso di qualche tipo, come un archivio tar. Si utilizza il comando tail o sed su se stessi (la variabile $0 nella shell Bourne) per rimuovere lo script della shell in primo piano e passare il resto al proprio unarchiver.

Ad esempio, creare il seguente script come self-extracting:

#!/bin/sh -e 
sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup 
exit 

Il comando sed precedente cancella tutte le righe dalla prima riga del file per il primo che inizia con "uscita", e poi passa la riposa attraverso Se ciò che inizia immediatamente dopo la riga "exit" è un file tar, il comando tar lo estrae. Se ciò accade, il file ./project/Setup (presumibilmente estratto dal tarball) verrà eseguito.

Poi:

mkdir project 
echo "#!/bin/sh" > project/Setup 
echo "echo This is the setup script!" >> project/Setup 
chmod +x project/Setup 
tar czf - project >> self-extracting 

Ora, se si sbarazzarsi della vostra vecchia directory project, è possibile eseguire self-extracting e sarà estrarre il file tar ed eseguire lo script di installazione.

+0

In che modo lo script della shell interagisce con il contenuto dell'archivio? (Probabilmente è un altro linguaggio assembly/binario/bytecode) –

+1

In molti casi reali, la porzione binaria sarà codificata in base64 o qualche altra codifica in modo tale che l'intero file contiene solo caratteri stampabili. – SingleNegationElimination

+2

Amit: una volta estratto l'archivio, sono solo i file sul disco e puoi fare tutto ciò che uno script di shell può fare con i file sul disco. Il mio esempio esegue uno script di installazione estratto dall'archivio. –

51

Si potrebbe voler controllare makeself.sh

Dalle note degli autori.

makeself.sh è un piccolo script di shell che genera un archivio tar.gz auto-estraibili da una directory. Il file risultante appare come uno script di shell (molti di quelli hanno un suffisso .run) e può essere lanciato così com'è. L'archivio quindi decomprimerà se stesso in una directory temporanea e verrà eseguito un comando arbitrario facoltativo (ad esempio uno script di installazione).

Gli archivi includono anche i checksum per l'autovalutazione dell'integrità (checksum CRC e/o MD5).

Lo script makeself.sh è utilizzato solo per creare gli archivi da una directory di file. L'archivio risultante è in realtà un archivio TAR compresso (usando gzip, bzip2 o compresso), con un piccolo stub di shell all'inizio. Questo piccolo stub esegue tutti i passaggi necessari per estrarre i file, eseguire il comando incorporato e rimuovere i file temporanei quando è tutto finito. Tutto ciò che l'utente deve fare per installare il software contenuto in tale archivio è "eseguire" l'archivio [che esegue lo script]

Sto cercando di mantenere il codice di questo script il più portabile possibile, vale a dire non fa affidamento su funzioni bash specifiche e chiama solo i comandi che sono installati su qualsiasi sistema compatibile UNIX funzionante. Questo script e gli archivi che genera devono essere eseguiti su qualsiasi gusto Unix, con qualsiasi shell Bourne compatibile, a condizione che i programmi di compressione siano disponibili.

Infine, il pacchetto makeself si presenta come uno script autoestraente chiamato makeself.run.

+0

Fantastico, c'è persino un pacchetto nel repository di Ubuntu! sudo apt-get install fa – weekens

4

GNU sharutils:

http://www.gnu.org/software/sharutils/

é uno strumento per la creazione di archivi shell, e fornisce alcune caratteristiche aggiuntive che possono essere utili (come checksum per assicurare che il carico utile non è danneggiato in transito).

La protezione contro le modifiche dannose non è realmente fattibile quando il prodotto finale deve essere interpretabile dalla shell - chiunque abbia compreso la tecnica di generazione potrebbe modificare anche il checksum.

0

Esistono anche altri programmi di installazione del software di installazione/commerciale (come InstallAnywhere) che hanno fondamentalmente una propria versione di shar/makeelf.

Netbeans ha il proprio motore di installazione, e parte di esso, che fa il disimballaggio e il lancio è fatto nel NBI nativo componente launcher: http://wiki.netbeans.org/NBINativeLaunchers

crea un archivio di shell (copione) per Linux/Unix/MacOS e eseguibile nativo per Windows. Puoi usare quello strumento anche per i tuoi progetti.

Problemi correlati