執行自解壓縮 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',這些可確保任何$不會擴展為錯誤的變數名稱。

  • 我還將您的變數更改為小寫,因為對 shell 變數使用大寫是不好的做法,因為按照慣例,全域環境變數是大寫的,這可能會導致命名衝突和意外錯誤。變數使用小寫字母,並且僅在可能的情況下將全域環境變數大寫。

  • 我更改mktemp為,mktemp -d因為您似乎正在嘗試建立目錄,並且沒有-d該命令mktemp會建立一個檔案。

你現在應該能夠做類似的事情

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

相關內容