実行可能バイナリをスクリプトにハードワイヤードする方法を探しています。このようなもの:
#!/bin/bash
...some Shell code
execute binary:
>>>
binary
code
...
<<<
...some more Shell code possibly
私は この解決策 を見つけました。これはuuencode
を使用し、優れています。しかし、それはshrutils
に依存します。これは、私のDebianにはデフォルトで含まれていないため、追加のようです。
バイナリをbase64
でエンコードしてからデコードし、なんらかの方法で実行することを考えていました。おそらく、一時ファイルを作成する必要はありません。物事を実行する責任があるライブラリがあったことを覚えていますが、それが何であったかを忘れていました。
これを実行するのと同じくらい単純な構成にするのが最良の場合があります。
$ <(base64 out | base64 -d)
bash: /dev/fd/63: Permission denied
どうですか:
_unpack() {
tail +9 "$0" > /tmp/xxx.$$
chmod +x /tmp/xxx.$$
}
unpack
/tmp/xxx.$$ <add args here>
rm /tmp/xxx.$$
exit
<add the binary here>
_
スクリプトにバイナリデータを含めたくない場合は、それをエンコードして、cat
を関連するデコーダーに置き換えることができます。
スクリプトを異なる長さに変更する場合は、_+9
_をバイナリが始まる行番号に置き換える必要があることに注意してください。
tail
実装が引数_+9
_をサポートしていない場合は、代わりに_-n +9
_を試してください。
既存の/ tmpファイルを破壊することに不安がある場合は、mktemp(1)
を使用してtmpファイル名を作成してください。
このメソッドは、SunPro
コンパイラスイートのアップグレードスクリプトで使用されていました。このスクリプトには、アップグレード全体を含む圧縮tarアーカイブと、その処理を管理するためのシェルコードが含まれていました。
で始まります
aShellScript
aBinaryExecutable
行う
Zip binary.Zip aBinaryExecutable
cat aShellScript binary.Zip > hybrid
chmod +x hybrid
スクリプトに何を入れてバイナリを抽出して実行するかを見逃しましたが、hybrid
は有効なZipファイルであり、有効なシェルスクリプトであることに注意してください。シェルスクリプトはそれ自体を解凍してバイナリを取得できます-実行可能ファイル(シェルスクリプトではありません)。
堅牢:ファイルは有効なZipであり、有効なシェルスクリプトです(最後にガベージを解釈しようとする前に終了する限り)。
スクリプトの終わりは醜いです。
Shell
は、ファイルの先頭から解釈を開始します。 (すべてのオフセットはシンボリックです。)Zip
はファイルの終わりから解釈を開始します。すべてのオフセットは相対的です。