GNU/Linux >> Belajar Linux >  >> Linux

Skrip Ekstraksi Sendiri:Tar -xo Dan Dd?

Saya bekerja dengan skrip yang merupakan skrip yang mengekstraksi sendiri. Ini adalah skrip untuk menginstal paket pada QNAP NAS.

Ini memiliki beberapa skrip di awal yang mengekstrak sisa file. Ini dia:

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

Ini menggunakan dd untuk menyalin byte dari byte 102 dan seterusnya ke tar, tempat byte tersebut diekstraksi.

Apa yang dimaksud dengan -xO melakukan? Dan mengapa itu diekstraksi "dua kali" (dua pemanggilan tar dengan -x ) ? Saya tidak dapat menemukan banyak diskusi tentang ini secara online – halaman manual tampaknya menyarankan bahwa ini ada hubungannya dengan "drive". (Sepertinya 0 dan Os saya tercampur!)

Selanjutnya, skrip melakukan:

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

Ini tampaknya melompat lebih jauh ke dalam file, dan menyalin byte di sana ke dalam TAR zip baru. Agaknya byte tersebut sudah terstruktur dan dikodekan seperti itu.

Tapi bukankah kita sudah membaca byte itu melalui tar pada perintah pertama? Saya tidak melihat cara di mana dd disuruh berhenti membaca file.

Jawaban yang Diterima:

Mari kita lihat paket QNAP, mis. 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
....

Sekarang mari kita salin datanya dengan dd , dan lihat apa yang ada di dalamnya:

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

Itu adalah arsip TAR mentah, dengan satu file tar.gz di dalamnya:

%file first 
first: POSIX tar archive (GNU)

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

Langkah pipeline selanjutnya adalah /bin/tar -xO , dan inilah yang dikatakan manual TAR di dalamnya:

Untuk menulis file yang diekstrak ke output standar, alih-alih membuat file pada sistem file, gunakan --to-stdout' ( -O’) dalam hubungannya dengan --extract' ( –get’, `-x’).

Opsi ini berguna jika Anda mengekstrak file untuk dikirim melalui pipa, dan tidak perlu menyimpannya di sistem file. Jika Anda mengekstrak beberapa anggota, mereka muncul pada keluaran standar yang digabungkan , dalam urutan yang ditemukan dalam arsip.

Karena hanya ada satu file control.tar.gz di dalam arsip, itu akan diekstraksi ke STDOUT, untuk diproses oleh langkah pipa berikutnya, yang akan memanggil TAR lagi untuk mengekstrak konten dalam darinya.

Terkait:Mendapatkan skrip .py untuk dibuka di IDLE Python?

Jadi, pada dasarnya, ada arsip 'tar.gz' di dalam arsip 'tar', itulah sebabnya dua tar berurutan perintah diperlukan untuk mengekstraknya.

Perhatikan bahwa tar secara inheren dirancang untuk beroperasi pada aliran data,
sehingga dapat dengan andal mendeteksi akhir arsip, meskipun diikuti oleh lebih banyak data:

Secara fisik, arsip terdiri dari serangkaian entri file yang diakhiri oleh entri akhir arsip, yang terdiri dari dua 512 blok nol byte.

Jadi, tar -xO , akan berhenti setelah file data pertama dibaca, dan membuang sisanya, yang menurut saya merupakan alasan untuk menggunakan format penyimpanan ini di qpkg .


Linux
  1. Redirect Dan Output Pipa?

  2. Menginstal dan mengonfigurasi vsFTPD

  3. Memperbarui satu file dalam tar terkompresi

  1. Utas dan deskriptor file

  2. unix - kepala DAN ekor file

  3. tar:baca singkat

  1. Cara mengekstrak file .gz dan .tar.gz di Linux

  2. Bagaimana cara membuka kompresi format file .xz di Linux menggunakan utilitas tar dan xz?

  3. Izin File Dan Menyimpan?