虽然我可以使用
mktemp
和 touch
创建临时文件,但与手动 mktemp
创建文件相比,touch
具体如何提高脚本编写的可靠性和/或安全性?
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 函数因不安全而被弃用。
您经常需要一个“便签本文件”(或目录)。此外,您可能同时需要多个这样的文件,并且您不想费心去弄清楚如何命名它们,这样就不会发生冲突。
mktemp
符合要求:)
还有一个额外的原因:并非所有系统都使用
/tmp
作为临时目录。
例如,由于技术原因,Termux具有不同的长路径(它作为Android内部的进程运行):
/data/data/com.termux/files/usr/tmp
使用
mktemp
创建临时文件或目录的脚本将是可移植的,并且也可以在此类特殊环境中工作。
好吧,实际上它在手册页中写得很清楚。
mktemp - 创建临时文件或目录。
安全地创建临时文件或目录,并打印其名称。
它安全地创建文件或目录意味着没有其他用户可以访问它,这就是为什么它的权限是600
触摸 - 更改文件时间戳
它只是更改文件的时间戳(如果已创建)并创建文件(如果不存在)。但文件权限默认还是644。
有关更多详细信息,请查看以下手册页:
至少在 bash shell 中你可以做类似的事情:
dirpath="/tmp/dir1-$$/dir2-$$"
mkdir -p $dirpath
chmod -R 0700 /tmp/dir1-$$
例如。