11

.tar.gzまず、私はすでにグーグルで検索しましたが、圧縮ファイル(たとえば)がシェルスクリプトに埋め込まれている例しか見つかりませんでした。

基本的に、文字列を出力するCプログラム( )がある場合は、 Hello World!hello.cと言います。。

実行可能なバイナリを取得するためにコンパイルします

gcc hello.c -o hello

今、私はシェルスクリプトを持っていますtestEmbed.sh

私が求めているのは、シェルスクリプト内にバイナリ( hello )を埋め込んで、実行時に実行できるかどうかです。

./testEmbed.sh

バイナリを実行してHelloWorld !を出力します。

明確化:1つの代替方法は、実行可能ファイルをアーカイブに圧縮し、スクリプトの実行時にそれを抽出することです。私が求めているのは、それなしでプログラムを実行できるかどうかです。

今まで、私はここで方法を試していました。しかし、それは私にはうまくいきません。著者は別のアーキテクチャで他のディストリビューションを使用していたと思います。だから、基本的にこれは私にとってはうまくいきませんでした。:P

また、CプログラムのワークフローがJavaと異なる場合は、jarそれも知りたいです。

4

3 に答える 3

18

はい、これは可能です。実際には、リンクされた記事と概念が非常に似ています。秘訣はuuencode、バイナリをテキスト形式にエンコードしてから、スクリプトの最後に追加することです。

次に、スクリプトは、uudecodeそれ自体で実行されてバイナリファイルを作成し、アクセス許可を変更してから実行するように記述されます。

uuencodeもともとは、uudecodeインターネットの前身でバイナリコンテンツをシフトするために作成されたもので、バイナリ情報をうまく処理できませんでした。テキストへの変換は、シェルスクリプトとしても出荷できることを意味します。何らかの理由で、実行しようとしたときにディストリビューションに不満がある場合はuuencode、おそらくそれをインストールする必要があることを意味します。たとえば、DebianSqueezeでは次のようになります。

sudo aptitude install sharutils

関連する実行可能ファイルを取得します。これが私が経験したプロセスです。まず、Cプログラムを作成してコンパイルしますhello.c

pax> cat hello.c

#include <stdio.h>
int main (void) {
    printf ("Hello\n");
    return 0;
}

pax> gcc -o hello hello.c

testEmbed.sh次に、それ自体をデコードするシェルスクリプトを作成します。

pax> cat testEmbed.sh

#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit

最初のrmステートメントは、hello実行可能ファイルがこのスクリプトによって新たに作成されており、コンパイルからぶら下がっていないことを示しています。ファイルにもペイロードが必要なので、エンコードされた実行可能ファイルをファイルの最後に添付します。

pax> uuencode hello hello >>testEmbed.sh

その後、スクリプトを実行するtestEmbed.shと、実行可能ファイルが抽出されて実行されます。

これが機能する理由は、入力(および)で、によって配置されuudecodeた特定のマーカー行を検索するためです。したがって、スクリプト全体ではなく、エンコードされたプログラムのみをデコードしようとします。beginenduuencode

pax> cat testEmbed.sh

#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit

begin 755 hello
M?T5,1@$!`0````````````(``P`!````$(,$"#0```#`!@```````#0`(``'
M`"@`'@`;``8````T````-(`$"#2`!`C@````X`````4````$`````P```!0!
: : :
M:&%N9&QE`%]?1%1/4E]%3D1?7P!?7VQI8F-?8W-U7VEN:70`7U]B<W-?<W1A
M<G0`7V5N9`!P=71S0$!'3$E"0U\R+C``7V5D871A`%]?:38X-BYG971?<&-?
4=&AU;FLN8G@`;6%I;@!?:6YI=```
`
end

プログラムがターゲットシステムに存在しない共有ライブラリを必要とする可能性など、おそらく心配する必要がある他のことがありますが、上記のプロセスは基本的に必要なものです。


JARファイルのプロセスは、実行方法が異なることを除いて、非常に似ています。それはまだ単一のファイルですが、次の行を置き換える必要があります。

./hello

次のようなJARファイルを実行できるものを使用します。

java -jar hello.jar
于 2012-05-08T02:25:08.597 に答える
5

私はあなたが説明しているのはmakeselfだと思います。

于 2012-05-08T02:31:35.820 に答える
2

これを行うための移植可能な方法は、printfコマンドと8進数のエスケープを使用することです。

printf '\001\002\003'

バイト1、2、および3を出力します。おそらくすべてを手作業で書きたくないので、od -bコマンドを使用してファイルのオクタルダンプを生成し、sedスクリプトを使用してジャンクを取り除きます。右の円記号を配置します。

于 2012-05-08T02:45:34.213 に答える