当我运行脚本时<?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 获得的任何安全优势,而后者本身也存在一系列潜在问题。