bash スクリプトで一時ファイルを作成するための客観的に見てより良い方法はありますか?
通常は、スクリプトが終了すると削除されるため、tempfile-123 など、思いついた名前を付けます。現在のフォルダーにある可能性のある tempfile-123 を上書きする以外に、これを行うことで何かデメリットはありますか? または、より慎重に一時ファイルを作成することで何か利点がありますか?
ベストアンサー1
manmktemp(1)
ページではかなり詳しく説明されています:
従来、多くのシェル スクリプトは、プログラム名に pid を接尾辞として付け、それを一時ファイル名として使用します。このような命名方法は予測可能であり、これによって生じる競合状態は攻撃者が簡単に勝つことができます。より安全な (ただし、まだ劣る) 方法は、同じ命名方法を使用して一時ディレクトリを作成することです。これにより、一時ファイルが破壊されないことが保証されますが、単純なサービス拒否攻撃は依然として可能です。これらの理由から、代わりに mktemp を使用することをお勧めします。
スクリプトでは、次のようにmktempを呼び出します。
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
これにより、作業できる一時ディレクトリが作成され、実際のファイルに読みやすく便利な名前を付けることができます。
mktemp
標準ではありませんが、多くのプラットフォームに存在します。「X」は一般的にランダムに変換され、さらに多くなるほどランダム性が増すでしょう。ただし、一部のシステム(たとえばbusybox ash)では、このランダム性が他のシステムよりも大幅に制限されています。
ちなみに、一時ファイルを安全に作成することは、シェルスクリプトだけでなく、他の用途でも重要です。そのため、Pythonには一時ファイル、Perlはファイル::一時ルビーは一時ファイルなどなど…