我的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机器上运行。有人可以帮帮我吗?非常感谢。
答案 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应该运行的所有正确的环境变量。