1

base64 で圧縮およびエンコードされた別の自己解凍型 tar アーカイブを作成するシェル スクリプトを作成しようとしました。ここからどこに行けばよいかわかりませんし、シェル スクリプトの経験もほとんどありません。

このスクリプトは圧縮されてエンコードされた tar アーカイブを作成しますが./tarName、ターミナルから実行しようとすると自己解凍が機能しません。どんなアドバイスでも大歓迎です

#!/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: gzip が見つかりません: stdin: ファイル tar の予期しない終了: 子がステータス 1 を返しました tar: エラーは回復できません: 現在終了しています

4

2 に答える 2

1

これを自分で行う必要がありますか?これを行うことができるmakeselfと呼ばれる既存のツールがあります。これを自分で書く必要がある場合は、次のように考えてください。

出力ファイルは、先頭にシェル スクリプトが貼り付けられたアーカイブです。抽出プロセスは、アーカイブだけでなく、出力ファイル全体を実行します。この呼び出しにより、スクリプト部分がガベージに変わり、混乱します。必要なのは、スクリプトをアーカイブから分離するコードを追加してから、残りのコマンドをアーカイブ部分だけで実行することです。これを行う 1 つの可能な方法は、抽出スクリプトを次のように微調整することです。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__

改行文字 (この Web サイトのマークアップでは表示されません) を除いて、マーカー テキストに続くスクリプト部分に何もないことを確認してください。これにより、 を使用grepしてマーカーを含む行番号を見つけ、 でその多くの行を取り除きますtail。残っているのはアーカイブ部分で、残りのコードによって通常どおり処理されます。このexit行は、シェルがマーカー テキストまたはアーカイブ コンテンツをコードとして実行しようとしないことを保証します。必要に応じて、抽出コードを圧縮されていない形式のままにしておくこともできますが、アーカイブ部分の一時ファイルを作成して、確実に削除する必要があります。

于 2016-03-10T19:11:01.143 に答える
1
于 2016-03-11T03:43:07.717 に答える