Где я могу найти документацию о помощниках шарма python?

Я, кажется, сталкиваюсь с незначительной проблемой с отличным ответом, предоставленным Эриком Карвалью.

Я создал файл .tar.bz и протестировал его, чтобы я мог его правильно извлечь:

tar xzf MyArchive.tar.bz -C /home/$USERN/Downloads/

Я создал bash header.sfx:

#!/bin/bash

USERN=`whoami`
if [ $(id -u) = "0" ] ; then
       USERN=$SUDO_USER
fi

DATA=`awk '/^__BEGIN_DATA__/ { print NR + 1; exit 0; }' $0`
tail -n+$DATA $0 | tar xz -C /home/$USERN/Downloads/
if [ $? -ne 0 ] ; then 
    exit 1
echo
# Additional installation steps follow

#bash commands here
#the last command calls my main installer script:
bash ./another_bash_script.sh

exit 0 #this is line 125
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__

Я создал самораспаковывающийся файл / установщик оболочки:

cat header.sfx MyArchive.tar.bz > MyInstaller.sh

Я установил разрешения ( а + х). Результаты запуска установщика:

tester@mint15_VirtualBox ~/Downloads $ sudo ./MyInstaller.sh 
./ExampleInstaller.2013.07.01.sh: line 132: syntax error near unexpected token `('
./ExampleInstaller.2013.07.01.sh: line 132: `.����D������V G��c�� ��������Ӭ��ӡ|@��|M�.�/�~��w�O��*��B���l�}Ω�O�.��'

Похоже, что файл MyArchive.tar.bz извлечен правильно, из внешнего вида в извлеченной папке.

Мое первое предположение заключалось в том, что exit 0 игнорируется, но я не уверен, почему это будет так ... Я заметил, что exit 0 находится в строке 125 и ошибка сообщается как строка 132, которая будет частью файла конкатенированного архива.

Следующее, что я пробовал, состоит из следующих изменений в headers.sfx:

первая строка:

#!/bin/bash -xv

последние строки:

exit 0
echo "we should never reach here!"
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__

На этот раз результат выглядит так:

tester@mint15_VirtualBox ~/Downloads $ sudo ./MyInstaller.sh 
#!/bin/bash -xv
USERN=`whoami`
whoami
++whoami
[snip]
exit 0

echo "we should never reach here!"
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__
�#�Q��P\߷&�и����Ƶ��4    и��
                                           ��������Ӭ��ӡ|@��|M�.�/���B���l�}Ω�O�.
./ExampleInstaller.sh: line 134: syntax error near unexpected token `('
./ExampleInstaller.sh: line 134: `.����D���c��

Фактический вывод включает в себя намного больше

Решение:

Первая ошибка, которую я сделал, это то, что я думал, что не должно быть новой строки char в конце последней строки в файле header.sfx. См. Ниже:

# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__

Оказывается, что в конце строки должна быть новая строка __BEGIN_DATA__

. Вторая проблема, которую я обнаружил, заключается в том, что включение отладки bash (например, , set -x) предотвращает работу команд awk / tail / tar.

Эти два изменения заставили меня работать для меня на тестовом примере. (И это было просто одно изменение: исправление моего недоразумения в отношении последних символов новой строки.)

Однако на моем примере с реальной жизнью я столкнулся с дополнительными проблемами. Оказывается, что права доступа к файлам внутри архива имеют значение. В моем архиве был один файл с очень ограниченными разрешениями, и этот файл заставлял весь самораспаковывающийся скрипт bash терпеть неудачу на этапе извлечения. Тем не менее, вручную удалены файлы в файловом менеджере графического интерфейса или в командной строке с использованием tar. Таким образом, самораспаковывающиеся скрипты bash немного более чувствительны к таким вещам, как права на файлы внутри архива (и я не говорю о разрешениях на сам архив).

Кроме того, любой «конечный мусор» вызовет самораспаковывающийся скрипт bash для отказа. Пример:

gzip: stdin: decompression OK, trailing garbage ignored

У меня было это сообщение из одного архива, и самораспаковывающийся скрипт bash не смог выполнить какие-либо команды после извлечения (хотя извлечение, кажется, было прекрасным, как говорится в сообщении ). Возможно, что-то вроде 2> /dev/null рассмотрит этот последний вопрос ...

1
задан 24 March 2015 в 12:05

0 ответов

Другие вопросы по тегам:

Похожие вопросы: