Cамораспаковывающийся архив


firex - Posted on 03 Ноябрь 2008

Привожу заготовку для скрипта который содержит в себе архив.

#!/bin/sh
sed -e '1,/^END_OF_SCRIPT$/d' $0 | base64 -d | tar -xj
exit
END_OF_SCRIPT

после слова "END_OF_SCRIPT" можно запулять какой нибудь tar.bz2 архивчег. например так

$ cat myrch.tar.bz2 | base64 >> scriptname.sh

в зависимости от того какой архив и как вы его туда запулили меняется также и комманды распаковки.
авторство скрипта пренадлежит ramok

0
Ваша оценка: Ничего

Возможно, я что-то делаю не так, но у меня скрипт нормально заработал только в таком виде:

#!/bin/sh
exec sed -e '1,/^END_OF_SCRIPT$/d' $0 |base64 -d|tar -xjf -
exit
END_OF_SCRIPT
QlpoOTFBWSZTWZaZXhcAG6j//////////////////////////8/v/e/9bf33d91u/3//4CEfAGgA
.....

все верно. если tar берет архив из стандартного потока то флаг -f можно не указывать, и не нужно ставить -. если указывать -f то вместо имени файла нужно -

PS
и вообще тут можно обойтись без base64. конечно не кошерно когда в скрипте будет двоичный файл, но например инсталятор от nvidia так и делает

Без exit перед END_OF_SCRIPT и тоже не обойтись -- ругается на много неизвестных команд
Видимо, exec перед командой и предназначался для того, чтобы заместить текущий шелл и прекратить работу скрипта на этой команде, однако на практике этого не происходит, поскольку exec относится только к первой команде (sed -e '1,/^END_OF_SCRIPT$/d' $0). Например, в результате выполнения скрипта:

#!/bin/bash
exec echo 1
echo a

будет показано только число 1, а следующий скрипт:

#!/bin/bash
exec echo 1|sed s/1/2/
echo a

покажет две строки: "2" и "a".

Обойти такое поведение не получится, поскольку exec не позволяет использовать пайпы в команде, поэтому лучше не заморачиваться с one-liner'ами, а добавить exit для нормального выхода перед строками, не предназначающимися для выполнения.

да ты прав
я подправил как надо

О! сспасиб огромное! давно, ну не то чтобы искал, но очень хотел знать как это делается.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.