Shell 脚本 mktemp,创建临时命名管道的最佳方法是什么?

Shell 脚本 mktemp,创建临时命名管道的最佳方法是什么?

我知道最好使用 创建临时文件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"

おすすめ記事