在本地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信息。我想念什么,或者我哪里出了问题?
答案 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