Bash - chroot 中的进程替换,无需 /dev 和 /proc

Bash - chroot 中的进程替换,无需 /dev 和 /proc

我有一个没有安装的 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以确保。并且不要犯我犯的错误:将其更改1为 a0不起作用。)

通过这些设置,您将获得

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

不过,如果您使用ls其他命令执行此操作,但实际上并没有读取管道,则管道和 shell 进程都会留下来。

相关内容