首页/系统/Linux 运维命令速查/mktemp 创建安全临时文件
文件与目录76 条

mktemp 创建安全临时文件

生成带随机串的临时文件或目录,避免固定名字被抢占与符号链接攻击;脚本创建临时资源的推荐方式。

Linux 运维命令速查系统更新于 2026-10-13

mktemp 是什么

mktemp 生成带随机后缀的临时文件或临时目录,替换掉早先用 $$ 拼名字的写法,避免可预测的文件名被抢占或遭遇符号链接攻击。它是脚本里创建临时资源的推荐方式,默认权限只对属主开放。

基本信息

适用平台Linux / Unix(GNU coreutils 与 BSD 实现略有差异)
命令语法mktemp [选项] [模板]
常用选项-d 创建目录;--suffix= 指定后缀;-p 指定父目录;-t 使用临时目录
默认权限文件与目录均为仅属主可访问,替换前不可被他人读取

典型使用场景

  • 脚本内临时文件:存放解析中间结果或拼装请求体,退出时统一清理
  • 临时工作目录:解压包、编译产物、批处理中间文件集中放置
  • 原子替换配置:先写临时文件再 mv 覆盖,避免写入中断留下半截文件
  • 需要指定后缀:程序按扩展名判断格式时用 --suffix 保持后缀
  • 并发脚本隔离:多实例并行运行时,随机名天然避免互相覆盖

常用示例

常用示例
tmp=$(mktemp)                       # /tmp/tmp.XXXXXXXXXX
workdir=$(mktemp -d)                # 随机临时目录
cfg=$(mktemp /tmp/app-conf.XXXXXX --suffix=.conf)
trap 'rm -rf "$workdir"' EXIT       # 正常退出与异常中断都会清理
echo data > "$tmp"; ls -l "$tmp"     # 权限默认为 0600
mktemp -p /data/work tmp.XXXXXXXX   # 指定父目录,便于同分区原子替换

用法与产物

写法产物说明
mktemp/tmp 下的临时文件权限 0600
mktemp -d临时目录并发脚本用它做工作区
模板含 XXXX按模板位置生成至少 3 个连续 X,被替换为随机字符
--suffix=.conf保留扩展名程序依赖后缀时使用
-p 目录指定父目录跨文件系统会影响 mv 的原子性
模板中至少要出现 3 个连续的 X,GNU 实现会尽量多替换以提高随机性。
不要用 mktemp -u 只生成名字再由脚本创建:从生成名字到创建文件之间存在竞态窗口,攻击者可抢先创建同名文件。
临时文件所在文件系统决定 mv 是否原子,需要原子替换时应把临时文件建在目标目录的同一分区内。

易错点

  • 用 mktemp -u 只取名字再自行创建文件,中间存在竞态窗口,应直接使用 mktemp 创建好的实体
  • 临时文件同样受目录权限与磁盘配额约束,/tmp 空间不足或挂载为 noexec 时脚本会失败
  • 忘记用 trap 清理会在多次运行后堆积残留文件,长期运行的机器尤其明显
  • 跨文件系统 mv 临时文件到目标位置不是原子操作,大文件场景会出现短暂不一致

数据来源与参考

  • man 1 mktemp(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌