※ ChatGPTを利用し、要約された質問です(原文:PHPのSystem関数でcdしてもうまくできない)
PHPのSystem関数でcdしてもうまくできない
このQ&Aのポイント
PHPのSystem関数を使用して特定のフォルダにcdしようとすると正常に実行されない問題が発生しています。
フルパスを使用すると正常に実行できるが、圧縮ファイルに無駄な階層が含まれてしまうため、解決策ではありません。
所有権と書き込み権限の設定に問題がないことや、一部のフォルダでは正常に実行されることから、権限に関する問題ではない可能性があります。解決策があれば教えてください。
PHPのSystem関数でcdしてもうまくできない
PHPのSystem関数でcdしてもうまくできない
PHPで特定フォルダを圧縮しようと以下のように書いてみました。
system("cd /var/www/html/hoge;zip -r hogehoge hoge.zip");
しかし上記だと何も実行されずapacheのエラーログを見ると
cdでエラーとなり Not a directryとなります。
もちろん上記フォルダは存在しますし 上記コマンドをSSH上から実行すると正しく実行されます。
権限の問題かな?とも思ったのですが試しに以下のようにフルパスで書くときちんと実行できます。
(ただし圧縮ファイルに無駄な階層が入ってしまうので解決にはなっていないのですが)
system("zip -r /var/www/html/hoge/hogehoge /var/www/html/hoge/hoge.zip");
試しに以下のようにcdコマンドを売ってpwdできちんとcdできてるか試してみると
system("cd /var/www/html/hoge;pwd"); →ダメ
system("cd /var/www/html/;pwd"); →ダメ
system("cd /var/www/;pwd"); →ダメ
system("cd /var/;pwd"); →ダメ
system("cd /;pwd"); →OK
system("cd /tmp/"); →OK
となります。
やっぱり権限関連のような気はするのですがなんでだろう?
なお/var/www/html/以下はすべて所有権をapacheにしていますし hoge以下は777にしているので書き込み権限もあります。
なんでcdできないか解決方法の心当たりあったら教えてくください。
よろしくお願いします。
環境は以下の通りです。
CentOS 4.7
PHP 5.1.6
お礼
回答ありがとうございます。 >ls -ld /var /var/www /var/www/html /var/www/html/hoge >の結果を出してください。 実際はもう少し深い階層になっているので以下の通りです。 (一部aaa,bbb,cccに変えました) drwxr-xr-x 22 root root 4096 3月 30 2009 /var drwxr-xr-x 8 root root 4096 5月 13 2009 /var/www drwxrwxrwx 24 apache apache 4096 8月 9 14:42 /var/www/html drwxrwxrwx 7 apache apache 4096 8月 10 12:07 /var/www/html/aaa/ drwxrwxrwx 3 apache apache 4096 7月 13 10:27 /var/www/html/aaa/report/ drwxr-xr-x 3 apache apache 4096 8月 10 2:30 /var/www/html/aaa/report/bbb/ drwxr-xr-x 2 apache apache 4096 8月 10 16:38 /var/www/html/aaa/report/bbb/ccc/ 上の圧縮ではbbbフォルダにcdして cccフォルダを圧縮使用としています。 >あとは、タイプミスの可能性がないか、再度見直し。 Systemに渡してる内容をそのまま画面出力して 出力したものをコピペでコマンドラインで実行すると正しく実行されましたのでタイプミスの可能性はないです。 >sudo -u apache php -r 'system("cd /var/;pwd");' こちらは問題なく実行できました。 sudo -u apache php -r 'system("cd /var/~;zip -r~");' でも正しくZIP化できました。 ということはPHPに直で渡した場合は問題ないってことですよね。 うーん。なんでだろう。 もう少し試してみます。
補足
念のため上記の確認用に作ったソースをそのまま載せます。 /var/www/html/上のPHPファイルを実行 <?php $cmd = sprintf("cd %s;pwd;whoami;" ,"/var/" ); print($cmd); print("<BR>"); system($cmd); ?> 実行結果 cd /var/;pwd;whoami; /var/www/html/ apache あと上記プログラムをWEBブラウザ経由で(つまりapache経由で)実行した結果は上記の通りですが コマンドラインから実行すると正しく実行されていました。 実行結果 # sudo -u apache php test.php cd /var/;pwd;whoami;<BR>/var apache コマンドラインとapacheの違いの可能性ってことで試しに.htaccessを消して実行してみましたが結果は変わらずでした。