2011-08-02 10 views
11

Tôi đang chạy Apache trên máy chủ cục bộ của mình. Từ một kịch bản PHP chạy như www-người dùng tôi muốn kiểm soát phát lại Rhythmbox trên máy tính của tôi. Cho đến nay tôi có một câu lệnh đơn giản trong kịch bản PHP của tôi:Chạy ứng dụng dòng lệnh từ PHP với tư cách người dùng cụ thể

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

này hoạt động tuyệt vời khi tôi chạy nó từ dòng lệnh như tôi, nhưng nếu nó chạy như www-người sử dụng tôi đoán rhythmbox-client không biết/không thể truy cập vào bản Rhythmbox của tôi.

Có cách nào dễ dàng để tập lệnh PHP chạy như người dùng của tôi thay vì người dùng www hay không hoặc để cho biết rhythmbox-client trường hợp nào cần kiểm soát?

Ứng dụng tổng thể là khi điện thoại của tôi tắt, nó gọi tập lệnh PHP của tôi tạm dừng nhạc và tiếp tục phát lại khi điện thoại đang bật. Tôi yêu điện thoại VoIP!

Giải pháp: Nhờ Carpetsmoker và Tarek tôi đã sử dụng sudo là câu trả lời nhưng có một vài vấn đề. Để khắc phục chúng, tôi đã làm như sau:

Tạo tập lệnh bash để gọi rhythmbox-client. Kịch bản lệnh bash này được thực hiện bằng cách sử dụng sudo trong PHP như được mô tả trong câu trả lời dưới đây. Thật không may rhythmbox-client không biết những gì môi trường để kiểm soát, vì vậy các tập lệnh bash trông như thế này:

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

Bây giờ kịch bản bash có thể được thực hiện bởi PHP và wwwuser, và điện thoại của tôi có thể tạm dừng/chơi nhạc của tôi!

+1

điều gì sẽ cố gắng chạy nhịp điệu-khách không phải là gốc? – genesis

+0

Bạn có dự định chỉ chạy máy chủ của mình cục bộ không? (aka không bao giờ đặt nó trực tuyến) – afuzzyllama

+0

@afuzzyllama Có nó chỉ là tại địa phương – Tak

Trả lời

16

Một giải pháp là sử dụng sudo(8):

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

Bạn sẽ, rõ ràng, cần phải thiết lập sudo(8) cho phép người dùng chạy máy chủ web của bạn để gọi nó. Chỉnh sửa file sudoers với visudo(8), bạn có thể sử dụng một cái gì đó như:

wwwuser ALL=/usr/bin/rhythmbox-client 

Để ngăn chặn Apache từ việc có thể để chạy các lệnh khác và chỉ lệnh rythymbox.

+0

Hi cảm ơn cho câu trả lời. Tôi đã chỉnh sửa '/ etc/sudoers' bằng' visudo', nhưng khi tôi thực thi 'sudo -u myuser rhythmbox-client --pause' tôi được nhắc nhập mật khẩu wwwuser. Có cách nào để tránh xác thực mật khẩu cho trường hợp này không? – Tak

+0

đổi thành 'wwwuser ALL = NOPASSWD:/usr/bin/rhythmbox-client ' –

+0

Cảm ơn tôi đã đổi nó thành' wwwuser ALL = (TẤT CẢ) NOPASSWD:/usr/bin/rhythmbox-client'. Nó hoạt động tuyệt vời nếu tôi chạy nó từ dòng lệnh như wwwuser, nhưng kịch bản PHP của tôi sẽ không chạy nó khi được gọi qua Apache: ( – Tak

0

Nếu một tiến trình có thể được chạy bởi bất kỳ người dùng nào, nó có thể được chạy bởi PHP. Ví dụ: fortune lệnh

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

Hãy xem sự cho phép x cho mọi người dùng. Nhưng điều này một số lần không phải ở tất cả các công việc và bạn có thể phải để cho người sử dụng, www-data hoặc apache vv, chạy chương trình. Bạn có thể sudo www-data và cố gắng chạy lệnh. Nếu nó hoạt động thì Apache/PHP sẽ có thể chạy nó.

0

Trong trường hợp của tôi, giải pháp đến theo cách này:

1) Thêm dòng này để sudoers file:

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

2) Các EXEC() lệnh trong PHP đã được đổi thành:

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

Cảm ơn rất nhiều sự giúp đỡ của bạn!

Victor Espina