PHPで外部コマンドを実行する方法について

このQ&Aのポイント
  • phpのsystem()関数を使って外部コマンドを実行する方法について詳しく教えてください。
  • system('ls'); system('ls -l'); system('whoami');は使えますが、system('unzip filename.zip');が使えない理由を教えてください。
  • ApacheのUserはnobodyですが、su nobodyにしてunzipコマンドを使えるようにするにはどうすればいいですか?
回答を見る
  • ベストアンサー

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
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • briant-jr
  • ベストアンサー率50% (5/10)
回答No.3

system('cd hogehoge'); system('unzip filename.zip'); というように、ディレクトリ変更をしてからか解凍しようとしていませんか? PHPでシェルコマンドを実行した際はその関数内でしかcdできません。つまり上記2つ目のsystem関数では1つめのcdが無効になっています。 この場合であれば、 exec("unzip "解凍先ファイルまでの絶対パス"." -d 解凍したいディレクトリまでの絶対パス"); というように解凍元ファイルと解凍先を絶対パスで指定すると使えます。unzipコマンドでは-dオプションで解凍先を指定できます。 上記の例は実際私が使ったものです。なのでexecで示していますが、 シェルコマンドを実行するという点ではsystemと同じなのでsystemに変えても問題ないですが、systemは実行結果がブラウザに表示されてしまうか何かで私はexecを好んで使っています。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

1.unzipがインストールされていない 2.unzipにパスがとおってない 3.filename.zipがない 4.filename.zipを解凍しようとしているディレクトリの パーミッションがリードオンリー などではないか調べてみてください。

  • mac_mini
  • ベストアンサー率42% (54/128)
回答No.1

exec関数で実行できないでしょうか?

参考URL:
http://php.s3.to/man/function.exec.html

関連するQ&A

  • phpから外部コマンド実行

    今、phpで <?php system('ls -al'); ?> ”ls -al" のシェルコマンドを実行しようとしてるのですが、うまくいきません。 自分なりに調べたところ、system関数やexec関数はセーフモードにより制限されていると分かり、php.iniの「safe_mode =」や「safe_mode_exec_dir = 」の部分を編集し実行してみたのですが、やはりブラウザが真っ白で、どうしてもsystem関数が動いていない気がします。 色々ネットや本で調べてはみたんですが、原因が分かりません。 大変基本的な事だとは思うんですが、詳しい方がいれば教えていただけないでしょうか。お願いします。

    • 締切済み
    • PHP
  • PHPからLinux(Fedora10)にアクセスしようとしています。

    PHPからLinux(Fedora10)にアクセスしようとしています。 [PHP] system("sudo su user1"); system("whoami"); [Browser] apache 出力結果としましては、「user1」を期待しているのですが、「apache」のまま変更されません。 ちなみに、sudoの設定でエラーは出ていないようです。 どのようにすれば、ブラウザのユーザ(apache)を変更することができるでしょうか?

  • PHPのコマンドをnobodyオーナで実行したい

    PHPをコマンドで実行するときに、オーナーをnobody権限で実行したいのですが、うまくいきません。 # su - nobody -c 'コマンド' 上記を実行すると、 This account is currently not available. と表示されて、コマンドは実行されません。 何か良い方法はないでしょうか。

    • 締切済み
    • PHP
  • PHPから外部コマンドを使ってファイルやディレクトリを新規作成するには?

    LinuxのFedora10で、PHPで外部コマンドを使ってサーバ内にディレクトリを新規作成したいのですができません。 /var/www/uuu内に、index.phpを設置し、その中の一部に以下のようなスクリプトを書いています。 <?php system("pwd"); system("touch fff"); system("mkdir ddd"); ?> system("pwd")は/var/www/uuuという結果を出してくれます。しかし、system("touch fff")やsystem("mkdir ddd")に関しては全く結果を出してくれません。 (PHP自体のエラーではないようです。) どうやら、外部コマンド自体はうまく機能してくれているみたいなのですが、ディレクトリやファイルを新規作成することができないようなのです。 /var/www内のディレクトリuuuのパーミッションを777にして、オーナーを一般ユーザにしてやってみても同様にうまくいきません。 どのようにすれば、PHPから外部コマンドを使ってファイルやディレクトリを新規作成することができるでしょうか? よろしくお願いします。

  • phpからsshトンネリングコマンドを発行すると応答しない。。

    いろいろ理由がありましてsshトンネリング機能を使いたいのですが、phpからコマンドを発行すると応答しなくなってしまいます。phpについてはあまり詳しくないのですが、phpからコマンドを呼び出す場合はなにか制約があるのでしょうか? 以下の個所で応答が無くなってしまいます。 apache上でphpを動作させています。もちろんapache起動ユーザで以下のコマンドを実行すると正常に終了し、転送機能は働きます。 ちなみにパスワードが聞かれないようにしています。 apacheを再起動するとプロセスにトンネリングのプロセスが現れます。 system("/usr/bin/ssh -2 -f -N -l apache -L 60000:192.168.1.XXX:5432 192.168.1.YYY "); どなたかご教授下さい!

  • 拡張モジュールをphpコマンドからだと読んでくれません。

    PHP4.4.2のphp.iniで、extentionをフルパス指定したのですが、 Apache経由だと、ssh2.soは読まれ拡張関数が使用できたのですが phpコマンドを叩くと、ssh2の拡張関数はないと エラーになってしまいます(><) シェルから何故、拡張関数が使用できないのでしょうか?

    • 締切済み
    • PHP
  • 【UNIX】unzip がcron で作動しない

    さくらインターネットのCRON機能で cd (対象ディレクトリ); /usr/local/bin/php -f (phpの名前)コマンドで PHPを自動的に実行しています。 その PHPには system("cd /zipファイルのあるパス/; unzip -Z hoge.zip"); というコマンドが実行されるようになっています。 (本来は、zipの解凍をしたいのですがテスト的にまず、ファイルの内容を表示) このphpを直接ブラウザ上で実行する場合は、うまく動くのですが CRON上で動かした場合は、unzip: not found というエラーが帰ってきます。 また、CRONのコマンド実行フォームにphp実行コマンドではなく、直接 "cd /zipファイルのあるパス/; unzip -Z hoge.zip" を実行しても unzip: not found が出てきてしまいます。 /home/[ユーザー名]/www/・・・と 絶対パスを指定しているので、パスは合っているかと思います。 unzip コマンドを実行するには予め何かを実行しないといけないのでしょうか? 何故、unzip: not found が出てしまうのか アドバイスよろしくお願いいたします。 サーバーOSバージョン FreeBSD 7.1-RELEASE-p16 i386

  • 実行可能な外部コマンドは?

    cgiプログラムから外部コマンドを実行させたいのですが,できることとできないことの区別が明確でありません. システムコマンドのlsは実行できず,wc や cp は実行できます. 自作のプログラムはcgiプログラムと同じところある物は動きますが,それを/binや/usr/binに移動させると動かなくなります. これはサーバのセキュリティがそのように設定されているということなのでしょうか?

    • ベストアンサー
    • CGI
  • UserDirでCGI版PHPを動作させたい

    お世話になります。 最終的にはsuexecでの動作を目指しておりますが、その前段として UserDirでのCGI版PHPの動作をさせようとしています。 DocumentRoot配下でのCGI版PHPの動作には以下のような設定で成功しました。 [httpd.conf] Action php56-cgi /cgi-bin/php-5.6.27 <Directory "/usr/local/apache2/htdocs/php5test"> Options FollowSymLinks Includes ExecCGI AddHandler php56-cgi .php .html Require all granted </Directory> <IfModule alias_module> : ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" : </IfModule> # ls -l /usr/local/apache2/cgi-bin/php-5.6.27 lrwxrwxrwx 1 root root 22 11月 8 14:58 php-5.6.27 -> /usr/local/bin/php-cgi* /usr/local/apache2/htdocs/php5test/に置いた whoami.php の内容 <?php echo 'Current script owner: ' . get_current_user() . "<br><br>\n"; $current_user = trim(shell_exec('whoami')); echo 'Current user: ' . $current_user . "<br><br>\n"; $c_time = date("Y年n月j日(D) Ah:i"); print("Current time: $c_time<br>\n") ?> http://xx.xx.xx.xx/php5test/whoami.php Current script owner: root Current user: apache Current time: 2016年11月10日... と表示されます。 -------------------------------------------------------------------- ここから本題です。 $ mkdir /home/hoge/php56 $ cd /home/hoge/php56 $ ln -s /usr/local/bin/php-cgi php-5.6.27 $ ls -l lrwxrwxrwx 1 hoge hoge 22 11月 10 11:47 php-5.6.27 -> /usr/local/bin/php-cgi* $ ls -l /home drwxrwxr-x 30 hoge hoge 4096 11月 10 11:43 hoge/ $ ls -l /home/hoge drwxr-xr-x 2 hoge hoge 4096 11月 10 11:47 php56/ drwxr-xr-x 2 hoge hoge 4096 11月 10 10:41 public_html/ $ ls -l /home/hoge/public_html -rw-r--r-- 1 hoge hoge 331 11月 10 10:41 whoami.php [httpd.conf] <IfModule alias_module>内に ScriptAlias /hoge-php/ "/home/hoge/php56" を追加しました。 UserDir public_html Action hoge-php56 /hoge-php/php-5.6.27 <Directory "/home/hoge/public_html"> Options Indexes FollowSymLinks ExecCGI AddHandler hoge-php56 .php .html Require all granted </Directory> ブラウザで閲覧すると http://xx.xx.xx.xx/~hoge/whoami.php forbidden You don't have permision to access /hoge-php/php-5.6.27/~hoge/whoami.php となります。 ScriptAlias, Action がよく理解できていませんので ご指導よろしくお願いします。

    • 締切済み
    • PHP
  • Javaプログラムから外部コマンドを呼び出す

    String com = "ls -l"; Process pro = Runtime.getRuntime().exec(com); 上記のようにして、外部コマンドを実行しています。 この方法を使用すると投げたコマンドが終了してしまうまで、後の処理が行われません。 バックグラウンド処理を行いたかったので、 String com = "ls -l &"; Process pro = Runtime.getRuntime().exec(com); としてみましたが、結果は変わりませんでした。 何か別の指定方法が存在するのでしょうか。 ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Java