在apache和mod_python下运行subversion

时间:2020-03-06 14:43:31  来源:igfitidea点击:

我的Apache服务器在某些非默认(非root)帐户上运行。当它尝试运行python脚本,该脚本又执行一个subversion签出命令时," 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机器上运行。

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

解决方案

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

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

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

在不解决环境问题的同时,它至少可以使脚本正常运行...

Apache的错误日志不为我们提供线索吗?

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

权限被拒绝错误表明该脚本正在使用root用户凭据运行,因为它正在root用户的主目录中查找文件。

我建议我们将钩子脚本更改为可以执行的操作:

id > /tmp/id

这样我们就可以检查结果,以确保uid / gid和euid / egid是什么。我们可能会发现它实际上并没有以我们认为的用户身份运行。

与Troels一样,我的第一个猜测也是SELinux,但这仅是在我们绝对确定通过Apache的脚本运行的用户/组与手动测试完全相同的情况下的猜测。

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

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

Apache / mod_python无法在运行apache的用户帐户的shell环境中读取。因此,例如,在Apache时,mod_python不会看到$ HOME
在某些实际用户(不是没人)下运行

现在," svn co"具有--config-dir标志,该标志指向配置目录以读取参数。默认情况下为$ HOME / .subversion,即与用户帐户主目录相对应。显然,当不存在$ HOME时,mod_python会转到根主目录(/ root)并尝试在那儿摆弄.subversion内容,这显然是
惨败。

推杆

SetEnv HOME /家庭/质量检查

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

同样,PythonOption仅设置与mod_python相关的变量,之后可以使用req.get_options()进行读取。

运行'svn co --config-dir / home / ...'绝对为在mod_python中运行提供了一种解决方法,但是却妨碍了那些尝试从命令行运行脚本的人。

因此,提出的(也是可行的)解决方案是在开始学习之前设置HOME环境变量。

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

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

发生的是,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应该在其下运行的所有适当的环境变量。