GNU/Linux >> Tutoriales Linux >  >> Linux

Scripts autoextraíbles:Tar -xo y Dd?

Estoy trabajando con un script que es un script autoextraíble. Es un script para instalar paquetes en un QNAP NAS.

Tiene algunas secuencias de comandos al principio que extraen el resto del archivo. Aquí va:

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

Esto usa dd para copiar los bytes a partir del byte 102 en tar, donde se extrae.

¿Qué hace -xO ¿hacer? ¿Y por qué se extrae “dos veces” (dos invocaciones de tar con -x ) ? No pude encontrar mucha discusión sobre esto en línea:la página de manual parece sugerir que tiene algo que ver con "unidades". (¡Parece que confundí mis ceros y mis ceros!)

Posteriormente, el script hace:

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

Esto parece saltar más en el archivo y copia los bytes allí en un nuevo TAR comprimido. Presumiblemente, esos bytes ya están estructurados y codificados de esa manera.

¿Pero no leímos esos bytes a través de tar en el primer comando? No veo forma en que dd se le dijo que dejara de leer el archivo.

Respuesta aceptada:

Echemos un vistazo a un paquete de QNAP, p. 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
....

Ahora copiemos los datos con dd y mira lo que hay dentro:

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

Es un archivo TAR sin procesar, con un solo archivo tar.gz dentro:

%file first 
first: POSIX tar archive (GNU)

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

El siguiente paso de la canalización es /bin/tar -xO , y esto es lo que dice el manual TAR:

Para escribir los archivos extraídos en la salida estándar, en lugar de crear los archivos en el sistema de archivos, utilice --to-stdout' ( -O') junto con --extract' ( –obtener', `-x').

Esta opción es útil si está extrayendo archivos para enviarlos a través de una canalización y no necesita conservarlos en el sistema de archivos. Si extrae varios miembros, aparecen en la salida estándar concatenada , en el orden en que se encuentran en el archivo.

Como solo hay un archivo control.tar.gz dentro del archivo, se extraerá a STDOUT, para ser procesado por el siguiente paso de canalización, que invocará TAR nuevamente para extraer el contenido interno de él.

Relacionado:¿Obtener secuencias de comandos .py para abrir en IDLE de Python?

Entonces, básicamente, hay un archivo 'tar.gz' dentro del archivo 'tar', razón por la cual dos tar secuenciales se necesitan comandos para extraerlo.

Tenga en cuenta que tar está inherentemente diseñado para operar en flujo de datos,
por lo que puede detectar de manera confiable el final del archivo, incluso si es seguido por más datos:

Físicamente, un archivo consta de una serie de entradas de archivo que terminan con una entrada de fin de archivo, que consta de dos bloques 512 de cero bytes.

Entonces, tar -xO , se detendrá después de leer el primer archivo de datos y descartará el resto, lo que supongo que fue una razón para usar este formato de almacenamiento en qpkg .


Linux
  1. ¿Cómo descomprimir el formato de archivo .xz en Linux usando las utilidades tar y xz?

  2. ¿Permisos de archivo y ahorro?

  3. ¿Compresión / archivado que mantiene los permisos y el propietario del archivo?

  4. Instalación y configuración de vsFTPD

  5. Cómo tar, untar archivos y ver el contenido del archivo tar en Linux

Cómo extraer (descomprimir) el archivo Tar Gz

Cómo extraer (descomprimir) el archivo tar.xz

Cómo crear un archivo Tar Gz

Todo sobre archivos tar y cómo tar, untar archivos en Linux usando Terminal

Comando tar de Linux para comprimir y extraer archivos

Extraiga el archivo tar.gz en Linux