2012-07-24 28 views
36

我不明白mktemp的功能和临时文件的含义。为什么我们需要mktemp?

请告诉我(除了一个事实,即mktemp将创建XXX追加到它的一些文件,将有600个权限)

touch xyzmktemp xyz之间的区别,请澄清。

+7

@MarcB原来的问题似乎在询问'mktemp'命令是否会在shell脚本中使用。这是安全的。这是在编译的程序中使用的'mktemp'库函数,这是不安全的。这与操作系统的现代化程度无关,它从来不是安全的,而是最初没有实现。 – qqx 2014-04-02 12:48:37

回答

44

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攻击将无法正常工作。

+14

我不同意。将敏感数据放入/ tmp的根运行脚本应该确保它首先创建具有足够限制性权限的文件;即使使用mktemp,“攻击者”也可以继续扫描/ tmp以获取可读文件。安全性不是mktemp的主要目的;这是为了确保同一个程序的多个实例不会破坏每个其他临时文件。 – Lqueryvg 2014-11-28 22:31:23

+1

@Lqueryvg:当然这是一种安全措施。请从CERT和许多其他与主题相关的文档中查看CWE-377和“临时文件 - CERT安全编码标准”。 – 2014-11-29 05:08:36

+4

原始问题是为什么使用mktemp而不是使用 “说”触摸命令创建文件。答案是避免名称冲突 - 这可能会导致不可预知的行为和数据损坏(例如,如果脚本的两个实例同时运行)。当然,安全性也必须考虑,但这不是mktemp的存在理由。 – Lqueryvg 2014-11-29 11:27:54

12

你经常需要一个“暂存文件”(或目录)。此外,您可能需要同时使用多个这样的文件,而且您不想费心去弄清楚如何命名这些文件,因此没有冲突。

“mktemp的” 符合该法案:)

+3

这是最正确的答案。这不是关于安全。主要原因是要确保相同的 程序或脚本(可能由相同或不同用户运行) 的多个实例不会覆盖彼此的临时运行时数据。 – Lqueryvg 2014-11-28 22:17:59

9

你自己回答了这个问题:mktemp()保证了唯一的名称。

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

的mktemp的()函数生成从 模板一个唯一的临时文件名。模板的最后六个字符必须是XXXXXX,而这些 将替换为使文件名唯一的字符串。

但是,@ MarcB的评论(和手册页)指出,你不应该使用它:你应该使用mkstemp()来代替。

+6

这个问题似乎是在询问有关'mktemp'命令的问题,在第1节中有记录,而不是第3节中记录的'mktemp()'库函数。前者的手册页不需要任何警告不要使用它。 – qqx 2014-04-02 12:50:25

6

其实它确实写在手册页。

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

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

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

触摸 - 修改文件时间戳

它只是改变的时间戳如果已经创建了文件,并且创建文件(如果不存在)。但是文件权限默认仍然是644。

欲了解更多详细核查以下手册页:

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

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

0

至少在bash shell中,你可以这样做:

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

例如。

2

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

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