在脚本中创建临时文件:mktemp 相对于触摸文件的优势? [已关闭]

问题描述 投票:0回答:5

虽然我可以使用

mktemp
touch
创建临时文件,但与手动
mktemp
创建文件相比,
touch
具体如何提高脚本编写的可靠性和/或安全性?

linux shell filesystems
5个回答
72
投票

mktemp
随机化名称。从安全角度来看,这非常重要。

想象一下你做了类似的事情:

echo something > /tmp/temporary-file

在您的 root 运行脚本中。

有人(读过你的剧本)会这样做

ln -s /etc/passwd /tmp/temporary-file

之前。

这会导致

/etc/passwd
被覆盖,并且可能意味着从系统开始的不同令人不快的事情被破坏,并以系统被黑客入侵结束(当输入
something
可以被精心设计时)。

在这种情况下,

mktemp
命令可以帮助您:

TEMP=$(mktemp /tmp/temporary-file.XXXXXXXX)
echo something > ${TEMP}

现在这个

ln /etc/passwd
攻击将不起作用。

简单了解 mktemp 的历史:

mktemp
命令是由 OpenBSD 人员发明的,并于 1997 年首次出现在 OpenBSD 2.1 中。他们的目标是提高 shell 脚本的安全性。以前的规范是在临时文件名中添加
$$
,这是绝对不安全的。现在所有 UNIX/Linux 系统都有
mktemp
或其替代方案,并且它成为事实上的标准。有趣的是,
mktemp
C 函数因不安全而被弃用。


42
投票

您经常需要一个“便签本文件”(或目录)。此外,您可能同时需要多个这样的文件,并且您不想费心去弄清楚如何命名它们,这样就不会发生冲突。

mktemp
符合要求:)


9
投票

还有一个额外的原因:并非所有系统都使用

/tmp
作为临时目录。 例如,由于技术原因,Termux具有不同的长路径(它作为Android内部的进程运行):

/data/data/com.termux/files/usr/tmp

使用

mktemp
创建临时文件或目录的脚本将是可移植的,并且也可以在此类特殊环境中工作。


8
投票

好吧,实际上它在手册页中写得很清楚。

mktemp - 创建临时文件或目录。

安全地创建临时文件或目录,并打印其名称。

它安全地创建文件或目录意味着没有其他用户可以访问它,这就是为什么它的权限是600

触摸 - 更改文件时间戳

它只是更改文件的时间戳(如果已创建)并创建文件(如果不存在)。但文件权限默认还是644。

有关更多详细信息,请查看以下手册页:

http://linux.die.net/man/1/mktemp

http://linux.die.net/man/1/touch


1
投票

至少在 bash shell 中你可以做类似的事情:

dirpath="/tmp/dir1-$$/dir2-$$"  
mkdir -p $dirpath  
chmod -R 0700 /tmp/dir1-$$  

例如。

© www.soinside.com 2019 - 2024. All rights reserved.