web-dev-qa-db-ja.com

特定のユーザーとしてPHPからコマンドラインアプリケーションを実行する

ローカルホストでApacheを実行しています。 PHPスクリプトから、自分のマシンでのRhythmboxの再生を制御したいと考えています。これまでのところ、PHPスクリプトに簡単なコマンドがあります。

exec('rhythmbox-client --pause');

これをコマンドラインから実行するとうまくいきますが、www-userとして実行すると、rhythmbox-clientがRhythmboxのインスタンスを認識していない/アクセスできないと思います。

PHPスクリプトをwww-userではなく自分のユーザーとして実行する、またはrhythmbox-clientにどのインスタンスを制御するかを指示する簡単な方法はありますか?

全体的なアプリケーションは、私の電話がオフフックになると、私のPHPスクリプトが呼び出され、音楽を一時停止し、電話がオンフックになると再生を再開するというものです。VoIP電話が大好きです!

ソリューション: CarpetsmokerとTarekのおかげでSudoを回答として使用しましたが、いくつかの問題がありました。それらを克服するために、私は次のことをしました:

rhythmbox-clientを呼び出すbashスクリプトを作成しました。このbashスクリプトは、以下の回答で説明されているようにPHPでSudoを使用して実行されました。残念ながらrhythmbox-clientは制御する環境がわからなかったため、bashスクリプトはこのような:

#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
        export $DBUS_ADDRESS
        /usr/bin/rhythmbox-client --pause
fi

これで、bashスクリプトをPHPおよびwwwuserで実行できます。また、私の電話で音楽を一時停止/再生できます。

16
Tak

1つの解決策はSudo(8)を使用することです:

_exec('Sudo -u myuser ls /');
_

もちろん、Sudo(8)をセットアップして、Webサーバーを実行しているユーザーがWebサーバーを呼び出せるようにする必要があります。 sudoersファイルをvisudo(8)で編集すると、次のようになります。

_wwwuser ALL=/usr/bin/rhythmbox-client
_

Apacheが他のコマンドおよびonly rythymboxコマンドを実行できないようにするため。

22
Martin Tournoij

私の場合、解決策はこのようになりました:

1)sudoersファイルに次の行を追加しました:

myuser ALL=(ALL) NOPASSWD: /usr/bin/prlctl  
_www ALL=(ALL) NOPASSWD: /usr/bin/prlctl     # IMPORTANT!!!

2)PHP内のEXEC()コマンドが次のように変更されました:

exec("Sudo -u myuser prlctl list -a", $out, $r);

あなたの助けをありがとう!

ビクターエスピナ

1
VictorEspina

プロセスを任意のユーザーが実行できる場合は、PHPで実行できます。例はfortuneコマンドです

-rwxr-xr-x 1 root root 18816 Oct  1  2009 /usr/games/fortune

すべてのユーザーのx権限を確認します。しかし、これはまったく機能しない場合があり、ユーザー、www-dataまたはApacheなどにプログラムを実行させる必要がある場合があります。 Sudo www-dataを実行して、コマンドを実行してみてください。動作する場合は、Apache/PHPで実行できるはずです。

0
Kumar