mktemp 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
mktemp——文件与目录命令族(见文件与目录命令族)。写 shell 脚本时,它是避免"临时文件名冲突"和"被预测攻击"的标准做法。
mktemp 在临时目录里创建一个名字唯一、权限受限的文件或目录,并把路径打印到标准输出。你不用自己拼 tmp1234 这种容易撞名的字符串——它能保证不覆盖已有文件。
一、基本用法
bash
mktemp # 在当前目录建一个临时文件,如 ./tmp.XXXXXX
mktemp -t app.XXXX # -t 放到 $TMPDIR(默认 /tmp),前缀 app.
mktemp -d # -d 创建临时目录而非文件
tmp=$(mktemp) # 把路径存进变量,后续用 $tmp 操作
X是占位符,mktemp 会把它替换成随机字符以保证唯一。在脚本开头tmp=$(mktemp -t myscript.XXXX)是常见套路,之后所有中间产物都写进$tmp,互不干扰。
二、在脚本里用临时目录
bash
work=$(mktemp -d) || exit 1 # 建目录,失败立即退出
trap 'rm -rf "$work"' EXIT # 脚本退出时清理,防止残留
echo "中间结果" > "$work/step1.txt"
process < "$work/step1.txt" > "$work/step2.txt"这是"安全用临时文件"的完整范式:
mktemp -d拿到隔离目录,trap ... EXIT保证无论正常结束还是报错退出都自动清理(避免 /tmp 被脚本残留堆满)。比手写rm -f /tmp/foo可靠得多。
三、自定义模板与位置
bash
mktemp /var/run/app.XXXXXX # 指定完整路径模板
mktemp --suffix=.log app.XXXX # 加固定后缀默认 mktemp 在当前目录建文件;想放固定位置就写完整模板路径。注意模板里至少要有 3 个连续的
X,否则会报错。
四、踩坑:手动拼临时名的风险
bash
# 不推荐:名字可预测,并发脚本会互相覆盖,甚至被恶意抢先创建(符号链接攻击)
tmp=/tmp/myscript.tmp
echo data > "$tmp"手写固定临时名有两个问题:多实例运行时互相踩踏;攻击者预先在同名路径建符号链接,你的脚本会把数据写进它指向的地方。
mktemp从设计上规避了这两点——名字随机且创建时保证不覆盖已有文件。
五、实战:批量处理前建沙箱
bash
#!/bin/bash
set -euo pipefail
sandbox=$(mktemp -d)
trap 'rm -rf "$sandbox"' EXIT
for f in *.csv; do
# 每个文件的中间产物都落在隔离沙箱里
sort "$f" > "$sandbox/$(basename "$f").sorted"
done一句话总结
mktemp = 安全建唯一临时文件/目录:-d 建目录、-t 放系统临时区、用 X 模板保证唯一;配合 trap 'rm -rf "$tmp"' EXIT 可自动清理,是脚本里避免并发冲突与符号链接攻击的标准写法。相关:删除用 rm,移动用 mv。