|
14 years ago 0 |
En la entrada que hablamos sobre el compresor que genera ficheros autoextraibles, explicamos la manera de generar dichos ficheros mediante un script de shell.
A este tipo de ficheros podemos añadir una nueva característica: encriptación asimétrica. La criptografía asimétrica es el método criptográfico que usa un par de claves para el almacenamiento o envío de información: una denominada pública y otra privada. La clave pública se puede entregar a cualquier persona y la privada debe mantenerse en secreto, de modo que con este método se encripta con la clave pública y se desencripta con la privada. Uno de los programas que se encarga de esta tarea es el denominado GNU Privacy Guard (GPG), pero existen otros, por ejemplo: DSA, PGP, SSH, SSL y TLS.
El objetivo del script de shell es simplificar las opciones a utilizar y generar ficheros comprimidos, encriptados y auto-extraibles, de modo que se facilite su uso. Para ello partimos del código explicado en la entrada mencionada.
Primero, dado que el número de opciones ha aumentado, es necesario tratar los parámetros de entrada de manera más cuidadosa. Se va a definir las siguientes opciones:
| Opción | Parámetro | Descripción |
| -f | filename | Indica el nombre base del fichero de salida y su path. |
| -g | Indica que se utilice compresión gzip. | |
| -b | Indica que se utilice compresión bzip2 (es la opción por defecto). | |
| -k | Indica que debe encriptarse el fichero de salida. | |
| -h | Muestra las opciones | |
| -v | Muestra la versión del programa y la licencia |
Como se observa, se ha definido los parámetros como los estándares de UNIX: opciones de una sola letra con un guión delante.
Para hacer el análisis de los parámetros de entrada, se utiliza el siguiente bucle:
# Parse the parameters
while getopts ":bf:ghkv" flag
do
chooseOptions $flag "$OPTARG"
done
Donde la función chooseOptions recibe cada parámetro y asigna las variables necesarias antes de la compresión:
# function name: chooseOptions, the function shows by screen the version of the program
# parameters: - the valid option (b, f, g, h, k, or v)
# - the parameter needed, for instance "f" needs the filename
function chooseOptions {
if [ "$1" = "g" ]; then
compresor="z"
extension="tgz"
else
if [ "$1" = "b" ]; then
compressorByDefault
else
if [ "$1" = "k" ]; then
encriptar="si"
else
if [ "$1" = "f" ]; then
filename="$2"
else
if [ "$1" = "h" ]; then
syntax
else
if [ "$1" = "v" ]; then
version
else
echo "ERROR: \"$2\" is an invalid option."
echo
exit -1
fi
fi
fi
fi
fi
fi
} # chooseOptions
Si todo es correcto, el programa llama a la función compress que se encarga de comprimir (y encriptar) el fichero de salida. Es importante señalar que la compresión se hace en la memoria de tal forma que no se generan ficheros intermedios que puedan comprometer información sensible. Primero comprueba si existe el fichero ".exclude" que indica los ficheros que deben ignorarse, por ejemplo, en ciertas circunstancias puede ser interesante ignorar los ficheros que terminen en '~': "*~".
# function name: compress, the main function of the program
# parameters: - the base name
function compress {
compressed=$(mktemp -t XXXXXXXXXXXXXXXX)
encrypted=$(mktemp -t XXXXXXXXXXXXXXXX)
# If .exclude exists, then the program must be work with it
if [ -f ".exclude" ] ; then
excluded=$(mktemp -t XXXXXXXXXXXXXXXX)
echo >$excluded
for i in $( cat .exclude ); do
find . -name "$i" >>$excluded
done
if [ "$encriptar" = si ]; then
rm -f $encrypted
tar cvX$compresor $excluded . | gpg -o $encrypted --encrypt
else
tar cvXf$compresor $excluded $encrypted .
fi
else
if [ "$encriptar" = si ]; then
rm -f $encrypted
tar cv$compresor . | gpg -o $encrypted --encrypt
else
tar cvf$compresor $encrypted .
fi
fi
# The compressed (and encrypted) file has been created
# The last step is to encapsulate all in a self-extracting style bash-script
comp=$(mktemp -t XXXXXXXXXXXXXXXX)
SIZE=$(cat $encrypted | wc -c)
SALIDA="$1.$extension.sfx"
echo "#!/bin/bash" >$comp
echo "">>$comp
echo "SIZE=\"$SIZE\"">>$comp
echo "compresor=\"$compresor\"">>$comp
echo "filename=\"$(basename "$1")\"">>$comp
echo "extension=\"$extension\"">>$comp
echo "fecha=\"$(date)\"">>$comp
echo "mdf=\"$(cat $encrypted | md5)\"">>$comp
if [ "$encriptar" = si ]; then
echo "encriptado=\"$encriptar\"">>$comp
echo "adjetive=\" encrypted\"">>$comp
fi
# Take care!, the parameter in tail indicates the start of
# the second part of the script, do not modify unless you
# know what you do.
cat "$0" | tail -39 >>$comp
cat $encrypted >>$comp
chmod 755 $comp
# Delete temporary files
rm -f $compressed
rm -f $excluded
rm -f $encrypted
mv $comp "$SALIDA"
echo
echo The file $SALIDA has been created.
echo
} # compress
Para ver el código completo y descargarlo, puede dirigirse a la página oficial, alojada en SourceForge.