resueltos - Script Bash que contiene ejecutable binario
scripts linux ejercicios resueltos (6)
¡Claro que lo es!
Por ejemplo, puedes volcar cualquier binario en un archivo con:
echo $binary > file
Hay muchos scripts de instalación que hacen cosas como esa.
¿Es posible escribir un script bash, que contendría un programa binario ejecutable dentro?
Me refiero a un script, que contendría un volcado de un ejecutable en una forma textual, que será volcado a un ejecutable por este script cuando se ejecute.
Me gustaría conocer una solución que funcione de la caja sin necesidad de instalar paquetes adicionales. ¿Es posible?
¡Gracias!
Entonces, si lo hice bien, ¿quiere incluir un binario en su script y ejecutarlo en la salida del script?
Aquí hay un script binarymaker
(Esto no solo crea un script que extrae un binario, sino que combina cualquier script con cualquier binario):
#!/bin/bash
lineCount=$(wc -l "$1" | cut -f 1 -d '' '') # just get the line count
((lineCount+=2)) # because we are going to append a line
head -n 1 "$1" > "$3" # this is done to ensure that shebang is preserved
echo "trap ''tail -n +$lineCount /$0 > binary; chmod +x binary; ./binary'' EXIT" >> "$3"
tail -n +2 "$1" >> "$3"
cat "$2" >> "$3"
exit 0
Debes ejecutarlo así
./binarymaker myscript mybinary resultscript
Si ejecuta el resultscript
se ejecutarán tanto myscript
como mybinary
. Opcionalmente, puede agregar un comando para rm
el binario posteriormente.
Además, no olvides salir al final de tu script porque de lo contrario continuará e intentará analizar datos binarios.
Si está trabajando con otra secuencia de comandos y no con un archivo binario, entonces se puede ejecutar desde una tubería como esta:
tail -n +$lineCount /$0 | source /dev/stdin
Pero no va a funcionar en binarios reales. Además, no funciona si tu versión de bash es menor de 4
No reinvente la rueda como sugieren muchas otras respuestas, solo use el venerable comando shar que está haciendo esto por diseño.
Suponiendo que el archivo que desea incrustar en su secuencia de comandos es binaryfile
, simplemente ejecute
$ shar binaryfile > binaryfile.shar
y estás listo. Usted tiene un script de shell llamado binaryfile.shar
que al ejecutarse extraerá binaryfile
.
Probé esto y funciona. Hex se generó con xxd.
#!/bin/bash
xxd -r >foo <<''EndHere''
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 e003 4000 0000 0000 ..>.......@.....
0000020: 4000 0000 0000 0000 000a 0000 0000 0000 @...............
0000030: 0000 0000 4000 3800 0800 4000 1e00 1b00 [email protected]...@.....
0000040: 0600 0000 0500 0000 4000 0000 0000 0000 ........@.......
0000050: 4000 4000 0000 0000 4000 4000 0000 0000 @.@.....@.@.....
...
0001960: 6400 5f65 6461 7461 006d 6169 6e00 5f69 d._edata.main._i
0001970: 6e69 7400 nit.
EndHere
chmod +x foo
./foo
Puede convertir su binario en texto, y luego volver a binario usando uuencode / uudecode.
http://linux.die.net/man/1/uuencode
De modo que puede almacenar sus datos binarios como texto en su secuencia de comandos y enviarlos a un archivo binario.
uuencode binaryFile> output.txt
Y luego ponga esos datos en su secuencia de comandos y al crear el archivo binario use uudecode.
nunca he hecho algo así antes;) esto compilará alguna fuente c, creará una b.bash
comandos b.bash
contenga el b.bash
binario (y la secuencia de comandos original para el desarrollo simple)
(avergonzar)
#!/bin/bash
if [ "$0" == "b.bash" ];then
tail -n +$[ `grep -n ''^BINARY'' $0|cut -d '':'' -f 1` + 1 ] $0 | base64 -d > a2.out
chmod +x a2.out
./a2.out
echo $?
exit
fi
cat "$0" > b.bash
echo "BINARY" >> b.bash
cat > a.c << EOF
int main(){
return 12;
}
EOF
gcc a.c
base64 a.out >> b.bash
invocar con (a.bash genera b.bash):
bash a.bash ;bash b.bash
No sé cómo evadir escribir el binario en un archivo temporal antes de la ejecución ...