質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2133閲覧

phpプログラムを通じてのサーバ上でのexeファイルの実行に失敗する

Koke1024

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/04/24 10:56

編集2016/04/27 12:06

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❌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 ←実行ファイル

これらの状況から、原因は推測できますでしょうか?よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

下記、二つ可能性があるかなと思います。

  • SELinuxが有効で、その制限で実行できない。

セキュリティ強化のためSELinuxが有効になっている可能性があります。SELinuxが有効かどうかを確認して、有効の場合は、無効にしてどうするのかを見てください。

  • php.ini等で制限している

セキュリティ強化のためexecなどを禁止している可能性があります。php.ini等のPHPの設定を確認してみてください。

投稿2016/04/26 22:23

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koke1024

2016/04/27 12:24

回答ありがとうございます。挙げられた可能性について調査してみました。 ・SELinuxが有効で、その制限で実行できない getenforceコマンド自体が失敗しましたので、SELinuxは導入されていないようです。 ・php.ini等で制限している php.iniのdisable_functionsを調べましたが、execやpassthruなどの記述はありませんでした。 この調査自体が、IPによりアクセスが許可されているphpサーバにコマンドをGETで送り、対象のサーバにcurlを用いてPOSTとして送り、実行したものを表示する、という形で行っていますので、passthruコマンド自体の制限がされていないことは確かです。
guest

0

ベストアンサー

失敗の可能性としては、

  • ワーキングディレクトリの指定
  • a.out のあるディレクトリへの移動権限と a.out の実行権限

がすぐ思いつきますが。
前者については、a.out をフルパスで指定して実行すればよいかと思います。
後者については、php の実行ユーザ (Apache のときのデフォルトは apache)が、a.out のあるディレクトリ移動でき、a.out を実行できる権限があるか、ということです。

投稿2016/04/24 11:21

編集2016/04/26 20:49
unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koke1024

2016/04/26 16:18

回答ありがとうございました。確認が遅くなりすみません。 lsコマンドを実行すると意図したディレクトリのファイル一覧が表示されるため、ワーキングディレクトリの問題ではないと思います。 ubuntuですので実行ユーザは「www-data」であり、試験的に実行ファイルの所有者を「www-data」に変更して試したのですが、成功すればコマンドライン引数に応じたファイルが生成されるはずなのですが、うまくいっていません。 別のユーザで直接実行した際には成功しましたので、プログラム自体の問題でもないと思います。 この場合、原因は別にあると考えてよいでしょうか?
unau

2016/04/26 21: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 を使えるようになる権限設定自体が面倒でもあるので ...
Koke1024

2016/04/27 03:14

回答ありがとうございます。 別のサーバからのアクセスのみ許可されている状態なので、php上からpassthruを用いてlsを行い、その結果を出力したものです。
Koke1024

2016/04/28 11:43

実行ファイルのグループはwww-dataになっていましたが、所有者が別のユーザだったために実行権限がなかったようです。 所有者もwww-dataとしたところ、想定通りにファイルの生成ができました。 unauさん、raccyさんお二方ともベストアンサーとしたいですが、仕様上unauさんをベストアンサーとさせていただきます。 丁寧な回答大変ありがとうございました。
raccy

2016/04/28 11:49

いえいえ、解決できて良かったです。私の方は結局問題なかったみたいですし。 たしかPHPに昔あったセーフモード機能で所有者が自分自身でないと実行できないという制限があったと思いました。セーフモード機能が削除された今でも、それの代替になる設定があるのかも知れません。そこら辺を調べればphp.iniの設定でも解除できるかも知れませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問