我正在尝试在PHP中使用exec(),当通过Web浏览器和命令行shell使用它时会得到不同的结果。
简单的事情:
<?php exec('mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>
从Web浏览器调用此选项会导致无法安装任何内容,并通过命令行(php-cli)运行它会导致挂载成功执行。 也没有错误返回到$ output数组。所以我没有任何事情要做。 我正在运行web和cli作为同一个用户,所以它不应该是权限问题。 SElinux已禁用,因此不会阻止任何操作。防火墙同样如此 - 也是禁用的。
如何让PHP exec()在Web浏览器和命令行中的行为方式相同?
答案 0 :(得分:0)
你只能以root身份挂载分区,也许添加www-data(我假设是运行apache的用户)sudoers会解决问题,但它会给你一个很大的安全漏洞。但由于您无法写密码,因为它是一项服务,您必须告诉不要向该用户提供密码。
将其添加到你的sudoers的底部:
www-data ALL=NOPASSWD: ALL
并使用命令
<?php exec('sudo mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>
显然这是一个前所未有的安全漏洞。
避免它的一种方法可能是使用队列来放置作业并使用服务来处理它,该服务验证作业是否安全并在必要时进行安装。
具有php界面的漂亮队列是beanstalk