在 bash 中创建临时文件

新手上路,请多包涵

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

我通常只是将它们命名为我想到的任何东西,例如 tempfile-123,因为它会在脚本结束时被删除。除了覆盖当前文件夹中可能的 tempfile-123 之外,这样做有什么缺点吗?或者以更谨慎的方式创建临时文件有什么好处?

原文由 Strapakowsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 743
2 个回答

mktemp(1) 手册页很好地解释了它:

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

在脚本中,我调用 mktemp 类似

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

它创建了一个我可以在其中工作的临时目录,并且我可以在其中安全地将实际文件命名为可读且有用的名称。

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


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

原文由 kojiro 发布,翻译遵循 CC BY-SA 3.0 许可协议

是的,使用 mktemp

它将在专为存储临时文件而设计的文件夹中创建一个临时文件,并保证您的名称是唯一的。它输出该文件的名称:

 > mktemp
/tmp/tmp.xx4mM3ePQY
>

原文由 Paul 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题