• ベストアンサー

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;

  • CGI
  • 回答数5
  • ありがとう数4

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

  • ベストアンサー
回答No.5

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

ayaka19801201
質問者

お礼

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

その他の回答 (4)

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

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

回答No.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です

  • fxdwg99
  • ベストアンサー率45% (43/94)
回答No.1

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

関連するQ&A

  • perl ディレクトリ ツリー表示

    下記ソースコードでカレントディレクトリのツリー表示ができますが、これを特定のディレクトリ内をツリー表示できるようにする方法がわかりません。 opendir関数の$dirの前にtestをつけましたが、うまく行きません。 特定のディレクトリは任意で変えることができることとします。 sub treelist_ { my ($dir, $lv) = @_; opendir my $dh, $dir; my @files = grep { $_ !~ /^\.\.?$/; } readdir $dh; closedir $dh; for my $file (@files) { print ">" x $lv, "$dir/$file\n"; treelist_("$dir/$file", $lv+1) if -d "$dir/$file"; } } sub tree { for my $dir (@_) { print "$dir\n"; treelist_($dir, 0); } } tree('.');

  • ディレクトリ削除

    お世話になっております。 画像をアップロード(ディレクトリ生成&そのディレクトリ内に保存)した後、安易な考えか、アップロードし直すという流れのとき、一旦生成したディレクトリを削除し、新たにディレクトリを生成、そしてその中に保存したいと考えておりますが、rmdir関数ではファイルが存在した場合、削除が出来ないと思いますが、ファイルが存在しても全て削除できるようにするには どのようにすれば良いのでしょうか? 一旦ファイルを削除して・・とも考えたのですが、そのような場合、やはりセッションを用いてファイル名を引き渡す?という流れになるのでしょうか? /* ディレクトリ削除メソッド */ function deleteDir($rootPath){ $strDir = opendir($rootPath); while($strFile = readdir($strDir)){ if($strFile != '.' && $strFile != '..'){ //ディレクトリでない場合のみ unlink($rootPath.'/'.$strFile); } } rmdir($rootPath); } deleteDir('/home/httpd/vhosts/test.aaa.com/test/'); このようなコードがとあるサイトで紹介されておりましたが、やはりこれもセッションが必要なのかな?などと・・・お恥ずかしい質問ばかりで恐縮ですが、ご教授頂ければ幸いです。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 一定時間が経過したフォルダの削除

    一定時間が経過したファイル削除のsauceを使って、サーバーのディレクトリを削除しようとしましたが指定した時間内のディレクトリが削除できません。間違っている個所をご指摘くださいますようお願い致します。 #古いディレクトリの削除 $dir='./z'; opendir(DIR, "$dir"); my @dirlist = grep /^*/, readdir DIR; closedir(DIR); my $expire_t = 15552000; #180日以上経過したファイル指定  (1日は86400) my $expire_d = 31536000; #365日以内に生成されたファイル指定 my $now = time; foreach my $deldir (@dirlist){ my $mtime = (stat("$dir/$deldir"))[9]; if ($now > $mtime + $expire_t && $now < $mtime + $expire_d){ rmdir("$dir/$deldir"); } } どうぞ宜しくお願いします。

    • ベストアンサー
    • Perl
  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • perl-cgi「日時によるファイル操作」について

    perl-cgi「日時によるファイル操作」について perl-cgiで、あるディレクトリ中のファイル更新日が最も若い2ファイルを表示して、それ以外を削除したいのですがどのようにすればよいでしょうか? #調べたいディレクトリを読み込む。 $Dir = "./cache"; opendir DIR,"$Dir"; my @alldir = readdir DIR; close DIR; #ファイル(パス)名と作成日時を求める。 #最新2つのファイルパス(名)を表示する。 print "NewFile".ファイルパス1; print "<HR>"; print "OldFile".ファイルパス2; #最新2つ以外は全て削除 unlink($_); exit(0);

    • ベストアンサー
    • Perl
  • readdir()で得られるファイル・ディレクトリ情報の順番は?

    Perlプログラムにて、  opendir(DIR, '.');  @dir_list = readdir(DIR);  closedir(DIR); などとすると、そのディレクトリにあるファイルとディレクトリの一覧情報を得ることができますが、この場合、@dir_list にはどのような順番で情報が格納されるのでしょうか? readdir() 関数の仕様が知りたいです。ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Perl
  • 特定ディレクトリのファイルを全部消去する

    2日徹夜していろいろやってみましたがどうにもなりません。 どなたか助けてください! ディレクトリAの中にimageという名前のディレクトリがあります。 imageディレクトリには100前後のjpg画像があります。 ディレクトリAにおいてあるreset.phpで、imageディレクトリ内のフォルダを全部削除するにはどうしたらよいでしょうか。 以下、いろいろ試したソースですが、これだとエラーが出てしまいます。 よろしくおねがいします! $res_dir = opendir( './image' ); while( $file_name = readdir( $res_dir ) ){ unlink($file_name); }

    • ベストアンサー
    • PHP
  • ディレクトリ名を取得したい

    perlでディレクトリ名だけを取得したいのですが、 なかなかうまい方法が見つかりません。 ファイル名を取得する・・・というのは結構あるのですが、 ディレクトリ名だけ、というのがどうもわかりません。 ちなみにファイル名取得は以下のようにやっています。 my $md; opendir(DIR, 'q'); while (defined($dir = readdir(DIR))) { $md=substr($dir,0,6); } closedir(DIR); ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

    • ベストアンサー
    • Perl
  • Rubyのスクリプト

    Rubyを使って、ディレクトリを順に処理していくスクリプトを作ろうとしています。 下記は、perlのものです。 chdir("C:/data"); opendir(DIR, "./"); @myfolderlist= grep(-d, readdir(DIR)); close(DIR); foreach $myfolder(@myfolderlist){ if(($myfolder ne ".") && ($myfolder ne ".." )){ print "$myfolder\n"; } } これに対応するような、かつRubyらしい(foreachを使う)スクリプトを作りたいと考えます。 Dir.foreach('C:/Data'){|item| item.chomp! print item,"\n" } 上記のRubyスクリプトの問題は、ディレクトリのみならず、そこに存在するファイルまで出してしまいます。 Rubyにおいて、ディレクトリ」のみを持ってくるには、どのようにすれば良いでしょうか? 宜しくお願いいたします。

  • ディレクトリの削除について

    perlにてディレクトリの作成を行ったのですが、間違えて最後の改行コードを抜き忘れてしまい"aaa\r\nbbb\r\n"というようなディレクトリ名のディレクトリができてしまいました。 このディレクトリを削除したく、以下の事を試したのですがいずれもうまくいきませんでした。 ・FTPツールから削除 ・コマンドプロンプトからrmdir ・perlにてrmdir("aaa\r\nbbb\r\n")実行 このディレクトリを削除することは出来ないのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう