
프로젝트를 진행하면서 전혀 이해할 수 없는 스크립트를 발견했습니다. 이 스크립트를 이해하도록 도와주실 수 있나요? 이 스크립트를 단계별로 설명해주세요.
스크립트
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
지금까지의 나의 이해
- 이 스크립트는 /usr/local/bin에 XXX, YYY, ZZZ가 있는지 확인합니다.
- 그렇지 않은 경우 if 본문을 입력합니다.
- 현재 운영체제가 리눅스라면,
- 하지만 그때 나는 이해하지 못했습니다.
이상하게도 이 스크립트를 실행한 후 세 개의 실행 파일이 /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
기존 파일을 삭제합니다.
이것은 어디에서 왔습니까?