为什么我们需要mktemp?

She*_*fer 49 linux filesystems shell

我不明白mktemp临时文件的功能和意义.

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

请澄清.

Igo*_*bin 54

mktemp随机化名称.从安全角度来看这非常重要.

试想一下你做的事情:

echo something > /tmp/temporary-file
Run Code Online (Sandbox Code Playgroud)

在你的root运行脚本中.

有人(已经读过你的剧本)的确如此

ln -s /etc/passwd /tmp/temporary-file
Run Code Online (Sandbox Code Playgroud)

之前.

mktemp在这种情况下,该命令可以帮助您:

TEMP=$(mktemp /tmp/temporary-file.XXXXXXXX)
echo something > ${TEMP}
Run Code Online (Sandbox Code Playgroud)

现在这种ln /etc/passwd攻击不起作用.

  • 我不同意.将敏感数据放入/ tmp的根运行脚本应该确保它首先创建具有足够限制权限的文件; 即使使用mktemp,"攻击者"也可以继续扫描/ tmp以获取可读文件.安全不是mktemp的主要目的; 这是为了确保同一程序的多个实例不会破坏彼此的临时文件. (30认同)
  • 不,我不会删除我的评论。我和这里的其他人一样有发言权。另外,说我的评论有害是荒谬的。我并不是说安全不重要;我只是说安全不重要。如果有的话我说相反。开发人员关心临时文件安全性的用例和他们不关心的其他用例都会存在。但说使用“mktemp”的主要原因是安全是完全错误的。这就是我对此答案发表评论的原因。 (9认同)
  • 最初的问题是为什么使用mktemp而不是使用"说"touch命令来创建文件.答案是避免名称冲突 - 这可能导致不可预测的行为和数据损坏(例如,如果脚本的两个实例同时运行).当然也必须考虑安全性,但这不是mktemp的存在理由. (7认同)
  • @Lqueryvg 像你这样的评论是 StackOverflow 危险的一半......另一半是那些相信他们读到的第一件事而没有进一步挖掘的人。mktemp 的联机帮助页不断提到安全、保护、攻击和安全、FFS。感谢那些提供上下文的人! (6认同)
  • @Lqueryvg 删除您的评论。他们的错误是**有害的**。`mktemp` 增加了安全性,因为 `touch foo`、`>foo` 和 `>>foo` 对于链接竞争都是不安全的。然后,可以建立链接的用户可以作为运行脚本的用户写入任意文件。这可以实现各种攻击。如果脚本由 root 运行,在许多系统上都包含权限升级!**如果您不明白这是为什么或如何发生,请提出问题**。但这些评论正在导致并证实继续使用危险的不安全做法。删除它们。 (3认同)
  • @Lqueryvg 就安全性而言,您的第一条评论是无关紧要的。问题不在于在 /tmp 中写入敏感数据。你错了。这里的安全问题是允许覆盖任意文件的内容。我会看看我是否可以改进答案,因为不可否认的是,它并没有足够清楚地解释实际问题是什么。 (3认同)
  • @Lqueryvg:当然,这是一种安全措施。请查看CWE-377和CERT的“临时文件-CERT安全编码标准”以及与该主题相关的许多其他文档。 (2认同)
  • @lee-gaines 不,这正是问题所在。如果文件存在,`touch`、`>` 和 `>>` 不会出错。`touch` 和 `>>` 的真正目的是处理已经存在的文件(它们恰好也创建不存在的文件,因为对于它们应该做的工作来说,这是很好的设计)。`>` 的目的是创建“新”文件,但以**以内容为中心**的方式:它将打开现有文件并删除其所有内容。尽管某些 shell 确实有“无破坏”选项,但您可以打开“>>”和“>”以在现有文件上出错。 (2认同)

pau*_*sm4 24

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

"mktemp"适合账单:)

  • 这是最正确的答案.这与安全无关.主要原因是确保同一程序或脚本的多个实例(可能由相同或不同的用户运行)不会覆盖彼此的临时运行时数据. (10认同)
  • 叹。我并没有说没有安全方面的好处。 (3认同)
  • mktemp 命令是由 OpenBSD 人员发明的。他们的目标是提高 shell 脚本的安全性。以前的规范是在临时文件名中添加 $$。http://man.openbsd.org/mktemp.1 (2认同)

Grz*_*cki 8

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

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


lin*_*ore 7

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

mktemp - 创建临时文件或目录.

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

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

touch - 更改文件时间戳

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

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

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

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