1. ホーム
  2. linux

[解決済み] bashで一時ファイルを作成する

2022-04-23 14:55:32

質問

bashスクリプトで一時ファイルを作成する方法として、客観的に見てより良い方法はありますか?

私は通常、スクリプトが終了したら削除されるので、tempfile-123のように、思いついた名前をつけているだけです。この方法には、現在のフォルダーにある可能性のある tempfile-123 を上書きする以外に何か不利な点があるのでしょうか?あるいは、より慎重な方法で一時ファイルを作成する利点があるのでしょうか?

解決方法は?

その mktemp(1) のマニュアルページでかなりよく説明されています。

従来、多くのシェルスクリプトは、プログラムの名前に を付けて、それを一時ファイル名として使用します。このような この命名法は予測可能であり、この命名法が生み出す競合状態は 攻撃者が勝つのは簡単だ。 劣るとはいえ、より安全な方法として は、同じネーミングスキームでテンポラリディレクトリを作成することです。しかし これによって、一時的なファイルが不正に使用されないことを保証することができます。 しかし、単純なサービス拒否攻撃は可能である。 そのため これらの理由から、代わりにmktempを使用することが推奨されます。

スクリプトで、mktempを次のように呼び出します。

mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")

で、作業可能な一時ディレクトリを作成し、その中で実際のファイルに読みやすく便利な名前を安全に付けることができます。

mktemp は標準的ではありませんが、多くのプラットフォームで存在します。しかし、いくつかのシステム(busybox ashなど)では、このランダム性を他のシステムよりも大幅に制限しています。


ところで、一時ファイルを安全に作成することは、シェルスクリプト以外でも重要です。そのため、pythonには テンプファイル を、perlは ファイル::テンプ ルビーには テンプレートファイル などなど...。