这应该做您想要的。我相信有人可以改善它。在这些示例中,我假定使用gzip压缩的tar存档,因为这是最常见的。
您需要一个在根目录目录树中没有兄弟节点的归档文件。
tar内容列表中的每个条目都必须以相同的模式开头。此模式是归档中所有条目必须共享的基本目录路径。如果任何两个条目不是以相同的模式开头,则它们是同级。
tar内容列表中的第一行将为您提供所需检查的最小模式。这是BASEPATH。
BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))
然后,以测试为你需要检查,如果爆炸压缩包的任何焦油含量列表的行不与基本路径开始。
tar ztf example.tar.gz | grep -qv "^${BASEPATH}"
把它变成一个shell函数:
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 $?
}