Выполнить содержимое двоичного файла из канала
Короче говоря, как запустить сжатый сценарий 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
,