2014-12-04 3 views
0

Обязательная информация: Я запускаю это с веб-сервера домашнего ПК, Fedora 20 с httpd из yum repo. Я взял базовую версию моего .cgi-файла из: http://www.instructables.com/id/Simple-linux-commands-from-a-web-page/ и пытался изменить его для моих нужд.Выполнение скриптов Bash на стороне сервера через CGI

Моя проблема - я могу очень легко заставить скрипт cgi запускать uname, lspci, ls, а также любой скрипт в папке/usr/bin, который просто отображает текст. Я не могу, однако, запустить сценарий, который на самом деле что-то делает. Например, я не могу заставить cgi запустить «rhythmbox-client -next», чтобы пропустить песню в Rhythmbox Media Player.

Мое намерение: я запускаю «музыкальный бот» для своих друзей ventrilo server, и я хочу дать им (защищенный паролем) способ доступа к боту из Интернета, сменить песни, добавить песню в очередь воспроизведения , ect ect.

функции (ни один из которых я могу работать), что мне нужно не: Следующая песня (Rhythmbox-клиент --next) Предыдущая песня (Rhythmbox-клиент --previous) Добавить песни в очереди (Rhythmbox -clinet --enqueue NAME) Очистить очередь песни (rhythmbox-client --clear-queue Показывать текущую песню (rhythmbox-client -print-playing) Показать список композиций на компьютере (ls/home/user/Music | grep ".mp3")

Попытайтесь, как я мог, я не могу заставить ЛЮБОЙ из этих вещей работать. Я также пытался использовать Banshee вместо rhythmbox с той же проблемой.

раздел сценария, который предполагает, чтобы выполнить команды ниже: эхо «» эха «Элита Музыка Панель Bot управления» PATH = "/ бен:/USR/бен:/USR/UCB:/USR/Opt/бен» экспорт $ PATH эхо "" эхо ""

# test if any parameters were passed 
if [ $CMD ] 
then 
    case "$CMD" in 
    BotInfo) 
    echo "<pre>" 
     /bin/BotInfo 
    echo "System Name:" `/bin/uname -n` 
     echo "</pre>" 
     ;; 

    next) 
     echo "Skipped to the next song." 
     /bin/rhythmbox-client --next 
     ;; 

    back) 
     echo "Repeating the previous song. <pre>" 
     /bin/rhythmbox-client --previous 
     echo "</pre>" 
     ;; 

playing) 
     echo "The current song playing is... <pre>" 
     rhythmbox-client --print-playing 
     echo "</pre>" 
     ;; 

queue) 
     echo "The requested song has been added to the queue. <pre>" 
     rhythembox-client --enqueue $QUEUE_SONG 
     echo "</pre>" 
     ;; 

     rating) 
      echo "The rating of the current song has been set to $RATING. <pre>" 
      /bin/rhythmbox-client --set-rating $RATING 
      echo "</pre>" 
      ;; 
ls) 
    echo "<pre>" 
    list=`ls /home/USER/Music | grep ".mp3"` 
    echo "$list" 
    echo "</pre>" 
    ;; 
    *) 
     echo "Unknown command $CMD<br>" 
     ;; 
    esac 
fi 

самый первый из них является простой скрипт, который отображает системное время (дата), CPUInfo, MemInfo, ЭСТ и он работает , Другие же этого не делают.

Я попытался запустить команды Баш, как

echo "$(command)" 

для печати разыгрывании я попытался сделать это нравится:

playing=`rhythmbox-client --print-playing` 
echo "$playing" 

Я также пытался создать скрипт, который :

#!/bin/bash 
echo "This command worked!" 
rhythmbox-client --next 

Я назвал эту rhynext, CHMOD + х и переехал в/USR/бен, при запуске в терминале он работает, когда говорит гр gi, чтобы сделать/usr/bin/rhynext, он ничего не делает.

Пожалуйста, помогите.

Я достаточно умен, чтобы перепроектировать код, если вы можете просто дать мне один сегмент/пример кода, который будет работать, я, скорее всего, смогу преобразовать его в мои приложения. Заранее спасибо.

Редактировать: При запуске скрипта «next» для Banshee в качестве пользователя apache.

sudo -u apache /usr/bin/next 
[sudo] password for OMMITED: 
Unhandled Exception: System.UnauthorizedAccessException: Access to the path "/usr/share/httpd/.config" is denied. 
    at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.Directory.CreateDirectory (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.DirectoryInfo.Create() [0x00000] in <filename unknown>:0 
    at (wrapper remoting-invoke-with-check) System.IO.DirectoryInfo:Create() 
    at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.Directory.CreateDirectory (System.String path) [0x00000] in <filename unknown>:0 
    at Hyena.Paths.InitializePaths() [0x00000] in <filename unknown>:0 
    at Hyena.Paths.set_ApplicationName (System.String value) [0x00000] in <filename unknown>:0 
    at Banshee.ServiceStack.Application.InitializePaths() [0x00000] in <filename unknown>:0 
    at Booter.Booter.Main() [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.UnauthorizedAccessException: Access to the path "/usr/share/httpd/.config" is denied. 
    at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.Directory.CreateDirectory (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.DirectoryInfo.Create() [0x00000] in <filename unknown>:0 
    at (wrapper remoting-invoke-with-check) System.IO.DirectoryInfo:Create() 
    at System.IO.Directory.CreateDirectoriesInternal (System.String path) [0x00000] in <filename unknown>:0 
    at System.IO.Directory.CreateDirectory (System.String path) [0x00000] in <filename unknown>:0 
    at Hyena.Paths.InitializePaths() [0x00000] in <filename unknown>:0 
    at Hyena.Paths.set_ApplicationName (System.String value) [0x00000] in <filename unknown>:0 
    at Banshee.ServiceStack.Application.InitializePaths() [0x00000] in <filename unknown>:0 
    at Booter.Booter.Main() [0x00000] in <filename unknown>:0 
+1

Вы пытались перенаправить поток ошибок в файл (чтобы увидеть, если появляется какое-либо сообщение об ошибке)? – syme

+1

'/ bin/rhythmbox-client' может ожидать подключения к интерфейсу db rhythmbox текущего пользователя, этот cgi не сможет этого сделать. Возможно, вам придется вручную открыть правильный сеанс dbus. –

+0

Когда вы его протестируете, запустите скрипт как пользователь apache (например, 'sudo -u www-data./Yourscript'). –

ответ

0

Проблема вытекает из Rhythmbox-клиент ожидает подключения к Dbus сессии текущего пользователя, чтобы собрать команды Инфо/выпуск Rhythmbox. (Спасибо Etan Reisner за указание на это)

После того, как я выкопал в Интернете, я нашел решение. Создайте 2 файла, один для сохранения адреса сеанса пользователя dbus текущего пользователя во временном файле при входе в систему, а другой - для вызова адреса dbus и маршрутизации команды CGI через него.

Файл 1: Оставьте в нужную папку, добавить, чтобы начать элементы, сделать исполняемый (CHMOD + х) название "Get.DBus.sh"

#!/bin/bash 
set | grep DBUS_SESSION_BUS_ADDRESS > ~/.DBUS_temp 

Файл 2: Сделать исполняемым, перейдите в/USR/бен, сделать исполняемый (CHMOD + х) название "Run.DBus.sh"

#!/bin/bash 
source /home/USER/.DBUS_temp 
export DBUS_SESSION_BUS_ADDRESS 
$* 

изменить команду выполнения требуемой команды в CGI из ..

command) 
    /bin/command 
;; 

TO

command) 
/bin/RunDBus.sh /bin/command 
;; 

Проблема решена. Все команды работают по назначению.

Спасибо за всякую помощь, никогда не будет иметь, хотя это был вопрос XD DBus

Смежные вопросы