我知道最好使用 创建临时文件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 中使用mkfifo
或mknod
,其中两个单独的进程可以通过名称访问管道 - 一个进程可以作为读取器打开它,另一个进程可以作为写入器打开它。
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 可以用作仅读取一次的常规文件。