在Apache和mod_python下运行颠覆

我的Apache服务器运行在一些非默认(非根)帐户。 当它试图运行一个python脚本,然后执行一个颠覆检出命令时,“svn checkout”失败,并显示以下错误消息:

svn: Can't open file '/root/.subversion/servers': Permission denied 

同时在同一个用户帐户下从命令行里面运行这个python脚本和subversion checkout命令的过程也很顺利。

带有mod_python 3.2.8的Apache服务器2.2.6运行在Fedora Core 6机器上。

有人可以帮我吗? 非常感谢。

这听起来像你的Apache进程正在运行的环境有点不寻常。 不管出于什么原因,svn似乎认为它需要的用户配置文件在/ root中。 你可以通过在命令行上指定使用哪个config目录来避免让svn使用文件的根目录版本,如下所示:

 svn --config-dir /home/myuser/.subversion checkout http://example.com/path 

虽然不修复你的环境,它至少会让你的脚本正常运行…

尝试授予该文件的Apache用户(运行Apache服务的用户)r + w权限。

Apache的错误日志不给你一个线索?

也许它与SELinux有关。 检查/var/log/audit/audit.log并相应地调整你的SELinux配置,如果audit.log文件指出它是拒绝Apache访问的SELinux。

“权限被拒绝”错误显示脚本正在以根证书运行,因为它正在根目录的主目录中寻找文件。

我建议你将钩子脚本改为:

 id > /tmp/id 

所以你可以检查结果,以确定uid / gid和euid / egid是什么。 您可能会发现它并不像您认为的那样正在运行。

我的第一个猜测,就像Troels一样,也是SELinux,但是如果你完全确定通过Apache的脚本和你手动测试的用户/组完全一样,那么这只是我的猜测。

那么,谢谢所有回答这个问题的人。 无论如何,我想我解决了神秘的问题。

SELinux在机器上是完全禁用的,所以问题是'svn co'无法为其运行的用户帐户找到config_dir。

Apache / mod_python不读取Apache运行的用户帐户的shell环境。 因此,例如,当apache运行在某个真实用户(而不是nobody)下时,没有$ HOME被mod_python看到,

现在'svn co'有一个标志–config-dir,它指向配置目录以读取参数。 默认情况下它是$ HOME / .subversion,即它对应于用户帐户主目录。 显然,当没有$ HOME存在mod_python去根目录dir(/根),并试图摆弄那里的.subversion内容 – 这显然失败惨痛。

SetEnv HOME / home / qa

进入/etc/httpd/conf/httpd.conf并不能解决问题,因为SetEnv与shell环境无关 – 它只设置了与Apache相关的环境

同样PythonOption – 只设置了mod_python相关的变量,可以在req.get_options()之后读取

运行'svn co -config-dir / home / …'肯定给出了一个从mod_python中运行的解决方法,但是阻碍了那些试图从命令行运行脚本的人。

所以建议(和工作)的解决方案是在启动appache之前设置HOME环境变量。

例如在/etc/init.d/httpd脚本中

  QAHOME=/home/qa ... HOME=$QAHOME LANG=$HTTPD_LANG daemon $httpd $OPTIONS 

发生的事情是Apache正在启动根环境变量,所以它认为它应该在/ root /中找到它的配置文件。 不是这种情况。 会发生什么,如果你做sudo apache2ctl启动,它会从sudo $ HOME = / root /

我刚刚找到了一个解决这个问题的方法(尽管使用了mod_perl,但是同样的东西)

运行这个命令(如果它的apache 1,删除2):

 sudo /etc/init.d/apache2 stop sudo /etc/init.d/apache2 start 

当/etc/init.d/apache2启动apache时,它会设置apache应该运行的所有适当的环境变量。