渡米生活。(日記)

渡米生活。本家から切り離しました。あまり渡米生活に関係のないプログラムネタや音楽ネタなど。

所有者がapacheのファイル(ディレクトリ)のパーミッションをユーザー権限で変更するスクリプト

phpベースのCMSwordpressなど)を使っていると、たまにプラグインなどが勝手にディレクトリを作り、それがサーバーによってはapacheの所有物になっていて、root権限がないと変更はおろか消す事も出来なくなることがある。

大抵はアンインストールオプションがついていて、それを使えば消せるようになっていたりするけど、下手するとそれも失敗して消せなくなったり(涙)

で、今回xreaにWP-DBManagerプラグインを入れようとして、まさしくその状態に陥った。で、なんとか管理者にお願いせずに消す方法はないかと思って探したら、そのものズバリのページがあったので参考にさせていただいた。

所有者がApacheのファイル削除

つまり、phpが作ったものならphpに消させればよい(あるいはモード777にしてしまえばよい)というわけ。
まあ、多分そうなんだろうな、と思いつつ、面倒がって自分ではphpを調べなかったのだけど、こんなに簡単なコードとはおもわなんだ。
以下、パーミッションを変更したいディレクトリの名前をbackup-dbとします。

1) 以下のコードをエディタで作成、適当にchmodfile.phpとか名前をつけて、backup-dbがあるディレクトリと同じか、それより上の階層にアップロードする。(たとえばwordpress/wp-content/)
文字コードUTF-8にして保存して下さい。

注意:以下のコードは、phpcgiモードで動かす設定にしていると使えません。もし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を削除しておくのを忘れないように!
なんのセキュリティ対策もしていないので、放置すると大変危険です。