回答:
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"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM
か?独自の変数展開を行うことができますか?
$tempdir
、trap
コマンドが評価されたときにコマンドが展開されます。この場合、値にtempdir
単一引用符が含まれているとコードがひどく壊れるのを除いて、違いはありませんが、私のコードは常に機能します。
$tempdir
はローカルに宣言され、トラップがアクセスできるようにグローバルに定義する必要があることが判明しました。作るには...今感じる
$tempdir
値が変わらない限り、これは基本的にすべての目的に受け入れられます。同じ名前を使用して複数の一時ファイル/
「ドライラン」オプションを使用します。
mkfifo $(mktemp -ut pipe.XXX)
-u
オプションの使用は「推奨されていません」。
-t
確実に機能する限り、私はそれを使います。
-t
は落胆しています。
mkstemp()
関数(linux.die.net/man/3/mkstemp)を呼び出す小さなCアプリケーションを作成します。-t
スイッチは、それが、落胆されていない-p
、私の悪いです。
を使用mktemp
して一時ファイルを作成し、それを削除して、同じ名前の名前付きパイプを作成できます。
例えば:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPE
前に削除すると、mkfifo
「安全でない」問題が回避されTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
ますか?
mkfifo
は、シェルからの通常の通常のファイル作成とは異なり、実際には安全です。そうでない場合、ファイルを作成してから削除してもまったく役に立ちません(実際、攻撃者がファイル名を推測することを要求しないため、攻撃者の仕事が大幅に促進されます)。したがって、dogbaneの答えは機能しますが、中間ファイルの作成は役に立たない複雑です。
mktemp
と呼ばれるマニュアルページをどのように知ってい-u
ますか?
mktemp -d
あなたを使ったとしても、あなたのインプットにはまだいくつかのポイントがあります。すべてのあなたの助けをありがとう、本当に感謝します!
mktemp -u
は、サービス拒否に対する保護を提供するため(生成する名前が十分に予測できない場合)、通常のファイルを作成する場合は安全ではありませんが、攻撃者がプログラムの鼻の下でファイルを作成することを防ぎません。通常のファイルの代わりにfifoを作成することは、manページが対処しないまれなユースケースです。
使用mkfifo
またはmknod
名前によってパイプにアクセスできる2つの独立したプロセスによってUnixの、中-ライターなどの他の一つのプロセスがリーダとして開くことができ、そして。
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は、一度だけ読み取るための通常のファイルとして使用できます。
mkfifo
ます。これは、一時ディレクトリの作成に関する問題よりも、一時的な名前付きパイプに関する私の質問には対応していませんmkdir
。
mktemp
を安全に作成するために対処する問題にどのように対処しますか?
mktemp
結果自体からnamedpipeを作成するシェル関数を使用します(もちろん、まず一時ファイルを削除してmkfifo
から、同じファイルで実行します)。 mktemp
一時ディレクトリを作成するために使用することもできます-t -d
。スイッチで試してください。