Как разблокировать безопасно, не загрязняя текущий каталог в случае tarbomb?

Уважаемые проекты выпускают архивы tar, которые содержат один каталог, например zyrgus-3.18.tar.gz содержит папку zyrgus-3.18 которая, в свою очередь, содержит src , build , dist и т. Д.

Но некоторые панк-проекты ставят все в корень: '- (Это приводит к полному беспорядку при распаковке. Создание папки вручную каждый раз является болью и ненужным большую часть времени.

  • Есть ли супер-быстрый способ определить, содержит ли файл .tar или .tar.gz больше одного каталога в его корне? Даже для большого архива.
  • Или еще лучше, есть ли инструмент, который в таких случаях создавал бы каталог (имя архива без расширения) и помещал бы все внутри?

patool обрабатывает различные типы архивов и создает подкаталог, если архив содержит несколько файлов, чтобы предотвратить загромождение рабочего каталога с извлеченными файлами.

Извлечение архива

 patool extract archive.tar 

Чтобы получить список поддерживаемых форматов, используйте patool formats .

Вы могли бы сделать что-то вроде

 tar tf thefile.tar | cut -d/ -f1 | sort -u 

чтобы увидеть, какие записи верхнего уровня имеют tar; pipe to wc -l чтобы проверить, есть ли более одного. Обратите внимание, что есть несколько случаев, когда это может потерпеть неудачу, например, если tar содержит пути к somedir/whatever формы somedir/whatever а также ./somedir/whatever (или что-то более сумасшедшее); это должно быть необычным.

Это будет читать весь tar-файл до вывода чего-либо из-за sort , хотя он должен быть быстрее, чем извлечение, потому что это всего лишь одно последовательное чтение, и он может пропускать большие файлы.

Если вы делаете это в интерактивном режиме, и файл может быть большим, вы можете изменить sort -u на uniq и Control + C, если он печатает несколько объектов.

ты можешь сделать:

 pax <some.tar 

… для отображения содержимого tar файла.

если вы хотите знать, сколько уровней в глубине, вы можете сделать:

 pax <some.tar | tr -dc /\\n | sort -r | head -n1 

вы можете прямо запретить взрыв при извлечении с помощью:

 mkdir some.tar pax -'rs|^|some.tar/|' <some.tar 

Это должно делать то, что вы хотите. Я уверен, что кто-то может это улучшить. В этих примерах я принимаю сжатый tar-архив gzip, поскольку это наиболее распространенный.

Вам нужен архив, в котором нет узлов-братьев в корневом каталоге корневого уровня.

Каждая запись в списке контента tar должна начинаться с того же шаблона. Этот шаблон – это путь к базовому каталогу, который должны использовать все записи в архиве. Если какие-либо две записи не начинаются с одного и того же шаблона, они являются братьями и сестрами.

Первая строка в списке контента tar даст вам минимальный шаблон, который вам нужно проверить. Это ОСНОВА.

 BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line)) 

Затем, чтобы проверить наличие взрывоопасных tarballs, вам нужно проверить , не начинается ли какая-либо строка списка содержимого tar с BASEPATH.

 tar ztf example.tar.gz | grep -qv "^${BASEPATH}" 

Поверните это в функцию оболочки:

 is_explosive() { TARBALL_NAME=$1 tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))" return $? } 

Отсюда вы можете написать безопасную функцию извлечения tar-архива.

 is_explosive() { TARBALL_NAME=$1 tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))" return $? } safe_tar_x() { TARBALL_NAME=$1 if is_explosive ${TARBALL_NAME}; then SUBDIR=${TARBALL_NAME%.tar.gz} SUBDIR=${SUBDIR##*/} mkdir "${SUBDIR}" echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2 else SUBDIR="." fi # Tar quirks: "--directory" must be last, and using more than # one option group requires that all groups start with a dash. tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}" return $? } 

aunpack archive.tar – это то, что я использую.

Часть старого старого пакета. Manpage: https://linux.die.net/man/1/atool