/dev
と/proc
がマウントされていないchrootジェイルがあります。ここでプロセス置換を行おうとすると、次のようになります。
bash-4.4# cat <(ls)
cat: open /dev/fd/63: No such file or directory
/dev/fd
を手動で作成し、すべてのユーザーに十分な権限があることを確認しようとしましたが、役に立ちませんでした。
外部システムから何もマウントせずにこれを機能させる方法はありますか?
Linuxでは、/dev/fd
は/proc/self/fd
へのシンボリックリンクです。ここで、/proc/self
は、呼び出し元プロセスのプロセスディレクトリへのシンボリックリンクです。 /proc/$pid/fd
には、開いているファイルハンドルへのマジックリンクが含まれています。 Bashはこれを使用して、実際のファイルシステムに何も残さずにファイル名でアクセスできるパイプを作成します。
したがって、/proc
をマウントし、/dev/fd
シンボリックリンクを作成する必要があります。
あるいは、 マニュアル に従って、Bashにファイルシステムで名前付きパイプを使用させることが可能かどうかを確認することもできます。これはオプションである必要があります。
プロセス置換は、名前付きパイプ(FIFO)または開いているファイルに名前を付ける
/dev/fd
メソッドをサポートするシステムでサポートされています。
しかし、それは再コンパイルが必要なようです。 configure
スクリプトは、/dev/fd
が使用可能かどうかを自動的に検出しますが、config.h
で無効にして、行を削除できます。
#define HAVE_DEV_FD 1
(または、確認のために#undef HAVE_DEV_FD
に変更してください。間違いを犯さないでください。1
を0
に変更しても機能しません。)
これらの設定を使用すると、
$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay
ls
または実際にはパイプを読み取らない他のコマンドを使用してこれを行うと、パイプとシェルプロセスの両方が横になります。