指定されたスクリプトが/usr/local/bin/に実行可能ファイルを生成する方法

指定されたスクリプトが/usr/local/bin/に実行可能ファイルを生成する方法

プロジェクトを進めながら全く理解できないスクリプトを発見しました。このスクリプトを理解するのに役立ちますか?このスクリプトを段階的に説明してください。

スクリプト

if ! [ -f /usr/local/bin/XXX -a -f /usr/local/bin/YYY -a -f /usr/local/bin/ZZZ ]
then
    if [ "`uname`" = "Linux" ]
    then
        UUDECODE="uudecode -o /dev/stdout"
    else
        UUDECODE="uudecode -p"
    fi
    cat $0 | awk 'printme == "1" {print} /^DATA BEGINS HERE/ {printme = "1"}' | ${UUDECODE} | (cd /usr/local/bin ; sudo tar xzf - --unlink)
    sudo chmod AAAA /usr/local/bin/XXX /usr/local/bin/YYY
fi

これまでの私の理解

  1. このスクリプトは/usr/local/binにXXX、YYY、ZZZがあることを確認します。
  2. そうでない場合は、if本文を入力してください。
  3. 現在のオペレーティングシステムがLinuxの場合、
  4. でもその時はわかりませんでした。

奇妙なことに、このスクリプトを実行した後、3つの実行可能ファイルが/ usr / local / binにあります。以下のスクリプトを1行ずつ説明してください。

私が言及したことの1つは、スクリプトの最後に「data start here」で始まる読み取り不可能なデータがあることです。スクリプトはこのデータを/usr/local/binにコピーしますか?

答え1

Linuxの場合はUDEDECODEを呼び出しコマンドの1つの形式に設定しuudecode、そうでない場合は別の形式を設定します。標準ではないので、呼び方はさまざまです。あなたが私に尋ねるなら、私はそれほど賢くはありません。

行の始まりcat $0は本当に重要です。$0実行中のプロセスの名前、つまり現在のスクリプトの名前。繰り返しますが、これはほとんどの場合うまくいきますが、だますかもしれません。

スクリプトの内容はawkスクリプトにパイプされ、その後のすべてのテキストがDATA BEGINS HERE出力にコピーされます。これはuudecode以前に設定されたコマンドにパイプされます。uudecodeテキストを取得してバイナリを生成します(HTTPや他のプロトコルが普及する前に、uuencode/はバイナリファイルをテキストとして渡すために使用されました)。結果は、最初に入力を変更してから解凍するuudecode「()」のコマンドにパイプされます。そこ/usr/local/bintar。最初は--unlink既存のファイルを削除します。

これはどこから来たのですか?

関連情報