执行自解压 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',这确保 any$不会扩展为错误的变量名。

  • 我还将您的变量改为小写,因为对 shell 变量使用大写是一种不好的做法,因为按照惯例,全局环境变量是大写的,这可能会导致命名冲突和意外错误。对您的变量使用小写,并尽可能将全局环境变量大写。

  • 我改为mktempmktemp -d因为您似乎正在尝试创建一个目录,但在没有-d命令的情况下mktemp创建一个文件。

你现在应该可以做类似的事情

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

相关内容