我有如下的php代码(kill.php):
<?php echo exec("/home/duke/aa/scripts/test.sh"); ?>
test.sh 如下所示:
screen -S server -X quit
如果我在终端运行 php 代码,php screen -S server -X quit
脚本就会终止屏幕会话。
然而,如果我将我的网络浏览器指向http://我的网站/test.php,它显示“未找到屏幕会话”,并且不会终止屏幕会话。我该怎么做才能让它通过网络浏览器工作?
答案1
默认配置是将所有 PHP 页面(及其生成的命令)运行为www-data
用户,这意味着他们只能访问www-data
。
您需要在自己的用户帐户下运行该脚本,可以通过以下方式完成:
使用
sudo
;例如,以下sudoers入口:www-data: ALL=(duke) NOPASSWD: /home/duke/aa/scripts/test.sh
会让你跑
exec("sudo -u duke /home/duke/aa/scripts/test.sh");
或安装苏普:PHP 脚本将在其所有者的帐户下运行。
您当前的示例运行脚本两次,这可能会产生各种副作用。如果您想显示脚本的输出,请删除第二个exec()
调用(或者更好的方法是使用system()
或代替)。passthru()
答案2
我猜测原因是您以 Web 服务器用户以外的其他用户身份启动屏幕会话(可能www-data
),但由于脚本在通过浏览器启动时将以 Web 服务器用户身份运行,因此它无权向其他用户的屏幕会话发送命令。
如何修复此问题取决于您最初如何启动屏幕会话。如果可以以 Web 服务器用户身份启动它,这将是最简单的解决方案,但其他选项可能包括 sudo 或更复杂的措施 (*)。告诉我们您正在做什么,以便我们可以提出有用的建议。
(*) 我已经看到了针对此类问题的“解决方案”,其中 PHP 脚本将写入一个特殊文件,该文件由 cronjob 检测到,只有当该文件存在时才会开始工作......