web-dev-qa-db-ja.com

シェルスクリプトから一時ファイルを安全に作成してアクセスするにはどうすればよいですか?

出力を/tmpの固定名ファイルにリダイレクトするとセキュリティリスクになる可能性があることを読みました。攻撃者(または不正なコンテンツ)がスクリプトを実行したときにファイル/tmp/tmpfileformyscript.tmpが作成されたことに気付いた場合(スクリプトへの読み取りアクセス権がない場合)、たとえば、シンボリックリンクln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpを作成すると、スクリプトを実行したときに.bashrcファイルが破棄されます。

代わりに、filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"のようなものを使用できます。

ただし、キャッシングにtmpファイルを使用したい場合があります。その場合、「tmpfile.tmp。*」が/tmpのいずれかに一致するかどうかを知りたい場合は、作成するのではなく、そのファイルを使用します。新しいもの。残念ながら、testおよび同等の[ -f filename ]は、私の知る限り、ファイルグロビングをサポートしていません。

したがって、私の質問は2つあります。

  1. 一時ファイルを安全に作成するにはどうすればよいですか? "predictablename.$RANDOM"は許容できる方法ですか、それともより優れた(より安全で簡単な)方法がありますか?
  2. predictablenameをチェックして、ファイルに簡単にアクセスしたり、ファイルの存在を後で確認したりするにはどうすればよいですか?
14
Wildcard

mktempはこのために設計されました。 manページから:

TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE

mktempはファイルを作成するか、ゼロ以外の終了ステータスで終了します。論理or(||)は、mktempがファイルを作成できない場合にスクリプトが確実に終了するようにします。このコマンドの後、ファイルが使用可能であることを確認できます。再度確認する必要はありません。追加する必要があるのは、スクリプトの最後にあるファイルのクリーンアップだけです。

また、おそらくスクリプトがシグナルによって終了した場合も同様です。それが必要かどうかはあなたが決めなければならないことです。

どちらもtrapコマンドを使用して実行できます。

9
Bram