2011-08-02 7 views
11

Yerel sunucumda Apache çalıştırıyorum. Www-user olarak çalışan bir PHP betiğinden, makinemde Rhythmbox çalmayı kontrol etmek istiyorum. Ben benim kadar komut satırından çalıştırmak, bu harika çalışıyorPHP'den belirli bir kullanıcı olarak komut satırı uygulamasını çalıştırma

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

, ancak www-kullanıcı olarak çalışır eğer rhythmbox-client değil sanırım: Şimdiye kadar benim PHP komut dosyası basit bir komut var Rhythmbox örneğimi bildiğim/erişemiyorum.

Bu PHP betiğinin www kullanıcısından ziyade kullanıcı olarak çalışmasının veya rhythmbox-client kontrol etmek için hangi örneği kullanacağının kolay bir yolu var mı?

Genel uygulama, telefonum kapalıyken telefonum çalan bir PHP betiğimi çağıran ve telefon açıkken çalmaya devam eden bir uygulamadır. VoIP telefonlarını seviyorum!

Çözüm: Ben cevap olarak sudo kullanılan ancak sorunların bir çift vardı Teşekkür Carpetsmoker ve Tarek. Üstesinden gelmek için:

rhythmbox-client'u aramak için bir bash betiği oluşturuldu. Bu bash betiği, aşağıdaki yanıtta açıklandığı gibi PHP'de sudo kullanılarak çalıştırılmıştır. Maalesef rhythmbox-client bash script şöyle yüzden, kontrol ne çevre bilmiyordum:

#! /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 

Şimdi bu bash komut PHP ve wwwuser tarafından çalıştırılabilir ve benim telefon duraklatabileceğinizi/benim müzik çalmak!

+1

rhythmbox-client-root olarak çalıştırmayı denemeye ne dersiniz? – genesis

+0

Sadece sunucunuzu yerel olarak çalıştırmayı mı planlıyorsunuz? (aka asla online koyma) – afuzzyllama

+0

@afuzzyllama Evet sadece yerel olarak – Tak

cevap

16

bir çözüm sudo(8) kullanıyor:

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

Sen, belli ki, onu çağırmak için web sunucunuzu çalıştıran kullanıcıya izin vermek için kurulum sudo(8) gerekecektir. diğer komutlar ve sadece rythymbox komut çalıştırmak mümkün olmaktan Apache önlemek için

wwwuser ALL=/usr/bin/rhythmbox-client 

: Sudoers visudo(8) dosyası düzenleme, gibi bir şey kullanabilirsiniz.

+0

Merhaba Cevabınız için teşekkürler. 'Visudo' ile '/ etc/sudoers 'düzenledim, ama sudo -u myuser rhythmbox-client --pause' i çalıştırdığımda wwwuser parolası için uyarıldım. Bu örnek için şifre kimlik doğrulamasını önlemek için herhangi bir yolu var mı? – Tak

+0

bunu "wwwuser ALL = NOPASSWD" olarak değiştir:/usr/bin/rhythmbox-client ' –

+0

Teşekkür ederim,' wwwuser ALL = (ALL) NOPASSWD:/usr/bin/rhythmbox-client' olarak değiştirdim. Komut satırından wwwuser olarak çalıştırırsam harika çalışır, ancak PHP betiğimde Apache ile çağrıldığında çalıştırılamaz :( – Tak

0

Bir işlem herhangi bir kullanıcı tarafından çalıştırılabilirse PHP tarafından çalıştırılabilir. Örnek fortune komut her kullanıcı için x izni de

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

Bak olduğunu. Ama bu bazı zamanlarda hiç işe yaramıyor ve kullanıcıya, www-data veya apache vb. sudo www-data yapabilir ve komutu çalıştırmayı deneyebilirsiniz. Eğer çalışırsa Apache/PHP onu çalıştırabilmelidir.

1) Sudoers dosyasına bu satırları eklendi:

:

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

2) PHP EXEC() komutu değiştirildi Benim durumumda

0

, çözüm yolu geldi
exec("sudo -u myuser prlctl list -a", $out, $r); 

Yardımlarınız için çok teşekkürler!

Victor Espina