所有者がapacheのファイル(ディレクトリ)のパーミッションをユーザー権限で変更するスクリプト
phpベースのCMS(wordpressなど)を使っていると、たまにプラグインなどが勝手にディレクトリを作り、それがサーバーによってはapacheの所有物になっていて、root権限がないと変更はおろか消す事も出来なくなることがある。
大抵はアンインストールオプションがついていて、それを使えば消せるようになっていたりするけど、下手するとそれも失敗して消せなくなったり(涙)
で、今回xreaにWP-DBManagerプラグインを入れようとして、まさしくその状態に陥った。で、なんとか管理者にお願いせずに消す方法はないかと思って探したら、そのものズバリのページがあったので参考にさせていただいた。
つまり、phpが作ったものならphpに消させればよい(あるいはモード777にしてしまえばよい)というわけ。
まあ、多分そうなんだろうな、と思いつつ、面倒がって自分ではphpを調べなかったのだけど、こんなに簡単なコードとはおもわなんだ。
以下、パーミッションを変更したいディレクトリの名前をbackup-dbとします。
1) 以下のコードをエディタで作成、適当にchmodfile.phpとか名前をつけて、backup-dbがあるディレクトリと同じか、それより上の階層にアップロードする。(たとえばwordpress/wp-content/)
※文字コードをUTF-8にして保存して下さい。
注意:以下のコードは、phpをcgiモードで動かす設定にしていると使えません。もしwarningメッセージでchmodに失敗した、と出てきたら、このスクリプトがあるフォルダより上の階層のどこかに置かれた.htaccessの中に、以下の行がないか調べて下さい。
AddHandler application/x-httpd-phpcgi .php
もしあったら、一時的に先頭に#をつけてコメントアウトすれば動きます。
<? $submit = (isset($_POST["submit"]))? $_POST["submit"] : ""; //get filename $filename = (isset($_POST["filename"]))? $_POST["filename"] : ""; //get permission $permission = (isset($_POST["permission"]))? $_POST["permission"] : ""; //escape html tags $filename = htmlspecialchars($filename, ENT_QUOTES, 'UTF-8'); $permission = htmlspecialchars($permission, ENT_QUOTES, 'UTF-8'); ?> <html> <body> <?if($submit!="") { header("Content-Type:text/html; charset=UTF-8"); ?> <h3>変更完了!</h3> <? umask(0); chmod($filename,intval($permission, 8)); $mesg = "ファイル" . $filename . "のパーミッションを " . $permission . " に変更しました。"; print htmlspecialchars($mesg, ENT_QUOTES, 'UTF-8'); $_POST["submit"] = ""; }else{?> <h3>このディレクトリ以下に存在するファイルまたはディレクトリのパーミッションを変更します。</h3> <form name="form" action="<?=$_SERVER['PHP_SELF']?>" method="post"> <p>ファイル、ディレクトリ名 <input type="text" size="50" name="filename" /></p> <p>パーミッション <input type="text" name="permission" /></p> <p><input type="submit" name="submit" value="submit" /></p> </form> <?}?> </body> </html>
2) wpのトップレベルのindex.phpを一時的に名前変更(リネーム)する(index.php.bakとか)。
これは、wpのindex.phpが生きていると、アップロードしたchmodfile.phpにアクセスできないため。
なんか今やってみたら、index.phpリネームしなくてもアクセス出来ました(汗)この間は駄目だったのに。なので、問題が起こらなければこの項目はスキップして下さい。
wp公開ディレクトリ設定を弄っていない人は、wordpress/index.php。
公開ディレクトリの場所をたとえばドメイン直下に置いている人は、ドメイン名/index.phpをリネーム。
3) アップロードしたchmodfile.phpをブラウザで開く。
たとえば、public_html直下にwordpressディレクトリがあるなら、
http://ドメイン名/wordpress/wp-content/chmodfile.php
とかなんとか。
4) ファイル名にbackup-db、アクセス権に777を入力してsubmitボタンを押す。
このとき、ファイル名は、chmodfile.phpを置いたディレクトリからの相対パスになる。
よくわからない人は、backup-dbがあるディレクトリにchmodfile.phpをアップロードすれば、名前だけでOK.
5) FTPソフトの「情報を見る」機能でbackup-dbのアクセス権が777になっていることを確認した後、アップロードしたchmodfile.phpを削除し、リネームしたindex.phpをもとの名前にもどす。
これで、backup-dbディレクトリのアクセス権が777になり、たとえapacheの持ち物でも、ユーザーが自在に書いたり消したりできる。
用が済んだら、サーバーからchmodfile.phpを削除しておくのを忘れないように!
なんのセキュリティ対策もしていないので、放置すると大変危険です。