【Linux】mktempコマンドで安全な一時ファイル・ディレクトリを作成する

目次

概要

シェルスクリプトなどで、他のプロセスと名前が被らない(競合しない)ユニークな一時ファイルや一時ディレクトリを作成するコマンドです。

ランダムな文字列を含むファイル名を自動生成し、セキュリティ上のリスク(予測可能なファイル名によるシンボリックリンク攻撃など)を回避して安全にファイルを作成できます。

仕様(引数・オプション)

構文

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 ではなく、特定の作業用ディレクトリに作りたい場合に使用します。Bashmktemp -p /var/www/html/uploads upload_check.XXXXXX
  • ドライラン (-u)名前だけを取得したい場合に使いますが、取得してから実際に作成するまでの間に他者が同じ名前で作る「競合状態(Race Condition)」のリスクがあるため、セキュリティ上は推奨されません。可能な限り通常の作成モードを使用してください。

注意点

  1. 自動では消えないmktemp は作るだけで、削除は行いません。スクリプトの最後や trap コマンドを使って、必ず rm で削除する処理を記述してください。
  2. Xの数テンプレートの X が少なすぎると、名前の組み合わせが枯渇して作成に失敗する可能性があります。通常は XXXXXX(6個)以上にしておくのが無難です。
  3. 権限作成された一時ファイルは、セキュリティのためデフォルトでパーミッション 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 で消す」というフローをセットで覚えてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次