Apache CGI 脚本无法覆盖其具有完全权限的目录中的文件

Apache CGI 脚本无法覆盖其具有完全权限的目录中的文件

在 Solaris 10 机器上遇到一个奇怪的问题。我有一个 cgi 脚本 (perl),需要覆盖一个文件。我们没有在 Apache 上运行 suexec,因此目标目录具有完全 (777) 访问权限,这样 Apache 就可以写入它。

问题是 CGI 脚本能够将新文件写入目录但不能覆盖现有文件。

**Directory permissions for file destination:** 

drwxrwxrwx 146 myuser white      32768 Jun  2 20:46 dest-dir

**File Permissions of file that needs to be over written:** 

-rw-r--r--   1 myuser white      0 Jun  2 20:50 cgitestfile

有人知道解决这个问题的简单方法吗?

似乎 apache 只有拥有该文件才能覆盖该文件。

答案1

-rw-r--r-- 1 myuser white 0 6月 2 20:50 cgitestfile

您只有所有者 (myuser) 对文件具有写入权限。apache 是以用户 myuser 身份运行的吗?还是以 apache 或 www.data 或类似用户身份运行?也许您需要为其他人添加写入权限?

答案2

在 Solaris 10 上,apache 默认以 的身份运行User nobodyGroup nobody检查/etc/apache/httpd.conf UserGroup指令)。鉴于您的示例,apache 将无法写入,cgitestfile因为它没有写入权限。

更改所有者:组dest-dir和您希望 apache 覆盖的文件nobody

答案3

我遇到这个问题是因为“SELinux”配置。如果 SELinux 正在运行,您需要明确启用 Apache 写入文件的功能。要使用此功能,您还需要对授予写入权限的目录和文件设置其他权限。

要确定 SELinux 是否已启用,请执行:

sestatus

要打开允许 ​​cgi 写入文件的 SE 布尔值:

sudo setsebool -P allow_httpd_anon_write 1
sudo setsebool -P allow_httpd_sys_script_anon_write 1

然后,最后将文件/目录“SELinux 安全上下文类型”设置为“系统”读/写文件/目录(您也可以将其设为“公共”类型 - 谷歌“chcon”获取信息),执行以下命令:

sudo chcon -R -t httpd_sys_rw_content_t /some/write/path

(将 /some/write/path 更改为您的路径。)

相关内容