web-dev-qa-db-ja.com

Shell_execを使用してPHPからシェルコマンドを実行する

私の論文に含まれているのは、管理インターフェースを作成することです。このインターフェースでは、管理者がアクセスの使用を要求したユーザーを承認できます OpenNebula

承認後、ユーザーをOpenNebulaに追加する必要があります(つまり、コマンドoneadmin createuser username passwordに対応します)。 ( インターフェースの詳細(セクション4.2) 。)

PHPファイルでシェルコマンドを実行してこれを実行しようとしています。なぜこれが機能しないのですか(以下は特定の例です-私が使用している一般的なコードではありません) ?

$execQuery = "/bin/su oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
Shell_exec ($execQuery); //execute query in Shell.

これも機能しません(PHPでスクリプトを実行するときにoneadminとしてログインしている場合でも)。

Shell_exec ("/usr/bin/oneuser create test10 test10");

シェルでそのコマンドを入力すると機能します。私はphpを介して他のシェルコマンドを実行しようとしましたが、それらは問題なく動作するので、問題はどこにあるのでしょうか。

すべてのユーザーにファイル/usr/bin/oneuserrwx権限を付与しました。

3

phpのマニュアルShell_exec 、それは関数が出力を文字列として返すことを示しています。起動したプログラムからの出力が予想される場合は、次のようにキャプチャする必要があります。

$execQuery = "echo -n test_command";
$output = Shell_exec($execQuery);
echo $output;

あなたの質問は、データをキャプチャしようとすることを示していません。コマンドを実行するときにstdoutとstderrも必ず接続するようにすると、何が起こっているかをよりよく理解できるはずです。あなたの例を使用するには:

$output = Shell_exec("/usr/bin/oneuser create test10 test10 2>&1");
var_dump($output);

これは、何が起こっているのかを理解するのに役立ちます。 Shadurが示唆 のように、これらのプログラムは、実行するためにパスワードを入力できるインタラクティブな端末を期待しているようです。入力を必要としない場合でも、インタラクティブなシェルを想定している場合があります。そして、suがこの文脈でニースを演じないのは彼の言うとおりです。ただし、ジョブに適したツールがあります。

Httpユーザーがプログラムをユーザー名としてパスワードなしで実行できるようにSudoを設定できますが、visudoまたはsudoersファイルを編集するために使用するものを実行して他のことを行うことはできません。この行を追加します:

http    ALL=(username) /usr/bin/oneadmin

Phpでは、コマンドは次のようになります。

$execQuery = "Sudo -u username /usr/bin/oneadmin postgres -c '/usr/bin/oneuser create test10 test10'";
$out = Shell_exec ("$execQuery 2>&1");
echo $out
4
Caleb

passthru($cmd)を試してください。

ターミナル画面でユーザーのI/Oを許可します。

1
Francisco Luz

前者の場合、suは通常、実行時にパスワードを要求します。 Shell_execは対話性をうまく処理しません。

oneuserはわかりません。パスワードを要求しようとしているのでしょうか?

0
Shadur

まず、Webサーバーにシステムコマンドの実行を許可する必要があります。ただし、私のインスタントでは、CentOS6.3 64ビット LAMPサーバー を使用します。

まず最初に、Apacheが使用している現在のユーザー(ほとんどの場合はApache)を知る必要があります。PHPでユーザー名を確認し、ユーザー名を確認します。

<?php
    echo Shell_exec("whoami");
?>

私の場合、出力はApacheでした。今度はsudoerを編集して、Apacheに許可を与えます。

以下のコマンドを入力して、sudoerファイルを入力します。

visudo

ファイルの下に次の行を追加します。これにより、ApacheはPHPスクリプトから完全なルートアクセスを取得します。

Apache  ALL=NOPASSWD: ALL

[〜#〜] php [〜#〜]から以下のスクリプトを実行します。これにより、ユーザーはrootとして表示されます。 、

<?php
    echo Shell_exec("Sudo whoami");
?>