1

我试图编写一个 shell 脚本来创建另一个以 base64 压缩和编码的自解压 tar 存档。我不知道从哪里开始,而且几乎没有 shell 脚本方面的经验。

./tarName就像这个脚本创建压缩和编码的 tar 存档一样,但是当我尝试从终端运行时,自解压不起作用。任何建议表示赞赏

#!/bin/sh
tarName=$1;

if [ -e $tarName.tar.gz ] 

    then /bin/echo "$tarName already exists" 
    exit 0
fi

shift;
for files;
do
    tar -czvf tmpTarBall.tar.gz $files;
done

echo "#!/bin/sh" >> $tarName.tar.gz;
echo "base64 -d $tarName.tar.gz"  >> $tarName.tar.gz;
echo "tar -xzvf $tarName.tar.gz" >> $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;

base64 tmpTarBall.tar.gz >> $tarName.tar.gz;
rm tmpTarBall.tar.gz;

- - - - - 更新

环顾四周,这就是我现在所拥有的,仍然无法正常工作。谁能向我解释为什么?

#!/bin/sh
tarName=$1;

if [ -e $tarName.tar.gz ] 

    then /bin/echo "$tarName already exists" 
    exit 0
fi

shift;
for files;
do
    tar -czvf tmpTarBall.tar.gz $files;
done

cat > extract.sh;
echo "#!/bin/sh" >> extract.sh;
echo "sed '0,/^#TARBALL#$/d' $0 | $tarName.tar.gz | base64 -d | tar -xzv; exit 0" >> extract.sh;
echo "#TARBALL#" >> extract.sh;

cat extract.sh tmpTarBall.tar.gz > $tarName.tar.gz;
chmod +x ./$tarName.tar.gz;

rm extract.sh tmpTarBall.tar.gz;

当我尝试运行 tarName.tar.gz 时出现错误: ./tarName.tar.gz: 2: ./tarName.tar.gz: tarName.tar.gz: not found gzip: stdin: unexpected end of file tar :子返回状态 1 焦油:错误不可恢复:现在退出

4

2 回答 2

1

有必要自己做吗?有一个名为makeself的现有工具可以为您执行此操作。如果你确实需要自己写,这里有一些想法:

您的输出文件是一个存档,其前面粘贴了一个 shell 脚本。提取过程通过和运行整个输出文件,而不仅仅是存档。该调用将脚本部分变成垃圾,然后混淆. 您需要做的是添加一些将脚本与存档分开的代码,然后仅在存档部分上运行剩余的命令。一种可能的方法是将提取脚本调整为以下内容:base64tarbase64tar

#!/bin/sh
linenum=$(grep -n "__END_OF_SCRIPT_MARKER__" $tarName.tar.gz | tail -1 | sed -e 's/:.*//')
tail -n +$(($linenum + 1)) $tarName.tar.gz | base64 -d | tar -xzv
exit 0
__END_OF_SCRIPT_MARKER__

确保在标记文本之后的脚本部分中除了换行符(本网站上的标记不可见)之外没有任何内容有了这个,你就grep可以找到包含标记的行号,然后用tail. 剩下的将是存档部分,它由您的其余代码正常处理。该exit行确保 shell 不会尝试将标记文本或存档内容作为代码执行。如果愿意,您可以将提取代码保留为压缩程度较低的格式,但最终您将不得不为存档部分创建一个临时文件并确保将其删除。

于 2016-03-10T19:11:01.143 回答
1
于 2016-03-11T03:43:07.717 回答