2011-08-02 7 views
11

내 로컬 호스트에서 Apache를 실행하고 있습니다. www 사용자로 실행되는 PHP 스크립트에서 내 컴퓨터의 Rhythmbox 재생을 제어하고 싶습니다. 나는 나 같은 명령 줄에서 실행할 때이 위대한 작품을PHP에서 특정 사용자로 명령 줄 응용 프로그램 실행

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

하지만 www가 사용자로 실행하면 나는 rhythmbox-client하지 않는 것 같아요 : 지금까지 나는 내 PHP 스크립트에 간단한 명령을 Rhythmbox의 내 인스턴스에 액세스 할 수 없다는 사실을 알고 있습니다.

www- 사용자가 아닌 내 사용자로 PHP 스크립트를 실행할 수있는 쉬운 방법이 있습니까? rhythmbox-client을 제어 할 인스턴스가 있습니까?

전반적인 응용 프로그램은 휴대 전화가 오프 훅 상태가되면 음악을 일시 중지하는 PHP 스크립트를 호출하고 전화가 온훅 상태 일 때 재생을 다시 시작한다는 것입니다. 나는 VoIP 폰을 좋아한다!

솔루션 : 나는 대답으로 sudo을 사용하지만, 몇 가지 문제가 있었다 감사 Carpetsmoker와 타렉에. 이를 극복하기 위해 다음을 수행했습니다.

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에 의해 실행 할 수 있으며, 내 전화를 일시 정지 할 수 있습니다/내 음악을 연주!

+1

rhythmbox-client not-as-root는 어떨까요? – genesis

+0

서버를 로컬에서만 실행 하시겠습니까? (일명 결코 그것을 온라인에 두지 않음) – afuzzyllama

+0

@afuzzyllama 네, 단지 로컬입니다. – Tak

답변

16

하나의 해결책은 sudo(8)을 사용하고 있습니다 :

exec('sudo -u myuser ls /'); 

당신은 분명히 그것을 호출하는 웹 서버를 실행하는 사용자를 허용하도록 설정 sudo(8)해야합니다. 다른 명령과 rythymbox 명령을 실행 할 수있는 아파치를 방지하기 위해

wwwuser ALL=/usr/bin/rhythmbox-client 

다음의 sudoers는 visudo(8)로 파일을 편집, 당신은 같은 것을 사용할 수 있습니다.

+0

안녕하세요. '/ etc/sudoers'를'visudo'로 편집했지만,'sudo -u myuser rhythmbox-client --pause'를 실행하면 wwwuser 암호를 묻는 메시지가 나타납니다. 이 인스턴스에 대해 암호 인증을 피할 수있는 방법이 있습니까? – Tak

+0

'wwwuser ALL = NOPASSWD :/usr/bin/rhythmbox-client'로 바꿔주세요. –

+0

감사합니다.이 파일을'wwwuser ALL = (ALL) NOPASSWD :/usr/bin/rhythmbox-client'으로 바꿨습니다. 그것은 명령 줄에서 wwwuser로 실행하면 훌륭하게 작동하지만 Apache를 통해 호출 할 때 내 PHP 스크립트가 실행되지 않습니다. ( – Tak

0

프로세스가 모든 사용자에 의해 실행될 수 있으면 PHP로 실행할 수 있습니다. 예 fortune 명령을 모든 사용자에 대한 x 허가에

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

봐입니다. 그러나이 시간은 전혀 작동하지 않으며 사용자에게 www-data 또는 apache 등을 보내 프로그램을 실행시켜야 할 수도 있습니다. sudo www-data을 입력하고 명령을 실행 해보십시오. 그것이 작동한다면 아파치/PHP는 그것을 실행할 수 있어야합니다.

1)의 sudoers 파일에이 라인을 추가 :

:

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

2) PHP의 EXEC() 명령이 변경되었습니다 내 경우

0

이 솔루션은 이런 식으로왔다
exec("sudo -u myuser prlctl list -a", $out, $r); 

도움을 주셔서 감사합니다.

빅터 Espina

관련 문제