Я написал для этого сценарий. Это должно помочь: использование
#!/bin/bash
set -e
payload=$(cat $0 | grep --binary-files=text -n ^PAYLOAD: | cut -d: -f1)
filaname=`head $0 -n $payload | tail -n 1 | cut -d: -f2-`
tail -n +$(($payload + 1)) $0 > /tmp/$filaname
set +e
#Do whatever with the payload
exit 0
#Command to add payload:
#read x; ls $x && (cp 'binary_script.sh' ${x}_binary_script.sh; echo $x >> ${x}_binary_script.sh; cat $x >> ${x}_binary_script.sh )
#Note: Strictly NO any character after "PAYLOAD:", not even newline...
PAYLOAD:
Пример:
Пусть myNestedScript.sh
содержит ниже данных:
#!/bin/bash
echo hello world
Затем запустите
x=myNestedScript.sh; ls $x && (cp 'binary_script.sh' ${x}_binary_script.sh; echo $x >> ${x}_binary_script.sh; cat $x >> ${x}_binary_script.sh )
Он будет генерировать ниже файл, который вы можете непосредственно выполнить. После выполнения ниже файла он извлечет myNestedScript.sh
в /tmp
& запустит этот скрипт.
#!/bin/bash
set -e
payload=$(cat $0 | grep --binary-files=text -n ^PAYLOAD: | cut -d: -f1)
filaname=`head $0 -n $payload | tail -n 1 | cut -d: -f2-`
tail -n +$(($payload + 1)) $0 > /tmp/$filaname
set +e
chmod 755 /tmp/$filaname
/tmp/$filaname
exit 0
PAYLOAD:myNestedScript.sh
#!/bin/bash
echo hello world
Что вы подразумеваете под автозапуском? Можете ли вы просто поместить вызов в программу в скрипт, что с этим не так? –
Я хочу программную часть скрипта, потому что мне нужен только один файл. На самом деле это проблема: у меня есть сжатая программа xz, и я хочу иметь возможность запускать ее без какого-либо вмешательства программы xz пользователем (просто './Theprogram'). – phaazon
Если вы имеете в виду, можете ли вы создать архив, который извлекает себя и выполняет что-то из содержимого, да, конечно. Сценарий, выполняющий извлечение, удаляет встроенный исполняемый файл после его извлечения: 'exec yourexecutable' (exec заменит текущий процесс - извлечение скрипта - исполняемым файлом). –
William