bash脚本如何在不使用uudecode的情况下写出二进制文件?

Jer*_*ner 6 binary bash scripting uudecode

我在这里为bash脚本专家提供了一些小问题...我有一个bash脚本,需要在运行时创建一个小的(80字节)二进制文件.文件的内容需要包含在脚本本身内(即我不想只是将文件与脚本一起打包).

我的脚本目前这样做:

echo 'begin-base64 644 dummy.wav' > /tmp/dummy.uu
echo 'UklGRkgAAABXQVZFZm10IBAAAAADAAEAAHcBAADcBQAEACAAZmFjdAQAAAAAAAAAUEVBSxAAAAAB' >> /tmp/dummy.uu
echo 'AAAAQDYlTAAAAAAAAAAAZGF0YQAAAAA=' >> /tmp/dummy.uu
echo '====' >> /tmp/dummy.uu
uudecode -o /tmp/dummy.wav /tmp/dummy.uu
rm /tmp/dummy.uu
Run Code Online (Sandbox Code Playgroud)

...在上面的运行之后,我有我的文件/tmp/dummy.wav.但我刚刚发现这个脚本运行的计算机没有安装uudecode(我不允许安装它),所以我需要找到一些其他的方法来创建这个文件.有任何想法吗?

nin*_*alj 6

一些安装程序执行类似于此的操作:

#!/bin/bash
tail -n +4 $0 | tar xvzf -
exit
<tgz file appended here><newline>
Run Code Online (Sandbox Code Playgroud)


Dan*_*tin 6

如果目标计算机perl可用:

perl -ne 'print unpack("u",$_)' > dummy.wav <<EOD
M4DE&1D@```!7059%9FUT(!`````#``$``'<!``#<!0`$`"``9F%C=`0`````
C````4$5!2Q`````!````0#8E3```````````9&%T80``````
EOD
Run Code Online (Sandbox Code Playgroud)

这是使用你uuencode dummy.wav < dummy.wav在原始计算机上做的非base64格式.

如果做不到这一点,你可以随时这样做:

echo -ne '\x52\x49\x46\x46\x48\x00\x00\x00'  > dummy.wav
echo -ne '\x57\x41\x56\x45\x66\x6d\x74\x20' >> dummy.wav
echo -ne '\x10\x00\x00\x00\x03\x00\x01\x00' >> dummy.wav
echo -ne '\x00\x77\x01\x00\x00\xdc\x05\x00' >> dummy.wav
echo -ne '\x04\x00\x20\x00\x66\x61\x63\x74' >> dummy.wav
echo -ne '\x04\x00\x00\x00\x00\x00\x00\x00' >> dummy.wav
echo -ne '\x50\x45\x41\x4b\x10\x00\x00\x00' >> dummy.wav
echo -ne '\x01\x00\x00\x00\x40\x36\x25\x4c' >> dummy.wav
echo -ne '\x00\x00\x00\x00\x00\x00\x00\x00' >> dummy.wav
echo -ne '\x64\x61\x74\x61\x00\x00\x00\x00' >> dummy.wav
Run Code Online (Sandbox Code Playgroud)

这一点bash是通过以下方式生成的:

$ hexdump -e '"echo -ne '\''" 8/1 "x%02x" "'\'' >> dummy.wav\n"' dummy.wav | sed 's;x;\\x;g;1s/>/ /'
Run Code Online (Sandbox Code Playgroud)

编辑添加:正如在这里的回复中所指出的,这样的事情也是可能的:

xargs -d'\n' -n1 echo -ne > dummy.wav <<EOD
\x52\x49\x46\x46\x48\x00\x00\x00\x57\x41\x56\x45\x66\x6d\x74\x20
\x10\x00\x00\x00\x03\x00\x01\x00\x00\x77\x01\x00\x00\xdc\x05\x00
\x04\x00\x20\x00\x66\x61\x63\x74\x04\x00\x00\x00\x00\x00\x00\x00
\x50\x45\x41\x4b\x10\x00\x00\x00\x01\x00\x00\x00\x40\x36\x25\x4c
\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61\x00\x00\x00\x00
EOD
Run Code Online (Sandbox Code Playgroud)

(这个-d论点对于关闭xargs自己的反斜杠处理非常重要)

您也可以将8/1我的hexdump命令转换为80/1一条长echo行.