自己解凍型の bash スクリプト (バイナリ データが追加された) を、保存せずに実行します。

自己解凍型の bash スクリプト (バイナリ データが追加された) を、保存せずに実行します。

次のような自己解凍型 bash スクリプト (最後にバイナリ データが追加されます) があります。

#!/bin/bash

export TMPDIR=$(mktemp -d)

ARCHIVE_START_LINE=$(...) # <omitted>

# extracting data archive into a temporary directory
tail -n+$ARCHIVE_START_LINE $0 | tar xzv -C $TMPDIR

# <ACCESSING_ARCHIVED_RESOURCES>

exit 0

# <BINARY_DATA_ARCHIVE>

スクリプトはリモートでホストされていますhttps://<omitted>/script.sh

スクリプトをプルしてローカルで実行したいと思います。

tailスクリプト内で現在のファイル名を引数として渡して使用しているため、次の操作は実行できません。

/bin/bash -c "$(curl -fsSL https://<omitted>/script.sh)"

もちろん、最初に一時ファイルに保存することもできます。例:

TMP=$(mktemp); curl -fsSL https://<omitted>/script.sh > $TMP; sh $TMP; rm $TMP

しかし...もっといい方法はないでしょうか?

答え1

スクリプトの構造を少し変更するだけで、 は不要になりますtail。代わりに、データを変数として保存します。

#!/bin/bash

## begin data dump
read -r -d '' archive_data <<'EoF'
<BINARY_DATA_ARCHIVE>
EoF
## end data dump

export tmpdir=$(mktemp -d)

# extracting data archive into a temporary directory
printf '%s' "$archive_data" | tar xzv -C "$tmpdir"

exit 0

コメント:

  • データアーカイブにNUL(\0)が含まれる場合、これは機能しません。

  • を囲む一重引用符に注意してください'EoF'。これにより、 any が$間違った変数名に展開されないようになります。

  • また、変数を小文字に変更しました。これは、慣例によりグローバル環境変数は大文字で表記されるため、シェル変数に大文字を使用するのは好ましくない習慣であり、名前の衝突や予期しないバグにつながる可能性があるためです。変数には小文字を使用し、可能な限りグローバル環境変数のみを大文字で表記するようにしてください。

  • ディレクトリを作成しようとしているようですが、コマンドなしでファイルを作成するためmktemp、 に変更しました。mktemp -d-dmktemp

これで次のようなことができるようになるはずです

curl -fsSL https://<omitted>/script.sh | bash

関連情報