먼저 저장하지 않고 자동 추출 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

코멘트:

  • \0데이터 아카이브에 NUL( ) 이 포함될 수 있는 경우에는 작동하지 않습니다..

  • 주위의 작은따옴표에 유의하세요 'EoF'. 이는 $잘못된 변수 이름으로 확장되지 않도록 보장합니다.

  • 또한 관례에 따라 전역 환경 변수는 대문자로 표시되어 이름 충돌 및 예상치 못한 버그가 발생할 수 있으므로 쉘 변수에 대문자를 사용하는 것은 나쁜 습관이므로 변수를 소문자로 변경했습니다. 변수에 소문자를 사용하고 가능하면 전역 환경만 대문자로 사용하세요.

  • 디렉토리를 생성하려는 것 같고 명령 없이 파일을 만드는 것 같아서 mktemp으로 변경했습니다 .mktemp -d-dmktemp

이제 다음과 같은 작업을 수행할 수 있습니다.

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

관련 정보