Tutoriel Linux

Mktemp Linux : 安全な一時ファイルを作成する

Débutant2 min de lecture

/tmp/rapport.txtに書き込むスクリプトは問題を引き起こす可能性があります:別の実行でこの名前がすでに使われている可能性があり、ローカルユーザーがあなたの代わりにシンボリックリンクを準備することができます。 mktempは予測不可能な名前でファイルまたはディレクトリを作成し、すぐにスクリプトに予約します。

中間出力のために一時ファイルを使用し、trapでクリーンアップします。これにより、スクリプトはエラーや中断があってもディレクトリをきれいに保ちます。

Linux環境で安全に作成された一時フォルダ
スクリプト用に作成され、きれいにクリーンアップされた一時フォルダ。

$$で名前を作らない

この古い習慣は依然として危険です:

tmp="/tmp/rapport-$$.txt"
echo "結果" > "$tmp"

PIDは名前を秘密にすることはできず、ファイルは計算時に作成されないため、パスを構築して書き込む間に別のプロセスがこの名前を使用する可能性があります。 mktempは、パスを返す前にオブジェクトを作成します。

tmp_file=$(mktemp -p "${TMPDIR:-/tmp}" rapport.XXXXXX) || exit 1
printf '%sn' "結果" > "$tmp_file"

テンプレートの最後のコンポーネントには少なくとも3つの連続したXを含める必要があります。作成時に文字が置き換えられます。変数の周りには常に引用符を保持してください:TMPDIRにはスペースが含まれる可能性があります。

複数のファイルのための一時フォルダを作成する

一時フォルダは、/tmpに複数のファイルを散在させないようにします。これは、準備中のアーカイブ、一時ファイルを生成する変換、またはレポートに役立ちます。

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" sauvegarde.XXXXXX) || exit 1
printf '%sn' "データ" > "$workdir/liste.txt"
tar -czf "$workdir/rapport.tar.gz" "$workdir/liste.txt"

ほとんどのシステムは、このディレクトリをあなたのアカウントに予約された権限で作成します。スクリプトがキー、エクスポート、または機密データを含むアーカイブを操作するときには、確認してください:

stat -c '%a %U:%G %n' "$workdir"
ls -la "$workdir"

誤ったパスを消去せずにtrapでクリーンアップする

フォルダを作成した後すぐに、クリーンアップ関数を定義します。rm -rfを呼び出す前に、変数が存在し、期待されるディレクトリを指していることを確認します。

workdir=$(mktemp -d -p "${TMPDIR:-/tmp}" mon-script.XXXXXX) || exit 1
cleanup() {
  [ -n "${workdir:-}" ] && [ -d "$workdir" ] && rm -rf -- "$workdir"
}
trap cleanup EXIT HUP INT TERM

# スクリプトの処理はこちら

trap ... EXITはシェルが終了するときにクリーンアップを開始します。HUP、INT、およびTERM信号は、一般的な中断をカバーします。kill -9での強制終了は、シェルがこの関数を実行する時間を与えないため、大きな処理のために制御されたクリーンアップも考慮する必要があります。

  • mktempでパスを作成し、日付や$$で作成しない;
  • スクリプトが複数のファイルを生成する場合はmktemp -dを使用する;
  • スクリプトによって作成され、確認された変数のみを削除する;
  • 失敗を診断する必要がある場合は一時ファイルを保持し、分析後に削除します。

Bashの履歴に関するガイドは、コマンドラインで指定したパスワードが~/.bash_historyに残らないようにするのに役立ちます。最終的な結果をアーカイブするには、Linuxでtarアーカイブを作成および抽出することも参照してください。