chroot 환경에서는 리디렉션을 수행할 수 없습니다.

chroot 환경에서는 리디렉션을 수행할 수 없습니다.

나는 완전히 작동하는 debootstrap-ed arm chroot 환경을 설정했습니다. chroot그 안에서 명령 등을 실행할 수 있습니다 .

나는 사용자 정의 chroot 환경에 대한 스크립트를 만들고 있는데 그것으로 어려움을 겪고 있습니다.

예를 들어:

chroot $target_dir echo this is a test > /tmp/test

이 예에서 내가 얻은 출력이 chrooted가 아닌 호스트 환경에 기록되는 이유를 설명할 수 있는 사람이 있습니까?

언급하자면, 나는 fe를 실행할 수 있습니다

echo this is a test > $target_dir/tmp/test

하지만 chrooted 실행이 "실패"하는 이유를 알고 싶습니다.

편집하다:

이것은 또한 작동합니다:

chroot $target_dir /bin/bash -c "echo test > /tmp/test"

답변1

실행할 때:

chroot $target_dir echo this is a test > /tmp/test

이것은 > /tmp/test당신이 쓴 것처럼 "chroot" 명령으로 발생합니다:

> /tmp/test chroot $target_dir echo this is a test

chroot 명령 내에서 리디렉션이 발생하도록 하려면 한 가지 방법은 다음과 같습니다.

chroot $target_dir sh -c 'echo this is a test > /tmp/test'

sh...이것은 echo가 올바른 리디렉션 디렉터리를 볼 수 있도록 chroot에 저장되기 때문입니다 .

답변2

리디렉션은 실제로 발생하지 않습니다 chroot. > /tmp/test사용하는 쉘에 의해 처리됩니다. 실제로 합격 > /tmp/test하면chroot, 그리고 에 전달되면 다음과 같이 echo표시됩니다.

this is a test > /tmp/test

귀하의 터미널에서. 물론 쉘은 chroot편집되지 않으므로 열어도 괜찮습니다 /tmp/test. 그런 다음 시스템 호출을 호출하는 쉘 exec의 실행 파일이 s에 들어가고 마지막으로 fd에 씁니다. 이 프로세스 전반에 걸쳐 (편집되지 않은) 셸에서 열린 원본 파일 설명자는 수정되지 않으므로 ed 가 여기에 쓸 수 있습니다.chrootchrootexecechochrootchrootecho

이는 의도적인 기능입니다. 다른 프로세스가 chroot파일을 열 수 있도록 허용하면 하위 프로세스는 상위 프로세스에서 전달한 파일 이외의 파일 chroot에만 액세스할 수 있습니다 .chroot

리디렉션을 원하는 경우~에chroot의 경우 이를 해석하는 방법을 아는 쉘을 생성해야 합니다.

chroot $dir bash -c "echo this is a test > /tmp/test"

이제 작업 순서는 다음과 같습니다: ( fork기본 stdin, stdout 및 stderr 사용), exec chroot( chroot이제 chroot 내부), exec bash(리디렉션 처리 방법 알아보기), fork(구현 세부 사항 bash), 파일 열기, exec echo(새 stdout 사용).

관련 정보