所以我想在我的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
我错过了什么吗?
suEXEC 仅在 PHP 以 CGI 模式执行时才有效,但如果 PHP 作为 apache 运行时则不工作2模块。我猜您正在将其作为模块运行。
另一种方法是将所有权转让给所需用户,然后设置suid
位:
chown desired_user your.program
chmod u+s your.program
现在,在执行your.program
时,它具有权限,就好像它由其所有者执行一样。关注我链接的维基文章以获取更多信息。
旁注:这仅适用于二进制文件(不适用于 shell 脚本,因为它们由未设置 suid 位的 shell 二进制文件执行)
我遇到了同样的问题,终于找到了一个解决方案,据我所知,它既安全又简单。此方法的缺点是,您必须在发布安全更新时对其进行处理。
我们要做的是制作我们自己的特殊外壳,我们将它和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");
瞧,没有代码更改,只有 PHP 中的命令名称。
编辑:仅适用于Perl作为shell,因此将bash更改为perl并将shell放在安全的地方