我知道最好使用 创建临时文件mktemp
,但是命名管道呢?
我更喜欢尽可能兼容 POSIX,但仅 Linux 是可以接受的。正如我在 中所写的,避免侮辱是我唯一的硬性标准dash
。
ベストアンサー1
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"