
【環境】
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CRON でPHPスクリプトをGET変数...
-
mysql複数レコードをまとめて削...
-
PHP5で名前空間を取り扱う
-
シェルスクリプトをPHPで動かそ...
-
phpのheader("Location:#pos")...
-
.htaccessにphp_valueが使用できな
-
*.php、*.php3、*.phtmlの違い
-
mysql→EUC-JP、php→UTF-8の時の...
-
phpでメール送信できません 原...
-
phpのextension_dirを複数指定...
-
phpの中でphpを書けないか
-
PHP PDOライブラリが読み込まれ...
-
mamp環境でのcronの使い方で困...
-
PHPでメールを受信するには?
-
再度、xamppにおけるjpgraphの...
-
セッションについての設定なの...
-
2つの画像ファイルが異なるファ...
-
require_once()でファイルが読...
-
PHP版のPDFlibのインストール
-
PHPのif文でその処理を途中で抜...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルスクリプトをPHPで動かそ...
-
mysql複数レコードをまとめて削...
-
copy() で属性保存
-
require_onceが動いていない
-
php実行中に実行中のphpファイ...
-
サーバの作業の流れで質問です。
-
コマンドラインの生成でParse e...
-
system()でssh命令文の実行結果...
-
phpからエクセルのマクロを実行...
-
Prompt入力値をphp変数として取...
-
PHPからlhaコマンドを使いたい
-
PHPにてC言語プログラムを呼び...
-
一時停止のコマンドはありますか?
-
社内LANで複数台のPCからApache...
-
execからのls grepコマンドにつ...
-
ヒアドキュメントの中で演算子...
-
httpdのプロセスが自動で消えな...
-
PHPファイルの暗号化(難読化)...
-
コマンドライン実行でDBにアク...
-
phpの実行ユーザーは設定できま...
おすすめ情報
自己解決しました。
自画自賛ではありませんが、最初の段階で割にいいところまで行ってました。
「www-data exec」で検索すると、http://unix.stackexchange.com/questions/115054/p …が見つかりました。その中に、正解がありました。
sudo visudoで
www-data ALL=NOPASSWD: ALL
とすればよかったのです。カレントユーザーを変更するなんてしないで、visudoを変更すればよかったのですね。
とりあえず、お付き合いありがとうございました。