mktemp是唯一推荐的临时文件创建方式,必须用6个及以上x(如xxxxxx),建目录需加-d,配合trap清理并检查返回值,权限受父目录影响。

mktemp 是唯一推荐的、能避免竞争条件和预测攻击的临时文件创建方式。手动拼接 /tmp/myapp-$(date +%s).log 或用 $$ 都不安全,别用。
为什么不能直接写 mktemp tmp.XXXX
模板中 X 少于 6 个会失败(POSIX 要求至少 6 个),而旧文档里写的 XXXX 是错的。实际运行:
mktemp tmp.XXXX
会报错:mktemp: too few X's in template 'tmp.XXXX'。正确写法必须是 6 个及以上 X:
-
mktemp tmp.XXXXXX✅ -
mktemp /var/tmp/app-XXXXXX✅(指定路径) -
mktemp --suffix=.conf✅(自动加后缀,不用自己塞进模板)
创建临时目录时一定要加 -d,否则会报错
mktemp 默认只建文件;想建目录却漏掉 -d,命令会成功返回一个路径,但你 cd 进去时会遇到 Not a directory —— 因为它其实建的是空文件。
正确做法:
-
temp_dir=$(mktemp -d)(系统默认位置,权限 0700) -
temp_dir=$(mktemp -d --tmpdir=/var/tmp)(指定父目录) - 切勿对
mktemp -d的结果再调用mkdir,会报File exists
在脚本里用 trap 清理,但别信 -u
-u(--dry-run)只是生成名字不创建文件,已弃用且危险:名字可被预测,别人可能抢在你 touch 前创建同名文件。
安全脚本必须:
- 用
$(mktemp)或$(mktemp -d)实际创建 - 用
trap 'rm -rf "$temp_file" "$temp_dir"' EXIT注册清理 - 显式检查返回值:
temp_file=$(mktemp) || exit 1,防止空字符串导致后续命令误操作
最易被忽略的一点:mktemp 创建的文件默认权限是 0600,目录是 0700,但如果你用 --tmpdir 指向一个宽松权限的目录(比如 /tmp 下别人可写的子目录),那新建的文件仍受父目录 sticky bit 和 umask 影响——别假设“只要用了 mktemp 就绝对安全”,路径上下文同样关键。











