[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.4 mktemp: テンポラリファイルやディレクトリを作成する

mktemp は、テンポラリファイルやテンポラリディレクトリの作成を行う。

書式:

 
mktemp [option]… [template]

mktemp は、template を基にして、 安全なテンポラリファイルやディレクトリを作成し、その名前を表示する。 template を指定する場合、その最後の構成部分に少なくとも 3 個の連続する ‘X’ が含まれていなければならない。template を省略した場合は、‘tmp.XXXXXXXXXX’ というテンプレートが使用され、 ‘--tmpdir’ オプションが暗黙のうちに指定されることになる。 template 中の ‘X’ が連続する最後の部分は、英数字で置き換えられる。 従って、大文字小文字を区別するファイルシステムなら、テンプレートに連続する n 個の ‘X’ が含まれていると、作成されるファイル名には、 62 の n 乗とおりの可能性があることになる。

昔のスクリプトでは、テンポラリファイルを作成する際、そのプログラム名にプロセス ID (‘$$’) を拡張子として付けで済ますのが習慣だった。 しかし、この命名法は、名前の推測が容易であり、従って、競合状態を起こしやすいという弱点がある。 攻撃者としては、テンポラリファイルに使われそうな名前でシンボリックリンクを作っておけばよい。 そうすれば、スクリプトが未使用のファイルだと考えて、テンポラリファイルのファイルハンドルを開いたとき、 実際にはすでに存在しているファイルの更新をしているということになる。 同じ命名法を使ってディレクトリを作成するのは、もう少し安全である。 作成しようとするディレクトリがすでに存在していると、mkdir は実行に失敗するからだ。とは言え、こちらもサービス不能化攻撃 (denial of service attacks) を可能にしてしまうわけで、やはり良策とは言えない。 それ故、新しいスクリプトでは mktemp コマンドを使用するべきである。 そうすれば、生成されるファイル名が確実に予測不可能になるので、 実行中のスクリプトがテンポラリファイルの名前を知っているというまさにその事実が、 ファイルを作成したのはそのスクリプトであり、他のユーザによってそのファイルが変更されることはありえないと、間違いなく示すことになる。

ファイルを作成する場合、作成されるファイルには現在のユーザに対する読み込みと書き出しの許可が付くが、 グループやその他のユーザに対しては、いかなる許可も付かない。 現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。

用例をいくつか挙げてみる (ただし、注意していただきたいが、 お手元でこの通り実行しても、おそらくファイル名は違ったものになるはずだ)。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-d
--directory

ファイルではなく、ディレクトリを作成する。 作成されるディレクトリには現在のユーザに対して、読み、書き、検索の許可が付くが、 グループやその他のユーザに対しては、いかなる許可も付かない。 現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。

-q
--quiet

ファイルやディレクトリの作成に失敗しても、エラーメッセージを出さない。 終了ステータスは、ファイルが作成されたかどうかをやはり反映する。

-u
--dry-run

既存のファイルの名前と重ならないテンポラリファイル用の名前を生成するが、 ファイルシステムの内容を変更することはない (訳注: 要するに、 テンポラリファイル名を生成表示するだけで、実際にファイルを作成することはないということ)。 このコマンドの出力を使って、新しいファイルを作るのは、本質的に安全ではない。 名前の生成とその使用との間には、時間差があり、 その間に他のプロセスが同じ名前でオブジェクトを作成することもありえるからである。

-p dir
--tmpdir[=dir]

template をディレクトリ dir を基点とする相対パスとして扱う。 dir が指定されていない場合や (ロングオプションの ‘--tmpdir’ でのみ可能)、空文字列の場合は、環境変数 TMPDIR が設定されていれば、 その値を使用し、設定されていなければ、‘/tmp’ を使用する。 このオプションを指定する場合、 template は絶対パスであってはならない。 とは言え、template にスラッシュが含まれていても構わないが、 その場合、途中にあるディレクトリはすでに存在していなければならない。

--suffix=suffix

template の末尾に suffix を追加する。suffix はスラッシュを含んでいてはならない。‘--suffix’ を指定する場合、 template は ‘X’ で終わっていなければならない。 ‘--suffix’ が指定されていない場合は、template 中の最後の ‘X’ の位置を調べることで、suffix としてふさわしいものを推測する。 このオプションが存在するのは、デフォルトの template を使用しているとき、 ‘X’ で始まる suffix を付けられるようにするためである。

-t

template を、環境変数 TMPDIR が設定されていれば、 その値であるディレクトリ直下の 1 個のファイルとして扱う。 TMPDIR が設定されていなければ、‘-p’ で指定されるディレクトリ直下、 それ以外の場合は、‘/tmp’ 直下になる。なお、template にスラッシュが含まれていてはならない。このオプションは非推奨である。 ‘-t’ なしで ‘-p’ を使う方が (TMPDIR よりコマンドラインの指定を優先するという点で) デフォルトの動作として優れているし、 (途中のディレクトリも指定できるという点で) 柔軟性も上だからである。

終了ステータス:

 
0: ファイルが作成された場合。
1: それ以外。

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.