Bash - /dev 및 /proc 없이 chroot에서 프로세스 교체

Bash - /dev 및 /proc 없이 chroot에서 프로세스 교체

설치되지 않은 chroot /dev감옥이 있습니다 /proc. 여기서 프로세스 교체를 시도하면 이런 일이 발생합니다.

bash-4.4# cat <(ls)   
cat: open /dev/fd/63: No such file or directory

수동으로 생성하고 모든 사용자에게 충분한 권한이 있는지 확인하려고 시도했지만 /dev/fd도움이 되지 않았습니다.

외부 시스템에서 아무것도 설치하지 않고 이 작업을 수행할 수 있는 방법이 있습니까?

답변1

Linux에서 는 /dev/fd에 대한 심볼릭 링크입니다 /proc/self/fd. 여기서 는 /proc/self호출 프로세스의 프로세스 디렉터리에 대한 심볼릭 링크입니다. /proc/$pid/fd그런 다음 열린 파일 핸들에 대한 매직 링크를 포함합니다. Bash는 이를 사용하여 실제 파일 시스템에 아무 것도 남기지 않고 파일 이름으로 액세스할 수 있는 파이프를 만듭니다.

따라서 심볼릭 링크를 설치 /proc하고 생성 해야 합니다./dev/fd

또는 다음과 같이 Bash가 파일 시스템에서 명명된 파이프를 사용하도록 할 수 있는지 확인할 수 있습니다.수동, 옵션이어야 합니다.

/dev/fd프로세스 대체는 명명된 파이프(FIFO) 또는 명명된 파일 열기 방법을 지원하는 시스템에서 지원됩니다.

하지만 이 경우 재컴파일이 필요한 것 같습니다. 스크립트는 사용 가능한지 configure자동으로 감지 /dev/fd하지만 에서 비활성화하고 config.h줄을 제거할 수 있습니다.

#define HAVE_DEV_FD 1

#undef HAVE_DEV_FD(또는 확실히 하기 위해 a로 변경하십시오 . 그리고 제가 저지른 실수를 저지르지 마십시오. 1a로 변경하면 0작동하지 않습니다.)

이 설정을 사용하면 얻을 수 있습니다

$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay

그러나 ls다른 명령을 사용하여 이 작업을 수행하고 실제로 파이프를 읽지 않으면 파이프와 셸 프로세스가 모두 남게 됩니다.

관련 정보