나는 그 유명한 것을 읽고 있다.유닉스 복구 범례, 갑자기 알고 싶습니다.
BusyBox 셸을 열고 BusyBox 바이너리 자체가 삭제된 경우에도 BusyBox 바이너리에 포함된 모든 명령을 사용할 수 있습니까?
분명히 이 명령의 BB 버전을 사용할 수 없습니다다른bash
BusyBox 파일 자체는 bash
열리지 않고 실행 되지 않으므로 와 같은 셸을 실행하세요 . 그러나 실행 중인 BusyBox 인스턴스에서는 BB가 두 가지 방법으로 명령을 실행할 수 있는 것 같습니다.
- BusyBox의 새 인스턴스를 포크 및 실행하고, 적절한 이름으로 호출하고, 디스크에서 BusyBox 파일을 읽어 이 작업을 수행합니다.
- 지정된 명령을 실행하기 위해 일부 내부 논리를 분기하고 실행할 수 있습니다(예: 함수 호출로 실행).
(1)이 BusyBox가 작동하는 방식이라면 BB 바이너리를 제거한 후 BusyBox에서 제공하는 일부 명령을 실행 중인 BB 인스턴스에서 사용할 수 없게 될 것으로 예상할 수 있습니다.
(2)가 이와 같이 작동하는 경우 BusyBox는 BB 자체가 삭제된 시스템을 복구하는 데에도 사용할 수 있습니다. 단, 여전히 액세스 가능하고 실행 중인 BusyBox 인스턴스가 있어야 합니다.
이것은 어디에도 문서화되어 있습니까? 그렇지 않다면 안전하게 테스트할 수 있는 방법이 있나요?
답변1
기본적으로 BusyBox는 내장된 애플릿(나열된 명령 사용)에서 busybox --help
특별한 작업을 수행 하지 않습니다.
그러나 컴파일 타임에 FEATURE_SH_STANDALONE
및 옵션이 활성화된 경우 FEATURE_PREFER_APPLETS
BusyBox sh1이 알려진 애플릿 이름으로 명령을 실행할 때 일반 PATH
조회를 수행하지 않고 대신 바로가기를 통해 내장 애플릿을 실행합니다.
- 소스 코드에서 "noexec"로 선언된 애플릿은 분기된 프로세스에서 함수 호출로 실행됩니다. BusyBox 1.22 부터 다음 애플릿은 noexec 입니다 : ,
chgrp
,chmod
,chown
,cksum
,cp
,cut
,dd
,dos2unix
,env
,fold
,hd
,head
,hexdump
,ln
,ls
,md5sum
, , , , , .mkfifo
mknod
sha1sum
sha256sum
sha3sum
sha512sum
sort
tac
unix2dos
- 소스 코드에서 "nofork"로 선언된 애플릿은 동일한 프로세스에서 함수 호출로 실행됩니다. BusyBox 1.22 부터 다음 애플릿은 nofork입니다 :
[[
,[
,basename
,cat
,dirname
,echo
,false
,fsync
,length
,logname
,mkdir
,printenv
,printf
,pwd
,rm
,rmdir
,seq
,sync
,test
, , .true
usleep
whoami
yes
- 다른 애플릿은 및 를 사용하여 이 작업을 수행
fork
하지만 BusyBox는execve
조회를 수행하지 않고 대신 가능한 경우 경로를 수행하고(일반적으로 Linux의 경우) 그렇지 않은 경우 컴파일 시간에 정의된 경로를 수행합니다.PATH
/proc/self/exe
이에 대한 자세한 내용은 다음 문서에 설명되어 있습니다.docs/nofork_noexec.txt
. 애플릿 선언은 다음 위치에 있습니다.include/applets.src.h
소스 코드에서.
대부분의 기본 구성에서는 BusyBox가 다른 셸처럼 외부 명령을 실행하도록 이러한 기능을 해제합니다. 데비안은 두 버전 모두에서 이러한 기능을 활성화합니다.busybox
그리고busybox-static
가방.
FEATURE_SH_STANDALONE
따라서 BusyBox 실행 파일을 사용하고 컴파일한 경우 실행 파일이 삭제되더라도 FEATURE_PREFER_APPLETS
BusyBox 셸에서 모든 BusyBox 명령을 실행할 수 있습니다(사용할 수 없는 경우 위에 나열되지 않은 애플릿 제외 )./proc/self/exe
1 BusyBox에는 실제로 ash와 hush의 두 가지 "sh" 구현이 있지만 이 점에서는 동일하게 작동합니다.
답변2
답변3
is there a way to safely test it?
이는 명령의 오류 메시지를 통해 확인할 수 있습니다. busybox에서 명시적으로 호출할 때 동일하면 "adventure"는 실패합니다.
내 시스템에서 sash
쉘을 실행하면 여전히 사용할 수 있습니다.
user@ulmus-thomasii:~$ echo mv b | busybox sh
mv: Fehlender Zieldatei‐Operand hinter 'b'
„mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ /bin/mv b
/bin/mv: Fehlender Zieldatei‐Operand hinter 'b'
„/bin/mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ echo mv b | sash
mv: Fehlender Zieldatei‐Operand hinter 'b'
„mv --help“ liefert weitere Informationen.
user@ulmus-thomasii:~$ echo -mv b | sash
usage: -mv srcName ... destName
user@ulmus-thomasii:~$