2013-08-23 2 views
5

내부에 바이너리 실행 프로그램이 들어있는 bash 스크립트를 작성할 수 있습니까?바이너리 실행 파일을 포함하는 Bash 스크립트

나는 스크립트가 실행될 때이 스크립트에 의해 실행 가능 파일로 다시 덤프 될 텍스트 형식의 실행 파일 덤프를 포함하는 스크립트를 의미합니까?

추가 패키지를 설치하지 않고도 사용할 수있는 솔루션을 알고 싶습니다. 가능한가?

감사합니다.

+0

인텔의 MKL 설치 프로그램 스크립트에서이 작업을 수행했기 때문에 가능하다고 생각합니다. 나는 그것이 어떻게 행해졌는지 확실하지 않지만, 가능하다. – SethMMorton

+1

[Embed a Executable Binary in shell script] (http://stackoverflow.com/questions/10491704/embed-a-executable-binary-in-a-shell-script) – mschilli

+0

java 6 jdk는 이전에 가지고 있던 80+ MB'.sh' 파일 하나를 배포하는 형식으로, 스크립트는 "exit 0"행과 "binary"부분이있는 "ended"로 끝납니다. 스크립트는'tail $ {tail_args} +189 "$ 0"> $ outname'과 같은 라인으로 이진 파트를 추출했습니다. 체크섬과'chmod'에'sum '을하고'./$ outname'처럼 실행했습니다. – n611x007

답변

4

) 이것은 b.bash 스크립트 바이너리를 포함 (간단한 개발을위한 원래 스크립트)

(a.bash)

#!/bin/bash 

if [ "$0" == "b.bash" ];then 
    tail -n +$[ `grep -n '^BINARY' $0|cut -d ':' -f 1` + 1 ] $0 | base64 -d > a2.out 
    chmod +x a2.out 
    ./a2.out 
    echo $? 
    exit 
fi 

cat "$0" > b.bash 
echo "BINARY" >> b.bash 
cat > a.c << EOF 
int  main(){ 
     return 12; 
} 
EOF 
gcc a.c 
base64 a.out >> b.bash 
를 작성, 일부 C 소스를 컴파일

은 (a.bash가 b.bash 생성)를 호출합니다

bash a.bash ;bash b.bash 

난에 진을 작성 회피하는 방법을 모른다 실행 전 임시 파일 ...

+1

아주 좋은 답변입니다.'base64'는 모든 플랫폼에 기본적으로 설치되고'xxd' 헥스보다 더 작기 때문에 사용할 수있는 최상의 솔루션입니다. –

-1

물론 있습니다!

echo $binary > file 

그런 일을 많이 설치 스크립트가 있습니다

당신은 예를 들어 가진 파일에 바이너리를 덤프 할 수 있습니다.

+1

'printf'% s ' "$ binary"> file'은'rm'으로'trap '을 'echo'는 추가 개행 문자를 추가합니다. '$ 바이너리'에서 백 슬래시로 이스케이프 된 문자의 처리뿐만 아니라이를 비활성화하는 방법은 'echo'의 구현에 따라 다를 수 있습니다. – chepner

+1

'$ binary '에 NUL (ASCII 0), HT (ASCII 9), LF (ASCII 10) 또는 여러 연속 SP (ASCII 20) 시퀀스가 ​​있거나'?'또는'*' ''nullglob' 옵션이 설정됩니다. 이것들은'$ binary '대신에''$ binary' '를 쓰면 해결할 수 있지만'$ binary'에 NUL이 있으면 실패합니다. 그것은 많은 (대부분?) 바이너리 파일의 딜 브레이커입니다. – ruakh

+0

@chepner : 질문은 Bash를 지정합니다. – ruakh

1

바이너리를 텍스트로 변환 한 다음 uuencode/uudecode를 사용하여 다시 바이너리로 변환 할 수 있습니다.

http://linux.die.net/man/1/uuencode

그래서 당신은 바이너리 파일에 스크립트의 텍스트 출력을로 바이너리 데이터를 저장할 수 있습니다.

UUENCODE BinaryFile이>

그리고이 스크립트에 데이터 때 바이너리 파일을 사용 uudecode를을 만드는 것을 넣어 OUTPUT.TXT. 내가 전에이 같은 것을 해본 적이

4

시도해 보았습니다. 16 진수는 xxd로 생성되었습니다.

#!/bin/bash 

xxd -r >foo <<'EndHere' 
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 
0000010: 0200 3e00 0100 0000 e003 4000 0000 0000 ..>[email protected] 
0000020: 4000 0000 0000 0000 000a 0000 0000 0000 @............... 
0000030: 0000 0000 4000 3800 0800 4000 1e00 1b00 [email protected]@..... 
0000040: 0600 0000 0500 0000 4000 0000 0000 0000 [email protected] 
0000050: 4000 4000 0000 0000 4000 4000 0000 0000 @[email protected]@[email protected] 
... 
0001960: 6400 5f65 6461 7461 006d 6169 6e00 5f69 d._edata.main._i 
0001970: 6e69 7400        nit. 
EndHere 
chmod +x foo 
./foo 
+2

+1. 'base64'는'xxd'보다 더 적합합니다. 그것은 더 컴팩트 한 방법입니다. –

+0

예,하지만 16 진수 덤프가있는 경우 xxd를 사용하십시오. – stark

0

그래서 내가 올바르게 얻은 경우 스크립트에 바이너리를 포함시키고 스크립트 종료시 스크립트를 실행하고 싶습니까? 여기

binarymaker 스크립트 (이것은 단지 바이너리를 추출하는 스크립트를 작성하지 않지만, 이진 어떤 스크립트를 병합)입니다 :

#!/bin/bash 

lineCount=$(wc -l "$1" | cut -f 1 -d ' ') # just get the line count 
((lineCount+=2)) # because we are going to append a line 

head -n 1 "$1" > "$3" # this is done to ensure that shebang is preserved 
echo "trap 'tail -n +$lineCount \$0 > binary; chmod +x binary; ./binary' EXIT" >> "$3" 
tail -n +2 "$1" >> "$3" 
cat "$2" >> "$3" 

exit 0 

당신이

./binarymaker myscript mybinary resultscript 
처럼 실행해야합니다

resultscript을 실행하면 myscriptmybinary이 모두 실행됩니다. 나중에 이진 파일에 rm 명령을 추가 할 수 있습니다.

또한 스크립트 끝 부분에서 을 잊지 마세요. 그렇지 않으면 바이너리 데이터를 계속 분석하고 시도하기 때문입니다.

tail -n +$lineCount \$0 | source /dev/stdin 

을하지만 실제 바이너리에서 작동하지 않을 : 다른 스크립트가 아닌 바이너리와 함께 작업하는 경우

, 다음이 같은 파이프에서 실행할 수 있습니다. 또한 bash 버전이 4 이하인 경우에는 작동하지 않습니다.

1

다른 여러 답변과 마찬가지로 휠을 다시 열지 마십시오. 정확히 설계된 정확하게 shar 명령을 사용하십시오. 당신이 당신의 스크립트에 포함 할 파일을 가정

단순히

$ shar binaryfile > binaryfile.shar 

를 실행하고 설정, binaryfile입니다. binaryfile.shar이라는 쉘 스크립트가 있는데 실행하면 binaryfile이 추출됩니다.

+1

하지만'sharutils' 패키지가 설치되어 있어야합니다. 이것은 기본값이 아닙니다. 'base64 '는 GNU coreutils의 일부이기 때문에 항상 사용할 수 있습니다. – erik

+0

@erik 당신은 OP가 Gnu/Linux를 사용하고 있다고 가정하지만, 이것은 명시되어 있지 않습니다. 'base64'는'shar'보다 POSIX가 아니므로 유닉스 플랫폼에서 사용할 수있는 것은 아닙니다. – jlliagre

관련 문제