【環境】
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に変更してもやはりダメです。どこがおかしいんでしょうか?
どなたかよろしくお願いします。
No.3ベストアンサー
- 回答日時:
sudoが使える環境にあるという認識でよろしいですね?
sudoについては実行権限やパスワードなどを専用のツールで登録します
mintは詳しくないのでよくわかりませんが
「visudo」などで実行権限がつけられませんか?
(viもしくはvimが使える前提のツールです)
apache ALL=(ALL) NOPASSWD: ALL
などすればたいていのコマンドは実行可能になると思います
参考ページにもありますように、
sudo visudoで
apache ALL=(ALL) ALL
#Defaults requiretty
を追加してあります。ただ、これはなくてもコマンドラインからのPHPはきちんと作動するので敢えて書きませんでした。
私がどうしてもわからないのは、コマンドラインから動くPHPプログラムがなぜlocalhostから動かないのかということなのです。そこでN0.1のお礼に書きましたようにカレントユーザー名が関係しているのではないかと思ったわけです。posix_getpwuid(posix_geteuid())['name']で得られるユーザ名は「www-data」であり、コマンドラインから「whoami」で得られるユーザ名は私のusernameで「www-data」ではないからです。私にはこれぐらいしか考えられなかったので、何か新しい展望をと思って質問させて頂きました。
No.2
- 回答日時:
>ダメな理由がわかりません
繰り返しになりますが
「hoge.shの中で指定されているコマンド類がapacheユーザーに
実行権限がないのでは?」
apacheから呼び出すshell_execなどのコマンド実行時には
実行ユーザーはapacheをうごかしている「apache」ないし「httpd」など
特殊なユーザーになります
hoge.sh自体の実行権限とは別にhoge.shから呼ばれる一つ一つの
コマンドにもapacheが実行権限がなければ意味がありません。
それを一気に解決するにはsudoなどスーパーユーザーとして実行する
プログラムです。
apacheだと別途suEXECなど用意されているものもあります。
このあたりが理解できていないならセキュリティに関する知識が十分でないので
基礎から学習されたほうがよいでしょう
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などスーパーユーザーとして実行するプログラムです。」というのは、こういうこととは違うのですか?
No.1
- 回答日時:
hoge.shの中で指定されているコマンド類がapacheユーザーに
実行権限がないのでは?
そうとうセキュリティは落ちますがsudoなどでapacheに権限を
与えるなど検討してみてください
回答ありがとうございます。
いろいろとやってみましたがやはりうまくいきません。
そもそも、コマンドラインから「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」であれば結果が表示されますが、どんなシェルスクリプトも実行できないように見えます。
どうしたらいいんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP PHPプログラムの間違い 1 2022/10/06 14:33
- PHP WordpressのPHPを安全に編集する方法 1 2022/08/04 01:43
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- PHP ECCUBE4のページ管理でPHPを実行させたい 1 2023/04/06 11:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPからexecを使ってGnuPGを実...
-
httpdのプロセスが自動で消えな...
-
PHPからバッチファイルの実行
-
【PHP】命令は記述順に処理...
-
mysql複数レコードをまとめて削...
-
シェルスクリプトをPHPで動かそ...
-
一時停止のコマンドはありますか?
-
phpスクリプトのみで定期実行
-
PHPの中間コード
-
system()関数の使い方について
-
Prompt入力値をphp変数として取...
-
phpからエクセルのマクロを実行...
-
データベースの中にあるソース...
-
ブラウザからexecコマンドを実...
-
ヒアドキュメントの中で演算子...
-
こちらはただの直列処理ですか?
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
form actionで二つ送信先を指定...
-
シェルスクリプトからphpファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
php5-extensions を make でき...
-
php実行中に実行中のphpファイ...
-
ヒアドキュメントの中で演算子...
-
シェルスクリプトをPHPで動かそ...
-
phpからエクセルのマクロを実行...
-
PHPからバッチファイルの実行
-
query、prepare、executeの違い
-
PHPからCプログラムを実行して...
-
Switch文における、returnとbre...
-
PHPからlhaコマンドを使いたい
-
あるphpから他のPHPプロ...
-
CRON でPHPスクリプトをGET変数...
-
JSのWINOW.CONFI...
-
PHPの中間コード
-
別サーバのプログラムを起動
-
copy() で属性保存
-
phpスクリプトのみで定期実行
-
PHPで、C#のプログラムを実行す...
-
PHPからPostgreSQLのダンプを実行
おすすめ情報
自己解決しました。
自画自賛ではありませんが、最初の段階で割にいいところまで行ってました。
「www-data exec」で検索すると、http://unix.stackexchange.com/questions/115054/p …が見つかりました。その中に、正解がありました。
sudo visudoで
www-data ALL=NOPASSWD: ALL
とすればよかったのです。カレントユーザーを変更するなんてしないで、visudoを変更すればよかったのですね。
とりあえず、お付き合いありがとうございました。