Bash script containing binary executable Bash script containing binary executable unix unix

Bash script containing binary executable


i never done something like this before ;)this will compile some c source, create a b.bash script containing the binary (and the original script for simple development)

(a.bash)

#!/bin/bashif [ "$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 $?  exitficat "$0" > b.bashecho "BINARY" >> b.bashcat > a.c << EOFint     main(){        return 12;}EOFgcc a.c base64 a.out >> b.bash

invoke with (a.bash generates b.bash):

bash a.bash ;bash b.bash

i don't know how to evade writing out the binary into a temporary file before execution...


Don't reinvent the wheel like several other answers are suggesting, just use the venerable shar command which is precisely doing this by design.

Assuming the file you want to embed in your script is binaryfile, simply run

$ shar binaryfile > binaryfile.shar

and you are set. You have a shell script named binaryfile.shar which when executed will extract binaryfile.


I tried this out and it works. Hex was generated with xxd.

#!/bin/bashxxd -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  ....@.8...@.....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._i0001970: 6e69 7400                                nit.EndHerechmod +x foo./foo