私は実行可能なバイナリをスクリプトに直接リンクする方法を探しています。このような:
#!/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つだけ必要です。他の人はいません。バイナリをスクリプトに追加する前に。また、スクリプトを添付して編集する場合は、テキストエディタを慎重に選択する必要があります。テキストエディタは、スクリプトを保存するときに一部の文字を変更できます。
メモ:スクリプトに直接追加することもできますが、">>"を追加するのではなく、リダイレクト">"を追加するとスクリプトが上書きされます。