php 不允许我执行 `shell_exec('git pull origin master 2>&1');`

php 不允许我执行 `shell_exec('git pull origin master 2>&1');`

当我运行脚本时<?php chdir('/var/www/html'); echo shell_exec('git pull origin master 2>&1'); ?>,收到错误消息:

error: cannot open .git/FETCH_HEAD: Permission denied

这是我所做的:

ssh [email protected]
pwd # shows that I'm already at /var/www as my home directory
ls .ssh/ # shows that I have id_rsa and id_rsa.pub, and id_rsa.pub is given to github
cd html
git pull origin master # everything downloads perfectly
echo "<?php chdir('/var/www/html'); echo shell_exec('git pull origin master 2>&1'); " > pull.php

现在当我去时http://example.com/pull.php出现错误cannot open .git/FETCH_HEAD: Permission denied

为了确认我的权限,我以 root 身份登录并执行了chown -R apache:apache /var/www以下操作。我的/etc/passwd

apache:x:48:48:Apache:/var/www:/bin/bash

我究竟做错了什么?

答案1

SELinux 不允许 Web 服务器写入随机目录。您需要明确定义 SELinux 应允许写入哪些目录,方法是设置其默认上下文,httpd_sys_rw_content_t然后设置任何现有文件的上下文。例如:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www(/.*)?"
restorecon -rv /var/www

不过,您几乎肯定不应该让整个网站都可由 Web 服务器写入,也不应该设置直接调用的网页git。这两种做法都会完全抵消您从 SELinux 获得的任何安全优势,而后者本身也存在一系列潜在问题。

相关内容