【发布时间】:2021-08-05 00:45:19
【问题描述】:
我的目标是在数组中接收命令“semanage login -l”消息并在浏览器中显示结果。 我在 Ausearch 类中创建了一行,其中有一个函数 processSudoInput() 内容:
public function processSudoInput()
{
exec("echo password | /usr/bin/sudo -S semanage login -l ",$output);
return $output;
}
问题是当我在终端中打印 $output 时,我得到了很好的结果(一个带有字符串的数组)。 ausearch 类在一个单独的 .php 文件 CommandHandler.php 中被调用,其中包含:
use Commands\Ausearch;
include 'Commands/Ausearch.php';
function displayLogData()
{
$ausearch = new Ausearch();
$result = $ausearch->processSudoInput();
var_dump($result);
}
displayLogData();
当我在 PHPStorm 中执行这个 php 代码时,我得到了结果:
[0]=>
string(0) ""
[1]=>
string(70) "Login Name SELinux User MLS/MCS Range Service"
[2]=>
string(0) ""
然后继续。 但是当我在浏览器中(在 HTML 文件中)调用这个函数时,它会返回
array(0) { }
在浏览器中。
到目前为止,我已经尝试执行 visudo 并添加
%www-data ALL=NOPASSWD:ALL
甚至尝试chown -R apache:apache /var/www
和chown -R 777 /var/www
没有运气。
甚至将 selinux 设置为 permissive
目前使用的是CentOS8,目标是不惜一切代价在浏览器内部实现一个包含上述数据的数组,不考虑安全性。
【问题讨论】:
-
从互联网上随机复制和粘贴内容不太可能解决您的问题,更有可能危及或破坏您的系统。如果您在 sudoers 文件中设置了
NOPASSWD,为什么要将密码传递给sudo命令?为什么你的 sudoers 文件引用了www-data而你后来引用了用户apache?semanage在你的路径中吗?您是否尝试过使用exec()的第三个参数来让您更好地了解问题所在? -
你说得很好,在发布这个问题后,我得出的结论是
www-data不再是用户,而是apache。此外,我制作了 shell 脚本,这些命令被封装并稍后在代码中执行exec(sudo /path/to/shell),我需要exec()函数返回类型值(不需要shell_exec)。后来在 sudoers 文件中,我给了NOPASSWD对该文件的访问权限,一切正常。总之,不要在凌晨 3 点为你的论文实验写代码 :)