在 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 nobody
(Group nobody
检查/etc/apache/httpd.conf
User
和Group
指令)。鉴于您的示例,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 更改为您的路径。)