• ベストアンサー

ディレクトリのパーミションを確認

スクリプトのログファイルを生成するために、ディレクトリのパーミションを確認したいのですが、よい方法などございますでしょうか? is_writable() is_wtiteable() fileperms() ともに、ディレクトリではなくファイルのパスを指定しなければいけないようなのですが、ディレクトリのCHMOD のチェックなどできるのでしょうか? どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

Warning: chmod(): Operation not permitted in /home/public_html/test/chmod.php on line 5 指定したディレクトリのパーミッションを変更する権限がない、というエラーですね。 WebサーバがApacheだと想定して回答します。 Apacheのhttpdプロセスは通常rootでなく、専用ユーザ(通常はapache)ユーザで実行されてます。 (ps aux|grep httpd で確認できます) ディレクトリのパーミッションを行うためには、確かそのディレクトリのオーナーであるユーザ(あるいはrootだったかな)でないと無理だったかと思います。(他のユーザが勝手に書き込み権限を与えることができると、セキュリティの意味がありませんから) したがって、 /home/public_html/test のオーナーを、rootでログインした後、chownを使ってapacheをオーナーにすれば、chmodできるようになるのではないかと思います。

jyuu
質問者

お礼

ありがとうございます。使用しているWebサーバはApache2です。 ディレクトリのオーナーを確認しようと思い、 echo get_current_user() . '<br />'; echo posix_getlogin(). '<br />'; とすると、それぞれ別々の結果が返ってきます。posix_getlogin()のほうはrootを返すのですが、get_current_user() は ftpなどで設定しているアカウントユーザー名になっています。 また、使用しているOSが FreeBSD なのですが、以下コマンドを打つとそれぞれ違う結果が返ってきます。 whoami -> www logname -> root ディレクトリのオーナーを確認する方法などありましたらどうぞよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

ls -ld /home/public_html/test でディレクトリのオーナー(及びパーミッションも)を確認できます。 それで、先の回答ではアドバイスとして少し誤った回答をしてしまったような気がするので訂正、というか補足(というか蛇足かも)です。 とりあえず、先の回答で「chmodできないならそのディレクトリのオーナーを変えればいい」というのはちょっと筋が違いました。「書き込めないなら、ログファイルが書き込めるように、そのディレクトリのオーナーにchmodしてもらう(書き込み権限を許可してもらう)」というのが筋が通っている気がします。 それで、chmodをPHPのスクリプトで行おうとしているのがよくわかりません。なぜなら、ログを書き込めるようにパーミッションの設定をするのは、初期設定の段階で一度やればいいはずで、それはtelnetなりsshなりでログインしてUNIXのchmodコマンドを1回叩けばいいはずなので。(あるいはFTPで行うか) 質問文のPHPスクリプトは、Webからのアクセスがあるたびにログファイルが書き込めるかパーミッションをチェックして、書き込みができなかったらパーミッションを変更する、ということなのでしょうか。それとも、上に書いた「初期設定」をPHPのスクリプトで行おうとしているのでしょうか。その辺を明確にしていただくと、より具体的なアドバイスができるかもしれません。(できないかもしれませんが…)

jyuu
質問者

お礼

>Webからのアクセスがあるたびにログファイルが書き込めるかパーミッションをチェックして、書き込みができなかったらパーミッションを変更する、ということなのでしょうか。 そうです。 しかし、少し無理っぽいのであきらめることにします。ありがとうございました。またお返事が遅くなり申し訳ございませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

下記URLによると、「引数filenameはディレクトリ名とすることができ」るそうなんですが…。(自分では試してないので自信なし) http://www.php.net/manual/ja/function.is-writable.php http://www.php.net/manual/ja/function.is-readable.php fileperms() も下記URLの例1.8を見ると、/tmpの属性をチェックしているので、ディレクトリ名を指定できるようです。 http://jp2.php.net/manual/ja/function.fileperms.php

jyuu
質問者

お礼

ありがとうございます。仰るとおり再度確認してみましたところ、ディレクトリのパーミションもチェックできました。 この機能の関連でおたずねしたいのですが、パーミションを変更するchmod() を使用した際、以下のコードで次のようなエラーが出ます。なぜパーミションの変更ができないかわかりますでしょうか? Warning: chmod(): Operation not permitted in /home/public_html/test/chmod.php on line 5 chmod.php <? $path = '/home/public_html/test'; $chmod = substr(sprintf('%o', fileperms($path)), -4); if(!strstr($chmod, '777')){ chmod($path, '777'); } ?> どうぞよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ディレクトリのパーミッションだけ一括変換するコマンドを教えてください。

    こんにちわ。 パーミションを変更するコマンドはchmodですが、あるディレクトリ下で、一般ファイルやサブディレクトリなどが入り混じっている場合に、一般ファイルのパーミションは変更せず、サブディレクトリ全て(さらにその階層のサブディレクトリすべて)を一発で755に変えるようなコマンドはありますでしょうか?つまりchmod -Rをディレクトリにだけ適用したいのですが。 逆に言えば、ディレクトリのパーミションは変更されず、一般ファイルだけパーミションを一斉に変更するという感じでも構わないのですが。 どなたかコマンドに詳しい方アドバイスの方よろしければお願いいたします。

  • 非公開ディレクトリまでの記述方法を教えてください。

    現在CGIの掲示板を設置しているのですが、生成されていくlogファイルを非公開のフォルダに格納したいと思いますぅ。 public_htmlと同階層にlogというディレクトリを作成してここにたまるには、生成されるlogへのパスは、どのように記述したらよいのでしょうか? logって書くだけではだめですよね?または、../../../logとかくのでしょうか?初歩的質問ですみません!どなたか分かる方、宜しくですぅ~。

    • ベストアンサー
    • HTML
  • UNIXコマンドについて

    カレントディレクトリのパーミションを確認する方法をお教えてください。 たとえば、ホームディレクトリからホームディレクトリのパーミションを確認するとか・・・(絶対パスではない方法で)。ls にオプションをつければいけると思い man コマンドで調べてみたのですが・・・英語なのでよくわかりません。お願いします。

  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Sambaで作るディレクトリ容量の指定 または変更することができますか。

    WindowsPCのデータをバックアップするつもりで、古いPCにCentOS5.2をインストールしてSambaを設定しました。 smb.conf に次のように書いています。 1 [global] 2 dos charset=cp932 3 unix charset=UTF-8 4 5 display charset=UTF-8 6 passwd backend=○○○ 7 8 workgroup=WORKGROUP 9 log level=2 10 log file=/var/log/samba/access.log 11 security = share 12 13 [public] 14 path=/public 15 writable = yes 16 guest ok = yes 17 guest only = yes Windowsから小さなファイルは支障なくアップできますが、少し大きいファイルをフォルダごとアップしようとすると、 「空きディスク領域が足りません」と出てファイルコピーが出来ません。 /publicディレクトリ設定時に容量を指定したり、設定後に容量を増やすことが出来るでしょうか?

  • 別ユーザ所有のディレクトリ内にファイル作成できない

    こんばんは。 タイトルのとおりですが、まずPHPでディレクトリを作成し、 その中にindex.htmlを作成しようとしているのですが上手くいきません。 PHPで作成したディレクトリの所有者はapacheになっているためかと思い、 実際にFTPを通して自分で作成したディレクトリの中にindex.htmlを作成したところ上手くいきました。 ディレクトリのパーミッションはいずれもスクリプトにより0777を指定しています。 このように、PHPのみでディレクトリを作成し、その中にファイルを作成する といったことが出来ずにいます。解決策等ございましたらお教えください。 参考までに、ソースを掲載しておきます。 これを設置するディレクトリのパーミッションは0777にしてみましたが、出力は「fopen error」になります。 <?php $path = "./dir/"; if(mkdir($path, 0, true)){ chmod($path, 0777); if($fp = fopen($path."index.html", "w")){ fputs($fp, $put); fclose($fp); print "Created!"; }else{ print "fopen error"; } }else{ print "mkdir error"; } ?>

    • ベストアンサー
    • PHP
  • ディレクトリを指定してディレクトリ内部の更新日を表示

    ファイルではなくディレクトリを指定してディレクトリ内部の更新日をSSI等使用して表示する方法はありますか。 SSIでファイルの更新日を取得することはできますが、フォルダの指定しても正常に動作しません。 目的は掲示板などのログが保存されるフォルダを指定し、中の複数のログファイルのいずれかが更新された場合、一番新しい日時を他のページに表示させる方法です。 どなたか教えて頂ければ幸いです。

    • ベストアンサー
    • CGI
  • 外部ディレクトリの存在確認と変更

    2点質問させて頂きます。 1つ目は、外部ディレクトリの存在を確認する方法はありますでしょうか? もしありましたら、教えて頂きたいと思います。 「外部ファイル」の場合は、fopenなどを使って 存在は確認できたのですが、「外部ディレクトリ」がいまいち分かりません。 file_existsやis_dirは、外部参照の時は使えませんでした。 2つ目は、また外部サーバー絡みなのですが 外部のディレクトリ名、またはファイル名を 変更する事は可能でしょうか? まだ試していませんが、FTP関数を使って出来るかもしれないのですが それ以外の方法で何かありましたら教えて頂けないでしょうか。 rename関数は使えませんでした。 宜しくお願い致します。

    • 締切済み
    • PHP
  • ディレクトリ内にあるファイルの最終更新時間を取得したい

    指定したディレクトリ内に自動生成されて保存されるファイルの最終更新時間を取得したいと思っています。 hogeというディレクトリがあったとして この中に200511.logというファイルがあり日々更新されて行きます。 ただし、月が変わると200512.logと新しいファイルが生成されてまた更新されて行くような感じです。 この場合、ただ <?php echo "最終更新: " . date("Y-n-d", filemtime('hoge/200511.log')); ?> とすれば、当月は良いのですが、来月になったら更新されなくなってしまいます。 ディレクトリの時間でやってみたらどうかと思い、 <?php echo "最終更新: " . date("Y-n-d", filemtime('hoge/')); ?> とやってみましたが、これだと、ただ単にhogeというディレクトリ自体の更新が表示されてしまいました。(当たり前か。。) つまりやりたい事は、hogeディレクトリ内でなにか変化が起きたらその時間を表示したい、ということなのですが、どうすれば良いでしょうか?

    • ベストアンサー
    • PHP
  • 【シェルスクリプト】各ディレクトリで一番大きな数字

    シェルスクリプト(Ubuntu bash)にて 以下の様なディレクトリ構成で各ディレクトリで一番数字の大きなファイルのパスを取得したいです。 data --0001 ----1 ----2 ----3 --0002 ----1 ----2 --0003 ----1 結果としてはこのように表示したいのですが、良い方法はありませんでしょうか。 data/0001/3 data/0002/2 data/0003/1