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"

答え2

更安全的替代方法是使用mktemp安全地创建目录,然后将命名管道放入该目录中,rm -R $dir最后执行删除它。

答え3

使用“试运行”选项:

mkfifo $(mktemp -ut pipe.XXX)

答え4

在 Unix 中使用mkfifomknod,其中两个单独的进程可以通过名称访问管道 - 一个进程可以作为读取器打开它,另一个进程可以作为写入器打开它。

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 可以用作仅读取一次的常规文件。

http://www.linuxjournal.com/article/2156

関連情報