Script autoextraíble
Intentando enviar un archivo zip con ejecutables dentro por gmail, se me ocurrió un sistema para hacer un script autoextraíble. He visto algunos por ahí pero el código que meten es bastante feo y grande, y yo quería algo sencillo para un sólo uso.
La idea es colocar el archivo a extraer a continuación del “exit” del script, y hacer que el script lo saque a otro archivo. Para sacarlo, utiliza dd, el origen es el propio archivo y el destino es el archivo incrustado. Se saltan tantos bytes como ocupe la parte “ejecutable” del script a la hora de sacar la información.
El código del script es sencillo:
#!/bin/bash
dd if=$0 of=nombreIncrustado bs=1 skip=$(( `grep -a -b -x exit $0 | cut -f1 -d:` + 5 )) 2> /dev/null
exit
Lo más complicado sería tal vez el grep: La opción a evita que salga lo de “Coincidencia en archivo binario”, la -b hace que el valor devuelto sea el offset en bytes hasta el principio del match y la x hace que sólo casen líneas completas. De lo que nos devuelve el grep nos quedamos con la primera columna, que es el offset y le sumamos 5 (4 bytes de longitud del exit y 1 más para el final de línea).
Luego simplemente nos saltamos esa cantidad de bloques al hacer la copia y así sacamos todo lo que está después del exit a otro archivo.
Para incrustar el binario dentro del script, simplemente hacemos
#> cat script.sh binario > script.run
Con darle permisos de ejecución ya tenemos un script autoextraíble, que, por cierto, el gmail y demás correos onlines no detecta como archivo peligroso ;)
Saludos y suerte