[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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 がより厳格な場合、付けられる許可はさらに厳しくなる。
用例をいくつか挙げてみる (ただし、注意していただきたいが、 お手元でこの通り実行しても、おそらくファイル名は違ったものになるはずだ)。
$ mktemp file.XXXX file.H47c |
$ mktemp --suffix=.txt file-XXXX file-H08W.txt $ mktemp file-XXXX-XXXX.txt file-XXXX-eI9L.txt |
TMPDIR
で指定しているディレクトリを基点として、
その下に安全な FIFO を作成する。TMPDIR
が設定されていない場合は、
‘/tmp’ ではなく、カレントディレクトリを基点として使用する。
肝腎な点は、mktemp
は FIFO を作成しないが、FIFO
を置くことができる安全なディレクトリなら作成できるということである。
ディレクトリや FIFO を作成することができなかったときは、シェルを終了する。
$ dir=$(mktemp -p "${TMPDIR:-.}" -d dir-XXXX) || exit 1 $ fifo=$dir/fifo $ mkfifo "$fifo" || { rmdir "$dir"; exit 1; } |
TMPDIR
が設定されていれば、そこで指名されているディレクトリに作られるが、
設定されていなければ、‘/tmp’ に作られる。
$ file=$(mktemp -q) && { > # $file をこのブロックの内側でのみ使用することにすれば、 > # 安全である。$file を引用符で囲んでいるのは、$TMPDIR が、 > # 従って、$file が、ホワイトスペースを含んでいるかも > # しれないからだ。 > echo ... > "$file" > rm "$file" > } |
$ mktemp -u XXX Gb9 $ mktemp -u XXX nzC |
このプログラムでは以下のオプションが使用できる。参照: 共通オプション.
ファイルではなく、ディレクトリを作成する。 作成されるディレクトリには現在のユーザに対して、読み、書き、検索の許可が付くが、 グループやその他のユーザに対しては、いかなる許可も付かない。 現在の umask がより厳格な場合、付けられる許可はさらに厳しくなる。
ファイルやディレクトリの作成に失敗しても、エラーメッセージを出さない。 終了ステータスは、ファイルが作成されたかどうかをやはり反映する。
既存のファイルの名前と重ならないテンポラリファイル用の名前を生成するが、 ファイルシステムの内容を変更することはない (訳注: 要するに、 テンポラリファイル名を生成表示するだけで、実際にファイルを作成することはないということ)。 このコマンドの出力を使って、新しいファイルを作るのは、本質的に安全ではない。 名前の生成とその使用との間には、時間差があり、 その間に他のプロセスが同じ名前でオブジェクトを作成することもありえるからである。
template をディレクトリ dir を基点とする相対パスとして扱う。
dir が指定されていない場合や (ロングオプションの ‘--tmpdir’
でのみ可能)、空文字列の場合は、環境変数 TMPDIR
が設定されていれば、
その値を使用し、設定されていなければ、‘/tmp’ を使用する。
このオプションを指定する場合、 template は絶対パスであってはならない。
とは言え、template にスラッシュが含まれていても構わないが、
その場合、途中にあるディレクトリはすでに存在していなければならない。
template の末尾に suffix を追加する。suffix はスラッシュを含んでいてはならない。‘--suffix’ を指定する場合、 template は ‘X’ で終わっていなければならない。 ‘--suffix’ が指定されていない場合は、template 中の最後の ‘X’ の位置を調べることで、suffix としてふさわしいものを推測する。 このオプションが存在するのは、デフォルトの template を使用しているとき、 ‘X’ で始まる suffix を付けられるようにするためである。
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.