プロが教えるわが家の防犯対策術!

【環境】
OS:Linux mint 18 "Sarah" Cinnamon
PHP:7.0.14-2+deb.sury.org~xenial+1 (cli)

PHPでシェルスクリプトを動かそうと思っているのですがうまくいきません。
PHPプログラムは以下のような感じです。

/var/www/html/PHPprogram/execJnlp.php
<?php
exec("sh /var/www/html/weasis/hoge.sh");
?>

このプログラムをコマンドラインから「php /var/www/html/PHPprogram/execJnlp.php」と打つときちんと立ち上がりますが、http://localhost/PHPprogram/execJnlp.phpからでは全く動きません。
また、execの代わりにshell_execを使っても結果は同じでした。

パーミッションの問題かと考え、すべてのファイルを777に変更してもやはりダメです。どこがおかしいんでしょうか?
どなたかよろしくお願いします。

質問者からの補足コメント

  • HAPPY

    自己解決しました。
    自画自賛ではありませんが、最初の段階で割にいいところまで行ってました。

    「www-data exec」で検索すると、http://unix.stackexchange.com/questions/115054/p …が見つかりました。その中に、正解がありました。

    sudo visudoで
    www-data ALL=NOPASSWD: ALL

    とすればよかったのです。カレントユーザーを変更するなんてしないで、visudoを変更すればよかったのですね。
    とりあえず、お付き合いありがとうございました。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/01/10 21:19

A 回答 (3件)

sudoが使える環境にあるという認識でよろしいですね?


sudoについては実行権限やパスワードなどを専用のツールで登録します
mintは詳しくないのでよくわかりませんが
「visudo」などで実行権限がつけられませんか?
(viもしくはvimが使える前提のツールです)

apache ALL=(ALL) NOPASSWD: ALL
などすればたいていのコマンドは実行可能になると思います
この回答への補足あり
    • good
    • 0
この回答へのお礼

参考ページにもありますように、

sudo visudoで

apache ALL=(ALL) ALL
#Defaults requiretty

を追加してあります。ただ、これはなくてもコマンドラインからのPHPはきちんと作動するので敢えて書きませんでした。

私がどうしてもわからないのは、コマンドラインから動くPHPプログラムがなぜlocalhostから動かないのかということなのです。そこでN0.1のお礼に書きましたようにカレントユーザー名が関係しているのではないかと思ったわけです。posix_getpwuid(posix_geteuid())['name']で得られるユーザ名は「www-data」であり、コマンドラインから「whoami」で得られるユーザ名は私のusernameで「www-data」ではないからです。私にはこれぐらいしか考えられなかったので、何か新しい展望をと思って質問させて頂きました。

お礼日時:2017/01/10 20:05

>ダメな理由がわかりません



繰り返しになりますが
「hoge.shの中で指定されているコマンド類がapacheユーザーに
実行権限がないのでは?」

apacheから呼び出すshell_execなどのコマンド実行時には
実行ユーザーはapacheをうごかしている「apache」ないし「httpd」など
特殊なユーザーになります

hoge.sh自体の実行権限とは別にhoge.shから呼ばれる一つ一つの
コマンドにもapacheが実行権限がなければ意味がありません。
それを一気に解決するにはsudoなどスーパーユーザーとして実行する
プログラムです。
apacheだと別途suEXECなど用意されているものもあります。

このあたりが理解できていないならセキュリティに関する知識が十分でないので
基礎から学習されたほうがよいでしょう
    • good
    • 0
この回答へのお礼

yambejpさんありがとうございます。
ご好意にもう少し甘えさせて下さい。

参考サイト(http://qiita.com/kenichiro-yamato/items/3f04ca17 …)を見ながら、

<?php
$command = "echo 'パスワード' | sudo -S sh hoge.sh";
shell_exec($command);
?>

hoge.shは、
#!/bin/sh
mv /home/username/sample.txt /usr/sample.txt

これをコマンドラインから実行するとsudo権限で実行するのでsample.txtは確かにパスワード入力せずに移動します。
ところがlocalhostからは移動しません。

あなたがおっしゃる「それを一気に解決するにはsudoなどスーパーユーザーとして実行するプログラムです。」というのは、こういうこととは違うのですか?

お礼日時:2017/01/10 18:47

hoge.shの中で指定されているコマンド類がapacheユーザーに


実行権限がないのでは?

そうとうセキュリティは落ちますがsudoなどでapacheに権限を
与えるなど検討してみてください
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
いろいろとやってみましたがやはりうまくいきません。

そもそも、コマンドラインから「php /var/www/html/PHPprogram/execJnlp.php」とすれば立ち上がるのに、「http://localhost/PHPprogram/execJnlp.php」がダメな理由がわかりません。
実は投稿する前に、いろいろ調べてPHPのカレントユーザー(www-data)をコマンドラインの「whoami」で表示されるものと統一してみたのですがダメでした。

また、http://qiita.com/kenichiro-yamato/items/3f04ca17 …を参考にしてPHPプログラムを作成して実験したのですが、やはりコマンドラインからしかPHPプログラムが動きません。sample.txtをドラッグ&ドロップできるようなフォルダへのコピーという簡単なシェルスクリプトもコマンドラインからしか動きません。

いろいろと実験したところ、PHPプログラムからは簡単なコマンド「ls」であれば結果が表示されますが、どんなシェルスクリプトも実行できないように見えます。

どうしたらいいんでしょうか?

お礼日時:2017/01/10 16:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!