BusyBox 명령이 실제로 내장되어 있나요?

BusyBox 명령이 실제로 내장되어 있나요?

나는 그 유명한 것을 읽고 있다.유닉스 복구 범례, 갑자기 알고 싶습니다.

BusyBox 셸을 열고 BusyBox 바이너리 자체가 삭제된 경우에도 BusyBox 바이너리에 포함된 모든 명령을 사용할 수 있습니까?

분명히 이 명령의 BB 버전을 사용할 수 없습니다다른bashBusyBox 파일 자체는 bash열리지 않고 실행 되지 않으므로 와 같은 셸을 실행하세요 . 그러나 실행 중인 BusyBox 인스턴스에서는 BB가 두 가지 방법으로 명령을 실행할 수 있는 것 같습니다.

  1. BusyBox의 새 인스턴스를 포크 및 실행하고, 적절한 이름으로 호출하고, 디스크에서 BusyBox 파일을 읽어 이 작업을 수행합니다.
  2. 지정된 명령을 실행하기 위해 일부 내부 논리를 분기하고 실행할 수 있습니다(예: 함수 호출로 실행).

(1)이 BusyBox가 작동하는 방식이라면 BB 바이너리를 제거한 후 BusyBox에서 제공하는 일부 명령을 실행 중인 BB 인스턴스에서 사용할 수 없게 될 것으로 예상할 수 있습니다.

(2)가 이와 같이 작동하는 경우 BusyBox는 BB 자체가 삭제된 시스템을 복구하는 데에도 사용할 수 있습니다. 단, 여전히 액세스 가능하고 실행 중인 BusyBox 인스턴스가 있어야 합니다.

이것은 어디에도 문서화되어 있습니까? 그렇지 않다면 안전하게 테스트할 수 있는 방법이 있나요?

답변1

기본적으로 BusyBox는 내장된 애플릿(나열된 명령 사용)에서 busybox --help특별한 작업을 수행 하지 않습니다.

그러나 컴파일 타임에 FEATURE_SH_STANDALONE및 옵션이 활성화된 경우 FEATURE_PREFER_APPLETSBusyBox sh1이 알려진 애플릿 이름으로 명령을 실행할 때 일반 PATH조회를 수행하지 않고 대신 바로가기를 통해 내장 애플릿을 실행합니다.

  • 소스 코드에서 "noexec"로 선언된 애플릿은 분기된 프로세스에서 함수 호출로 실행됩니다. BusyBox 1.22 부터 다음 애플릿은 noexec 입니다 : , chgrp, chmod, chown, cksum, cp, cut, dd, dos2unix, env, fold, hd, head, hexdump, ln, ls, md5sum, , , , , .mkfifomknodsha1sumsha256sumsha3sumsha512sumsorttacunix2dos
  • 소스 코드에서 "nofork"로 선언된 애플릿은 동일한 프로세스에서 함수 호출로 실행됩니다. BusyBox 1.22 부터 다음 애플릿은 nofork입니다 : [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, , .trueusleepwhoamiyes
  • 다른 애플릿은 및 를 사용하여 이 작업을 수행 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_APPLETSBusyBox 셸에서 모든 BusyBox 명령을 실행할 수 있습니다(사용할 수 없는 경우 위에 나열되지 않은 애플릿 제외 )./proc/self/exe

1 BusyBox에는 실제로 ash와 hush의 두 가지 "sh" 구현이 있지만 이 점에서는 동일하게 작동합니다.

답변2

is there a way to safely test it?일반 x86 openwrt 이미지 사용:

V박스 스크린샷

대부분의 명령은 내장되어 있지 않지만 echo및 와 같은 일부 명령은 내장되어 있습니다 printf. 임의의 콘텐츠로 바이너리를 생성하는 것이 가능 printf하지만 이는 chmod +x문제가 될 수 있습니다.

답변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:~$ 

관련 정보