私の論文には、管理者がアクセスを要求しているユーザーを承認できる管理インターフェイスを作成することが含まれています。 開いた星雲。
承認後、ユーザーは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.
この方法も機能しません(oneadminでログインしてもPHPでスクリプトを実行するとき)。
shell_exec ("/usr/bin/oneuser create test10 test10");
シェルにこのコマンドを入力すると機能します。私はPHPで他のシェルコマンドを実行してみましたが、うまく動作しますが、問題が何であるか疑問に思います。
/usr/bin/oneuser
rwx
すべてのユーザーにファイル権限を付与しました。
ベストアンサー1
優秀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);
これは何が起こっているのか理解するのに役立ちます。 〜のようにシャドールが提案、これらのプログラムを実行するには、パスワードを入力するための対話型端末が必要です。入力が不要な場合でも、インタラクティブシェルを期待できます。彼の言葉が正しい。su
この場合はうまくいきません。しかし、仕事に適したツールがあります。
sudo
httpユーザーがパスワードなしでユーザー名でプログラムを実行できるように設定できますが、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