首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行audtool的bash脚本的PHP exec的网页输出不正确(Audacious的一部分)

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

Stack Overflow用户
提问于 2018-12-30 05:41:01
回答 2查看 212关注 0票数 0

在本地linux服务器(Rapsberry Pi debian stretch with desktop)上,我正在使用php、exec和bash脚本向一个正在运行的大胆媒体播放器发送"audtool“命令。当服务器使用用户"pi“启动时,Audacious会自动启动。我已经设置了apache2和php并在服务器上工作,我可以通过ssh连接到服务器并从cli运行所有命令。我相信我已经解决了运行audtool (dbus并设置正确的环境变量)和在命令行上运行php的问题。然而,当在网页上运行php时,我得到了一长串关于apache2的信息。

为了达到这个阶段,我花了几个小时(花了一整天)在网络上研究这个问题,我几乎可以触摸到它,但却卡在了最后一个元素上。该示例显示正在运行的Audacious实例中的当前歌曲。Audtool需要一个正在运行的dbus (查找显示器)。使用exec或bash运行shell_exec命令没有任何问题。

php页面(cursong.php):

代码语言:javascript
复制
<?php
echo exec('/var/www/html/cursong.sh');
?>

bash脚本(cursong.sh):

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
Artist - Song Title (for example - so this works)

网页上的输出:

代码语言:javascript
复制
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"

我在/etc/sudoers中使用以下内容设置了apache2用户www-data:

代码语言:javascript
复制
www-data ALL=NOPASSWD: ALL

和/var/www/html对任何人来说都是rwx

显然,我期待着在网页上看到“艺术家-歌曲标题”,但我得到的却是所有的apache2信息。我遗漏了什么,或者我哪里错了?

EN

回答 2

Stack Overflow用户

发布于 2018-12-30 23:21:45

我讨厌回答自己的问题,让人觉得我不够努力!经过大约五个小时的搜索和尝试修复后,我在so上偶然发现了这篇文章:

Running command-line application from PHP as specific user

建议在-u文件的执行文件中添加"sudo php用户“。我用"pi“用户试了试,还是不起作用,然后我简单地用"sudo”试了试,嘿,马上!!

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

代码语言:javascript
复制
<?php
echo shell_exec('sudo /var/www/html/cursong.sh 2>&1');
?>

现在测试一下它如何与其他audtool命令一起工作,这些命令不要求响应,但需要audacious的操作,并看看如何通过向bash脚本传递一个参数来减少php文件的脚本编写!

票数 0
EN

Stack Overflow用户

发布于 2018-12-31 01:43:01

为了完整起见,php和bash脚本用于请求和操作,使用一个参数传递给php url,然后传递给bash脚本:

带参数的PHP文件

代码语言:javascript
复制
<?php
$request = $_GET["request"];
echo shell_exec("sudo /var/www/html/cursong.sh \"${request}\" 2>&1");
?>

url示例:

代码语言:javascript
复制
http://192.168.1.92/cursong.php?request="--playlist-shuffle-status" 

带参数的Bash脚本

代码语言:javascript
复制
#!/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文件

代码语言:javascript
复制
<?php
$action = $_GET["action"];
shell_exec('sudo /var/www/html/playsong.sh \"${request}\" ');
?>

url示例:

代码语言:javascript
复制
http://192.168.1.92/cursong.php?action="--playback-play" 

用于操作的Bash脚本

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53973541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档