9

要するに、bash 圧縮スクリプトを実行する方法は? 、しかし、これはシェルスクリプトの代わりにバイナリで行うことができますか?


.gz に圧縮されたバイナリがあるとします。パイプに解凍して、次のように内容を調べることができます。

$ gzip -d --stdout hello.gz | ファイル -
/dev/stdin: ELF 64 ビット LSB 実行可能ファイル、AMD x86-64、バージョン 1 (SYSV)、動的にリンク (共有ライブラリを使用)、ストリップされていない
$

この出力をコマンドにパイプする代わりに、パイプ自体の内容をファイルに書き込まずに実際に実行できる方法はありますか?

名前付きパイプの使用を検討しましたが、これはうまくいかないようです:

$ mkfifo execpipe
$ chmod 777 execpipe
$ gzip -d --stdout hello.gz > execpipe &
[3] 30034
$ ./execpipe
bash: ./execpipe: 権限が拒否されました
$ [3]+ 壊れたパイプ gzip -d --stdout hello.gz >execpipe

$

実際のファイルを作成せずにパイプの内容を実行する方法はありますか?

4

1 に答える 1

8

答えはノーだと思います。

のような名前のLinux ローダーにファイルを渡すことで、ファイルを手動で実行できます/lib/ld-linux.soただし、実際のファイルが必要です。パイプまたは stdin を実行することはできません。ファイルにアクセスできる必要がmmap()あります。

$ /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /bin/true
$ /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 - < /bin/true
-: error while loading shared libraries: -: cannot open shared object file: No such file or directory
$ /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 <(cat /bin/true)
/dev/fd/63: error while loading shared libraries: /dev/fd/63: invalid ELF header

* 私の Red Hat マシンでは/lib/ld-linux.so.2(32 ビット) または/lib64/ld-linux-x86-64.so.2(64 ビット) です。私のUbuntuマシンでは/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2.

于 2013-11-12T00:37:26.997 に答える