Выполнить содержимое двоичного файла из канала

Короче говоря, как запустить сжатый сценарий bash?, но можно ли это сделать с помощью двоичного файла вместо сценария оболочки?


Предположим, у меня есть двоичный файл, который сжимается в.gz. Я могу разархивировать в трубу и проверить содержимое таким образом:

$ gzip -d --stdout hello.gz | файл -
/dev/stdin: исполняемый 64-разрядный LSB ELF, 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

$ 

Есть ли способ выполнить содержимое канала без создания фактического файла?

1 ответ

Решение

Я считаю, что ответ - нет.

Вы можете выполнить файл вручную, передав его загрузчику Linux, который будет называться как /lib/ld-linux.so, * Это требует фактического файла, хотя. Он не может выполнить канал или стандартный ввод; это должно быть в состоянии 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 ,

Другие вопросы по тегам