
【環境】
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ランキング
-
PHPからシェルコマンドの実行
-
PHPファイルをCron設定からのみ...
-
mysql複数レコードをまとめて削...
-
php実行中に実行中のphpファイ...
-
PHPからCRONの編集
-
社内LANで複数台のPCからApache...
-
FTPコマンドでディレクトリごと...
-
php.iniって。。
-
ファイル一覧表(LAN内の別PC)
-
フォントの色を変えるには?
-
「旭日中綬賞 」とはどんな賞で...
-
PHPのif文でその処理を途中で抜...
-
PHP postgres でロールバック...
-
phpのプログラムエラー
-
phpのswitch文のcaseで
-
mod_phpとcgi版phpはなにがどう...
-
mb_send_mail関数が利用出来ない
-
PDOとmysql_real_escape_str
-
require_once で読み込まれたか?
-
CakePHP2のCronでのShellを使う...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
シェルスクリプトをPHPで動かそ...
-
PHPでコマンドプロンプトを実行...
-
require_onceが動いていない
-
ヒアドキュメントの中で演算子...
-
PHPでサーバーにインストールさ...
-
php実行中に実行中のphpファイ...
-
社内LANで複数台のPCからApache...
-
ブラウザからexecコマンドを実...
-
PHPからバッチファイルの実行
-
Switch文における、returnとbre...
-
PHPからPostgreSQLのダンプを実行
-
正常に動作しない
-
htmlでsubmitで指定したAction...
-
PHPファイルをcronで実行す...
-
[cakePHP]外部ファイルの実行方法
-
テルネットしコマンドを自動実行
-
copy() で属性保存
-
PHP+MySQLでrollback出来ない
-
入力してからn時間(日)後、DBデ...
おすすめ情報
自己解決しました。
自画自賛ではありませんが、最初の段階で割にいいところまで行ってました。
「www-data exec」で検索すると、http://unix.stackexchange.com/questions/115054/p …が見つかりました。その中に、正解がありました。
sudo visudoで
www-data ALL=NOPASSWD: ALL
とすればよかったのです。カレントユーザーを変更するなんてしないで、visudoを変更すればよかったのですね。
とりあえず、お付き合いありがとうございました。