0

这是我们的 Centos 版本号

[marc disk5]$ cat /etc/redhat-release
CentOS release 5.7 (Final)

下面是我们如何启动我们的 apache web 服务器

[marc php]$ sudo gdb /usr/sbin/httpd
[sudo] password for marc: 
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5_7.1)
Copyright (C) 2009 Free Software Foundation, Inc.
Reading symbols from /usr/sbin/httpd...(no debugging symbols found)...done.
(gdb) run -X

下面是我们如何启动我们的 Firefox 网络浏览器

[marc]$ sudo firefox
[sudo] password for marc: 

这是我们在 Firefox 网络浏览器中输入的 URL

http MatchUpObjectPHPSample.php

当我们在 Web 浏览器呈现的网页上激活提交请求时,我们会收到以下诊断消息:

Path /home/marc/data/mdMatchup.dat
throw exception /home/marc/data/mdMatchup.dat retval -1 errno 13

Errno 13 IS EACCESS 由我们用来测试文件存在的 C/C++ access("/home/marc/data/mdMatchup.dat",F_OK) API 调用返回。访问的手册页指出:

EACCES 对文件的请求访问将被拒绝,或者对路径名的路径前缀中的目录之一的搜索权限被拒绝。

这是我们的路径权限:

[marc /]$ ls -l
drwxr-xr-x   7 root root  4096 Jan  3 11:45 home

[marc home]$ ls -l
drwx------ 38 marc     users 4096 May 29 16:36 marc

[marc home]$ cd marc
[marc ~]$ ls -l
drwxrwxrwx  2 root   root       4096 May 29 19:20 data

[marc ~]$ cd data
[marc data]$ pwd
/home/marc/data
[marc data] ls -l 
-rwxrwxrwx 1 root root 244736 May 28 15:49 mdMatchup.dat

最后,这是一段非常短的 C++ 代码:

cSQLite::cSQLite(char *File_,bool bMustExist_) {
  int retval(0);

  if (bMustExist_) {
     retval = access(File_,F_OK);

     if (retval != 0) {
       printf("throw exception %s retval %d errno %d\n",File_,retval,errno);
       throw cException(ERR_DBDATABASE,"cSQLite",File_);
     }

     if (sqlite3_open(File_,&Database)!=SQLITE_OK) {
       RecordError();
       throw cException(ERR_DBDATABASE,"cSQLite",LastError);
     }
  }

  Statement=0;
  Columns=0;
}

有人可以告诉我们我们正在犯什么错误,或者这是 CentOS 版本特定的问题吗?

4

1 回答 1

3

你到底想在这里完成什么?为什么要直接启动 httpd 而不是使用标准启动脚本?为什么要以 root 身份运行浏览器?root 权限不会通过 HTTP 连接传输吗?

除此之外,问题在于您的marc目录只能由marc用户读取。按照设计,Apache 将放弃 root 权限并作为非特权用户(httpd、htdata 等)运行,因此它无权访问 /home/marc 中的任何内容。

于 2012-05-30T17:21:53.127 回答