利点

利点

私は実行可能なバイナリをスクリプトに直接リンクする方法を探しています。このような:

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

答え1

どうですか?

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)

SunProこの方法は、フルアップグレードを含む圧縮されたtarアーカイブと、アップグレード関連の処理を管理するためのいくつかのシェルコードを含むコンパイラスイートのアップグレードスクリプトで使用されます。

答え2

から始まる

aShellScript aBinaryExecutable

する

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

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

利点

堅牢性:ファイルは有効なzipと有効なシェルスクリプトです(最後にゴミを解釈する前に終了する限り)。

ダメージ

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

なぜ働くか。

  • shell説明はファイルの先頭から始まります。 (すべてのオフセットは象徴的です。)
  • zip説明は文書の終わりから始まります。すべてのオフセットは相対的です。

答え3

スクリプトの最後にマークアップタグを追加します。 「ONLY_BINARY_AFTER_THIS_POINT:」が私のタグであるとしましょう。スクリプトには次の行を含めることができます。

#!/usr/bin/env bash
# my_script.sh


# find the line number where my tag is in this file
line_number=$(grep -na -m1 "^ONLY_BINARY_AFTER_THIS_POINT:$" "$0"|cut -d':' -f1)
# next line is where contents of my binary file starts, use mathematical expansion to increase it by 1
$((line_number+=1))
# dump everything after $line_number of this script into somewhere I can access
tail -n +"${line_number}" "$0" > /tmp/my_binary_file.bin
# do further processing on /tmp/my_binary_file.bin


# don't forget the new line here and don't type in anything after this point
#                            ↓
ONLY_BINARY_AFTER_THIS_POINT:

その後、スクリプトにバイナリを追加できます。

cat my_script.sh my_binary_file.bin > my_appended_script.sh

重要なのは、新しい行が1つだけ必要です。他の人はいません。バイナリをスクリプトに追加する前に。また、スクリプトを添付して編集する場合は、テキストエディタを慎重に選択する必要があります。テキストエディタは、スクリプトを保存するときに一部の文字を変更できます。

メモ:スクリプトに直接追加することもできますが、">>"を追加するのではなく、リダイレクト">"を追加するとスクリプトが上書きされます。

関連情報