Linux

Shell Script mktemp,創建臨時命名管道的最佳方法是什麼?

  • May 16, 2020

我知道最好用 . 創建臨時文件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"

引用自:https://unix.stackexchange.com/questions/29851