Meh*_*NCE 53 php apache permissions root
我有一个CentOS 5.7 linux服务器并使用php5.3.x.
在pfSense系统上,您可以使用php网页重新启动需要root权限的服务.
我正在尝试做类似的事情,我已经写了一些PHP代码来执行shell命令.例如,要重新启动sshd服务:
<?php
exec('/sbin/service sshd restart');
?>
Run Code Online (Sandbox Code Playgroud)
我尝试通过exec函数执行该命令,但它需要root权限,但我们有一个apache用户权限.
我遇到了一些解决方案:
还有其他方法吗?谢谢你的回答.
现在..这很有趣.我试过@refp post,它工作了我的本地ubuntu服务器.但是当我在我的cenOS vps服务器上尝试相同时.它不起作用.这是apache的错误日志"rm:无法删除`/ var/lock/subsys/vsftpd':权限被拒绝"
Fil*_*efp 91
在尝试之前阅读整篇文章,可以做出选择.
1)创建一个脚本(最好.sh),其中包含您希望以root身份运行的内容.
# cat > php_shell.sh <<CONTENT
#!/bin/sh
/sbin/service sshd restart
CONTENT
Run Code Online (Sandbox Code Playgroud)
2)此文件应由root拥有,并且由于它稍后将以root权限运行,因此请确保只有root有权写入该文件.
# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
Run Code Online (Sandbox Code Playgroud)
3)无论执行它的用户是以root身份运行脚本,我们都需要一个二进制包装器.创建一个将执行我们的php_shell.sh.
# cat > wrapper.c <<CONTENT
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
setuid (0);
/* WARNING: Only use an absolute path to the script to execute,
* a malicious user might fool the binary and execute
* arbitary commands if not.
* */
system ("/bin/sh /path/to/php_shell.sh");
return 0;
}
CONTENT
Run Code Online (Sandbox Code Playgroud)
4)编译并设置适当的权限,包括suid位(说它应该以root权限运行):
# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root
Run Code Online (Sandbox Code Playgroud)
php_root现在将以root权限运行,并执行指定的命令php_shell.sh.
如果您不需要选项来轻松更改将要执行的命令,我建议您直接在wrapper.c步骤4中编写命令.然后,您不需要二进制文件执行执行相关命令的外部脚本.
在wrapper.c,用于system ("your shell command here");指定您要执行的命令.
Luk*_*uke 23
我不会让PHP执行任何sudo命令.对我而言,这听起来像是在寻找麻烦.相反,我会创建两个独立的系统.
PHP(Web层)中的第一个系统将处理用户请求.当发出需要sudo命令的请求时,我会将此请求放在某个队列中.这可能是某种类型的数据库或零件中间件,如ZeroMQ.
第二个系统(业务层)将从此队列读取或接收消息,并且能够执行sudo命令,但不在您的Web服务器进程范围内.
我知道这有点模糊,可以通过各种技术以不同的方式解决,但我认为这是最好和最安全的方法.
允许www-data用户运行以运行没有密码的program1和program2:
sudo visudo
Run Code Online (Sandbox Code Playgroud)
添加到sudoers文件的内容:
User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Run Code Online (Sandbox Code Playgroud)
保存.
来自https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root
使用二进制包装器(带有 suid 位)的解决方案Filip Roséen 的 一些修改- refp帖子。
执行任何命令修改wrapper.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char **argv)
{
setuid (0);
char cmd[100] = "";
int i;
char *p;
for(i=0; i < argc; i++) {
if(i != 0){
strcat(cmd, *(argv+i));
strcat(cmd, " ");
}
}
system (cmd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并设置适当的权限;
gcc wrapper.c -o php_root # php_root can be any name.
chown root php_root
chmod u=rwx,go=xr,+s php_root
Run Code Online (Sandbox Code Playgroud)
现在从 PHP 调用。执行任何命令。
shell_exec('./php_root '.$cmd);//execute from wrapper
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84466 次 |
| 最近记录: |