주어진 스크립트가 /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. 현재 운영체제가 리눅스라면,
  4. 하지만 그때 나는 이해하지 못했습니다.

이상하게도 이 스크립트를 실행한 후 세 개의 실행 파일이 /usr/local/bin에 위치합니다. 아래 스크립트를 한 줄씩 설명해주세요.

제가 언급한 것 중 하나는 스크립트 끝에 "data start here"로 시작하는 읽을 수 없는 데이터가 있다는 것입니다. 스크립트가 이 데이터를 /usr/local/bin에 복사합니까?

답변1

Linux인 경우 UUDECODE를 호출 명령의 한 형식으로 설정하고 uudecode, 그렇지 않은 경우 다른 형식을 설정합니다. 표준이 아니기 때문에 부르는 방법이 다양합니다. 당신이 나에게 묻는다면 나는 그다지 똑똑하지 않습니다.

줄의 시작 cat $0이 정말 중요합니다. $0실행 중인 프로세스의 이름, 즉 현재 스크립트의 이름입니다. 다시 말하지만, 이는 대부분의 경우 작동하지만 속일 수도 있습니다.

스크립트의 내용은 awk스크립트로 파이프되어 그 뒤의 모든 텍스트를 DATA BEGINS HERE출력으로 복사합니다. 이는 uudecode이전에 설정된 명령으로 파이프됩니다. uudecode텍스트를 가져와서 바이너리를 생성합니다(HTTP 및 기타 프로토콜이 대중화되기 전에 uuencode/ 는 바이너리 파일을 텍스트로 전달하는 데 사용되었습니다). 결과는 먼저 입력을 변경한 다음 압축을 푸는 uudecode"()"의 명령으로 파이프됩니다. 거기와 /usr/local/bin함께 tar. 첫 번째는 --unlink기존 파일을 삭제합니다.

이것은 어디에서 왔습니까?

관련 정보