mktemp
を使用して一時ファイルを作成するのが最善の方法ですが、名前付きパイプはどうなりますか?
私は可能な限りPOSIXに準拠することを好みますが、Linuxのみが許容されます。私がdash
に書いているように、バシズムを回避することが私の唯一の難しい基準です。
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
既存のファイルまたはシンボリックリンクによってハイジャックされる傾向がある通常のファイルの作成とは異なり、 mkfifo
または 基になる関数 を介した名前パイプの作成=指定した場所に新しいファイルを作成するか、失敗します。何かのようなもの : >foo
は安全ではありません。攻撃者がmktemp
の出力を予測できる場合、攻撃者は自分用のターゲットファイルを作成できるためです。だが mkfifo foo
は、このようなシナリオでは失敗します。
完全なPOSIX移植性が必要な場合は、mkfifo -m 600 /tmp/myfifo
ハイジャックに対して安全ですが、サービス拒否の傾向があります。強力なランダムファイル名ジェネレータにアクセスできない場合は、再試行を管理する必要があります。
一時ファイルに関する微妙なセキュリティ問題を気にしない場合は、単純なルールに従うことができます。プライベートディレクトリを作成し、そこにすべてを保持します。
tmpdir=
cleanup () {
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"
より安全な代替策は、mktemp
を使用してディレクトリを安全に作成し、名前付きパイプをそのディレクトリ内に配置して、rm -R $dir
最後にそれを取り除くために。
「ドライラン」オプションを使用します。
mkfifo $(mktemp -ut pipe.XXX)
mktemp
を使用して一時ファイルを作成し、それを削除して、同じ名前の名前付きパイプを作成できます。
例えば:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
Unixではmkfifo
またはmknod
を使用します。2つの別々のプロセスが名前でパイプにアクセスできます。一方のプロセスはそれをリーダーとして開き、もう一方のプロセスはライターとして開くことができます。
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe
名前付きパイプは、他のファイルと同じように削除できます。
rm my_pipe
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
NamedPipeは、通常のファイルで一度だけ読み取ることができます。