是否有可能编写一个bash脚本,其中将包含一个二进制可执行程序?
我的意思是一个脚本,它将包含一个文本forms的可执行文件转储,当它被执行时,这个脚本将被转储回可执行文件。
我很想知道一个解决scheme,它可以开箱即用,无需安装额外的软件包。 可能吗?
谢谢!
我从来没有做过这样的事情);这将编译一些C源代码,创建一个b.bash
脚本包含二进制文件(和简单的开发原始脚本)
(惑)
#!/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 > ac << EOF int main(){ return 12; } EOF gcc ac base64 a.out >> b.bash
用(a.bash生成b.bash)调用:
bash a.bash ;bash b.bash
我不知道如何逃避写入二进制文件临时文件执行前…
我试了一下,它的工作原理。 Hex是用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 ....@.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._i 0001970: 6e69 7400 nit. EndHere chmod +x foo ./foo
您可以将二进制文件转换为文本,然后使用uuencode / uudecode将其转换为二进制文件。
http://linux.die.net/man/1/uuencode
因此,您可以将二进制数据作为文本存储在脚本中,并将其输出到二进制文件中。
uuencode binaryFile> output.txt
然后把这些数据放到脚本中,当创建二进制文件时使用uudecode。
不要像其他几个答案所建议的那样重新发明轮子,只是使用正是由设计完成的古老的shar命令。
假设你想要在你的脚本中嵌入的文件是binaryfile
,只需运行
$ shar binaryfile > binaryfile.shar
你就定了 你有一个名为binaryfile.shar
的shell脚本,它在执行时会提取binaryfile
。
所以,如果我的理解正确,你想在你的脚本中包含一个二进制文件,并在脚本出口执行它?
这里是一个binarymaker
脚本(这不仅会创建一个提取二进制文件的脚本,而且binarymaker
将您的脚本与任何二进制文件合并):
#!/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
你应该像这样运行
./binarymaker myscript mybinary resultscript
如果你运行resultscript
那么myscript
和mybinary
都将被执行。 之后你可以选择添加一个命令到rm
二进制文件。
另外,不要忘记在脚本结尾处退出 ,否则会继续并尝试解析二进制数据。
如果你正在使用另一个脚本,而不是一个二进制文件,那么它可以像这样从管道执行:
tail -n +$lineCount \$0 | source /dev/stdin
但是它不能用于真正的二进制文件。 另外,如果你的bash版本低于4,它将不起作用
就是这样!
你可以例如转储任何二进制到一个文件中:
echo $binary > file
有许多安装脚本可以做这样的事情。