为什么我们需要mktemp?

时间:2012-07-24 18:09:19

标签: linux shell filesystems

我不理解mktemp的功能以及临时文件的含义。

touch xyzmktemp xyz之间的区别是什么(除了mktemp会创建一些附加了xxx的文件且将拥有600个权限的事实?)

请澄清。

6 个答案:

答案 0 :(得分:51)

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攻击不起作用。

答案 1 :(得分:20)

您经常需要“暂存文件”(或目录)。此外,您可能需要同时使用多个此类文件,并且您不想打算如何命名它们以便没有冲突。

“mktemp”适合账单:)

答案 2 :(得分:9)

你自己回答:mktemp()保证一个独特的名字。

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

  

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

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

答案 3 :(得分:6)

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

  

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

     

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

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

  

触摸 - 更改文件时间戳

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

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

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

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