- ベストアンサー
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;
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
しつこくてスマン、、更に付けたし、、、 御判りかと思いますが 普通のISPなどパブリックなスペース上で、 ディレクトリを707などにすると 他のユーザーのCGIからも、あなたの方のディレクトリ内に 任意のfileを置くことが可能になりますので、気をつけてください
その他の回答 (4)
- umasikajiro
- ベストアンサー率67% (545/803)
#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 を見ると「ディレクトリツリーの作成及び削除」と有りますので こうゆうのでディレクトリツリーの生成も消去も行えば問題なく出来ると思います。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
パーミッションの問題ならやはりダメかも知れませんが 標準モジュールにディレクトリを削除する関数があります。 use File::Path; rmtree(パス);
- umasikajiro
- ベストアンサー率67% (545/803)
>従ってパーミッション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です
- fxdwg99
- ベストアンサー率45% (43/94)
telnet.cgiというのは初めて知りましたが、ブラウザ経由でUNIXコマンドを 実行するもののようですね? この場合、コマンドを実行しているのはWebサーバです。 Webサーバは通常NobodyやWebユーザーにて動いているので、 コマンドを実行しているユーザーもNobodyやWebユーザーになります。 従ってパーミッション777のファイルでなければ消せません。
お礼
再三の回答いただきありがとう頂き、ありがとうございました! とても、参考になりました。