Linux
Shell Script mktemp,創建臨時命名管道的最佳方法是什麼?
我知道最好用 . 創建臨時文件
mktemp
,但是命名管道呢?我更喜歡盡可能符合 POSIX 標準,但僅 Linux 是可以接受的。正如我在
dash
.
tmppipe=$(mktemp -u) mkfifo -m 600 "$tmppipe"
與容易被現有文件或符號連結劫持的正常文件創建不同,創建名稱管道
mkfifo
或底層函式要麼在指定位置創建新文件,要麼失敗。類似的東西: >foo
是不安全的,因為如果攻擊者可以預測輸出,mktemp
那麼攻擊者可以為自己創建目標文件。但mkfifo foo
在這種情況下會失敗。如果您需要完整的 POSIX 可移植性,
mkfifo -m 600 /tmp/myfifo
可以安全地防止劫持但容易出現拒絕服務;如果沒有強大的隨機文件名生成器,您將需要管理重試嘗試。如果您不關心臨時文件周圍的細微安全問題,您可以遵循一個簡單的規則:創建一個私有目錄,並將所有內容保存在那裡。
tmpdir= cleanup () { trap - EXIT if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi if [ -n "$1" ]; then trap - $1; kill -$1 $$; fi } tmpdir=$(mktemp -d) trap 'cleanup' EXIT trap 'cleanup HUP' HUP trap 'cleanup TERM' TERM trap 'cleanup INT' INT mkfifo "$tmpdir/pipe"