설치되지 않은 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로 변경하십시오 . 그리고 제가 저지른 실수를 저지르지 마십시오. 1
a로 변경하면 0
작동하지 않습니다.)
이 설정을 사용하면 얻을 수 있습니다
$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay
그러나 ls
다른 명령을 사용하여 이 작업을 수행하고 실제로 파이프를 읽지 않으면 파이프와 셸 프로세스가 모두 남게 됩니다.