GNU/Linux >> Znalost Linux >  >> Linux

Samorozbalovací skripty:Tar -xo a Dd?

Pracuji se skriptem, který je samorozbalovacím skriptem. Je to skript pro instalaci balíčků na QNAP NAS.

Na začátku má nějaké skriptování, které extrahuje zbytek souboru. Tady to je:

script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv

Toto používá dd zkopírujte bajty od bajtu 102 dále do tar, kde se extrahují.

Co znamená -xO dělat? A proč je extrahován „dvakrát“ (dvě vyvolání tar s -x ) ? Na internetu jsem o tom nenašel mnoho diskuzí – zdá se, že manuálová stránka naznačuje, že to má něco společného s „disky“. (Vypadá to, že jsem si spletl 0 a Os!)

Následně skript provede:

offset=$(/usr/bin/expr $script_len + 2042)
/bin/dd if="${0}" bs=$offset skip=1 | /bin/cat | /bin/dd bs=1024 count=7 of=$_EXTRACT_DIR/data.tar.gz

Zdá se, že to přeskočí dále do souboru a zkopíruje tam bajty do nového zazipovaného TAR. Tyto bajty jsou pravděpodobně již takto strukturovány a zakódovány.

Nepřečetli jsme však již tyto bajty prostřednictvím tar v prvním příkazu? Nevidím žádný způsob, jak dd bylo řečeno, aby přestal číst soubor.

Přijatá odpověď:

Podívejme se na balíček QNAP, např. http://www.twonkyforum.com/downloads/8.3/TwonkyServerEU_8.3_arm-x41.qpkg

....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....

Nyní zkopírujeme data pomocí dd a podívejte se, co je uvnitř:

%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first

Toto je nezpracovaný archiv TAR s jediným souborem tar.gz:

%file first 
first: POSIX tar archive (GNU)

%tar -tvf first 
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz

Dalším krokem v kanálu je /bin/tar -xO , a zde je to, co o něm říká příručka TAR:

Chcete-li zapsat extrahované soubory na standardní výstup, místo vytváření souborů v systému souborů použijte --to-stdout' ( -O’) ve spojení s --extract' ( –get’, „-x“).

Tato možnost je užitečná, pokud extrahujete soubory a posíláte je kanálem a nepotřebujete je uchovávat v systému souborů. Pokud extrahujete více členů, objeví se na standardním výstupu zřetězené , v pořadí, v jakém se nacházejí v archivu.

Protože existuje pouze jeden soubor control.tar.gz uvnitř archivu bude extrahován do STDOUT, kde bude zpracován dalším krokem potrubí, který znovu vyvolá TAR, aby z něj extrahoval vnitřní obsah.

Související:Jak otevřít skripty .py v IDLE Pythonu?

V zásadě tedy existuje archiv „tar.gz“ uvnitř archivu „tar“, což je důvod, proč dva po sobě jdoucí tar k jeho extrakci jsou nezbytné příkazy.

Všimněte si, že tar je ze své podstaty navržen tak, aby fungoval s datovými proudy,
takže dokáže spolehlivě detekovat konec archivu, i když po něm následuje další data:

Fyzicky se archiv skládá ze série záznamů souborů ukončených záznamem na konci archivu, který se skládá ze dvou 512 bloků po nule bajtů.

Takže tar -xO , zastaví se po prvním přečtení datového souboru a zbytek zahodí, což byl myslím důvod pro použití tohoto formátu úložiště v qpkg .


Linux
  1. Oprávnění a ukládání souborů?

  2. Komprese / archivace, která zachovává oprávnění a vlastníka souboru?

  3. Instalace a konfigurace vsFTPD

  1. Aktualizace jednoho souboru v komprimovaném taru

  2. Vlákna a deskriptory souborů

  3. unix - hlava A konec souboru

  1. Jak extrahovat soubory .gz a .tar.gz v Linuxu

  2. Jak dekomprimovat formát souboru .xz v Linuxu pomocí nástrojů tar a xz?

  3. vytvořit tar s více adresáři a umístěními souborů