在apache和mod_python下运行subversion

时间:2008-09-25 15:05:26

标签: python svn apache

我的Apache服务器在某个非默认(非root)帐户上运行。当它试图运行一个python脚本而后执行subversion check-out命令时,'svn checkout'失败并显示以下错误消息:

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

同时在同一用户帐户下从命令行运行带有subversion checkout命令的python脚本非常顺利。

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

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

6 个答案:

答案 0 :(得分:5)

听起来你apache进程运行的环境有点不寻常。无论出于何种原因,svn似乎认为它需要的用户配置文件是/ root。您可以通过在命令行中指定要使用的配置目录来避免让svn使用文件的根版本,如下所示:

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

虽然没有修复你的环境,但至少可以让你让你的脚本正常运行......

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Apache的错误日志不能为您提供线索吗?

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

答案 3 :(得分:0)

Permission Denied错误显示脚本正在使用root凭据运行,因为它正在root的主目录中查找文件。

我建议您将钩子脚本更改为:

id > /tmp/id

这样你就可以查看结果,以确定uid / gid和euid / egid是什么。您可能会发现它实际上并不像您认为的那样运行。

我的第一个猜测,就像Troels一样,也是SELinux,但如果您完全确定通过Apache运行的脚本与手动测试完全相同的用户/组,那只会是我的猜测。

答案 4 :(得分:0)

好的,感谢所有回答这个问题的人。无论如何,我想我解决了这个问题。

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

Apache / mod_python不会在运行apache的用户帐户的shell环境中读取。因此,对于例如,当apache时,mod_python不会看到$ HOME 在一些真实的用户(不是没有人)下运行

现在'svn co'有一个标志--config-dir,它指向配置目录以读取params。默认情况下它是$ HOME / .subversion,即它对应于用户帐户主目录。显然当没有$ HOME存在时,mod_python会转到root home dir(/ root)并尝试在那里摆弄.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

答案 5 :(得分:0)

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

中提取你的$ HOME变量

我自己刚刚找到了解决这个问题的方法(虽然使用mod_perl,但同样的事情)

运行此命令(如果其apache 1,删除2):

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

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