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]$
Временната директория изглежда по следният начин /tmp/selfextract.Hc9059/ .
Източник: Основен