运行audtool的bash脚本的PHP exec的网页输出不正确(Audacious的一部分)

时间:2018-12-29 21:41:01

标签: php bash exec

在本地linux服务器上(带桌面的Rapsberry Pi debian Stretch),我正在使用php,exec和bash脚本向正在运行的Audacious媒体播放器发送“ audtool”命令。当服务器以用户“ pi”启动时,Audacious将自动启动。我已经设置了apache2和php并在服务器上工作,并且可以SSH到服务器并从cli运行所有命令。我相信我已经解决了运行audtool(dbus和设置正确的环境变量)并在命令行上运行php的问题。但是,当在网页上运行php时,我会得到一长串有关apache2的信息

为了达到这个阶段,我花了几个小时(花了一整天的时间在网络上)进行研究,所以接近时我几乎可以触摸它,但是停留在最后一个元素上。该示例将显示正在运行的Audacious实例的当前歌曲。 Audtool需要运行的dbus(寻找显示)。使用exec或shell_exec,运行bash命令(如whoami或ls)没有问题。

php页面(cursong.php):

<?php
echo exec('/var/www/html/cursong.sh');
?>

bash脚本(cursong.sh):

#!/bin/bash
##call current song

pid=`pidof audacious`
user=`ps -p $pid -o user=`
export `strings /proc/$pid/environ | grep DBUS_SESSION_BUS_ADDRESS`
sudo -E -su $user /usr/bin/audtool --current-song

(从这里开始:https://redmine.audacious-media-player.org/boards/1/topics/1058?r=1059

命令行输出:     php -f cursong.php

Artist - Song Title (for example - so this works)

网页上的输出:

declare -x APACHE_LOCK_DIR="/var/lock/apache2" declare -x 
APACHE_LOG_DIR="/var/log/apache2" declare -x 
APACHE_PID_FILE="/var/run/apache2/apache2.pid" declare -x 
APACHE_RUN_DIR="/var/run/apache2" declare -x APACHE_RUN_GROUP="www- 
data" declare -x APACHE_RUN_USER="www-data" declare -x 
INVOCATION_ID="4ce76136ca8842bd9108d6b1b9a5b9ed" declare -x 
JOURNAL_STREAM="8:23896" declare -x LANG="C" declare -x OLDPWD 
declare -x 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 
declare -x PWD="/var/www/html" declare -x SHLVL="1"

我在以下位置设置了apache2用户www-data:     / etc / sudoers:

www-data ALL=NOPASSWD: ALL

/ var / www / html对任何人都是rwx

很明显,我希望在网页上看到“艺术家-歌曲标题”,但我会获取所有的apache2信息。我想念什么,或者我哪里出了问题?

2 个答案:

答案 0 :(得分:0)

我讨厌回答我自己的问题,看起来好像我没有尽力!经过大约五个小时的搜索和尝试修复后,我在SO上看到了这篇文章:

Running command-line application from PHP as specific user

建议在php文件的exec文件中放置一个“ sudo -u用户”。我用“ pi”用户尝试了此操作,但仍然无法正常工作,然后我只用“ sudo”尝试了此操作,嘿,presto!

php文件现在看起来像这样:

<?php
echo shell_exec('sudo /var/www/html/cursong.sh 2>&1');
?>

现在要对它与其他不要求响应但需要大胆地采取行动的audtool命令的工作方式进行一些测试,并了解如何通过将参数传递给bash脚本来减少脚本php文件!

答案 1 :(得分:0)

为了完整起见,请求和操作的php和bash脚本都是使用馈入php url的参数,然后是bash脚本:

带有参数的PHP文件

<?php
$request = $_GET["request"];
echo shell_exec("sudo /var/www/html/cursong.sh \"${request}\" 2>&1");
?>

网址示例:

http://192.168.1.92/cursong.php?request="--playlist-shuffle-status" 

带有参数的Bash脚本

#!/bin/bash
##call request

pid=`pidof audacious`
user=`ps -p $pid -o user=`
export `strings /proc/$pid/environ | grep DBUS_SESSION_BUS_ADDRESS`
sudo -E -su $user /usr/bin/audtool $1

动作的PHP文件

<?php
$action = $_GET["action"];
shell_exec('sudo /var/www/html/playsong.sh \"${request}\" ');
?>

网址示例:

http://192.168.1.92/cursong.php?action="--playback-play" 

动作的打击脚本

#!/bin/bash
##call action

pid=`pidof audacious`
user=`ps -p $pid -o user=`
export `strings /proc/$pid/environ | grep DBUS_SESSION_BUS_ADDRESS`
sudo -E -su $user /usr/bin/audtool $1