web-dev-qa-db-ja.com

/ tmpの存在は保証されていますか?

内部のファイルに書き込む前に/tmpを確認して作成する必要がありますか?非常にまれなケースであるため、誰もSudo rm -rf /tmpを実行していないと想定します

42
Ayush

[〜#〜] fhs [〜#〜] は、/tmp存在します [〜#〜] posix [〜#〜] 存在することを信頼できます(少なくとも準拠システムでは;しかし、実際にはUnixに存在することがかなり保証されています)のようなシステム)。ただし、すべきではありません。システム管理者またはユーザーは、一時ファイル用に他の場所を好む場合があります。詳細は 複数のプラットフォームで正しいtmpディレクトリを見つける を参照してください。

60
Stephen Kitt

実際には、/tmpの存在はほぼ保証されています。ただし、それが存在していても、そこに一時ファイルを配置する必要があるわけではありません。

standard 規則は、TMPDIR環境変数を使用することです。存在する場合は、一時ファイルのディレクトリを指します。存在しない場合は、一時ファイルを/tmpに配置します。

シェルスクリプトでは、一時ファイルの場所として"${TMPDIR:-/tmp}"を使用できます。これは、設定されている場合はTMPDIRの値に展開され、それ以外の場合は/tmpに展開されます。または、次のコマンドを使用して、未設定の場合に備えてTMPDIRを条件付きで設定できます。

: "${TMPDIR:=/tmp}"

次に、"$TMPDIR"内に一時ファイルを作成します。

どのアプリケーションでも/tmpまたは$TMPDIRでファイルを作成できることに注意してください。さらに、このディレクトリはユーザー間で共有される可能性があるため、ファイルを作成するときに権限に注意する必要があります。多くのシステム(Linux、* BSD)には、適切なディレクトリに安全にファイルを作成するコマンド mktemp があります。一般にmktempを使用して一時ファイルとディレクトリを作成することをお勧めします。特にシェルスクリプトからは、シンボリックリンク攻撃の可能性があるため、共有ディレクトリに安全にファイルを作成することが不可能です(mkdirは、エラーを正しく処理できれば問題ありません)。

¹ 空ではない-変数が空の場合は、そのままでは使用できません。通常、空の変数や未設定の変数は、ファイル名が含まれていると想定されている場合と同じように扱うことをお勧めします。

存在する可能性は非常に高いですが、別の理由を確認する必要があります。それはbigであるとは限りません。多くのシステムでは、/tmpは、ディスクではなくRAMによってサポートされており、数GBに制限される可能性があります。(Fedoraシステムでは、デフォルトでRAMの半分です。 )そのため、存在を確認するだけでなく、何を置くつもりかを確認する必要があります。

大きなものがある場合は、/var/tmp/

6
mattdm