web-dev-qa-db-ja.com

シェルスクリプトmktemp、一時的な名前付きパイプを作成する最良の方法は何ですか?

mktempを使用して一時ファイルを作成するのが最善の方法ですが、名前付きパイプはどうなりますか?

私は可能な限りPOSIXに準拠することを好みますが、Linuxのみが許容されます。私がdashに書いているように、バシズムを回避することが私の唯一の難しい基準です。

31
J. M. Becker
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最後にそれを取り除くために。

3
David Parks

「ドライラン」オプションを使用します。

mkfifo $(mktemp -ut pipe.XXX)
2
polemon

mktempを使用して一時ファイルを作成し、それを削除して、同じ名前の名前付きパイプを作成できます。

例えば:

TMPPIPE=$(mktemp -t pipe.XXX) && {
    rm -f $TMPPIPE
    mkfifo $TMPPIPE
}
1
dogbane

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は、通常のファイルで一度だけ読み取ることができます。

http://www.linuxjournal.com/article/2156

0
Nikhil Mulley