bashスクリプトで一時ファイルを作成する客観的に良い方法はありますか?
スクリプトが終了すると削除されるため、通常は tempfile-123 など、頭に浮かんだ名前を付けます。現在のフォルダーで考えられる tempfile-123 を上書きする以外に、これを行うことに不利な点はありますか? または、より慎重な方法で一時ファイルを作成する利点はありますか?
マニュアルページはmktemp(1)
それをかなりよく説明しています:
従来、多くのシェルスクリプトは、サフィックスとしてpidを使用してプログラムの名前を取り、それを一時ファイル名として使用します。この種の命名スキームは予測可能であり、それが作成する競合状態は攻撃者が勝ちやすいです。より安全ですが、それでも劣るアプローチは、同じ命名スキームを使用して一時ディレクトリを作成することです。これにより、一時ファイルが破壊されないことが保証されますが、それでも単純なサービス拒否攻撃が可能になります。これらの理由から、代わりにmktempを使用することをお勧めします。
スクリプトでは、次のようなmktempを呼び出します
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
これにより、作業可能な一時ディレクトリが作成され、実際のファイルに読みやすく便利な名前を安全に付けることができます。
mktemp
標準ではありませんが、多くのプラットフォームに存在します。「X」は通常、ある程度のランダム性に変換され、より多くはおそらくよりランダムになります。ただし、一部のシステム(たとえば、busybox ash)は、このランダム性を他のシステムよりも大幅に制限します。
ちなみに、一時ファイルを安全に作成することは、シェルスクリプトだけでなく重要です。そのため、pythonにはtempfileがあり、perlにはFile :: Tempがあり、rubyにはTempfileがあります…</ p>
mktemp
特にファイルをしばらく使用する予定がある場合は、おそらく最も用途が広いです。
別のコマンドへの入力として一時的にファイルが必要な場合は、プロセス置換演算子 を使用することもできます。<()
$ diff <(echo hello world) <(echo foo bar)
The mktemp
docs have some nice examples.
If you require a certain suffix (file extension) for your temporary file. You can do the following
$ myfile=$(mktemp --suffix ".txt")
$ echo "$myfile"
/tmp/tmp.9T9soL2QNp.txt
If you don't want the file to be created, but just want a name, you can additionally use the -u/--dry-run
flag.
$ myfile=$(mktemp -u --suffix ".txt")
$ echo "$myfile"
/tmp/tmp.Y8cMDJ1DDr.txt
BUT NOTE, when using -u/--dry-run
Using the output of this command to create a new file is inherently unsafe, as there is a window of time between generating the name and using it where another process can create an object by the same name.