繁体   English   中英

在 bash 中创建临时文件

[英]Creating temporary files in bash

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

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

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等等......

是的,使用mktemp

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

> mktemp
/tmp/tmp.xx4mM3ePQY
>

你可能想看看mktemp

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

欲知更多详情: man mktemp

以更谨慎的方式创建临时文件有什么好处

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


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

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

或临时文件:

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

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

根据man mktemp ,我们可以阅读:

传统上,许多 shell 脚本采用带有 pid 的程序名称作为后缀,并将其用作临时文件名。 这种命名方案是可预测的,它创建的竞争条件很容易让攻击者获胜。

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

mktemp可能是最通用的,特别是如果您打算使用该文件一段时间。

如果您只需要临时将该文件作为另一个命令的输入,您也可以使用进程替换运算符<() ,例如:

$ diff <(echo hello world) <(echo foo bar)

mktemp<\/code>文档<\/a>有一些很好的例子。

如果您的临时文件需要特定的后缀(文件扩展名)。 您可以执行以下操作

$ myfile=$(mktemp --suffix ".txt")
$ echo "$myfile"
/tmp/tmp.9T9soL2QNp.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM