在apache和mod_python下运行subversion
我的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应该在其下运行的所有适当的环境变量。