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 是否原子,需要原子替换时应把临时文件建在目标目录的同一分区内。