1

我正在通过 CGI 在 Apache 服务器中运行 Python 脚本。在脚本中,我尝试读取驻留在 /home 目录中的文件。但是,我可以读取一个文件而不是另一个。这对我理解权限以及什么可以读取或不可以读取的目标来说是非常令人沮丧的。

# Works
file_tmp = open("/home/blastdbs/db_01.fasta", 'r')

# Fails
file_tmp = open("/home/blast_dbs/db_01.fasta", 'r')
<type 'exceptions.IOError'>: [Errno 13] Permission denied: '/home/blast_dbs/db_01.fasta' 

ls -l /home/
drwxr-xr-x.  2 myself myself  4096 Jun 17 18:18 blastdbs
drwxr-xr-x.  2 myself myself  4096 Jun 17 18:18 blast_dbs

ls -l /home/blastdbs/
-rwxr-xr-x. 1 myself myself   32484551 Jun 17 17:28 db_01.fasta
-rwxr-xr-x. 1 myself myself 2279012809 Jun 17 13:10 db_02.fasta

ls -l /home/blast_dbs/
-rwxr-xr-x. 1 myself myself  32484551 Jun 17 13:09 db_01.fasta

顺便说一句,尝试读取 db_02 会产生相同的异常。

我希望有人可以对此有所了解。谢谢

4

2 回答 2

1

Apache 服务器安装在启用 SELinux 的 Linux 发行版中。SELinux 默认拒绝 Apache 读取 /home 文件夹中的文件。通过使用 ls -Z 可以检查文件的 SELinux 标签。在我的例子中,虽然通常 (DAC) 权限是相同的并且没有设置 ACL,但 SELinux 上下文是不同的:

下一个可以从 Apache 守护程序和脚本中读取:

unconfined_u:object_r:httpd_sys_content_t:

下一个是 SELinux 拒绝访问 Apache 的文件:

unconfined_u:object_r:user_home_t
于 2013-06-20T09:56:44.760 回答
0

使用以下指令,但使用 httpd_sys_content_t 来标记您的目录。不要标记整个主目录,而只是例如 /home/myuser/apache

https://superuser.com/questions/607409/configuring-selinux-to-allow-logging-to-a-file-thats-outside-var-log

于 2013-06-20T13:03:25.963 回答