在脚本中创建临时文件:mktemp相对于触摸文件的优势



虽然我可以用mktemptouch创建临时文件,但mktemp在脚本编写方面比手动touch创建文件有多大的可靠性和/或安全性?

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

想象一下,你做了这样的事情:

echo something > /tmp/temporary-file

在根运行脚本中。

有人(看过你的剧本)做

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或其替代品,它成为了事实上的标准。有趣的是,mktempC函数因不安全而遭到抨击。

您经常想要一个"scratchpad文件";(或目录)。此外,您可能同时需要多个这样的文件,而且您不想麻烦弄清楚如何命名它们,这样就不会有冲突。

mktemp符合要求:)

还有一个额外的原因:并非所有系统都使用/tmp作为临时目录。例如https://termux.com/由于技术原因(它在Android中作为进程运行),与tmp目录有不同的长路径。

使用mktemp创建临时文件或目录的脚本将是可移植的,也可以在这种特殊环境中工作。

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

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

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

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

触摸更改文件时间戳

如果文件已经创建,它只需更改文件的时间戳,如果不存在,则创建一个文件。但默认情况下,文件权限仍然是644。

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

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

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

至少在bash shell中,您可以执行以下操作:

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

例如。