Вы указываете eth0
оба как auto
и allow-hotplug
устройство:
auto eth0
allow-hotplug eth0
это является противоречащим, особенно auto
устройство не проверит, включается ли устройство на самом деле.
таким образом, необходимо удалить строку с auto eth0
.
Вы можете непреднамеренно расширять оболочку содержимого вашего архива. Попробуйте цитировать вашу переменную.
Заменить
echo $ARCHIVE_CONTENTS | tar xzv -C $TMPDIR
с
echo "$ARCHIVE_CONTENTS" | tar xzv -C $TMPDIR
Вам также может потребоваться избегать добавления новой строки с Echo -N
Почему бы не использовать здесь документ, как в старые времена?
#!/bin/bash
export TMPDIR=`mktemp -d /tmp/selfextract.XXXXXX`
## other stuff
base64 -d <<EOF | tar xvf -C $TMPDIR
## base64 encoded
EOF
Вы производите BASE64 закодированы таким образом
tar cf - my_dir | base64 > /some/place
(включая его Ant Archive Archive, оставлен на читателю)
Все ваши проблемы объясняются в Почему мой скрипт оболочки давится пробелами или другими специальными символами? , но я повторю соответствующие части здесь.
Во-первых, $var
в скрипте оболочки не означает "значение переменной var
", а означает "взять значение переменной var
, разделить ее на слова и интерпретировать каждое слово как шаблон подстановки". Чтобы избежать этих дополнительных действий, поместите двойные кавычки вокруг подстановок переменных: "$var"
означает "значение переменной var
". Всегда заключайте двойные кавычки вокруг подстановок переменных и подстановок команд, если вы не знаете и не понимаете, почему их нужно пропустить.
Во-вторых, echo
точно не печатает свой аргумент: он интерпретирует некоторые опции, а в некоторых shell'ах интерпретирует экранирующие последовательности обратного слеша. Более того, echo
печатает новую строку, которую можно удалить с помощью опции -n
. Пропущенные данные никогда не выглядят как опция и бэш echo
по умолчанию обратный слеш обрабатывается буквально, но в общем, не используйте echo
на неизвестных данных, вместо этого используйте printf %s
.
printf %s "$ARCHIVE_CONTENTS" | tar xzv -C "$TMPDIR"
Это гарантирует, что значение переменной ARCHIVE_CONTENTS
будет точно передано в tar
.
Остальная проблема, которую невозможно решить без использования принципиально иного подхода, заключается в том, что большинство оболочек (все оболочки, которые я видел, кроме zsh) усекают значение переменных в первом нулевом байте (это потому, что они используют C-нультерминированные строки под капотом). Так что переменная ARCHIVE_CONTENTS
на самом деле содержит только начало архивного файла, вплоть до первого нулевого байта. Нельзя использовать оболочку для манипулирования двоичными данными.