CyberAlberto

Mi rincón personal en internet

Compresor que genera ficheros autoextraíbles

Es una idea que siempre me ha rondado por la cabeza, hasta que he decidido desarrollarla. Quería tener un fichero comprimido con las instrucciones en su interior para descomprimirse a sí mismo.

Los ficheros generados por esta utilidad contienen un shell script en su cabecera que contiene las instrucciones para descomprimirse. La sobrecarga que produce es de poco más de medio Kbyte, por lo que no supone ningún inconveniente. Se ha probado en Mac OS X, Linux y CygWin, por lo que seguramente funcione en el resto de sabores UNIX (o lo que es lo mismo: en cualquier sistema operativo distinto de Windows). Para que funcione en Windows es necesario instalar CygWin.

Se necesitará tener instalados los siguientes ejecutables en el sistema: bash, tar, gzip, bzip2, cat, wc, tail, chmod, rm, mv. md5 y mkdir. Esto normalmente no supone ningun problema, debido a que son comandos estándar en cualquier distribución.

La sintáxis es la siguiente:

comprime nombre_de_archivo [formato_de_compresión]
  • nombre_de_archivo: es el nombre de archivo a generar junto con su ruta
  • formato_de_compresión: puede ser b (bzip2) o g (gzip)

Por ejemplo:

cd /home/user/documents
comprime ~/fichero g

Crea el archivo ejecutable ~/fichero.tgz.sfx que contiene el directorio /home/user/documents comprimido mediante gzip

A la hora de descomprimir el fichero generado, se ha incluido código hash md5, para saber si ha sido alterado el fichero comprimido.

El código es el siguiente:

#!/bin/bash

if [ "$2" = "g" ]; then
	compresor="z"
	extension="tgz"
else
	if [ "$2" = "b" ]; then
		compresor="j"
		extension="tbz"
	else
		if [ "$2" = "" ]; then
			compresor="j"
			extension="tbz"
		else
			echo "ERROR: \"$2\" is an invalid format, choose g (gzip) or b (bzip2)."
			exit -1
		fi
	fi
fi

if [ $1 ] ; then
	tar cvf$compresor /tmp/compressed .
	SIZE=$(cat /tmp/compressed | wc -c)
	SALIDA="$1.$extension.sfx"
	echo "#!/bin/bash" >/tmp/comp.sfx
	echo "">>/tmp/comp.sfx
	echo "SIZE=\"$SIZE\"">>/tmp/comp.sfx
	echo "compresor=\"$compresor\"">>/tmp/comp.sfx
	echo "extension=\"$extension\"">>/tmp/comp.sfx
	echo "fecha=\"$(date)\"">>/tmp/comp.sfx
	echo "mdf=\"$(cat /tmp/compressed | md5)\"">>/tmp/comp.sfx
	cat "$0" | tail -35 >>/tmp/comp.sfx
	cat /tmp/compressed >>/tmp/comp.sfx
	chmod 755 /tmp/comp.sfx
	rm /tmp/compressed
	mv /tmp/comp.sfx "$SALIDA"
	echo
	echo The file $SALIDA has been created.
	exit 0
fi

echo
echo SYNTAX: $(basename $0) filename [format]
echo 
echo WHERE:
echo "        filename --> The desired name and path"
echo "        format   --> g (gzip) or b (bzip2)"
echo
echo $(basename $0) compresses the current directory as a self-extracting file.
echo 
echo
exit 1

# --------------------------------------------------------

if [ -f "$0" ] ; then
	DIRECTORIO=$(basename $(basename "$0" .sfx) .$extension)
	
	if [ -d "$DIRECTORIO" ] ; then
		echo
		echo "ERROR: The directory named \"./$DIRECTORIO\" exists"
		exit -1
	else
		echo "This file was packed on $fecha."
		echo
		while true
			do
			echo -n "Do you want to unpack the file named \"$0\" in the folder \"$DIRECTORIO\"? "
			read CONFIRM
			case $CONFIRM in
				y|Y|yes|yeS|yEs|yES|Yes|YeS|YEs|YES) break ;;
				n|N|no|NO|No|nO) exit  ;;
			*) echo -n "(yes or no) "
			esac
		done
		mkdir "$DIRECTORIO"
		mdfc=\"$(tail -c $SIZE "$0" | md5)\"
		echo
		echo "MD5 Stored:     \"$mdf\""
		echo "MD5 Calculated: $mdfc"
		tail -c $SIZE "$0" | tar -x$compresor -C
		echo
		echo "File \"$0\" unpacked."
		exit 0
	fi
fi

echo ERROR!
exit -1

Puede ser descargado desde Sourceforge.

Anuncios

Viernes, 7 mayo 2010 - Posted by | Personal, Script bash

Sorry, the comment form is closed at this time.

A %d blogueros les gusta esto: