在bash中创build临时文件

有客观上更好的方法来创build临时文件在bash脚本?

我通常只是给他们起名字,比如tempfile-123,因为脚本结束的时候会被删除。 除了在当前文件夹中覆盖可能的tempfile-123之外,还有其他的缺点吗? 或者更仔细地创build一个临时文件有什么优势吗?

mktemp(1)手册页对此进行了相当好的解释:

传统上,许多shell脚本以pid作为后缀采用该程序的名称,并将其用作临时文件名。 这种命名方式是可以预测的,它所创造的竞争条件对攻击者来说很容易获胜。 一个更安全,但仍然较差的方法是使用相同的命名scheme制作临时目录。 虽然这确实可以保证临时文件不会被破坏,但它仍然允许简单的拒绝服务攻击。 由于这些原因,build议使用mktemp代替。

在脚本中,我调用了mktemp

 mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX") 

它创build了一个可以工作的临时目录,并且可以安全地将实际文件命名为可读和有用的东西。

mktemp不是标准的,但它确实存在于很多平台上。 “X”通常会被转换成一些随机性,更多的可能会更随机; 然而,有些系统(比如busybox ash)会比其他系统更加显着地限制这种随机性


顺便说一下,安全创build临时文件不仅仅是shell脚本是非常重要的。 这就是为什么python有tempfile ,perl有File :: Temp ,ruby有Tempfile等…

是的,使用mktemp 。

它将在一个用于存储临时文件的文件夹中创build一个临时文件,它将保证您有一个唯一的名称。 它输出该文件的名称:

 > mktemp /tmp/tmp.xx4mM3ePQY > 

你可能想看看mktemp

mktemp实用程序使用给定的文件名模板并覆盖其中的一部分来创build唯一的文件名。 模板可以是任何附加了一些“X”的文件名,例如/tmp/tfile.XXXXXXXXXX。 尾随的“X”被当前进程号和随机字母的组合replace。

更多细节: man mktemp

以更谨慎的方式创build临时文件有什么优势吗?

临时文件通常在其他所有用户和进程都具有读写权限的临时目录(如/tmp )中创build(任何其他脚本都可以在其中创build新文件)。 因此,脚本应该小心创build文件,如使用正确的权限(例如只读所有者,请参阅: help umask )和文件名应该是不容易猜到(理想情况下随机)。 否则,如果文件名不是唯一的,则可能与多次运行的脚本(例如竞态条件 )产生冲突,或者某些攻击者可能劫持一些敏感信息(例如,当权限过于开放且文件名很容易猜到)或创build/使用他们自己的代码版本replace文件(例如根据正在存储的内容replace命令或SQL查询)。


您可以使用以下方法创build临时目录:

 TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR" 

或临时文件:

 TMPFILE=".${0##*/}-$$" && touch "$TMPFILE" 

然而,它仍然是可预测的,并不被认为是安全的。

按照man mktemp ,我们可以看到:

传统上,许多shell脚本以pid作为后缀采用该程序的名称,并将其用作临时文件名。 这种命名方式是可以预测的,它所创造的竞争条件对攻击者来说很容易获胜。

所以为了安全起见,build议使用mktemp命令创build唯一的临时文件或目录( -d )。