在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
)。