概要
シェルスクリプトなどで、他のプロセスと名前が被らない(競合しない)ユニークな一時ファイルや一時ディレクトリを作成するコマンドです。
ランダムな文字列を含むファイル名を自動生成し、セキュリティ上のリスク(予測可能なファイル名によるシンボリックリンク攻撃など)を回避して安全にファイルを作成できます。
仕様(引数・オプション)
構文
mktemp [オプション] [テンプレート]
主な引数・オプション
| オプション | 説明 |
| -d / –directory | ファイルではなく、一時ディレクトリを作成します。 |
| -u / –dry-run | 名前を生成して表示するだけで、実際のファイル作成は行いません(非推奨)。 |
| -q / –quiet | ファイル作成に失敗してもエラーメッセージを表示しません。 |
| -p [DIR] / –tmpdir=[DIR] | 指定したディレクトリ配下に作成します(デフォルトは /tmp)。 |
| -t | テンプレートをファイル名の一部として解釈し、一時ディレクトリ配下に作成します。 |
| テンプレート | ファイル名の雛形を指定します。末尾に連続した X を含める必要があり、X がランダムな文字に置換されます。 |
基本の使い方
オプションなしで実行すると、システムのデフォルト一時領域(通常は /tmp)にランダムな名前のファイルを作成し、そのパスを表示します。
# 安全な一時ファイルを作成
mktemp
実行結果例
/tmp/tmp.s83kL9zW2a
※この時点で、空のファイルが実際に作成されています。権限は 600(所有者のみ読み書き可能)になります。
実践コマンド
変数に格納してスクリプト内で利用する
実務的なシェルスクリプトでは、作成したパスを変数に格納して利用します。
※入力例の “” ではなく、$() でコマンド実行結果を受け取るのが正解です。
#!/bin/bash
# 一時ファイルを作成し、パスを変数 TMP_FILE に格納
TMP_FILE=$(mktemp)
# 作成されたファイルパスを表示
echo "Temporary file created at: $TMP_FILE"
# 一時ファイルへ書き込み
echo "Processing data..." > "$TMP_FILE"
# 処理終了後に削除(必須)
rm "$TMP_FILE"
名前と拡張子を指定して作成する(テンプレート利用)
ログファイルやCSVなど、特定の拡張子やプレフィックス(接頭辞)を維持したい場合は、X を使ったテンプレートを指定します。X は最低3つ以上(通常は6つ推奨)記述します。
# カレントディレクトリに "app_log.ランダム.txt" を作成
mktemp app_log.XXXXXX.txt
実行結果例
app_log.uH7b2s.txt
自動削除を組み込む(trapコマンドとの連携)
スクリプトが途中で強制終了してもゴミファイルが残らないよう、trap コマンドで削除を予約するのが鉄則です。
#!/bin/bash
# 一時ファイルを作成
TMP_FILE=$(mktemp)
# スクリプト終了時(EXIT)や中断時(SIGINT)に必ず削除するよう予約
trap 'rm -f "$TMP_FILE"' EXIT
# メイン処理
echo "Start processing..."
# ここでエラーが起きてもファイルは削除される
カスタムポイント
- ディレクトリの指定 (-p)/tmp ではなく、特定の作業用ディレクトリに作りたい場合に使用します。Bash
mktemp -p /var/www/html/uploads upload_check.XXXXXX - ドライラン (-u)名前だけを取得したい場合に使いますが、取得してから実際に作成するまでの間に他者が同じ名前で作る「競合状態(Race Condition)」のリスクがあるため、セキュリティ上は推奨されません。可能な限り通常の作成モードを使用してください。
注意点
- 自動では消えないmktemp は作るだけで、削除は行いません。スクリプトの最後や trap コマンドを使って、必ず rm で削除する処理を記述してください。
- Xの数テンプレートの X が少なすぎると、名前の組み合わせが枯渇して作成に失敗する可能性があります。通常は XXXXXX(6個)以上にしておくのが無難です。
- 権限作成された一時ファイルは、セキュリティのためデフォルトでパーミッション 600(自分だけ読み書き可能)になります。他ユーザーから読ませたい場合は chmod が必要です。
応用
作業用の一時ディレクトリを作成する (-d)
ファイル単体ではなく、作業用のフォルダを一時的に作りたい場合は -d を使います。
# 一時ディレクトリを作成し、変数に格納
WORK_DIR=$(mktemp -d)
echo "Work dir: $WORK_DIR"
# その中でファイルを操作
touch "${WORK_DIR}/data1.txt"
touch "${WORK_DIR}/data2.txt"
# 最後にディレクトリごと削除
rm -rf "$WORK_DIR"
まとめ
mktemp は、予測不可能なファイル名を生成することで、スクリプトのセキュリティと堅牢性を高めるためのコマンドです。
「適当な名前でファイルを作る」のではなく、「mktemp で作って変数に入れ、trap で消す」というフローをセットで覚えてください。
