chroot에서 "ls" 명령을 실행하는 방법은 무엇입니까?

chroot에서 "ls" 명령을 실행하는 방법은 무엇입니까?

브라우저 쉘이 있습니다벨트PHP에서 쉘 명령을 실행하고 이를 브라우저로 반환하는 중입니다. 방금 ls변경된 루트의 루트 디렉터리에서 실행하려는 chroot 명령을 발견했습니다. 실제로 bash -c "ls /"이것을 실행해야 합니다. sudo를 사용하면 작동하지 않습니다):

sudo chroot ~/projects/jcubic/leash ls

하지만 오류가 발생했습니다.

chroot: failed to run command ‘ls’: No such file or directory

이 명령을 올바르게 사용하고 있습니까? 다른 루트 디렉토리에서 ls를 실행할 수 있습니까?

sudo 없이 chroot를 실행하려고 하면 다음 오류가 발생합니다.

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted

답변1

chroot: failed to run command ‘ls’: No such file or directory

chroot에서 명령을 실행하려면 chroot에서 프로그램을 사용할 수 있도록 해야 합니다( /파일 시스템에 설치된 프로그램을 사용할 수 없기 때문입니다).

가장 쉬운 방법은 /usr/bin/ls에서 로 복사 하는 것입니다 /home/kuba/projects/jcubic/leash/usr/bin/(종속 공유 라이브러리도 필요합니다) ldd /usr/bin/ls.

답변2

ls다른 루트 디렉터리에서 실행할 수 있지만 ls명령과 해당 명령이 종속된 모든 파일은 해당 루트 디렉터리에 있어야 합니다. 명령 을 시작한 ls다음 프로세스 내에서 루트를 변경할 수 없습니다. ls해당 기능이 없습니다.

chroot의 전체 목적은 파일의 가시성을 특정 디렉토리 아래의 파일로 제한하는 것입니다. 명령을 실행하면 자체 프로세스의 루트 디렉터리가 변경되고(루트 디렉터리 변경은 이 작업을 수행하는 프로세스와 이후에 실행되는 모든 프로세스에만 영향을 미침) 검색 경로의 디렉터리에서 호출된 실행 파일을 실행하려고 시도 chroot ~/projects/jcubic/leash ls합니다 . 이것이 이제 루트 디렉터리이므로 실행 파일은 .chrootls~/projects/jcubic/leash~/projects/jcubic/leash/bin

chroot에 일반 시스템을 두고 일반 명령을 사용하려면 하나 설치해야 합니다. 다음과 같은 도구부팅 방지 프로그램(Debian 시스템 설치) 또는 Docker(Chrooted 및 제한된 환경 설정)와 같은 구성 도구가 도움이 될 수 있습니다.

명령 만 필요한 경우 에도 ls여러 ls. 동적으로 링크된 프로그램이기 때문에 동적 로더와 이것이 의존하는 모든 동적 라이브러리가 필요합니다. 필수 동적 라이브러리를 나열하려면 실행하세요 . 예를 들어:lslslsldd /bin/ls

mkdir -p bin lib/x86_64-linux-gnu
rsync -a /bin/ls bin/
rsync -a /lib/x86_64-linux-gnu/ lib/x86_64-linux-gnu/
chroot . ls

또는 더 간단한 탐색 방법은 정적으로 연결된 바이너리를 얻는 것입니다.바쁜 상자(Debian 및 그 파생 제품에서 패키지로 사용 가능 busybox-static)

cp /bin/busybox .
chroot . ./busybox ls

관련 정보