为什么我们需要mktemp?
我不明白mktemp
的功能和临时文件的含义。为什么我们需要mktemp?
请告诉我(除了一个事实,即mktemp
将创建XXX追加到它的一些文件,将有600个权限)
说touch xyz
和mktemp xyz
之间的区别,请澄清。
mktemp
随机化名称。 从安全角度来看这非常重要。
试想一下,你做这样的事情:
echo something > /tmp/temporary-file
在你的root运行的脚本。
有一个人(谁看了你的脚本)不
ln -s /etc/passwd /tmp/temporary-file
前
。
的mktemp
命令可以帮助你在这种情况下:
TEMP=$(mktemp /tmp/temporary-file.XXXXXXXX)
echo something > ${TEMP}
现在这个ln /etc/passwd
攻击将无法正常工作。
我不同意。将敏感数据放入/ tmp的根运行脚本应该确保它首先创建具有足够限制性权限的文件;即使使用mktemp,“攻击者”也可以继续扫描/ tmp以获取可读文件。安全性不是mktemp的主要目的;这是为了确保同一个程序的多个实例不会破坏每个其他临时文件。 – Lqueryvg 2014-11-28 22:31:23
@Lqueryvg:当然这是一种安全措施。请从CERT和许多其他与主题相关的文档中查看CWE-377和“临时文件 - CERT安全编码标准”。 – 2014-11-29 05:08:36
原始问题是为什么使用mktemp而不是使用 “说”触摸命令创建文件。答案是避免名称冲突 - 这可能会导致不可预知的行为和数据损坏(例如,如果脚本的两个实例同时运行)。当然,安全性也必须考虑,但这不是mktemp的存在理由。 – Lqueryvg 2014-11-29 11:27:54
你经常需要一个“暂存文件”(或目录)。此外,您可能需要同时使用多个这样的文件,而且您不想费心去弄清楚如何命名这些文件,因此没有冲突。
“mktemp的” 符合该法案:)
这是最正确的答案。这不是关于安全。主要原因是要确保相同的 程序或脚本(可能由相同或不同用户运行) 的多个实例不会覆盖彼此的临时运行时数据。 – Lqueryvg 2014-11-28 22:17:59
你自己回答了这个问题:mktemp()
保证了唯一的名称。
http://linux.die.net/man/3/mktemp
的mktemp的()函数生成从 模板一个唯一的临时文件名。模板的最后六个字符必须是XXXXXX,而这些 将替换为使文件名唯一的字符串。
但是,@ MarcB的评论(和手册页)指出,你不应该使用它:你应该使用mkstemp()来代替。
这个问题似乎是在询问有关'mktemp'命令的问题,在第1节中有记录,而不是第3节中记录的'mktemp()'库函数。前者的手册页不需要任何警告不要使用它。 – qqx 2014-04-02 12:50:25
其实它确实写在手册页。
mktemp - 创建一个临时文件或目录。
安全地创建临时文件或目录并打印其名称。
它创建一个文件或目录的安全意味着没有其他用户可以访问它,这就是为什么它的权限是600
触摸 - 修改文件时间戳
它只是改变的时间戳如果已经创建了文件,并且创建文件(如果不存在)。但是文件权限默认仍然是644。
欲了解更多详细核查以下手册页:
至少在bash shell中,你可以这样做:
dirpath="/tmp/dir1-$$/dir2-$$"
mkdir -p $dirpath
chmod -R 0700 /tmp/dir1-$$
例如。
还有一个额外的原因:并非所有系统都使用/tmp
作为临时目录。 例如https://termux.com/由于技术原因(它作为Android内部的进程运行),具有不同的长路径,因为它是tmp目录。
使用mktemp
创建临时文件或目录的脚本将是可移植的,并且也可以在这样的特殊环境中工作。
@MarcB原来的问题似乎在询问'mktemp'命令是否会在shell脚本中使用。这是安全的。这是在编译的程序中使用的'mktemp'库函数,这是不安全的。这与操作系统的现代化程度无关,它从来不是安全的,而是最初没有实现。 – qqx 2014-04-02 12:48:37