makeselfを実行せずにどのようにアーカイブの内容を一覧表示できますか?

makeselfを実行せずにどのようにアーカイブの内容を一覧表示できますか?

私はホームブログアーカイブを持っていて、その中に何があるのか​​見たいです。実際にスクリプト部分を実行するのではなく、どのファイルが抽出されますか?どうすればいいですか?

実際には何も抽出しないほうが良いでしょうが、それが唯一の方法であれば(ba)shコードが実際に実行されない限り、それを喜んで行います。

答え1

生成されたアーカイブには、その--list内容を一覧表示するために使用できるオプションがあります。

ちなみに、私はこのバージョンのDebianについて話しています。

ii  makeself       2.2.0-1      all          utility to generate self-extractables

スクリプトから次のブロックを生成します。

MS_Help()
{   
    cat << EOH >&2 
Makeself version 2.2.0 
 1) Getting help or info about $0 : 
  $0 --help   Print this message 
  $0 --info   Print embedded info : title, default target directory, embedded script ... 
  $0 --lsm    Print embedded lsm entry (or no LSM) 
  $0 --list   Print the list of files in the archive 
  $0 --check  Checks integrity of the archive 

 2) Running $0 : 
  $0 [options] [--] [additional arguments to embedded script] 
  with following options (in that order) 
  --confirm             Ask before running embedded script 
  --quiet               Do not print anything except error messages 
  --noexec              Do not run embedded script 
  --keep                Do not erase target directory after running 
                        the embedded script 
  --noprogress          Do not show the progress during the decompression 
  --nox11               Do not spawn an xterm 
  --nochown             Do not give the extracted files to the current user 
  --target dir          Extract directly to a target directory 
                        directory path can be either absolute or relative 
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command 
  --                    Following arguments will be passed to the embedded script 
EOH
}

マニュアルページには少し作業が必要ですが、スクリプトは読みやすいです。Gitリポジトリ

追加資料:makeself - Unixで自動抽出アーカイブを作成する

答え2

自作アーカイブは3つの部分で構成されています。

  1. シェルスクリプト。
  2. gzipで圧縮されたtarアーカイブ。
  3. (オプション)最後に、より多くのデータがあります。

通常、アーカイブを実行すると、埋め込まれたアーカイブを一時ディレクトリに抽出し、アーカイブから抽出された特定のファイルを実行するシェルスクリプトを実行します。スクリプトには独自のサイズとtarファイルのサイズに関する情報が含まれているため、中間に含まれるtarファイルを抽出できます。

(「最後の追加データ」は何でも構いません。たとえば、GoGインストーラの場合、実際のゲームコンテンツを含むzipファイルが含まれています。)これらのファイルはunzipmakeselfを完全にバイパスしてを使用して抽出できます。これはzipファイルが相対オフセットを使用するため、機能します。

Linuxでファイルを開くとless、知っておくべきことすべてを知らせるスクリプトの内容を見ることができます。上部近くに次のような行があるはずです。

filesizes="12345"

これは、含まれるtarファイルの長さが12345バイトであることを示しています。 (理論的には、filesizes複数のファイルのサイズを一覧表示することは可能ですが、実際にはアーカイブに複数のファイルが含まれる場合はほとんどありません。)

その後、検索するとhead次の行を見つける必要があります。

offset=`head -n 519 "$1" | wc -c | tr -d " "`

これは、スクリプトが独自のサイズを計算するために使用するロジックです。ご覧のとおり、スクリプトは長さが519行であることを知っています。

これで、スクリプトのサイズ(行)と埋め込みtarアーカイブのサイズ(バイト)がわかったので、次のように埋め込みアーカイブの内容を一覧表示できます。

tail +520 ~/Downloads/gog_huniepop_2.0.0.3.sh | head -c 12345 | tar tz

tail +N行から始まるファイルの内容が一覧表示されますN。私たちはただ始めたいので、519より1より多くの520を使用します。後ろにスクリプトの終わり(最後の行を除く)

いくつかの注意:

  • ファイルを一覧表示する代わりにファイルを抽出するにはを使用しますtar xztar tz空のディレクトリでこれを行うことができます。
  • BSDでは、tarはデフォルトでstdinの代わりにテープデバイスから読み取られます。tar tzf -この場合に使用されます。

答え3

私の場合は簡単です。

makeself_archive.sh --tar xf

これにより、アーカイブ内容がPWDに抽出されます。

関連情報