내부에 바이너리 실행 프로그램이 들어있는 bash 스크립트를 작성할 수 있습니까?바이너리 실행 파일을 포함하는 Bash 스크립트
나는 스크립트가 실행될 때이 스크립트에 의해 실행 가능 파일로 다시 덤프 될 텍스트 형식의 실행 파일 덤프를 포함하는 스크립트를 의미합니까?
추가 패키지를 설치하지 않고도 사용할 수있는 솔루션을 알고 싶습니다. 가능한가?
감사합니다.
내부에 바이너리 실행 프로그램이 들어있는 bash 스크립트를 작성할 수 있습니까?바이너리 실행 파일을 포함하는 Bash 스크립트
나는 스크립트가 실행될 때이 스크립트에 의해 실행 가능 파일로 다시 덤프 될 텍스트 형식의 실행 파일 덤프를 포함하는 스크립트를 의미합니까?
추가 패키지를 설치하지 않고도 사용할 수있는 솔루션을 알고 싶습니다. 가능한가?
감사합니다.
) 이것은 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
난에 진을 작성 회피하는 방법을 모른다 실행 전 임시 파일 ...
아주 좋은 답변입니다.'base64'는 모든 플랫폼에 기본적으로 설치되고'xxd' 헥스보다 더 작기 때문에 사용할 수있는 최상의 솔루션입니다. –
물론 있습니다!
echo $binary > file
그런 일을 많이 설치 스크립트가 있습니다
당신은 예를 들어 가진 파일에 바이너리를 덤프 할 수 있습니다.
'printf'% s ' "$ binary"> file'은'rm'으로'trap '을 'echo'는 추가 개행 문자를 추가합니다. '$ 바이너리'에서 백 슬래시로 이스케이프 된 문자의 처리뿐만 아니라이를 비활성화하는 방법은 'echo'의 구현에 따라 다를 수 있습니다. – chepner
'$ binary '에 NUL (ASCII 0), HT (ASCII 9), LF (ASCII 10) 또는 여러 연속 SP (ASCII 20) 시퀀스가 있거나'?'또는'*' ''nullglob' 옵션이 설정됩니다. 이것들은'$ binary '대신에''$ binary' '를 쓰면 해결할 수 있지만'$ binary'에 NUL이 있으면 실패합니다. 그것은 많은 (대부분?) 바이너리 파일의 딜 브레이커입니다. – ruakh
@chepner : 질문은 Bash를 지정합니다. – ruakh
바이너리를 텍스트로 변환 한 다음 uuencode/uudecode를 사용하여 다시 바이너리로 변환 할 수 있습니다.
http://linux.die.net/man/1/uuencode
그래서 당신은 바이너리 파일에 스크립트의 텍스트 출력을로 바이너리 데이터를 저장할 수 있습니다.
UUENCODE BinaryFile이>
그리고이 스크립트에 데이터 때 바이너리 파일을 사용 uudecode를을 만드는 것을 넣어 OUTPUT.TXT. 내가 전에이 같은 것을 해본 적이
시도해 보았습니다. 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
+1. 'base64'는'xxd'보다 더 적합합니다. 그것은 더 컴팩트 한 방법입니다. –
예,하지만 16 진수 덤프가있는 경우 xxd를 사용하십시오. – stark
그래서 내가 올바르게 얻은 경우 스크립트에 바이너리를 포함시키고 스크립트 종료시 스크립트를 실행하고 싶습니까? 여기
는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
을 실행하면 myscript
과 mybinary
이 모두 실행됩니다. 나중에 이진 파일에 rm
명령을 추가 할 수 있습니다.
또한 스크립트 끝 부분에서 을 잊지 마세요. 그렇지 않으면 바이너리 데이터를 계속 분석하고 시도하기 때문입니다.
tail -n +$lineCount \$0 | source /dev/stdin
을하지만 실제 바이너리에서 작동하지 않을 : 다른 스크립트가 아닌 바이너리와 함께 작업하는 경우
, 다음이 같은 파이프에서 실행할 수 있습니다. 또한 bash 버전이 4 이하인 경우에는 작동하지 않습니다.
다른 여러 답변과 마찬가지로 휠을 다시 열지 마십시오. 정확히 설계된 정확하게 shar 명령을 사용하십시오. 당신이 당신의 스크립트에 포함 할 파일을 가정
는단순히
$ shar binaryfile > binaryfile.shar
를 실행하고 설정,
binaryfile
입니다.
binaryfile.shar
이라는 쉘 스크립트가 있는데 실행하면
binaryfile
이 추출됩니다.
인텔의 MKL 설치 프로그램 스크립트에서이 작업을 수행했기 때문에 가능하다고 생각합니다. 나는 그것이 어떻게 행해졌는지 확실하지 않지만, 가능하다. – SethMMorton
[Embed a Executable Binary in shell script] (http://stackoverflow.com/questions/10491704/embed-a-executable-binary-in-a-shell-script) – mschilli
java 6 jdk는 이전에 가지고 있던 80+ MB'.sh' 파일 하나를 배포하는 형식으로, 스크립트는 "exit 0"행과 "binary"부분이있는 "ended"로 끝납니다. 스크립트는'tail $ {tail_args} +189 "$ 0"> $ outname'과 같은 라인으로 이진 파트를 추출했습니다. 체크섬과'chmod'에'sum '을하고'./$ outname'처럼 실행했습니다. – n611x007