必填信息:
我正在使用来自yum repo的httpd的家用PC Web服务器Fedora 20来运行它。
我从.aa中获取了.cgi文件的基本版本,并一直在尝试根据自己的需要对其进行修改。
我的问题-我可以很容易地使cgi脚本以及/ usr / bin文件夹中仅显示文本的任何脚本一起运行uname,lspci,ls。
但是,我无法运行实际上可以执行某些操作的脚本。例如,我无法让cgi运行“ rhythmbox-client --next”来跳过Rhythmbox Media Player上的歌曲。
我的意图是:我为我的朋友ventrilo服务器运行一个“音乐bot”,我想给他们一种(受密码保护的)方式从网络访问该bot,更改歌曲,将歌曲添加到播放队列等。
我需要的功能(无法使用):
下一首歌(rhythmbox-client --next)
上一首歌(rhythmbox-client-上一首)
将歌曲添加到队列(rhythmbox-clinet-使NAME入队)
清除歌曲队列(rhythmbox-client --clear-queue
显示当前播放的歌曲(rhythmbox-client --print-playing)
在计算机上显示歌曲列表(ls / home / user / Music | grep“ .mp3”)
尽我所能,这些事情我都做不到。我也尝试过使用Banshee代替rhythmbox,同样的问题。
假定执行命令的脚本部分如下:
回声“”
回声“精英音乐机器人控制面板”
PATH =“ / bin:/ usr / bin:/ usr / ucb:/ usr / opt / bin”
导出$ 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等,并且它们确实起作用。但是其他人则没有。
我试过运行bash命令为
echo "$(command)"
对于印刷品,我尝试这样做:
playing=`rhythmbox-client --print-playing`
echo "$playing"
我也尝试过创建一个脚本:
#!/bin/bash
echo "This command worked!"
rhythmbox-client --next
我将其命名为rhynext,chmod + x并移至/ usr / bin,当在终端中运行时它起作用,当告诉cgi执行/ usr / bin / rhynext时,它什么也不做。
请帮忙。
我很聪明,可以对代码进行逆向工程,如果您可以简单地给我一个可以使用的代码段/示例,我很可能将其转换为我的用途。提前致谢。
编辑:以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
最佳答案
问题源于rhythmbox-client期望连接到当前用户的dbus会话以收集rhythmbox info / issue命令。 (感谢Etan Reisner指出这一点)
在网上进行少量挖掘之后,我找到了解决方案。创建2个文件,一个用于在登录时将当前用户的dbus会话地址保存到临时文件中,另一个用于调用dbus地址并通过它路由CGI命令。
文件1:保留在所需的文件夹中,添加到启动项,将可执行文件(chmod + x)命名为“ Get.DBus.sh”
#!/bin/bash
set | grep DBUS_SESSION_BUS_ADDRESS > ~/.DBUS_temp
文件2:制作可执行文件,移至/ usr / bin,制作可执行文件(chmod + x),名称为“ Run.DBus.sh”
#!/bin/bash
source /home/USER/.DBUS_temp
export DBUS_SESSION_BUS_ADDRESS
$*
从中更改CGI中所需命令的执行命令。
command)
/bin/command
;;
至
command)
/bin/RunDBus.sh /bin/command
;;
问题解决了。所有命令均按预期工作。
感谢大家的帮助,尽管这是DBus的XD问题,
关于linux - 通过CGI运行服务器端Bash脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27302731/