より慎重な方法で一時ファイルを作成する利点はありますか
一時ファイルは通常、一時ディレクトリ (/tmp
など) に作成されます。 ) 他のすべてのユーザーとプロセスには、読み取りおよび書き込みアクセス権があります (他のスクリプトはそこに新しいファイルを作成できます)。したがって、スクリプトは、適切な権限で使用するなど、ファイルの作成に注意する必要があります (たとえば、所有者は読み取り専用です。次を参照してください:help umask
) とファイル名は簡単に推測できないようにする必要があります (理想的にはランダムです)。そうしないと、ファイル名が一意でない場合、複数回実行された同じスクリプトと競合する可能性があります (競合状態など)。 /ファイルを独自のバージョンのコードに置き換えます (保存されているものに応じてコマンドまたは SQL クエリを置き換えるなど)。
次の方法で一時ディレクトリを作成できます:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
または一時ファイル:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
ただし、それでも予測可能であり、安全とは見なされません。
man mktemp
のとおり 、次のように読むことができます:
伝統的に、多くのシェル スクリプトはプログラムの名前に pid を接尾辞として付け、それを一時ファイル名として使用します。この種の命名スキームは予測可能であり、それが作成する競合状態は、攻撃者にとって簡単に勝つことができます.
安全のために、mktemp
を使用することをお勧めします 一意の一時ファイルまたはディレクトリを作成するコマンド (-d
).
mktemp(1)
マンページはそれをかなりよく説明しています:
伝統的に、多くのシェル スクリプトはプログラムの名前に pid をサフィックスとして取り、それを一時ファイル名として使用します。この種の命名スキームは予測可能であり、それが作成する競合状態は、攻撃者にとって簡単に勝つことができます。より安全ではありますが、同じ命名スキームを使用して一時ディレクトリを作成する方法があります。これにより、一時ファイルが破壊されないことが保証されますが、単純なサービス拒否攻撃が可能になります。これらの理由から、代わりに mktemp を使用することをお勧めします。
スクリプトでは、次のように mktemp を呼び出します
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
これにより、作業できる一時ディレクトリが作成され、実際のファイルに読みやすく便利な名前を安全に付けることができます.
mktemp
標準ではありませんが、多くのプラットフォームに存在します。 「X」は通常、ある程度のランダム性に変換され、よりランダムになる可能性があります。ただし、一部のシステム (busybox ash など) では、このランダム性が他のシステムよりも大幅に制限されています
ところで、一時ファイルを安全に作成することは、シェル スクリプト作成だけではありません。そのため、python には tempfile があり、perl には File::Temp があり、ruby には Tempfile があります…
mktemp
を参照してください。
mktemp ユーティリティは、指定されたファイル名テンプレートを取得し、その一部を上書きして一意のファイル名を作成します。テンプレートは、/tmp/tfile.XXXXXXXXXX のように、いくつかの「X」が付加された任意のファイル名にすることができます。末尾の「X」は、現在のプロセス番号とランダムな文字の組み合わせに置き換えられます。
詳細については:man mktemp
はい、mktemp を使用してください。
一時ファイルを保存するために設計されたフォルダー内に一時ファイルを作成し、一意の名前を保証します。そのファイルの名前を出力します:
> mktemp
/tmp/tmp.xx4mM3ePQY
>