이것은 당신이 원하는 것을해야합니다. 누군가가 그것을 향상시킬 수 있다고 확신합니다. 이 예에서는 gzip 압축 tar 아카이브가 가장 일반적이기 때문에 압축 된 것으로 가정합니다.
루트 레벨 디렉토리 트리에 형제 노드가없는 아카이브를 원합니다.
tar 컨텐츠 목록의 모든 항목은 동일한 패턴으로 시작해야합니다. 이 패턴은 아카이브의 모든 항목이 공유해야하는 기본 디렉토리 경로입니다. 두 항목이 동일한 패턴으로 시작하지 않으면 형제입니다.
tar 컨텐츠 목록의 첫 번째 줄은 확인해야 할 최소한의 패턴을 제공합니다. 이것이 BASEPATH입니다.
BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))
그런 다음 테스트에 대한 당신이 있는지 확인해야합니다 폭발적인 타르볼 어떤 타르 콘텐츠 목록의 라인이 없는 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 $?
}