所以我想在我的php脚本中执行以下命令:
exec("/path/to/command");
因为它是运行php脚本的www-data用户,所以我目前无法运行此命令。 我已经阅读了一些关于suexec能够运行命令的内容,就像它是一个不同的用户一样。我发现很难理解这是如何工作的。
我已经安装了suexec并编辑了/ etc / apache2 / suexec / www-data文件并添加了:
/home/user_to_run_command/script.php
我还编辑了/ etc / apache2 / sites-enabled / 000-default并添加了:
SuexecUserGroup user_to_run_command user_to_run_command
我错过了什么吗?
答案 0 :(得分:0)
suEXEC仅在PHP以CGI模式执行时才起作用,但如果PHP作为apache2运行则不起作用 模块。我猜你是把它作为模块运行。
另一种方法是将所有权转让给所需用户,然后设置suid
位:
chown desired_user your.program
chmod u+s your.program
现在执行your.program
时,它具有权限,就像它所有者执行的那样。请关注我已链接的Wiki文章以获取更多信息。
旁注:这只适用于二进制文件(不使用shell脚本,因为它们由没有设置suid位的shell二进制文件执行)
答案 1 :(得分:0)
我遇到了同样的问题,最后找到了一个解决方案,据我所知,这个解决方案既安全又简单。此方法的一个缺点是,在发布安全更新时必须处理它们。
我们要做的是制作我们自己的特殊shell,我们将chown和SUID提供给我们希望任务执行的用户。为了保持安全,此用户应该只是一个没有广泛系统权限的普通用户,并将脚本放在其他不允许的地方。现在我们让php执行一个使用这个特殊shell的脚本,这个脚本中的所有命令都将作为所选用户执行。
在实践中:
sudo mkdir /usr/lib/specialshell
sudo chown user_who_may_run_command:root /usr/lib/specialshell
sudo chmod 700 /usr/lib/specialshell
sudo cp /bin/perl specialperl
sudo chown user_to_run_command:usergroup_to_run_command specialperl
sudo u+s specialperl
sudo mv specialperl /usr/lib/specialshell
现在我们创建一个名为command.script的脚本,其中包含:
#!/usr/lib/specialshell/specialperl
$ENV{"PATH"} = "/usr/bin";
system("/path/to/command");
从我们使用的PHP代码:
exec("/path/to/command.script");
et voila,没有代码更改,只是php中的命令名称。
编辑:仅适用于perl作为shell,因此将bash更改为perl并将shell置于安全的地方