通过PHP执行根命令
我有一个CentOS 5.7 Linux服务器,并使用php5.3.x.
在pfSense系统上,您可以重新启动服务 – 这需要使用php网页的根权限。
我正在尝试做类似的事情,我写了一些php代码来执行shell命令。 例如,要重新启动sshd服务:
<?php exec('/sbin/service sshd restart'); ?>
我试图通过exec函数执行该命令,但它需要root权限,但是我们有一个apache用户权限。
我遇到了几个解决scheme:
- “用root用户运行apache”确实是不安全的。 我不想这样做。
- “apache ALL = NOPASSWD:/ sbin / service to / etc / sudoers”我试过但仍然有问题。
任何其他解决scheme 感谢您的回答。
现在..这很有趣。 我试过@refp后,它工作我的本地Ubuntu服务器。 但是,当我在我的cenOS vps服务器上尝试相同的。 这不是工作,这是Apache的错误日志“rm:不能删除/ var / lock / subsys / vsftpd:权限被拒绝”
在试用之前阅读这篇文章,可以做出select。
解决scheme使用二进制包装(与suid位)
1)创build一个包含你想作为root运行的脚本(最好是.sh
)。
# cat > php_shell.sh <<CONTENT #!/bin/sh /sbin/service sshd restart CONTENT
2)这个文件应该由root拥有,因为它以后将以root权限运行,确保只有root权限才能写入文件。
# chown root php_shell.sh # chmod u=rwx,go=xr php_shell.sh
3)要以root用户身份运行脚本,无论执行哪个用户,我们都需要一个二进制包装器。 创build一个将执行我们的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
4)编译并设置合适的权限,包括suid位(说它应该以root权限运行):
# gcc wrapper.c -o php_root # chown root php_root # chmod u=rwx,go=xr,+s php_root
现在, php_root
将以root权限运行,并执行php_root.sh
指定的命令。
如果您不需要轻松更改要执行的命令的选项,则build议您在步骤4中直接在wrapper.c
编写命令。 那么你不需要执行一个执行命令的外部脚本的二进制文件。
在wrapper.c
,使用system ("your shell command here");
指定你想要执行的命令。
我不会有PHP执行任何sudo命令。 对我来说,这听起来像是在惹麻烦。 相反,我会创build两个单独的系统。
第一个系统,在PHP(networking层),将处理用户请求。 当发出需要sudo命令的请求时,我会把这个请求放在某个队列中。 这可能是一些类似中间件的数据库,比如ZeroMQ。
第二个系统(业务层)将读取或接收来自该队列的消息,并且能够执行sudo命令,但不在您的web服务器进程的范围内。
我知道这有些含糊,可以用不同的技术以不同的方式解决,但我认为这是最好和最安全的方法。
允许www-data用户运行以运行程序1和程序2而不使用密码:
sudo visudo
添加到sudoers文件的内容:
User_Alias WWW_USER = www-data Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2 WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
保存。
从https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root
我最近发布了一个项目,允许PHP获得和真正的Bash shell交互,它会很容易地给你一个以root身份login的shell。 然后你可以执行单独的bash命令,而不是绑定到脚本中。 这样你也可以处理回报。 在这里获取: https : //github.com/merlinthemagic/MTS
下载后,你只需使用下面的代码:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('service sshd restart'); echo $return1; //On CentOS 7 output would be like: //Redirecting to /bin/systemctl restart sshd.service //On CentOS 6 and lower output would be like: //Stopping sshd: [ OK ] //Starting sshd: [ OK ]