我的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应该运行的所有适当的环境变量。