好吧,在花了很长时间开发一个准备测试的脚本之后,我现在了解到目标环境没有 mkstemp
(我愚蠢地相信每个 unix-y 操作系统都有它),也没有它似乎有任何其他常见的临时文件实用程序。如果有任何其他广泛可用的临时文件命令请告诉我,但我认为我没有任何可用的。
所以,这意味着我需要自己实现一种 mkstemp
形式。现在最简单的方法是类似 tmp="/tmp/tmp.$$.$RANDOM"
,虽然它有效,但不能保证不会出现文件名冲突,所以我需要对此进行测试,但问题是在测试文件和创建文件之间,文件最终可能会意外创建,因此它可能也不是一种合适的方法,至少就其本身而言是这样。
过去,我必须自己实现一个与 lockfile
相当的东西,我可以通过使用 mv
作为作弊手段将临时文件移动到位(如果它返回错误则说明锁已经存在)。我倾向于认为我也许可以使用某些操作来做类似的事情,如果文件已经存在,这些操作就会失败,但我不确定最好的方法是什么。
我知道使用 /tmp/tmp.$$.$RANDOM
不太可能导致冲突,但如果可以的话,我想正确实现这一点,因为脚本需要创建相当多的临时文件,然后将其移动到位,稍后我可能需要在其他脚本中执行相同的操作,因此最好正确执行此操作!
编辑:
我刚刚意识到我一直在到处引用 mktemp
而不是我真正想要复制的 mkstemp
(其中为您安全地创建了一个文件)。我想我已经纠正了错误的提及,请原谅混淆!
最佳答案
通常,用于创建临时目录的命令行工具称为mktemp
,而不是mkstemp
。我不确定在所有平台上使用是否安全。如果不是,您可以尝试使用严格的 umask
创建一个目录,但当该目录已存在时会失败。
mkdtemp() {
old_mask=$(umask)
umask 077
name="/tmp/tmp.$$.$RANDOM"
mkdir "$name" && echo "$name"
retval=$?
umask $old_mask
return $retval
}
用法:
tempdir=$(mkdtemp) || report_failure
由于这会尝试创建目录(原子操作),而不是检查它是否存在,并且在使用它生成的名称时会失败,因此该操作是安全的。但是,它很容易受到拒绝服务攻击,攻击者会创建许多临时目录只是为了让上述功能失败。
关于shell - 手动实现 mkstemp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033736/