이점

이점

실행 가능한 바이너리를 스크립트에 직접 연결하는 방법을 찾고 있습니다. 이 같은:

#!/bin/bash
...some shell code
execute binary:
    >>>
        binary
        code
        ...
    <<<
...some more shell code possibly

찾았어요이 솔루션, 사용 uuencode하고 좋습니다. 하지만 상황에 따라 다릅니다 shrutils. 내 데비안에는 기본적으로 포함되어 있지 않기 때문에 이것은 추가 항목인 것 같습니다.

base64바이너리를 인코딩 한 다음 디코딩하는 것에 대해 생각해 왔습니다 .어떻게든실행하면 임시 파일이 생성되지 않습니다. 나는 어떤 일을 하는 도서관이 있었던 것을 기억하지만 그것이 무엇인지 잊어버렸습니다.

다음과 같이 수행되는 간단한 구성을 갖는 것이 더 좋습니다.

$ <(base64 out | base64 -d)
bash: /dev/fd/63: Permission denied

답변1

어때요?

unpack() {
    tail +9 "$0" > /tmp/xxx.$$
    chmod +x /tmp/xxx.$$
}
unpack
/tmp/xxx.$$ <add args here>
rm /tmp/xxx.$$
exit
<add the binary here>

스크립트의 바이너리 데이터가 마음에 들지 않으면 이를 인코딩하고 cat관련 디코더로 바꿀 수 있습니다.

+9스크립트를 다른 길이로 수정하는 경우 행 번호를 바이너리 파일의 시작 부분으로 바꿔야 합니다.

tail구현에서 이 매개변수를 지원하지 않는 경우 대신 +9시도해 보세요 -n +9.

기존 /tmp 파일이 손상될까 봐 걱정된다면 mktemp(1).

SunPro이 방법은 전체 업그레이드가 포함된 압축된 tar 아카이브와 업그레이드 관련 처리를 관리하기 위한 일부 셸 코드를 포함하는 컴파일러 제품군의 업그레이드 스크립트에서 사용됩니다 .

답변2

에서 시작하다

aShellScript aBinaryExecutable

하다

zip binary.zip aBinaryExecutable
cat aShellScript binary.zip > hybrid
chmod +x hybrid

바이너리를 추출하고 실행하기 위해 스크립트에 무엇을 넣을지 놓쳤지만 hybrid유효한 zip 파일과 유효한 쉘 스크립트라는 점에 유의하세요. 쉘 스크립트는 자체적으로 압축을 풀고 바이너리 실행 파일을 얻을 수 있습니다(쉘 스크립트는 아님).

이점

견고함: 파일은 유효한 zip 및 유효한 쉘 스크립트입니다(마지막에 쓰레기를 해석하기 전에 종료하는 한).

피해

스크립트의 결말은 추악합니다.

왜 작동하는가?

  • shell설명은 파일 시작 부분에서 시작됩니다. (모든 오프셋은 상징적입니다.)
  • zip설명은 문서 끝부분에서 시작됩니다. 모든 오프셋은 상대적입니다.

답변3

스크립트 끝에 마크업 태그를 추가하겠습니다. "ONLY_BINARY_AFTER_THIS_POINT:"가 내 태그라고 가정해 보겠습니다. 스크립트에는 다음 줄이 포함될 수 있습니다.

#!/usr/bin/env bash
# my_script.sh


# find the line number where my tag is in this file
line_number=$(grep -na -m1 "^ONLY_BINARY_AFTER_THIS_POINT:$" "$0"|cut -d':' -f1)
# next line is where contents of my binary file starts, use mathematical expansion to increase it by 1
$((line_number+=1))
# dump everything after $line_number of this script into somewhere I can access
tail -n +"${line_number}" "$0" > /tmp/my_binary_file.bin
# do further processing on /tmp/my_binary_file.bin


# don't forget the new line here and don't type in anything after this point
#                            ↓
ONLY_BINARY_AFTER_THIS_POINT:

그런 다음 스크립트에 바이너리를 추가할 수 있습니다.

cat my_script.sh my_binary_file.bin > my_appended_script.sh

중요한 것은 새 줄이 하나만 있어야 한다는 것입니다.다른 사람은 없어바이너리를 스크립트에 추가하기 전에. 또한 스크립트를 첨부한 후 편집할 경우에는 텍스트 편집기를 신중하게 선택해야 합니다. 텍스트 편집기는 스크립트를 저장할 때 일부 문자를 변경할 수 있습니다.

노트:스크립트에 직접 추가할 수도 있지만 ">>"를 추가하는 대신 리디렉션 ">"을 추가하면 스크립트를 덮어쓰게 됩니다.

관련 정보