電子書籍の厳選無料作品が豊富!

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;

A 回答 (5件)

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



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

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

お礼日時:2006/11/12 21:41

#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
を見ると「ディレクトリツリーの作成及び削除」と有りますので
こうゆうのでディレクトリツリーの生成も消去も行えば問題なく出来ると思います。
    • good
    • 0

パーミッションの問題ならやはりダメかも知れませんが


標準モジュールにディレクトリを削除する関数があります。
use File::Path;
rmtree(パス);
    • good
    • 0

>従ってパーミッション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です
    • good
    • 0

telnet.cgiというのは初めて知りましたが、ブラウザ経由でUNIXコマンドを


実行するもののようですね?
この場合、コマンドを実行しているのはWebサーバです。
Webサーバは通常NobodyやWebユーザーにて動いているので、
コマンドを実行しているユーザーもNobodyやWebユーザーになります。
従ってパーミッション777のファイルでなければ消せません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!