一尘不染

在bash中创建临时文件

linux

有客观的更好的方法在bash脚本中创建临时文件吗?

我通常只要给他们起名就可以使用它们,例如tempfile-123,因为脚本结束后它将被删除。除了覆盖当前文件夹中可能的tempfile-123之外,这样做是否有其他缺点?还是以更谨慎的方式创建临时文件有什么好处?


阅读 332

收藏
2020-06-02

共1个答案

一尘不染

mktemp(1)手册页解释了它相当好:

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

在脚本中,我调用mktemp之类的东西

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

它会创建一个我可以使用的临时目录,并可以在其中安全地命名实际文件,使之可读易懂。

mktemp虽然不是标准的,但是它确实存在于许多平台上。“
X”通常会转换为某种随机性,更多的可能更随机;但是,某些系统(如busybox灰)对这种随机性的限制比其他系统更大


顺便说一句,临时文件的安全创建不仅对shell脚本而言重要。这就是python具有tempfile,perl具有File
::
Temp
,ruby具有Tempfile等的原因。

2020-06-02