我正在创建一个PHP页面,目的是创建和激活Apache VirtualHost文件。
页面生成文件并将其放在/ etc / apache2 / sites-available /中。之后,使用以下命令调用shell脚本:
shell_exec(" / bin / sh /usr/local/bin/myscript.sh");
myscript.sh:
#!/bin/sh
file=$(ls -1t /etc/apache2/sites-available/ | head -1)
a2ensite "$file" 2>&1 >/dev/null
service apache2 reload 2>&1 >/dev/null
sleep 5
脚本似乎已执行(睡眠时间对应于运行所需的时间,如果我不使用2>& 1> / dev / null,我会从a2ensite获得输出) 。 但该网站从未启用。
如果我从终端运行脚本,它工作正常,所以我猜它是某种权限问题。我现在已经玩了两天的sudoers和文件权限,但总是有相同的结果。
一直在添加
等内容www-data ALL = NOPASSWD:/usr/local/bin/myscript.sh
和chmod 777用于测试目的,但没有。
有没有明确的方法可以做到这一点? 我正在运行Ubuntu 16.04和PHP7。
答案 0 :(得分:1)
我认为这是因为www-data无权执行服务和a2ensite命令。
试试这个:
#!/bin/sh
file=$(ls -1t /etc/apache2/sites-available/ | head -1)
sudo a2ensite "$file" 2>&1 >/dev/null
sudo service apache2 reload 2>&1 >/dev/null
sleep 5
然后,使用sudo visudo
编辑sudo文件并添加
www-data ALL=NOPASSWD : /usr/sbin/service, /usr/sbin/a2ensite
答案 1 :(得分:0)
我认为你需要一个点:
shell_exec('/ bin / sh'。'/ usr / local / bin / myscript .sh');
另外,我正在使用单引号......如上所述。
或者您可以尝试:
了shell_exec( '的/ usr / local / bin中/ myscript.sh');
答案 2 :(得分:0)
这已经解决了。问题不是sudoers或文件权限。由于Apache模块mpm-itk已激活,因此命令未正确执行。在我停用它之后工作得很好。
我不需要mpm-itk,但是如果遇到类似问题的人需要激活它,你可以试试这个: https://askubuntu.com/questions/491624/setresuid-operation-not-permitted-when-calling-via-php
(谢谢Myran)