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

  • PHP
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

考えにくいですね。念のため、 ls -ld /var /var/www /var/www/html /var/www/html/hoge の結果を出してください。 あとは、タイプミスの可能性がないか、再度見直し。 シェルのコマンドラインで、 sudo -u apache php -r 'system("cd /var/;pwd");' でも駄目ですか?

yukitakao
質問者

お礼

回答ありがとうございます。 >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に直で渡した場合は問題ないってことですよね。 うーん。なんでだろう。 もう少し試してみます。

yukitakao
質問者

補足

念のため上記の確認用に作ったソースをそのまま載せます。 /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を消して実行してみましたが結果は変わらずでした。

関連するQ&A

  • PHPからバッチ実行

    exec('hogehoge.bat'); PHPから上記コマンドでバッチを実行すると hogehoge.bat ECHO hoge > hogehoge.log DIR \\Server1\hoge*.* > C:\hoge\hoge.log hogehoge.logにはキチンとhogeと書いてありますが hoge.logは作成されますが真っ白なままです。 NET USE F: \\Server1 ドライブに割り当てて試してみましたがダメでした。 なにかいい方法はございませんでしょうか? Win XP Apache_2.0.59 php-4.4.4

    • ベストアンサー
    • PHP
  • ウェブブラウザからファイルを操作することができません。(Apache - PHP - Linux)

    ウェブブラウザからファイルを操作することができません。 [/var/www/test/index.php] ...(中略)... system("pwd >> /var/www/test/comment"); ...(中略)... ファイル'/var/www/test/comment'に変化は見られません。 パーミッションは(7,7,7)にしてあります。 # ls -la /var/www/test drwxrwxrwx 3 user1 user1 4096 2010-01-12 20:58 . (ちなみに、/, /var, /var/wwwも全て(7,7,7)にしてあります。) # ls -la /var/www/test/comment -rwxrwxrwx 1 root root 1 2010-01-12 20:58 /var/www/test/comment ちなみに、以下のようにエラーが出た時に書き込むような設定にしても、何の変化も見られません。 system("pwd 2> /var/www/test/comment"); また、以下の一行からはユーザとしてapacheが表示されます。 [/var/www/test/index.php] ...(中略)... system("whoami"); ...(中略)... [ブラウザ] apache コマンドラインから入力するとうまく行き、書き込みは成功します。 # pwd >> /var/www/test/comment [/var/www/test/comment] / 想像するに、ユーザapacheでのファイル操作が禁止されているようです。 環境はLinux(Fedora10)で、Apache/2.2.10 (Unix)、PHP 5.2.9 (cli)です。 困り果てています。解決策をどうかよろしくお願い致します。

  • system関数

    以下のように、phpでsystem関数を用いて $command = "php4 -q <ファイル名>.php"; system($command); コマンドラインからプログラムを実行していたんですが、ファイルを別サーバに移動させたところ、 実行できなくなりました。 双方ともphpのバージョンは4.0.6、 コマンドラインからphpを実行できるように設定されています。 変わった点はapacheのuserがnobodyから 他の名前に変更されています。 やはり、実行できないのはapacheのuserが変更されたのが 原因なのでしょうか? もし、そうならばどのように対処すればよいのでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • system関数について

    cygwinでC言語を勉強しています。 そして昨日system関数の存在を知ったのでこんなプログラムを書いて見ました。 #include <stdio.h> #include <stdlib.h> main() { system("pwd"); system("cd .."); system("pwd"); } すると、結果は /home/prg/ /home/prg/ となりました。"cd .."を実行しているのですから /home/prg/ /home/ とならないのはなぜでしょうか? どうしても、わかりません。どうかよろしくお願いします。

  • system関数の使い方

    PHPでバックグラウンド処理をしたいのですが、うまくいきません。 プログラムは、 system.php <?php $str = "sleep.php"; system($str, $var); echo "$var"; ?> sleep.php <?php sleep(10); ?> ブラウザからsleep.phpにアクセスすると、10秒間フリーズするのですが、 system.phpにアクセスすると、すぐに返値0が表示されてしまいます。 変数の$strに、とんでもないファイル名を入れて実行しても返値が0になります。 何がおかしいのでしょうか。 アドバイス、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで動的に生成されるCSVをサーバーに保存

    業務処理を自動化するためにPHPで動的に生成されるCSVファイルを、WEBサーバーに保存したいと思っています。 wgetコマンドを使って保存しようと思っていますが、リンクにGETパラメータ?(http://hogehoge.com/hoge.php?hoge=1&hoge=2)が設定されているためかcsvが生成さずPHPページ(hoge.php)が保存されてしまいます。 実行したwgetコマンド /usr/local/bin/wget /home/useraccount/www/hoghog/hog.csv 'http://hogehoge.com/hoge.php?hoge=1&hoge=2' -O - また、phpファイルを生成し、 <?php $file = 'http://hogehoge.com/hoge.php?hoge=1&hoge=2'; $newfile = 'test.csv'; if (!copy($file, $newfile)) { echo "failed to copy $file...\n"; } ?> と上記のようにやっても同じ結果でした。 ブラウザ上のURLバーでhttp://hogehoge.com/hoge.php?hoge=1&hoge=2とするとCSVファイルの保存画面が出てくるページなのですが、何か良い方法はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaScript圧縮で、PHP含むことは可能?

    JavaScript圧縮する際、PHP記述も一緒に圧縮することは可能でしょうか? <script> var hoge = "<p><?php 何らかのPHP処理; ?><p>"; </script>

  • PHPでのsystem関数の処理ができないです。

    PHPでsystem関数を使ってアプリケーションを実行するだけの 簡単なプログラムを作ったのですが、 ブラウザでPHPのページが開き終わって 処理は全て終わった状態になるのですが、 アプリケーションが全く起動しません。 PHPのプログラムは以下の通りです。 ************************************************ <html><head> <title>アプリケーション起動</title> </head><body> <?php $user_cmd = "C:\phpdev5\www\himekuri\Himekuri.exe"; $cmd = escapeshellarg($user_cmd); system($cmd); ?> </body></html> ************************************************ $user_cmdで指定したアドレスにあるHimekuri.exeという アプリケーションを起動しようとしています。 開発環境は OS:Windows2000 phpdev5(MySQL,Apache)を使用 といった感じです。 system関数を使用するのに何か設定などがいるのでしょうか? 分かる方ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • phpから外部コマンドを使いたい

    外部コマンドを実行するために、phpのsystem()関数を使わせていただきました。 ところで、system('ls'); system('ls -l'); system('whoami');は、全部使えますが、 本当に使えたいsystem('unzip filename.zip');が使えないんです。 ApacheのUserは、nobodyです。 su nobodyにして、unzip filename.zipも使えるようなっております。 なぜ、phpから、system('unzip filename.zip'); は、使えないでしょうか? ご存じの方がいっらしゃいましたら、どうぞお教え下さい。

    • ベストアンサー
    • PHP
  • zip.lib.phpについて

    ものすごく簡単なことかもしれませんが zip.lib.phpについて質問します。 ファイル圧縮をしたくて「zip.lib.php」を使おうと思い require_once('zip.lib.php'); と書いていますが、実行されません。 レンタルサーバで「zip.lib.php」使いたいときは 単にこの書き方だけではダメなのでしょうか? PHPは4.3.10 MySQLはバージョンは3.23以上 勉強不足で申し訳ありませんが、 困っているのでお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう