Извлечение архива путем передачи по каналу содержания архива в команду tar

Вы указываете eth0 оба как auto и allow-hotplug устройство:

auto eth0
allow-hotplug eth0

это является противоречащим, особенно auto устройство не проверит, включается ли устройство на самом деле.

таким образом, необходимо удалить строку с auto eth0.

2
03.10.2016, 14:13
3 ответа

Вы можете непреднамеренно расширять оболочку содержимого вашего архива. Попробуйте цитировать вашу переменную.

Заменить

echo $ARCHIVE_CONTENTS | tar xzv -C $TMPDIR

с

echo "$ARCHIVE_CONTENTS" | tar xzv -C $TMPDIR

Вам также может потребоваться избегать добавления новой строки с Echo -N

0
27.01.2020, 22:05

Почему бы не использовать здесь документ, как в старые времена?

 #!/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, оставлен на читателю)

1
27.01.2020, 22:05

Все ваши проблемы объясняются в Почему мой скрипт оболочки давится пробелами или другими специальными символами? , но я повторю соответствующие части здесь.

Во-первых, $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 на самом деле содержит только начало архивного файла, вплоть до первого нулевого байта. Нельзя использовать оболочку для манипулирования двоичными данными.

2
27.01.2020, 22:05

Теги

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