Как се прави самодезархивиращ се файл

Тук е обяснено как се инсталират и настройват програми под Linux.

Модератори: Freya, Kulu Ngile

Как се прави самодезархивиращ се файл

Мнениеот Kulu Ngile » Сря 17, Окт, 2007 23:13

Идеята за статията дойде, след като ми се наложи да направя архив на едни скриптове и желанието при дезархивирането да се стартира точно един, определен от мен скрипт. Процедурата е много проста:
1. Създаваме си архив на скриптовете, които искаме да пуснем
2. Създаваме хедър файл, който да управлява архива. В зависимост от това, дали искаме само да се дезархивира, да се дезархивира във временна директория и стартира или да се дезархивира, стартира и да си изтрие директорията след изпълнението, съдържанието е както следва:
- при положение, че искаме само да се дезархивира
Код за потвърждение: Избери целия код
#!/bin/bash
echo ""
echo "Extracting file... please wait"
echo ""
tail -n +8 $0 | tar xz
exit 0

където 8 е реда, от който ще започне да се копира архива. За да се автоматизира и да не смятаме на ръка, срипта трябва да изглежда така
Код за потвърждение: Избери целия код
#!/bin/bash
echo ""
echo "Extracting file... please wait"
echo ""
SKIP=`awk '/^__ARCHIVE__/ { print NR + 1; exit 0; }' $0`
tail -n +$SKIP $0 | tar xz
exit 0
__ARCHIVE__

Като променливата SKIP ще съдържа номера на реда, в който се намира __ARCHIVE__ +1, т.е. да се пейстне под него

- при положение, че искаме да се дезархива в някаква темп директория и да се стартира желаният скрипт
Код за потвърждение: Избери целия код
#!/bin/bash
echo ""
echo "Extracting file... please wait"
echo ""
export WORKDIR=`mktemp -d /tmp/selfextract.XXXXXX`
SKIP=`awk '/^__ARCHIVE__/ { print NR + 1; exit 0; }' $0`
tail -n +$SKIP $0 | tar xz -C $WORKDIR
PREV=`pwd`
cd $WORKDIR
./setup.pl
exit 0
__ARCHIVE__

Така ще се създаде директория selfextract.XXXXXX в /tmp, която ще бъде уникална, т.е. вероятността да съществува ще е много малка, т.е. Х-те ще се заменят с произволни символи. След като се дезархивира ще се стартира файла setup.pl.

- при положение, че искаме след като приключи работата нашият скрипт, да си зачисти временната директория, то скрипта трябва да изглежда така:
Код за потвърждение: Избери целия код
#!/bin/bash
echo ""
echo "Extracting file... please wait"
echo ""
export WORKDIR=`mktemp -d /tmp/selfextract.XXXXXX`
SKIP=`awk '/^__ARCHIVE__/ { print NR + 1; exit 0; }' $0`
tail -n +$SKIP $0 | tar xz -C $WORKDIR
PREV=`pwd`
cd $WORKDIR
./setup.pl
cd $PREV
rm -rf $WRKDIR
exit 0
__ARCHIVE__

3. Създаване на самодезархивиращият се файл
Код за потвърждение: Избери целия код
cat header_file archive.tar.gz >proba.bin


Пример:
1. Създавам скрипта setup.pl, който има следното съдържание
Код за потвърждение: Избери целия код
[gaara@debian Desktop]$ cat setup.pl
#!/usr/bin/perl
print "Hello, ninjas!\n\n:D\n\n";
[gaara@debian Desktop]$

2. Задаваме му права за изпълнение:
Код за потвърждение: Избери целия код
[gaara@debian Desktop]$ chmod a+x setup.pl
[gaara@debian Desktop]$ ls -al setup.pl
-rwxr-xr-x 1 gaara gaara 46 2007-10-18 00:01 setup.pl
[gaara@debian Desktop]$

Тъй като е само пример, моят архив ще съдържа само този файл и целта е след дезархивирането да се изпълни.
3. Създаваме архива
Код за потвърждение: Избери целия код
[gaara@debian Desktop]$ tar cfvz ninja.tar.gz setup.pl
setup.pl
[gaara@debian Desktop]$ ls ninja.tar.gz
ninja.tar.gz
[gaara@debian Desktop]$

4. Създаваме хедър файла.... аз ще ползвам вторият вариант, за да ви покажа директорията, която ще се създаде.
Код за потвърждение: Избери целия код
[gaara@debian Desktop]$ cat header
#!/bin/bash
echo ""
echo "Extracting file... please wait"
echo ""
export WORKDIR=`mktemp -d /tmp/selfextract.XXXXXX`
SKIP=`awk '/^__ARCHIVE__/ { print NR + 1; exit 0; }' $0`
tail -n +$SKIP $0 | tar xz -C $WORKDIR
PREV=`pwd`
cd $WORKDIR
./setup.pl
exit 0
__ARCHIVE__
[gaara@debian Desktop]$

5. Създавеме самодезархивиращият се файл
Код за потвърждение: Избери целия код
[gaara@debian Desktop]$ cat header ninja.tar.gz > ninja.bin
[gaara@debian Desktop]$ ls ninja.bin
ninja.bin
[gaara@debian Desktop]$

6. Стартираме bin файла
Код за потвърждение: Избери целия код
[gaara@debian tmp1]$ ls
ninja.bin
[gaara@debian tmp1]$ sh ninja.bin

Extracting file... please wait

Hello, ninjas!

:D

[gaara@debian tmp1]$

:D :D
Временната директория изглежда по следният начин /tmp/selfextract.Hc9059/ .

Източник: Основен
Ако съдбата е срещу теб, толкова по-зле за нея.

Изображение
APT HOWTO
Kulu Ngile
Унуфри
 
Мнения: 1233
Регистриран на: Съб 04, Мар, 2006 1:04
Местоположение: София

Назад към Инсталиране и работа с приложения

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта

cron