[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:79071] Re: find -exec rm{} でディレクトリも消したい


 しらいです。

In Message-Id <20010123.213459.79205412.tshiozak _at_ astec.co.jp>
        "T.SHIOZAKI" <tshiozak _at_ astec.co.jp>さんwrites:
> 塩崎です。

> ごめんなさい、もう一つ大穴がありました。
> 
> あるディレクトリの中を retrieve してる途中にそのディレクトリごと
> rename & symlink されると、任意のファイルが消せてしまいます。

 「| sh」を使わず直接 rm/rmdir を呼ぶ方式の方だと、その「途
中」が極端に小さくなるのでより安全だとは思いますが、それでも
完全に secure とは言えませんね。
 まぁ、事実上不可能というレベルでしょうか。


> # ちゃんとやるのなら、一段一段 chdir した後に getcwd で確認しつつ
> # ディレクトリを下っていかないとダメでしょう。

 ふむ。それなら全部 shell script で書くというのではどう?

---- Cut Here ----
#!/bin/sh

DIR=/tmp

older() {
	if [ x`find $1 -prune -mtime +90` != x ]; then
		return 0
	else
		return 1
	fi
}

cleandir() {
	for f in .??* *; do
		fullpath=$1/$f
		if [ -f $f ]; then
			if older $f; then
				rm $f
			fi
		elif [ -d $f ]; then
			(
				cd $f
				if [ x$fullpath = x`pwd` ]; then
					cleandir $fullpath
				fi
			)
			if older $f; then
				rmdir $f
			fi
		fi
	done
}

cd $DIR
DIR=`pwd`
cleandir $DIR
---- Cut Here ----

# 単一の time stamp 比較に find を使うのは冗長なんだけど、
#移植性を考えると他に適当なのがないねー。


> あと、「| sh」は(潜在的に)非常に危険なので止めたほうがいいようです。
> 特に、| とか > とか ' とかのあらゆる組み合わせのファイル名を
> 食わせた時に正しく動くようにするのはきっと無理でしょう。

 最初から shell script 内で処理するようになっていれば問題な
い筈です。一旦 shell 変数に代入された文字列については、メタ
キャラも無効ですし。

# 何らかの理由により「/」が filename に含まれてしまった場
#合はどうしようもありませんねー。それって system call レベ
#ルでお手上げだと思う :-)


> 結局、広く使われているオープンなツールが存在するのなら、
> こういうのは下手に自分で書くよりも、
> できれば一回ソースをざっと眺めた後に、
> 継続的にセキュリティ情報に注意しつつ、
> それを使う方がおおむね安全でしょう。

 何かあるんだったらそれ使った方がいいでしょうね。何がありま
す?ニーズはあると思うんで、誰か作ってそうですけどね。

                                               しらい たかし


この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: