ubuntuで建てられたサーバ上にプログラムを配置し実行ファイルを生成し、
phpにアクセスした際のパラメータによって処理を実行させたいと思っています。
php上でexec、system、passthruなどの命令に"./a.out"などの文字列を渡して実行したいのですが、
sshターミナル上で直接"./a.out"と実行すると成功しますが、上記3命令を通して実行しても成功しません。
・このやり方で、どのようなエラーによって失敗しているのかの情報を取得する方法はありますか?
・考えられる原因と、その対策がありましたらお教えください。
追記
passthruの第二引数(return_var)の値はint(139)となっていました。
0でないのでエラー終了を示していることはわかるのですが、139という値は何を示しているのか、はっきりとした資料が見つからず……。
以下のサイトによると、「The operation is not permitted.」を表す終了ステータスだそうですが、
権限の問題は対応したはずです。
「www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin」
https://groups.google.com/forum/#!topic/phantomjs/M0_TM4_W3ZI
以下は関連すると思われる取得出来た限りの情報です。
whoami
www-data
cat /etc/group
www-data:x:33:
cat /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ls -l
-rwxrwxr-x 1 ******* www-data 8619 Apr 26 20:55 a.out ←実行ファイル
これらの状況から、原因は推測できますでしょうか?よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
失敗の可能性としては、
- ワーキングディレクトリの指定
- a.out のあるディレクトリへの移動権限と a.out の実行権限
がすぐ思いつきますが。
前者については、a.out をフルパスで指定して実行すればよいかと思います。
後者については、php の実行ユーザ (Apache のときのデフォルトは apache)が、a.out のあるディレクトリ移動でき、a.out を実行できる権限があるか、ということです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
下記、二つ可能性があるかなと思います。
SELinuxが有効で、その制限で実行できない。
セキュリティ強化のためSELinuxが有効になっている可能性があります。SELinuxが有効かどうかを確認して、有効の場合は、無効にしてどうするのかを見てください。php.ini等で制限している
セキュリティ強化のためexecなどを禁止している可能性があります。php.ini等のPHPの設定を確認してみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/27 01:18
lsコマンドを実行すると意図したディレクトリのファイル一覧が表示されるため、ワーキングディレクトリの問題ではないと思います。
ubuntuですので実行ユーザは「www-data」であり、試験的に実行ファイルの所有者を「www-data」に変更して試したのですが、成功すればコマンドライン引数に応じたファイルが生成されるはずなのですが、うまくいっていません。
別のユーザで直接実行した際には成功しましたので、プログラム自体の問題でもないと思います。
この場合、原因は別にあると考えてよいでしょうか?
2016/04/27 06:09
teratail で質問、回答する場合、Markdown を活用するといいです。たとえば ls の結果などは「```」で囲ってコードブロックにしたほうが見やすくなりますので、以降、そのようにしていただけるとよいかと思います。次のヘルプをご覧ください。
https://teratail.com/help
「ワーキングディレクトリ」の話で、は、「lsコマンドを実行すると意図したディレクトリのファイル一覧が表示される」とありますが、これは ssh で接続したターミナル上、ではなく、PHP の中で ls コマンドを実行した、という意味でしょうか。
ここ、重要ですので確認させてください。
ごく一般的な話からすると、セキュリティの観点からも、「./a.out」で起動するより、フルパスで指定した方がいいと思います。直前に chdir() で明示的にワーキングディレクトリを切り替えた後ならよいかと思いますが。
「su -c ./a.out www-data」や「sudo -u www-data ./a.out」が実行できるなら、ターミナルから www-data での実行を試せますが、su や sudo を使えるようになる権限設定自体が面倒でもあるので ...
2016/04/27 12:14
別のサーバからのアクセスのみ許可されている状態なので、php上からpassthruを用いてlsを行い、その結果を出力したものです。
2016/04/28 20:43
所有者もwww-dataとしたところ、想定通りにファイルの生成ができました。
unauさん、raccyさんお二方ともベストアンサーとしたいですが、仕様上unauさんをベストアンサーとさせていただきます。
丁寧な回答大変ありがとうございました。
2016/04/28 20:49
たしかPHPに昔あったセーフモード機能で所有者が自分自身でないと実行できないという制限があったと思いました。セーフモード機能が削除された今でも、それの代替になる設定があるのかも知れません。そこら辺を調べればphp.iniの設定でも解除できるかも知れませんね。