自動抽出スクリプト:tar -xOとdd

自動抽出スクリプト:tar -xOとdd

自動抽出スクリプトを使用しています。これはQNAP NASにソフトウェアパッケージをインストールするためのスクリプトです。

ファイルの残りの部分を抽出するいくつかのスクリプトが最初にあります。問題は次のとおりです。

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

ddこれは、バイト102で始まるバイトをtarにコピーし、そこから抽出するために使用されます。

-xO効果は何ですか? 「二度」抽出される理由は何ですか(tar二回と呼ばれる-x)? オンラインでこの問題に関する多くの議論が見つかりません。マニュアルページでは、この問題が「ドライバ」に関する問題であることを示しているようです。(0とOsを混同したようです!)

その後、スクリプトは次のことを行います。

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

これはファイルに移動し、そこにあるバイトを新しい圧縮TARにコピーするようです。おそらく、バイトはすでにこのように構造化されエンコードされています。

しかし、最初のコマンドでtarを介してすでにこのバイトを読み取っていませんか?ddファイルの読み取りを中止するように指示する方法はありません。

答え1

たとえば、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.gzファイルを含むネイティブTARアーカイブです。

%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 -xOTARです。手動それは言う:

ファイルシステムにファイルを作成するのではなく、抽出されたファイルを標準出力に書き込むには、--get '、 `-x')--to-stdout' (と一緒に-O')を使用します。--extract' (

このオプションは、ファイルを抽出してパイプを介して転送し、ファイルシステムに保存する必要がない場合に便利です。複数のメンバーを抽出すると標準出力接続に表示されます。、アーカイブの順序で。

アーカイブ内にはファイルが1つしかないため、control.tar.gzSTDOUTに抽出され、次のパイプライン段階で処理されます。 TARを再呼び出しして内部コンテンツを抽出します。

したがって、デフォルトでは "tar"アーカイブの中に "tar.gz"アーカイブがあるので、tarそれを抽出するには2つの連続したコマンドが必要です。

デフォルトではストリーミングデータで動作するように設計されているため、tar後にデータが多い場合でもアーカイブの終わりを確実に検出できます。

物理的に、アーカイブは一連のファイルエントリで構成され、2つの512 0バイトブロックで構成されるアーカイブエンドエントリで終わります。

したがって、tar -xO最初のデータファイルを読み取った後に停止し、残りは破棄されますqpkg

関連情報