みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perlでディレクトリごと削除したい

telnet.cgiを使って、カレントディレクトリで、
rm -rf *
を行っても、なぜか(permissin 755にも関わらず)permission denyといわれうまく削除できませんでした。
そこで、perlを使って削除を試みたいのですがどのようにすれば、削除できますか?

参考になりそうなソースを見つけたのですが、ディレクトリの中にディレクトリがある構造のためうまく削除できませんでした。
どなたか、改良していただけないでしょうか?
お手数ですが、宜しくお願い致します。




#!/usr/local/bin/perl

$dir = "./d/";

opendir DIR, $dir;
@files = grep { !m/^(\.|\.\.)$/g } readdir DIR;
close DIR;

$flag = @files;

if ( $flag ) {
foreach $file ( @files ) {
unlink "$dir$file";
}
}

rmdir $dir;

投稿日時 - 2006-09-24 12:27:53

QNo.2428029

暇なときに回答ください

質問者が選んだベストアンサー

しつこくてスマン、、更に付けたし、、、

御判りかと思いますが
普通のISPなどパブリックなスペース上で、
ディレクトリを707などにすると
他のユーザーのCGIからも、あなたの方のディレクトリ内に
任意のfileを置くことが可能になりますので、気をつけてください

投稿日時 - 2006-09-25 05:19:14

お礼

再三の回答いただきありがとう頂き、ありがとうございました!
とても、参考になりました。

投稿日時 - 2006-11-12 21:41:33

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

#2に付け足し、、、
>ディレクトリの中にディレクトリがある構造
その場合はそれぞれのディレクトリについて#2のと同じことが言えます
中身が空っぽでないディレクトリの全てにおいて
CGIの実行権限で書き込み許可が必要です。
 (中身が空っぽのディレクトリは普通のFILEと同じですから、親ディレクトリに書き込み権限があればOK)

SUEXECで無くFILEやディレクトリの所有者がユーザーである場合は 目的のディレクトリに含まれる
全ての空っぽでないディレクトリが707でないと出来ません

なので結局のところ
1.SUEXEC環境のところで行う、或いはお使いのサーバーに質問者さんがroot権限をお持ちならSUEXECを導入する

2. または CGIで生成したディレクトリツリーで使う

の2つしかないのではないかと思います。
#3でBLUEPIXYさんが書かれたモジュールは
http://fleur.hio.jp/perldoc/mix/lib/File/Path.html
を見ると「ディレクトリツリーの作成及び削除」と有りますので
こうゆうのでディレクトリツリーの生成も消去も行えば問題なく出来ると思います。

投稿日時 - 2006-09-24 19:53:26

ANo.3

パーミッションの問題ならやはりダメかも知れませんが
標準モジュールにディレクトリを削除する関数があります。
use File::Path;
rmtree(パス);

投稿日時 - 2006-09-24 16:50:09

ANo.2

>従ってパーミッション777のファイルでなければ消せません。
それは違いますね。ファイルのではなくfileのあるディレクトリの
所有者&パーミッションです

普通の(つまりSuexecでない場合)Unix系OSでwebサーバーを立てている場合に
例えば、ユーザーがtarou
ドキュメントを削除しようとしているディレクトリが /home/tarou/public_html/test1/ だったとします。
CGIの実行権限はNobodyやApacheなど
ユーザーでもユーザーのグループでもないものですからother です
なので /home/tarou/public_html/test1/ の所有者がtarou であれば、
そのディレクトリのパーミッションを707などにしなければ削除できません
 (これが777となっている解説サイトもありますが、これはグループ権限で動く場合を考慮したものですが滅多にありません)
または ディレクトリ自身をCGIで生成して置く方法も有りますが
その場合もパーミッションを注意しないと、今度はFTPで削除できなくなったりします。

削除ではなく fileの上書き更新の場合は fileのパーミッションが 606などの必要が有ります

尚、Suexecの場合は CGIがユーザー権限で動きますので
ディレクトリのパーミッションを 701などにしておけばOKです

投稿日時 - 2006-09-24 16:02:02

ANo.1

telnet.cgiというのは初めて知りましたが、ブラウザ経由でUNIXコマンドを
実行するもののようですね?
この場合、コマンドを実行しているのはWebサーバです。
Webサーバは通常NobodyやWebユーザーにて動いているので、
コマンドを実行しているユーザーもNobodyやWebユーザーになります。
従ってパーミッション777のファイルでなければ消せません。

投稿日時 - 2006-09-24 12:52:15

あなたにオススメの質問