web-dev-qa-db-ja.com

追加のツールなしで実行可能バイナリをシェルスクリプトに埋め込む方法はありますか?

実行可能バイナリをスクリプトにハードワイヤードする方法を探しています。このようなもの:

#!/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
3
user147505

どうですか:

_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アーカイブと、その処理を管理するためのシェルコードが含まれていました。

2
schily

で始まります

aShellScriptaBinaryExecutable

行う

Zip binary.Zip aBinaryExecutable
cat aShellScript binary.Zip > hybrid
chmod +x hybrid

スクリプトに何を入れてバイナリを抽出して実行するかを見逃しましたが、hybridは有効なZipファイルであり、有効なシェルスクリプトであることに注意してください。シェルスクリプトはそれ自体を解凍してバイナリを取得できます-実行可能ファイル(シェルスクリプトではありません)。

利点

堅牢:ファイルは有効なZipであり、有効なシェルスクリプトです(最後にガベージを解釈しようとする前に終了する限り)。

不利益

スクリプトの終わりは醜いです。

なぜ機能するのか

  • Shellは、ファイルの先頭から解釈を開始します。 (すべてのオフセットはシンボリックです。)
  • Zipはファイルの終わりから解釈を開始します。すべてのオフセットは相対的です。
2
ctrl-alt-delor