自己解凍型のスクリプトを使用しています。これは、QNAPNASにパッケージをインストールするためのスクリプトです。
開始時に、ファイルの残りの部分を抽出するスクリプトがいくつかあります。
script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv
これはdd
を使用します バイト102以降のバイトをtarにコピーし、そこで抽出します。
-xO
とは 行う?そして、なぜそれが「2回」抽出されるのですか(-x
を使用したtarの2回の呼び出し) )? このオンラインでの議論はあまり見つかりませんでした。manページは、「ドライブ」と関係があることを示唆しているようです。 (0とOが混同されたようです!)
その後、スクリプトは次のことを行います。
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
これはファイルにさらにスキップし、そこでバイトを新しいzip形式のTARにコピーするように見えます。おそらく、それらのバイトはすでにそのように構造化およびエンコードされています。
しかし、最初のコマンドでtarを介してこれらのバイトをすでに読み取っていませんか? dd
がどのように表示されるかわかりません ファイルの読み取りを停止するように指示されました。
承認された回答:
QNAPパッケージを見てみましょう。例: 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
....
次に、dd
を使用してデータをコピーしましょう 、中身を見てください:
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
これは生のTARアーカイブであり、その中に単一の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
次のパイプラインステップは/bin/tar -xO
です 、およびTARマニュアルに記載されている内容は次のとおりです。
抽出されたファイルを標準出力に書き込むには、ファイルシステム上にファイルを作成する代わりに、
--to-stdout' (
)を使用します。 -O’)と--extract' (
–get’、 `-x’)。このオプションは、ファイルを抽出してパイプ経由で送信する場合に便利であり、ファイルシステムに保存する必要はありません。複数のメンバーを抽出すると、それらは連結された標準出力に表示されます 、アーカイブで見つかった順序で。
control.tar.gz
ファイルは1つしかないため アーカイブ内では、STDOUTに抽出され、次のパイプラインステップで処理されます。このステップでは、TARが再度呼び出され、アーカイブから内部コンテンツが抽出されます。
したがって、基本的に、「tar」アーカイブ内に「tar.gz」アーカイブがあります。これが、2つの連続したtar
である理由です。 抽出するにはコマンドが必要です。
tar
に注意してください 本質的にストリームデータを操作するように設計されているため、
アーカイブの終わりを確実に検出でき、その後にさらにデータが続く場合でも、
物理的には、アーカイブは、ゼロバイトの2つの512ブロックで構成されるアーカイブ終了エントリで終了する一連のファイルエントリで構成されます。
したがって、tar -xO
は、最初のデータファイルの読み取り後に停止し、残りを破棄します。これは、qpkg
でこのストレージ形式を使用する理由であると思います。 。