나는 완전히 작동하는 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 가 여기에 쓸 수 있습니다.chroot
chroot
exec
echo
chroot
chroot
echo
이는 의도적인 기능입니다. 다른 프로세스가 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 사용).