shell - 手动实现 mkstemp

标签 shell temporary-files

好吧,在花了很长时间开发一个准备测试的脚本之后,我现在了解到目标环境没有 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/

相关文章:

linux - shell脚本 "expect"ing来自ssh的各种响应

linux - CSV 文件 bash 脚本中的平均值

linux - 当我创建一个临时文件/目录时,它何时会被删除?

php - 重用由 PHP 表单中的文件上传创建的临时文件

ruby - 带有临时文件的奇怪的 Ruby IO

shell - shell 中的 $# -eq 是什么意思

regex - 如何从shell中的字符串中检索url?

php - 如何从命令行执行 PHP 代码?

ruby - 如何在 ruby​​ 中创建没有临时文件的 zip 文件?

log4j - 跨平台登录临时目录