Tarbomb durumunda geçerli dizini kirletmeden güvenli bir şekilde nasıl kaldırılır?


33

Örneğin için Saygın projeleri, tek bir dizin içermesi katran arşivleri serbest zyrgus-3.18.tar.gzbir içerdiği zyrgus-3.18bunun da içeren klasörü src, build, distvb

Ancak bazı serseri projeleri herşeyi kökünden alıyor: '- (Bu , unarchiving sırasında tam bir karmaşaya yol açıyor. Her zaman elle bir klasör oluşturmak acı verici ve çoğu zaman gereksiz.

  • Bir .tar veya .tar.gz dosyasının kökünde tek bir dizinden daha fazlasını içerip içermediğini anlamanın süper hızlı bir yolu var mı? Büyük bir arşiv için bile.
  • Ya da daha iyisi, bu gibi durumlarda bir dizin oluşturacak (uzantı olmayan arşivin adı) ve içine her şeyi koyabilecek bir araç var mı?


2
Bence paketlenmiş paketleyiciye verilen hata raporunun kırıldığını düşünüyorum.

14
Tarihsel olarak (90'ların ortasından beri) her zaman bir alt dizine yerleştirilmemişim. Hepsi tek bir dizine (eğer olması gerektiği gibi) konursa, içerikleri mv ile doğru yere taşınabilir, sonra gereksiz fazla dizini silebilirsiniz. Ek iki adım evet, ancak yanlış yapılan bir tar dosyasındaki pisliği temizlemekten hoşlanıyor.
TED

6
But some punk projects put everything at the root :'-(Ve bazı punk projeleri zaten her şeyi bir klasörün içine tamamen gereksiz yere koyarlar, zaten her şeyi kapalı bir arşivin içine koyduklarını düşünürler, böylece herhangi bir akıllı kullanıcının yaptığı gibi kendi klasörüne indirip çıkarırken, tüm içerik başka bir katmanı aşağı gömdü. ;-)
Mason Wheeler

2
@MasonWheeler Katran arşivlerinin her şeyin bir klasörde olması için bir tür "fiili standart" vardır.
glglgl

Yanıtlar:


30

patool , farklı arşiv türlerini işler ve arşivin çalışma dizininin çıkarılmış dosyalar ile karışmasını önlemek için birden fazla dosya içermesi durumunda bir alt dizin oluşturur.

Arşivi çıkart

patool extract archive.tar

Desteklenen formatların bir listesini almak için kullanın patool formats.


Bilginize: sourceforge.net/projects/patool adresinde bulundu . Bu bir rpm ve ben alienUbuntu için bir debiye çevirmek için kullandım .
Joe,

patoolGeçerli bir sürüm kullanıyorsanız, Debian ve Ubuntu depolarında bulunmalıdır.
Marco

12

Gibi bir şey yapabilirsin

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

bir katranın hangi üst seviye girişleri olduğunu görmek için; wc -lBirden fazla olup olmadığını kontrol etmek için Bunun başarısız olacağı birkaç durum olduğunu unutmayın; örneğin, tar, formun dosya yollarını somedir/whateverve ayrıca ./somedir/whatever(veya daha çılgın bir şeyi) içeriyorsa ; Bu, nadir olsa da.

Bu, herhangi bir çıktı vermeden önce tüm tar dosyasını okuyacaktır, çünkü, sortaslında ayıklamaktan daha hızlı olması gerekir, çünkü sadece bir sıralı okumadır ve büyük dosyaları atlayabilir.

Etkileşimli yapıyoruz ve dosya büyük olabilir varsa, değiştirebilir sort -uiçin uniqve Control+ Cyazdırdığı eğer birden fazla şey.


2
sort | uniqkısaltılabilir sort -u.
Marco

4
yapmak istemediğiniz süreceuniq -c
kas

7

yapabilirsin:

pax <some.tar

... bir tardosyanın içeriğini listelemek için .

kaç seviyenin derinleştiğini bilmek istiyorsanız, şunları yapabilirsiniz:

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

aşağıdakilerle ekstraksiyonda meydana gelen bir patlamayı açıkça yasaklayabilirsiniz:

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

2

Bu istediğini yapmalı. Eminim birileri onu iyileştirebilir. Bu örneklerde, en yaygın olanı olduğundan, bir gzip sıkıştırılmış katran arşivi olduğunu farz ediyorum.

Kök seviyesi dizin ağacında kardeş düğümü bulunmayan bir arşiv istiyorsunuz.

Katran içerik listesindeki her giriş aynı kalıpla başlamalıdır. Bu kalıp, arşivdeki tüm girişlerin paylaşması gereken temel dizin yoludur. Herhangi iki giriş aynı desenle başlamazsa, onlar kardeş olur.

Katran içerik listesindeki ilk satır size kontrol etmeniz gereken minimum deseni verecektir. Bu BASEPATH.

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

Sonra test için eğer kontrol etmeniz gerekir patlayıcı tar toplarından herhangi katran içeriği listesinin çizgi gelmez BasePath ile başlar.

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

Bunu bir kabuk fonksiyonuna çevirin:

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

Buradan güvenli bir katran arşiv çıkarma işlevi yazabilirsiniz.

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 $?
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.